Consolidate tables of known system attributes into one table.
authorTom Lane
Mon, 22 Oct 2001 22:47:57 +0000 (22:47 +0000)
committerTom Lane
Mon, 22 Oct 2001 22:47:57 +0000 (22:47 +0000)
src/backend/catalog/heap.c
src/backend/parser/parse_relation.c
src/include/catalog/heap.h

index 599e79a4ea67104ede684ade962c711b860b7f96..89d3072f7bfd77ae96b945add34dda80b49ab385 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.177 2001/10/06 23:21:43 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.178 2001/10/22 22:47:57 tgl Exp $
  *
  *
  * INTERFACE ROUTINES
@@ -151,6 +151,7 @@ static Form_pg_attribute SysAtt[] = {&a1, &a2, &a3, &a4, &a5, &a6, &a7};
 
 /*
  * This function returns a Form_pg_attribute pointer for a system attribute.
+ * Note that we elog if the presented attno is invalid.
  */
 Form_pg_attribute
 SystemAttributeDefinition(AttrNumber attno, bool relhasoids)
@@ -164,6 +165,30 @@ SystemAttributeDefinition(AttrNumber attno, bool relhasoids)
    return SysAtt[-attno - 1];
 }
 
+/*
+ * If the given name is a system attribute name, return a Form_pg_attribute
+ * pointer for a prototype definition.  If not, return NULL.
+ */
+Form_pg_attribute
+SystemAttributeByName(const char *attname, bool relhasoids)
+{
+   int j;
+
+   for (j = 0; j < (int) lengthof(SysAtt); j++)
+   {
+       Form_pg_attribute att = SysAtt[j];
+
+       if (relhasoids || att->attnum != ObjectIdAttributeNumber)
+       {
+           if (strcmp(NameStr(att->attname), attname) == 0)
+               return att;
+       }
+   }
+
+   return NULL;
+}
+
+
 /* ----------------------------------------------------------------
  *             XXX END OF UGLY HARD CODED BADNESS XXX
  * ---------------------------------------------------------------- */
@@ -350,16 +375,10 @@ CheckAttributeNames(TupleDesc tupdesc, bool relhasoids)
     */
    for (i = 0; i < natts; i++)
    {
-       for (j = 0; j < (int) lengthof(SysAtt); j++)
-       {
-           if (relhasoids || SysAtt[j]->attnum != ObjectIdAttributeNumber)
-           {
-               if (strcmp(NameStr(SysAtt[j]->attname),
-                          NameStr(tupdesc->attrs[i]->attname)) == 0)
-                   elog(ERROR, "name of column \"%s\" conflicts with an existing system column",
-                        NameStr(SysAtt[j]->attname));
-           }
-       }
+       if (SystemAttributeByName(NameStr(tupdesc->attrs[i]->attname),
+                                 relhasoids) != NULL)
+           elog(ERROR, "name of column \"%s\" conflicts with an existing system column",
+                NameStr(tupdesc->attrs[i]->attname));
        if (tupdesc->attrs[i]->atttypid == UNKNOWNOID)
            elog(NOTICE, "Attribute '%s' has an unknown type"
                 "\n\tProceeding with relation creation anyway",
index 1cc3d19c78de7a0bcf13073fd802ff1600e5a8cf..5077d092da4f3d51566648b1ee32d254b61cd4ef 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/parser/parse_relation.c,v 1.56 2001/08/10 18:57:37 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/parser/parse_relation.c,v 1.57 2001/10/22 22:47:57 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -18,6 +18,7 @@
 
 #include "access/heapam.h"
 #include "access/htup.h"
+#include "catalog/heap.h"
 #include "catalog/pg_type.h"
 #include "nodes/makefuncs.h"
 #include "parser/parsetree.h"
@@ -43,43 +44,6 @@ static int   specialAttNum(char *a);
 static void warnAutoRange(ParseState *pstate, char *refname);
 
 
-/*
- * Information defining the "system" attributes of every relation.
- */
-static struct
-{
-   char       *attrname;       /* name of system attribute */
-   int         attrnum;        /* its attribute number (always < 0) */
-   Oid         attrtype;       /* its type id */
-}          special_attr[] =
-
-{
-   {
-       "ctid", SelfItemPointerAttributeNumber, TIDOID
-   },
-   {
-       "oid", ObjectIdAttributeNumber, OIDOID
-   },
-   {
-       "xmin", MinTransactionIdAttributeNumber, XIDOID
-   },
-   {
-       "cmin", MinCommandIdAttributeNumber, CIDOID
-   },
-   {
-       "xmax", MaxTransactionIdAttributeNumber, XIDOID
-   },
-   {
-       "cmax", MaxCommandIdAttributeNumber, CIDOID
-   },
-   {
-       "tableoid", TableOidAttributeNumber, OIDOID
-   }
-};
-
-#define SPECIALS ((int) lengthof(special_attr))
-
-
 /*
  * refnameRangeOrJoinEntry
  *   Given a refname, look to see if it matches any RTE or join table.
@@ -1001,39 +965,31 @@ attnameAttNum(Relation rd, char *a)
 static int
 specialAttNum(char *a)
 {
-   int         i;
-
-   for (i = 0; i < SPECIALS; i++)
-       if (strcmp(special_attr[i].attrname, a) == 0)
-           return special_attr[i].attrnum;
+   Form_pg_attribute sysatt;
 
+   sysatt = SystemAttributeByName(a, true /* "oid" will be accepted */);
+   if (sysatt != NULL)
+       return sysatt->attnum;
    return InvalidAttrNumber;
 }
 
 
-/* given attribute id, return type of that attribute */
 /*
+ * given attribute id, return type of that attribute
+ *
  * This should only be used if the relation is already
  * heap_open()'ed.  Use the cache version get_atttype()
  * for access to non-opened relations.
- *
- * Note: we don't bother to check rd->rd_rel->relhasoids; we assume that
- * the caller will only ask about OID if that column has been found valid.
  */
 Oid
 attnumTypeId(Relation rd, int attid)
 {
-   if (attid < 0)
+   if (attid <= 0)
    {
-       int         i;
+       Form_pg_attribute sysatt;
 
-       for (i = 0; i < SPECIALS; i++)
-       {
-           if (special_attr[i].attrnum == attid)
-               return special_attr[i].attrtype;
-       }
-       /* negative but not a valid system attr? */
-       elog(ERROR, "attnumTypeId: bogus attribute number %d", attid);
+       sysatt = SystemAttributeDefinition(attid, rd->rd_rel->relhasoids);
+       return sysatt->atttypid;
    }
 
    /*
index 2d08520bc90dd83540b80cf482e617e6d2e9f6b9..8d7346fa05ae76f5796ffe5ec179a78425b25802 100644 (file)
@@ -1,13 +1,13 @@
 /*-------------------------------------------------------------------------
  *
  * heap.h
- *   prototypes for functions in lib/catalog/heap.c
+ *   prototypes for functions in backend/catalog/heap.c
  *
  *
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: heap.h,v 1.37 2001/08/10 18:57:39 tgl Exp $
+ * $Id: heap.h,v 1.38 2001/10/22 22:47:57 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -47,8 +47,10 @@ extern void AddRelationRawConstraints(Relation rel,
 
 extern int RemoveCheckConstraint(Relation rel, const char *constrName, bool inh);
 
-
 extern Form_pg_attribute SystemAttributeDefinition(AttrNumber attno,
                                                   bool relhasoids);
 
+extern Form_pg_attribute SystemAttributeByName(const char *attname,
+                                              bool relhasoids);
+
 #endif  /* HEAP_H */