Remove get_attidentity()
authorPeter Eisentraut <peter_e@gmx.net>
Tue, 23 Oct 2018 12:45:29 +0000 (14:45 +0200)
committerPeter Eisentraut <peter_e@gmx.net>
Tue, 23 Oct 2018 12:47:14 +0000 (14:47 +0200)
All existing uses can get this information more easily from the
relation descriptor, so the detour through the syscache is not
necessary.

Reviewed-by: Michael Paquier <michael@paquier.xyz>
src/backend/commands/tablecmds.c
src/backend/parser/parse_utilcmd.c
src/backend/utils/cache/lsyscache.c
src/include/utils/lsyscache.h

index 3e112b4ef428d966deca31a4fe485bd44521ddb1..153aec263efb4d9f226b91012ae48ca1b25f4114 100644 (file)
@@ -5917,6 +5917,7 @@ static ObjectAddress
 ATExecDropNotNull(Relation rel, const char *colName, LOCKMODE lockmode)
 {
    HeapTuple   tuple;
+   Form_pg_attribute attTup;
    AttrNumber  attnum;
    Relation    attr_rel;
    List       *indexoidlist;
@@ -5929,14 +5930,13 @@ ATExecDropNotNull(Relation rel, const char *colName, LOCKMODE lockmode)
    attr_rel = heap_open(AttributeRelationId, RowExclusiveLock);
 
    tuple = SearchSysCacheCopyAttName(RelationGetRelid(rel), colName);
-
    if (!HeapTupleIsValid(tuple))
        ereport(ERROR,
                (errcode(ERRCODE_UNDEFINED_COLUMN),
                 errmsg("column \"%s\" of relation \"%s\" does not exist",
                        colName, RelationGetRelationName(rel))));
-
-   attnum = ((Form_pg_attribute) GETSTRUCT(tuple))->attnum;
+   attTup = (Form_pg_attribute) GETSTRUCT(tuple);
+   attnum = attTup->attnum;
 
    /* Prevent them from altering a system attribute */
    if (attnum <= 0)
@@ -5945,7 +5945,7 @@ ATExecDropNotNull(Relation rel, const char *colName, LOCKMODE lockmode)
                 errmsg("cannot alter system column \"%s\"",
                        colName)));
 
-   if (get_attidentity(RelationGetRelid(rel), attnum))
+   if (attTup->attidentity)
        ereport(ERROR,
                (errcode(ERRCODE_SYNTAX_ERROR),
                 errmsg("column \"%s\" of relation \"%s\" is an identity column",
@@ -6014,9 +6014,9 @@ ATExecDropNotNull(Relation rel, const char *colName, LOCKMODE lockmode)
    /*
     * Okay, actually perform the catalog change ... if needed
     */
-   if (((Form_pg_attribute) GETSTRUCT(tuple))->attnotnull)
+   if (attTup->attnotnull)
    {
-       ((Form_pg_attribute) GETSTRUCT(tuple))->attnotnull = false;
+       attTup->attnotnull = false;
 
        CatalogTupleUpdate(attr_rel, &tuple->t_self, tuple);
 
@@ -6128,6 +6128,7 @@ static ObjectAddress
 ATExecColumnDefault(Relation rel, const char *colName,
                    Node *newDefault, LOCKMODE lockmode)
 {
+   TupleDesc   tupdesc = RelationGetDescr(rel);
    AttrNumber  attnum;
    ObjectAddress address;
 
@@ -6148,7 +6149,7 @@ ATExecColumnDefault(Relation rel, const char *colName,
                 errmsg("cannot alter system column \"%s\"",
                        colName)));
 
-   if (get_attidentity(RelationGetRelid(rel), attnum))
+   if (TupleDescAttr(tupdesc, attnum - 1)->attidentity)
        ereport(ERROR,
                (errcode(ERRCODE_SYNTAX_ERROR),
                 errmsg("column \"%s\" of relation \"%s\" is an identity column",
index d8387d4356990ac117d04f61c4b822ee34c25af1..a6a2de94ea42f1e9f8e01fbf889ce68cd1c78777 100644 (file)
@@ -2919,6 +2919,7 @@ transformAlterTableStmt(Oid relid, AlterTableStmt *stmt,
                        const char *queryString)
 {
    Relation    rel;
+   TupleDesc   tupdesc;
    ParseState *pstate;
    CreateStmtContext cxt;
    List       *result;
@@ -2938,6 +2939,7 @@ transformAlterTableStmt(Oid relid, AlterTableStmt *stmt,
 
    /* Caller is responsible for locking the relation */
    rel = relation_open(relid, NoLock);
+   tupdesc = RelationGetDescr(rel);
 
    /* Set up pstate */
    pstate = make_parsestate(NULL);
@@ -3067,7 +3069,8 @@ transformAlterTableStmt(Oid relid, AlterTableStmt *stmt,
                     * if attribute not found, something will error about it
                     * later
                     */
-                   if (attnum != InvalidAttrNumber && get_attidentity(relid, attnum))
+                   if (attnum != InvalidAttrNumber &&
+                       TupleDescAttr(tupdesc, attnum - 1)->attidentity)
                    {
                        Oid         seq_relid = getOwnedSequence(relid, attnum);
                        Oid         typeOid = typenameTypeId(pstate, def->typeName);
index c53bda9867122a1a3a667e70c47a281da9fdd70f..892ddc0d486fd4524e9950a2ce1b210844da62a4 100644 (file)
@@ -821,38 +821,6 @@ get_attnum(Oid relid, const char *attname)
        return InvalidAttrNumber;
 }
 
-/*
- * get_attidentity
- *
- *     Given the relation id and the attribute name,
- *     return the "attidentity" field from the attribute relation.
- *
- *     Returns '\0' if not found.
- *
- *     Since no identity is represented by '\0', this can also be used as a
- *     Boolean test.
- */
-char
-get_attidentity(Oid relid, AttrNumber attnum)
-{
-   HeapTuple   tp;
-
-   tp = SearchSysCache2(ATTNUM,
-                        ObjectIdGetDatum(relid),
-                        Int16GetDatum(attnum));
-   if (HeapTupleIsValid(tp))
-   {
-       Form_pg_attribute att_tup = (Form_pg_attribute) GETSTRUCT(tp);
-       char        result;
-
-       result = att_tup->attidentity;
-       ReleaseSysCache(tp);
-       return result;
-   }
-   else
-       return '\0';
-}
-
 /*
  * get_atttype
  *
index 23ed5324b5bbdf507bb6be9e42a4a47990338579..ff1705ad2b87845931631ef096f48f033166a983 100644 (file)
@@ -85,7 +85,6 @@ extern Oid get_opfamily_proc(Oid opfamily, Oid lefttype, Oid righttype,
                  int16 procnum);
 extern char *get_attname(Oid relid, AttrNumber attnum, bool missing_ok);
 extern AttrNumber get_attnum(Oid relid, const char *attname);
-extern char get_attidentity(Oid relid, AttrNumber attnum);
 extern Oid get_atttype(Oid relid, AttrNumber attnum);
 extern void get_atttypetypmodcoll(Oid relid, AttrNumber attnum,
                      Oid *typid, int32 *typmod, Oid *collid);