> 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
> 
> 
> 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.

OK, I have made the following change to allow case-sensitive handling of
nextval. It tries the exact case first, then tries lowercase.

-- 
  Bruce Momjian                        |  http://www.op.net/~candle
  [EMAIL PROTECTED]            |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026
Index: parse_func.c
===================================================================
RCS file: /usr/local/cvsroot/pgsql/src/backend/parser/parse_func.c,v
retrieving revision 1.39
retrieving revision 1.40
diff -c -r1.39 -r1.40
*** parse_func.c        1999/02/23 07:51:53     1.39
--- parse_func.c        1999/03/15 16:48:34     1.40
***************
*** 7,13 ****
   *
   *
   * IDENTIFICATION
!  *      $Header: /usr/local/cvsroot/pgsql/src/backend/parser/parse_func.c,v 1.39 
1999/02/23 07:51:53 thomas Exp $
   *
   *-------------------------------------------------------------------------
   */
--- 7,13 ----
   *
   *
   * IDENTIFICATION
!  *      $Header: /usr/local/cvsroot/pgsql/src/backend/parser/parse_func.c,v 1.40 
1999/03/15 16:48:34 momjian Exp $
   *
   *-------------------------------------------------------------------------
   */
***************
*** 21,26 ****
--- 21,27 ----
  #include "access/relscan.h"
  #include "access/sdir.h"
  #include "catalog/catname.h"
+ #include "catalog/heap.h"
  #include "catalog/indexing.h"
  #include "catalog/pg_inherits.h"
  #include "catalog/pg_proc.h"
***************
*** 440,446 ****
  
                if (nodeTag(pair) == T_Ident && ((Ident *) pair)->isRel)
                {
- 
                        /*
                         * a relation
                         */
--- 441,446 ----
***************
*** 573,588 ****
                char       *seqrel;
                text       *seqname;
                int32           aclcheck_result = -1;
-               extern text *lower(text *string);
  
                Assert(length(fargs) == ((funcid == F_SETVAL) ? 2 : 1));
                seq = (Const *) lfirst(fargs);
                if (!IsA((Node *) seq, Const))
                        elog(ERROR, "Only constant sequence names are acceptable for 
function '%s'", funcname);
!               seqname = lower((text *) DatumGetPointer(seq->constvalue));
!               pfree(DatumGetPointer(seq->constvalue));
!               seq->constvalue = PointerGetDatum(seqname);
!               seqrel = textout(seqname);
  
                if ((aclcheck_result = pg_aclcheck(seqrel, GetPgUserName(),
                                           (((funcid == F_NEXTVAL) || (funcid == 
F_SETVAL)) ?
--- 573,593 ----
                char       *seqrel;
                text       *seqname;
                int32           aclcheck_result = -1;
  
                Assert(length(fargs) == ((funcid == F_SETVAL) ? 2 : 1));
                seq = (Const *) lfirst(fargs);
                if (!IsA((Node *) seq, Const))
                        elog(ERROR, "Only constant sequence names are acceptable for 
function '%s'", funcname);
! 
!               seqrel = textout((text *) DatumGetPointer(seq->constvalue));
!               if (RelnameFindRelid(seqrel) == InvalidOid)
!               {
!                       pfree(seqrel);
!                       seqname = lower((text *) DatumGetPointer(seq->constvalue));
!                       pfree(DatumGetPointer(seq->constvalue));
!                       seq->constvalue = PointerGetDatum(seqname);
!                       seqrel = textout(seqname);
!               }
  
                if ((aclcheck_result = pg_aclcheck(seqrel, GetPgUserName(),
                                           (((funcid == F_NEXTVAL) || (funcid == 
F_SETVAL)) ?



Reply via email to