Re: Oracle Style packages on postgres - Mailing list pgsql-hackers

From Dave Held
Subject Re: Oracle Style packages on postgres
Date
Msg-id 49E94D0CFCD4DB43AFBA928DDD20C8F902618509@asg002.asg.local
Whole thread Raw
In response to Oracle Style packages on postgres  (rmm@sqlisor.com)
Responses Re: Oracle Style packages on postgres  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-hackers
> -----Original Message-----
> From: Tom Lane [mailto:tgl@sss.pgh.pa.us]
> Sent: Wednesday, May 11, 2005 10:55 AM
> To: Dave Held
> Cc: pgsql-hackers@postgresql.org
> Subject: Re: [HACKERS] Oracle Style packages on postgres
>
>
> "Dave Held" <dave.held@arraysg.com> writes:
> > The rule is simple: when the identifier has
> > more than two parts, search for the first part among the schemas    ^^^^^^^^^^^^^^^^^^^
> > first, and then the catalogs.
>
> This doesn't actually work, because there is already ambiguity as to
> which level the first name is.  See for instance the comments in
> transformColumnRef().

I don't follow.  switch (numnames) case 3 is unambiguous under either
syntax.  case 1 and 2 are unchanged under my proposed rules.  It's
really only case 4+ that is affected.  And the change is as follows:
   if (numnames > MAX_SCHEMA_DEPTH + 3)   {       ereport(ERROR,               (errcode(ERRCODE_SYNTAX_ERROR),
errmsg("improperqualified name (too many dotted names): %s",              NameListToString(cref->fields))));
returnNULL;   }   switch (numnames)   {   case 1: ...   case 2: ...   case 3: ...   default:       {           char*
name[MAX_SCHEMA_DEPTH+ 3];           char** i;           char** end = name + numnames;           char* colname = name +
numnames- 1;           for (i = name; i != end; ++i)           {               /* definition of lnth() should be easy
enoughto infer */               *i = strVal(lnth(cref->fields));           } 
           /*            * We check the catalog name and then ignore it.            */           if
(!isValidNamespace(name[0]))          {               if (strcmp(name[0], get_database_name(MyDatabaseId)) != 0)
          ereport(ERROR,                           (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("cross-databasereferences are not implemented: %s",
NameListToString(cref->fields))));              i = name + 1;               numnames -= 3;           }           else
       {               i = name;               numnames -= 2;            }           /*            * isValidNamespace()
shouldwork like LookupExplicitNamespace()            * except that it should return false on failure instead of
  * raising an error            */ 
           /* Whole-row reference? */           if (strcmp(end[-1], "*") == 0)           {               node =
transformWholeRowRef(pstate,i, numnames, end[-2]);               break;           }           /*            * Here I've
changedthe signature of transformWholeRowRef() to            * accept a char** and an int for the schema names
 */ 
           /* Try to identify as a twice-qualified column */           node = qualifiedNameToVar(pstate, i, numnames,
end[-1],true);           /*            * And obviously we have to hack qualifiedNameToVar() similarly            */
     if (node == NULL)           {               /* Try it as a function call */               node =
transformWholeRowRef(pstate,i, numnames, end[-2]);               node = ParseFuncOrColumn(pstate,
              list_make1(makeString(end[-1])),                                        list_make1(node),
                      false, false, true);           }           break;       }   } 

What am I missing?

__
David B. Held
Software Engineer/Array Services Group
200 14th Ave. East,  Sartell, MN 56377
320.534.3637 320.253.7800 800.752.8129


pgsql-hackers by date:

Previous
From: Andrew Dunstan
Date:
Subject: Re: 7.3.10 working
Next
From: Tom Lane
Date:
Subject: Re: [PATCHES] plperl and pltcl installcheck targets