]> granicus.if.org Git - postgresql/commitdiff
pg_type has a typnamespace column; system now supports creating types
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 29 Mar 2002 19:06:29 +0000 (19:06 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 29 Mar 2002 19:06:29 +0000 (19:06 +0000)
in different namespaces.  Also, cleanup work on relation namespace
support: drop, alter, rename commands work for tables in non-default
namespaces.

68 files changed:
doc/src/sgml/catalogs.sgml
src/backend/access/common/tupdesc.c
src/backend/catalog/aclchk.c
src/backend/catalog/heap.c
src/backend/catalog/indexing.c
src/backend/catalog/namespace.c
src/backend/catalog/pg_aggregate.c
src/backend/catalog/pg_operator.c
src/backend/catalog/pg_proc.c
src/backend/catalog/pg_type.c
src/backend/commands/cluster.c
src/backend/commands/command.c
src/backend/commands/comment.c
src/backend/commands/copy.c
src/backend/commands/creatinh.c
src/backend/commands/define.c
src/backend/commands/remove.c
src/backend/commands/rename.c
src/backend/commands/sequence.c
src/backend/commands/variable.c
src/backend/commands/view.c
src/backend/nodes/copyfuncs.c
src/backend/nodes/equalfuncs.c
src/backend/nodes/makefuncs.c
src/backend/nodes/outfuncs.c
src/backend/parser/analyze.c
src/backend/parser/gram.y
src/backend/parser/parse_expr.c
src/backend/parser/parse_func.c
src/backend/parser/parse_target.c
src/backend/parser/parse_type.c
src/backend/rewrite/rewriteRemove.c
src/backend/tcop/utility.c
src/backend/utils/adt/sets.c
src/backend/utils/cache/lsyscache.c
src/backend/utils/cache/syscache.c
src/backend/utils/cache/temprel.c
src/include/access/tupdesc.h
src/include/catalog/catversion.h
src/include/catalog/heap.h
src/include/catalog/indexing.h
src/include/catalog/namespace.h
src/include/catalog/pg_aggregate.h
src/include/catalog/pg_attribute.h
src/include/catalog/pg_class.h
src/include/catalog/pg_operator.h
src/include/catalog/pg_proc.h
src/include/catalog/pg_type.h
src/include/commands/command.h
src/include/commands/copy.h
src/include/commands/creatinh.h
src/include/commands/defrem.h
src/include/commands/rename.h
src/include/commands/view.h
src/include/nodes/makefuncs.h
src/include/nodes/parsenodes.h
src/include/parser/parse_expr.h
src/include/parser/parse_func.h
src/include/parser/parse_type.h
src/include/rewrite/rewriteRemove.h
src/include/utils/lsyscache.h
src/include/utils/sets.h
src/include/utils/syscache.h
src/pl/plpgsql/src/pl_comp.c
src/pl/plpython/plpython.c
src/pl/tcl/pltcl.c
src/test/regress/expected/errors.out
src/test/regress/output/create_function_2.source

index 950d2016df67e70a764f3d33a52755a443e3aec1..31f82d12370d6b62d8e0d68bb82dce14a24f6536 100644 (file)
@@ -1,6 +1,6 @@
 <!--
  Documentation of the system catalogs, directed toward PostgreSQL developers
- $Header: /cvsroot/pgsql/doc/src/sgml/catalogs.sgml,v 2.38 2002/03/26 19:15:10 tgl Exp $
+ $Header: /cvsroot/pgsql/doc/src/sgml/catalogs.sgml,v 2.39 2002/03/29 19:05:57 tgl Exp $
  -->
 
 <chapter id="catalogs">
       <entry>Data type name</entry>
      </row>
 
+     <row>
+      <entry>typnamespace</entry>
+      <entry><type>oid</type></entry>
+      <entry>pg_namespace.oid</entry>
+      <entry>
+       The OID of the namespace that contains this type
+      </entry>
+     </row>
+
      <row>
       <entry>typowner</entry>
       <entry><type>int4</type></entry>
index 81f996b8a03f05f52d55e889bba646bad721e6ca..605ffb1bed7960b33cba4377ae8936ba7dcd8710 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/access/common/tupdesc.c,v 1.77 2002/02/27 19:34:11 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/access/common/tupdesc.c,v 1.78 2002/03/29 19:05:59 tgl Exp $
  *
  * NOTES
  *       some of the executor utility code such as "ExecTypeFromTL" should be
@@ -322,7 +322,7 @@ equalTupleDescs(TupleDesc tupdesc1, TupleDesc tupdesc2)
  *             a preallocated tuple descriptor.
  * ----------------------------------------------------------------
  */
-bool
+void
 TupleDescInitEntry(TupleDesc desc,
                                   AttrNumber attributeNumber,
                                   char *attributeName,
@@ -377,39 +377,11 @@ TupleDescInitEntry(TupleDesc desc,
        att->attnotnull = false;
        att->atthasdef = false;
 
-       /* ----------------
-        *      search the system cache for the type tuple of the attribute
-        *      we are creating so that we can get the typeid and some other
-        *      stuff.
-        *
-        *      Note: in the special case of
-        *
-        *              create EMP (name = text, manager = EMP)
-        *
-        *      RelationNameCreateHeapRelation() calls BuildDesc() which
-        *      calls this routine and since EMP does not exist yet, the
-        *      system cache lookup below fails.  That's fine, but rather
-        *      then doing a elog(ERROR) we just leave that information
-        *      uninitialized, return false, then fix things up later.
-        *      -cim 6/14/90
-        * ----------------
-        */
        tuple = SearchSysCache(TYPEOID,
                                                   ObjectIdGetDatum(oidtypeid),
                                                   0, 0, 0);
        if (!HeapTupleIsValid(tuple))
-       {
-               /*
-                * here type info does not exist yet so we just fill the attribute
-                * with dummy information and return false.
-                */
-               att->atttypid = InvalidOid;
-               att->attlen = (int16) 0;
-               att->attbyval = (bool) 0;
-               att->attalign = 'i';
-               att->attstorage = 'p';
-               return false;
-       }
+               elog(ERROR, "Unable to look up type id %u", oidtypeid);
 
        /*
         * type info exists so we initialize our attribute information from
@@ -477,56 +449,16 @@ TupleDescInitEntry(TupleDesc desc,
        }
 
        ReleaseSysCache(tuple);
-
-       return true;
 }
 
 
-/* ----------------------------------------------------------------
- *             TupleDescMakeSelfReference
+/*
+ * BuildDescForRelation
  *
- *             This function initializes a "self-referential" attribute like
- *             manager in "create EMP (name=text, manager = EMP)".
- *             It calls TypeShellMake() which inserts a "shell" type
- *             tuple into pg_type.  A self-reference is one kind of set, so
- *             its size and byval are the same as for a set.  See the comments
- *             above in TupleDescInitEntry.
- * ----------------------------------------------------------------
- */
-static void
-TupleDescMakeSelfReference(TupleDesc desc,
-                                                  AttrNumber attnum,
-                                                  char *relname)
-{
-       Form_pg_attribute att;
-
-       att = desc->attrs[attnum - 1];
-       att->atttypid = TypeShellMake(relname);
-       att->attlen = sizeof(Oid);
-       att->attbyval = true;
-       att->attalign = 'i';
-       att->attstorage = 'p';
-       att->attndims = 0;
-}
-
-/* ----------------------------------------------------------------
- *             BuildDescForRelation
- *
- *             This is a general purpose function identical to BuildDesc
- *             but is used by the DefineRelation() code to catch the
- *             special case where you
- *
- *                             create FOO ( ..., x = FOO )
- *
- *             here, the initial type lookup for "x = FOO" will fail
- *             because FOO isn't in the catalogs yet.  But since we
- *             are creating FOO, instead of doing an elog() we add
- *             a shell type tuple to pg_type and fix things later
- *             in amcreate().
- * ----------------------------------------------------------------
+ * Given a relation schema (list of ColumnDef nodes), build a TupleDesc.
  */
 TupleDesc
-BuildDescForRelation(List *schema, char *relname)
+BuildDescForRelation(List *schema)
 {
        int                     natts;
        AttrNumber      attnum;
@@ -535,7 +467,6 @@ BuildDescForRelation(List *schema, char *relname)
        AttrDefault *attrdef = NULL;
        TupleConstr *constr = (TupleConstr *) palloc(sizeof(TupleConstr));
        char       *attname;
-       char            typename[NAMEDATALEN];
        int32           atttypmod;
        int                     attdim;
        int                     ndef = 0;
@@ -553,7 +484,6 @@ BuildDescForRelation(List *schema, char *relname)
        foreach(p, schema)
        {
                ColumnDef  *entry = lfirst(p);
-               List       *arry;
 
                /*
                 * for each entry in the list, get the name and type information
@@ -563,39 +493,13 @@ BuildDescForRelation(List *schema, char *relname)
                attnum++;
 
                attname = entry->colname;
-               arry = entry->typename->arrayBounds;
                attisset = entry->typename->setof;
                atttypmod = entry->typename->typmod;
+               attdim = length(entry->typename->arrayBounds);
 
-               if (arry != NIL)
-               {
-                       /* array of XXX is _XXX */
-                       snprintf(typename, NAMEDATALEN,
-                                        "_%.*s", NAMEDATALEN - 2, entry->typename->name);
-                       attdim = length(arry);
-               }
-               else
-               {
-                       StrNCpy(typename, entry->typename->name, NAMEDATALEN);
-                       attdim = 0;
-               }
-
-               if (!TupleDescInitEntry(desc, attnum, attname,
-                                                               typenameTypeId(typename),
-                                                               atttypmod, attdim, attisset))
-               {
-                       /*
-                        * if TupleDescInitEntry() fails, it means there is no type in
-                        * the system catalogs.  So now we check if the type name
-                        * equals the relation name.  If so we have a self reference,
-                        * otherwise it's an error.
-                        */
-                       if (strcmp(typename, relname) == 0)
-                               TupleDescMakeSelfReference(desc, attnum, relname);
-                       else
-                               elog(ERROR, "DefineRelation: no such type %s",
-                                        typename);
-               }
+               TupleDescInitEntry(desc, attnum, attname,
+                                                  typenameTypeId(entry->typename),
+                                                  atttypmod, attdim, attisset);
 
                /* This is for constraints */
                if (entry->is_not_null)
index bead0959d93fc3fd01315aa461d4780aedb16d43..3269964aa079f7c1ea183328498d9413f3f727c7 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/catalog/aclchk.c,v 1.59 2002/03/26 19:15:22 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/catalog/aclchk.c,v 1.60 2002/03/29 19:05:59 tgl Exp $
  *
  * NOTES
  *       See acl.h.
@@ -37,6 +37,7 @@
 #include "parser/parse_agg.h"
 #include "parser/parse_func.h"
 #include "parser/parse_expr.h"
+#include "parser/parse_type.h"
 #include "utils/acl.h"
 #include "utils/syscache.h"
 #include "utils/temprel.h"
@@ -300,20 +301,19 @@ find_function_with_arglist(char *name, List *arguments)
        for (i = 0; i < argcount; i++)
        {
                TypeName   *t = (TypeName *) lfirst(arguments);
-               char       *typnam = TypeNameToInternalName(t);
 
-               arguments = lnext(arguments);
-
-               if (strcmp(typnam, "opaque") == 0)
-                       argoids[i] = InvalidOid;
-               else
+               argoids[i] = LookupTypeName(t);
+               if (!OidIsValid(argoids[i]))
                {
-                       argoids[i] = GetSysCacheOid(TYPENAME,
-                                                                               PointerGetDatum(typnam),
-                                                                               0, 0, 0);
-                       if (!OidIsValid(argoids[i]))
-                               elog(ERROR, "type '%s' not found", typnam);
+                       char      *typnam = TypeNameToString(t);
+
+                       if (strcmp(typnam, "opaque") == 0)
+                               argoids[i] = InvalidOid;
+                       else
+                               elog(ERROR, "Type \"%s\" does not exist", typnam);
                }
+
+               arguments = lnext(arguments);
        }
 
        oid = GetSysCacheOid(PROCNAME,
index 0b367e3dabaec411241451e5e3ab7ebf14827c04..fa64676e349f338ddd5495dfcf9059882ce4fe46 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.192 2002/03/26 19:15:25 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.193 2002/03/29 19:05:59 tgl Exp $
  *
  *
  * INTERFACE ROUTINES
@@ -74,8 +74,10 @@ static void DeleteRelationTuple(Relation rel);
 static void DeleteTypeTuple(Relation rel);
 static void RelationRemoveIndexes(Relation relation);
 static void RelationRemoveInheritance(Relation relation);
-static void AddNewRelationType(char *typeName, Oid new_rel_oid,
-                                  Oid new_type_oid);
+static void AddNewRelationType(const char *typeName,
+                                                          Oid typeNamespace,
+                                                          Oid new_rel_oid,
+                                                          Oid new_type_oid);
 static void StoreAttrDefault(Relation rel, AttrNumber attnum, char *adbin);
 static void StoreRelCheck(Relation rel, char *ccname, char *ccbin);
 static void StoreConstraints(Relation rel, TupleDesc tupdesc);
@@ -242,7 +244,7 @@ heap_create(char *relname,
         * have to take special care for those rels that should be nailed
         * in cache and/or are shared across databases.
         */
-       if (relname && relnamespace == PG_CATALOG_NAMESPACE)
+       if (relnamespace == PG_CATALOG_NAMESPACE)
        {
                if (strcmp(TypeRelationName, relname) == 0)
                {
@@ -622,7 +624,10 @@ AddNewRelationTuple(Relation pg_class_desc,
  * --------------------------------
  */
 static void
-AddNewRelationType(char *typeName, Oid new_rel_oid, Oid new_type_oid)
+AddNewRelationType(const char *typeName,
+                                  Oid typeNamespace,
+                                  Oid new_rel_oid,
+                                  Oid new_type_oid)
 {
        /*
         * The sizes are set to oid size because it makes implementing sets
@@ -634,18 +639,19 @@ AddNewRelationType(char *typeName, Oid new_rel_oid, Oid new_type_oid)
         * true makes sets much easier, and it isn't used by anything else.
         */
        TypeCreate(typeName,            /* type name */
+                          typeNamespace,       /* type namespace */
                           new_type_oid,        /* preassigned oid for type */
                           new_rel_oid,         /* relation oid */
                           sizeof(Oid),         /* internal size */
                           -1,                          /* external size */
-                          'c',                         /* type-type (catalog) */
+                          'c',                         /* type-type (complex) */
                           ',',                         /* default array delimiter */
-                          "oidin",                     /* input procedure */
-                          "oidout",            /* output procedure */
-                          "oidin",                     /* receive procedure */
-                          "oidout",            /* send procedure */
-                          NULL,                        /* array element type - irrelevant */
-                          NULL,                        /* baseType Name -- typically for domains */
+                          F_OIDIN,                     /* input procedure */
+                          F_OIDOUT,            /* output procedure */
+                          F_OIDIN,                     /* receive procedure */
+                          F_OIDOUT,            /* send procedure */
+                          InvalidOid,          /* array element type - irrelevant */
+                          InvalidOid,          /* domain base type - irrelevant */
                           NULL,                        /* default type value - none */
                           NULL,                        /* default type binary representation */
                           true,                        /* passed by value */
@@ -744,7 +750,7 @@ heap_create_with_catalog(char *relname,
         * NOTE: we could get a unique-index failure here, in case the same name
         * has already been used for a type.
         */
-       AddNewRelationType(relname, new_rel_oid, new_type_oid);
+       AddNewRelationType(relname, relnamespace, new_rel_oid, new_type_oid);
 
        /*
         * now add tuples to pg_attribute for the attributes in our new
@@ -1002,15 +1008,13 @@ RelationTruncateIndexes(Oid heapId)
  */
 
 void
-heap_truncate(const char *relname)
+heap_truncate(Oid rid)
 {
        Relation        rel;
-       Oid                     rid;
 
        /* Open relation for processing, and grab exclusive access on it. */
 
-       rel = heap_openr(relname, AccessExclusiveLock);
-       rid = RelationGetRelid(rel);
+       rel = heap_open(rid, AccessExclusiveLock);
 
        /*
         * TRUNCATE TABLE within a transaction block is dangerous, because if
@@ -1217,21 +1221,22 @@ DeleteTypeTuple(Relation rel)
  * ----------------------------------------------------------------
  */
 void
-heap_drop_with_catalog(const char *relname,
+heap_drop_with_catalog(Oid rid,
                                           bool allow_system_table_mods)
 {
        Relation        rel;
-       Oid                     rid;
+       Oid                     toasttableOid;
        bool            has_toasttable;
-       bool            istemp = is_temp_rel_name(relname);
+       bool            istemp;
        int                     i;
 
        /*
         * Open and lock the relation.
         */
-       rel = heap_openr(relname, AccessExclusiveLock);
-       rid = RelationGetRelid(rel);
+       rel = heap_open(rid, AccessExclusiveLock);
        has_toasttable = rel->rd_rel->reltoastrelid != InvalidOid;
+       toasttableOid = rel->rd_rel->reltoastrelid;
+       istemp = is_temp_rel_name(RelationGetRelationName(rel));
 
        /*
         * prevent deletion of system relations
@@ -1319,12 +1324,7 @@ heap_drop_with_catalog(const char *relname,
                remove_temp_rel_by_relid(rid);
 
        if (has_toasttable)
-       {
-               char            toast_relname[NAMEDATALEN];
-
-               sprintf(toast_relname, "pg_toast_%u", rid);
-               heap_drop_with_catalog(toast_relname, true);
-       }
+               heap_drop_with_catalog(toasttableOid, true);
 }
 
 
index da269d28415c958833b695b221bf75468271956e..ac556eff6475c184b50b924e8bb18b67b481116d 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/catalog/indexing.c,v 1.85 2002/03/26 19:15:30 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/catalog/indexing.c,v 1.86 2002/03/29 19:06:00 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -76,7 +76,7 @@ char     *Name_pg_statistic_indices[Num_pg_statistic_indices] =
 char      *Name_pg_trigger_indices[Num_pg_trigger_indices] =
 {TriggerRelidIndex, TriggerConstrNameIndex, TriggerConstrRelidIndex, TriggerOidIndex};
 char      *Name_pg_type_indices[Num_pg_type_indices] =
-{TypeNameIndex, TypeOidIndex};
+{TypeNameNspIndex, TypeOidIndex};
 char      *Name_pg_description_indices[Num_pg_description_indices] =
 {DescriptionObjIndex};
 
index c9d8d21f929adaab5cc41cea718475bd19565594..a1ea6ed24fe23181998191fc2bb130ef67fba453 100644 (file)
@@ -13,7 +13,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/catalog/namespace.c,v 1.1 2002/03/26 19:15:32 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/catalog/namespace.c,v 1.2 2002/03/29 19:06:01 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -22,6 +22,7 @@
 #include "catalog/namespace.h"
 #include "catalog/pg_namespace.h"
 #include "miscadmin.h"
+#include "nodes/makefuncs.h"
 #include "utils/lsyscache.h"
 #include "utils/syscache.h"
 
@@ -124,3 +125,92 @@ RelnameGetRelid(const char *relname)
        /* XXX Wrong!  must search search path */
        return get_relname_relid(relname, PG_CATALOG_NAMESPACE);
 }
+
+/*
+ * QualifiedNameGetCreationNamespace
+ *             Given a possibly-qualified name for an object (in List-of-Values
+ *             format), determine what namespace the object should be created in.
+ *             Also extract and return the object name (last component of list).
+ */
+Oid
+QualifiedNameGetCreationNamespace(List *names, char **objname_p)
+{
+       char       *catalogname;
+       char       *schemaname = NULL;
+       char       *objname = NULL;
+       Oid                     namespaceId;
+
+       /* deconstruct the name list */
+       switch (length(names))
+       {
+               case 1:
+                       objname = strVal(lfirst(names));
+                       break;
+               case 2:
+                       schemaname = strVal(lfirst(names));
+                       objname = strVal(lsecond(names));
+                       break;
+               case 3:
+                       catalogname = strVal(lfirst(names));
+                       schemaname = strVal(lsecond(names));
+                       objname = strVal(lfirst(lnext(lnext(names))));
+                       /*
+                        * We check the catalog name and then ignore it.
+                        */
+                       if (strcmp(catalogname, DatabaseName) != 0)
+                               elog(ERROR, "Cross-database references are not implemented");
+                       break;
+               default:
+                       elog(ERROR, "Improper qualified name (too many dotted names)");
+                       break;
+       }
+
+       if (schemaname)
+       {
+               namespaceId = GetSysCacheOid(NAMESPACENAME,
+                                                                        CStringGetDatum(schemaname),
+                                                                        0, 0, 0);
+               if (!OidIsValid(namespaceId))
+                       elog(ERROR, "Namespace \"%s\" does not exist",
+                                schemaname);
+       }
+       else
+       {
+               /* XXX Wrong!  Need to get a default schema from somewhere */
+               namespaceId = PG_CATALOG_NAMESPACE;
+       }
+
+       *objname_p = objname;
+       return namespaceId;
+}
+
+/*
+ * makeRangeVarFromNameList
+ *             Utility routine to convert a qualified-name list into RangeVar form.
+ */
+RangeVar *
+makeRangeVarFromNameList(List *names)
+{
+       RangeVar   *rel = makeRangeVar(NULL, NULL);
+
+       switch (length(names))
+       {
+               case 1:
+                       rel->relname = strVal(lfirst(names));
+                       break;
+               case 2:
+                       rel->schemaname = strVal(lfirst(names));
+                       rel->relname = strVal(lsecond(names));
+                       break;
+               case 3:
+                       rel->catalogname = strVal(lfirst(names));
+                       rel->schemaname = strVal(lsecond(names));
+                       rel->relname = strVal(lfirst(lnext(lnext(names))));
+                       break;
+               default:
+                       elog(ERROR, "Improper relation name (too many dotted names)");
+                       break;
+       }
+
+       return rel;
+}
index 8de1a52c3fa515a3fdbc8b6b6c3c3c5cc7ada26d..1a73f42c3344a78792b6f28483dc3e64a9772043 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/catalog/pg_aggregate.c,v 1.41 2002/03/20 19:43:35 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/catalog/pg_aggregate.c,v 1.42 2002/03/29 19:06:01 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
 #include "miscadmin.h"
 #include "parser/parse_coerce.h"
 #include "parser/parse_func.h"
+#include "parser/parse_type.h"
 #include "utils/builtins.h"
 #include "utils/syscache.h"
 
-/* ----------------
+/*
  * AggregateCreate
- *
- * aggregates overloading has been added.  Instead of the full
- * overload support we have for functions, aggregate overloading only
- * applies to exact basetype matches.  That is, we don't check the
- * inheritance hierarchy
- *
- * OLD COMMENTS:
- *             Currently, redefining aggregates using the same name is not
- *             supported.      In such a case, a warning is printed that the
- *             aggregate already exists.  If such is not the case, a new tuple
- *             is created and inserted in the aggregate relation.
- *             All types and functions must have been defined
- *             prior to defining the aggregate.
- *
- * ---------------
  */
 void
-AggregateCreate(char *aggName,
+AggregateCreate(const char *aggName,
+                               Oid aggNamespace,
                                char *aggtransfnName,
                                char *aggfinalfnName,
-                               char *aggbasetypeName,
-                               char *aggtranstypeName,
-                               char *agginitval)
+                               Oid aggBaseType,
+                               Oid aggTransType,
+                               const char *agginitval)
 {
        Relation        aggdesc;
        HeapTuple       tup;
@@ -59,8 +46,6 @@ AggregateCreate(char *aggName,
        Form_pg_proc proc;
        Oid                     transfn;
        Oid                     finalfn = InvalidOid;   /* can be omitted */
-       Oid                     basetype;
-       Oid                     transtype;
        Oid                     finaltype;
        Oid                     fnArgs[FUNC_MAX_ARGS];
        int                     nargs;
@@ -68,8 +53,6 @@ AggregateCreate(char *aggName,
        TupleDesc       tupDesc;
        int                     i;
 
-       MemSet(fnArgs, 0, FUNC_MAX_ARGS * sizeof(Oid));
-
        /* sanity checks */
        if (!aggName)
                elog(ERROR, "no aggregate name supplied");
@@ -77,44 +60,21 @@ AggregateCreate(char *aggName,
        if (!aggtransfnName)
                elog(ERROR, "aggregate must have a transition function");
 
-       /*
-        * Handle the aggregate's base type (input data type).  This can be
-        * specified as 'ANY' for a data-independent transition function, such
-        * as COUNT(*).
-        */
-       basetype = GetSysCacheOid(TYPENAME,
-                                                         PointerGetDatum(aggbasetypeName),
-                                                         0, 0, 0);
-       if (!OidIsValid(basetype))
-       {
-               if (strcasecmp(aggbasetypeName, "ANY") != 0)
-                       elog(ERROR, "data type %s does not exist",
-                                aggbasetypeName);
-               basetype = InvalidOid;
-       }
-
        /* make sure there is no existing agg of same name and base type */
        if (SearchSysCacheExists(AGGNAME,
                                                         PointerGetDatum(aggName),
-                                                        ObjectIdGetDatum(basetype),
+                                                        ObjectIdGetDatum(aggBaseType),
                                                         0, 0))
                elog(ERROR,
                         "aggregate function \"%s\" with base type %s already exists",
-                        aggName, aggbasetypeName);
-
-       /* handle transtype */
-       transtype = GetSysCacheOid(TYPENAME,
-                                                          PointerGetDatum(aggtranstypeName),
-                                                          0, 0, 0);
-       if (!OidIsValid(transtype))
-               elog(ERROR, "data type %s does not exit",
-                        aggtranstypeName);
+                        aggName, typeidTypeName(aggBaseType));
 
        /* handle transfn */
-       fnArgs[0] = transtype;
-       if (OidIsValid(basetype))
+       MemSet(fnArgs, 0, FUNC_MAX_ARGS * sizeof(Oid));
+       fnArgs[0] = aggTransType;
+       if (OidIsValid(aggBaseType))
        {
-               fnArgs[1] = basetype;
+               fnArgs[1] = aggBaseType;
                nargs = 2;
        }
        else
@@ -129,9 +89,9 @@ AggregateCreate(char *aggName,
        transfn = tup->t_data->t_oid;
        Assert(OidIsValid(transfn));
        proc = (Form_pg_proc) GETSTRUCT(tup);
-       if (proc->prorettype != transtype)
+       if (proc->prorettype != aggTransType)
                elog(ERROR, "return type of transition function %s is not %s",
-                        aggtransfnName, aggtranstypeName);
+                        aggtransfnName, typeidTypeName(aggTransType));
 
        /*
         * If the transfn is strict and the initval is NULL, make sure input
@@ -141,7 +101,7 @@ AggregateCreate(char *aggName,
         */
        if (proc->proisstrict && agginitval == NULL)
        {
-               if (!IsBinaryCompatible(basetype, transtype))
+               if (!IsBinaryCompatible(aggBaseType, aggTransType))
                        elog(ERROR, "must not omit initval when transfn is strict and transtype is not compatible with input type");
        }
        ReleaseSysCache(tup);
@@ -149,7 +109,7 @@ AggregateCreate(char *aggName,
        /* handle finalfn, if supplied */
        if (aggfinalfnName)
        {
-               fnArgs[0] = transtype;
+               fnArgs[0] = aggTransType;
                fnArgs[1] = 0;
                tup = SearchSysCache(PROCNAME,
                                                         PointerGetDatum(aggfinalfnName),
@@ -169,7 +129,7 @@ AggregateCreate(char *aggName,
                /*
                 * If no finalfn, aggregate result type is type of the state value
                 */
-               finaltype = transtype;
+               finaltype = aggTransType;
        }
        Assert(OidIsValid(finaltype));
 
@@ -184,8 +144,8 @@ AggregateCreate(char *aggName,
        values[Anum_pg_aggregate_aggowner - 1] = Int32GetDatum(GetUserId());
        values[Anum_pg_aggregate_aggtransfn - 1] = ObjectIdGetDatum(transfn);
        values[Anum_pg_aggregate_aggfinalfn - 1] = ObjectIdGetDatum(finalfn);
-       values[Anum_pg_aggregate_aggbasetype - 1] = ObjectIdGetDatum(basetype);
-       values[Anum_pg_aggregate_aggtranstype - 1] = ObjectIdGetDatum(transtype);
+       values[Anum_pg_aggregate_aggbasetype - 1] = ObjectIdGetDatum(aggBaseType);
+       values[Anum_pg_aggregate_aggtranstype - 1] = ObjectIdGetDatum(aggTransType);
        values[Anum_pg_aggregate_aggfinaltype - 1] = ObjectIdGetDatum(finaltype);
 
        if (agginitval)
index efd98b546f1848e043dfcb9f372029609195609e..8942c266fd6b9d68c41c37a50be3a6c3e74acee7 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/catalog/pg_operator.c,v 1.63 2001/10/25 05:49:23 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/catalog/pg_operator.c,v 1.64 2002/03/29 19:06:01 tgl Exp $
  *
  * NOTES
  *       these routines moved here from commands/define.c and somewhat cleaned up.
 #include "utils/syscache.h"
 
 
-static Oid OperatorGetWithOpenRelation(Relation pg_operator_desc,
-                                                       const char *operatorName,
-                                                       Oid leftObjectId,
-                                                       Oid rightObjectId,
-                                                       bool *defined);
+static Oid OperatorGet(const char *operatorName,
+                                          Oid leftObjectId,
+                                          Oid rightObjectId,
+                                          bool *defined);
 
-static Oid OperatorGet(char *operatorName,
-                       char *leftTypeName,
-                       char *rightTypeName,
-                       bool *defined);
+static Oid OperatorShellMake(const char *operatorName,
+                                                        Oid leftTypeId,
+                                                        Oid rightTypeId);
 
-static Oid OperatorShellMake(char *operatorName,
-                                 char *leftTypeName,
-                                 char *rightTypeName);
-
-static void OperatorDef(char *operatorName,
-                       char *leftTypeName,
-                       char *rightTypeName,
-                       char *procedureName,
+static void OperatorDef(const char *operatorName,
+                       Oid leftTypeId,
+                       Oid rightTypeId,
+                       const char *procedureName,
                        uint16 precedence,
                        bool isLeftAssociative,
-                       char *commutatorName,
-                       char *negatorName,
-                       char *restrictionName,
-                       char *oinName,
+                       const char *commutatorName,
+                       const char *negatorName,
+                       const char *restrictionName,
+                       const char *joinName,
                        bool canHash,
-                       char *leftSortName,
-                       char *rightSortName);
+                       const char *leftSortName,
+                       const char *rightSortName);
 
 static void OperatorUpd(Oid baseId, Oid commId, Oid negId);
 
@@ -120,29 +114,37 @@ validOperatorName(const char *name)
 
 
 /* ----------------------------------------------------------------
- *             OperatorGetWithOpenRelation
+ *             OperatorGet
  *
- *             performs a scan on pg_operator for an operator tuple
- *             with given name and left/right type oids.
+ *             finds the operator associated with the specified name
+ *             and left and right type IDs.
  *
- *       pg_operator_desc      -- reldesc for pg_operator
- *       operatorName          -- name of operator to fetch
- *       leftObjectId          -- left data type oid of operator to fetch
- *       rightObjectId         -- right data type oid of operator to fetch
- *       defined                       -- set TRUE if defined (not a shell)
+ * operatorName                -- name of operator to fetch
+ * leftObjectId                -- left data type oid of operator to fetch
+ * rightObjectId       -- right data type oid of operator to fetch
+ * defined                     -- set TRUE if defined (not a shell)
  * ----------------------------------------------------------------
  */
 static Oid
-OperatorGetWithOpenRelation(Relation pg_operator_desc,
-                                                       const char *operatorName,
-                                                       Oid leftObjectId,
-                                                       Oid rightObjectId,
-                                                       bool *defined)
+OperatorGet(const char *operatorName,
+                       Oid leftObjectId,
+                       Oid rightObjectId,
+                       bool *defined)
 {
+       Relation        pg_operator_desc;
        HeapScanDesc pg_operator_scan;
-       Oid                     operatorObjectId;
        HeapTuple       tup;
        ScanKeyData opKey[3];
+       Oid                     operatorObjectId;
+
+       if (!(OidIsValid(leftObjectId) || OidIsValid(rightObjectId)))
+               elog(ERROR, "operator %s must have at least one operand type",
+                        operatorName);
+
+       /*
+        * open the pg_operator relation
+        */
+       pg_operator_desc = heap_openr(OperatorRelationName, AccessShareLock);
 
        /*
         * form scan key
@@ -192,99 +194,22 @@ OperatorGetWithOpenRelation(Relation pg_operator_desc,
         * close the scan and return the oid.
         */
        heap_endscan(pg_operator_scan);
-
-       return operatorObjectId;
-}
-
-/* ----------------------------------------------------------------
- *             OperatorGet
- *
- *             finds the operator associated with the specified name
- *             and left and right type names.
- * ----------------------------------------------------------------
- */
-static Oid
-OperatorGet(char *operatorName,
-                       char *leftTypeName,
-                       char *rightTypeName,
-                       bool *defined)
-{
-       Relation        pg_operator_desc;
-       Oid                     operatorObjectId;
-       Oid                     leftObjectId = InvalidOid;
-       Oid                     rightObjectId = InvalidOid;
-       bool            leftDefined = false;
-       bool            rightDefined = false;
-
-       /*
-        * look up the operator data types.
-        *
-        * Note: types must be defined before operators
-        */
-       if (leftTypeName)
-       {
-               leftObjectId = TypeGet(leftTypeName, &leftDefined);
-
-               if (!OidIsValid(leftObjectId) || !leftDefined)
-                       elog(ERROR, "left type \"%s\" of operator %s does not exist",
-                                leftTypeName, operatorName);
-       }
-
-       if (rightTypeName)
-       {
-               rightObjectId = TypeGet(rightTypeName, &rightDefined);
-
-               if (!OidIsValid(rightObjectId) || !rightDefined)
-                       elog(ERROR, "right type \"%s\" of operator %s does not exist",
-                                rightTypeName, operatorName);
-       }
-
-       if (!((OidIsValid(leftObjectId) && leftDefined) ||
-                 (OidIsValid(rightObjectId) && rightDefined)))
-               elog(ERROR, "operator %s must have at least one operand type", operatorName);
-
-       /*
-        * open the pg_operator relation
-        */
-       pg_operator_desc = heap_openr(OperatorRelationName, AccessShareLock);
-
-       /*
-        * get the oid for the operator with the appropriate name and
-        * left/right types.
-        */
-       operatorObjectId = OperatorGetWithOpenRelation(pg_operator_desc,
-                                                                                                  operatorName,
-                                                                                                  leftObjectId,
-                                                                                                  rightObjectId,
-                                                                                                  defined);
-
-       /*
-        * close the relation and return the operator oid.
-        */
        heap_close(pg_operator_desc, AccessShareLock);
 
        return operatorObjectId;
 }
 
-/* ----------------------------------------------------------------
- *             OperatorShellMake
- *
- *             Specify operator name and left and right type names,
- *             fill an operator struct with this info and NULL's,
- *             call heap_insert and return the Oid to the caller.
- * ----------------------------------------------------------------
+/*
+ * OperatorShellMake
+ *             Make a "shell" entry for a not-yet-existing operator.
  */
 static Oid
-OperatorShellMake(char *operatorName,
-                                 char *leftTypeName,
-                                 char *rightTypeName)
+OperatorShellMake(const char *operatorName,
+                                 Oid leftTypeId,
+                                 Oid rightTypeId)
 {
        Relation        pg_operator_desc;
        Oid                     operatorObjectId;
-       Oid                     leftObjectId = InvalidOid;
-       Oid                     rightObjectId = InvalidOid;
-       bool            leftDefined = false;
-       bool            rightDefined = false;
        int                     i;
        HeapTuple       tup;
        Datum           values[Natts_pg_operator];
@@ -298,19 +223,6 @@ OperatorShellMake(char *operatorName,
        if (!validOperatorName(operatorName))
                elog(ERROR, "\"%s\" is not a valid operator name", operatorName);
 
-       /*
-        * get the left and right type oid's for this operator
-        */
-       if (leftTypeName)
-               leftObjectId = TypeGet(leftTypeName, &leftDefined);
-
-       if (rightTypeName)
-               rightObjectId = TypeGet(rightTypeName, &rightDefined);
-
-       if (!((OidIsValid(leftObjectId) && leftDefined) ||
-                 (OidIsValid(rightObjectId) && rightDefined)))
-               elog(ERROR, "OperatorShellMake: the operand types are not valid");
-
        /*
         * open pg_operator
         */
@@ -337,8 +249,8 @@ OperatorShellMake(char *operatorName,
        values[i++] = CharGetDatum('b');        /* assume it's binary */
        values[i++] = BoolGetDatum(false);
        values[i++] = BoolGetDatum(false);
-       values[i++] = ObjectIdGetDatum(leftObjectId);           /* <-- left oid */
-       values[i++] = ObjectIdGetDatum(rightObjectId);          /* <-- right oid */
+       values[i++] = ObjectIdGetDatum(leftTypeId);
+       values[i++] = ObjectIdGetDatum(rightTypeId);
        values[i++] = ObjectIdGetDatum(InvalidOid);
        values[i++] = ObjectIdGetDatum(InvalidOid);
        values[i++] = ObjectIdGetDatum(InvalidOid);
@@ -444,8 +356,8 @@ OperatorShellMake(char *operatorName,
  * --------------------------------
  *             "X" indicates an optional argument (i.e. one that can be NULL)
  *             operatorName;                   -- operator name
- *             leftTypeName;                   -- X left type name
- *             rightTypeName;                  -- X right type name
+ *             leftTypeId;                             -- X left type id
+ *             rightTypeId;                    -- X right type id
  *             procedureName;                  -- procedure name for operator code
  *             precedence;                             -- operator precedence
  *             isLeftAssociative;              -- operator is left associative?
@@ -458,22 +370,20 @@ OperatorShellMake(char *operatorName,
  *             rightSortName;                  -- X right sort operator (for merge join)
  */
 static void
-OperatorDef(char *operatorName,
-                       char *leftTypeName,
-                       char *rightTypeName,
-                       char *procedureName,
+OperatorDef(const char *operatorName,
+                       Oid leftTypeId,
+                       Oid rightTypeId,
+                       const char *procedureName,
                        uint16 precedence,
                        bool isLeftAssociative,
-                       char *commutatorName,
-                       char *negatorName,
-                       char *restrictionName,
-                       char *joinName,
+                       const char *commutatorName,
+                       const char *negatorName,
+                       const char *restrictionName,
+                       const char *joinName,
                        bool canHash,
-                       char *leftSortName,
-                       char *rightSortName)
+                       const char *leftSortName,
+                       const char *rightSortName)
 {
-       int                     i,
-                               j;
        Relation        pg_operator_desc;
        HeapScanDesc pg_operator_scan;
        HeapTuple       tup;
@@ -482,23 +392,30 @@ OperatorDef(char *operatorName,
        Datum           values[Natts_pg_operator];
        Oid                     operatorObjectId;
        bool            operatorAlreadyDefined;
-       Oid                     leftTypeId = InvalidOid;
-       Oid                     rightTypeId = InvalidOid;
        Oid                     commutatorId = InvalidOid;
        Oid                     negatorId = InvalidOid;
-       bool            leftDefined = false;
-       bool            rightDefined = false;
        bool            selfCommutator = false;
-       char       *name[4];
+       const char *name[4];
        Oid                     typeId[FUNC_MAX_ARGS];
        int                     nargs;
        NameData        oname;
        TupleDesc       tupDesc;
        ScanKeyData opKey[3];
+       int                     i,
+                               j;
+
+       /*
+        * validate operator name
+        */
+       if (!validOperatorName(operatorName))
+               elog(ERROR, "\"%s\" is not a valid operator name", operatorName);
+
+       if (!(OidIsValid(leftTypeId) || OidIsValid(rightTypeId)))
+               elog(ERROR, "operator must have at least one operand type");
 
        operatorObjectId = OperatorGet(operatorName,
-                                                                  leftTypeName,
-                                                                  rightTypeName,
+                                                                  leftTypeId,
+                                                                  rightTypeId,
                                                                   &operatorAlreadyDefined);
 
        if (operatorAlreadyDefined)
@@ -510,39 +427,6 @@ OperatorDef(char *operatorName,
         * filling in a previously-created shell.
         */
 
-       /*
-        * validate operator name
-        */
-       if (!validOperatorName(operatorName))
-               elog(ERROR, "\"%s\" is not a valid operator name", operatorName);
-
-       /*
-        * look up the operator data types.
-        *
-        * Note: types must be defined before operators
-        */
-       if (leftTypeName)
-       {
-               leftTypeId = TypeGet(leftTypeName, &leftDefined);
-
-               if (!OidIsValid(leftTypeId) || !leftDefined)
-                       elog(ERROR, "left type \"%s\" does not exist",
-                                leftTypeName);
-       }
-
-       if (rightTypeName)
-       {
-               rightTypeId = TypeGet(rightTypeName, &rightDefined);
-
-               if (!OidIsValid(rightTypeId) || !rightDefined)
-                       elog(ERROR, "right type \"%s\" does not exist",
-                                rightTypeName);
-       }
-
-       if (!((OidIsValid(leftTypeId) && leftDefined) ||
-                 (OidIsValid(rightTypeId) && rightDefined)))
-               elog(ERROR, "operator must have at least one operand type");
-
        for (i = 0; i < Natts_pg_operator; ++i)
        {
                values[i] = (Datum) NULL;
@@ -556,12 +440,12 @@ OperatorDef(char *operatorName,
         * created so we don't have to worry about deleting them later.
         */
        MemSet(typeId, 0, FUNC_MAX_ARGS * sizeof(Oid));
-       if (!leftTypeName)
+       if (!OidIsValid(leftTypeId))
        {
                typeId[0] = rightTypeId;
                nargs = 1;
        }
-       else if (!rightTypeName)
+       else if (!OidIsValid(rightTypeId))
        {
                typeId[0] = leftTypeId;
                nargs = 1;
@@ -645,7 +529,7 @@ OperatorDef(char *operatorName,
        values[i++] = NameGetDatum(&oname);
        values[i++] = Int32GetDatum(GetUserId());
        values[i++] = UInt16GetDatum(precedence);
-       values[i++] = CharGetDatum(leftTypeName ? (rightTypeName ? 'b' : 'r') : 'l');
+       values[i++] = CharGetDatum(leftTypeId ? (rightTypeId ? 'b' : 'r') : 'l');
        values[i++] = BoolGetDatum(isLeftAssociative);
        values[i++] = BoolGetDatum(canHash);
        values[i++] = ObjectIdGetDatum(leftTypeId);
@@ -667,8 +551,6 @@ OperatorDef(char *operatorName,
        {
                if (name[j])
                {
-                       char       *otherLeftTypeName = NULL;
-                       char       *otherRightTypeName = NULL;
                        Oid                     otherLeftTypeId = InvalidOid;
                        Oid                     otherRightTypeId = InvalidOid;
                        Oid                     other_oid = InvalidOid;
@@ -677,46 +559,37 @@ OperatorDef(char *operatorName,
                        switch (j)
                        {
                                case 0: /* commutator has reversed arg types */
-                                       otherLeftTypeName = rightTypeName;
-                                       otherRightTypeName = leftTypeName;
                                        otherLeftTypeId = rightTypeId;
                                        otherRightTypeId = leftTypeId;
                                        other_oid = OperatorGet(name[j],
-                                                                                       otherLeftTypeName,
-                                                                                       otherRightTypeName,
+                                                                                       otherLeftTypeId,
+                                                                                       otherRightTypeId,
                                                                                        &otherDefined);
                                        commutatorId = other_oid;
                                        break;
                                case 1: /* negator has same arg types */
-                                       otherLeftTypeName = leftTypeName;
-                                       otherRightTypeName = rightTypeName;
                                        otherLeftTypeId = leftTypeId;
                                        otherRightTypeId = rightTypeId;
                                        other_oid = OperatorGet(name[j],
-                                                                                       otherLeftTypeName,
-                                                                                       otherRightTypeName,
+                                                                                       otherLeftTypeId,
+                                                                                       otherRightTypeId,
                                                                                        &otherDefined);
                                        negatorId = other_oid;
                                        break;
                                case 2: /* left sort op takes left-side data type */
-                                       otherLeftTypeName = leftTypeName;
-                                       otherRightTypeName = leftTypeName;
                                        otherLeftTypeId = leftTypeId;
                                        otherRightTypeId = leftTypeId;
                                        other_oid = OperatorGet(name[j],
-                                                                                       otherLeftTypeName,
-                                                                                       otherRightTypeName,
+                                                                                       otherLeftTypeId,
+                                                                                       otherRightTypeId,
                                                                                        &otherDefined);
                                        break;
-                               case 3: /* right sort op takes right-side data
-                                                                * type */
-                                       otherLeftTypeName = rightTypeName;
-                                       otherRightTypeName = rightTypeName;
+                               case 3: /* right sort op takes right-side data type */
                                        otherLeftTypeId = rightTypeId;
                                        otherRightTypeId = rightTypeId;
                                        other_oid = OperatorGet(name[j],
-                                                                                       otherLeftTypeName,
-                                                                                       otherRightTypeName,
+                                                                                       otherLeftTypeId,
+                                                                                       otherRightTypeId,
                                                                                        &otherDefined);
                                        break;
                        }
@@ -732,8 +605,8 @@ OperatorDef(char *operatorName,
                        {
                                /* not in catalogs, different from operator */
                                other_oid = OperatorShellMake(name[j],
-                                                                                         otherLeftTypeName,
-                                                                                         otherRightTypeName);
+                                                                                         otherLeftTypeId,
+                                                                                         otherRightTypeId);
                                if (!OidIsValid(other_oid))
                                        elog(ERROR,
                                           "OperatorDef: can't create operator shell \"%s\"",
@@ -1023,10 +896,10 @@ OperatorUpd(Oid baseId, Oid commId, Oid negId)
  *
  * This is now just an interface procedure for OperatorDef ...
  *
- * "X" indicates an optional argument (i.e. one that can be NULL)
+ * "X" indicates an optional argument (i.e. one that can be NULL or 0)
  *             operatorName;                   -- operator name
- *             leftTypeName;                   -- X left type name
- *             rightTypeName;                  -- X right type name
+ *             leftTypeId;                             -- X left type ID
+ *             rightTypeId;                    -- X right type ID
  *             procedureName;                  -- procedure for operator
  *             precedence;                             -- operator precedence
  *             isLeftAssociative;              -- operator is left associative
@@ -1039,24 +912,24 @@ OperatorUpd(Oid baseId, Oid commId, Oid negId)
  *             rightSortName;                  -- X right sort operator (for merge join)
  */
 void
-OperatorCreate(char *operatorName,
-                          char *leftTypeName,
-                          char *rightTypeName,
-                          char *procedureName,
+OperatorCreate(const char *operatorName,
+                          Oid leftTypeId,
+                          Oid rightTypeId,
+                          const char *procedureName,
                           uint16 precedence,
                           bool isLeftAssociative,
-                          char *commutatorName,
-                          char *negatorName,
-                          char *restrictionName,
-                          char *joinName,
+                          const char *commutatorName,
+                          const char *negatorName,
+                          const char *restrictionName,
+                          const char *joinName,
                           bool canHash,
-                          char *leftSortName,
-                          char *rightSortName)
+                          const char *leftSortName,
+                          const char *rightSortName)
 {
-       if (!leftTypeName && !rightTypeName)
+       if (!OidIsValid(leftTypeId) && !OidIsValid(rightTypeId))
                elog(ERROR, "at least one of leftarg or rightarg must be specified");
 
-       if (!(leftTypeName && rightTypeName))
+       if (!(OidIsValid(leftTypeId) && OidIsValid(rightTypeId)))
        {
                /* If it's not a binary op, these things mustn't be set: */
                if (commutatorName)
@@ -1075,8 +948,8 @@ OperatorCreate(char *operatorName,
         * already exist.
         */
        OperatorDef(operatorName,
-                               leftTypeName,
-                               rightTypeName,
+                               leftTypeId,
+                               rightTypeId,
                                procedureName,
                                precedence,
                                isLeftAssociative,
index 78041ac585ab807694a31273a67d661e0ab8e103..3c88a777793fb258a8e2081b5cf825b3603237c4 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/catalog/pg_proc.c,v 1.66 2002/03/20 19:43:36 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/catalog/pg_proc.c,v 1.67 2002/03/29 19:06:02 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -41,9 +41,10 @@ static void checkretval(Oid rettype, List *queryTreeList);
  */
 Oid
 ProcedureCreate(char *procedureName,
+                               Oid procNamespace,
                                bool replace,
                                bool returnsSet,
-                               char *returnTypeName,
+                               Oid returnType,
                                Oid languageObjectId,
                                char *prosrc,
                                char *probin,
@@ -60,17 +61,14 @@ ProcedureCreate(char *procedureName,
        Relation        rel;
        HeapTuple       tup;
        HeapTuple       oldtup;
-       bool            defined;
        uint16          parameterCount;
        char            nulls[Natts_pg_proc];
        Datum           values[Natts_pg_proc];
        char            replaces[Natts_pg_proc];
-       Oid                     typeObjectId;
        List       *x;
        List       *querytree_list;
        Oid                     typev[FUNC_MAX_ARGS];
        Oid                     relid;
-       Oid                     toid;
        NameData        procname;
        TupleDesc       tupDesc;
        Oid                     retval;
@@ -86,28 +84,31 @@ ProcedureCreate(char *procedureName,
        foreach(x, argList)
        {
                TypeName   *t = (TypeName *) lfirst(x);
-               char       *typnam = TypeNameToInternalName(t);
+               Oid                     toid;
 
                if (parameterCount >= FUNC_MAX_ARGS)
                        elog(ERROR, "functions cannot have more than %d arguments",
                                 FUNC_MAX_ARGS);
 
-               if (strcmp(typnam, "opaque") == 0)
+               toid = LookupTypeName(t);
+               if (OidIsValid(toid))
                {
-                       if (languageObjectId == SQLlanguageId)
-                               elog(ERROR, "SQL functions cannot have arguments of type \"opaque\"");
-                       toid = InvalidOid;
+                       if (!get_typisdefined(toid))
+                               elog(WARNING, "Argument type \"%s\" is only a shell",
+                                        TypeNameToString(t));
                }
                else
                {
-                       toid = TypeGet(typnam, &defined);
-
-                       if (!OidIsValid(toid))
-                               elog(ERROR, "argument type %s does not exist",
-                                        typnam);
-                       if (!defined)
-                               elog(WARNING, "argument type %s is only a shell",
-                                        typnam);
+                       char      *typnam = TypeNameToString(t);
+
+                       if (strcmp(typnam, "opaque") == 0)
+                       {
+                               if (languageObjectId == SQLlanguageId)
+                                       elog(ERROR, "SQL functions cannot have arguments of type \"opaque\"");
+                               toid = InvalidOid;
+                       }
+                       else
+                               elog(ERROR, "Type \"%s\" does not exist", typnam);
                }
 
                if (t->setof)
@@ -154,41 +155,21 @@ ProcedureCreate(char *procedureName,
                }
        }
 
-       if (strcmp(returnTypeName, "opaque") == 0)
+       if (!OidIsValid(returnType))
        {
                if (languageObjectId == SQLlanguageId)
                        elog(ERROR, "SQL functions cannot return type \"opaque\"");
-               typeObjectId = InvalidOid;
-       }
-       else
-       {
-               typeObjectId = TypeGet(returnTypeName, &defined);
-
-               if (!OidIsValid(typeObjectId))
-               {
-                       elog(WARNING, "ProcedureCreate: type %s is not yet defined",
-                                returnTypeName);
-                       typeObjectId = TypeShellMake(returnTypeName);
-                       if (!OidIsValid(typeObjectId))
-                               elog(ERROR, "could not create type %s",
-                                        returnTypeName);
-               }
-               else if (!defined)
-                       elog(WARNING, "return type %s is only a shell",
-                                returnTypeName);
        }
 
        /*
         * don't allow functions of complex types that have the same name as
         * existing attributes of the type
         */
-       if (parameterCount == 1 &&
-               (toid = TypeGet(strVal(lfirst(argList)), &defined)) &&
-               defined &&
-               (relid = typeidTypeRelid(toid)) != 0 &&
+       if (parameterCount == 1 && OidIsValid(typev[0]) &&
+               (relid = typeidTypeRelid(typev[0])) != 0 &&
                get_attnum(relid, procedureName) != InvalidAttrNumber)
                elog(ERROR, "method %s already an attribute of type %s",
-                        procedureName, strVal(lfirst(argList)));
+                        procedureName, typeidTypeName(typev[0]));
 
        /*
         * If this is a postquel procedure, we parse it here in order to be
@@ -201,7 +182,7 @@ ProcedureCreate(char *procedureName,
        {
                querytree_list = pg_parse_and_rewrite(prosrc, typev, parameterCount);
                /* typecheck return value */
-               checkretval(typeObjectId, querytree_list);
+               checkretval(returnType, querytree_list);
        }
 
        /*
@@ -271,7 +252,7 @@ ProcedureCreate(char *procedureName,
        values[i++] = BoolGetDatum(isStrict);
        values[i++] = UInt16GetDatum(parameterCount);
        values[i++] = BoolGetDatum(returnsSet);
-       values[i++] = ObjectIdGetDatum(typeObjectId);
+       values[i++] = ObjectIdGetDatum(returnType);
        values[i++] = PointerGetDatum(typev);
        values[i++] = Int32GetDatum(byte_pct);          /* probyte_pct */
        values[i++] = Int32GetDatum(perbyte_cpu);       /* properbyte_cpu */
@@ -308,7 +289,7 @@ ProcedureCreate(char *procedureName,
                 * Not okay to change the return type of the existing proc, since
                 * existing rules, views, etc may depend on the return type.
                 */
-               if (typeObjectId != oldproc->prorettype ||
+               if (returnType != oldproc->prorettype ||
                        returnsSet != oldproc->proretset)
                        elog(ERROR, "ProcedureCreate: cannot change return type of existing function."
                                 "\n\tUse DROP FUNCTION first.");
index 6878691241d10ef9327e35389e7e62e00afa4540..15c24c077ad90fa56715273ce2007c2975c1eeef 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/catalog/pg_type.c,v 1.69 2002/03/20 19:43:38 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/catalog/pg_type.c,v 1.70 2002/03/29 19:06:02 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
 #include "catalog/indexing.h"
 #include "catalog/pg_type.h"
 #include "miscadmin.h"
-#include "parser/parse_func.h"
 #include "utils/builtins.h"
-#include "utils/fmgroids.h"
 #include "utils/syscache.h"
 
 
-static Oid TypeShellMakeWithOpenRelation(Relation pg_type_desc,
-                                                         char *typeName);
-
 /* ----------------------------------------------------------------
- *             TypeGetWithOpenRelation
- *
- *             preforms a scan on pg_type for a type tuple with the
- *             given type name.
- * ----------------------------------------------------------------
- *             pg_type_desc                     -- reldesc for pg_type
- *             typeName                                 -- name of type to be fetched
- *             defined                                  -- has the type been defined?
- */
-static Oid
-TypeGetWithOpenRelation(Relation pg_type_desc,
-                                               char *typeName,
-                                               bool *defined)
-{
-       HeapScanDesc scan;
-       HeapTuple       tup;
-       Oid                     typoid;
-       ScanKeyData typeKey[1];
-
-       /*
-        * initialize the scan key and begin a scan of pg_type
-        */
-       ScanKeyEntryInitialize(&typeKey[0],
-                                                  0,
-                                                  Anum_pg_type_typname,
-                                                  F_NAMEEQ,
-                                                  PointerGetDatum(typeName));
-
-       scan = heap_beginscan(pg_type_desc,
-                                                 0,
-                                                 SnapshotSelf, /* cache? */
-                                                 1,
-                                                 typeKey);
-
-       /*
-        * get the type tuple, if it exists.
-        */
-       tup = heap_getnext(scan, 0);
-
-       /*
-        * if no type tuple exists for the given type name, then end the scan
-        * and return appropriate information.
-        */
-       if (!HeapTupleIsValid(tup))
-       {
-               heap_endscan(scan);
-               *defined = false;
-               return InvalidOid;
-       }
-
-       /*
-        * here, the type tuple does exist so we pull information from the
-        * typisdefined field of the tuple and return the tuple's oid, which
-        * is the oid of the type.
-        */
-       *defined = (bool) ((Form_pg_type) GETSTRUCT(tup))->typisdefined;
-       typoid = tup->t_data->t_oid;
-
-       heap_endscan(scan);
-
-       return typoid;
-}
-
-/* ----------------------------------------------------------------
- *             TypeGet
- *
- *             Finds the ObjectId of a type, even if uncommitted; "defined"
- *             is only set if the type has actually been defined, i.e., if
- *             the type tuple is not a shell.
+ *             TypeShellMake
  *
- *             Note: the meat of this function is now in the function
- *                       TypeGetWithOpenRelation().  -cim 6/15/90
+ *             This procedure inserts a "shell" tuple into the type
+ *             relation.  The type tuple inserted has invalid values
+ *             and in particular, the "typisdefined" field is false.
  *
- *             Also called from util/remove.c
+ *             This is used so that a tuple exists in the catalogs.
+ *             The invalid fields should be fixed up sometime after
+ *             this routine is called, and then the "typeisdefined"
+ *             field is set to true. -cim 6/15/90
  * ----------------------------------------------------------------
  */
 Oid
-TypeGet(char *typeName,                        /* name of type to be fetched */
-               bool *defined)                  /* has the type been defined? */
+TypeShellMake(const char *typeName, Oid typeNamespace)
 {
        Relation        pg_type_desc;
-       Oid                     typeoid;
-
-       /*
-        * open the pg_type relation
-        */
-       pg_type_desc = heap_openr(TypeRelationName, AccessShareLock);
-
-       /*
-        * scan the type relation for the information we want
-        */
-       typeoid = TypeGetWithOpenRelation(pg_type_desc,
-                                                                         typeName,
-                                                                         defined);
-
-       /*
-        * close the type relation and return the type oid.
-        */
-       heap_close(pg_type_desc, AccessShareLock);
-
-       return typeoid;
-}
-
-/* ----------------------------------------------------------------
- *             TypeShellMakeWithOpenRelation
- *
- * ----------------------------------------------------------------
- */
-static Oid
-TypeShellMakeWithOpenRelation(Relation pg_type_desc, char *typeName)
-{
+       TupleDesc       tupDesc;
        int                     i;
        HeapTuple       tup;
        Datum           values[Natts_pg_type];
        char            nulls[Natts_pg_type];
        Oid                     typoid;
        NameData        name;
-       TupleDesc       tupDesc;
+
+       Assert(PointerIsValid(typeName));
+
+       /*
+        * open pg_type
+        */
+       pg_type_desc = heap_openr(TypeRelationName, RowExclusiveLock);
+       tupDesc = pg_type_desc->rd_att;
 
        /*
         * initialize our *nulls and *values arrays
@@ -162,34 +70,33 @@ TypeShellMakeWithOpenRelation(Relation pg_type_desc, char *typeName)
         */
        i = 0;
        namestrcpy(&name, typeName);
-       values[i++] = NameGetDatum(&name);      /* 1 */
-       values[i++] = ObjectIdGetDatum(InvalidOid); /* 2 */
-       values[i++] = Int16GetDatum(0);         /* 3 */
-       values[i++] = Int16GetDatum(0);         /* 4 */
-       values[i++] = BoolGetDatum(false);      /* 5 */
-       values[i++] = CharGetDatum(0);          /* 6 */
-       values[i++] = BoolGetDatum(false);      /* 7 */
-       values[i++] = CharGetDatum(0);          /* 8 */
-       values[i++] = ObjectIdGetDatum(InvalidOid); /* 9 */
-       values[i++] = ObjectIdGetDatum(InvalidOid); /* 10 */
-       values[i++] = ObjectIdGetDatum(InvalidOid); /* 11 */
-       values[i++] = ObjectIdGetDatum(InvalidOid); /* 12 */
-       values[i++] = ObjectIdGetDatum(InvalidOid); /* 13 */
-       values[i++] = ObjectIdGetDatum(InvalidOid); /* 14 */
-       values[i++] = CharGetDatum('i');                        /* 15 */
-       values[i++] = CharGetDatum('p');                        /* 16 */
-       values[i++] = BoolGetDatum(false);                      /* 17 */
-       values[i++] = ObjectIdGetDatum(InvalidOid);     /* 18 */
-       values[i++] = Int32GetDatum(-1);                        /* 19 */
-       values[i++] = Int32GetDatum(0);                         /* 20 */
-       nulls[i++] = 'n';                       /* 21 */
-       nulls[i++] = 'n';                       /* 22 */
+       values[i++] = NameGetDatum(&name);      /* typname */
+       values[i++] = ObjectIdGetDatum(typeNamespace); /* typnamespace */
+       values[i++] = ObjectIdGetDatum(InvalidOid); /* typowner */
+       values[i++] = Int16GetDatum(0);         /* typlen */
+       values[i++] = Int16GetDatum(0);         /* typprtlen */
+       values[i++] = BoolGetDatum(false);      /* typbyval */
+       values[i++] = CharGetDatum(0);          /* typtype */
+       values[i++] = BoolGetDatum(false);      /* typisdefined */
+       values[i++] = CharGetDatum(0);          /* typdelim */
+       values[i++] = ObjectIdGetDatum(InvalidOid); /* typrelid */
+       values[i++] = ObjectIdGetDatum(InvalidOid); /* typelem */
+       values[i++] = ObjectIdGetDatum(InvalidOid); /* typinput */
+       values[i++] = ObjectIdGetDatum(InvalidOid); /* typoutput */
+       values[i++] = ObjectIdGetDatum(InvalidOid); /* typreceive */
+       values[i++] = ObjectIdGetDatum(InvalidOid); /* typsend */
+       values[i++] = CharGetDatum('i');                        /* typalign */
+       values[i++] = CharGetDatum('p');                        /* typstorage */
+       values[i++] = BoolGetDatum(false);                      /* typnotnull */
+       values[i++] = ObjectIdGetDatum(InvalidOid);     /* typbasetype */
+       values[i++] = Int32GetDatum(-1);                        /* typtypmod */
+       values[i++] = Int32GetDatum(0);                         /* typndims */
+       nulls[i++] = 'n';                       /* typdefaultbin */
+       nulls[i++] = 'n';                       /* typdefault */
 
        /*
-        * create a new type tuple with FormHeapTuple
+        * create a new type tuple
         */
-       tupDesc = pg_type_desc->rd_att;
-
        tup = heap_formtuple(tupDesc, values, nulls);
 
        /*
@@ -208,47 +115,9 @@ TypeShellMakeWithOpenRelation(Relation pg_type_desc, char *typeName)
        }
 
        /*
-        * free the tuple and return the type-oid
+        * clean up and return the type-oid
         */
        heap_freetuple(tup);
-
-       return typoid;
-}
-
-/* ----------------------------------------------------------------
- *             TypeShellMake
- *
- *             This procedure inserts a "shell" tuple into the type
- *             relation.  The type tuple inserted has invalid values
- *             and in particular, the "typisdefined" field is false.
- *
- *             This is used so that a tuple exists in the catalogs.
- *             The invalid fields should be fixed up sometime after
- *             this routine is called, and then the "typeisdefined"
- *             field is set to true. -cim 6/15/90
- * ----------------------------------------------------------------
- */
-Oid
-TypeShellMake(char *typeName)
-{
-       Relation        pg_type_desc;
-       Oid                     typoid;
-
-       Assert(PointerIsValid(typeName));
-
-       /*
-        * open pg_type
-        */
-       pg_type_desc = heap_openr(TypeRelationName, RowExclusiveLock);
-
-       /*
-        * insert the shell tuple
-        */
-       typoid = TypeShellMakeWithOpenRelation(pg_type_desc, typeName);
-
-       /*
-        * close pg_type and return the tuple's oid.
-        */
        heap_close(pg_type_desc, RowExclusiveLock);
 
        return typoid;
@@ -266,77 +135,38 @@ TypeShellMake(char *typeName)
  * ----------------------------------------------------------------
  */
 Oid
-TypeCreate(char *typeName,
+TypeCreate(const char *typeName,
+                  Oid typeNamespace,
                   Oid assignedTypeOid,
                   Oid relationOid,                     /* only for 'c'atalog typeTypes */
                   int16 internalSize,
                   int16 externalSize,
                   char typeType,
                   char typDelim,
-                  char *inputProcedure,
-                  char *outputProcedure,
-                  char *receiveProcedure,
-                  char *sendProcedure,
-                  char *elementTypeName,
-                  char *baseTypeName,
-                  char *defaultTypeValue,      /* human readable rep */
-                  char *defaultTypeBin,        /* cooked rep */
+                  Oid inputProcedure,
+                  Oid outputProcedure,
+                  Oid receiveProcedure,
+                  Oid sendProcedure,
+                  Oid elementType,
+                  Oid baseType,
+                  const char *defaultTypeValue,        /* human readable rep */
+                  const char *defaultTypeBin,  /* cooked rep */
                   bool passedByValue,
                   char alignment,
                   char storage,
                   int32 typeMod,
-                  int32 typNDims,                      /* Array dimensions for baseTypeName */
+                  int32 typNDims,                      /* Array dimensions for baseType */
                   bool typeNotNull)
 {
-       int                     i,
-                               j;
        Relation        pg_type_desc;
-       HeapScanDesc pg_type_scan;
        Oid                     typeObjectId;
-       Oid                     elementObjectId = InvalidOid;
-       Oid                     baseObjectId = InvalidOid;
        HeapTuple       tup;
        char            nulls[Natts_pg_type];
        char            replaces[Natts_pg_type];
        Datum           values[Natts_pg_type];
-       char       *procname;
-       char       *procs[4];
-       bool            defined;
        NameData        name;
        TupleDesc       tupDesc;
-       Oid                     argList[FUNC_MAX_ARGS];
-       ScanKeyData typeKey[1];
-
-       /*
-        * check that the type is not already defined.  It might exist as a
-        * shell type, however (but only if assignedTypeOid is not given).
-        */
-       typeObjectId = TypeGet(typeName, &defined);
-       if (OidIsValid(typeObjectId) &&
-               (defined || assignedTypeOid != InvalidOid))
-               elog(ERROR, "type named %s already exists", typeName);
-
-       /*
-        * if this type has an associated elementType, then we check that it
-        * is defined.
-        */
-       if (elementTypeName)
-       {
-               elementObjectId = TypeGet(elementTypeName, &defined);
-               if (!defined)
-                       elog(ERROR, "type %s does not exist", elementTypeName);
-       }
-
-       /*
-        * if this type has an associated baseType, then we check that it
-        * is defined.
-        */
-       if (baseTypeName)
-       {
-               baseObjectId = TypeGet(baseTypeName, &defined);
-               if (!defined)
-                       elog(ERROR, "type %s does not exist", baseTypeName);
-       }
+       int                     i;
 
        /*
         * validate size specifications: either positive (fixed-length) or -1
@@ -353,7 +183,7 @@ TypeCreate(char *typeName,
                elog(ERROR, "TypeCreate: fixed size types must have storage PLAIN");
 
        /*
-        * initialize arrays needed by FormHeapTuple
+        * initialize arrays needed for heap_formtuple or heap_modifytuple
         */
        for (i = 0; i < Natts_pg_type; ++i)
        {
@@ -367,94 +197,27 @@ TypeCreate(char *typeName,
         */
        i = 0;
        namestrcpy(&name, typeName);
-       values[i++] = NameGetDatum(&name);      /* 1 */
-       values[i++] = Int32GetDatum(GetUserId());       /* 2 */
-       values[i++] = Int16GetDatum(internalSize);      /* 3 */
-       values[i++] = Int16GetDatum(externalSize);      /* 4 */
-       values[i++] = BoolGetDatum(passedByValue);      /* 5 */
-       values[i++] = CharGetDatum(typeType);           /* 6 */
-       values[i++] = BoolGetDatum(true);       /* 7 */
-       values[i++] = CharGetDatum(typDelim);           /* 8 */
-       values[i++] = ObjectIdGetDatum(typeType == 'c' ? relationOid : InvalidOid); /* 9 */
-       values[i++] = ObjectIdGetDatum(elementObjectId);        /* 10 */
-
-       procs[0] = inputProcedure;
-       procs[1] = outputProcedure;
-       procs[2] = (receiveProcedure) ? receiveProcedure : inputProcedure;
-       procs[3] = (sendProcedure) ? sendProcedure : outputProcedure;
-
-       for (j = 0; j < 4; ++j)
-       {
-               Oid                     procOid;
-
-               procname = procs[j];
-
-               /*
-                * First look for a 1-argument func with all argtypes 0. This is
-                * valid for all four kinds of procedure.
-                */
-               MemSet(argList, 0, FUNC_MAX_ARGS * sizeof(Oid));
-
-               procOid = GetSysCacheOid(PROCNAME,
-                                                                PointerGetDatum(procname),
-                                                                Int32GetDatum(1),
-                                                                PointerGetDatum(argList),
-                                                                0);
-
-               if (!OidIsValid(procOid))
-               {
-                       /*
-                        * For array types, the input procedures may take 3 args (data
-                        * value, element OID, atttypmod); the pg_proc argtype
-                        * signature is 0,OIDOID,INT4OID.  The output procedures may
-                        * take 2 args (data value, element OID).
-                        */
-                       if (OidIsValid(elementObjectId) || OidIsValid(baseObjectId))
-                       {
-                               int                     nargs;
-
-                               if (j % 2)
-                               {
-                                       /* output proc */
-                                       nargs = 2;
-                                       argList[1] = OIDOID;
-                               }
-                               else
-                               {
-                                       /* input proc */
-                                       nargs = 3;
-                                       argList[1] = OIDOID;
-                                       argList[2] = INT4OID;
-                               }
-                               procOid = GetSysCacheOid(PROCNAME,
-                                                                                PointerGetDatum(procname),
-                                                                                Int32GetDatum(nargs),
-                                                                                PointerGetDatum(argList),
-                                                                                0);
-                       }
-
-                       if (!OidIsValid(procOid))
-                               func_error("TypeCreate", procname, 1, argList, NULL);
-               }
-
-               values[i++] = ObjectIdGetDatum(procOid);                /* 11 - 14 */
-       }
-
-       /*
-        * set default alignment
-        */
-       values[i++] = CharGetDatum(alignment);          /* 15 */
-
-       /*
-        * set default storage for TOAST
-        */
-       values[i++] = CharGetDatum(storage);            /* 16 */
-
-       /* set typnotnull, typbasetype, typtypmod, typndims */
-       values[i++] = BoolGetDatum(typeNotNull);                /* 17 */
-       values[i++] = ObjectIdGetDatum(baseObjectId);   /* 18 */
-       values[i++] = Int32GetDatum(typeMod);                   /* 19 */
-       values[i++] = Int32GetDatum(typNDims);                  /* 20 */
+       values[i++] = NameGetDatum(&name);      /* typname */
+       values[i++] = ObjectIdGetDatum(typeNamespace);  /* typnamespace */
+       values[i++] = Int32GetDatum(GetUserId());       /* typowner */
+       values[i++] = Int16GetDatum(internalSize);      /* typlen */
+       values[i++] = Int16GetDatum(externalSize);      /* typprtlen */
+       values[i++] = BoolGetDatum(passedByValue);      /* typbyval */
+       values[i++] = CharGetDatum(typeType);           /* typtype */
+       values[i++] = BoolGetDatum(true);                       /* typisdefined */
+       values[i++] = CharGetDatum(typDelim);           /* typdelim */
+       values[i++] = ObjectIdGetDatum(typeType == 'c' ? relationOid : InvalidOid); /* typrelid */
+       values[i++] = ObjectIdGetDatum(elementType);    /* typelem */
+       values[i++] = ObjectIdGetDatum(inputProcedure); /* typinput */
+       values[i++] = ObjectIdGetDatum(outputProcedure); /* typoutput */
+       values[i++] = ObjectIdGetDatum(receiveProcedure); /* typreceive */
+       values[i++] = ObjectIdGetDatum(sendProcedure);  /* typsend */
+       values[i++] = CharGetDatum(alignment);          /* typalign */
+       values[i++] = CharGetDatum(storage);            /* typstorage */
+       values[i++] = BoolGetDatum(typeNotNull);                /* typnotnull */
+       values[i++] = ObjectIdGetDatum(baseType);               /* typbasetype */
+       values[i++] = Int32GetDatum(typeMod);                   /* typtypmod */
+       values[i++] = Int32GetDatum(typNDims);                  /* typndims */
 
        /*
         * initialize the default binary value for this type.  Check for
@@ -465,7 +228,7 @@ TypeCreate(char *typeName,
                                                                                CStringGetDatum(defaultTypeBin));
        else
                nulls[i] = 'n';
-       i++;                                            /* 21 */
+       i++;                                            /* typdefaultbin */
 
        /*
         * initialize the default value for this type.
@@ -475,36 +238,33 @@ TypeCreate(char *typeName,
                                                                                CStringGetDatum(defaultTypeValue));
        else
                nulls[i] = 'n';
-       i++;                                            /* 22 */
+       i++;                                            /* typdefault */
 
        /*
-        * open pg_type and begin a scan for the type name.
+        * open pg_type and prepare to insert or update a row.
+        *
+        * NOTE: updating will not work correctly in bootstrap mode; but we don't
+        * expect to be overwriting any shell types in bootstrap mode.
         */
        pg_type_desc = heap_openr(TypeRelationName, RowExclusiveLock);
 
-       ScanKeyEntryInitialize(&typeKey[0],
-                                                  0,
-                                                  Anum_pg_type_typname,
-                                                  F_NAMEEQ,
-                                                  PointerGetDatum(typeName));
-
-       pg_type_scan = heap_beginscan(pg_type_desc,
-                                                                 0,
-                                                                 SnapshotSelf, /* cache? */
-                                                                 1,
-                                                                 typeKey);
-
-       /*
-        * define the type either by adding a tuple to the type relation, or
-        * by updating the fields of the "shell" tuple already there.
-        */
-       tup = heap_getnext(pg_type_scan, 0);
+       tup = SearchSysCacheCopy(TYPENAMENSP,
+                                                        CStringGetDatum(typeName),
+                                                        ObjectIdGetDatum(typeNamespace),
+                                                        0, 0);
        if (HeapTupleIsValid(tup))
        {
-               /* should not happen given prior test? */
-               if (assignedTypeOid != InvalidOid)
+               /*
+                * check that the type is not already defined.  It may exist as a
+                * shell type, however (but only if assignedTypeOid is not given).
+                */
+               if (((Form_pg_type) GETSTRUCT(tup))->typisdefined ||
+                       assignedTypeOid != InvalidOid)
                        elog(ERROR, "type %s already exists", typeName);
 
+               /*
+                * Okay to update existing "shell" type tuple
+                */
                tup = heap_modifytuple(tup,
                                                           pg_type_desc,
                                                           values,
@@ -531,11 +291,7 @@ TypeCreate(char *typeName,
                typeObjectId = tup->t_data->t_oid;
        }
 
-       /*
-        * finish up
-        */
-       heap_endscan(pg_type_scan);
-
+       /* Update indices (not necessary if bootstrapping) */
        if (RelationGetForm(pg_type_desc)->relhasindex)
        {
                Relation        idescs[Num_pg_type_indices];
@@ -545,19 +301,25 @@ TypeCreate(char *typeName,
                CatalogCloseIndices(Num_pg_type_indices, idescs);
        }
 
+       /*
+        * finish up
+        */
        heap_close(pg_type_desc, RowExclusiveLock);
 
        return typeObjectId;
 }
 
-/* ----------------------------------------------------------------
- *             TypeRename
- *
+/*
+ * TypeRename
  *             This renames a type
- * ----------------------------------------------------------------
+ *
+ * Note: any associated array type is *not* renamed; caller must make
+ * another call to handle that case.  Currently this is only used for
+ * renaming types associated with tables, for which there are no arrays.
  */
 void
-TypeRename(const char *oldTypeName, const char *newTypeName)
+TypeRename(const char *oldTypeName, Oid typeNamespace,
+                  const char *newTypeName)
 {
        Relation        pg_type_desc;
        Relation        idescs[Num_pg_type_indices];
@@ -565,15 +327,17 @@ TypeRename(const char *oldTypeName, const char *newTypeName)
 
        pg_type_desc = heap_openr(TypeRelationName, RowExclusiveLock);
 
-       tuple = SearchSysCacheCopy(TYPENAME,
-                                                          PointerGetDatum(oldTypeName),
-                                                          0, 0, 0);
+       tuple = SearchSysCacheCopy(TYPENAMENSP,
+                                                          CStringGetDatum(oldTypeName),
+                                                          ObjectIdGetDatum(typeNamespace),
+                                                          0, 0);
        if (!HeapTupleIsValid(tuple))
                elog(ERROR, "type %s does not exist", oldTypeName);
 
-       if (SearchSysCacheExists(TYPENAME,
-                                                        PointerGetDatum(newTypeName),
-                                                        0, 0, 0))
+       if (SearchSysCacheExists(TYPENAMENSP,
+                                                        CStringGetDatum(newTypeName),
+                                                        ObjectIdGetDatum(typeNamespace),
+                                                        0, 0))
                elog(ERROR, "type named %s already exists", newTypeName);
 
        namestrcpy(&(((Form_pg_type) GETSTRUCT(tuple))->typname), newTypeName);
@@ -596,7 +360,7 @@ TypeRename(const char *oldTypeName, const char *newTypeName)
  * the caller is responsible for pfreeing the result
  */
 char *
-makeArrayTypeName(char *typeName)
+makeArrayTypeName(const char *typeName)
 {
        char       *arr;
 
index 0bd64232d1a42b2da317544d06bd27febb781934..151577ae2d2e782b931a039ae9671a68b2dc3726 100644 (file)
@@ -15,7 +15,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/commands/cluster.c,v 1.73 2002/03/26 19:15:35 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/commands/cluster.c,v 1.74 2002/03/29 19:06:03 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -129,7 +129,7 @@ cluster(RangeVar *oldrelation, char *oldindexname)
        CommandCounterIncrement();
 
        /* Destroy old heap (along with its index) and rename new. */
-       heap_drop_with_catalog(saveoldrelation->relname, allowSystemTableMods);
+       heap_drop_with_catalog(OIDOldHeap, allowSystemTableMods);
 
        CommandCounterIncrement();
 
index bf7980d42c86f1d45f5c5c6938697d16d5a1780c..9180c539ff20138295622097985fb8e598f02340 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.166 2002/03/26 19:15:36 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.167 2002/03/29 19:06:03 tgl Exp $
  *
  * NOTES
  *       The PerformAddAttribute() code, like most of the relation
 #include "optimizer/clauses.h"
 #include "optimizer/planmain.h"
 #include "optimizer/prep.h"
+#include "parser/analyze.h"
 #include "parser/parse.h"
 #include "parser/parse_expr.h"
 #include "parser/parse_oper.h"
 #include "parser/parse_relation.h"
-#include "parser/analyze.h"
+#include "parser/parse_type.h"
 #include "tcop/utility.h"
 #include "utils/acl.h"
 #include "utils/builtins.h"
@@ -58,9 +59,9 @@
 
 static void drop_default(Oid relid, int16 attnum);
 static bool needs_toast_table(Relation rel);
-static void AlterTableOwnerId(Oid relationOid, int32 newOwnerSysId);
 static void CheckTupleType(Form_pg_class tuple_class);
 
+
 /* --------------------------------
  *             PortalCleanup
  * --------------------------------
@@ -309,13 +310,13 @@ PerformPortalClose(char *name, CommandDest dest)
  * ----------------
  */
 void
-AlterTableAddColumn(const char *relationName,
+AlterTableAddColumn(Oid myrelid,
                                        bool inherits,
                                        ColumnDef *colDef)
 {
        Relation        rel,
+                               pgclass,
                                attrdesc;
-       Oid                     myrelid;
        HeapTuple       reltup;
        HeapTuple       newreltup;
        HeapTuple       attributeTuple;
@@ -326,19 +327,17 @@ AlterTableAddColumn(const char *relationName,
                                maxatts;
        HeapTuple       typeTuple;
        Form_pg_type tform;
-       char       *typename;
        int                     attndims;
 
        /*
         * Grab an exclusive lock on the target table, which we will NOT
         * release until end of transaction.
         */
-       rel = heap_openr(relationName, AccessExclusiveLock);
-       myrelid = RelationGetRelid(rel);
+       rel = heap_open(myrelid, AccessExclusiveLock);
 
        if (rel->rd_rel->relkind != RELKIND_RELATION)
                elog(ERROR, "ALTER TABLE: relation \"%s\" is not a table",
-                        relationName);
+                        RelationGetRelationName(rel));
 
        /*
         * permissions checking.  this would normally be done in utility.c,
@@ -346,13 +345,13 @@ AlterTableAddColumn(const char *relationName,
         *
         * normally, only the owner of a class can change its schema.
         */
-       if (!allowSystemTableMods && IsSystemRelationName(relationName))
+       if (!allowSystemTableMods
+               && IsSystemRelationName(RelationGetRelationName(rel)))
                elog(ERROR, "ALTER TABLE: relation \"%s\" is a system catalog",
-                        relationName);
+                        RelationGetRelationName(rel));
        if (!pg_class_ownercheck(myrelid, GetUserId()))
-               elog(ERROR, "ALTER TABLE: permission denied");
-
-       heap_close(rel, NoLock);        /* close rel but keep lock! */
+               elog(ERROR, "ALTER TABLE: \"%s\": permission denied",
+                        RelationGetRelationName(rel));
 
        /*
         * Recurse to add the column to child classes, if requested.
@@ -377,17 +376,11 @@ AlterTableAddColumn(const char *relationName,
                foreach(child, children)
                {
                        Oid                     childrelid = lfirsti(child);
-                       char       *childrelname;
 
                        if (childrelid == myrelid)
                                continue;
-                       rel = heap_open(childrelid, AccessExclusiveLock);
-                       childrelname = pstrdup(RelationGetRelationName(rel));
-                       heap_close(rel, AccessExclusiveLock);
-
-                       AlterTableAddColumn(childrelname, false, colDef);
 
-                       pfree(childrelname);
+                       AlterTableAddColumn(childrelid, false, colDef);
                }
        }
 
@@ -412,23 +405,21 @@ AlterTableAddColumn(const char *relationName,
                elog(ERROR, "Adding NOT NULL columns is not implemented."
                         "\n\tAdd the column, then use ALTER TABLE ADD CONSTRAINT.");
 
-
-       rel = heap_openr(RelationRelationName, RowExclusiveLock);
+       pgclass = heap_openr(RelationRelationName, RowExclusiveLock);
 
        reltup = SearchSysCache(RELOID,
                                                        ObjectIdGetDatum(myrelid),
                                                        0, 0, 0);
-
        if (!HeapTupleIsValid(reltup))
                elog(ERROR, "ALTER TABLE: relation \"%s\" not found",
-                        relationName);
+                        RelationGetRelationName(rel));
 
        if (SearchSysCacheExists(ATTNAME,
                                                         ObjectIdGetDatum(myrelid),
                                                         PointerGetDatum(colDef->colname),
                                                         0, 0))
                elog(ERROR, "ALTER TABLE: column name \"%s\" already exists in table \"%s\"",
-                        colDef->colname, relationName);
+                        colDef->colname, RelationGetRelationName(rel));
 
        minattnum = ((Form_pg_class) GETSTRUCT(reltup))->relnatts;
        maxatts = minattnum + 1;
@@ -440,21 +431,11 @@ AlterTableAddColumn(const char *relationName,
        attrdesc = heap_openr(AttributeRelationName, RowExclusiveLock);
 
        if (colDef->typename->arrayBounds)
-       {
                attndims = length(colDef->typename->arrayBounds);
-               typename = makeArrayTypeName(colDef->typename->name);
-       }
        else
-       {
                attndims = 0;
-               typename = colDef->typename->name;
-       }
 
-       typeTuple = SearchSysCache(TYPENAME,
-                                                          PointerGetDatum(typename),
-                                                          0, 0, 0);
-       if (!HeapTupleIsValid(typeTuple))
-               elog(ERROR, "ALTER TABLE: type \"%s\" does not exist", typename);
+       typeTuple = typenameType(colDef->typename);
        tform = (Form_pg_type) GETSTRUCT(typeTuple);
 
        attributeTuple = heap_addheader(Natts_pg_attribute,
@@ -494,7 +475,7 @@ AlterTableAddColumn(const char *relationName,
                CatalogCloseIndices(Num_pg_attr_indices, idescs);
        }
 
-       heap_close(attrdesc, NoLock);
+       heap_close(attrdesc, RowExclusiveLock);
 
        /*
         * Update number of attributes in pg_class tuple
@@ -502,22 +483,24 @@ AlterTableAddColumn(const char *relationName,
        newreltup = heap_copytuple(reltup);
 
        ((Form_pg_class) GETSTRUCT(newreltup))->relnatts = maxatts;
-       simple_heap_update(rel, &newreltup->t_self, newreltup);
+       simple_heap_update(pgclass, &newreltup->t_self, newreltup);
 
        /* keep catalog indices current */
-       if (RelationGetForm(rel)->relhasindex)
+       if (RelationGetForm(pgclass)->relhasindex)
        {
                Relation        ridescs[Num_pg_class_indices];
 
                CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, ridescs);
-               CatalogIndexInsert(ridescs, Num_pg_class_indices, rel, newreltup);
+               CatalogIndexInsert(ridescs, Num_pg_class_indices, pgclass, newreltup);
                CatalogCloseIndices(Num_pg_class_indices, ridescs);
        }
 
        heap_freetuple(newreltup);
        ReleaseSysCache(reltup);
 
-       heap_close(rel, NoLock);
+       heap_close(pgclass, NoLock);
+
+       heap_close(rel, NoLock);        /* close rel but keep lock! */
 
        /*
         * Make our catalog updates visible for subsequent steps.
@@ -549,29 +532,28 @@ AlterTableAddColumn(const char *relationName,
  * ALTER TABLE ALTER COLUMN SET/DROP DEFAULT
  */
 void
-AlterTableAlterColumnDefault(const char *relationName,
+AlterTableAlterColumnDefault(Oid myrelid,
                                                         bool inh, const char *colName,
                                                         Node *newDefault)
 {
        Relation        rel;
        HeapTuple       tuple;
        int16           attnum;
-       Oid                     myrelid;
 
-       rel = heap_openr(relationName, AccessExclusiveLock);
-       myrelid = RelationGetRelid(rel);
+       rel = heap_open(myrelid, AccessExclusiveLock);
 
        if (rel->rd_rel->relkind != RELKIND_RELATION)
                elog(ERROR, "ALTER TABLE: relation \"%s\" is not a table",
-                        relationName);
+                        RelationGetRelationName(rel));
 
-       if (!allowSystemTableMods && IsSystemRelationName(relationName))
+       if (!allowSystemTableMods
+               && IsSystemRelationName(RelationGetRelationName(rel)))
                elog(ERROR, "ALTER TABLE: relation \"%s\" is a system catalog",
-                        relationName);
-       if (!pg_class_ownercheck(myrelid, GetUserId()))
-               elog(ERROR, "ALTER TABLE: permission denied");
+                        RelationGetRelationName(rel));
 
-       heap_close(rel, NoLock);
+       if (!pg_class_ownercheck(myrelid, GetUserId()))
+               elog(ERROR, "ALTER TABLE: \"%s\" permission denied",
+                        RelationGetRelationName(rel));
 
        /*
         * Propagate to children if desired
@@ -595,18 +577,13 @@ AlterTableAlterColumnDefault(const char *relationName,
 
                        if (childrelid == myrelid)
                                continue;
-                       rel = heap_open(childrelid, AccessExclusiveLock);
-                       AlterTableAlterColumnDefault(RelationGetRelationName(rel),
+                       AlterTableAlterColumnDefault(childrelid,
                                                                                 false, colName, newDefault);
-                       heap_close(rel, AccessExclusiveLock);
                }
        }
 
        /* -= now do the thing on this relation =- */
 
-       /* reopen the business */
-       rel = heap_openr(relationName, AccessExclusiveLock);
-
        /*
         * get the number of the attribute
         */
@@ -616,7 +593,7 @@ AlterTableAlterColumnDefault(const char *relationName,
                                                   0, 0);
        if (!HeapTupleIsValid(tuple))
                elog(ERROR, "ALTER TABLE: relation \"%s\" has no column \"%s\"",
-                        relationName, colName);
+                        RelationGetRelationName(rel), colName);
 
        attnum = ((Form_pg_attribute) GETSTRUCT(tuple))->attnum;
        ReleaseSysCache(tuple);
@@ -718,43 +695,42 @@ drop_default(Oid relid, int16 attnum)
  * ALTER TABLE ALTER COLUMN SET STATISTICS / STORAGE
  */
 void
-AlterTableAlterColumnFlags(const char *relationName,
+AlterTableAlterColumnFlags(Oid myrelid,
                                                                bool inh, const char *colName,
                                                                Node *flagValue, const char *flagType)
 {
        Relation        rel;
-       Oid                     myrelid;
        int                     newtarget = 1;
        char        newstorage = 'x';
        char        *storagemode;
        Relation        attrelation;
        HeapTuple       tuple;
 
-       rel = heap_openr(relationName, AccessExclusiveLock);
-       myrelid = RelationGetRelid(rel);
+       rel = heap_open(myrelid, AccessExclusiveLock);
 
        if (rel->rd_rel->relkind != RELKIND_RELATION)
                elog(ERROR, "ALTER TABLE: relation \"%s\" is not a table",
-                        relationName);
+                        RelationGetRelationName(rel));
 
-       /* we allow statistics case for system tables */
-       if (*flagType == 'M' &&
-               !allowSystemTableMods && IsSystemRelationName(relationName))
+       /*      
+        * we allow statistics case for system tables
+        */     
+       if (*flagType != 'S' &&
+               !allowSystemTableMods
+               && IsSystemRelationName(RelationGetRelationName(rel)))
                elog(ERROR, "ALTER TABLE: relation \"%s\" is a system catalog",
-                        relationName);
-       if (!pg_class_ownercheck(myrelid, GetUserId()))
-               elog(ERROR, "ALTER TABLE: permission denied");
-
-       heap_close(rel, NoLock);        /* close rel, but keep lock! */
+                        RelationGetRelationName(rel));
 
+       if (!pg_class_ownercheck(myrelid, GetUserId()))
+               elog(ERROR, "ALTER TABLE: \"%s\" permission denied",
+                        RelationGetRelationName(rel));
 
        /*
         * Check the supplied parameters before anything else
         */
-       if (*flagType == 'S')           /*
-                                                                        * STATISTICS
-                                                                        */
+       if (*flagType == 'S')
        {
+               /* STATISTICS */
                Assert(IsA(flagValue, Integer));
                newtarget = intVal(flagValue);
 
@@ -766,10 +742,9 @@ AlterTableAlterColumnFlags(const char *relationName,
                else if (newtarget > 1000)
                        newtarget = 1000;
        }
-       else if (*flagType == 'M')      /*
-                                                                        * STORAGE
-                                                                        */
+       else if (*flagType == 'M')
        {
+               /* STORAGE */
                Assert(IsA(flagValue, Value));
 
                storagemode = strVal(flagValue);
@@ -813,10 +788,8 @@ AlterTableAlterColumnFlags(const char *relationName,
 
                        if (childrelid == myrelid)
                                continue;
-                       rel = heap_open(childrelid, AccessExclusiveLock);
-                       AlterTableAlterColumnFlags(RelationGetRelationName(rel),
-                                                                                       false, colName, flagValue, flagType);
-                       heap_close(rel, AccessExclusiveLock);
+                       AlterTableAlterColumnFlags(childrelid,
+                                                                          false, colName, flagValue, flagType);
                }
        }
 
@@ -830,7 +803,7 @@ AlterTableAlterColumnFlags(const char *relationName,
                                                           0, 0);
        if (!HeapTupleIsValid(tuple))
                elog(ERROR, "ALTER TABLE: relation \"%s\" has no column \"%s\"",
-                        relationName, colName);
+                        RelationGetRelationName(rel), colName);
 
        if (((Form_pg_attribute) GETSTRUCT(tuple))->attnum < 0)
                elog(ERROR, "ALTER TABLE: cannot change system attribute \"%s\"",
@@ -864,6 +837,7 @@ AlterTableAlterColumnFlags(const char *relationName,
 
        heap_freetuple(tuple);
        heap_close(attrelation, NoLock);
+       heap_close(rel, NoLock);        /* close rel, but keep lock! */
 }
 
 
@@ -1006,14 +980,13 @@ RemoveColumnReferences(Oid reloid, int attnum, bool checkonly, HeapTuple reltup)
  * ALTER TABLE DROP COLUMN
  */
 void
-AlterTableDropColumn(const char *relationName,
+AlterTableDropColumn(Oid myrelid,
                                         bool inh, const char *colName,
                                         int behavior)
 {
 #ifdef _DROP_COLUMN_HACK__
        Relation        rel,
                                attrdesc;
-       Oid                     myrelid;
        HeapTuple       reltup;
        HeapTupleData classtuple;
        Buffer          buffer;
@@ -1031,12 +1004,16 @@ AlterTableDropColumn(const char *relationName,
         * Grab an exclusive lock on the target table, which we will NOT
         * release until end of transaction.
         */
-       rel = heap_openr(relationName, AccessExclusiveLock);
-       myrelid = RelationGetRelid(rel);
+       rel = heap_open(myrelid, AccessExclusiveLock);
 
        if (rel->rd_rel->relkind != RELKIND_RELATION)
                elog(ERROR, "ALTER TABLE: relation \"%s\" is not a table",
-                        relationName);
+                        RelationGetRelationName(rel));
+
+       if (!allowSystemTableMods
+               && IsSystemRelationName(RelationGetRelationName(rel))
+               elog(ERROR, "ALTER TABLE: relation \"%s\" is a system catalog",
+                        RelationGetRelationName(rel));
 
        /*
         * permissions checking.  this would normally be done in utility.c,
@@ -1044,9 +1021,6 @@ AlterTableDropColumn(const char *relationName,
         *
         * normally, only the owner of a class can change its schema.
         */
-       if (!allowSystemTableMods && IsSystemRelationName(relationName))
-               elog(ERROR, "ALTER TABLE: relation \"%s\" is a system catalog",
-                        relationName);
        if (!pg_class_ownercheck(myrelid, GetUserId()))
                elog(ERROR, "ALTER TABLE: permission denied");
 
@@ -1066,8 +1040,17 @@ AlterTableDropColumn(const char *relationName,
                                                        ObjectIdGetDatum(myrelid),
                                                        0, 0, 0);
        if (!HeapTupleIsValid(reltup))
+       {
+               Relation        myrel;
+               char       *myrelname;
+
+               myrel = heap_open(myrelid, AccessExclusiveLock);
+               myrelname = pstrdup(RelationGetRelationName(myrel));
+               heap_close(myrel, AccessExclusiveLock);
+               
                elog(ERROR, "ALTER TABLE: relation \"%s\" not found",
-                        relationName);
+                        myrelname);
+       }
        classtuple.t_self = reltup->t_self;
        ReleaseSysCache(reltup);
 
@@ -1092,8 +1075,17 @@ AlterTableDropColumn(const char *relationName,
                                                         PointerGetDatum(colName),
                                                         0, 0);
        if (!HeapTupleIsValid(tup))
+       {
+               Relation        myrel;
+               char       *myrelname;
+
+               myrel = heap_open(myrelid, AccessExclusiveLock);
+               myrelname = pstrdup(RelationGetRelationName(myrel));
+               heap_close(myrel, AccessExclusiveLock);
+               
                elog(ERROR, "ALTER TABLE: column name \"%s\" doesn't exist in table \"%s\"",
-                        colName, relationName);
+                        colName, myrelname);
+       }
 
        attribute = (Form_pg_attribute) GETSTRUCT(tup);
        attnum = attribute->attnum;
@@ -1164,29 +1156,30 @@ AlterTableDropColumn(const char *relationName,
  * ALTER TABLE ADD CONSTRAINT
  */
 void
-AlterTableAddConstraint(char *relationName,
+AlterTableAddConstraint(Oid myrelid,
                                                bool inh, List *newConstraints)
 {
        Relation        rel;
-       Oid                     myrelid;
        List       *listptr;
 
        /*
         * Grab an exclusive lock on the target table, which we will NOT
         * release until end of transaction.
         */
-       rel = heap_openr(relationName, AccessExclusiveLock);
-       myrelid = RelationGetRelid(rel);
+       rel = heap_open(myrelid, AccessExclusiveLock);
 
        if (rel->rd_rel->relkind != RELKIND_RELATION)
                elog(ERROR, "ALTER TABLE: relation \"%s\" is not a table",
-                        relationName);
+                        RelationGetRelationName(rel));
 
-       if (!allowSystemTableMods && IsSystemRelationName(relationName))
+       if (!allowSystemTableMods
+               && IsSystemRelationName(RelationGetRelationName(rel)))
                elog(ERROR, "ALTER TABLE: relation \"%s\" is a system catalog",
-                        relationName);
+                        RelationGetRelationName(rel));
+
        if (!pg_class_ownercheck(myrelid, GetUserId()))
-               elog(ERROR, "ALTER TABLE: permission denied");
+               elog(ERROR, "ALTER TABLE: \"%s\": permission denied",
+                        RelationGetRelationName(rel));
 
        if (inh)
        {
@@ -1204,16 +1197,10 @@ AlterTableAddConstraint(char *relationName,
                foreach(child, children)
                {
                        Oid                     childrelid = lfirsti(child);
-                       char       *childrelname;
-                       Relation        childrel;
 
                        if (childrelid == myrelid)
                                continue;
-                       childrel = heap_open(childrelid, AccessExclusiveLock);
-                       childrelname = pstrdup(RelationGetRelationName(childrel));
-                       heap_close(childrel, AccessExclusiveLock);
-                       AlterTableAddConstraint(childrelname, false, newConstraints);
-                       pfree(childrelname);
+                       AlterTableAddConstraint(childrelid, false, newConstraints);
                }
        }
 
@@ -1262,7 +1249,7 @@ AlterTableAddConstraint(char *relationName,
                                                                pstate = make_parsestate(NULL);
                                                                rte = addRangeTableEntryForRelation(pstate,
                                                                                                                                        myrelid,
-                                                                                                                                       makeAlias(relationName, NIL),
+                                                                                       makeAlias(RelationGetRelationName(rel), NIL),
                                                                                                                                        false,
                                                                                                                                        true);
                                                                addRTEtoQuery(pstate, rte, true, true);
@@ -1286,7 +1273,7 @@ AlterTableAddConstraint(char *relationName,
                                                                 */
                                                                if (length(pstate->p_rtable) != 1)
                                                                        elog(ERROR, "Only relation '%s' can be referenced in CHECK",
-                                                                                relationName);
+                                                                                RelationGetRelationName(rel));
 
                                                                /*
                                                                 * Might as well try to reduce any
@@ -1358,7 +1345,7 @@ AlterTableAddConstraint(char *relationName,
                                        int                     count;
 
                                        if (is_temp_rel_name(fkconstraint->pktable->relname) &&
-                                               !is_temp_rel_name(relationName))
+                                               !is_temp_rel_name(RelationGetRelationName(rel)))
                                                elog(ERROR, "ALTER TABLE / ADD CONSTRAINT: Unable to reference temporary table from permanent table constraint.");
 
                                        /*
@@ -1408,7 +1395,7 @@ AlterTableAddConstraint(char *relationName,
                                                trig.tgargs[0] = fkconstraint->constr_name;
                                        else
                                                trig.tgargs[0] = "<unknown>";
-                                       trig.tgargs[1] = (char *) relationName;
+                                       trig.tgargs[1] = pstrdup(RelationGetRelationName(rel));
                                        trig.tgargs[2] = fkconstraint->pktable->relname;
                                        trig.tgargs[3] = fkconstraint->match_type;
                                        count = 4;
@@ -1483,12 +1470,11 @@ AlterTableAddConstraint(char *relationName,
  * Christopher Kings-Lynne
  */
 void
-AlterTableDropConstraint(const char *relationName,
+AlterTableDropConstraint(Oid myrelid,
                                                 bool inh, const char *constrName,
                                                 int behavior)
 {
        Relation        rel;
-       Oid                     myrelid;
        int                     deleted;
 
        /*
@@ -1502,19 +1488,21 @@ AlterTableDropConstraint(const char *relationName,
         * Acquire an exclusive lock on the target relation for the duration
         * of the operation.
         */
-       rel = heap_openr(relationName, AccessExclusiveLock);
-       myrelid = RelationGetRelid(rel);
+       rel = heap_open(myrelid, AccessExclusiveLock);
 
        /* Disallow DROP CONSTRAINT on views, indexes, sequences, etc */
        if (rel->rd_rel->relkind != RELKIND_RELATION)
                elog(ERROR, "ALTER TABLE: relation \"%s\" is not a table",
-                        relationName);
+                        RelationGetRelationName(rel));
 
-       if (!allowSystemTableMods && IsSystemRelationName(relationName))
+       if (!allowSystemTableMods
+               && IsSystemRelationName(RelationGetRelationName(rel)))
                elog(ERROR, "ALTER TABLE: relation \"%s\" is a system catalog",
-                        relationName);
+                        RelationGetRelationName(rel));
+
        if (!pg_class_ownercheck(myrelid, GetUserId()))
-               elog(ERROR, "ALTER TABLE: permission denied");
+               elog(ERROR, "ALTER TABLE: \"%s\": permission denied",
+                        RelationGetRelationName(rel));
 
        /*
         * Since all we have is the name of the constraint, we have to look
@@ -1554,30 +1542,7 @@ AlterTableDropConstraint(const char *relationName,
  * ALTER TABLE OWNER
  */
 void
-AlterTableOwner(const RangeVar *tgtrel, const char *newOwnerName)
-{
-       Relation        rel;
-       Oid                     myrelid;
-       int32           newOwnerSysId;
-
-       /* check that we are the superuser */
-       if (!superuser())
-               elog(ERROR, "ALTER TABLE: permission denied");
-
-       /* lookup the OID of the target relation */
-       rel = relation_openrv(tgtrel, AccessExclusiveLock);
-       myrelid = RelationGetRelid(rel);
-       heap_close(rel, NoLock);        /* close rel but keep lock! */
-
-       /* lookup the sysid of the new owner */
-       newOwnerSysId = get_usesysid(newOwnerName);
-
-       /* do all the actual work */
-       AlterTableOwnerId(myrelid, newOwnerSysId);
-}
-
-static void
-AlterTableOwnerId(Oid relationOid, int32 newOwnerSysId)
+AlterTableOwner(Oid relationOid, int32 newOwnerSysId)
 {
        Relation                target_rel;
        Relation                class_rel;
@@ -1629,7 +1594,7 @@ AlterTableOwnerId(Oid relationOid, int32 newOwnerSysId)
                /* For each index, recursively change its ownership */
                foreach(i, index_oid_list)
                {
-                       AlterTableOwnerId(lfirsti(i), newOwnerSysId);
+                       AlterTableOwner(lfirsti(i), newOwnerSysId);
                }
 
                freeList(index_oid_list);
@@ -1640,7 +1605,7 @@ AlterTableOwnerId(Oid relationOid, int32 newOwnerSysId)
                /* If it has a toast table, recurse to change its ownership */
                if (tuple_class->reltoastrelid != InvalidOid)
                {
-                       AlterTableOwnerId(tuple_class->reltoastrelid, newOwnerSysId);
+                       AlterTableOwner(tuple_class->reltoastrelid, newOwnerSysId);
                }
        }
 
index cdc8ce35be316e6044fc4150b6961ebe786c2227..f8e5bc6fc6fd6fe3fe96c274ea191c6d0f5d9fe8 100644 (file)
@@ -7,7 +7,7 @@
  * Copyright (c) 1999-2001, PostgreSQL Global Development Group
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/commands/comment.c,v 1.37 2002/03/26 19:15:38 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/commands/comment.c,v 1.38 2002/03/29 19:06:04 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
 #include "catalog/pg_type.h"
 #include "commands/comment.h"
 #include "miscadmin.h"
+#include "nodes/makefuncs.h"
 #include "parser/parse_agg.h"
-#include "parser/parse_expr.h"
 #include "parser/parse_func.h"
+#include "parser/parse_type.h"
 #include "parser/parse.h"
 #include "rewrite/rewriteRemove.h"
 #include "utils/acl.h"
 
 static void CommentRelation(int objtype, char * schemaname, char *relation,
                                                        char *comment);
-static void CommentAttribute(char *relation, char *attrib, char *comment);
+static void CommentAttribute(char * schemaname, char *relation,
+                                                        char *attrib, char *comment);
 static void CommentDatabase(char *database, char *comment);
 static void CommentRewrite(char *rule, char *comment);
 static void CommentType(char *type, char *comment);
 static void CommentAggregate(char *aggregate, List *arguments, char *comment);
 static void CommentProc(char *function, List *arguments, char *comment);
 static void CommentOperator(char *opname, List *arguments, char *comment);
-static void CommentTrigger(char *trigger, char *relation, char *comments);
+static void CommentTrigger(char *trigger, char *schemaname, char *relation,
+                                                  char *comments);
 
 
 /*------------------------------------------------------------------
@@ -88,7 +91,7 @@ CommentObject(int objtype, char *schemaname, char *objname, char *objproperty,
                        CommentRelation(objtype, schemaname, objname, comment);
                        break;
                case COLUMN:
-                       CommentAttribute(objname, objproperty, comment);
+                       CommentAttribute(schemaname, objname, objproperty, comment);
                        break;
                case DATABASE:
                        CommentDatabase(objname, comment);
@@ -109,7 +112,7 @@ CommentObject(int objtype, char *schemaname, char *objname, char *objproperty,
                        CommentOperator(objname, objlist, comment);
                        break;
                case TRIGGER:
-                       CommentTrigger(objname, objproperty, comment);
+                       CommentTrigger(objname, schemaname, objproperty, comment);
                        break;
                default:
                        elog(ERROR, "An attempt was made to comment on a unknown type: %d",
@@ -391,14 +394,18 @@ CommentRelation(int reltype, char *schemaname, char *relname, char *comment)
 */
 
 static void
-CommentAttribute(char *relname, char *attrname, char *comment)
+CommentAttribute(char *schemaname, char *relname, char *attrname, char *comment)
 {
+       RangeVar   *rel = makeNode(RangeVar);
        Relation        relation;
        AttrNumber      attnum;
 
        /* Open the containing relation to ensure it won't go away meanwhile */
 
-       relation = heap_openr(relname, AccessShareLock);
+       rel->relname = relname;
+       rel->schemaname = schemaname;
+       rel->istemp = false;
+       relation = heap_openrv(rel, AccessShareLock);
 
        /* Check object security */
 
@@ -539,11 +546,8 @@ CommentType(char *type, char *comment)
 
        /* Find the type's oid */
 
-       oid = GetSysCacheOid(TYPENAME,
-                                                PointerGetDatum(type),
-                                                0, 0, 0);
-       if (!OidIsValid(oid))
-               elog(ERROR, "type '%s' does not exist", type);
+       /* XXX WRONG: need to deal with qualified type names */
+       oid = typenameTypeId(makeTypeName(type));
 
        /* Check object security */
 
@@ -570,21 +574,13 @@ static void
 CommentAggregate(char *aggregate, List *arguments, char *comment)
 {
        TypeName   *aggtype = (TypeName *) lfirst(arguments);
-       char       *aggtypename;
        Oid                     baseoid,
                                oid;
        Oid                     classoid;
-       bool            defined;
 
        /* First, attempt to determine the base aggregate oid */
-
        if (aggtype)
-       {
-               aggtypename = TypeNameToInternalName(aggtype);
-               baseoid = TypeGet(aggtypename, &defined);
-               if (!OidIsValid(baseoid))
-                       elog(ERROR, "type '%s' does not exist", aggtypename);
-       }
+               baseoid = typenameTypeId(aggtype);
        else
                baseoid = InvalidOid;
 
@@ -648,20 +644,19 @@ CommentProc(char *function, List *arguments, char *comment)
        for (i = 0; i < argcount; i++)
        {
                TypeName   *t = (TypeName *) lfirst(arguments);
-               char       *typnam = TypeNameToInternalName(t);
-
-               arguments = lnext(arguments);
 
-               if (strcmp(typnam, "opaque") == 0)
-                       argoids[i] = InvalidOid;
-               else
+               argoids[i] = LookupTypeName(t);
+               if (!OidIsValid(argoids[i]))
                {
-                       argoids[i] = GetSysCacheOid(TYPENAME,
-                                                                               PointerGetDatum(typnam),
-                                                                               0, 0, 0);
-                       if (!OidIsValid(argoids[i]))
-                               elog(ERROR, "CommentProc: type '%s' not found", typnam);
+                       char      *typnam = TypeNameToString(t);
+
+                       if (strcmp(typnam, "opaque") == 0)
+                               argoids[i] = InvalidOid;
+                       else
+                               elog(ERROR, "Type \"%s\" does not exist", typnam);
                }
+
+               arguments = lnext(arguments);
        }
 
        /* Now, find the corresponding oid for this procedure */
@@ -707,40 +702,20 @@ CommentOperator(char *opername, List *arguments, char *comment)
 {
        TypeName   *typenode1 = (TypeName *) lfirst(arguments);
        TypeName   *typenode2 = (TypeName *) lsecond(arguments);
-       char            oprtype = 0,
-                          *lefttype = NULL,
-                          *righttype = NULL;
+       char            oprtype = 0;
        Form_pg_operator data;
        HeapTuple       optuple;
        Oid                     oid,
                                leftoid = InvalidOid,
                                rightoid = InvalidOid;
-       bool            defined;
-
-       /* Initialize our left and right argument types */
 
+       /* Attempt to fetch the left type oid, if specified */
        if (typenode1 != NULL)
-               lefttype = TypeNameToInternalName(typenode1);
-       if (typenode2 != NULL)
-               righttype = TypeNameToInternalName(typenode2);
-
-       /* Attempt to fetch the left oid, if specified */
-
-       if (lefttype != NULL)
-       {
-               leftoid = TypeGet(lefttype, &defined);
-               if (!OidIsValid(leftoid))
-                       elog(ERROR, "left type '%s' does not exist", lefttype);
-       }
-
-       /* Attempt to fetch the right oid, if specified */
+               leftoid = typenameTypeId(typenode1);
 
-       if (righttype != NULL)
-       {
-               rightoid = TypeGet(righttype, &defined);
-               if (!OidIsValid(rightoid))
-                       elog(ERROR, "right type '%s' does not exist", righttype);
-       }
+       /* Attempt to fetch the right type oid, if specified */
+       if (typenode2 != NULL)
+               rightoid = typenameTypeId(typenode2);
 
        /* Determine operator type */
 
@@ -797,8 +772,9 @@ CommentOperator(char *opername, List *arguments, char *comment)
 */
 
 static void
-CommentTrigger(char *trigger, char *relname, char *comment)
+CommentTrigger(char *trigger, char *schemaname, char *relname, char *comment)
 {
+       RangeVar   *rel = makeNode(RangeVar);
        Relation        pg_trigger,
                                relation;
        HeapTuple       triggertuple;
@@ -808,7 +784,10 @@ CommentTrigger(char *trigger, char *relname, char *comment)
 
        /* First, validate the user's action */
 
-       relation = heap_openr(relname, AccessShareLock);
+       rel->relname = relname;
+       rel->schemaname = schemaname;
+       rel->istemp = false;
+       relation = heap_openrv(rel, AccessShareLock);
 
        if (!pg_class_ownercheck(RelationGetRelid(relation), GetUserId()))
                elog(ERROR, "you are not permitted to comment on trigger '%s' %s '%s'",
index fc4f80468cdd6db2b953c294b8e468fd9af87ddd..45e108027fd46743e37922d0b754f2e70e3a8789 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.151 2002/03/21 23:27:20 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.152 2002/03/29 19:06:05 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -21,6 +21,7 @@
 #include "access/printtup.h"
 #include "catalog/catname.h"
 #include "catalog/index.h"
+#include "catalog/namespace.h"
 #include "catalog/pg_index.h"
 #include "catalog/pg_shadow.h"
 #include "catalog/pg_type.h"
@@ -228,7 +229,7 @@ CopyDonePeek(FILE *fp, int c, bool pickup)
 /*
  *      DoCopy executes the SQL COPY statement.
  *
- * Either unload or reload contents of table <relname>, depending on <from>.
+ * Either unload or reload contents of table <relation>, depending on <from>.
  * (<from> = TRUE means we are inserting into the table.)
  *
  * If <pipe> is false, transfer is between the table and the file named
@@ -260,7 +261,7 @@ CopyDonePeek(FILE *fp, int c, bool pickup)
  * the table.
  */
 void
-DoCopy(char *relname, bool binary, bool oids, bool from, bool pipe,
+DoCopy(const RangeVar *relation, bool binary, bool oids, bool from, bool pipe,
           char *filename, char *delim, char *null_print)
 {
        FILE       *fp;
@@ -271,7 +272,7 @@ DoCopy(char *relname, bool binary, bool oids, bool from, bool pipe,
        /*
         * Open and lock the relation, using the appropriate lock type.
         */
-       rel = heap_openr(relname, (from ? RowExclusiveLock : AccessShareLock));
+       rel = heap_openrv(relation, (from ? RowExclusiveLock : AccessShareLock));
 
        /* Check permissions. */
        aclresult = pg_class_aclcheck(RelationGetRelid(rel), GetUserId(),
@@ -312,11 +313,14 @@ DoCopy(char *relname, bool binary, bool oids, bool from, bool pipe,
                if (rel->rd_rel->relkind != RELKIND_RELATION)
                {
                        if (rel->rd_rel->relkind == RELKIND_VIEW)
-                               elog(ERROR, "You cannot copy view %s", relname);
+                               elog(ERROR, "You cannot copy view %s",
+                                        RelationGetRelationName(rel));
                        else if (rel->rd_rel->relkind == RELKIND_SEQUENCE)
-                               elog(ERROR, "You cannot change sequence relation %s", relname);
+                               elog(ERROR, "You cannot change sequence relation %s",
+                                        RelationGetRelationName(rel));
                        else
-                               elog(ERROR, "You cannot copy object %s", relname);
+                               elog(ERROR, "You cannot copy object %s",
+                                        RelationGetRelationName(rel));
                }
                if (pipe)
                {
@@ -354,11 +358,14 @@ DoCopy(char *relname, bool binary, bool oids, bool from, bool pipe,
                if (rel->rd_rel->relkind != RELKIND_RELATION)
                {
                        if (rel->rd_rel->relkind == RELKIND_VIEW)
-                               elog(ERROR, "You cannot copy view %s", relname);
+                               elog(ERROR, "You cannot copy view %s",
+                                        RelationGetRelationName(rel));
                        else if (rel->rd_rel->relkind == RELKIND_SEQUENCE)
-                               elog(ERROR, "You cannot copy sequence %s", relname);
+                               elog(ERROR, "You cannot copy sequence %s",
+                                        RelationGetRelationName(rel));
                        else
-                               elog(ERROR, "You cannot copy object %s", relname);
+                               elog(ERROR, "You cannot copy object %s",
+                                        RelationGetRelationName(rel));
                }
                if (pipe)
                {
index 2d68d5d6e7f85c10198f73e012204af1beb5ffda..1cf84f17a3e1d486e5a9f657ad33d5d5f08963a1 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/commands/Attic/creatinh.c,v 1.92 2002/03/26 19:15:40 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/commands/Attic/creatinh.c,v 1.93 2002/03/29 19:06:05 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -27,6 +27,7 @@
 #include "commands/creatinh.h"
 #include "miscadmin.h"
 #include "optimizer/clauses.h"
+#include "parser/parse_type.h"
 #include "utils/acl.h"
 #include "utils/syscache.h"
 #include "utils/temprel.h"
@@ -108,7 +109,7 @@ DefineRelation(CreateStmt *stmt, char relkind)
         * (BuildDescForRelation takes care of the inherited defaults, but we
         * have to copy inherited constraints here.)
         */
-       descriptor = BuildDescForRelation(schema, relname);
+       descriptor = BuildDescForRelation(schema);
 
        if (old_constraints != NIL)
        {
@@ -238,10 +239,12 @@ DefineRelation(CreateStmt *stmt, char relkind)
  * themselves will be destroyed, too.
  */
 void
-RemoveRelation(const char *name)
+RemoveRelation(const RangeVar *relation)
 {
-       AssertArg(name);
-       heap_drop_with_catalog(name, allowSystemTableMods);
+       Oid                     relOid;
+
+       relOid = RangeVarGetRelid(relation, false);
+       heap_drop_with_catalog(relOid, allowSystemTableMods);
 }
 
 /*
@@ -255,34 +258,36 @@ RemoveRelation(const char *name)
  *                               Rows are removed, indices are truncated and reconstructed.
  */
 void
-TruncateRelation(const char *relname)
+TruncateRelation(const RangeVar *relation)
 {
+       Oid                     relid;
        Relation        rel;
 
-       AssertArg(relname);
+       relid = RangeVarGetRelid(relation, false);
 
        /* Grab exclusive lock in preparation for truncate */
-       rel = heap_openr(relname, AccessExclusiveLock);
+       rel = heap_open(relid, AccessExclusiveLock);
 
        if (rel->rd_rel->relkind == RELKIND_SEQUENCE)
                elog(ERROR, "TRUNCATE cannot be used on sequences. '%s' is a sequence",
-                        relname);
+                        RelationGetRelationName(rel));
 
        if (rel->rd_rel->relkind == RELKIND_VIEW)
                elog(ERROR, "TRUNCATE cannot be used on views. '%s' is a view",
-                        relname);
+                        RelationGetRelationName(rel));
 
-       if (!allowSystemTableMods && IsSystemRelationName(relname))
+       if (!allowSystemTableMods && IsSystemRelationName(RelationGetRelationName(rel)))
                elog(ERROR, "TRUNCATE cannot be used on system tables. '%s' is a system table",
-                        relname);
+                        RelationGetRelationName(rel));
 
        if (!pg_class_ownercheck(RelationGetRelid(rel), GetUserId()))
-               elog(ERROR, "you do not own relation \"%s\"", relname);
+               elog(ERROR, "you do not own relation \"%s\"",
+                        RelationGetRelationName(rel));
 
        /* Keep the lock until transaction commit */
        heap_close(rel, NoLock);
 
-       heap_truncate(relname);
+       heap_truncate(relid);
 }
 
 
@@ -308,12 +313,7 @@ MergeDomainAttributes(List *schema)
                HeapTuple  tuple;
                Form_pg_type typeTup;
 
-               tuple = SearchSysCache(TYPENAME,
-                                                          CStringGetDatum(coldef->typename->name),
-                                                          0,0,0);
-               if (!HeapTupleIsValid(tuple))
-                       elog(ERROR, "MergeDomainAttributes: Type %s does not exist",
-                                coldef->typename->name);
+               tuple = typenameType(coldef->typename);
                typeTup = (Form_pg_type) GETSTRUCT(tuple);
 
                if (typeTup->typtype == 'd')
@@ -486,26 +486,11 @@ MergeAttributes(List *schema, List *supers, bool istemp,
                         parent_attno++)
                {
                        Form_pg_attribute attribute = tupleDesc->attrs[parent_attno - 1];
-                       char       *attributeName;
-                       char       *attributeType;
-                       HeapTuple       tuple;
+                       char       *attributeName = NameStr(attribute->attname);
                        int                     exist_attno;
                        ColumnDef  *def;
                        TypeName   *typename;
 
-                       /*
-                        * Get name and type name of attribute
-                        */
-                       attributeName = NameStr(attribute->attname);
-                       tuple = SearchSysCache(TYPEOID,
-                                                                  ObjectIdGetDatum(attribute->atttypid),
-                                                                  0, 0, 0);
-                       if (!HeapTupleIsValid(tuple))
-                               elog(ERROR, "CREATE TABLE: cache lookup failed for type %u",
-                                        attribute->atttypid);
-                       attributeType = pstrdup(NameStr(((Form_pg_type) GETSTRUCT(tuple))->typname));
-                       ReleaseSysCache(tuple);
-
                        /*
                         * Does it conflict with some previously inherited column?
                         */
@@ -519,10 +504,12 @@ MergeAttributes(List *schema, List *supers, bool istemp,
                                elog(NOTICE, "CREATE TABLE: merging multiple inherited definitions of attribute \"%s\"",
                                         attributeName);
                                def = (ColumnDef *) nth(exist_attno - 1, inhSchema);
-                               if (strcmp(def->typename->name, attributeType) != 0 ||
+                               if (typenameTypeId(def->typename) != attribute->atttypid ||
                                        def->typename->typmod != attribute->atttypmod)
                                        elog(ERROR, "CREATE TABLE: inherited attribute \"%s\" type conflict (%s and %s)",
-                                         attributeName, def->typename->name, attributeType);
+                                                attributeName,
+                                                TypeNameToString(def->typename),
+                                                typeidTypeName(attribute->atttypid));
                                /* Merge of NOT NULL constraints = OR 'em together */
                                def->is_not_null |= attribute->attnotnull;
                                /* Default and other constraints are handled below */
@@ -536,7 +523,7 @@ MergeAttributes(List *schema, List *supers, bool istemp,
                                def = makeNode(ColumnDef);
                                def->colname = pstrdup(attributeName);
                                typename = makeNode(TypeName);
-                               typename->name = attributeType;
+                               typename->typeid = attribute->atttypid;
                                typename->typmod = attribute->atttypmod;
                                def->typename = typename;
                                def->is_not_null = attribute->attnotnull;
@@ -640,7 +627,6 @@ MergeAttributes(List *schema, List *supers, bool istemp,
                {
                        ColumnDef  *newdef = lfirst(entry);
                        char       *attributeName = newdef->colname;
-                       char       *attributeType = newdef->typename->name;
                        int                     exist_attno;
 
                        /*
@@ -658,10 +644,12 @@ MergeAttributes(List *schema, List *supers, bool istemp,
                                elog(NOTICE, "CREATE TABLE: merging attribute \"%s\" with inherited definition",
                                         attributeName);
                                def = (ColumnDef *) nth(exist_attno - 1, inhSchema);
-                               if (strcmp(def->typename->name, attributeType) != 0 ||
+                               if (typenameTypeId(def->typename) != typenameTypeId(newdef->typename) ||
                                        def->typename->typmod != newdef->typename->typmod)
                                        elog(ERROR, "CREATE TABLE: attribute \"%s\" type conflict (%s and %s)",
-                                         attributeName, def->typename->name, attributeType);
+                                                attributeName,
+                                                TypeNameToString(def->typename),
+                                                TypeNameToString(newdef->typename));
                                /* Merge of NOT NULL constraints = OR 'em together */
                                def->is_not_null |= newdef->is_not_null;
                                /* If new def has a default, override previous default */
index 2441e49bcaae3bfba5af5999703baf090f63bd72..1d1139bd36226bc5ae0948b6aa1a6808075382f1 100644 (file)
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/commands/define.c,v 1.71 2002/03/20 19:43:44 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/commands/define.c,v 1.72 2002/03/29 19:06:06 tgl Exp $
  *
  * DESCRIPTION
  *       The "DefineFoo" routines take the parse tree and pick out the
@@ -41,6 +41,7 @@
 #include "access/heapam.h"
 #include "catalog/catname.h"
 #include "catalog/heap.h"
+#include "catalog/namespace.h"
 #include "catalog/pg_aggregate.h"
 #include "catalog/pg_language.h"
 #include "catalog/pg_operator.h"
 #include "fmgr.h"
 #include "miscadmin.h"
 #include "optimizer/cost.h"
-#include "parser/parse_expr.h"
+#include "parser/parse_func.h"
+#include "parser/parse_type.h"
 #include "utils/acl.h"
 #include "utils/builtins.h"
+#include "utils/fmgroids.h"
+#include "utils/lsyscache.h"
 #include "utils/syscache.h"
 
+
+static Oid     findTypeIOFunction(const char *procname, bool isOutput);
 static char *defGetString(DefElem *def);
 static double defGetNumeric(DefElem *def);
+static TypeName *defGetTypeName(DefElem *def);
 static int     defGetTypeLength(DefElem *def);
 
 #define DEFAULT_TYPDELIM               ','
@@ -77,16 +84,59 @@ case_translate_language_name(const char *input, char *output)
 }
 
 
-
-static void
-compute_return_type(TypeName *returnType,
-                                       char **prorettype_p, bool *returnsSet_p)
-{
 /*
  *      Examine the "returns" clause returnType of the CREATE FUNCTION statement
  *      and return information about it as *prorettype_p and *returnsSet.
+ *
+ * This is more complex than the average typename lookup because we want to
+ * allow a shell type to be used, or even created if the specified return type
+ * doesn't exist yet.  (Without this, there's no way to define the I/O procs
+ * for a new type.)  But SQL function creation won't cope, so error out if
+ * the target language is SQL.
  */
-       *prorettype_p = TypeNameToInternalName(returnType);
+static void
+compute_return_type(TypeName *returnType, Oid languageOid,
+                                       Oid *prorettype_p, bool *returnsSet_p)
+{
+       Oid             rettype;
+
+       rettype = LookupTypeName(returnType);
+
+       if (OidIsValid(rettype))
+       {
+               if (!get_typisdefined(rettype))
+               {
+                       if (languageOid == SQLlanguageId)
+                               elog(ERROR, "SQL functions cannot return shell types");
+                       else
+                               elog(WARNING, "Return type \"%s\" is only a shell",
+                                        TypeNameToString(returnType));
+               }
+       }
+       else
+       {
+               char      *typnam = TypeNameToString(returnType);
+
+               if (strcmp(typnam, "opaque") == 0)
+                       rettype = InvalidOid;
+               else
+               {
+                       Oid                     namespaceId;
+                       char       *typname;
+
+                       if (languageOid == SQLlanguageId)
+                               elog(ERROR, "Type \"%s\" does not exist", typnam);
+                       elog(WARNING, "ProcedureCreate: type %s is not yet defined",
+                                typnam);
+                       namespaceId = QualifiedNameGetCreationNamespace(returnType->names,
+                                                                                                                       &typname);
+                       rettype = TypeShellMake(typname, namespaceId);
+                       if (!OidIsValid(rettype))
+                               elog(ERROR, "could not create type %s", typnam);
+               }
+       }
+
+       *prorettype_p = rettype;
        *returnsSet_p = returnType->setof;
 }
 
@@ -211,34 +261,31 @@ interpret_AS_clause(Oid languageOid, const char *languageName, const List *as,
 void
 CreateFunction(ProcedureStmt *stmt)
 {
-       /* pathname of executable file that executes this function, if any */
        char       *probin_str;
-       /* SQL that executes this function, if any */
        char       *prosrc_str;
-       /* Type of return value (or member of set of values) from function */
-       char       *prorettype;
-       /* name of language of function, with case adjusted */
-       char            languageName[NAMEDATALEN];
-       /* The function returns a set of values, as opposed to a singleton. */
+       Oid                     prorettype;
        bool            returnsSet;
-       /*
-        * The following are optional user-supplied attributes of the
-        * function.
-        */
+       char            languageName[NAMEDATALEN];
+       Oid                     languageOid;
+       char       *funcname;
+       Oid                     namespaceId;
        int32           byte_pct,
                                perbyte_cpu,
                                percall_cpu,
                                outin_ratio;
        bool            canCache,
                                isStrict;
-
        HeapTuple       languageTuple;
        Form_pg_language languageStruct;
-       Oid languageOid;
+
+       /* Convert list of names to a name and namespace */
+       namespaceId = QualifiedNameGetCreationNamespace(stmt->funcname,
+                                                                                                       &funcname);
 
        /* Convert language name to canonical case */
        case_translate_language_name(stmt->language, languageName);
 
+       /* Look up the language and validate permissions */
        languageTuple = SearchSysCache(LANGNAME,
                                                                   PointerGetDatum(languageName),
                                                                   0, 0, 0);
@@ -259,21 +306,22 @@ CreateFunction(ProcedureStmt *stmt)
         * Convert remaining parameters of CREATE to form wanted by
         * ProcedureCreate.
         */
-       Assert(IsA(stmt->returnType, TypeName));
-       compute_return_type((TypeName *) stmt->returnType,
+       compute_return_type(stmt->returnType, languageOid,
                                                &prorettype, &returnsSet);
 
        compute_full_attributes(stmt->withClause,
                                                        &byte_pct, &perbyte_cpu, &percall_cpu,
                                                        &outin_ratio, &canCache, &isStrict);
 
-       interpret_AS_clause(languageOid, languageName, stmt->as, &prosrc_str, &probin_str);
+       interpret_AS_clause(languageOid, languageName, stmt->as,
+                                               &prosrc_str, &probin_str);
 
        /*
         * And now that we have all the parameters, and know we're permitted
         * to do so, go ahead and create the function.
         */
-       ProcedureCreate(stmt->funcname,
+       ProcedureCreate(funcname,
+                                       namespaceId,
                                        stmt->replace,
                                        returnsSet,
                                        prorettype,
@@ -292,27 +340,28 @@ CreateFunction(ProcedureStmt *stmt)
 
 
 
-/* --------------------------------
+/*
  * DefineOperator
- *
  *             this function extracts all the information from the
  *             parameter list generated by the parser and then has
  *             OperatorCreate() do all the actual work.
  *
  * 'parameters' is a list of DefElem
- * --------------------------------
  */
 void
-DefineOperator(char *oprName,
-                          List *parameters)
+DefineOperator(List *names, List *parameters)
 {
+       char       *oprName;
+       Oid                     oprNamespace;
        uint16          precedence = 0; /* operator precedence */
        bool            canHash = false;        /* operator hashes */
        bool            isLeftAssociative = true;               /* operator is left
                                                                                                 * associative */
        char       *functionName = NULL;        /* function for operator */
-       char       *typeName1 = NULL;           /* first type name */
-       char       *typeName2 = NULL;           /* second type name */
+       TypeName   *typeName1 = NULL;           /* first type name */
+       TypeName   *typeName2 = NULL;           /* second type name */
+       Oid                     typeId1 = InvalidOid;   /* types converted to OID */
+       Oid                     typeId2 = InvalidOid;
        char       *commutatorName = NULL;      /* optional commutator operator
                                                                                 * name */
        char       *negatorName = NULL;         /* optional negator operator name */
@@ -323,6 +372,9 @@ DefineOperator(char *oprName,
        char       *sortName2 = NULL;           /* optional second sort operator */
        List       *pl;
 
+       /* Convert list of names to a name and namespace */
+       oprNamespace = QualifiedNameGetCreationNamespace(names, &oprName);
+
        /*
         * loop over the definition list and extract the information we need.
         */
@@ -332,16 +384,14 @@ DefineOperator(char *oprName,
 
                if (strcasecmp(defel->defname, "leftarg") == 0)
                {
-                       typeName1 = defGetString(defel);
-                       if (IsA(defel->arg, TypeName) &&
-                               ((TypeName *) defel->arg)->setof)
+                       typeName1 = defGetTypeName(defel);
+                       if (typeName1->setof)
                                elog(ERROR, "setof type not implemented for leftarg");
                }
                else if (strcasecmp(defel->defname, "rightarg") == 0)
                {
-                       typeName2 = defGetString(defel);
-                       if (IsA(defel->arg, TypeName) &&
-                               ((TypeName *) defel->arg)->setof)
+                       typeName2 = defGetTypeName(defel);
+                       if (typeName2->setof)
                                elog(ERROR, "setof type not implemented for rightarg");
                }
                else if (strcasecmp(defel->defname, "procedure") == 0)
@@ -367,15 +417,7 @@ DefineOperator(char *oprName,
                else if (strcasecmp(defel->defname, "hashes") == 0)
                        canHash = TRUE;
                else if (strcasecmp(defel->defname, "sort1") == 0)
-               {
-                       /* ----------------
-                        * XXX ( ... [ , sort1 = oprname ] [ , sort2 = oprname ] ... )
-                        * XXX is undocumented in the reference manual source as of
-                        * 89/8/22.
-                        * ----------------
-                        */
                        sortName1 = defGetString(defel);
-               }
                else if (strcasecmp(defel->defname, "sort2") == 0)
                        sortName2 = defGetString(defel);
                else
@@ -391,12 +433,18 @@ DefineOperator(char *oprName,
        if (functionName == NULL)
                elog(ERROR, "Define: \"procedure\" unspecified");
 
+       /* Transform type names to type OIDs */
+       if (typeName1)
+               typeId1 = typenameTypeId(typeName1);
+       if (typeName2)
+               typeId2 = typenameTypeId(typeName2);
+
        /*
         * now have OperatorCreate do all the work..
         */
        OperatorCreate(oprName,         /* operator name */
-                                  typeName1,   /* first type name */
-                                  typeName2,   /* second type name */
+                                  typeId1,             /* left type id */
+                                  typeId2,             /* right type id */
                                   functionName,        /* function for operator */
                                   precedence,  /* operator precedence */
                                   isLeftAssociative,   /* operator is left associative */
@@ -412,20 +460,26 @@ DefineOperator(char *oprName,
 
 }
 
-/* -------------------
+/*
  *     DefineAggregate
- * ------------------
  */
 void
-DefineAggregate(char *aggName, List *parameters)
+DefineAggregate(List *names, List *parameters)
 {
+       char       *aggName;
+       Oid                     aggNamespace;
        char       *transfuncName = NULL;
        char       *finalfuncName = NULL;
-       char       *baseType = NULL;
-       char       *transType = NULL;
+       TypeName   *baseType = NULL;
+       TypeName   *transType = NULL;
        char       *initval = NULL;
+       Oid                     baseTypeId;
+       Oid                     transTypeId;
        List       *pl;
 
+       /* Convert list of names to a name and namespace */
+       aggNamespace = QualifiedNameGetCreationNamespace(names, &aggName);
+
        foreach(pl, parameters)
        {
                DefElem    *defel = (DefElem *) lfirst(pl);
@@ -441,11 +495,11 @@ DefineAggregate(char *aggName, List *parameters)
                else if (strcasecmp(defel->defname, "finalfunc") == 0)
                        finalfuncName = defGetString(defel);
                else if (strcasecmp(defel->defname, "basetype") == 0)
-                       baseType = defGetString(defel);
+                       baseType = defGetTypeName(defel);
                else if (strcasecmp(defel->defname, "stype") == 0)
-                       transType = defGetString(defel);
+                       transType = defGetTypeName(defel);
                else if (strcasecmp(defel->defname, "stype1") == 0)
-                       transType = defGetString(defel);
+                       transType = defGetTypeName(defel);
                else if (strcasecmp(defel->defname, "initcond") == 0)
                        initval = defGetString(defel);
                else if (strcasecmp(defel->defname, "initcond1") == 0)
@@ -465,14 +519,40 @@ DefineAggregate(char *aggName, List *parameters)
        if (transfuncName == NULL)
                elog(ERROR, "Define: \"sfunc\" unspecified");
 
+       /*
+        * Handle the aggregate's base type (input data type).  This can be
+        * specified as 'ANY' for a data-independent transition function, such
+        * as COUNT(*).
+        */
+       baseTypeId = LookupTypeName(baseType);
+       if (OidIsValid(baseTypeId))
+       {
+               /* no need to allow aggregates on as-yet-undefined types */
+               if (!get_typisdefined(baseTypeId))
+                       elog(ERROR, "Type \"%s\" is only a shell",
+                                TypeNameToString(baseType));
+       }
+       else
+       {
+               char      *typnam = TypeNameToString(baseType);
+
+               if (strcasecmp(typnam, "ANY") != 0)
+                       elog(ERROR, "Type \"%s\" does not exist", typnam);
+               baseTypeId = InvalidOid;
+       }
+
+       /* handle transtype --- no special cases here */
+       transTypeId = typenameTypeId(transType);
+
        /*
         * Most of the argument-checking is done inside of AggregateCreate
         */
        AggregateCreate(aggName,        /* aggregate name */
+                                       aggNamespace,   /* namespace */
                                        transfuncName,          /* step function name */
                                        finalfuncName,          /* final function name */
-                                       baseType,       /* type of data being aggregated */
-                                       transType,      /* transition data type */
+                                       baseTypeId,     /* type of data being aggregated */
+                                       transTypeId,    /* transition data type */
                                        initval);       /* initial condition */
 }
 
@@ -483,12 +563,14 @@ DefineAggregate(char *aggName, List *parameters)
 void
 DefineDomain(CreateDomainStmt *stmt)
 {
+       char       *domainName;
+       Oid                     domainNamespace;
        int16           internalLength;
        int16           externalLength;
-       char       *inputName;
-       char       *outputName;
-       char       *sendName;
-       char       *receiveName;
+       Oid                     inputProcedure;
+       Oid                     outputProcedure;
+       Oid                     receiveProcedure;
+       Oid                     sendProcedure;
        bool            byValue;
        char            delimiter;
        char            alignment;
@@ -500,46 +582,27 @@ DefineDomain(CreateDomainStmt *stmt)
        char       *defaultValueBin = NULL;
        bool            typNotNull = false;
        Oid                     basetypelem;
-       char            *elemName = NULL;
-       int32           typNDims = 0;   /* No array dimensions by default */
+       int32           typNDims = length(stmt->typename->arrayBounds);
        HeapTuple       typeTup;
-       char       *typeName = stmt->typename->name;
        List       *schema = stmt->constraints;
        List       *listptr;
 
+       /* Convert list of names to a name and namespace */
+       domainNamespace = QualifiedNameGetCreationNamespace(stmt->domainname,
+                                                                                                               &domainName);
+
        /*
         * Domainnames, unlike typenames don't need to account for the '_'
         * prefix.  So they can be one character longer.
         */
-       if (strlen(stmt->domainname) > (NAMEDATALEN - 1))
+       if (strlen(domainName) > (NAMEDATALEN - 1))
                elog(ERROR, "CREATE DOMAIN: domain names must be %d characters or less",
                         NAMEDATALEN - 1);
 
-       /* Test for existing Domain (or type) of that name */
-       typeTup = SearchSysCache(TYPENAME,
-                                                        PointerGetDatum(stmt->domainname),
-                                                        0, 0, 0);
-       if (HeapTupleIsValid(typeTup))
-               elog(ERROR, "CREATE DOMAIN: domain or type %s already exists",
-                        stmt->domainname);
-
        /*
-        * When the type is an array for some reason we don't actually receive
-        * the name here.  We receive the base types name.  Lets set Dims while
-        * were at it.
+        * Look up the base type.
         */
-       if (stmt->typename->arrayBounds > 0) {
-               typeName = makeArrayTypeName(stmt->typename->name);
-
-               typNDims = length(stmt->typename->arrayBounds);
-       }
-
-       typeTup = SearchSysCache(TYPENAME,
-                                                        PointerGetDatum(typeName),
-                                                        0, 0, 0);
-       if (!HeapTupleIsValid(typeTup))
-               elog(ERROR, "CREATE DOMAIN: type %s does not exist",
-                        stmt->typename->name);
+       typeTup = typenameType(stmt->typename);
 
        /*
         * What we really don't want is domains of domains.  This could cause all sorts
@@ -550,7 +613,7 @@ DefineDomain(CreateDomainStmt *stmt)
        typtype = ((Form_pg_type) GETSTRUCT(typeTup))->typtype;
        if (typtype != 'b')
                elog(ERROR, "DefineDomain: %s is not a basetype",
-                        stmt->typename->name);
+                        TypeNameToString(stmt->typename));
 
        /* passed by value */
        byValue = ((Form_pg_type) GETSTRUCT(typeTup))->typbyval;
@@ -570,43 +633,20 @@ DefineDomain(CreateDomainStmt *stmt)
        /* Array element Delimiter */
        delimiter = ((Form_pg_type) GETSTRUCT(typeTup))->typdelim;
 
-       /*
-        * XXX this is pretty bogus: should be passing function OIDs to
-        * TypeCreate, not names which aren't unique.
-        */
-
-       /* Input Function Name */
-       datum = SysCacheGetAttr(TYPENAME, typeTup, Anum_pg_type_typinput, &isnull);
-       Assert(!isnull);
-
-       inputName = DatumGetCString(DirectFunctionCall1(regprocout, datum));
-
-       /* Output Function Name */
-       datum = SysCacheGetAttr(TYPENAME, typeTup, Anum_pg_type_typoutput, &isnull);
-       Assert(!isnull);
-
-       outputName = DatumGetCString(DirectFunctionCall1(regprocout, datum));
-
-       /* ReceiveName */
-       datum = SysCacheGetAttr(TYPENAME, typeTup, Anum_pg_type_typreceive, &isnull);
-       Assert(!isnull);
-
-       receiveName = DatumGetCString(DirectFunctionCall1(regprocout, datum));
-
-       /* SendName */
-       datum = SysCacheGetAttr(TYPENAME, typeTup, Anum_pg_type_typsend, &isnull);
-       Assert(!isnull);
-
-       sendName = DatumGetCString(DirectFunctionCall1(regprocout, datum));
+       /* I/O Functions */
+       inputProcedure = ((Form_pg_type) GETSTRUCT(typeTup))->typinput;
+       outputProcedure = ((Form_pg_type) GETSTRUCT(typeTup))->typoutput;
+       receiveProcedure = ((Form_pg_type) GETSTRUCT(typeTup))->typreceive;
+       sendProcedure = ((Form_pg_type) GETSTRUCT(typeTup))->typsend;
 
        /* Inherited default value */
-       datum = SysCacheGetAttr(TYPENAME, typeTup,
+       datum = SysCacheGetAttr(TYPEOID, typeTup,
                                                        Anum_pg_type_typdefault, &isnull);
        if (!isnull)
                defaultValue = DatumGetCString(DirectFunctionCall1(textout, datum));
 
        /* Inherited default binary value */
-       datum = SysCacheGetAttr(TYPENAME, typeTup,
+       datum = SysCacheGetAttr(TYPEOID, typeTup,
                                                        Anum_pg_type_typdefaultbin, &isnull);
        if (!isnull)
                defaultValueBin = DatumGetCString(DirectFunctionCall1(textout, datum));
@@ -617,16 +657,6 @@ DefineDomain(CreateDomainStmt *stmt)
         * This is what enables us to make a domain of an array
         */
        basetypelem = ((Form_pg_type) GETSTRUCT(typeTup))->typelem;
-       if (basetypelem != InvalidOid)
-       {
-               HeapTuple tup;
-
-               tup = SearchSysCache(TYPEOID,
-                                                        ObjectIdGetDatum(basetypelem),
-                                                        0, 0, 0);
-               elemName = pstrdup(NameStr(((Form_pg_type) GETSTRUCT(tup))->typname));
-               ReleaseSysCache(tup);
-       }
 
        /*
         * Run through constraints manually to avoid the additional
@@ -661,14 +691,14 @@ DefineDomain(CreateDomainStmt *stmt)
                                expr = cookDefault(pstate, colDef->raw_expr,
                                                                   typeTup->t_data->t_oid,
                                                                   stmt->typename->typmod,
-                                                                  stmt->typename->name);
+                                                                  domainName);
                                /*
                                 * Expression must be stored as a nodeToString result,
                                 * but we also require a valid textual representation
                                 * (mainly to make life easier for pg_dump).
                                 */
                                defaultValue = deparse_expression(expr,
-                                                               deparse_context_for(stmt->domainname,
+                                                               deparse_context_for(domainName,
                                                                                                        InvalidOid),
                                                                                                   false);
                                defaultValueBin = nodeToString(expr);
@@ -723,19 +753,20 @@ DefineDomain(CreateDomainStmt *stmt)
        /*
         * Have TypeCreate do all the real work.
         */
-       TypeCreate(stmt->domainname,    /* type name */
+       TypeCreate(domainName,                  /* type name */
+                          domainNamespace,             /* namespace */
                           InvalidOid,                  /* preassigned type oid (not done here) */
                           InvalidOid,                  /* relation oid (n/a here) */
                           internalLength,              /* internal size */
                           externalLength,              /* external size */
                           'd',                                 /* type-type (domain type) */
                           delimiter,                   /* array element delimiter */
-                          inputName,                   /* input procedure */
-                          outputName,                  /* output procedure */
-                          receiveName,                 /* receive procedure */
-                          sendName,                    /* send procedure */
-                          elemName,                    /* element type name */
-                          typeName,                    /* base type name */
+                          inputProcedure,              /* input procedure */
+                          outputProcedure,             /* output procedure */
+                          receiveProcedure,    /* receive procedure */
+                          sendProcedure,               /* send procedure */
+                          basetypelem,                 /* element type ID */
+                          typeTup->t_data->t_oid,      /* base type ID */
                           defaultValue,                /* default type value (text) */
                           defaultValueBin,             /* default type value (binary) */
                           byValue,                             /* passed by value */
@@ -743,7 +774,7 @@ DefineDomain(CreateDomainStmt *stmt)
                           storage,                             /* TOAST strategy */
                           stmt->typename->typmod, /* typeMod value */
                           typNDims,                    /* Array dimensions for base type */
-                          typNotNull); /* Type NOT NULL */
+                          typNotNull);                 /* Type NOT NULL */
 
        /*
         * Now we can clean up.
@@ -756,11 +787,13 @@ DefineDomain(CreateDomainStmt *stmt)
  *             Registers a new type.
  */
 void
-DefineType(char *typeName, List *parameters)
+DefineType(List *names, List *parameters)
 {
+       char       *typeName;
+       Oid                     typeNamespace;
        int16           internalLength = -1;    /* int2 */
        int16           externalLength = -1;    /* int2 */
-       char       *elemName = NULL;
+       Oid                     elemType = InvalidOid;
        char       *inputName = NULL;
        char       *outputName = NULL;
        char       *sendName = NULL;
@@ -768,10 +801,18 @@ DefineType(char *typeName, List *parameters)
        char       *defaultValue = NULL;
        bool            byValue = false;
        char            delimiter = DEFAULT_TYPDELIM;
-       char       *shadow_type;
-       List       *pl;
        char            alignment = 'i';        /* default alignment */
        char            storage = 'p';  /* default TOAST storage method */
+       Oid                     inputOid;
+       Oid                     outputOid;
+       Oid                     sendOid;
+       Oid                     receiveOid;
+       char       *shadow_type;
+       List       *pl;
+       Oid                     typoid;
+
+       /* Convert list of names to a name and namespace */
+       typeNamespace = QualifiedNameGetCreationNamespace(names, &typeName);
 
        /*
         * Type names must be one character shorter than other names, allowing
@@ -796,16 +837,16 @@ DefineType(char *typeName, List *parameters)
                        outputName = defGetString(defel);
                else if (strcasecmp(defel->defname, "send") == 0)
                        sendName = defGetString(defel);
+               else if (strcasecmp(defel->defname, "receive") == 0)
+                       receiveName = defGetString(defel);
                else if (strcasecmp(defel->defname, "delimiter") == 0)
                {
                        char       *p = defGetString(defel);
 
                        delimiter = p[0];
                }
-               else if (strcasecmp(defel->defname, "receive") == 0)
-                       receiveName = defGetString(defel);
                else if (strcasecmp(defel->defname, "element") == 0)
-                       elemName = defGetString(defel);
+                       elemType = typenameTypeId(defGetTypeName(defel));
                else if (strcasecmp(defel->defname, "default") == 0)
                        defaultValue = defGetString(defel);
                else if (strcasecmp(defel->defname, "passedbyvalue") == 0)
@@ -867,30 +908,44 @@ DefineType(char *typeName, List *parameters)
        if (outputName == NULL)
                elog(ERROR, "Define: \"output\" unspecified");
 
+       /* Convert I/O proc names to OIDs */
+       inputOid = findTypeIOFunction(inputName, false);
+       outputOid = findTypeIOFunction(outputName, true);
+       if (sendName)
+               sendOid = findTypeIOFunction(sendName, true);
+       else
+               sendOid = outputOid;
+       if (receiveName)
+               receiveOid = findTypeIOFunction(receiveName, false);
+       else
+               receiveOid = inputOid;
+
        /*
         * now have TypeCreate do all the real work.
         */
-       TypeCreate(typeName,            /* type name */
-                          InvalidOid,          /* preassigned type oid (not done here) */
-                          InvalidOid,          /* relation oid (n/a here) */
-                          internalLength,      /* internal size */
-                          externalLength,      /* external size */
-                          'b',                         /* type-type (base type) */
-                          delimiter,           /* array element delimiter */
-                          inputName,           /* input procedure */
-                          outputName,          /* output procedure */
-                          receiveName,         /* receive procedure */
-                          sendName,            /* send procedure */
-                          elemName,            /* element type name */
-                          NULL,                        /* base type name (only for domains) */
-                          defaultValue,        /* default type value */
-                          NULL,                        /* no binary form available */
-                          byValue,                     /* passed by value */
-                          alignment,           /* required alignment */
-                          storage,                     /* TOAST strategy */
-                          -1,                          /* typMod (Domains only) */
-                          0,                           /* Array Dimensions of typbasetype */
-                          'f');                        /* Type NOT NULL */
+       typoid =
+               TypeCreate(typeName,            /* type name */
+                                  typeNamespace,       /* namespace */
+                                  InvalidOid,          /* preassigned type oid (not done here) */
+                                  InvalidOid,          /* relation oid (n/a here) */
+                                  internalLength,      /* internal size */
+                                  externalLength,      /* external size */
+                                  'b',                         /* type-type (base type) */
+                                  delimiter,           /* array element delimiter */
+                                  inputOid,            /* input procedure */
+                                  outputOid,           /* output procedure */
+                                  receiveOid,          /* receive procedure */
+                                  sendOid,                     /* send procedure */
+                                  elemType,            /* element type ID */
+                                  InvalidOid,          /* base type ID (only for domains) */
+                                  defaultValue,        /* default type value */
+                                  NULL,                        /* no binary form available */
+                                  byValue,                     /* passed by value */
+                                  alignment,           /* required alignment */
+                                  storage,                     /* TOAST strategy */
+                                  -1,                          /* typMod (Domains only) */
+                                  0,                           /* Array Dimensions of typbasetype */
+                                  false);                      /* Type NOT NULL */
 
        /*
         * When we create a base type (as opposed to a complex type) we need
@@ -902,18 +957,19 @@ DefineType(char *typeName, List *parameters)
        alignment = (alignment == 'd') ? 'd' : 'i';
 
        TypeCreate(shadow_type,         /* type name */
+                          typeNamespace,       /* namespace */
                           InvalidOid,          /* preassigned type oid (not done here) */
                           InvalidOid,          /* relation oid (n/a here) */
                           -1,                          /* internal size */
                           -1,                          /* external size */
                           'b',                         /* type-type (base type) */
                           DEFAULT_TYPDELIM,    /* array element delimiter */
-                          "array_in",          /* input procedure */
-                          "array_out",         /* output procedure */
-                          "array_in",          /* receive procedure */
-                          "array_out",         /* send procedure */
-                          typeName,            /* element type name */
-                          NULL,                        /* base type name */
+                          F_ARRAY_IN,          /* input procedure */
+                          F_ARRAY_OUT,         /* output procedure */
+                          F_ARRAY_IN,          /* receive procedure */
+                          F_ARRAY_OUT,         /* send procedure */
+                          typoid,                      /* element type ID */
+                          InvalidOid,          /* base type ID */
                           NULL,                        /* never a default type value */
                           NULL,                        /* binary default isn't sent either */
                           false,                       /* never passed by value */
@@ -921,11 +977,65 @@ DefineType(char *typeName, List *parameters)
                           'x',                         /* ARRAY is always toastable */
                           -1,                          /* typMod (Domains only) */
                           0,                           /* Array dimensions of typbasetype */
-                          'f');                        /* Type NOT NULL */
+                          false);                      /* Type NOT NULL */
 
        pfree(shadow_type);
 }
 
+static Oid
+findTypeIOFunction(const char *procname, bool isOutput)
+{
+       Oid                     argList[FUNC_MAX_ARGS];
+       int                     nargs;
+       Oid                     procOid;
+
+       /*
+        * First look for a 1-argument func with all argtypes 0. This is
+        * valid for all kinds of procedure.
+        */
+       MemSet(argList, 0, FUNC_MAX_ARGS * sizeof(Oid));
+
+       procOid = GetSysCacheOid(PROCNAME,
+                                                        PointerGetDatum(procname),
+                                                        Int32GetDatum(1),
+                                                        PointerGetDatum(argList),
+                                                        0);
+
+       if (!OidIsValid(procOid))
+       {
+               /*
+                * Alternatively, input procedures may take 3 args (data
+                * value, element OID, atttypmod); the pg_proc argtype
+                * signature is 0,OIDOID,INT4OID.  Output procedures may
+                * take 2 args (data value, element OID).
+                */
+               if (isOutput)
+               {
+                       /* output proc */
+                       nargs = 2;
+                       argList[1] = OIDOID;
+               }
+               else
+               {
+                       /* input proc */
+                       nargs = 3;
+                       argList[1] = OIDOID;
+                       argList[2] = INT4OID;
+               }
+               procOid = GetSysCacheOid(PROCNAME,
+                                                                PointerGetDatum(procname),
+                                                                Int32GetDatum(nargs),
+                                                                PointerGetDatum(argList),
+                                                                0);
+
+               if (!OidIsValid(procOid))
+                       func_error("TypeCreate", procname, 1, argList, NULL);
+       }
+
+       return procOid;
+}
+
+
 static char *
 defGetString(DefElem *def)
 {
@@ -951,7 +1061,7 @@ defGetString(DefElem *def)
                case T_String:
                        return strVal(def->arg);
                case T_TypeName:
-                       return TypeNameToInternalName((TypeName *) def->arg);
+                       return TypeNameToString((TypeName *) def->arg);
                default:
                        elog(ERROR, "Define: cannot interpret argument of \"%s\"",
                                 def->defname);
@@ -978,6 +1088,32 @@ defGetNumeric(DefElem *def)
        return 0;                                       /* keep compiler quiet */
 }
 
+static TypeName *
+defGetTypeName(DefElem *def)
+{
+       if (def->arg == NULL)
+               elog(ERROR, "Define: \"%s\" requires a parameter",
+                        def->defname);
+       switch (nodeTag(def->arg))
+       {
+               case T_TypeName:
+                       return (TypeName *) def->arg;
+               case T_String:
+               {
+                       /* Allow quoted typename for backwards compatibility */
+                       TypeName   *n = makeNode(TypeName);
+
+                       n->names = makeList1(def->arg);
+                       n->typmod = -1;
+                       return n;
+               }
+               default:
+                       elog(ERROR, "Define: argument of \"%s\" must be a type name",
+                                def->defname);
+       }
+       return NULL;                            /* keep compiler quiet */
+}
+
 static int
 defGetTypeLength(DefElem *def)
 {
@@ -998,7 +1134,7 @@ defGetTypeLength(DefElem *def)
                        break;
                case T_TypeName:
                        /* cope if grammar chooses to believe "variable" is a typename */
-                       if (strcasecmp(TypeNameToInternalName((TypeName *) def->arg),
+                       if (strcasecmp(TypeNameToString((TypeName *) def->arg),
                                                   "variable") == 0)
                                return -1;              /* variable length */
                        break;
index 0dbadd95779e1b8257ca7eeebee26fcc226537ef..fb73fe3bd0236c8ef2b4e2d6f0f37e64ccb66592 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/commands/Attic/remove.c,v 1.71 2002/03/21 23:27:21 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/commands/Attic/remove.c,v 1.72 2002/03/29 19:06:06 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -24,8 +24,8 @@
 #include "miscadmin.h"
 #include "parser/parse.h"
 #include "parser/parse_agg.h"
-#include "parser/parse_expr.h"
 #include "parser/parse_func.h"
+#include "parser/parse_type.h"
 #include "utils/acl.h"
 #include "utils/builtins.h"
 #include "utils/syscache.h"
  */
 void
 RemoveOperator(char *operatorName,             /* operator name */
-                          char *typeName1, /* left argument type name */
-                          char *typeName2) /* right argument type name */
+                          TypeName *typeName1, /* left argument type name */
+                          TypeName *typeName2) /* right argument type name */
 {
        Relation        relation;
        HeapTuple       tup;
        Oid                     typeId1 = InvalidOid;
        Oid                     typeId2 = InvalidOid;
-       bool            defined;
        char            oprtype;
 
        if (typeName1)
-       {
-               typeId1 = TypeGet(typeName1, &defined);
-               if (!OidIsValid(typeId1))
-                       elog(ERROR, "RemoveOperator: type '%s' does not exist", typeName1);
-       }
+               typeId1 = typenameTypeId(typeName1);
 
        if (typeName2)
-       {
-               typeId2 = TypeGet(typeName2, &defined);
-               if (!OidIsValid(typeId2))
-                       elog(ERROR, "RemoveOperator: type '%s' does not exist", typeName2);
-       }
+               typeId2 = typenameTypeId(typeName2);
 
        if (OidIsValid(typeId1) && OidIsValid(typeId2))
                oprtype = 'b';
@@ -99,20 +90,20 @@ RemoveOperator(char *operatorName,          /* operator name */
                {
                        elog(ERROR, "RemoveOperator: binary operator '%s' taking '%s' and '%s' does not exist",
                                 operatorName,
-                                typeName1,
-                                typeName2);
+                                TypeNameToString(typeName1),
+                                TypeNameToString(typeName2));
                }
                else if (OidIsValid(typeId1))
                {
                        elog(ERROR, "RemoveOperator: right unary operator '%s' taking '%s' does not exist",
                                 operatorName,
-                                typeName1);
+                                TypeNameToString(typeName1));
                }
                else
                {
                        elog(ERROR, "RemoveOperator: left unary operator '%s' taking '%s' does not exist",
                                 operatorName,
-                                typeName2);
+                                TypeNameToString(typeName2));
                }
        }
        heap_freetuple(tup);
@@ -213,16 +204,13 @@ AttributeAndRelationRemove(Oid typeOid)
        rel = heap_openr(RelationRelationName, RowExclusiveLock);
        while (PointerIsValid((char *) optr->next))
        {
-               key[0].sk_argument = (Datum) (optr++)->reloid;
+               Oid             relOid = (optr++)->reloid;
+
+               key[0].sk_argument = ObjectIdGetDatum(relOid);
                scan = heap_beginscan(rel, 0, SnapshotNow, 1, key);
                tup = heap_getnext(scan, 0);
                if (HeapTupleIsValid(tup))
-               {
-                       char       *name;
-
-                       name = NameStr(((Form_pg_class) GETSTRUCT(tup))->relname);
-                       heap_drop_with_catalog(name, allowSystemTableMods);
-               }
+                       heap_drop_with_catalog(relOid, allowSystemTableMods);
                heap_endscan(scan);
        }
        heap_close(rel, RowExclusiveLock);
@@ -231,42 +219,68 @@ AttributeAndRelationRemove(Oid typeOid)
 
 /*
  *     TypeRemove
- *             Removes the type 'typeName' and all attributes and relations that
- *             use it.
+ *             Removes a datatype.
+ *
+ * NOTE: since this tries to remove the associated array type too, it'll
+ * only work on scalar types.
  */
 void
-RemoveType(char *typeName)             /* type name to be removed */
+RemoveType(List *names)
 {
+       TypeName   *typename;
        Relation        relation;
+       Oid                     typeoid;
        HeapTuple       tup;
-       char       *shadow_type;
+
+       /* Make a TypeName so we can use standard type lookup machinery */
+       typename = makeNode(TypeName);
+       typename->names = names;
+       typename->typmod = -1;
+       typename->arrayBounds = NIL;
 
        relation = heap_openr(TypeRelationName, RowExclusiveLock);
 
-       tup = SearchSysCache(TYPENAME,
-                                                PointerGetDatum(typeName),
+       /* Use LookupTypeName here so that shell types can be removed. */
+       typeoid = LookupTypeName(typename);
+       if (!OidIsValid(typeoid))
+               elog(ERROR, "Type \"%s\" does not exist",
+                        TypeNameToString(typename));
+
+       tup = SearchSysCache(TYPEOID,
+                                                ObjectIdGetDatum(typeoid),
                                                 0, 0, 0);
        if (!HeapTupleIsValid(tup))
-               elog(ERROR, "RemoveType: type '%s' does not exist", typeName);
+               elog(ERROR, "Type \"%s\" does not exist",
+                        TypeNameToString(typename));
 
-       if (!pg_type_ownercheck(tup->t_data->t_oid, GetUserId()))
+       if (!pg_type_ownercheck(typeoid, GetUserId()))
                elog(ERROR, "RemoveType: type '%s': permission denied",
-                        typeName);
+                        TypeNameToString(typename));
 
        /* Delete any comments associated with this type */
-       DeleteComments(tup->t_data->t_oid, RelationGetRelid(relation));
+       DeleteComments(typeoid, RelationGetRelid(relation));
 
+       /* Remove the type tuple from pg_type */
        simple_heap_delete(relation, &tup->t_self);
 
        ReleaseSysCache(tup);
 
-       /* Also, delete the "array of" that type */
-       shadow_type = makeArrayTypeName(typeName);
-       tup = SearchSysCache(TYPENAME,
-                                                PointerGetDatum(shadow_type),
+       /* Now, delete the "array of" that type */
+       typename->arrayBounds = makeList1(makeInteger(1));
+
+       typeoid = LookupTypeName(typename);
+       if (!OidIsValid(typeoid))
+               elog(ERROR, "Type \"%s\" does not exist",
+                        TypeNameToString(typename));
+
+       tup = SearchSysCache(TYPEOID,
+                                                ObjectIdGetDatum(typeoid),
                                                 0, 0, 0);
        if (!HeapTupleIsValid(tup))
-               elog(ERROR, "RemoveType: type '%s' does not exist", shadow_type);
+               elog(ERROR, "Type \"%s\" does not exist",
+                        TypeNameToString(typename));
+
+       DeleteComments(typeoid, RelationGetRelid(relation));
 
        simple_heap_delete(relation, &tup->t_self);
 
@@ -277,13 +291,14 @@ RemoveType(char *typeName)                /* type name to be removed */
 
 /*
  *     RemoveDomain
- *             Removes the domain 'typeName' and all attributes and relations that
- *             use it.
+ *             Removes a domain.
  */
 void
-RemoveDomain(char *domainName, int behavior)
+RemoveDomain(List *names, int behavior)
 {
+       TypeName   *typename;
        Relation        relation;
+       Oid                     typeoid;
        HeapTuple       tup;
        char            typtype;
 
@@ -291,31 +306,44 @@ RemoveDomain(char *domainName, int behavior)
        if (behavior == CASCADE)
                elog(ERROR, "DROP DOMAIN does not support the CASCADE keyword");
 
+       /* Make a TypeName so we can use standard type lookup machinery */
+       typename = makeNode(TypeName);
+       typename->names = names;
+       typename->typmod = -1;
+       typename->arrayBounds = NIL;
+
        relation = heap_openr(TypeRelationName, RowExclusiveLock);
 
-       tup = SearchSysCache(TYPENAME,
-                                                PointerGetDatum(domainName),
+       typeoid = typenameTypeId(typename);
+
+       tup = SearchSysCache(TYPEOID,
+                                                ObjectIdGetDatum(typeoid),
                                                 0, 0, 0);
        if (!HeapTupleIsValid(tup))
-               elog(ERROR, "RemoveType: type '%s' does not exist", domainName);
+               elog(ERROR, "RemoveDomain: type '%s' does not exist",
+                        TypeNameToString(typename));
 
-       if (!pg_type_ownercheck(tup->t_data->t_oid, GetUserId()))
+       if (!pg_type_ownercheck(typeoid, GetUserId()))
                elog(ERROR, "RemoveDomain: type '%s': permission denied",
-                        domainName);
+                        TypeNameToString(typename));
 
        /* Check that this is actually a domain */
        typtype = ((Form_pg_type) GETSTRUCT(tup))->typtype;
 
        if (typtype != 'd')
-               elog(ERROR, "%s is not a domain", domainName);
+               elog(ERROR, "%s is not a domain",
+                        TypeNameToString(typename));
 
        /* Delete any comments associated with this type */
-       DeleteComments(tup->t_data->t_oid, RelationGetRelid(relation));
+       DeleteComments(typeoid, RelationGetRelid(relation));
 
+       /* Remove the type tuple from pg_type */
        simple_heap_delete(relation, &tup->t_self);
 
        ReleaseSysCache(tup);
 
+       /* At present, domains don't have associated array types */
+
        heap_close(relation, RowExclusiveLock);
 }
 
@@ -345,20 +373,19 @@ RemoveFunction(char *functionName,                /* function name to be removed */
        for (i = 0; i < nargs; i++)
        {
                TypeName   *t = (TypeName *) lfirst(argTypes);
-               char       *typnam = TypeNameToInternalName(t);
-
-               argTypes = lnext(argTypes);
 
-               if (strcmp(typnam, "opaque") == 0)
-                       argList[i] = InvalidOid;
-               else
+               argList[i] = LookupTypeName(t);
+               if (!OidIsValid(argList[i]))
                {
-                       argList[i] = GetSysCacheOid(TYPENAME,
-                                                                               PointerGetDatum(typnam),
-                                                                               0, 0, 0);
-                       if (!OidIsValid(argList[i]))
-                               elog(ERROR, "RemoveFunction: type '%s' not found", typnam);
+                       char      *typnam = TypeNameToString(t);
+
+                       if (strcmp(typnam, "opaque") == 0)
+                               argList[i] = InvalidOid;
+                       else
+                               elog(ERROR, "Type \"%s\" does not exist", typnam);
                }
+
+               argTypes = lnext(argTypes);
        }
 
        relation = heap_openr(ProcedureRelationName, RowExclusiveLock);
@@ -393,12 +420,11 @@ RemoveFunction(char *functionName,                /* function name to be removed */
 }
 
 void
-RemoveAggregate(char *aggName, char *aggType)
+RemoveAggregate(char *aggName, TypeName *aggType)
 {
        Relation        relation;
        HeapTuple       tup;
        Oid                     basetypeID;
-       bool            defined;
 
        /*
         * if a basetype is passed in, then attempt to find an aggregate for
@@ -410,11 +436,7 @@ RemoveAggregate(char *aggName, char *aggType)
         */
 
        if (aggType)
-       {
-               basetypeID = TypeGet(aggType, &defined);
-               if (!OidIsValid(basetypeID))
-                       elog(ERROR, "RemoveAggregate: type '%s' does not exist", aggType);
-       }
+               basetypeID = typenameTypeId(aggType);
        else
                basetypeID = InvalidOid;
 
index f050aa9f7fc868f528b1f854fa7342d6729aba63..0f4c83fbebf50a353ba1e33e32668b997e6950d8 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/commands/Attic/rename.c,v 1.65 2002/03/26 19:15:43 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/commands/Attic/rename.c,v 1.66 2002/03/29 19:06:07 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -69,16 +69,14 @@ static void update_ri_trigger_args(Oid relid,
  *             delete original attribute from attribute catalog
  */
 void
-renameatt(char *relname,
+renameatt(Oid relid,
                  char *oldattname,
                  char *newattname,
-                 int recurse)
+                 bool recurse)
 {
        Relation        targetrelation;
        Relation        attrelation;
-       HeapTuple       reltup,
-                               atttup;
-       Oid                     relid;
+       HeapTuple       atttup;
        List       *indexoidlist;
        List       *indexoidscan;
 
@@ -86,8 +84,7 @@ renameatt(char *relname,
         * Grab an exclusive lock on the target table, which we will NOT
         * release until end of transaction.
         */
-       targetrelation = heap_openr(relname, AccessExclusiveLock);
-       relid = RelationGetRelid(targetrelation);
+       targetrelation = heap_open(relid, AccessExclusiveLock);
 
        /*
         * permissions checking.  this would normally be done in utility.c,
@@ -95,12 +92,13 @@ renameatt(char *relname,
         *
         * normally, only the owner of a class can change its schema.
         */
-       if (!allowSystemTableMods && IsSystemRelationName(relname))
+       if (!allowSystemTableMods 
+               && IsSystemRelationName(RelationGetRelationName(targetrelation)))
                elog(ERROR, "renameatt: class \"%s\" is a system catalog",
-                        relname);
+                        RelationGetRelationName(targetrelation));
        if (!pg_class_ownercheck(relid, GetUserId()))
                elog(ERROR, "renameatt: you do not own class \"%s\"",
-                        relname);
+                        RelationGetRelationName(targetrelation));
 
        /*
         * if the 'recurse' flag is set then we are supposed to rename this
@@ -127,25 +125,11 @@ renameatt(char *relname,
                foreach(child, children)
                {
                        Oid                     childrelid = lfirsti(child);
-                       char            childname[NAMEDATALEN];
 
                        if (childrelid == relid)
                                continue;
-                       reltup = SearchSysCache(RELOID,
-                                                                       ObjectIdGetDatum(childrelid),
-                                                                       0, 0, 0);
-                       if (!HeapTupleIsValid(reltup))
-                       {
-                               elog(ERROR, "renameatt: can't find catalog entry for inheriting class with oid %u",
-                                        childrelid);
-                       }
-                       /* make copy of cache value, could disappear in call */
-                       StrNCpy(childname,
-                                       NameStr(((Form_pg_class) GETSTRUCT(reltup))->relname),
-                                       NAMEDATALEN);
-                       ReleaseSysCache(reltup);
                        /* note we need not recurse again! */
-                       renameatt(childname, oldattname, newattname, 0);
+                       renameatt(childrelid, oldattname, newattname, false);
                }
        }
 
@@ -356,7 +340,7 @@ renamerel(const RangeVar *relation, const char *newrelname)
         * Also rename the associated type, if any.
         */
        if (relkind != RELKIND_INDEX)
-               TypeRename(relation->relname, newrelname);
+               TypeRename(relation->relname, namespaceId, newrelname);
 
        /*
         * If it's a view, must also rename the associated ON SELECT rule.
index d0b1f7d4d586f35054bf948f398f9be35e5ae98c..54ca1d19a10082cedd9afe4f9eb7d12c7045a752 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/commands/sequence.c,v 1.74 2002/03/22 02:56:31 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/commands/sequence.c,v 1.75 2002/03/29 19:06:07 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -17,6 +17,7 @@
 #include <ctype.h>
 
 #include "access/heapam.h"
+#include "catalog/pg_type.h"
 #include "commands/creatinh.h"
 #include "commands/sequence.h"
 #include "miscadmin.h"
@@ -85,8 +86,6 @@ DefineSequence(CreateSeqStmt *seq)
 {
        FormData_pg_sequence new;
        CreateStmt *stmt = makeNode(CreateStmt);
-       ColumnDef  *coldef;
-       TypeName   *typnam;
        Oid                     seqoid;
        Relation        rel;
        Buffer          buf;
@@ -108,9 +107,12 @@ DefineSequence(CreateSeqStmt *seq)
        stmt->tableElts = NIL;
        for (i = SEQ_COL_FIRSTCOL; i <= SEQ_COL_LASTCOL; i++)
        {
+               ColumnDef  *coldef;
+               TypeName   *typnam;
+
                typnam = makeNode(TypeName);
                typnam->setof = FALSE;
-               typnam->arrayBounds = NULL;
+               typnam->arrayBounds = NIL;
                typnam->typmod = -1;
                coldef = makeNode(ColumnDef);
                coldef->typename = typnam;
@@ -122,48 +124,48 @@ DefineSequence(CreateSeqStmt *seq)
                switch (i)
                {
                        case SEQ_COL_NAME:
-                               typnam->name = "name";
+                               typnam->typeid = NAMEOID;
                                coldef->colname = "sequence_name";
                                namestrcpy(&name, seq->sequence->relname);
                                value[i - 1] = NameGetDatum(&name);
                                break;
                        case SEQ_COL_LASTVAL:
-                               typnam->name = "int8";
+                               typnam->typeid = INT8OID;
                                coldef->colname = "last_value";
                                value[i - 1] = Int64GetDatumFast(new.last_value);
                                break;
                        case SEQ_COL_INCBY:
-                               typnam->name = "int8";
+                               typnam->typeid = INT8OID;
                                coldef->colname = "increment_by";
                                value[i - 1] = Int64GetDatumFast(new.increment_by);
                                break;
                        case SEQ_COL_MAXVALUE:
-                               typnam->name = "int8";
+                               typnam->typeid = INT8OID;
                                coldef->colname = "max_value";
                                value[i - 1] = Int64GetDatumFast(new.max_value);
                                break;
                        case SEQ_COL_MINVALUE:
-                               typnam->name = "int8";
+                               typnam->typeid = INT8OID;
                                coldef->colname = "min_value";
                                value[i - 1] = Int64GetDatumFast(new.min_value);
                                break;
                        case SEQ_COL_CACHE:
-                               typnam->name = "int8";
+                               typnam->typeid = INT8OID;
                                coldef->colname = "cache_value";
                                value[i - 1] = Int64GetDatumFast(new.cache_value);
                                break;
                        case SEQ_COL_LOG:
-                               typnam->name = "int8";
+                               typnam->typeid = INT8OID;
                                coldef->colname = "log_cnt";
                                value[i - 1] = Int64GetDatum((int64) 1);
                                break;
                        case SEQ_COL_CYCLE:
-                               typnam->name = "bool";
+                               typnam->typeid = BOOLOID;
                                coldef->colname = "is_cycled";
                                value[i - 1] = BoolGetDatum(new.is_cycled);
                                break;
                        case SEQ_COL_CALLED:
-                               typnam->name = "bool";
+                               typnam->typeid = BOOLOID;
                                coldef->colname = "is_called";
                                value[i - 1] = BoolGetDatum(false);
                                break;
index 466bfec202f12e5ca2d66d622a3fbe90ff74b90f..1794d2bda735b4e1c6851b018ce66cec4cbe170b 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/commands/variable.c,v 1.60 2002/03/06 06:09:39 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/commands/variable.c,v 1.61 2002/03/29 19:06:07 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
 
 #include "access/xact.h"
 #include "catalog/pg_shadow.h"
+#include "catalog/pg_type.h"
 #include "commands/variable.h"
 #include "miscadmin.h"
 #include "optimizer/cost.h"
 #include "optimizer/paths.h"
-#include "parser/parse_expr.h"
+#include "parser/parse_type.h"
 #include "utils/builtins.h"
 #include "utils/date.h"
 #include "utils/guc.h"
@@ -390,7 +391,9 @@ parse_timezone(List *args)
                type = p->typename;
                if (type != NULL)
                {
-                       if (strcmp(type->name, "interval") == 0)
+                       Oid             typeOid = typenameTypeId(type);
+
+                       if (typeOid == INTERVALOID)
                        {
                                Interval   *interval;
 
@@ -402,7 +405,7 @@ parse_timezone(List *args)
                                        elog(ERROR, "SET TIME ZONE illegal INTERVAL; month not allowed");
                                CTimeZone = interval->time;
                        }
-                       else if (strcmp(type->name, "float8") == 0)
+                       else if (typeOid == FLOAT8OID)
                        {
                                float8          time;
 
@@ -414,7 +417,7 @@ parse_timezone(List *args)
                         * We do not actually generate an integer constant in gram.y
                         * so this is not used...
                         */
-                       else if (strcmp(type->name, "int4") == 0)
+                       else if (typeOid == INT4OID)
                        {
                                int32           time;
 
index 3b4bf7da13f2fbbe8bcdb058fcb4c626e5c96283..6b8652db5b72e5c4adba96046a00dad33917600c 100644 (file)
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- *     $Id: view.c,v 1.60 2002/03/22 02:56:31 tgl Exp $
+ *     $Id: view.c,v 1.61 2002/03/29 19:06:08 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -14,6 +14,7 @@
 
 #include "access/xact.h"
 #include "catalog/heap.h"
+#include "catalog/namespace.h"
 #include "commands/creatinh.h"
 #include "commands/view.h"
 #include "miscadmin.h"
@@ -24,6 +25,7 @@
 #include "rewrite/rewriteManip.h"
 #include "rewrite/rewriteRemove.h"
 #include "rewrite/rewriteSupport.h"
+#include "utils/syscache.h"
 
 
 /*---------------------------------------------------------------------
  *---------------------------------------------------------------------
  */
 static Oid
-DefineVirtualRelation(char *relname, List *tlist)
+DefineVirtualRelation(const RangeVar *relation, List *tlist)
 {
        CreateStmt *createStmt = makeNode(CreateStmt);
-       RangeVar   *rel = makeNode(RangeVar);
        List       *attrList,
                           *t;
 
@@ -57,14 +58,12 @@ DefineVirtualRelation(char *relname, List *tlist)
 
                if (!res->resjunk)
                {
-                       char       *resname = res->resname;
-                       char       *restypename = typeidTypeName(res->restype);
                        ColumnDef  *def = makeNode(ColumnDef);
                        TypeName   *typename = makeNode(TypeName);
 
-                       def->colname = pstrdup(resname);
+                       def->colname = pstrdup(res->resname);
 
-                       typename->name = pstrdup(restypename);
+                       typename->typeid = res->restype;
                        typename->typmod = res->restypmod;
                        def->typename = typename;
 
@@ -84,10 +83,7 @@ DefineVirtualRelation(char *relname, List *tlist)
         * now create the parameters for keys/inheritance etc. All of them are
         * nil...
         */
-       rel->relname = relname;
-       rel->schemaname = NULL;         /* XXX wrong */
-       rel->istemp = false;
-       createStmt->relation = rel;
+       createStmt->relation = (RangeVar *) relation;
        createStmt->tableElts = attrList;
        createStmt->inhRelations = NIL;
        createStmt->constraints = NIL;
@@ -100,25 +96,19 @@ DefineVirtualRelation(char *relname, List *tlist)
 }
 
 static RuleStmt *
-FormViewRetrieveRule(char *viewName, Query *viewParse)
+FormViewRetrieveRule(const RangeVar *view, Query *viewParse)
 {
        RuleStmt   *rule;
        char       *rname;
-       RangeVar   *rel;
 
        /*
         * Create a RuleStmt that corresponds to the suitable rewrite rule
         * args for DefineQueryRewrite();
         */
-       rname = MakeRetrieveViewRuleName(viewName);
-
-       rel = makeNode(RangeVar);
-       rel->relname = pstrdup(viewName);
-       rel->inhOpt = INH_NO;
-       rel->alias = NULL;
+       rname = MakeRetrieveViewRuleName(view->relname);
 
        rule = makeNode(RuleStmt);
-       rule->relation = rel;
+       rule->relation = copyObject((RangeVar *) view);
        rule->rulename = pstrdup(rname);
        rule->whereClause = NULL;
        rule->event = CMD_SELECT;
@@ -129,7 +119,7 @@ FormViewRetrieveRule(char *viewName, Query *viewParse)
 }
 
 static void
-DefineViewRules(char *viewName, Query *viewParse)
+DefineViewRules(const RangeVar *view, Query *viewParse)
 {
        RuleStmt   *retrieve_rule;
 
@@ -139,13 +129,13 @@ DefineViewRules(char *viewName, Query *viewParse)
        RuleStmt   *delete_rule;
 #endif
 
-       retrieve_rule = FormViewRetrieveRule(viewName, viewParse);
+       retrieve_rule = FormViewRetrieveRule(view, viewParse);
 
 #ifdef NOTYET
 
-       replace_rule = FormViewReplaceRule(viewName, viewParse);
-       append_rule = FormViewAppendRule(viewName, viewParse);
-       delete_rule = FormViewDeleteRule(viewName, viewParse);
+       replace_rule = FormViewReplaceRule(view, viewParse);
+       append_rule = FormViewAppendRule(view, viewParse);
+       delete_rule = FormViewDeleteRule(view, viewParse);
 #endif
 
        DefineQueryRewrite(retrieve_rule);
@@ -231,7 +221,7 @@ UpdateRangeTableOfViewParse(Oid viewOid, Query *viewParse)
  *-------------------------------------------------------------------
  */
 void
-DefineView(char *viewName, Query *viewParse)
+DefineView(const RangeVar *view, Query *viewParse)
 {
        Oid                     viewOid;
 
@@ -240,7 +230,7 @@ DefineView(char *viewName, Query *viewParse)
         *
         * NOTE: if it already exists, the xact will be aborted.
         */
-       viewOid = DefineVirtualRelation(viewName, viewParse->targetList);
+       viewOid = DefineVirtualRelation(view, viewParse->targetList);
 
        /*
         * The relation we have just created is not visible to any other
@@ -258,7 +248,7 @@ DefineView(char *viewName, Query *viewParse)
        /*
         * Now create the rules associated with the view.
         */
-       DefineViewRules(viewName, viewParse);
+       DefineViewRules(view, viewParse);
 }
 
 /*------------------------------------------------------------------
@@ -268,11 +258,14 @@ DefineView(char *viewName, Query *viewParse)
  *------------------------------------------------------------------
  */
 void
-RemoveView(char *viewName)
+RemoveView(const RangeVar *view)
 {
+       Oid                     viewOid;
+
+       viewOid = RangeVarGetRelid(view, false);
        /*
         * We just have to drop the relation; the associated rules will be
         * cleaned up automatically.
         */
-       heap_drop_with_catalog(viewName, allowSystemTableMods);
+       heap_drop_with_catalog(viewOid, allowSystemTableMods);
 }
index 2c1e5b675f9daff7403ac49d2010212f6df77c22..055e3c371e23e8c46d66fba52e44a4db186d1f10 100644 (file)
@@ -15,7 +15,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.173 2002/03/22 02:56:31 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.174 2002/03/29 19:06:08 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1637,10 +1637,11 @@ _copyTypeName(TypeName *from)
 {
        TypeName   *newnode = makeNode(TypeName);
 
-       if (from->name)
-               newnode->name = pstrdup(from->name);
+       Node_Copy(from, newnode, names);
+       newnode->typeid = from->typeid;
        newnode->timezone = from->timezone;
        newnode->setof = from->setof;
+       newnode->pct_type = from->pct_type;
        newnode->typmod = from->typmod;
        Node_Copy(from, newnode, arrayBounds);
 
@@ -2008,7 +2009,7 @@ _copyDefineStmt(DefineStmt *from)
        DefineStmt *newnode = makeNode(DefineStmt);
 
        newnode->defType = from->defType;
-       newnode->defname = pstrdup(from->defname);
+       Node_Copy(from, newnode, defnames);
        Node_Copy(from, newnode, definition);
 
        return newnode;
@@ -2089,7 +2090,7 @@ _copyProcedureStmt(ProcedureStmt *from)
        ProcedureStmt *newnode = makeNode(ProcedureStmt);
 
        newnode->replace = from->replace;
-       newnode->funcname = pstrdup(from->funcname);
+       Node_Copy(from, newnode, funcname);
        Node_Copy(from, newnode, argTypes);
        Node_Copy(from, newnode, returnType);
        Node_Copy(from, newnode, withClause);
@@ -2229,8 +2230,7 @@ _copyCreateDomainStmt(CreateDomainStmt *from)
 {
        CreateDomainStmt *newnode = makeNode(CreateDomainStmt);
 
-       if (from->domainname)
-               newnode->domainname = pstrdup(from->domainname);
+       Node_Copy(from, newnode, domainname);
        Node_Copy(from, newnode, typename);
        Node_Copy(from, newnode, constraints);
 
index 6adc87c404018ff00c4ae7baec13107213dbb36e..fee607419a5351a98fe81a207cba2ad168ec3f50 100644 (file)
@@ -20,7 +20,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.121 2002/03/22 02:56:31 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.122 2002/03/29 19:06:08 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -836,7 +836,7 @@ _equalDefineStmt(DefineStmt *a, DefineStmt *b)
 {
        if (a->defType != b->defType)
                return false;
-       if (!equalstr(a->defname, b->defname))
+       if (!equal(a->defnames, b->defnames))
                return false;
        if (!equal(a->definition, b->definition))
                return false;
@@ -928,7 +928,7 @@ _equalProcedureStmt(ProcedureStmt *a, ProcedureStmt *b)
 {
        if (a->replace != b->replace)
                return false;
-       if (!equalstr(a->funcname, b->funcname))
+       if (!equal(a->funcname, b->funcname))
                return false;
        if (!equal(a->argTypes, b->argTypes))
                return false;
@@ -1071,7 +1071,7 @@ _equalLoadStmt(LoadStmt *a, LoadStmt *b)
 static bool
 _equalCreateDomainStmt(CreateDomainStmt *a, CreateDomainStmt *b)
 {
-       if (!equalstr(a->domainname, b->domainname))
+       if (!equal(a->domainname, b->domainname))
                return false;
        if (!equal(a->typename, b->typename))
                return false;
@@ -1572,12 +1572,16 @@ _equalRangeSubselect(RangeSubselect *a, RangeSubselect *b)
 static bool
 _equalTypeName(TypeName *a, TypeName *b)
 {
-       if (!equalstr(a->name, b->name))
+       if (!equal(a->names, b->names))
+               return false;
+       if (a->typeid != b->typeid)
                return false;
        if (a->timezone != b->timezone)
                return false;
        if (a->setof != b->setof)
                return false;
+       if (a->pct_type != b->pct_type)
+               return false;
        if (a->typmod != b->typmod)
                return false;
        if (!equal(a->arrayBounds, b->arrayBounds))
index 649fb38c111f940605095bccc3b2ab974db6bc4f..6d649ba9d1f1c5835f247ec7a35b6b45f6911ae3 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/nodes/makefuncs.c,v 1.29 2002/03/22 02:56:32 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/nodes/makefuncs.c,v 1.30 2002/03/29 19:06:09 tgl Exp $
  */
 #include "postgres.h"
 
@@ -209,3 +209,17 @@ makeRangeVar(char *schemaname, char *relname)
 
        return r;
 }
+
+/*
+ * makeTypeName -
+ *     build a TypeName node for an unqualified name.
+ */
+TypeName *
+makeTypeName(char *typnam)
+{
+       TypeName   *n = makeNode(TypeName);
+
+       n->names = makeList1(makeString(typnam));
+       n->typmod = -1;
+       return n;
+}
index 195db0165dbb8aea12d0557ca6dc4c339bee85e6..20d25c6439785068389070b7128b2d689f8e61a9 100644 (file)
@@ -5,7 +5,7 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- *     $Header: /cvsroot/pgsql/src/backend/nodes/outfuncs.c,v 1.151 2002/03/22 02:56:32 tgl Exp $
+ *     $Header: /cvsroot/pgsql/src/backend/nodes/outfuncs.c,v 1.152 2002/03/29 19:06:09 tgl Exp $
  *
  * NOTES
  *       Every (plan) node in POSTGRES has an associated "out" routine which
@@ -187,11 +187,14 @@ _outColumnDef(StringInfo str, ColumnDef *node)
 static void
 _outTypeName(StringInfo str, TypeName *node)
 {
-       appendStringInfo(str, " TYPENAME :name ");
-       _outToken(str, node->name);
-       appendStringInfo(str, " :timezone %s :setof %s typmod %d :arrayBounds ",
+       appendStringInfo(str, " TYPENAME :names ");
+       _outNode(str, node->names);
+       appendStringInfo(str, " :typeid %u :timezone %s :setof %s"
+                                        " :pct_type %s typmod %d :arrayBounds ",
+                                        node->typeid,
                                         booltostr(node->timezone),
                                         booltostr(node->setof),
+                                        booltostr(node->pct_type),
                                         node->typmod);
        _outNode(str, node->arrayBounds);
 }
index 270637d451ac71ef1d4695cad30d95e94abd1dcf..d02b0bf58ed3ed1835bd7c6cd842756bc2ab7992 100644 (file)
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- *     $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.223 2002/03/26 19:15:56 tgl Exp $
+ *     $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.224 2002/03/29 19:06:10 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -108,11 +108,7 @@ static void transformIndexConstraints(ParseState *pstate,
                                                  CreateStmtContext *cxt);
 static void transformFKConstraints(ParseState *pstate,
                                           CreateStmtContext *cxt);
-static Node *transformTypeRefs(ParseState *pstate, Node *stmt);
-
 static void applyColumnNames(List *dst, List *src);
-static void transformTypeRefsList(ParseState *pstate, List *l);
-static void transformTypeRef(ParseState *pstate, TypeName *tn);
 static List *getSetColTypes(ParseState *pstate, Node *node);
 static void transformForUpdate(Query *qry, List *forUpdate);
 static void transformConstraintAttrs(List *constraintList);
@@ -309,18 +305,6 @@ transformStmt(ParseState *pstate, Node *parseTree,
                                                                                           (SelectStmt *) parseTree);
                        break;
 
-                       /*
-                        * Convert use of %TYPE in statements where it is permitted.
-                        */
-               case T_ProcedureStmt:
-               case T_CommentStmt:
-               case T_RemoveFuncStmt:
-               case T_DefineStmt:
-                       result = makeNode(Query);
-                       result->commandType = CMD_UTILITY;
-                       result->utilityStmt = transformTypeRefs(pstate, parseTree);
-                       break;
-
                default:
 
                        /*
@@ -792,17 +776,24 @@ transformColumnDefinition(ParseState *pstate, CreateStmtContext *cxt,
 
        /* Check for SERIAL pseudo-types */
        is_serial = false;
-       if (strcmp(column->typename->name, "serial") == 0 ||
-               strcmp(column->typename->name, "serial4") == 0)
-       {
-               is_serial = true;
-               column->typename->name = pstrdup("int4");
-       }
-       else if (strcmp(column->typename->name, "bigserial") == 0 ||
-                        strcmp(column->typename->name, "serial8") == 0)
+       if (length(column->typename->names) == 1)
        {
-               is_serial = true;
-               column->typename->name = pstrdup("int8");
+               char       *typname = strVal(lfirst(column->typename->names));
+
+               if (strcmp(typname, "serial") == 0 ||
+                       strcmp(typname, "serial4") == 0)
+               {
+                       is_serial = true;
+                       column->typename->names = NIL;
+                       column->typename->typeid = INT4OID;
+               }
+               else if (strcmp(typname, "bigserial") == 0 ||
+                                strcmp(typname, "serial8") == 0)
+               {
+                       is_serial = true;
+                       column->typename->names = NIL;
+                       column->typename->typeid = INT8OID;
+               }
        }
 
        /* Do necessary work on the column type declaration */
@@ -2634,110 +2625,6 @@ transformAlterTableStmt(ParseState *pstate, AlterTableStmt *stmt,
        return qry;
 }
 
-/*
- * Transform uses of %TYPE in a statement.
- */
-static Node *
-transformTypeRefs(ParseState *pstate, Node *stmt)
-{
-       switch (nodeTag(stmt))
-       {
-               case T_ProcedureStmt:
-                       {
-                               ProcedureStmt *ps = (ProcedureStmt *) stmt;
-
-                               transformTypeRefsList(pstate, ps->argTypes);
-                               transformTypeRef(pstate, (TypeName *) ps->returnType);
-                               transformTypeRefsList(pstate, ps->withClause);
-                       }
-                       break;
-
-               case T_CommentStmt:
-                       {
-                               CommentStmt *cs = (CommentStmt *) stmt;
-
-                               transformTypeRefsList(pstate, cs->objlist);
-                       }
-                       break;
-
-               case T_RemoveFuncStmt:
-                       {
-                               RemoveFuncStmt *rs = (RemoveFuncStmt *) stmt;
-
-                               transformTypeRefsList(pstate, rs->args);
-                       }
-                       break;
-
-               case T_DefineStmt:
-                       {
-                               DefineStmt *ds = (DefineStmt *) stmt;
-                               List       *ele;
-
-                               foreach(ele, ds->definition)
-                               {
-                                       DefElem    *de = (DefElem *) lfirst(ele);
-
-                                       if (de->arg != NULL
-                                               && IsA(de->arg, TypeName))
-                                               transformTypeRef(pstate, (TypeName *) de->arg);
-                               }
-                       }
-                       break;
-
-               default:
-                       elog(ERROR, "Unsupported type %d in transformTypeRefs",
-                                nodeTag(stmt));
-                       break;
-       }
-
-       return stmt;
-}
-
-/*
- * Transform uses of %TYPE in a list.
- */
-static void
-transformTypeRefsList(ParseState *pstate, List *l)
-{
-       List       *ele;
-
-       foreach(ele, l)
-       {
-               Node       *elem = lfirst(ele);
-
-               if (elem && IsA(elem, TypeName))
-                       transformTypeRef(pstate, (TypeName *) elem);
-       }
-}
-
-/*
- * Transform a TypeName to not use %TYPE.
- */
-static void
-transformTypeRef(ParseState *pstate, TypeName *tn)
-{
-       ColumnRef  *cref;
-       Node       *n;
-       Var                *v;
-       char       *tyn;
-
-       if (tn->attrname == NULL)
-               return;
-       /* XXX this needs work; can't type name be qualified? */
-       cref = makeNode(ColumnRef);
-       cref->fields = makeList2(makeString(tn->name), makeString(tn->attrname));
-       cref->indirection = NIL;
-       n = transformExpr(pstate, (Node *) cref);
-       if (!IsA(n, Var))
-               elog(ERROR, "unsupported expression in %%TYPE");
-       v = (Var *) n;
-       tyn = typeidTypeName(v->vartype);
-       elog(NOTICE, "%s.%s%%TYPE converted to %s", tn->name, tn->attrname, tyn);
-       tn->name = tyn;
-       tn->typmod = v->vartypmod;
-       tn->attrname = NULL;
-}
-
 /* exported so planner can check again after rewriting, query pullup, etc */
 void
 CheckSelectForUpdate(Query *qry)
@@ -3059,15 +2946,7 @@ transformFkeyGetColType(CreateStmtContext *cxt, char *colname)
                ColumnDef  *col = lfirst(cols);
 
                if (strcmp(col->colname, colname) == 0)
-               {
-                       char       *buff = TypeNameToInternalName(col->typename);
-
-                       result = typenameTypeId(buff);
-                       if (!OidIsValid(result))
-                               elog(ERROR, "Unable to lookup type %s",
-                                        col->typename->name);
-                       return result;
-               }
+                       return typenameTypeId(col->typename);
        }
        /* Perhaps it's a system column name */
        sysatt = SystemAttributeByName(colname, cxt->hasoids);
@@ -3092,7 +2971,6 @@ transformFkeyGetColType(CreateStmtContext *cxt, char *colname)
                        if (strcmp(name, colname) == 0)
                        {
                                result = rel->rd_att->attrs[count]->atttypid;
-
                                heap_close(rel, NoLock);
                                return result;
                        }
@@ -3111,7 +2989,6 @@ transformFkeyGetColType(CreateStmtContext *cxt, char *colname)
                if (HeapTupleIsValid(atttuple))
                {
                        result = ((Form_pg_attribute) GETSTRUCT(atttuple))->atttypid;
-
                        ReleaseSysCache(atttuple);
                        return result;
                }
@@ -3233,7 +3110,7 @@ static void
 transformColumnType(ParseState *pstate, ColumnDef *column)
 {
        TypeName   *typename = column->typename;
-       Type            ctype = typenameType(typename->name);
+       Type            ctype = typenameType(typename);
 
        /*
         * Is this the name of a complex type? If so, implement it as a set.
index fa6bf35fb9723d6a0a3b8a69503f75f6c482d373..4ebddde891bb9e920df30bcabf6191f838d6b278 100644 (file)
@@ -11,7 +11,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.296 2002/03/22 02:56:33 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.297 2002/03/29 19:06:10 tgl Exp $
  *
  * HISTORY
  *       AUTHOR                        DATE                    MAJOR EVENT
@@ -53,6 +53,7 @@
 #include "access/htup.h"
 #include "catalog/index.h"
 #include "catalog/pg_type.h"
+#include "nodes/makefuncs.h"
 #include "nodes/params.h"
 #include "nodes/parsenodes.h"
 #include "parser/gramparse.h"
@@ -122,8 +123,6 @@ static void doNegateFloat(Value *v);
        ResTarget                       *target;
        PrivTarget                      *privtarget;
 
-       DefineStmt                      *dstmt;
-       RuleStmt                        *rstmt;
        InsertStmt                      *istmt;
 }
 
@@ -175,7 +174,8 @@ static void doNegateFloat(Value *v);
 
 %type <str>            relation_name, copy_file_name, copy_delimiter, copy_null,
                database_name, access_method_clause, access_method, attr_name,
-               class, index_name, name, func_name, file_name
+               class, index_name, name, function_name, file_name,
+               func_name, handler_name
 
 %type <range>  qualified_name, OptConstrFromTable
 
@@ -200,8 +200,8 @@ static void doNegateFloat(Value *v);
                opt_column_list, columnList, opt_name_list,
                sort_clause, sortby_list, index_params, index_list, name_list,
                from_clause, from_list, opt_array_bounds, qualified_name_list,
-               expr_list, attrs, opt_attrs, target_list, update_target_list,
-               insert_column_list,
+               any_name, any_name_list, expr_list, dotted_name, attrs,
+               target_list, update_target_list, insert_column_list,
                def_list, opt_indirection, group_clause, TriggerFuncArgs,
                select_limit, opt_select_limit
 
@@ -411,10 +411,10 @@ static void doNegateFloat(Value *v);
 /* Unary Operators */
 %left          AT ZONE                 /* sets precedence for AT TIME ZONE */
 %right         UMINUS
-%left          '.'
 %left          '[' ']'
 %left          '(' ')'
 %left          TYPECAST
+%left          '.'
 %%
 
 /*
@@ -1812,7 +1812,7 @@ IntegerOnly:  Iconst
  *****************************************************************************/
 
 CreatePLangStmt:  CREATE opt_trusted opt_procedural LANGUAGE ColId_or_Sconst
-                       HANDLER func_name opt_lancompiler
+                       HANDLER handler_name opt_lancompiler
                        {
                                CreatePLangStmt *n = makeNode(CreatePLangStmt);
                                n->plname = $5;
@@ -1827,6 +1827,16 @@ opt_trusted:  TRUSTED                    { $$ = TRUE; }
                        | /*EMPTY*/                     { $$ = FALSE; }
                ;
 
+/* This ought to be just func_name, but that causes reduce/reduce conflicts
+ * (CREATE LANGUAGE is the only place where func_name isn't followed by '(').
+ * Work around by using name and dotted_name separately.
+ */
+handler_name: name
+                               { $$ = $1; }
+                       | dotted_name
+                               { $$ = strVal(lfirst($1)); /* XXX changing soon */ }
+               ;
+
 opt_lancompiler: LANCOMPILER Sconst { $$ = $2; }
                        | /*EMPTY*/                     { $$ = ""; }
                ;
@@ -1853,7 +1863,7 @@ opt_procedural: PROCEDURAL                { $$ = TRUE; }
 
 CreateTrigStmt:  CREATE TRIGGER name TriggerActionTime TriggerEvents ON
                                qualified_name TriggerForSpec EXECUTE PROCEDURE
-                               name '(' TriggerFuncArgs ')'
+                               func_name '(' TriggerFuncArgs ')'
                                {
                                        CreateTrigStmt *n = makeNode(CreateTrigStmt);
                                        n->trigname = $3;
@@ -1877,7 +1887,8 @@ CreateTrigStmt:  CREATE TRIGGER name TriggerActionTime TriggerEvents ON
                | CREATE CONSTRAINT TRIGGER name AFTER TriggerEvents ON
                                qualified_name OptConstrFromTable 
                                ConstraintAttributeSpec
-                               FOR EACH ROW EXECUTE PROCEDURE name '(' TriggerFuncArgs ')'
+                               FOR EACH ROW EXECUTE PROCEDURE
+                               func_name '(' TriggerFuncArgs ')'
                                {
                                        CreateTrigStmt *n = makeNode(CreateTrigStmt);
                                        n->trigname = $4;
@@ -2043,7 +2054,7 @@ DefineStmt:  CREATE AGGREGATE func_name definition
                                {
                                        DefineStmt *n = makeNode(DefineStmt);
                                        n->defType = AGGREGATE;
-                                       n->defname = $3;
+                                       n->defnames = makeList1(makeString($3)); /* XXX */
                                        n->definition = $4;
                                        $$ = (Node *)n;
                                }
@@ -2051,15 +2062,15 @@ DefineStmt:  CREATE AGGREGATE func_name definition
                                {
                                        DefineStmt *n = makeNode(DefineStmt);
                                        n->defType = OPERATOR;
-                                       n->defname = $3;
+                                       n->defnames = makeList1(makeString($3)); /* XXX */
                                        n->definition = $4;
                                        $$ = (Node *)n;
                                }
-               | CREATE TYPE_P name definition
+               | CREATE TYPE_P any_name definition
                                {
                                        DefineStmt *n = makeNode(DefineStmt);
                                        n->defType = TYPE_P;
-                                       n->defname = $3;
+                                       n->defnames = $3;
                                        n->definition = $4;
                                        $$ = (Node *)n;
                                }
@@ -2102,10 +2113,7 @@ def_arg:  func_return                                    {  $$ = (Node *)$1; }
  *
  *****************************************************************************/
 
-/* DropStmt needs to use qualified_name_list as many of the objects
- * are relations or other schema objects (names can be schema-qualified) */
-DropStmt:  DROP drop_type qualified_name_list opt_drop_behavior
+DropStmt:  DROP drop_type any_name_list opt_drop_behavior
                                {
                                        DropStmt *n = makeNode(DropStmt);
                                        n->removeType = $2;
@@ -2124,6 +2132,18 @@ drop_type: TABLE                                                         { $$ = DROP_TABLE; }
                | DOMAIN_P                                                              { $$ = DROP_DOMAIN; }
                ;
 
+any_name_list:  any_name
+                       { $$ = makeList1($1); }
+               | any_name_list ',' any_name
+                       { $$ = lappend($1, $3); }
+               ;
+
+any_name: ColId
+                       { $$ = makeList1(makeString($1)); }
+               | dotted_name
+                       { $$ = $1; }
+               ;
+
 /*****************************************************************************
  *
  *             QUERY:
@@ -2192,7 +2212,7 @@ CommentStmt:      COMMENT ON comment_type name IS comment_text
                                n->comment = $10;
                                $$ = (Node *) n;
                        }
-               | COMMENT ON AGGREGATE name '(' aggr_argtype ')' IS comment_text
+               | COMMENT ON AGGREGATE func_name '(' aggr_argtype ')' IS comment_text
                        {
                                CommentStmt *n = makeNode(CommentStmt);
                                n->objtype = AGGREGATE;
@@ -2203,18 +2223,6 @@ CommentStmt:     COMMENT ON comment_type name IS comment_text
                                n->comment = $9;
                                $$ = (Node *) n;
                        }
-               | COMMENT ON AGGREGATE name aggr_argtype IS comment_text
-                       {
-                               /* Obsolete syntax, but must support for awhile */
-                               CommentStmt *n = makeNode(CommentStmt);
-                               n->objtype = AGGREGATE;
-                               n->objschema = NULL;
-                               n->objname = $4;
-                               n->objproperty = NULL;
-                               n->objlist = makeList1($5);
-                               n->comment = $7;
-                               $$ = (Node *) n;
-                       }
                | COMMENT ON FUNCTION func_name func_args IS comment_text
                        {
                                CommentStmt *n = makeNode(CommentStmt);
@@ -2691,9 +2699,9 @@ ProcedureStmt:    CREATE opt_or_replace FUNCTION func_name func_args
                                {
                                        ProcedureStmt *n = makeNode(ProcedureStmt);
                                        n->replace = $2;
-                                       n->funcname = $4;
+                                       n->funcname = makeList1(makeString($4)); /* XXX */
                                        n->argTypes = $5;
-                                       n->returnType = (Node *) $7;
+                                       n->returnType = $7;
                                        n->withClause = $12;
                                        n->as = $9;
                                        n->language = $11;
@@ -2765,19 +2773,19 @@ func_return:  func_type
                ;
 
 /*
- * We would like to make the second production here be ColId '.' ColId etc,
+ * We would like to make the second production here be ColId attrs etc,
  * but that causes reduce/reduce conflicts.  type_name is next best choice.
  */
 func_type:     Typename
                                {
                                        $$ = $1;
                                }
-               | type_name '.' ColId '%' TYPE_P
+               | type_name attrs '%' TYPE_P
                                {
                                        $$ = makeNode(TypeName);
-                                       $$->name = $1;
+                                       $$->names = lcons(makeString($1), $2);
+                                       $$->pct_type = true;
                                        $$->typmod = -1;
-                                       $$->attrname = $3;
                                }
                ;
 
@@ -2804,15 +2812,7 @@ RemoveAggrStmt:  DROP AGGREGATE func_name '(' aggr_argtype ')'
                                {
                                                RemoveAggrStmt *n = makeNode(RemoveAggrStmt);
                                                n->aggname = $3;
-                                               n->aggtype = (Node *) $5;
-                                               $$ = (Node *)n;
-                               }
-               | DROP AGGREGATE func_name aggr_argtype
-                               {
-                                               /* Obsolete syntax, but must support for awhile */
-                                               RemoveAggrStmt *n = makeNode(RemoveAggrStmt);
-                                               n->aggname = $3;
-                                               n->aggtype = (Node *) $4;
+                                               n->aggtype = $5;
                                                $$ = (Node *)n;
                                }
                ;
@@ -3293,7 +3293,7 @@ DropdbStmt:       DROP DATABASE database_name
  *
  *****************************************************************************/
 
-CreateDomainStmt:  CREATE DOMAIN_P name opt_as Typename ColQualList opt_collate
+CreateDomainStmt:  CREATE DOMAIN_P any_name opt_as Typename ColQualList opt_collate
                                {
                                        CreateDomainStmt *n = makeNode(CreateDomainStmt);
                                        n->domainname = $3;
@@ -4237,6 +4237,14 @@ opt_array_bounds:        opt_array_bounds '[' ']'
                                {  $$ = NIL; }
                ;
 
+/*
+ * XXX ideally, the production for a qualified typename should be ColId attrs
+ * (there's no obvious reason why the first name should need to be restricted)
+ * and should be an alternative of GenericType (so that it can be used to
+ * specify a type for a literal in AExprConst).  However doing either causes
+ * reduce/reduce conflicts that I haven't been able to find a workaround
+ * for.  FIXME later.
+ */
 SimpleTypename:  ConstTypename
                | ConstInterval opt_interval
                                {
@@ -4249,6 +4257,12 @@ SimpleTypename:  ConstTypename
                                        $$ = $1;
                                        $$->typmod = ((($5 & 0x7FFF) << 16) | $3);
                                }
+               | type_name attrs
+                               {
+                                       $$ = makeNode(TypeName);
+                                       $$->names = lcons(makeString($1), $2);
+                                       $$->typmod = -1;
+                               }
                ;
 
 ConstTypename:  GenericType
@@ -4260,9 +4274,7 @@ ConstTypename:  GenericType
 
 GenericType:  type_name
                                {
-                                       $$ = makeNode(TypeName);
-                                       $$->name = xlateSqlType($1);
-                                       $$->typmod = -1;
+                                       $$ = makeTypeName(xlateSqlType($1));
                                }
                ;
 
@@ -4273,32 +4285,25 @@ GenericType:  type_name
  */
 Numeric:  FLOAT opt_float
                                {
-                                       $$ = makeNode(TypeName);
-                                       $$->name = $2; /* already xlated */
-                                       $$->typmod = -1;
+                                       $$ = makeTypeName($2); /* already xlated */
                                }
                | DOUBLE PRECISION
                                {
-                                       $$ = makeNode(TypeName);
-                                       $$->name = xlateSqlType("float8");
-                                       $$->typmod = -1;
+                                       $$ = makeTypeName(xlateSqlType("float8"));
                                }
                | DECIMAL opt_decimal
                                {
-                                       $$ = makeNode(TypeName);
-                                       $$->name = xlateSqlType("decimal");
+                                       $$ = makeTypeName(xlateSqlType("decimal"));
                                        $$->typmod = $2;
                                }
                | DEC opt_decimal
                                {
-                                       $$ = makeNode(TypeName);
-                                       $$->name = xlateSqlType("decimal");
+                                       $$ = makeTypeName(xlateSqlType("decimal"));
                                        $$->typmod = $2;
                                }
                | NUMERIC opt_numeric
                                {
-                                       $$ = makeNode(TypeName);
-                                       $$->name = xlateSqlType("numeric");
+                                       $$ = makeTypeName(xlateSqlType("numeric"));
                                        $$->typmod = $2;
                                }
                ;
@@ -4379,8 +4384,7 @@ opt_decimal:  '(' Iconst ',' Iconst ')'
  */
 Bit:  bit '(' Iconst ')'
                                {
-                                       $$ = makeNode(TypeName);
-                                       $$->name = $1;
+                                       $$ = makeTypeName($1);
                                        if ($3 < 1)
                                                elog(ERROR,"length for type '%s' must be at least 1",
                                                         $1);
@@ -4391,8 +4395,7 @@ Bit:  bit '(' Iconst ')'
                                }
                | bit
                                {
-                                       $$ = makeNode(TypeName);
-                                       $$->name = $1;
+                                       $$ = makeTypeName($1);
                                        /* bit defaults to bit(1), varbit to no limit */
                                        if (strcmp($1, "bit") == 0)
                                                $$->typmod = 1;
@@ -4418,8 +4421,19 @@ bit:  BIT opt_varying
  */
 Character:  character '(' Iconst ')' opt_charset
                                {
-                                       $$ = makeNode(TypeName);
-                                       $$->name = $1;
+                                       if (($5 != NULL) && (strcmp($5, "sql_text") != 0))
+                                       {
+                                               char *type;
+
+                                               type = palloc(strlen($1) + 1 + strlen($5) + 1);
+                                               strcpy(type, $1);
+                                               strcat(type, "_");
+                                               strcat(type, $5);
+                                               $1 = xlateSqlType(type);
+                                       }
+
+                                       $$ = makeTypeName($1);
+
                                        if ($3 < 1)
                                                elog(ERROR,"length for type '%s' must be at least 1",
                                                         $1);
@@ -4433,36 +4447,27 @@ Character:  character '(' Iconst ')' opt_charset
                                         * truncate where necessary)
                                         */
                                        $$->typmod = VARHDRSZ + $3;
-
-                                       if (($5 != NULL) && (strcmp($5, "sql_text") != 0)) {
-                                               char *type;
-
-                                               type = palloc(strlen($$->name) + 1 + strlen($5) + 1);
-                                               strcpy(type, $$->name);
-                                               strcat(type, "_");
-                                               strcat(type, $5);
-                                               $$->name = xlateSqlType(type);
-                                       };
                                }
                | character opt_charset
                                {
-                                       $$ = makeNode(TypeName);
-                                       $$->name = $1;
+                                       if (($2 != NULL) && (strcmp($2, "sql_text") != 0))
+                                       {
+                                               char *type;
+
+                                               type = palloc(strlen($1) + 1 + strlen($2) + 1);
+                                               strcpy(type, $1);
+                                               strcat(type, "_");
+                                               strcat(type, $2);
+                                               $1 = xlateSqlType(type);
+                                       }
+
+                                       $$ = makeTypeName($1);
+
                                        /* char defaults to char(1), varchar to no limit */
                                        if (strcmp($1, "bpchar") == 0)
                                                $$->typmod = VARHDRSZ + 1;
                                        else
                                                $$->typmod = -1;
-
-                                       if (($2 != NULL) && (strcmp($2, "sql_text") != 0)) {
-                                               char *type;
-
-                                               type = palloc(strlen($$->name) + 1 + strlen($2) + 1);
-                                               strcpy(type, $$->name);
-                                               strcat(type, "_");
-                                               strcat(type, $2);
-                                               $$->name = xlateSqlType(type);
-                                       };
                                }
                ;
 
@@ -4488,11 +4493,10 @@ opt_collate:  COLLATE ColId                                             { $$ = $2; }
 
 ConstDatetime:  TIMESTAMP '(' Iconst ')' opt_timezone_x
                                {
-                                       $$ = makeNode(TypeName);
                                        if ($5)
-                                               $$->name = xlateSqlType("timestamptz");
+                                               $$ = makeTypeName(xlateSqlType("timestamptz"));
                                        else
-                                               $$->name = xlateSqlType("timestamp");
+                                               $$ = makeTypeName(xlateSqlType("timestamp"));
                                        /* XXX the timezone field seems to be unused
                                         * - thomas 2001-09-06
                                         */
@@ -4504,11 +4508,10 @@ ConstDatetime:  TIMESTAMP '(' Iconst ')' opt_timezone_x
                                }
                | TIMESTAMP opt_timezone_x
                                {
-                                       $$ = makeNode(TypeName);
                                        if ($2)
-                                               $$->name = xlateSqlType("timestamptz");
+                                               $$ = makeTypeName(xlateSqlType("timestamptz"));
                                        else
-                                               $$->name = xlateSqlType("timestamp");
+                                               $$ = makeTypeName(xlateSqlType("timestamp"));
                                        /* XXX the timezone field seems to be unused
                                         * - thomas 2001-09-06
                                         */
@@ -4524,11 +4527,10 @@ ConstDatetime:  TIMESTAMP '(' Iconst ')' opt_timezone_x
                                }
                | TIME '(' Iconst ')' opt_timezone
                                {
-                                       $$ = makeNode(TypeName);
                                        if ($5)
-                                               $$->name = xlateSqlType("timetz");
+                                               $$ = makeTypeName(xlateSqlType("timetz"));
                                        else
-                                               $$->name = xlateSqlType("time");
+                                               $$ = makeTypeName(xlateSqlType("time"));
                                        if (($3 < 0) || ($3 > 13))
                                                elog(ERROR,"TIME(%d)%s precision must be between %d and %d",
                                                         $3, ($5 ? " WITH TIME ZONE": ""), 0, 13);
@@ -4536,11 +4538,10 @@ ConstDatetime:  TIMESTAMP '(' Iconst ')' opt_timezone_x
                                }
                | TIME opt_timezone
                                {
-                                       $$ = makeNode(TypeName);
                                        if ($2)
-                                               $$->name = xlateSqlType("timetz");
+                                               $$ = makeTypeName(xlateSqlType("timetz"));
                                        else
-                                               $$->name = xlateSqlType("time");
+                                               $$ = makeTypeName(xlateSqlType("time"));
                                        /* SQL99 specified a default precision of zero.
                                         * See comments for timestamp above on why we will
                                         * leave this unspecified for now. - thomas 2001-12-07
@@ -4551,9 +4552,7 @@ ConstDatetime:  TIMESTAMP '(' Iconst ')' opt_timezone_x
 
 ConstInterval:  INTERVAL
                                {
-                                       $$ = makeNode(TypeName);
-                                       $$->name = xlateSqlType("interval");
-                                       $$->typmod = -1;
+                                       $$ = makeTypeName(xlateSqlType("interval"));
                                }
                ;
 
@@ -5161,7 +5160,7 @@ c_expr:  columnref
                | CURRENT_DATE opt_empty_parentheses
                                {
                                        /*
-                                        * Translate as "date('now'::text)".
+                                        * Translate as "'now'::text::date".
                                         *
                                         * We cannot use "'now'::date" because coerce_type() will
                                         * immediately reduce that to a constant representing
@@ -5174,43 +5173,30 @@ c_expr:  columnref
                                         * of type-input conversion functions...
                                         */
                                        A_Const *s = makeNode(A_Const);
-                                       TypeName *t = makeNode(TypeName);
-                                       TypeName *d = makeNode(TypeName);
+                                       TypeName *d;
 
                                        s->val.type = T_String;
                                        s->val.val.str = "now";
-                                       s->typename = t;
+                                       s->typename = makeTypeName(xlateSqlType("text"));
 
-                                       t->name = xlateSqlType("text");
-                                       t->setof = FALSE;
-                                       t->typmod = -1;
-
-                                       d->name = xlateSqlType("date");
-                                       d->setof = FALSE;
-                                       d->typmod = -1;
+                                       d = makeTypeName(xlateSqlType("date"));
 
                                        $$ = (Node *)makeTypeCast((Node *)s, d);
                                }
                | CURRENT_TIME opt_empty_parentheses
                                {
                                        /*
-                                        * Translate as "timetz('now'::text)".
+                                        * Translate as "'now'::text::timetz".
                                         * See comments for CURRENT_DATE.
                                         */
                                        A_Const *s = makeNode(A_Const);
-                                       TypeName *t = makeNode(TypeName);
-                                       TypeName *d = makeNode(TypeName);
+                                       TypeName *d;
 
                                        s->val.type = T_String;
                                        s->val.val.str = "now";
-                                       s->typename = t;
-
-                                       t->name = xlateSqlType("text");
-                                       t->setof = FALSE;
-                                       t->typmod = -1;
+                                       s->typename = makeTypeName(xlateSqlType("text"));
 
-                                       d->name = xlateSqlType("timetz");
-                                       d->setof = FALSE;
+                                       d = makeTypeName(xlateSqlType("timetz"));
                                        /* SQL99 mandates a default precision of zero for TIME
                                         * fields in schemas. However, for CURRENT_TIME
                                         * let's preserve the microsecond precision we
@@ -5223,23 +5209,17 @@ c_expr:  columnref
                | CURRENT_TIME '(' Iconst ')'
                                {
                                        /*
-                                        * Translate as "timetz('now'::text)".
+                                        * Translate as "'now'::text::timetz(n)".
                                         * See comments for CURRENT_DATE.
                                         */
                                        A_Const *s = makeNode(A_Const);
-                                       TypeName *t = makeNode(TypeName);
-                                       TypeName *d = makeNode(TypeName);
+                                       TypeName *d;
 
                                        s->val.type = T_String;
                                        s->val.val.str = "now";
-                                       s->typename = t;
+                                       s->typename = makeTypeName(xlateSqlType("text"));
 
-                                       t->name = xlateSqlType("text");
-                                       t->setof = FALSE;
-                                       t->typmod = -1;
-
-                                       d->name = xlateSqlType("timetz");
-                                       d->setof = FALSE;
+                                       d = makeTypeName(xlateSqlType("timetz"));
                                        if (($3 < 0) || ($3 > 13))
                                                elog(ERROR,"CURRENT_TIME(%d) precision must be between %d and %d",
                                                         $3, 0, 13);
@@ -5250,23 +5230,17 @@ c_expr:  columnref
                | CURRENT_TIMESTAMP opt_empty_parentheses
                                {
                                        /*
-                                        * Translate as "timestamptz('now'::text)".
+                                        * Translate as "'now'::text::timestamptz".
                                         * See comments for CURRENT_DATE.
                                         */
                                        A_Const *s = makeNode(A_Const);
-                                       TypeName *t = makeNode(TypeName);
-                                       TypeName *d = makeNode(TypeName);
+                                       TypeName *d;
 
                                        s->val.type = T_String;
                                        s->val.val.str = "now";
-                                       s->typename = t;
-
-                                       t->name = xlateSqlType("text");
-                                       t->setof = FALSE;
-                                       t->typmod = -1;
+                                       s->typename = makeTypeName(xlateSqlType("text"));
 
-                                       d->name = xlateSqlType("timestamptz");
-                                       d->setof = FALSE;
+                                       d = makeTypeName(xlateSqlType("timestamptz"));
                                        /* SQL99 mandates a default precision of 6 for timestamp.
                                         * Also, that is about as precise as we will get since
                                         * we are using a microsecond time interface.
@@ -5279,23 +5253,17 @@ c_expr:  columnref
                | CURRENT_TIMESTAMP '(' Iconst ')'
                                {
                                        /*
-                                        * Translate as "timestamptz('now'::text)".
+                                        * Translate as "'now'::text::timestamptz(n)".
                                         * See comments for CURRENT_DATE.
                                         */
                                        A_Const *s = makeNode(A_Const);
-                                       TypeName *t = makeNode(TypeName);
-                                       TypeName *d = makeNode(TypeName);
+                                       TypeName *d;
 
                                        s->val.type = T_String;
                                        s->val.val.str = "now";
-                                       s->typename = t;
-
-                                       t->name = xlateSqlType("text");
-                                       t->setof = FALSE;
-                                       t->typmod = -1;
+                                       s->typename = makeTypeName(xlateSqlType("text"));
 
-                                       d->name = xlateSqlType("timestamptz");
-                                       d->setof = FALSE;
+                                       d = makeTypeName(xlateSqlType("timestamptz"));
                                        if (($3 < 0) || ($3 > 13))
                                                elog(ERROR,"CURRENT_TIMESTAMP(%d) precision must be between %d and %d",
                                                         $3, 0, 13);
@@ -5645,24 +5613,24 @@ columnref: relation_name opt_indirection
                                        $$->fields = makeList1(makeString($1));
                                        $$->indirection = $2;
                                }
-               | relation_name attrs opt_indirection
+               | dotted_name opt_indirection
                                {
                                        $$ = makeNode(ColumnRef);
-                                       $$->fields = lcons(makeString($1), $2);
-                                       $$->indirection = $3;
+                                       $$->fields = $1;
+                                       $$->indirection = $2;
                                }
                ;
 
-attrs:   opt_attrs '.' attr_name
-                               { $$ = lappend($1, makeString($3)); }
-               | opt_attrs '.' '*'
-                               { $$ = lappend($1, makeString("*")); }
+dotted_name: relation_name attrs
+                               { $$ = lcons(makeString($1), $2); }
                ;
 
-opt_attrs: /*EMPTY*/
-                               { $$ = NIL; }
-               | opt_attrs '.' attr_name
-                               { $$ = lappend($1, makeString($3)); }
+attrs:  '.' attr_name
+                               { $$ = makeList1(makeString($2)); }
+               | '.' '*'
+                               { $$ = makeList1(makeString("*")); }
+               | '.' attr_name attrs
+                               { $$ = lcons(makeString($2), $3); }
                ;
 
 opt_empty_parentheses: '(' ')' { $$ = TRUE; }
@@ -5742,11 +5710,11 @@ relation_name:  SpecialRuleRelation
                                        $$ = $1;
                                }
                ;
-               
+
 qualified_name_list:  qualified_name
-                               {       $$ = makeList1($1); }
+                               { $$ = makeList1($1); }
                | qualified_name_list ',' qualified_name
-                               {       $$ = lappend($1, $3); }
+                               { $$ = lappend($1, $3); }
                ;
 
 qualified_name: ColId
@@ -5787,6 +5755,21 @@ class:                                   ColId                   { $$ = $1; };
 index_name:                            ColId                   { $$ = $1; };
 file_name:                             Sconst                  { $$ = $1; };
 
+/* func_name will soon return a List ... but not yet */
+/*
+func_name: function_name
+                       { $$ = makeList1(makeString($1)); }
+               | dotted_name
+                       { $$ = $1; }
+               ;
+*/
+func_name: function_name
+                       { $$ = $1; }
+               | dotted_name
+                       { $$ = strVal(lfirst($1)); }
+               ;
+
+
 /* Constants
  * Include TRUE/FALSE for SQL3 support. - thomas 1997-10-24
  */
@@ -5867,9 +5850,7 @@ AexprConst:  Iconst
                                        A_Const *n = makeNode(A_Const);
                                        n->val.type = T_String;
                                        n->val.val.str = "t";
-                                       n->typename = makeNode(TypeName);
-                                       n->typename->name = xlateSqlType("bool");
-                                       n->typename->typmod = -1;
+                                       n->typename = makeTypeName(xlateSqlType("bool"));
                                        $$ = (Node *)n;
                                }
                | FALSE_P
@@ -5877,9 +5858,7 @@ AexprConst:  Iconst
                                        A_Const *n = makeNode(A_Const);
                                        n->val.type = T_String;
                                        n->val.val.str = "f";
-                                       n->typename = makeNode(TypeName);
-                                       n->typename->name = xlateSqlType("bool");
-                                       n->typename->typmod = -1;
+                                       n->typename = makeTypeName(xlateSqlType("bool"));
                                        $$ = (Node *)n;
                                }
                | NULL_P
@@ -5920,7 +5899,7 @@ type_name:  IDENT                                         { $$ = $1; }
 
 /* Function identifier --- names that can be function names.
  */
-func_name:  IDENT                                              { $$ = xlateSqlFunc($1); }
+function_name:  IDENT                                  { $$ = xlateSqlFunc($1); }
                | unreserved_keyword                    { $$ = xlateSqlFunc($1); }
                | func_name_keyword                             { $$ = xlateSqlFunc($1); }
                ;
@@ -6304,6 +6283,7 @@ static Node *
 makeStringConst(char *str, TypeName *typename)
 {
        A_Const *n = makeNode(A_Const);
+
        n->val.type = T_String;
        n->val.val.str = str;
        n->typename = typename;
@@ -6315,12 +6295,10 @@ static Node *
 makeFloatConst(char *str)
 {
        A_Const *n = makeNode(A_Const);
-       TypeName *t = makeNode(TypeName);
+
        n->val.type = T_Float;
        n->val.val.str = str;
-       t->name = xlateSqlType("float");
-       t->typmod = -1;
-       n->typename = t;
+       n->typename = makeTypeName(xlateSqlType("float"));
 
        return (Node *)n;
 }
@@ -6435,7 +6413,6 @@ makeSetOp(SetOperation op, bool all, Node *larg, Node *rarg)
        return (Node *) n;
 }
 
-
 /* xlateSqlFunc()
  * Convert alternate function names to internal Postgres functions.
  *
index 73cd89fd3d84ae31b25bc9edaf651db6e51b1b8e..2a5a7698d858fd0c4705785a663870784b2afa6d 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.111 2002/03/21 16:01:03 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.112 2002/03/29 19:06:11 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1103,7 +1103,7 @@ parser_typecast_constant(Value *expr, TypeName *typename)
        bool            string_palloced = false;
        bool            isNull = false;
 
-       tp = typenameType(TypeNameToInternalName(typename));
+       tp = typenameType(typename);
 
        switch (nodeTag(expr))
        {
@@ -1161,7 +1161,7 @@ parser_typecast_expression(ParseState *pstate,
        Oid                     inputType = exprType(expr);
        Oid                     targetType;
 
-       targetType = typenameTypeId(TypeNameToInternalName(typename));
+       targetType = typenameTypeId(typename);
 
        if (inputType == InvalidOid)
                return expr;                    /* do nothing if NULL input */
@@ -1185,27 +1185,3 @@ parser_typecast_expression(ParseState *pstate,
 
        return expr;
 }
-
-/*
- * Given a TypeName node as returned by the grammar, generate the internal
- * name of the corresponding type.     Note this does NOT check if the type
- * exists or not.
- */
-char *
-TypeNameToInternalName(TypeName *typename)
-{
-       Assert(typename->attrname == NULL);
-       if (typename->arrayBounds != NIL)
-       {
-               /*
-                * By convention, the name of an array type is the name of its
-                * element type with "_" prepended.
-                */
-               char       *arrayname = palloc(strlen(typename->name) + 2);
-
-               sprintf(arrayname, "_%s", typename->name);
-               return arrayname;
-       }
-       else
-               return typename->name;
-}
index f02ee04b6962e542b7edcd27417b06ae6ba25356..9436bd645bd16897da0dde3a824b1439fe7f397f 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/parser/parse_func.c,v 1.120 2002/03/22 02:56:34 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/parser/parse_func.c,v 1.121 2002/03/29 19:06:11 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -20,6 +20,7 @@
 #include "catalog/indexing.h"
 #include "catalog/pg_aggregate.h"
 #include "catalog/pg_inherits.h"
+#include "catalog/pg_namespace.h"
 #include "catalog/pg_proc.h"
 #include "nodes/makefuncs.h"
 #include "parser/parse_agg.h"
@@ -969,9 +970,14 @@ func_get_detail(char *funcname,
                {
                        Oid                     targetType;
 
-                       targetType = GetSysCacheOid(TYPENAME,
+                       /* XXX WRONG: need to search searchpath for name; but little
+                        * point in fixing before we revise this code for qualified
+                        * funcnames too.
+                        */
+                       targetType = GetSysCacheOid(TYPENAMENSP,
                                                                                PointerGetDatum(funcname),
-                                                                               0, 0, 0);
+                                                                               ObjectIdGetDatum(PG_CATALOG_NAMESPACE),
+                                                                               0, 0);
                        if (OidIsValid(targetType) &&
                                !ISCOMPLEX(targetType))
                        {
@@ -1222,13 +1228,11 @@ find_inheritors(Oid relid, Oid **supervec)
                {
                        /* return the type id, rather than the relation id */
                        Relation        rd;
-                       Oid                     trelid;
 
                        relid = lfirsti(elt);
                        rd = heap_open(relid, NoLock);
-                       trelid = typenameTypeId(RelationGetRelationName(rd));
+                       *relidvec++ = rd->rd_rel->reltype;
                        heap_close(rd, NoLock);
-                       *relidvec++ = trelid;
                }
        }
        else
@@ -1473,7 +1477,9 @@ ParseComplexProjection(ParseState *pstate,
  * argument types
  */
 void
-func_error(char *caller, char *funcname, int nargs, Oid *argtypes, char *msg)
+func_error(const char *caller, const char *funcname,
+                  int nargs, const Oid *argtypes,
+                  const char *msg)
 {
        char            p[(NAMEDATALEN + 2) * FUNC_MAX_ARGS],
                           *ptr;
@@ -1488,9 +1494,9 @@ func_error(char *caller, char *funcname, int nargs, Oid *argtypes, char *msg)
                        *ptr++ = ',';
                        *ptr++ = ' ';
                }
-               if (argtypes[i] != 0)
+               if (OidIsValid(argtypes[i]))
                {
-                       strcpy(ptr, typeidTypeName(argtypes[i]));
+                       strncpy(ptr, typeidTypeName(argtypes[i]), NAMEDATALEN);
                        *(ptr + NAMEDATALEN) = '\0';
                }
                else
index cc56cb6d18373403bc545609f7930f3b606791fd..1df2d285a5b55a8b18c12fddea3cbf56bd4d40fc 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/parser/parse_target.c,v 1.79 2002/03/22 02:56:34 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/parser/parse_target.c,v 1.80 2002/03/29 19:06:12 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -525,8 +525,15 @@ FigureColnameInternal(Node *node, char **name)
                case T_A_Const:
                        if (((A_Const *) node)->typename != NULL)
                        {
-                               *name = ((A_Const *) node)->typename->name;
-                               return 1;
+                               List       *names = ((A_Const *) node)->typename->names;
+
+                               if (names != NIL)
+                               {
+                                       while (lnext(names) != NIL)
+                                               names = lnext(names);
+                                       *name = strVal(lfirst(names));
+                                       return 1;
+                               }
                        }
                        break;
                case T_TypeCast:
@@ -536,8 +543,15 @@ FigureColnameInternal(Node *node, char **name)
                        {
                                if (((TypeCast *) node)->typename != NULL)
                                {
-                                       *name = ((TypeCast *) node)->typename->name;
-                                       return 1;
+                                       List       *names = ((TypeCast *) node)->typename->names;
+
+                                       if (names != NIL)
+                                       {
+                                               while (lnext(names) != NIL)
+                                                       names = lnext(names);
+                                               *name = strVal(lfirst(names));
+                                               return 1;
+                                       }
                                }
                        }
                        break;
index 732974a96fc6dcb6a40ea6593c350d390c2afb31..22db859ed2beeab03e88e3dde383e83bd9f8d6bf 100644 (file)
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/parser/parse_type.c,v 1.37 2001/10/25 05:49:40 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/parser/parse_type.c,v 1.38 2002/03/29 19:06:12 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
 #include "postgres.h"
 
+#include "catalog/namespace.h"
+#include "catalog/pg_namespace.h"
 #include "catalog/pg_type.h"
+#include "lib/stringinfo.h"
+#include "miscadmin.h"
+#include "nodes/makefuncs.h"
 #include "nodes/parsenodes.h"
 #include "parser/parser.h"
 #include "parser/parse_expr.h"
 #include "parser/parse_type.h"
+#include "utils/lsyscache.h"
 #include "utils/syscache.h"
 
 
+/*
+ * LookupTypeName
+ *             Given a TypeName object, get the OID of the referenced type.
+ *             Returns InvalidOid if no such type can be found.
+ *
+ * NB: even if the returned OID is not InvalidOid, the type might be
+ * just a shell.  Caller should check typisdefined before using the type.
+ */
+Oid
+LookupTypeName(const TypeName *typename)
+{
+       Oid                     restype;
+
+       /* Easy if it's an internally generated TypeName */
+       if (typename->names == NIL)
+               return typename->typeid;
+
+       if (typename->pct_type)
+       {
+               /* Handle %TYPE reference to type of an existing field */
+               RangeVar   *rel = makeRangeVar(NULL, NULL);
+               char       *field = NULL;
+               Oid                     relid;
+               AttrNumber      attnum;
+
+               /* deconstruct the name list */
+               switch (length(typename->names))
+               {
+                       case 1:
+                               elog(ERROR, "Improper %%TYPE reference (too few dotted names)");
+                               break;
+                       case 2:
+                               rel->relname = strVal(lfirst(typename->names));
+                               field = strVal(lsecond(typename->names));
+                               break;
+                       case 3:
+                               rel->schemaname = strVal(lfirst(typename->names));
+                               rel->relname = strVal(lsecond(typename->names));
+                               field = strVal(lfirst(lnext(lnext(typename->names))));
+                               break;
+                       case 4:
+                               rel->catalogname = strVal(lfirst(typename->names));
+                               rel->schemaname = strVal(lsecond(typename->names));
+                               rel->relname = strVal(lfirst(lnext(lnext(typename->names))));
+                               field = strVal(lfirst(lnext(lnext(lnext(typename->names)))));
+                               break;
+                       default:
+                               elog(ERROR, "Improper %%TYPE reference (too many dotted names)");
+                               break;
+               }
+
+               /* look up the field */
+               relid = RangeVarGetRelid(rel, false);
+               attnum = get_attnum(relid, field);
+               if (attnum == InvalidAttrNumber)
+                       elog(ERROR, "'%s' is not an attribute of class '%s'",
+                                field, rel->relname);
+               restype = get_atttype(relid, attnum);
+
+               /* this construct should never have an array indicator */
+               Assert(typename->arrayBounds == NIL);
+
+               /* emit nuisance warning */
+               elog(NOTICE, "%s converted to %s",
+                        TypeNameToString(typename), typeidTypeName(restype));
+       }
+       else
+       {
+               /* Normal reference to a type name */
+               char       *catalogname;
+               char       *schemaname = NULL;
+               char       *typname = NULL;
+
+               /* deconstruct the name list */
+               switch (length(typename->names))
+               {
+                       case 1:
+                               typname = strVal(lfirst(typename->names));
+                               break;
+                       case 2:
+                               schemaname = strVal(lfirst(typename->names));
+                               typname = strVal(lsecond(typename->names));
+                               break;
+                       case 3:
+                               catalogname = strVal(lfirst(typename->names));
+                               schemaname = strVal(lsecond(typename->names));
+                               typname = strVal(lfirst(lnext(lnext(typename->names))));
+                               /*
+                                * We check the catalog name and then ignore it.
+                                */
+                               if (strcmp(catalogname, DatabaseName) != 0)
+                                       elog(ERROR, "Cross-database references are not implemented");
+                               break;
+                       default:
+                               elog(ERROR, "Improper type name (too many dotted names)");
+                               break;
+               }
+
+               /* If an array reference, look up the array type instead */
+               if (typename->arrayBounds != NIL)
+                       typname = makeArrayTypeName(typname);
+
+               if (schemaname)
+               {
+                       Oid             namespaceId;
+
+                       namespaceId = GetSysCacheOid(NAMESPACENAME,
+                                                                                CStringGetDatum(schemaname),
+                                                                                0, 0, 0);
+                       if (!OidIsValid(namespaceId))
+                               elog(ERROR, "Namespace \"%s\" does not exist",
+                                        schemaname);
+                       restype = GetSysCacheOid(TYPENAMENSP,
+                                                                        PointerGetDatum(typname),
+                                                                        ObjectIdGetDatum(namespaceId),
+                                                                        0, 0);
+               }
+               else
+               {
+                       /* XXX wrong, should use namespace search */
+                       restype = GetSysCacheOid(TYPENAMENSP,
+                                                                        PointerGetDatum(typname),
+                                                                        ObjectIdGetDatum(PG_CATALOG_NAMESPACE),
+                                                                        0, 0);
+               }
+       }
+
+       return restype;
+}
+
+/*
+ * TypeNameToString
+ *             Produce a string representing the name of a TypeName.
+ *
+ * NB: this must work on TypeNames that do not describe any actual type;
+ * it is mostly used for reporting lookup errors.
+ */
+char *
+TypeNameToString(const TypeName *typename)
+{
+       StringInfoData string;
+
+       initStringInfo(&string);
+
+       if (typename->names != NIL)
+       {
+               /* Emit possibly-qualified name as-is */
+               List            *l;
+
+               foreach(l, typename->names)
+               {
+                       if (l != typename->names)
+                               appendStringInfoChar(&string, '.');
+                       appendStringInfo(&string, "%s", strVal(lfirst(l)));
+               }
+       }
+       else
+       {
+               /* Look up internally-specified type */
+               appendStringInfo(&string, "%s", typeidTypeName(typename->typeid));
+       }
+
+       /*
+        * Add decoration as needed, but only for fields considered by
+        * LookupTypeName
+        */
+       if (typename->pct_type)
+               appendStringInfo(&string, "%%TYPE");
+
+       if (typename->arrayBounds != NIL)
+               appendStringInfo(&string, "[]");
+
+       return string.data;
+}
+
+/*
+ * typenameTypeId - given a TypeName, return the type's OID
+ *
+ * This is equivalent to LookupTypeName, except that this will report
+ * a suitable error message if the type cannot be found or is not defined.
+ */
+Oid
+typenameTypeId(const TypeName *typename)
+{
+       Oid                     typoid;
+
+       typoid = LookupTypeName(typename);
+       if (!OidIsValid(typoid))
+               elog(ERROR, "Type \"%s\" does not exist",
+                        TypeNameToString(typename));
+       if (!get_typisdefined(typoid))
+               elog(ERROR, "Type \"%s\" is only a shell",
+                        TypeNameToString(typename));
+       return typoid;
+}
+
+/*
+ * typenameType - given a TypeName, return a Type structure
+ *
+ * This is equivalent to typenameTypeId + syscache fetch of Type tuple.
+ * NB: caller must ReleaseSysCache the type tuple when done with it.
+ */
+Type
+typenameType(const TypeName *typename)
+{
+       Oid                     typoid;
+       HeapTuple       tup;
+
+       typoid = LookupTypeName(typename);
+       if (!OidIsValid(typoid))
+               elog(ERROR, "Type \"%s\" does not exist",
+                        TypeNameToString(typename));
+       tup = SearchSysCache(TYPEOID,
+                                                ObjectIdGetDatum(typoid),
+                                                0, 0, 0);
+       if (!HeapTupleIsValid(tup))
+               elog(ERROR, "Type \"%s\" does not exist",
+                        TypeNameToString(typename));
+       if (! ((Form_pg_type) GETSTRUCT(tup))->typisdefined)
+               elog(ERROR, "Type \"%s\" is only a shell",
+                        TypeNameToString(typename));
+       return (Type) tup;
+}
+
 /* check to see if a type id is valid,
  * returns true if it is. By using this call before calling
  * typeidType or typeidTypeName, more meaningful error messages
@@ -51,24 +281,6 @@ typeidType(Oid id)
        return (Type) tup;
 }
 
-/* return a Type structure, given type name */
-/* NB: caller must ReleaseSysCache the type tuple when done with it */
-Type
-typenameType(char *s)
-{
-       HeapTuple       tup;
-
-       if (s == NULL)
-               elog(ERROR, "typenameType: Null typename");
-
-       tup = SearchSysCache(TYPENAME,
-                                                PointerGetDatum(s),
-                                                0, 0, 0);
-       if (!HeapTupleIsValid(tup))
-               elog(ERROR, "Unable to locate type name '%s' in catalog", s);
-       return (Type) tup;
-}
-
 /* given type (as type struct), return the type OID */
 Oid
 typeTypeId(Type tp)
@@ -207,6 +419,7 @@ typeidOutfunc(Oid type_id)
 #endif
 
 /* return a type name, given a typeid */
+/* nb: type name is NOT unique; use this only for error messages */
 char *
 typeidTypeName(Oid id)
 {
@@ -251,18 +464,6 @@ typeidTypeRelid(Oid type_id)
        return result;
 }
 
-/* given a type name, return the type's typeid */
-Oid
-typenameTypeId(char *s)
-{
-       Type            typ = typenameType(s);
-       Oid                     result;
-
-       result = typ->t_data->t_oid;
-       ReleaseSysCache(typ);
-       return result;
-}
-
 /*
  * Given a string that is supposed to be a SQL-compatible type declaration,
  * such as "int4" or "integer" or "character varying(32)", parse
@@ -327,7 +528,7 @@ parseTypeString(const char *str, Oid *type_id, int32 *typmod)
                !IsA(typename, TypeName))
                elog(ERROR, "Invalid type name '%s'", str);
 
-       *type_id = typenameTypeId(TypeNameToInternalName(typename));
+       *type_id = typenameTypeId(typename);
        *typmod = typename->typmod;
 
        pfree(buf);
index 6d251b78343416bcd01164c62ab0d6fb552c113a..da8f1b8e5408dd385f419930aa3005148fd46186 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteRemove.c,v 1.46 2002/03/21 23:27:23 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteRemove.c,v 1.47 2002/03/29 19:06:13 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
 /*
  * RemoveRewriteRule
  *
- * Delete a rule given its rulename.
+ * Delete a rule given its (possibly qualified) rulename.
  */
 void
-RemoveRewriteRule(char *ruleName)
+RemoveRewriteRule(List *names)
 {
+       char       *ruleName;
        Relation        RewriteRelation;
        Relation        event_relation;
        HeapTuple       tuple;
@@ -43,6 +44,13 @@ RemoveRewriteRule(char *ruleName)
        bool            hasMoreRules;
        int32           aclcheck_result;
 
+       /*
+        * XXX temporary until rules become schema-tized
+        */
+       if (length(names) != 1)
+               elog(ERROR, "Qualified rule names not supported yet");
+       ruleName = strVal(lfirst(names));
+
        /*
         * Open the pg_rewrite relation.
         */
index 84f3325256a7ae519c3824c581594cbac8081c94..e383290fa4d6b9daac17d3d82cb518f97785da41 100644 (file)
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.140 2002/03/26 19:16:03 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.141 2002/03/29 19:06:13 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
 #include "commands/variable.h"
 #include "commands/view.h"
 #include "miscadmin.h"
+#include "nodes/makefuncs.h"
 #include "parser/parse.h"
 #include "parser/parse_clause.h"
 #include "parser/parse_expr.h"
+#include "parser/parse_type.h"
 #include "rewrite/rewriteDefine.h"
 #include "rewrite/rewriteRemove.h"
 #include "tcop/utility.h"
 #include "utils/acl.h"
+#include "utils/lsyscache.h"
 #include "utils/syscache.h"
 #include "utils/temprel.h"
 #include "access/xlog.h"
@@ -280,45 +283,48 @@ ProcessUtility(Node *parsetree,
 
                                foreach(arg, stmt->objects)
                                {
-                                       RangeVar   *rel = (RangeVar *) lfirst(arg);
-
-                                       relname = rel->relname;
+                                       List   *names = (List *) lfirst(arg);
+                                       RangeVar   *rel;
 
                                        switch (stmt->removeType)
                                        {
                                                case DROP_TABLE:
+                                                       rel = makeRangeVarFromNameList(names);
                                                        CheckDropPermissions(rel, RELKIND_RELATION);
-                                                       RemoveRelation(relname);
+                                                       RemoveRelation(rel);
                                                        break;
 
                                                case DROP_SEQUENCE:
+                                                       rel = makeRangeVarFromNameList(names);
                                                        CheckDropPermissions(rel, RELKIND_SEQUENCE);
-                                                       RemoveRelation(relname);
+                                                       RemoveRelation(rel);
                                                        break;
 
                                                case DROP_VIEW:
+                                                       rel = makeRangeVarFromNameList(names);
                                                        CheckDropPermissions(rel, RELKIND_VIEW);
-                                                       RemoveView(relname);
+                                                       RemoveView(rel);
                                                        break;
 
                                                case DROP_INDEX:
+                                                       rel = makeRangeVarFromNameList(names);
                                                        CheckDropPermissions(rel, RELKIND_INDEX);
                                                        RemoveIndex(rel);
                                                        break;
 
                                                case DROP_RULE:
                                                        /* RemoveRewriteRule checks permissions */
-                                                       RemoveRewriteRule(relname);
+                                                       RemoveRewriteRule(names);
                                                        break;
 
                                                case DROP_TYPE:
                                                        /* RemoveType does its own permissions checks */
-                                                       RemoveType(relname);
+                                                       RemoveType(names);
                                                        break;
 
                                                case DROP_DOMAIN:
                                                        /* RemoveDomain does its own permissions checks */
-                                                       RemoveDomain(relname, stmt->behavior);
+                                                       RemoveDomain(names, stmt->behavior);
                                                        break;
                                        }
 
@@ -334,16 +340,15 @@ ProcessUtility(Node *parsetree,
 
                case T_TruncateStmt:
                        {
-                               relname = ((TruncateStmt *) parsetree)->relation->relname;
-                               TruncateRelation(relname);
+                               TruncateStmt    *stmt = (TruncateStmt *) parsetree;
+
+                               TruncateRelation(stmt->relation);
                        }
                        break;
 
                case T_CommentStmt:
                        {
-                               CommentStmt *stmt;
-
-                               stmt = ((CommentStmt *) parsetree);
+                               CommentStmt *stmt = (CommentStmt *) parsetree;
 
                                CommentObject(stmt->objtype, stmt->objschema, stmt->objname,
                                                          stmt->objproperty, stmt->objlist, stmt->comment);
@@ -357,7 +362,7 @@ ProcessUtility(Node *parsetree,
                                if (stmt->direction != FROM)
                                        SetQuerySnapshot();
 
-                               DoCopy(stmt->relation->relname,
+                               DoCopy(stmt->relation,
                                           stmt->binary,
                                           stmt->oids,
                                           (bool) (stmt->direction == FROM),
@@ -408,7 +413,7 @@ ProcessUtility(Node *parsetree,
                                        /*
                                         * rename attribute
                                         */
-                                       renameatt(relname,      /* relname */
+                                       renameatt(RangeVarGetRelid(stmt->relation, false),      /* relation */
                                                          stmt->column,         /* old att name */
                                                          stmt->newname,        /* new att name */
                                                          interpretInhOption(stmt->relation->inhOpt));          /* recursive? */
@@ -429,38 +434,63 @@ ProcessUtility(Node *parsetree,
                                switch (stmt->subtype)
                                {
                                        case 'A':       /* ADD COLUMN */
-                                               AlterTableAddColumn(stmt->relation->relname,
-                                                                               interpretInhOption((stmt->relation)->inhOpt),
+                                               /*
+                                                * Recursively add column to table and,
+                                                * if requested, to descendants
+                                                */
+                                               AlterTableAddColumn(RangeVarGetRelid(stmt->relation, false),
+                                                                                       interpretInhOption(stmt->relation->inhOpt),
                                                                                        (ColumnDef *) stmt->def);
                                                break;
                                        case 'T':       /* ALTER COLUMN DEFAULT */
-                                               AlterTableAlterColumnDefault(stmt->relation->relname,
-                                                                               interpretInhOption((stmt->relation)->inhOpt),
+                                               /* 
+                                                * Recursively alter column default for table and,
+                                                * if requested, for descendants
+                                                */
+                                               AlterTableAlterColumnDefault(RangeVarGetRelid(stmt->relation, false),
+                                                                                                        interpretInhOption(stmt->relation->inhOpt),
                                                                                                         stmt->name,
                                                                                                         stmt->def);
                                                break;
                                        case 'S':       /* ALTER COLUMN STATISTICS */
                                        case 'M':   /* ALTER COLUMN STORAGE */
-                                               AlterTableAlterColumnFlags(stmt->relation->relname,
-                                                                               interpretInhOption(stmt->relation->inhOpt),
-                                                                                                               stmt->name,
-                                                                                                               stmt->def,
-                                                                                                       &(stmt->subtype));
+                                               /*
+                                                * Recursively alter column statistics for table and,
+                                                * if requested, for descendants
+                                                */
+                                               AlterTableAlterColumnFlags(RangeVarGetRelid(stmt->relation, false),
+                                                                                                  interpretInhOption(stmt->relation->inhOpt),
+                                                                                                  stmt->name,
+                                                                                                  stmt->def,
+                                                                                                  &(stmt->subtype));
                                                break;
                                        case 'D':       /* DROP COLUMN */
-                                               AlterTableDropColumn(stmt->relation->relname,
-                                                                               interpretInhOption(stmt->relation->inhOpt),
+                                               /* 
+                                                * XXX We don't actually recurse yet, but what we should do would be:
+                                                * Recursively drop column from table and,
+                                                * if requested, from descendants
+                                                */
+                                               AlterTableDropColumn(RangeVarGetRelid(stmt->relation, false),
+                                                                                        interpretInhOption(stmt->relation->inhOpt),
                                                                                         stmt->name,
                                                                                         stmt->behavior);
                                                break;
                                        case 'C':       /* ADD CONSTRAINT */
-                                               AlterTableAddConstraint(stmt->relation->relname,
-                                                                               interpretInhOption(stmt->relation->inhOpt),
+                                               /*
+                                                * Recursively add constraint to table and,
+                                                * if requested, to descendants
+                                                */
+                                               AlterTableAddConstraint(RangeVarGetRelid(stmt->relation, false),
+                                                                                               interpretInhOption(stmt->relation->inhOpt),
                                                                                                (List *) stmt->def);
                                                break;
                                        case 'X':       /* DROP CONSTRAINT */
-                                               AlterTableDropConstraint(stmt->relation->relname,
-                                                                               interpretInhOption(stmt->relation->inhOpt),
+                                               /* 
+                                                * Recursively drop constraint from table and,
+                                                * if requested, from descendants
+                                                */
+                                               AlterTableDropConstraint(RangeVarGetRelid(stmt->relation, false),
+                                                                                                interpretInhOption(stmt->relation->inhOpt),
                                                                                                 stmt->name,
                                                                                                 stmt->behavior);
                                                break;
@@ -469,8 +499,12 @@ ProcessUtility(Node *parsetree,
                                                                                                   false);
                                                break;
                                        case 'U':       /* ALTER OWNER */
-                                               AlterTableOwner(stmt->relation,
-                                                                               stmt->name);
+                                               /* check that we are the superuser */
+                                               if (!superuser())
+                                                       elog(ERROR, "ALTER TABLE: permission denied");
+                                               /* get_usesysid raises an error if no such user */
+                                               AlterTableOwner(RangeVarGetRelid(stmt->relation, false),
+                                                                               get_usesysid(stmt->name));
                                                break;
                                        default:        /* oops */
                                                elog(ERROR, "T_AlterTableStmt: unknown subtype");
@@ -500,15 +534,13 @@ ProcessUtility(Node *parsetree,
                                switch (stmt->defType)
                                {
                                        case OPERATOR:
-                                               DefineOperator(stmt->defname,   /* operator name */
-                                                                          stmt->definition);           /* rest */
+                                               DefineOperator(stmt->defnames, stmt->definition);
                                                break;
                                        case TYPE_P:
-                                               DefineType(stmt->defname, stmt->definition);
+                                               DefineType(stmt->defnames, stmt->definition);
                                                break;
                                        case AGGREGATE:
-                                               DefineAggregate(stmt->defname,  /* aggregate name */
-                                                                               stmt->definition);              /* rest */
+                                               DefineAggregate(stmt->defnames, stmt->definition);
                                                break;
                                }
                        }
@@ -518,7 +550,7 @@ ProcessUtility(Node *parsetree,
                        {
                                ViewStmt   *stmt = (ViewStmt *) parsetree;
 
-                               DefineView(stmt->view->relname, stmt->query);   /* retrieve parsetree */
+                               DefineView(stmt->view, stmt->query);
                        }
                        break;
 
@@ -554,12 +586,8 @@ ProcessUtility(Node *parsetree,
                case T_RemoveAggrStmt:
                        {
                                RemoveAggrStmt *stmt = (RemoveAggrStmt *) parsetree;
-                               char       *typename = (char *) NULL;
 
-                               if (stmt->aggtype != NULL)
-                                       typename = TypeNameToInternalName((TypeName *) stmt->aggtype);
-
-                               RemoveAggregate(stmt->aggname, typename);
+                               RemoveAggregate(stmt->aggname, stmt->aggtype);
                        }
                        break;
 
@@ -576,15 +604,8 @@ ProcessUtility(Node *parsetree,
                                RemoveOperStmt *stmt = (RemoveOperStmt *) parsetree;
                                TypeName   *typenode1 = (TypeName *) lfirst(stmt->args);
                                TypeName   *typenode2 = (TypeName *) lsecond(stmt->args);
-                               char       *typename1 = (char *) NULL;
-                               char       *typename2 = (char *) NULL;
-
-                               if (typenode1 != NULL)
-                                       typename1 = TypeNameToInternalName(typenode1);
-                               if (typenode2 != NULL)
-                                       typename2 = TypeNameToInternalName(typenode2);
 
-                               RemoveOperator(stmt->opname, typename1, typename2);
+                               RemoveOperator(stmt->opname, typenode1, typenode2);
                        }
                        break;
 
index 15210f0c84102a477bb91fe93de125bcb237439e..eff24bd89116dbc4de12a9fe701b9164e85096d3 100644 (file)
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/sets.c,v 1.40 2002/02/18 23:11:23 petere Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/sets.c,v 1.41 2002/03/29 19:06:14 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -21,6 +21,7 @@
 #include "catalog/catname.h"
 #include "catalog/indexing.h"
 #include "catalog/pg_language.h"
+#include "catalog/pg_namespace.h"
 #include "catalog/pg_proc.h"
 #include "executor/executor.h"
 #include "utils/fcache.h"
@@ -36,7 +37,7 @@
  *       in pg_proc.
  */
 Oid
-SetDefine(char *querystr, char *typename)
+SetDefine(char *querystr, Oid elemType)
 {
        Oid                     setoid;
        char       *procname = GENERICSETNAME;
@@ -52,9 +53,10 @@ SetDefine(char *querystr, char *typename)
        char            repl[Natts_pg_proc];
 
        setoid = ProcedureCreate(procname,      /* changed below, after oid known */
+                                                        PG_CATALOG_NAMESPACE, /* XXX wrong */
                                                         false,         /* don't replace */
                                                         true,          /* returnsSet */
-                                                        typename,      /* returnTypeName */
+                                                        elemType,      /* returnType */
                                                         SQLlanguageId, /* language */
                                                         querystr,      /* sourceCode */
                                                         fileName,      /* fileName */
index 82be75ac79935658891f51591cb47f849eec8539..6ec682f5206d045576ba4490423a762e5587afa4 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/utils/cache/lsyscache.c,v 1.66 2002/03/26 19:16:09 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/utils/cache/lsyscache.c,v 1.67 2002/03/29 19:06:15 tgl Exp $
  *
  * NOTES
  *       Eventually, the index information should go through here, too.
@@ -738,6 +738,33 @@ get_rel_type_id(Oid relid)
 
 /*                             ---------- TYPE CACHE ----------                                                 */
 
+/*
+ * get_typisdefined
+ *
+ *             Given the type OID, determine whether the type is defined
+ *             (if not, it's only a shell).
+ */
+bool
+get_typisdefined(Oid typid)
+{
+       HeapTuple       tp;
+
+       tp = SearchSysCache(TYPEOID,
+                                               ObjectIdGetDatum(typid),
+                                               0, 0, 0);
+       if (HeapTupleIsValid(tp))
+       {
+               Form_pg_type typtup = (Form_pg_type) GETSTRUCT(tp);
+               bool            result;
+
+               result = typtup->typisdefined;
+               ReleaseSysCache(tp);
+               return result;
+       }
+       else
+               return false;
+}
+
 /*
  * get_typlen
  *
index 57d4719b294014d60361aa06c188ef2107cd7aa4..a160e4fb1bdda03ae58a03f904b0c9fada1ed2eb 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/utils/cache/syscache.c,v 1.70 2002/03/26 19:16:14 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/utils/cache/syscache.c,v 1.71 2002/03/29 19:06:15 tgl Exp $
  *
  * NOTES
  *       These routines allow the parser/planner/executor to perform
@@ -384,13 +384,13 @@ static const struct cachedesc cacheinfo[] = {
                        0,
                        0
        }},
-       {TypeRelationName,                      /* TYPENAME */
-               TypeNameIndex,
+       {TypeRelationName,                      /* TYPENAMENSP */
+               TypeNameNspIndex,
                Anum_pg_type_typrelid,
-               1,
+               2,
                {
                        Anum_pg_type_typname,
-                       0,
+                       Anum_pg_type_typnamespace,
                        0,
                        0
        }},
@@ -515,7 +515,7 @@ SearchSysCache(int cacheId,
         * when sought.  This is a kluge ... temp table substitution should be
         * happening at a higher level ...
         */
-       if (cacheId == RELNAMENSP || cacheId == TYPENAME)
+       if (cacheId == RELNAMENSP || cacheId == TYPENAMENSP)
        {
                char       *nontemp_relname;
 
index 88dc606cb0e81edfe553b3eb6075077a256107c4..7ab609eaf36d0e2ca3687eaf9271d6e865533f8d 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/utils/cache/Attic/temprel.c,v 1.35 2001/03/22 03:59:58 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/utils/cache/Attic/temprel.c,v 1.36 2002/03/29 19:06:16 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -227,13 +227,7 @@ remove_all_temp_relations(void)
                        continue;                       /* ignore it if deleted already */
 
                if (temp_rel->relkind != RELKIND_INDEX)
-               {
-                       char            relname[NAMEDATALEN];
-
-                       /* safe from deallocation */
-                       strcpy(relname, NameStr(temp_rel->user_relname));
-                       heap_drop_with_catalog(relname, allowSystemTableMods);
-               }
+                       heap_drop_with_catalog(temp_rel->relid, allowSystemTableMods);
                else
                        index_drop(temp_rel->relid);
                /* advance cmd counter to make catalog changes visible */
index 9b532c9e2e426180442ebbd809c186d04098bf7e..b1cee7197f849e67ea6d0fffa72e780f1263ffbb 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: tupdesc.h,v 1.33 2001/11/05 17:46:31 momjian Exp $
+ * $Id: tupdesc.h,v 1.34 2002/03/29 19:06:16 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -65,7 +65,7 @@ extern void FreeTupleDesc(TupleDesc tupdesc);
 
 extern bool equalTupleDescs(TupleDesc tupdesc1, TupleDesc tupdesc2);
 
-extern bool TupleDescInitEntry(TupleDesc desc,
+extern void TupleDescInitEntry(TupleDesc desc,
                                   AttrNumber attributeNumber,
                                   char *attributeName,
                                   Oid oidtypeid,
@@ -73,6 +73,6 @@ extern bool TupleDescInitEntry(TupleDesc desc,
                                   int attdim,
                                   bool attisset);
 
-extern TupleDesc BuildDescForRelation(List *schema, char *relname);
+extern TupleDesc BuildDescForRelation(List *schema);
 
 #endif   /* TUPDESC_H */
index 0d9c280fb0d4af6832e2aec736bf05062998d716..d41c0a4c318b51a370d57e0085ca44dee1411a7d 100644 (file)
@@ -37,7 +37,7 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: catversion.h,v 1.111 2002/03/26 19:16:22 tgl Exp $
+ * $Id: catversion.h,v 1.112 2002/03/29 19:06:17 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -53,6 +53,6 @@
  */
 
 /*                                                     yyyymmddN */
-#define CATALOG_VERSION_NO     200203251
+#define CATALOG_VERSION_NO     200203261
 
 #endif
index eb34ee1404feb36e28e50d80fc54c2ae0989ea8e..b7313c642536dac6579c2ef9ae0cc7f4584c4623 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: heap.h,v 1.47 2002/03/26 19:16:23 tgl Exp $
+ * $Id: heap.h,v 1.48 2002/03/29 19:06:17 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -39,10 +39,9 @@ extern Oid heap_create_with_catalog(char *relname, Oid relnamespace,
                                                 char relkind, bool relhasoids, bool istemp,
                                                 bool allow_system_table_mods);
 
-extern void heap_drop_with_catalog(const char *relname,
-                                          bool allow_system_table_mods);
+extern void heap_drop_with_catalog(Oid rid, bool allow_system_table_mods);
 
-extern void heap_truncate(const char *relname);
+extern void heap_truncate(Oid rid);
 
 extern void AddRelationRawConstraints(Relation rel,
                                                  List *rawColDefaults,
index 222e0da51e971fe7774d641716ae433fc31a2459..1cc15cedf877a302f587cd6c41090e9f00cb7c72 100644 (file)
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: indexing.h,v 1.59 2002/03/26 19:16:26 tgl Exp $
+ * $Id: indexing.h,v 1.60 2002/03/29 19:06:17 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -89,7 +89,7 @@
 #define TriggerConstrRelidIndex                "pg_trigger_tgconstrrelid_index"
 #define TriggerRelidIndex                      "pg_trigger_tgrelid_index"
 #define TriggerOidIndex                                "pg_trigger_oid_index"
-#define TypeNameIndex                          "pg_type_typname_index"
+#define TypeNameNspIndex                       "pg_type_typname_nsp_index"
 #define TypeOidIndex                           "pg_type_oid_index"
 
 /* Arrays of names of indices for each system catalog */
@@ -189,7 +189,7 @@ DECLARE_INDEX(pg_trigger_tgconstrrelid_index on pg_trigger using btree(tgconstrr
 DECLARE_INDEX(pg_trigger_tgrelid_index on pg_trigger using btree(tgrelid oid_ops));
 DECLARE_UNIQUE_INDEX(pg_trigger_oid_index on pg_trigger using btree(oid oid_ops));
 DECLARE_UNIQUE_INDEX(pg_type_oid_index on pg_type using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_type_typname_index on pg_type using btree(typname name_ops));
+DECLARE_UNIQUE_INDEX(pg_type_typname_nsp_index on pg_type using btree(typname name_ops, typnamespace oid_ops));
 
 /* last step of initialization script: build the indices declared above */
 BUILD_INDICES
index cbe65a07f552563e8dfafde403cce9a614ed3add..f6f359813cd43cfffe77fb1f69aa143ab17caa91 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: namespace.h,v 1.1 2002/03/26 19:16:28 tgl Exp $
+ * $Id: namespace.h,v 1.2 2002/03/29 19:06:18 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -23,4 +23,8 @@ extern Oid    RangeVarGetCreationNamespace(const RangeVar *newRelation);
 
 extern Oid     RelnameGetRelid(const char *relname);
 
+extern Oid     QualifiedNameGetCreationNamespace(List *names, char **objname_p);
+
+extern RangeVar *makeRangeVarFromNameList(List *names);
+
 #endif   /* NAMESPACE_H */
index f0bf81dedcd9b89764d9d13afa54f2c31d893e1d..65494e8afe200fe83d7489414196c2069dc1299f 100644 (file)
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pg_aggregate.h,v 1.35 2001/11/05 17:46:32 momjian Exp $
+ * $Id: pg_aggregate.h,v 1.36 2002/03/29 19:06:18 tgl Exp $
  *
  * NOTES
  *       the genbki.sh script reads this file and generates .bki
@@ -155,12 +155,13 @@ DATA(insert OID = 0 ( stddev      PGUID numeric_accum  numeric_stddev             1700 1231 1700
 /*
  * prototypes for functions in pg_aggregate.c
  */
-extern void AggregateCreate(char *aggName,
-                               char *aggtransfnName,
-                               char *aggfinalfnName,
-                               char *aggbasetypeName,
-                               char *aggtranstypeName,
-                               char *agginitval);
+extern void AggregateCreate(const char *aggName,
+                                                       Oid aggNamespace,
+                                                       char *aggtransfnName,
+                                                       char *aggfinalfnName,
+                                                       Oid aggBaseType,
+                                                       Oid aggTransType,
+                                                       const char *agginitval);
 
 extern Datum AggNameGetInitVal(char *aggName, Oid basetype,
                                  bool *isNull);
index e8166960d2860a1a04b1e49ead49f51878dc6bde..d075e49aca082b75e3f6a23f4be369af39e26654 100644 (file)
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pg_attribute.h,v 1.86 2002/03/26 19:16:29 tgl Exp $
+ * $Id: pg_attribute.h,v 1.87 2002/03/29 19:06:18 tgl Exp $
  *
  * NOTES
  *       the genbki.sh script reads this file and generates .bki
@@ -225,51 +225,53 @@ typedef FormData_pg_attribute *Form_pg_attribute;
  */
 #define Schema_pg_type \
 { 1247, {"typname"},      19, DEFAULT_ATTSTATTARGET, NAMEDATALEN,      1, 0, -1, -1, false, 'p', false, 'i', false, false }, \
-{ 1247, {"typowner"},     23, 0,       4,      2, 0, -1, -1, true, 'p', false, 'i', false, false }, \
-{ 1247, {"typlen"},               21, 0,       2,      3, 0, -1, -1, true, 'p', false, 's', false, false }, \
-{ 1247, {"typprtlen"},    21, 0,       2,      4, 0, -1, -1, true, 'p', false, 's', false, false }, \
-{ 1247, {"typbyval"},     16, 0,       1,      5, 0, -1, -1, true, 'p', false, 'c', false, false }, \
-{ 1247, {"typtype"},      18, 0,       1,      6, 0, -1, -1, true, 'p', false, 'c', false, false }, \
-{ 1247, {"typisdefined"},  16, 0,      1,      7, 0, -1, -1, true, 'p', false, 'c', false, false }, \
-{ 1247, {"typdelim"},     18, 0,       1,      8, 0, -1, -1, true, 'p', false, 'c', false, false }, \
-{ 1247, {"typrelid"},     26, 0,       4,      9, 0, -1, -1, true, 'p', false, 'i', false, false }, \
-{ 1247, {"typelem"},      26, 0,       4, 10, 0, -1, -1, true, 'p', false, 'i', false, false }, \
-{ 1247, {"typinput"},     24, 0,       4, 11, 0, -1, -1, true, 'p', false, 'i', false, false }, \
-{ 1247, {"typoutput"},    24, 0,       4, 12, 0, -1, -1, true, 'p', false, 'i', false, false }, \
-{ 1247, {"typreceive"},    24, 0,      4, 13, 0, -1, -1, true, 'p', false, 'i', false, false }, \
-{ 1247, {"typsend"},      24, 0,       4, 14, 0, -1, -1, true, 'p', false, 'i', false, false }, \
-{ 1247, {"typalign"},     18, 0,       1, 15, 0, -1, -1, true, 'p', false, 'c', false, false }, \
-{ 1247, {"typstorage"},    18, 0,      1, 16, 0, -1, -1, true, 'p', false, 'c', false, false }, \
-{ 1247, {"typnotnull"},    16, 0,   1, 17, 0, -1, -1, true, 'p', false, 'c', false, false }, \
-{ 1247, {"typbasetype"},   26, 0,      4, 18, 0, -1, -1, true, 'p', false, 'i', false, false }, \
-{ 1247, {"typtypmod"},     23, 0,      4, 19, 0, -1, -1, true, 'p', false, 'i', false, false }, \
-{ 1247, {"typndims"},      23, 0,      4, 20, 0, -1, -1, true, 'p', false, 'i', false, false }, \
-{ 1247, {"typdefaultbin"}, 25, 0,  -1, 21, 0, -1, -1, false, 'x', false, 'i', false, false }, \
-{ 1247, {"typdefault"},    25, 0,  -1, 22, 0, -1, -1, false, 'x', false, 'i', false, false }
+{ 1247, {"typnamespace"},  26, 0,      4,      2, 0, -1, -1, true, 'p', false, 'i', false, false }, \
+{ 1247, {"typowner"},     23, 0,       4,      3, 0, -1, -1, true, 'p', false, 'i', false, false }, \
+{ 1247, {"typlen"},               21, 0,       2,      4, 0, -1, -1, true, 'p', false, 's', false, false }, \
+{ 1247, {"typprtlen"},    21, 0,       2,      5, 0, -1, -1, true, 'p', false, 's', false, false }, \
+{ 1247, {"typbyval"},     16, 0,       1,      6, 0, -1, -1, true, 'p', false, 'c', false, false }, \
+{ 1247, {"typtype"},      18, 0,       1,      7, 0, -1, -1, true, 'p', false, 'c', false, false }, \
+{ 1247, {"typisdefined"},  16, 0,      1,      8, 0, -1, -1, true, 'p', false, 'c', false, false }, \
+{ 1247, {"typdelim"},     18, 0,       1,      9, 0, -1, -1, true, 'p', false, 'c', false, false }, \
+{ 1247, {"typrelid"},     26, 0,       4, 10, 0, -1, -1, true, 'p', false, 'i', false, false }, \
+{ 1247, {"typelem"},      26, 0,       4, 11, 0, -1, -1, true, 'p', false, 'i', false, false }, \
+{ 1247, {"typinput"},     24, 0,       4, 12, 0, -1, -1, true, 'p', false, 'i', false, false }, \
+{ 1247, {"typoutput"},    24, 0,       4, 13, 0, -1, -1, true, 'p', false, 'i', false, false }, \
+{ 1247, {"typreceive"},    24, 0,      4, 14, 0, -1, -1, true, 'p', false, 'i', false, false }, \
+{ 1247, {"typsend"},      24, 0,       4, 15, 0, -1, -1, true, 'p', false, 'i', false, false }, \
+{ 1247, {"typalign"},     18, 0,       1, 16, 0, -1, -1, true, 'p', false, 'c', false, false }, \
+{ 1247, {"typstorage"},    18, 0,      1, 17, 0, -1, -1, true, 'p', false, 'c', false, false }, \
+{ 1247, {"typnotnull"},    16, 0,   1, 18, 0, -1, -1, true, 'p', false, 'c', false, false }, \
+{ 1247, {"typbasetype"},   26, 0,      4, 19, 0, -1, -1, true, 'p', false, 'i', false, false }, \
+{ 1247, {"typtypmod"},     23, 0,      4, 20, 0, -1, -1, true, 'p', false, 'i', false, false }, \
+{ 1247, {"typndims"},      23, 0,      4, 21, 0, -1, -1, true, 'p', false, 'i', false, false }, \
+{ 1247, {"typdefaultbin"}, 25, 0,  -1, 22, 0, -1, -1, false, 'x', false, 'i', false, false }, \
+{ 1247, {"typdefault"},    25, 0,  -1, 23, 0, -1, -1, false, 'x', false, 'i', false, false }
 
 
 DATA(insert ( 1247 typname                     19 DEFAULT_ATTSTATTARGET NAMEDATALEN   1 0 -1 -1 f p f i f f));
-DATA(insert ( 1247 typowner                    23 0  4   2 0 -1 -1 t p f i f f));
-DATA(insert ( 1247 typlen                      21 0  2   3 0 -1 -1 t p f s f f));
-DATA(insert ( 1247 typprtlen           21 0  2   4 0 -1 -1 t p f s f f));
-DATA(insert ( 1247 typbyval                    16 0  1   5 0 -1 -1 t p f c f f));
-DATA(insert ( 1247 typtype                     18 0  1   6 0 -1 -1 t p f c f f));
-DATA(insert ( 1247 typisdefined                16 0  1   7 0 -1 -1 t p f c f f));
-DATA(insert ( 1247 typdelim                    18 0  1   8 0 -1 -1 t p f c f f));
-DATA(insert ( 1247 typrelid                    26 0  4   9 0 -1 -1 t p f i f f));
-DATA(insert ( 1247 typelem                     26 0  4  10 0 -1 -1 t p f i f f));
-DATA(insert ( 1247 typinput                    24 0  4  11 0 -1 -1 t p f i f f));
-DATA(insert ( 1247 typoutput           24 0  4  12 0 -1 -1 t p f i f f));
-DATA(insert ( 1247 typreceive          24 0  4  13 0 -1 -1 t p f i f f));
-DATA(insert ( 1247 typsend                     24 0  4  14 0 -1 -1 t p f i f f));
-DATA(insert ( 1247 typalign                    18 0  1  15 0 -1 -1 t p f c f f));
-DATA(insert ( 1247 typstorage          18 0  1  16 0 -1 -1 t p f c f f));
-DATA(insert ( 1247 typnotnull          16 0  1  17 0 -1 -1 t p f c f f));
-DATA(insert ( 1247 typbasetype         26 0  4  18 0 -1 -1 t p f i f f));
-DATA(insert ( 1247 typtypmod           23 0  4  19 0 -1 -1 t p f i f f));
-DATA(insert ( 1247 typndims                    23 0  4  20 0 -1 -1 t p f i f f));
-DATA(insert ( 1247 typdefaultbin       25 0 -1  21 0 -1 -1 f x f i f f));
-DATA(insert ( 1247 typdefault          25 0 -1  22 0 -1 -1 f x f i f f));
+DATA(insert ( 1247 typnamespace                26 0  4   2 0 -1 -1 t p f i f f));
+DATA(insert ( 1247 typowner                    23 0  4   3 0 -1 -1 t p f i f f));
+DATA(insert ( 1247 typlen                      21 0  2   4 0 -1 -1 t p f s f f));
+DATA(insert ( 1247 typprtlen           21 0  2   5 0 -1 -1 t p f s f f));
+DATA(insert ( 1247 typbyval                    16 0  1   6 0 -1 -1 t p f c f f));
+DATA(insert ( 1247 typtype                     18 0  1   7 0 -1 -1 t p f c f f));
+DATA(insert ( 1247 typisdefined                16 0  1   8 0 -1 -1 t p f c f f));
+DATA(insert ( 1247 typdelim                    18 0  1   9 0 -1 -1 t p f c f f));
+DATA(insert ( 1247 typrelid                    26 0  4  10 0 -1 -1 t p f i f f));
+DATA(insert ( 1247 typelem                     26 0  4  11 0 -1 -1 t p f i f f));
+DATA(insert ( 1247 typinput                    24 0  4  12 0 -1 -1 t p f i f f));
+DATA(insert ( 1247 typoutput           24 0  4  13 0 -1 -1 t p f i f f));
+DATA(insert ( 1247 typreceive          24 0  4  14 0 -1 -1 t p f i f f));
+DATA(insert ( 1247 typsend                     24 0  4  15 0 -1 -1 t p f i f f));
+DATA(insert ( 1247 typalign                    18 0  1  16 0 -1 -1 t p f c f f));
+DATA(insert ( 1247 typstorage          18 0  1  17 0 -1 -1 t p f c f f));
+DATA(insert ( 1247 typnotnull          16 0  1  18 0 -1 -1 t p f c f f));
+DATA(insert ( 1247 typbasetype         26 0  4  19 0 -1 -1 t p f i f f));
+DATA(insert ( 1247 typtypmod           23 0  4  20 0 -1 -1 t p f i f f));
+DATA(insert ( 1247 typndims                    23 0  4  21 0 -1 -1 t p f i f f));
+DATA(insert ( 1247 typdefaultbin       25 0 -1  22 0 -1 -1 f x f i f f));
+DATA(insert ( 1247 typdefault          25 0 -1  23 0 -1 -1 f x f i f f));
 DATA(insert ( 1247 ctid                                27 0  6  -1 0 -1 -1 f p f i f f));
 DATA(insert ( 1247 oid                         26 0  4  -2 0 -1 -1 t p f i f f));
 DATA(insert ( 1247 xmin                                28 0  4  -3 0 -1 -1 t p f i f f));
index 60f524b2a6220b98a801d053470ac0a5864e7f98..0bd1256e1dffca076b605768380acac6f0044e00 100644 (file)
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pg_class.h,v 1.63 2002/03/26 19:16:35 tgl Exp $
+ * $Id: pg_class.h,v 1.64 2002/03/29 19:06:18 tgl Exp $
  *
  * NOTES
  *       the genbki.sh script reads this file and generates .bki
@@ -134,7 +134,7 @@ typedef FormData_pg_class *Form_pg_class;
  * ----------------
  */
 
-DATA(insert OID = 1247 (  pg_type              PGNSP 71 PGUID 0 1247 0 0 0 0 f f r 22 0 0 0 0 0 t f f f _null_ ));
+DATA(insert OID = 1247 (  pg_type              PGNSP 71 PGUID 0 1247 0 0 0 0 f f r 23 0 0 0 0 0 t f f f _null_ ));
 DESCR("");
 DATA(insert OID = 1249 (  pg_attribute PGNSP 75 PGUID 0 1249 0 0 0 0 f f r 15 0 0 0 0 0 f f f f _null_ ));
 DESCR("");
index bff7c6691b31d9cd8f45dea5118a81d412114a64..00ba73cd76262bc8c0a852a6ad2ce2daf5b64e8d 100644 (file)
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pg_operator.h,v 1.99 2001/11/05 17:46:32 momjian Exp $
+ * $Id: pg_operator.h,v 1.100 2002/03/29 19:06:19 tgl Exp $
  *
  * NOTES
  *       the genbki.sh script reads this file and generates .bki
@@ -843,18 +843,18 @@ DATA(insert OID = 2068 (  "-"        PGUID 0 b t f 1114 1186 1114    0    0 0 0 timesta
 /*
  * function prototypes
  */
-extern void OperatorCreate(char *operatorName,
-                          char *leftTypeName,
-                          char *rightTypeName,
-                          char *procedureName,
+extern void OperatorCreate(const char *operatorName,
+                          Oid leftTypeId,
+                          Oid rightTypeId,
+                          const char *procedureName,
                           uint16 precedence,
                           bool isLeftAssociative,
-                          char *commutatorName,
-                          char *negatorName,
-                          char *restrictionName,
-                          char *joinName,
+                          const char *commutatorName,
+                          const char *negatorName,
+                          const char *restrictionName,
+                          const char *joinName,
                           bool canHash,
-                          char *leftSortName,
-                          char *rightSortName);
+                          const char *leftSortName,
+                          const char *rightSortName);
 
 #endif   /* PG_OPERATOR_H */
index bd5c6045df6643ededbc3f915e5775537eda7e19..ac32bd69aa0ee46ab21a8af4997c5eb8aab06e93 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pg_proc.h,v 1.223 2002/02/18 23:11:36 petere Exp $
+ * $Id: pg_proc.h,v 1.224 2002/03/29 19:06:19 tgl Exp $
  *
  * NOTES
  *       The script catalog/genbki.sh reads this file and generates .bki
@@ -2873,12 +2873,13 @@ DESCR("time zone");
 
 
 /*
- * prototypes for functions pg_proc.c
+ * prototypes for functions in pg_proc.c
  */
 extern Oid ProcedureCreate(char *procedureName,
+                               Oid procNamespace,
                                bool replace,
                                bool returnsSet,
-                               char *returnTypeName,
+                               Oid returnType,
                                Oid languageObjectId,
                                char *prosrc,
                                char *probin,
index d1d2c02f7819a922b6fc94bb0fb631c9d20a5f4c..bd4bf0063a4c492a619c1edac739175d652860eb 100644 (file)
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pg_type.h,v 1.118 2002/03/20 19:44:57 tgl Exp $
+ * $Id: pg_type.h,v 1.119 2002/03/29 19:06:20 tgl Exp $
  *
  * NOTES
  *       the genbki.sh script reads this file and generates .bki
@@ -38,8 +38,9 @@
  */
 CATALOG(pg_type) BOOTSTRAP
 {
-       NameData        typname;
-       int4            typowner;
+       NameData        typname;                /* type name */
+       Oid                     typnamespace;   /* OID of namespace containing this type */
+       int4            typowner;               /* type owner */
 
        /*
         * For a fixed-size type, typlen is the number of bytes we use to
@@ -202,29 +203,30 @@ typedef FormData_pg_type *Form_pg_type;
  *             compiler constants for pg_type
  * ----------------
  */
-#define Natts_pg_type                                  22
+#define Natts_pg_type                                  23
 #define Anum_pg_type_typname                   1
-#define Anum_pg_type_typowner                  2
-#define Anum_pg_type_typlen                            3
-#define Anum_pg_type_typprtlen                 4
-#define Anum_pg_type_typbyval                  5
-#define Anum_pg_type_typtype                   6
-#define Anum_pg_type_typisdefined              7
-#define Anum_pg_type_typdelim                  8
-#define Anum_pg_type_typrelid                  9
-#define Anum_pg_type_typelem                   10
-#define Anum_pg_type_typinput                  11
-#define Anum_pg_type_typoutput                 12
-#define Anum_pg_type_typreceive                        13
-#define Anum_pg_type_typsend                   14
-#define Anum_pg_type_typalign                  15
-#define Anum_pg_type_typstorage                        16
-#define Anum_pg_type_typnotnull                        17
-#define Anum_pg_type_typbasetype               18
-#define Anum_pg_type_typtypmod                 19
-#define Anum_pg_type_typndims                  20
-#define Anum_pg_type_typdefaultbin             21
-#define Anum_pg_type_typdefault                        22
+#define Anum_pg_type_typnamespace              2
+#define Anum_pg_type_typowner                  3
+#define Anum_pg_type_typlen                            4
+#define Anum_pg_type_typprtlen                 5
+#define Anum_pg_type_typbyval                  6
+#define Anum_pg_type_typtype                   7
+#define Anum_pg_type_typisdefined              8
+#define Anum_pg_type_typdelim                  9
+#define Anum_pg_type_typrelid                  10
+#define Anum_pg_type_typelem                   11
+#define Anum_pg_type_typinput                  12
+#define Anum_pg_type_typoutput                 13
+#define Anum_pg_type_typreceive                        14
+#define Anum_pg_type_typsend                   15
+#define Anum_pg_type_typalign                  16
+#define Anum_pg_type_typstorage                        17
+#define Anum_pg_type_typnotnull                        18
+#define Anum_pg_type_typbasetype               19
+#define Anum_pg_type_typtypmod                 20
+#define Anum_pg_type_typndims                  21
+#define Anum_pg_type_typdefaultbin             22
+#define Anum_pg_type_typdefault                        23
 
 
 /* ----------------
@@ -240,82 +242,82 @@ typedef FormData_pg_type *Form_pg_type;
 */
 
 /* OIDS 1 - 99 */
-DATA(insert OID = 16 ( bool       PGUID  1   1 t b t \054 0   0 boolin boolout boolin boolout c p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 16 ( bool       PGNSP PGUID  1   1 t b t \054 0   0 boolin boolout boolin boolout c p f 0 -1 0 _null_ _null_ ));
 DESCR("boolean, 'true'/'false'");
 #define BOOLOID                        16
 
-DATA(insert OID = 17 ( bytea      PGUID -1  -1 f b t \054 0  0 byteain byteaout byteain byteaout i x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 17 ( bytea      PGNSP PGUID -1  -1 f b t \054 0  0 byteain byteaout byteain byteaout i x f 0 -1 0 _null_ _null_ ));
 DESCR("variable-length string, binary values escaped");
 #define BYTEAOID               17
 
-DATA(insert OID = 18 ( char       PGUID  1   1 t b t \054 0   0 charin charout charin charout c p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 18 ( char       PGNSP PGUID  1   1 t b t \054 0   0 charin charout charin charout c p f 0 -1 0 _null_ _null_ ));
 DESCR("single character");
 #define CHAROID                        18
 
-DATA(insert OID = 19 ( name       PGUID NAMEDATALEN NAMEDATALEN  f b t \054 0  18 namein nameout namein nameout i p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 19 ( name       PGNSP PGUID NAMEDATALEN NAMEDATALEN  f b t \054 0    18 namein nameout namein nameout i p f 0 -1 0 _null_ _null_ ));
 DESCR("31-character type for storing system identifiers");
 #define NAMEOID                        19
 
-DATA(insert OID = 20 ( int8       PGUID  8  20 f b t \054 0   0 int8in int8out int8in int8out d p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 20 ( int8       PGNSP PGUID  8  20 f b t \054 0   0 int8in int8out int8in int8out d p f 0 -1 0 _null_ _null_ ));
 DESCR("~18 digit integer, 8-byte storage");
 #define INT8OID                        20
 
-DATA(insert OID = 21 ( int2       PGUID  2   5 t b t \054 0   0 int2in int2out int2in int2out s p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 21 ( int2       PGNSP PGUID  2   5 t b t \054 0   0 int2in int2out int2in int2out s p f 0 -1 0 _null_ _null_ ));
 DESCR("-32 thousand to 32 thousand, 2-byte storage");
 #define INT2OID                        21
 
-DATA(insert OID = 22 ( int2vector PGUID INDEX_MAX_KEYS*2 -1 f b t \054 0  21 int2vectorin int2vectorout int2vectorin int2vectorout i p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 22 ( int2vector PGNSP PGUID INDEX_MAX_KEYS*2 -1 f b t \054 0  21 int2vectorin int2vectorout int2vectorin int2vectorout i p f 0 -1 0 _null_ _null_ ));
 DESCR("array of INDEX_MAX_KEYS int2 integers, used in system tables");
 #define INT2VECTOROID  22
 
-DATA(insert OID = 23 ( int4       PGUID  4  10 t b t \054 0   0 int4in int4out int4in int4out i p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 23 ( int4       PGNSP PGUID  4  10 t b t \054 0   0 int4in int4out int4in int4out i p f 0 -1 0 _null_ _null_ ));
 DESCR("-2 billion to 2 billion integer, 4-byte storage");
 #define INT4OID                        23
 
-DATA(insert OID = 24 ( regproc    PGUID  4  16 t b t \054 0   0 regprocin regprocout regprocin regprocout i p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 24 ( regproc    PGNSP PGUID  4  16 t b t \054 0   0 regprocin regprocout regprocin regprocout i p f 0 -1 0 _null_ _null_ ));
 DESCR("registered procedure");
 #define REGPROCOID             24
 
-DATA(insert OID = 25 ( text       PGUID -1  -1 f b t \054 0  0 textin textout textin textout i x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 25 ( text       PGNSP PGUID -1  -1 f b t \054 0  0 textin textout textin textout i x f 0 -1 0 _null_ _null_ ));
 DESCR("variable-length string, no limit specified");
 #define TEXTOID                        25
 
-DATA(insert OID = 26 ( oid                PGUID  4  10 t b t \054 0   0 oidin oidout oidin oidout i p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 26 ( oid                PGNSP PGUID  4  10 t b t \054 0   0 oidin oidout oidin oidout i p f 0 -1 0 _null_ _null_ ));
 DESCR("object identifier(oid), maximum 4 billion");
 #define OIDOID                 26
 
-DATA(insert OID = 27 ( tid                PGUID  6  19 f b t \054 0   0 tidin tidout tidin tidout i p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 27 ( tid                PGNSP PGUID  6  19 f b t \054 0   0 tidin tidout tidin tidout i p f 0 -1 0 _null_ _null_ ));
 DESCR("(Block, offset), physical location of tuple");
 #define TIDOID         27
 
-DATA(insert OID = 28 ( xid                PGUID  4  12 t b t \054 0   0 xidin xidout xidin xidout i p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 28 ( xid                PGNSP PGUID  4  12 t b t \054 0   0 xidin xidout xidin xidout i p f 0 -1 0 _null_ _null_ ));
 DESCR("transaction id");
 #define XIDOID 28
 
-DATA(insert OID = 29 ( cid                PGUID  4  10 t b t \054 0   0 cidin cidout cidin cidout i p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 29 ( cid                PGNSP PGUID  4  10 t b t \054 0   0 cidin cidout cidin cidout i p f 0 -1 0 _null_ _null_ ));
 DESCR("command identifier type, sequence in transaction id");
 #define CIDOID 29
 
-DATA(insert OID = 30 ( oidvector  PGUID INDEX_MAX_KEYS*4 -1 f b t \054 0  26 oidvectorin oidvectorout oidvectorin oidvectorout i p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 30 ( oidvector  PGNSP PGUID INDEX_MAX_KEYS*4 -1 f b t \054 0  26 oidvectorin oidvectorout oidvectorin oidvectorout i p f 0 -1 0 _null_ _null_ ));
 DESCR("array of INDEX_MAX_KEYS oids, used in system tables");
 #define OIDVECTOROID   30
 
-DATA(insert OID = 32 ( SET                PGUID -1  -1 f b t \054 0   0 textin textout textin textout i p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 32 ( SET                PGNSP PGUID -1  -1 f b t \054 0   0 textin textout textin textout i p f 0 -1 0 _null_ _null_ ));
 DESCR("set of tuples");
 
-DATA(insert OID = 71 ( pg_type          PGUID 4 4 t c t \054 1247 0 int4in int4out int4in int4out i p f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 75 ( pg_attribute PGUID 4 4 t c t \054 1249 0 int4in int4out int4in int4out i p f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 81 ( pg_proc          PGUID 4 4 t c t \054 1255 0 int4in int4out int4in int4out i p f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 83 ( pg_class         PGUID 4 4 t c t \054 1259 0 int4in int4out int4in int4out i p f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 86 ( pg_shadow        PGUID 4 4 t c t \054 1260 0 int4in int4out int4in int4out i p f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 87 ( pg_group         PGUID 4 4 t c t \054 1261 0 int4in int4out int4in int4out i p f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 88 ( pg_database  PGUID 4 4 t c t \054 1262 0 int4in int4out int4in int4out i p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 71 ( pg_type          PGNSP PGUID 4 4 t c t \054 1247 0 int4in int4out int4in int4out i p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 75 ( pg_attribute PGNSP PGUID 4 4 t c t \054 1249 0 int4in int4out int4in int4out i p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 81 ( pg_proc          PGNSP PGUID 4 4 t c t \054 1255 0 int4in int4out int4in int4out i p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 83 ( pg_class         PGNSP PGUID 4 4 t c t \054 1259 0 int4in int4out int4in int4out i p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 86 ( pg_shadow        PGNSP PGUID 4 4 t c t \054 1260 0 int4in int4out int4in int4out i p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 87 ( pg_group         PGNSP PGUID 4 4 t c t \054 1261 0 int4in int4out int4in int4out i p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 88 ( pg_database  PGNSP PGUID 4 4 t c t \054 1262 0 int4in int4out int4in int4out i p f 0 -1 0 _null_ _null_ ));
 
 /* OIDS 100 - 199 */
 
 /* OIDS 200 - 299 */
 
-DATA(insert OID = 210 (  smgr     PGUID 2      12 t b t \054 0 0 smgrin smgrout smgrin smgrout s p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 210 (  smgr     PGNSP PGUID 2        12 t b t \054 0 0 smgrin smgrout smgrin smgrout s p f 0 -1 0 _null_ _null_ ));
 DESCR("storage manager");
 
 /* OIDS 300 - 399 */
@@ -325,192 +327,194 @@ DESCR("storage manager");
 /* OIDS 500 - 599 */
 
 /* OIDS 600 - 699 */
-DATA(insert OID = 600 (  point    PGUID 16  24 f b t \054 0 701 point_in point_out point_in point_out d p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 600 (  point    PGNSP PGUID 16  24 f b t \054 0 701 point_in point_out point_in point_out d p f 0 -1 0 _null_ _null_ ));
 DESCR("geometric point '(x, y)'");
 #define POINTOID               600
-DATA(insert OID = 601 (  lseg     PGUID 32  48 f b t \054 0 600 lseg_in lseg_out lseg_in lseg_out d p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 601 (  lseg     PGNSP PGUID 32  48 f b t \054 0 600 lseg_in lseg_out lseg_in lseg_out d p f 0 -1 0 _null_ _null_ ));
 DESCR("geometric line segment '(pt1,pt2)'");
 #define LSEGOID                        601
-DATA(insert OID = 602 (  path     PGUID -1  -1 f b t \054 0 0 path_in path_out path_in path_out d x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 602 (  path     PGNSP PGUID -1  -1 f b t \054 0 0 path_in path_out path_in path_out d x f 0 -1 0 _null_ _null_ ));
 DESCR("geometric path '(pt1,...)'");
 #define PATHOID                        602
-DATA(insert OID = 603 (  box      PGUID 32 100 f b t \073 0 600 box_in box_out box_in box_out d p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 603 (  box      PGNSP PGUID 32 100 f b t \073 0 600 box_in box_out box_in box_out d p f 0 -1 0 _null_ _null_ ));
 DESCR("geometric box '(lower left,upper right)'");
 #define BOXOID                 603
-DATA(insert OID = 604 (  polygon   PGUID -1  -1 f b t \054 0   0 poly_in poly_out poly_in poly_out d x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 604 (  polygon   PGNSP PGUID -1  -1 f b t \054 0   0 poly_in poly_out poly_in poly_out d x f 0 -1 0 _null_ _null_ ));
 DESCR("geometric polygon '(pt1,...)'");
 #define POLYGONOID             604
 
-DATA(insert OID = 628 (  line     PGUID 32  48 f b t \054 0 701 line_in line_out line_in line_out d p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 628 (  line     PGNSP PGUID 32  48 f b t \054 0 701 line_in line_out line_in line_out d p f 0 -1 0 _null_ _null_ ));
 DESCR("geometric line '(pt1,pt2)'");
 #define LINEOID                        628
-DATA(insert OID = 629 (  _line    PGUID  -1 -1 f b t \054 0 628 array_in array_out array_in array_out d x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 629 (  _line    PGNSP PGUID  -1 -1 f b t \054 0 628 array_in array_out array_in array_out d x f 0 -1 0 _null_ _null_ ));
 DESCR("");
 
 /* OIDS 700 - 799 */
 
-DATA(insert OID = 700 (  float4    PGUID  4  12 f b t \054 0   0 float4in float4out float4in float4out i p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 700 (  float4    PGNSP PGUID  4  12 f b t \054 0   0 float4in float4out float4in float4out i p f 0 -1 0 _null_ _null_ ));
 DESCR("single-precision floating point number, 4-byte storage");
 #define FLOAT4OID 700
-DATA(insert OID = 701 (  float8    PGUID  8  24 f b t \054 0   0 float8in float8out float8in float8out d p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 701 (  float8    PGNSP PGUID  8  24 f b t \054 0   0 float8in float8out float8in float8out d p f 0 -1 0 _null_ _null_ ));
 DESCR("double-precision floating point number, 8-byte storage");
 #define FLOAT8OID 701
-DATA(insert OID = 702 (  abstime   PGUID  4  20 t b t \054 0   0 nabstimein nabstimeout nabstimein nabstimeout i p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 702 (  abstime   PGNSP PGUID  4  20 t b t \054 0   0 nabstimein nabstimeout nabstimein nabstimeout i p f 0 -1 0 _null_ _null_ ));
 DESCR("absolute, limited-range date and time (Unix system time)");
 #define ABSTIMEOID             702
-DATA(insert OID = 703 (  reltime   PGUID  4  20 t b t \054 0   0 reltimein reltimeout reltimein reltimeout i p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 703 (  reltime   PGNSP PGUID  4  20 t b t \054 0   0 reltimein reltimeout reltimein reltimeout i p f 0 -1 0 _null_ _null_ ));
 DESCR("relative, limited-range time interval (Unix delta time)");
 #define RELTIMEOID             703
-DATA(insert OID = 704 (  tinterval PGUID 12  47 f b t \054 0   0 tintervalin tintervalout tintervalin tintervalout i p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 704 (  tinterval PGNSP PGUID 12  47 f b t \054 0   0 tintervalin tintervalout tintervalin tintervalout i p f 0 -1 0 _null_ _null_ ));
 DESCR("(abstime,abstime), time interval");
 #define TINTERVALOID   704
-DATA(insert OID = 705 (  unknown   PGUID -1  -1 f b t \054 0   0 textin textout textin textout i p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 705 (  unknown   PGNSP PGUID -1  -1 f b t \054 0   0 textin textout textin textout i p f 0 -1 0 _null_ _null_ ));
 DESCR("");
 #define UNKNOWNOID             705
 
-DATA(insert OID = 718 (  circle    PGUID  24 47 f b t \054 0   0 circle_in circle_out circle_in circle_out d p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 718 (  circle    PGNSP PGUID  24 47 f b t \054 0     0 circle_in circle_out circle_in circle_out d p f 0 -1 0 _null_ _null_ ));
 DESCR("geometric circle '(center,radius)'");
 #define CIRCLEOID              718
-DATA(insert OID = 719 (  _circle   PGUID  -1 -1 f b t \054 0  718 array_in array_out array_in array_out d x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 790 (  money    PGUID   4 24 f b t \054 0    0 cash_in cash_out cash_in cash_out i p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 719 (  _circle   PGNSP PGUID  -1 -1 f b t \054 0  718 array_in array_out array_in array_out d x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 790 (  money    PGNSP PGUID   4 24 f b t \054 0      0 cash_in cash_out cash_in cash_out i p f 0 -1 0 _null_ _null_ ));
 DESCR("$d,ddd.cc, money");
 #define CASHOID 790
-DATA(insert OID = 791 (  _money    PGUID  -1 -1 f b t \054 0  790 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 791 (  _money    PGNSP PGUID  -1 -1 f b t \054 0  790 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
 
 /* OIDS 800 - 899 */
-DATA(insert OID = 829 ( macaddr    PGUID  6 -1 f b t \054 0 0 macaddr_in macaddr_out macaddr_in macaddr_out i p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 829 ( macaddr    PGNSP PGUID  6 -1 f b t \054 0 0 macaddr_in macaddr_out macaddr_in macaddr_out i p f 0 -1 0 _null_ _null_ ));
 DESCR("XX:XX:XX:XX:XX:XX, MAC address");
 #define MACADDROID 829
-DATA(insert OID = 869 ( inet      PGUID  -1 -1 f b t \054 0 0 inet_in inet_out inet_in inet_out i p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 869 ( inet      PGNSP PGUID  -1 -1 f b t \054 0 0 inet_in inet_out inet_in inet_out i p f 0 -1 0 _null_ _null_ ));
 DESCR("IP address/netmask, host address, netmask optional");
 #define INETOID 869
-DATA(insert OID = 650 ( cidr      PGUID  -1 -1 f b t \054 0 0 cidr_in cidr_out cidr_in cidr_out i p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 650 ( cidr      PGNSP PGUID  -1 -1 f b t \054 0 0 cidr_in cidr_out cidr_in cidr_out i p f 0 -1 0 _null_ _null_ ));
 DESCR("network IP address/netmask, network address");
 #define CIDROID 650
 
 /* OIDS 900 - 999 */
 
 /* OIDS 1000 - 1099 */
-DATA(insert OID = 1000 (  _bool                 PGUID -1  -1 f b t \054 0      16 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 1001 (  _bytea        PGUID -1  -1 f b t \054 0      17 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 1002 (  _char                 PGUID -1  -1 f b t \054 0      18 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 1003 (  _name                 PGUID -1  -1 f b t \054 0      19 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 1005 (  _int2                 PGUID -1  -1 f b t \054 0      21 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 1006 (  _int2vector PGUID -1 -1 f b t \054 0 22 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 1007 (  _int4                 PGUID -1  -1 f b t \054 0      23 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 1008 (  _regproc      PGUID -1  -1 f b t \054 0      24 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 1009 (  _text                 PGUID -1  -1 f b t \054 0      25 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 1028 (  _oid          PGUID -1  -1 f b t \054 0      26 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 1010 (  _tid          PGUID -1  -1 f b t \054 0      27 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 1011 (  _xid          PGUID -1  -1 f b t \054 0      28 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 1012 (  _cid          PGUID -1  -1 f b t \054 0      29 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 1013 (  _oidvector PGUID -1  -1 f b t \054 0 30 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 1014 (  _bpchar       PGUID -1  -1 f b t \054 0 1042 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 1015 (  _varchar      PGUID -1  -1 f b t \054 0 1043 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 1016 (  _int8                 PGUID -1  -1 f b t \054 0      20 array_in array_out array_in array_out d x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 1017 (  _point        PGUID -1  -1 f b t \054 0 600 array_in array_out array_in array_out d x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 1018 (  _lseg                 PGUID -1  -1 f b t \054 0 601 array_in array_out array_in array_out d x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 1019 (  _path                 PGUID -1  -1 f b t \054 0 602 array_in array_out array_in array_out d x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 1020 (  _box          PGUID -1  -1 f b t \073 0 603 array_in array_out array_in array_out d x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 1021 (  _float4       PGUID -1  -1 f b t \054 0 700 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 1022 (  _float8       PGUID -1  -1 f b t \054 0 701 array_in array_out array_in array_out d x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 1023 (  _abstime      PGUID -1  -1 f b t \054 0 702 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 1024 (  _reltime      PGUID -1  -1 f b t \054 0 703 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 1025 (  _tinterval PGUID -1  -1 f b t \054 0 704 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 1027 (  _polygon      PGUID -1  -1 f b t \054 0 604 array_in array_out array_in array_out d x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1000 (  _bool                 PGNSP PGUID -1  -1 f b t \054 0        16 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1001 (  _bytea        PGNSP PGUID -1  -1 f b t \054 0        17 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1002 (  _char                 PGNSP PGUID -1  -1 f b t \054 0        18 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1003 (  _name                 PGNSP PGUID -1  -1 f b t \054 0        19 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1005 (  _int2                 PGNSP PGUID -1  -1 f b t \054 0        21 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1006 (  _int2vector PGNSP PGUID -1 -1 f b t \054 0   22 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1007 (  _int4                 PGNSP PGUID -1  -1 f b t \054 0        23 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1008 (  _regproc      PGNSP PGUID -1  -1 f b t \054 0        24 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1009 (  _text                 PGNSP PGUID -1  -1 f b t \054 0        25 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1028 (  _oid          PGNSP PGUID -1  -1 f b t \054 0        26 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1010 (  _tid          PGNSP PGUID -1  -1 f b t \054 0        27 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1011 (  _xid          PGNSP PGUID -1  -1 f b t \054 0        28 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1012 (  _cid          PGNSP PGUID -1  -1 f b t \054 0        29 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1013 (  _oidvector PGNSP PGUID -1  -1 f b t \054 0   30 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1014 (  _bpchar       PGNSP PGUID -1  -1 f b t \054 0 1042 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1015 (  _varchar      PGNSP PGUID -1  -1 f b t \054 0 1043 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1016 (  _int8                 PGNSP PGUID -1  -1 f b t \054 0        20 array_in array_out array_in array_out d x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1017 (  _point        PGNSP PGUID -1  -1 f b t \054 0 600 array_in array_out array_in array_out d x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1018 (  _lseg                 PGNSP PGUID -1  -1 f b t \054 0 601 array_in array_out array_in array_out d x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1019 (  _path                 PGNSP PGUID -1  -1 f b t \054 0 602 array_in array_out array_in array_out d x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1020 (  _box          PGNSP PGUID -1  -1 f b t \073 0 603 array_in array_out array_in array_out d x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1021 (  _float4       PGNSP PGUID -1  -1 f b t \054 0 700 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1022 (  _float8       PGNSP PGUID -1  -1 f b t \054 0 701 array_in array_out array_in array_out d x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1023 (  _abstime      PGNSP PGUID -1  -1 f b t \054 0 702 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1024 (  _reltime      PGNSP PGUID -1  -1 f b t \054 0 703 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1025 (  _tinterval PGNSP PGUID -1  -1 f b t \054 0 704 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1027 (  _polygon      PGNSP PGUID -1  -1 f b t \054 0 604 array_in array_out array_in array_out d x f 0 -1 0 _null_ _null_ ));
 /*
  *     Note: the size of aclitem needs to match sizeof(AclItem) in acl.h.
  *     Thanks to some padding, this will be 8 on all platforms.
  *     We also have an Assert to make sure.
  */
 #define ACLITEMSIZE 8
-DATA(insert OID = 1033 (  aclitem       PGUID 8   -1 f b t \054 0 0 aclitemin aclitemout aclitemin aclitemout i p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1033 (  aclitem       PGNSP PGUID 8   -1 f b t \054 0 0 aclitemin aclitemout aclitemin aclitemout i p f 0 -1 0 _null_ _null_ ));
 DESCR("access control list");
-DATA(insert OID = 1034 (  _aclitem      PGUID -1 -1 f b t \054 0 1033 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 1040 (  _macaddr      PGUID -1 -1 f b t \054 0  829 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 1041 (  _inet    PGUID -1 -1 f b t \054 0  869 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 651  (  _cidr    PGUID -1 -1 f b t \054 0  650 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 1042 ( bpchar                 PGUID -1  -1 f b t \054 0      0 bpcharin bpcharout bpcharin bpcharout i x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1034 (  _aclitem      PGNSP PGUID -1 -1 f b t \054 0 1033 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1040 (  _macaddr      PGNSP PGUID -1 -1 f b t \054 0  829 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1041 (  _inet    PGNSP PGUID -1 -1 f b t \054 0  869 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 651  (  _cidr    PGNSP PGUID -1 -1 f b t \054 0  650 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1042 ( bpchar                 PGNSP PGUID -1  -1 f b t \054 0        0 bpcharin bpcharout bpcharin bpcharout i x f 0 -1 0 _null_ _null_ ));
 DESCR("char(length), blank-padded string, fixed storage length");
 #define BPCHAROID              1042
-DATA(insert OID = 1043 ( varchar        PGUID -1  -1 f b t \054 0      0 varcharin varcharout varcharin varcharout i x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1043 ( varchar        PGNSP PGUID -1  -1 f b t \054 0        0 varcharin varcharout varcharin varcharout i x f 0 -1 0 _null_ _null_ ));
 DESCR("varchar(length), non-blank-padded string, variable storage length");
 #define VARCHAROID             1043
 
-DATA(insert OID = 1082 ( date           PGUID  4  10 t b t \054 0      0 date_in date_out date_in date_out i p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1082 ( date           PGNSP PGUID    4  10 t b t \054 0      0 date_in date_out date_in date_out i p f 0 -1 0 _null_ _null_ ));
 DESCR("ANSI SQL date");
 #define DATEOID                        1082
-DATA(insert OID = 1083 ( time           PGUID  8  16 f b t \054 0      0 time_in time_out time_in time_out d p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1083 ( time           PGNSP PGUID    8  16 f b t \054 0      0 time_in time_out time_in time_out d p f 0 -1 0 _null_ _null_ ));
 DESCR("hh:mm:ss, ANSI SQL time");
 #define TIMEOID                        1083
 
 /* OIDS 1100 - 1199 */
-DATA(insert OID = 1114 ( timestamp      PGUID  8  47 f b t \054 0      0 timestamp_in timestamp_out timestamp_in timestamp_out d p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1114 ( timestamp      PGNSP PGUID    8  47 f b t \054 0      0 timestamp_in timestamp_out timestamp_in timestamp_out d p f 0 -1 0 _null_ _null_ ));
 DESCR("date and time");
 #define TIMESTAMPOID   1114
-DATA(insert OID = 1115 ( _timestamp  PGUID     -1 -1 f b t \054 0      1184 array_in array_out array_in array_out d x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 1182 ( _date          PGUID  -1 -1 f b t \054 0      1082 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 1183 ( _time          PGUID  -1 -1 f b t \054 0      1083 array_in array_out array_in array_out d x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 1184 ( timestamptz PGUID     8  47 f b t \054 0      0 timestamptz_in timestamptz_out timestamptz_in timestamptz_out d p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1115 ( _timestamp  PGNSP PGUID       -1 -1 f b t \054 0      1184 array_in array_out array_in array_out d x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1182 ( _date          PGNSP PGUID    -1 -1 f b t \054 0      1082 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1183 ( _time          PGNSP PGUID    -1 -1 f b t \054 0      1083 array_in array_out array_in array_out d x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1184 ( timestamptz PGNSP PGUID       8  47 f b t \054 0      0 timestamptz_in timestamptz_out timestamptz_in timestamptz_out d p f 0 -1 0 _null_ _null_ ));
 DESCR("date and time with time zone");
 #define TIMESTAMPTZOID 1184
-DATA(insert OID = 1185 ( _timestamptz PGUID -1 -1 f b t \054 0 1184 array_in array_out array_in array_out d x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 1186 ( interval       PGUID 12  47 f b t \054 0      0 interval_in interval_out interval_in interval_out d p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1185 ( _timestamptz PGNSP PGUID -1 -1 f b t \054 0   1184 array_in array_out array_in array_out d x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1186 ( interval       PGNSP PGUID 12  47 f b t \054 0        0 interval_in interval_out interval_in interval_out d p f 0 -1 0 _null_ _null_ ));
 DESCR("@ <number> <units>, time interval");
 #define INTERVALOID            1186
-DATA(insert OID = 1187 ( _interval      PGUID  -1 -1 f b t \054 0      1186 array_in array_out array_in array_out d x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1187 ( _interval      PGNSP PGUID    -1 -1 f b t \054 0      1186 array_in array_out array_in array_out d x f 0 -1 0 _null_ _null_ ));
 
 /* OIDS 1200 - 1299 */
-DATA(insert OID = 1231 (  _numeric      PGUID -1  -1 f b t \054 0      1700 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 1266 ( timetz                 PGUID 12  22 f b t \054 0      0 timetz_in timetz_out timetz_in timetz_out d p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1231 (  _numeric      PGNSP PGUID -1  -1 f b t \054 0        1700 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1266 ( timetz                 PGNSP PGUID 12  22 f b t \054 0        0 timetz_in timetz_out timetz_in timetz_out d p f 0 -1 0 _null_ _null_ ));
 DESCR("hh:mm:ss, ANSI SQL time");
 #define TIMETZOID              1266
-DATA(insert OID = 1270 ( _timetz        PGUID  -1 -1 f b t \054 0      1266 array_in array_out array_in array_out d x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1270 ( _timetz        PGNSP PGUID    -1 -1 f b t \054 0      1266 array_in array_out array_in array_out d x f 0 -1 0 _null_ _null_ ));
 
 /* OIDS 1500 - 1599 */
-DATA(insert OID = 1560 ( bit            PGUID -1  -1 f b t \054 0      0 bit_in bit_out bit_in bit_out i x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1560 ( bit            PGNSP PGUID -1  -1 f b t \054 0        0 bit_in bit_out bit_in bit_out i x f 0 -1 0 _null_ _null_ ));
 DESCR("fixed-length bit string");
 #define BITOID  1560
-DATA(insert OID = 1561 ( _bit           PGUID  -1 -1 f b t \054 0      1560 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 1562 ( varbit                 PGUID -1  -1 f b t \054 0      0 varbit_in varbit_out varbit_in varbit_out i x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1561 ( _bit           PGNSP PGUID    -1 -1 f b t \054 0      1560 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1562 ( varbit                 PGNSP PGUID -1  -1 f b t \054 0        0 varbit_in varbit_out varbit_in varbit_out i x f 0 -1 0 _null_ _null_ ));
 DESCR("variable-length bit string");
 #define VARBITOID        1562
-DATA(insert OID = 1563 ( _varbit        PGUID  -1 -1 f b t \054 0      1562 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1563 ( _varbit        PGNSP PGUID    -1 -1 f b t \054 0      1562 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
 
 /* OIDS 1600 - 1699 */
 
 /* OIDS 1700 - 1799 */
-DATA(insert OID = 1700 ( numeric          PGUID -1  -1 f b t \054 0  0 numeric_in numeric_out numeric_in numeric_out i m f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1700 ( numeric          PGNSP PGUID -1  -1 f b t \054 0  0 numeric_in numeric_out numeric_in numeric_out i m f 0 -1 0 _null_ _null_ ));
 DESCR("numeric(precision, decimal), arbitrary precision number");
 #define NUMERICOID             1700
 
-/* OID 1790 */
-DATA(insert OID = 1790 ( refcursor        PGUID -1  -1 f b t \054 0  0 textin textout textin textout i x f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 1790 ( refcursor        PGNSP PGUID -1  -1 f b t \054 0  0 textin textout textin textout i x f 0 -1 0 _null_ _null_ ));
 DESCR("reference cursor (portal name)");
 #define REFCURSOROID   1790
 
+/* OIDS 2000 - 2099 */
+DATA(insert OID = 2019 ( _refcursor       PGNSP PGUID -1  -1 f b t \054 0 1790 array_in array_out array_in array_out i x f 0 -1 0 _null_ _null_ ));
+
 
 /*
  * prototypes for functions in pg_type.c
  */
-extern Oid     TypeGet(char *typeName, bool *defined);
-extern Oid     TypeShellMake(char *typeName);
+extern Oid     TypeShellMake(const char *typeName, Oid typeNamespace);
 
-extern Oid TypeCreate(char *typeName,
+extern Oid TypeCreate(const char *typeName,
+                  Oid typeNamespace,
                   Oid assignedTypeOid,
                   Oid relationOid,
                   int16 internalSize,
                   int16 externalSize,
                   char typeType,
                   char typDelim,
-                  char *inputProcedure,
-                  char *outputProcedure,
-                  char *receiveProcedure,
-                  char *sendProcedure,
-                  char *elementTypeName,
-                  char *baseTypeName,
-                  char *defaultTypeValue,
-                  char *defaultTypeBin,
+                  Oid inputProcedure,
+                  Oid outputProcedure,
+                  Oid receiveProcedure,
+                  Oid sendProcedure,
+                  Oid elementType,
+                  Oid baseType,
+                  const char *defaultTypeValue,
+                  const char *defaultTypeBin,
                   bool passedByValue,
                   char alignment,
                   char storage,
@@ -519,7 +523,8 @@ extern Oid TypeCreate(char *typeName,
                   bool typeNotNull);
 
 
-extern void TypeRename(const char *oldTypeName, const char *newTypeName);
-extern char *makeArrayTypeName(char *typeName);
+extern void TypeRename(const char *oldTypeName, Oid typeNamespace,
+                                          const char *newTypeName);
+extern char *makeArrayTypeName(const char *typeName);
 
 #endif   /* PG_TYPE_H */
index 1601898b40503ef7df99fcf5cb25dc3617e5f448..73c33ac3c7eb033121073a67850624120e7c2001 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: command.h,v 1.35 2002/03/26 19:16:40 tgl Exp $
+ * $Id: command.h,v 1.36 2002/03/29 19:06:21 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -40,31 +40,27 @@ extern void PortalCleanup(Portal portal);
 /*
  * ALTER TABLE variants
  */
-extern void AlterTableAddColumn(const char *relationName,
-                                       bool inh, ColumnDef *colDef);
+extern void AlterTableAddColumn(Oid myrelid, bool inherits, ColumnDef *colDef);
 
-extern void AlterTableAlterColumnDefault(const char *relationName,
-                                                        bool inh, const char *colName,
-                                                        Node *newDefault);
+extern void AlterTableAlterColumnDefault(Oid myrelid, bool inh,
+                                                                                const char *colName, Node *newDefault);
 
-extern void AlterTableAlterColumnFlags(const char *relationName,
-                                                               bool inh, const char *colName,
-                                                               Node *flagValue, const char *flagType);
+extern void AlterTableAlterColumnFlags(Oid myrelid,
+                                                                          bool inh, const char *colName,
+                                                                          Node *flagValue, const char *flagType);
 
-extern void AlterTableDropColumn(const char *relationName,
-                                        bool inh, const char *colName,
-                                        int behavior);
+extern void AlterTableDropColumn(Oid myrelid, bool inh,
+                                                                const char *colName, int behavior);
 
-extern void AlterTableAddConstraint(char *relationName,
-                                               bool inh, List *newConstraints);
+extern void AlterTableAddConstraint(Oid myrelid,
+                                                                       bool inh, List *newConstraints);
 
-extern void AlterTableDropConstraint(const char *relationName,
-                                                bool inh, const char *constrName,
-                                                int behavior);
+extern void AlterTableDropConstraint(Oid myrelid,
+                                                                        bool inh, const char *constrName, int behavior);
 
 extern void AlterTableCreateToastTable(Oid relOid, bool silent);
 
-extern void AlterTableOwner(const RangeVar *tgtrel, const char *newOwnerName);
+extern void AlterTableOwner(Oid relationOid, int32 newOwnerSysId);
 
 /*
  * LOCK
index 555c5c4d5c84bb8797d05e919381ab7cd37670a6..e0a4ecdcd4053f80755b15652d01cbc9d8eba6ea 100644 (file)
@@ -7,16 +7,19 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: copy.h,v 1.16 2001/11/05 17:46:33 momjian Exp $
+ * $Id: copy.h,v 1.17 2002/03/29 19:06:21 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
 #ifndef COPY_H
 #define COPY_H
 
+#include "nodes/primnodes.h"
+
 extern int     copy_lineno;
 
-void DoCopy(char *relname, bool binary, bool oids, bool from, bool pipe,
-          char *filename, char *delim, char *null_print);
+void DoCopy(const RangeVar *relation, bool binary, bool oids,
+                       bool from, bool pipe,
+                       char *filename, char *delim, char *null_print);
 
 #endif   /* COPY_H */
index 90f5df63d33c804144b99e4d707cd21998a93ec7..fe0f2bc35128a16f6e7c2664f149f460a089236d 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: creatinh.h,v 1.19 2002/03/22 02:56:36 tgl Exp $
+ * $Id: creatinh.h,v 1.20 2002/03/29 19:06:22 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -17,7 +17,7 @@
 #include "nodes/parsenodes.h"
 
 extern Oid     DefineRelation(CreateStmt *stmt, char relkind);
-extern void RemoveRelation(const char *name);
-extern void TruncateRelation(const char *name);
+extern void RemoveRelation(const RangeVar *relation);
+extern void TruncateRelation(const RangeVar *relation);
 
 #endif   /* CREATINH_H */
index 97924979c28b3d4f31846e700b966397368d2312..69f180ec1622e9afe80796a77882ec390fcfcd9c 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: defrem.h,v 1.32 2002/03/26 19:16:47 tgl Exp $
+ * $Id: defrem.h,v 1.33 2002/03/29 19:06:22 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -36,19 +36,19 @@ extern void ReindexDatabase(const char *databaseName, bool force, bool all);
  * prototypes in define.c
  */
 extern void CreateFunction(ProcedureStmt *stmt);
-extern void DefineOperator(char *name, List *parameters);
-extern void DefineAggregate(char *name, List *parameters);
-extern void DefineType(char *name, List *parameters);
+extern void DefineOperator(List *names, List *parameters);
+extern void DefineAggregate(List *names, List *parameters);
+extern void DefineType(List *names, List *parameters);
 extern void DefineDomain(CreateDomainStmt *stmt);
 
 /*
  * prototypes in remove.c
  */
-extern void RemoveDomain(char *domainName, int behavior);
+extern void RemoveDomain(List *names, int behavior);
 extern void RemoveFunction(char *functionName, List *argTypes);
 extern void RemoveOperator(char *operatorName,
-                          char *typeName1, char *typeName2);
-extern void RemoveType(char *typeName);
-extern void RemoveAggregate(char *aggName, char *aggType);
+                          TypeName *typeName1, TypeName *typeName2);
+extern void RemoveType(List *names);
+extern void RemoveAggregate(char *aggName, TypeName *aggType);
 
 #endif   /* DEFREM_H */
index 7bfd04791673712f206ad897170caa5871bcf815..28aebc01d91b769b9b5134c92d2d1fea99ef6d58 100644 (file)
@@ -7,17 +7,17 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: rename.h,v 1.14 2002/03/26 19:16:49 tgl Exp $
+ * $Id: rename.h,v 1.15 2002/03/29 19:06:22 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
 #ifndef RENAME_H
 #define RENAME_H
 
-extern void renameatt(char *relname,
+extern void renameatt(Oid relid,
                  char *oldattname,
                  char *newattname,
-                 int recurse);
+                 bool recurse);
 
 extern void renamerel(const RangeVar *relation,
                  const char *newrelname);
index de6fdcee97fc44858abe1feb74617c0b30922439..f021cb24fd69cdadc96d104fe9a54e3c51d5de65 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: view.h,v 1.13 2001/11/05 17:46:33 momjian Exp $
+ * $Id: view.h,v 1.14 2002/03/29 19:06:22 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -16,7 +16,7 @@
 
 #include "nodes/parsenodes.h"
 
-extern void DefineView(char *view_name, Query *view_parse);
-extern void RemoveView(char *view_name);
+extern void DefineView(const RangeVar *view, Query *view_parse);
+extern void RemoveView(const RangeVar *view);
 
 #endif   /* VIEW_H */
index 52c224b18f981cf995d3af156cf3327e9bfee4cf..905f803891af27f6ccc9ede3bc86c45f980ef5c0 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: makefuncs.h,v 1.33 2002/03/22 02:56:36 tgl Exp $
+ * $Id: makefuncs.h,v 1.34 2002/03/29 19:06:23 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -50,4 +50,6 @@ extern RelabelType *makeRelabelType(Node *arg, Oid rtype, int32 rtypmod);
 
 extern RangeVar *makeRangeVar(char *schemaname, char *relname);
 
+extern TypeName *makeTypeName(char *typnam);
+
 #endif   /* MAKEFUNC_H */
index e66e7b8b646f6189be4f37443ef5befd2f7c72f2..4e08940f7b5732b1d912501e056548a11c8506a9 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: parsenodes.h,v 1.165 2002/03/26 19:16:53 tgl Exp $
+ * $Id: parsenodes.h,v 1.166 2002/03/29 19:06:23 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -104,16 +104,25 @@ typedef struct Query
 
 /*
  * TypeName - specifies a type in definitions
+ *
+ * For TypeName structures generated internally, it is often easier to
+ * specify the type by OID than by name.  If "names" is NIL then the
+ * actual type OID is given by typeid, otherwise typeid is unused.
+ *
+ * If pct_type is TRUE, then names is actually a field name and we look up
+ * the type of that field.  Otherwise (the normal case), names is a type
+ * name possibly qualified with schema and database name.
  */
 typedef struct TypeName
 {
        NodeTag         type;
-       char       *name;                       /* name of the type */
+       List       *names;                      /* qualified name (list of Value strings) */
+       Oid                     typeid;                 /* type identified by OID */
        bool            timezone;               /* timezone specified? */
        bool            setof;                  /* is a set? */
+       bool            pct_type;               /* %TYPE specified? */
        int32           typmod;                 /* type modifier */
        List       *arrayBounds;        /* array bounds */
-       char       *attrname;           /* field name when using %TYPE */
 } TypeName;
 
 /*
@@ -1023,7 +1032,7 @@ typedef struct DefineStmt
 {
        NodeTag         type;
        int                     defType;                /* OPERATOR|TYPE_P|AGGREGATE */
-       char       *defname;
+       List       *defnames;           /* qualified name (list of Value strings) */
        List       *definition;         /* a list of DefElem */
 } DefineStmt;
 
@@ -1034,9 +1043,9 @@ typedef struct DefineStmt
 typedef struct CreateDomainStmt
 {
        NodeTag         type;
-       char       *domainname;                 /* name of domain to create */
-       TypeName   *typename;                   /* the base type */
-       List       *constraints;                /* constraints (list of Constraint nodes) */
+       List       *domainname;         /* qualified name (list of Value strings) */
+       TypeName   *typename;           /* the base type */
+       List       *constraints;        /* constraints (list of Constraint nodes) */
 } CreateDomainStmt;
 
 /* ----------------------
@@ -1055,7 +1064,7 @@ typedef struct CreateDomainStmt
 typedef struct DropStmt
 {
        NodeTag         type;
-       List       *objects;
+       List       *objects;            /* list of sublists of names (as Values) */
        int                     removeType;
        int                     behavior;               /* CASCADE or RESTRICT drop behavior */
 } DropStmt;
@@ -1135,9 +1144,9 @@ typedef struct ProcedureStmt
 {
        NodeTag         type;
        bool            replace;                /* T => replace if already exists */
-       char       *funcname;           /* name of function to create */
+       List       *funcname;           /* name of function to create */
        List       *argTypes;           /* list of argument types (TypeName nodes) */
-       Node       *returnType;         /* the return type (a TypeName node) */
+       TypeName   *returnType;         /* the return type */
        List       *withClause;         /* a list of DefElem */
        List       *as;                         /* definition of function body */
        char       *language;           /* C, SQL, etc */
@@ -1151,7 +1160,7 @@ typedef struct RemoveAggrStmt
 {
        NodeTag         type;
        char       *aggname;            /* aggregate to drop */
-       Node       *aggtype;            /* TypeName for input datatype, or NULL */
+       TypeName   *aggtype;            /* TypeName for input datatype, or NULL */
 } RemoveAggrStmt;
 
 /* ----------------------
index e330f8c249a44a479b0f07d7c4d31aeee1a78c91..1f05a7c0d5c612fd5fda8c9b2f6bf15cfeb12bd5 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: parse_expr.h,v 1.26 2002/03/21 16:01:59 tgl Exp $
+ * $Id: parse_expr.h,v 1.27 2002/03/29 19:06:24 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -26,6 +26,5 @@ extern Oid    exprType(Node *expr);
 extern int32 exprTypmod(Node *expr);
 extern bool exprIsLengthCoercion(Node *expr, int32 *coercedTypmod);
 extern void parse_expr_init(void);
-extern char *TypeNameToInternalName(TypeName *typename);
 
 #endif   /* PARSE_EXPR_H */
index 603ea9369c620bfd0db0f6c6ffa442c35d3a3917..01e5b16e2b5d54a88c91a8c44778263559726471 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: parse_func.h,v 1.36 2002/03/21 16:02:01 tgl Exp $
+ * $Id: parse_func.h,v 1.37 2002/03/29 19:06:24 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -58,7 +58,8 @@ extern FuncDetailCode func_get_detail(char *funcname, List *fargs,
 
 extern bool typeInheritsFrom(Oid subclassTypeId, Oid superclassTypeId);
 
-extern void func_error(char *caller, char *funcname,
-                  int nargs, Oid *argtypes, char *msg);
+extern void func_error(const char *caller, const char *funcname,
+                                          int nargs, const Oid *argtypes,
+                                          const char *msg);
 
 #endif   /* PARSE_FUNC_H */
index 3d46601e980489619d40ebc9b2e52867c317e377..d883a2b33165a2a3e333f5d81bc9caefaa542551 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: parse_type.h,v 1.20 2001/11/05 17:46:35 momjian Exp $
+ * $Id: parse_type.h,v 1.21 2002/03/29 19:06:25 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
 #define PARSE_TYPE_H
 
 #include "access/htup.h"
+#include "parser/parse_node.h"
+
 
 typedef HeapTuple Type;
 
+extern Oid     LookupTypeName(const TypeName *typename);
+extern char *TypeNameToString(const TypeName *typename);
+extern Oid     typenameTypeId(const TypeName *typename);
+extern Type typenameType(const TypeName *typename);
+
 extern bool typeidIsValid(Oid id);
 extern Type typeidType(Oid id);
-extern Type typenameType(char *s);
 
 extern Oid     typeTypeId(Type tp);
 extern int16 typeLen(Type t);
@@ -32,7 +38,6 @@ extern Datum stringTypeDatum(Type tp, char *string, int32 atttypmod);
 
 extern char *typeidTypeName(Oid id);
 extern Oid     typeidTypeRelid(Oid type_id);
-extern Oid     typenameTypeId(char *s);
 
 extern void parseTypeString(const char *str, Oid *type_id, int32 *typmod);
 
index ccfc2dbb12bb76c4e8d1e2f471d9a7a1abe2ef97..ac79e6c919bf068d7e95dfc88a73e71b23d8159b 100644 (file)
@@ -7,14 +7,14 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: rewriteRemove.h,v 1.11 2002/03/21 23:27:24 tgl Exp $
+ * $Id: rewriteRemove.h,v 1.12 2002/03/29 19:06:26 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
 #ifndef REWRITEREMOVE_H
 #define REWRITEREMOVE_H
 
-extern void RemoveRewriteRule(char *ruleName);
+extern void RemoveRewriteRule(List *names);
 extern void RelationRemoveRules(Oid relid);
 
 #endif   /* REWRITEREMOVE_H */
index a18ed52107408864d2e51e66f8563d4bf3705a5a..90130178ca183d5a6bc6290e9b9d21b5a8654348 100644 (file)
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: lsyscache.h,v 1.46 2002/03/26 19:16:57 tgl Exp $
+ * $Id: lsyscache.h,v 1.47 2002/03/29 19:06:26 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -42,6 +42,7 @@ extern bool func_iscachable(Oid funcid);
 extern Oid     get_relname_relid(const char *relname, Oid relnamespace);
 extern char *get_rel_name(Oid relid);
 extern Oid     get_rel_type_id(Oid relid);
+extern bool get_typisdefined(Oid typid);
 extern int16 get_typlen(Oid typid);
 extern bool get_typbyval(Oid typid);
 extern void get_typlenbyval(Oid typid, int16 *typlen, bool *typbyval);
index cf4ebd2b15067c7969b9a0a1cfc97341efb358db..4a134c9ce55a7bc0df9f5c931931398cc6dbacf1 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: sets.h,v 1.12 2001/11/05 17:46:36 momjian Exp $
+ * $Id: sets.h,v 1.13 2002/03/29 19:06:26 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -20,7 +20,7 @@
 /* Temporary name of a set function, before SetDefine changes it. */
 #define GENERICSETNAME "ZYX#Set#ZYX"
 
-extern Oid     SetDefine(char *querystr, char *typename);
+extern Oid     SetDefine(char *querystr, Oid elemType);
 
 extern Datum seteval(PG_FUNCTION_ARGS);
 
index 49af9690758622c2e5d6e1c0862132d32aeb2b90..d08dfadda49157bc2f320aa1f8b184cad28c3ac2 100644 (file)
@@ -9,7 +9,7 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: syscache.h,v 1.40 2002/03/26 19:16:59 tgl Exp $
+ * $Id: syscache.h,v 1.41 2002/03/29 19:06:26 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -57,7 +57,7 @@
 #define SHADOWNAME             26
 #define SHADOWSYSID            27
 #define STATRELATT             28
-#define TYPENAME               29
+#define TYPENAMENSP            29
 #define TYPEOID                        30
 
 
index 44c5146eb6389139383e7089b47d20c0a4a321f9..b648c16336943514b89db4eca7c4123361682352 100644 (file)
@@ -3,7 +3,7 @@
  *                       procedural language
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_comp.c,v 1.39 2002/03/26 19:17:02 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_comp.c,v 1.40 2002/03/29 19:06:27 tgl Exp $
  *
  *       This software is copyrighted by Jan Wieck - Hamburg.
  *
 #include "access/heapam.h"
 #include "catalog/catname.h"
 #include "catalog/namespace.h"
-#include "catalog/pg_proc.h"
-#include "catalog/pg_type.h"
-#include "catalog/pg_class.h"
 #include "catalog/pg_attribute.h"
 #include "catalog/pg_attrdef.h"
+#include "catalog/pg_class.h"
+#include "catalog/pg_proc.h"
+#include "catalog/pg_type.h"
 #include "commands/trigger.h"
 #include "executor/spi.h"
 #include "fmgr.h"
+#include "nodes/makefuncs.h"
 #include "parser/gramparse.h"
 #include "parser/parse_type.h"
 #include "tcop/tcopprot.h"
@@ -851,10 +852,8 @@ plpgsql_parse_wordtype(char *word)
 {
        PLpgSQL_nsitem *nse;
        char       *cp;
-       HeapTuple       typeTup;
-       Form_pg_type typeStruct;
-       char       *typeXlated;
        bool            old_nsstate;
+       Oid                     typeOid;
 
        /*
         * We do our lookups case insensitive
@@ -887,39 +886,46 @@ plpgsql_parse_wordtype(char *word)
        /*
         * Word wasn't found on the namestack. Try to find a data type with
         * that name, but ignore pg_type entries that are in fact class types.
+        *
+        * XXX this should be improved to handle qualified-type-name references.
         */
-       typeXlated = xlateSqlType(cp);
-       typeTup = SearchSysCache(TYPENAME,
-                                                        PointerGetDatum(typeXlated),
-                                                        0, 0, 0);
-       if (HeapTupleIsValid(typeTup))
+       typeOid = LookupTypeName(makeTypeName(xlateSqlType(cp)));
+       if (OidIsValid(typeOid))
        {
-               PLpgSQL_type *typ;
+               HeapTuple       typeTup;
 
-               typeStruct = (Form_pg_type) GETSTRUCT(typeTup);
-
-               if (typeStruct->typrelid != InvalidOid)
+               typeTup = SearchSysCache(TYPEOID,
+                                                                ObjectIdGetDatum(typeOid),
+                                                                0, 0, 0);
+               if (HeapTupleIsValid(typeTup))
                {
-                       ReleaseSysCache(typeTup);
-                       pfree(cp);
-                       return T_ERROR;
-               }
+                       Form_pg_type typeStruct = (Form_pg_type) GETSTRUCT(typeTup);
+                       PLpgSQL_type *typ;
+
+                       if (!typeStruct->typisdefined ||
+                               typeStruct->typrelid != InvalidOid)
+                       {
+                               ReleaseSysCache(typeTup);
+                               pfree(cp);
+                               return T_ERROR;
+                       }
 
-               typ = (PLpgSQL_type *) malloc(sizeof(PLpgSQL_type));
+                       typ = (PLpgSQL_type *) malloc(sizeof(PLpgSQL_type));
 
-               typ->typname = strdup(NameStr(typeStruct->typname));
-               typ->typoid = typeTup->t_data->t_oid;
-               perm_fmgr_info(typeStruct->typinput, &(typ->typinput));
-               typ->typelem = typeStruct->typelem;
-               typ->typbyval = typeStruct->typbyval;
-               typ->typlen = typeStruct->typlen;
-               typ->atttypmod = -1;
+                       typ->typname = strdup(NameStr(typeStruct->typname));
+                       typ->typoid = typeOid;
+                       perm_fmgr_info(typeStruct->typinput, &(typ->typinput));
+                       typ->typelem = typeStruct->typelem;
+                       typ->typbyval = typeStruct->typbyval;
+                       typ->typlen = typeStruct->typlen;
+                       typ->atttypmod = -1;
 
-               plpgsql_yylval.dtype = typ;
+                       plpgsql_yylval.dtype = typ;
 
-               ReleaseSysCache(typeTup);
-               pfree(cp);
-               return T_DTYPE;
+                       ReleaseSysCache(typeTup);
+                       pfree(cp);
+                       return T_DTYPE;
+               }
        }
 
        /*
index e56f9254cffe210864a90a8572c8010d1dd4d092..9821f75335b4285c738fc4b70f83c8f6846a881c 100644 (file)
@@ -29,7 +29,7 @@
  * MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  *
  * IDENTIFICATION
- *     $Header: /cvsroot/pgsql/src/pl/plpython/plpython.c,v 1.16 2002/03/06 18:50:32 momjian Exp $
+ *     $Header: /cvsroot/pgsql/src/pl/plpython/plpython.c,v 1.17 2002/03/29 19:06:27 tgl Exp $
  *
  *********************************************************************
  */
 
 /* postgreSQL stuff
  */
-#include "executor/spi.h"
+#include "access/heapam.h"
+#include "catalog/pg_proc.h"
+#include "catalog/pg_type.h"
 #include "commands/trigger.h"
-#include "utils/elog.h"
+#include "executor/spi.h"
 #include "fmgr.h"
-#include "access/heapam.h"
-
+#include "nodes/makefuncs.h"
+#include "parser/parse_type.h"
 #include "tcop/tcopprot.h"
 #include "utils/syscache.h"
-#include "catalog/pg_proc.h"
-#include "catalog/pg_type.h"
 
 #include <Python.h>
 #include "plpython.h"
@@ -2086,16 +2086,8 @@ PLy_spi_prepare(PyObject * self, PyObject * args)
                                        RAISE_EXC(1);
                                }
                                sptr = PyString_AsString(optr);
-                               typeTup = SearchSysCache(TYPENAME, PointerGetDatum(sptr),
-                                                                                0, 0, 0);
-                               if (!HeapTupleIsValid(typeTup))
-                               {
-                                       PLy_exception_set(PLy_exc_spi_error,
-                                                                       "Cache lookup for type `%s' failed.",
-                                                                         sptr);
-                                       RAISE_EXC(1);
-                               }
-
+                               /* XXX should extend this to allow qualified type names */
+                               typeTup = typenameType(makeTypeName(sptr));
                                Py_DECREF(optr);
                                optr = NULL;    /* this is important */
 
index 34bc731e9abbed6005634922f94b12099feb7121..3335e8ed176ebfe537de8fc101f5ff502a348cb5 100644 (file)
@@ -31,7 +31,7 @@
  *       ENHANCEMENTS, OR MODIFICATIONS.
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/pl/tcl/pltcl.c,v 1.52 2002/03/06 18:50:33 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/pl/tcl/pltcl.c,v 1.53 2002/03/29 19:06:28 tgl Exp $
  *
  **********************************************************************/
 
 #include <string.h>
 #include <setjmp.h>
 
-#include "executor/spi.h"
+#include "access/heapam.h"
+#include "catalog/pg_language.h"
+#include "catalog/pg_proc.h"
+#include "catalog/pg_type.h"
 #include "commands/trigger.h"
-#include "utils/builtins.h"
+#include "executor/spi.h"
 #include "fmgr.h"
-#include "access/heapam.h"
-
+#include "nodes/makefuncs.h"
+#include "parser/parse_type.h"
 #include "tcop/tcopprot.h"
+#include "utils/builtins.h"
 #include "utils/syscache.h"
-#include "catalog/pg_proc.h"
-#include "catalog/pg_language.h"
-#include "catalog/pg_type.h"
 
 #if defined(UNICODE_CONVERSION) && TCL_MAJOR_VERSION == 8 \
        && TCL_MINOR_VERSION > 0
@@ -1750,11 +1751,8 @@ pltcl_SPI_prepare(ClientData cdata, Tcl_Interp *interp,
         ************************************************************/
        for (i = 0; i < nargs; i++)
        {
-               typeTup = SearchSysCache(TYPENAME,
-                                                                PointerGetDatum(args[i]),
-                                                                0, 0, 0);
-               if (!HeapTupleIsValid(typeTup))
-                       elog(ERROR, "pltcl: Cache lookup of type %s failed", args[i]);
+               /* XXX should extend this to allow qualified type names */
+               typeTup = typenameType(makeTypeName(args[i]));
                qdesc->argtypes[i] = typeTup->t_data->t_oid;
                perm_fmgr_info(((Form_pg_type) GETSTRUCT(typeTup))->typinput,
                                           &(qdesc->arginfuncs[i]));
index bd9707c2bdbeeb07e734cd35c97ca55885c9516f..56c8939c6f032576f448e0bc0948a949cac00c58 100644 (file)
@@ -137,7 +137,7 @@ drop aggregate 314159 (int);
 ERROR:  parser: parse error at or near "314159"
 -- bad aggregate type
 drop aggregate newcnt (nonesuch);
-ERROR:  RemoveAggregate: type 'nonesuch' does not exist
+ERROR:  Type "nonesuch" does not exist
 -- no such aggregate 
 drop aggregate nonesuch (int4);
 ERROR:  RemoveAggregate: aggregate 'nonesuch' for type integer does not exist
@@ -167,7 +167,7 @@ drop type 314159;
 ERROR:  parser: parse error at or near "314159"
 -- no such type 
 drop type nonesuch;
-ERROR:  RemoveType: type 'nonesuch' does not exist
+ERROR:  Type "nonesuch" does not exist
 --
 -- DROP OPERATOR
  
@@ -203,10 +203,10 @@ drop operator = ( , int4);
 ERROR:  parser: parse error at or near ","
 -- no such type1 
 drop operator = (nonesuch, int4);
-ERROR:  RemoveOperator: type 'nonesuch' does not exist
+ERROR:  Type "nonesuch" does not exist
 -- no such type2 
 drop operator = (int4, nonesuch);
-ERROR:  RemoveOperator: type 'nonesuch' does not exist
+ERROR:  Type "nonesuch" does not exist
 -- no such type2 
 drop operator = (int4, );
 ERROR:  parser: parse error at or near ")"
index 137242da70573cd0634aaf5ba5e11fe3685841f4..4d508497cf6335f82faacd5fea5b3908341129b4 100644 (file)
@@ -13,8 +13,8 @@ CREATE FUNCTION hobbies_by_name(hobbies_r.name%TYPE)
    RETURNS hobbies_r.person%TYPE
    AS 'select person from hobbies_r where name = $1'
    LANGUAGE 'sql';
-NOTICE:  hobbies_r.name%TYPE converted to text
 NOTICE:  hobbies_r.person%TYPE converted to text
+NOTICE:  hobbies_r.name%TYPE converted to text
 CREATE FUNCTION equipment(hobbies_r)
    RETURNS setof equipment_r
    AS 'select * from equipment_r where hobby = $1.name'