mirror of
https://github.com/postgres/postgres.git
synced 2025-06-17 17:02:08 +03:00
Consolidate tables of known system attributes into one table.
This commit is contained in:
@ -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;
|
||||
}
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user