Thread: Re: [GENERAL] Bug with sequences in 6.4.2

Re: [GENERAL] Bug with sequences in 6.4.2

From
Bruce Momjian
Date:
> Greetings,
> there seems to be a slight bug in the parsing of the
> nextval function, tested under 6.4.2.
> It affects also the SERIAL type.
> 
> Symptom :
> 
> CREATE SEQUENCE "AA";
> -- Correct, quoted identifier is allowed;
> SELECT NEXTVAL('AA');
> --Produces Error
> --aa.nextval: sequence does not exist
> 

Let me comment on this.    In the first statement, "AA" is used in an
SQL command, and we handle this correctly.  In the second case, NEXTVAL
is a function, called with a string.

Now in parse_func.c, we convert 'AA' to lower to try and find the
sequence table.  My assumption is that we should attempt to find the
table without doing a lower(), and if that fails, try lower.

Does that make sense to people.  We can't just lower it in every case.



> 
> Probable source of problem, the Argument to nextval is
> not handled correctly as an Table Identifier.
> 
> E.g. nextval('"AA"') is generates 
> "aa".nextval: sequence does not exist
> 
> Note the lowercase between the quotes.
> 
> I quickly browsed the sources, but have not found the
> place where the conversion to lowercase occurs.
> 
> Please check this against 6.5 and 6.4.3 too.
> 
> With Regards,
>     Stefan Wehner
> 
> 
> 
> 


--  Bruce Momjian                        |  http://www.op.net/~candle maillist@candle.pha.pa.us            |  (610)
853-3000+  If your life is a hard drive,     |  830 Blythe Avenue +  Christ can be your backup.        |  Drexel Hill,
Pennsylvania19026
 


Re: [HACKERS] Re: [GENERAL] Bug with sequences in 6.4.2

From
reedstrm@wallace.ece.rice.edu (Ross J. Reedstrom)
Date:
<problem with case of sequence name snipped>

> Now in parse_func.c, we convert 'AA' to lower to try and find the
> sequence table.  My assumption is that we should attempt to find the
> table without doing a lower(), and if that fails, try lower.
> 
> Does that make sense to people.  We can't just lower it in every case.
> 

Sounds line exactly the right fix to me. Oh, and a quick scan for other
cases of this assumption (auto lower() of field and attribute names) would
be nice, too.

Ross

-- 
Ross J. Reedstrom, Ph.D., <reedstrm@rice.edu> 
NSBRI Research Scientist/Programmer
Computer and Information Technology Institute
Rice University, 6100 S. Main St.,  Houston, TX 77005


Re: [HACKERS] Re: [GENERAL] Bug with sequences in 6.4.2

From
Tom Lane
Date:
Bruce Momjian <maillist@candle.pha.pa.us> writes:
>> CREATE SEQUENCE "AA";
>> -- Correct, quoted identifier is allowed;
>> SELECT NEXTVAL('AA');
>> --Produces Error

> Let me comment on this.    In the first statement, "AA" is used in an
> SQL command, and we handle this correctly.  In the second case, NEXTVAL
> is a function, called with a string.
> Now in parse_func.c, we convert 'AA' to lower to try and find the
> sequence table.  My assumption is that we should attempt to find the
> table without doing a lower(), and if that fails, try lower.
> Does that make sense to people.  We can't just lower it in every case.

That would create an ambiguity that is better avoided.  I think nextval
ought to duplicate the parser's behavior --- if possible, actually call
the same routine the parser uses for looking up a sequence name.
I suggest that it operate like this:

(1)    nextval('AA')        operates on sequence aa
AA is lowercased, same as unquoted AA would be by the parser.

(2)    nextval('"AA"')        operates on sequence AA
Quoted "AA" is treated as AA, same as parser would do it.

This should be fully backward compatible with existing SQL code, since
the existing nextval() code implements case (1).  I doubt anyone has
tried putting double quotes into their nextval arguments, so adding
the case (2) behavior shouldn't break anything.
        regards, tom lane


Re: [HACKERS] Re: [GENERAL] Bug with sequences in 6.4.2

From
Bruce Momjian
Date:
> Bruce Momjian <maillist@candle.pha.pa.us> writes:
> >> CREATE SEQUENCE "AA";
> >> -- Correct, quoted identifier is allowed;
> >> SELECT NEXTVAL('AA');
> >> --Produces Error
> 
> > Let me comment on this.    In the first statement, "AA" is used in an
> > SQL command, and we handle this correctly.  In the second case, NEXTVAL
> > is a function, called with a string.
> > Now in parse_func.c, we convert 'AA' to lower to try and find the
> > sequence table.  My assumption is that we should attempt to find the
> > table without doing a lower(), and if that fails, try lower.
> > Does that make sense to people.  We can't just lower it in every case.
> 
> That would create an ambiguity that is better avoided.  I think nextval
> ought to duplicate the parser's behavior --- if possible, actually call
> the same routine the parser uses for looking up a sequence name.
> I suggest that it operate like this:
> 
> (1)    nextval('AA')        operates on sequence aa
> 
>     AA is lowercased, same as unquoted AA would be by the parser.
> 
> (2)    nextval('"AA"')        operates on sequence AA
> 
>     Quoted "AA" is treated as AA, same as parser would do it.
> 
> This should be fully backward compatible with existing SQL code, since
> the existing nextval() code implements case (1).  I doubt anyone has
> tried putting double quotes into their nextval arguments, so adding
> the case (2) behavior shouldn't break anything.

I can do that.  It looked kind of strange.  Usually they do:
create sequence "Aa";

Because nextval is a function with a parameter, it would be
nextval('"Aa"').  I don't think we want to do this for all function
parameters, but just for nextval.

I can do that.

--  Bruce Momjian                        |  http://www.op.net/~candle maillist@candle.pha.pa.us            |  (610)
853-3000+  If your life is a hard drive,     |  830 Blythe Avenue +  Christ can be your backup.        |  Drexel Hill,
Pennsylvania19026
 


Re: [HACKERS] Re: [GENERAL] Bug with sequences in 6.4.2

From
Bruce Momjian
Date:
> That would create an ambiguity that is better avoided.  I think nextval
> ought to duplicate the parser's behavior --- if possible, actually call
> the same routine the parser uses for looking up a sequence name.
> I suggest that it operate like this:
> 
> (1)    nextval('AA')        operates on sequence aa
> 
>     AA is lowercased, same as unquoted AA would be by the parser.
> 
> (2)    nextval('"AA"')        operates on sequence AA
> 
>     Quoted "AA" is treated as AA, same as parser would do it.
> 
> This should be fully backward compatible with existing SQL code, since
> the existing nextval() code implements case (1).  I doubt anyone has
> tried putting double quotes into their nextval arguments, so adding
> the case (2) behavior shouldn't break anything.

Good idea.  Done.

test=> select nextval('"Aa"');
nextval
-------     3
(1 row)



--  Bruce Momjian                        |  http://www.op.net/~candle maillist@candle.pha.pa.us            |  (610)
853-3000+  If your life is a hard drive,     |  830 Blythe Avenue +  Christ can be your backup.        |  Drexel Hill,
Pennsylvania19026
 


Re: [HACKERS] Re: [GENERAL] Bug with sequences in 6.4.2

From
Vadim Mikheev
Date:
Bruce Momjian wrote:
> 
> Good idea.  Done.
> 
> test=> select nextval('"Aa"');
> nextval
> -------
>       3
> (1 row)

select currval('"Aa"');

?

Vadim


Re: [HACKERS] Re: [GENERAL] Bug with sequences in 6.4.2

From
Bruce Momjian
Date:
> Bruce Momjian wrote:
> > 
> > Good idea.  Done.
> > 
> > test=> select nextval('"Aa"');
> > nextval
> > -------
> >       3
> > (1 row)
> 
> select currval('"Aa"');

Someone complained they could not get a sequence named "Aa" because the
code auto-lowercased the nextval parameter.  The new code accepts
nextval('"Aa"'), and preserves the case.  Other cases are
auto-lowercased.

--  Bruce Momjian                        |  http://www.op.net/~candle maillist@candle.pha.pa.us            |  (610)
853-3000+  If your life is a hard drive,     |  830 Blythe Avenue +  Christ can be your backup.        |  Drexel Hill,
Pennsylvania19026
 


Re: [HACKERS] Re: [GENERAL] Bug with sequences in 6.4.2

From
Vadim Mikheev
Date:
Bruce Momjian wrote:
> 
> > select currval('"Aa"');
> 
> Someone complained they could not get a sequence named "Aa" because the
> code auto-lowercased the nextval parameter.  The new code accepts
> nextval('"Aa"'), and preserves the case.  Other cases are
> auto-lowercased.

No, just looked in new code and seems that your changes in 
parse_func.c handle currval() and setval() as well, sorry.

Vadim


Re: [HACKERS] Re: [GENERAL] Bug with sequences in 6.4.2

From
Bruce Momjian
Date:
> Bruce Momjian wrote:
> > 
> > > select currval('"Aa"');
> > 
> > Someone complained they could not get a sequence named "Aa" because the
> > code auto-lowercased the nextval parameter.  The new code accepts
> > nextval('"Aa"'), and preserves the case.  Other cases are
> > auto-lowercased.
> 
> No, just looked in new code and seems that your changes in 
> parse_func.c handle currval() and setval() as well, sorry.

I meant that non-double quoted cases are auto-lowered.  I didn't realize
I was also dealing with other *val cases.  I guess that is good.

I am on IRC now.


--  Bruce Momjian                        |  http://www.op.net/~candle maillist@candle.pha.pa.us            |  (610)
853-3000+  If your life is a hard drive,     |  830 Blythe Avenue +  Christ can be your backup.        |  Drexel Hill,
Pennsylvania19026