I noticed that get_attidentity() isn't really necessary because the
information can be obtained from an existing tuple descriptor in each case.

Also, get_atttypmod() hasn't been used since 2004.

I propose the attached patches to remove these two functions.

-- 
Peter Eisentraut              http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
From 2003c5b4fdad1cd444ddb1fad2bdc9ab09db2fd2 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <pete...@gmx.net>
Date: Thu, 18 Oct 2018 19:27:18 +0200
Subject: [PATCH 1/2] Remove get_attidentity()

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    |  4 ++--
 src/backend/parser/parse_utilcmd.c  |  3 ++-
 src/backend/utils/cache/lsyscache.c | 32 -----------------------------
 src/include/utils/lsyscache.h       |  1 -
 4 files changed, 4 insertions(+), 36 deletions(-)

diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 3e112b4ef4..7ff25a9eff 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -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 (TupleDescAttr(RelationGetDescr(rel), attnum - 1)->attidentity)
                ereport(ERROR,
                                (errcode(ERRCODE_SYNTAX_ERROR),
                                 errmsg("column \"%s\" of relation \"%s\" is an 
identity column",
@@ -6148,7 +6148,7 @@ ATExecColumnDefault(Relation rel, const char *colName,
                                 errmsg("cannot alter system column \"%s\"",
                                                colName)));
 
-       if (get_attidentity(RelationGetRelid(rel), attnum))
+       if (TupleDescAttr(RelationGetDescr(rel), 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..212eedfa87 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -3067,7 +3067,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(RelationGetDescr(rel), 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 12b2532d95..c5fcaa9542 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 8c57de77c0..151081c693 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 int32 get_atttypmod(Oid relid, AttrNumber attnum);
 extern void get_atttypetypmodcoll(Oid relid, AttrNumber attnum,

base-commit: a7a1b44516e7db89104c06440f759c2831fcb0ff
-- 
2.19.1

From 013205793925abd336744890c49e30bfca06db01 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <pete...@gmx.net>
Date: Thu, 18 Oct 2018 19:28:28 +0200
Subject: [PATCH 2/2] Remove get_atttypmod()

This has been unused since 2004.  get_atttypetypmodcoll() is often a
better alternative.
---
 src/backend/utils/cache/lsyscache.c | 29 +----------------------------
 src/include/utils/lsyscache.h       |  1 -
 2 files changed, 1 insertion(+), 29 deletions(-)

diff --git a/src/backend/utils/cache/lsyscache.c 
b/src/backend/utils/cache/lsyscache.c
index c5fcaa9542..892ddc0d48 100644
--- a/src/backend/utils/cache/lsyscache.c
+++ b/src/backend/utils/cache/lsyscache.c
@@ -848,40 +848,13 @@ get_atttype(Oid relid, AttrNumber attnum)
                return InvalidOid;
 }
 
-/*
- * get_atttypmod
- *
- *             Given the relation id and the attribute number,
- *             return the "atttypmod" field from the attribute relation.
- */
-int32
-get_atttypmod(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);
-               int32           result;
-
-               result = att_tup->atttypmod;
-               ReleaseSysCache(tp);
-               return result;
-       }
-       else
-               return -1;
-}
-
 /*
  * get_atttypetypmodcoll
  *
  *             A three-fer: given the relation id and the attribute number,
  *             fetch atttypid, atttypmod, and attcollation in a single cache 
lookup.
  *
- * Unlike the otherwise-similar get_atttype/get_atttypmod, this routine
+ * Unlike the otherwise-similar get_atttype, this routine
  * raises an error if it can't obtain the information.
  */
 void
diff --git a/src/include/utils/lsyscache.h b/src/include/utils/lsyscache.h
index 151081c693..ff1705ad2b 100644
--- a/src/include/utils/lsyscache.h
+++ b/src/include/utils/lsyscache.h
@@ -86,7 +86,6 @@ extern Oid get_opfamily_proc(Oid opfamily, Oid lefttype, Oid 
righttype,
 extern char *get_attname(Oid relid, AttrNumber attnum, bool missing_ok);
 extern AttrNumber get_attnum(Oid relid, const char *attname);
 extern Oid     get_atttype(Oid relid, AttrNumber attnum);
-extern int32 get_atttypmod(Oid relid, AttrNumber attnum);
 extern void get_atttypetypmodcoll(Oid relid, AttrNumber attnum,
                                          Oid *typid, int32 *typmod, Oid 
*collid);
 extern char *get_collation_name(Oid colloid);
-- 
2.19.1

Reply via email to