Consolidate tables of known system attributes into one table.

This commit is contained in:
Tom Lane 2001-10-22 22:47:57 +00:00
parent b00c6c841f
commit c59839ac6d
3 changed files with 47 additions and 70 deletions

View 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",

View 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;
}
/*

View 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 */