Thread

  1. [PATCH v2 2/2] Remove get_attidentity()

    Peter Eisentraut <peter_e@gmx.net> — 2018-10-18T17:27:18Z

    All existing uses can get this information more easily from the
    relation descriptor, so the detour through the syscache is not
    necessary.
    ---
     src/backend/commands/tablecmds.c    | 13 ++++++------
     src/backend/parser/parse_utilcmd.c  |  5 ++++-
     src/backend/utils/cache/lsyscache.c | 32 -----------------------------
     src/include/utils/lsyscache.h       |  1 -
     4 files changed, 11 insertions(+), 40 deletions(-)
    
    diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
    index 3e112b4ef4..1a1c80ef8b 100644
    --- a/src/backend/commands/tablecmds.c
    +++ b/src/backend/commands/tablecmds.c
    @@ -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,13 +5930,12 @@ 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))));
    -
    +	attTup = (Form_pg_attribute) GETSTRUCT(tuple);
     	attnum = ((Form_pg_attribute) GETSTRUCT(tuple))->attnum;
     
     	/* Prevent them from altering a system attribute */
    @@ -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",
    diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
    index d8387d4356..a6a2de94ea 100644
    --- a/src/backend/parser/parse_utilcmd.c
    +++ b/src/backend/parser/parse_utilcmd.c
    @@ -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);
    diff --git a/src/backend/utils/cache/lsyscache.c b/src/backend/utils/cache/lsyscache.c
    index c53bda9867..892ddc0d48 100644
    --- a/src/backend/utils/cache/lsyscache.c
    +++ b/src/backend/utils/cache/lsyscache.c
    @@ -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
      *
    diff --git a/src/include/utils/lsyscache.h b/src/include/utils/lsyscache.h
    index 23ed5324b5..ff1705ad2b 100644
    --- a/src/include/utils/lsyscache.h
    +++ b/src/include/utils/lsyscache.h
    @@ -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);
    -- 
    2.19.1
    
    
    --------------3AA9EBF928E711B949D0677D--