Eliminate duplicate code in table.c.
authorAmit Kapila <akapila@postgresql.org>
Tue, 26 Jul 2022 02:52:53 +0000 (08:22 +0530)
committerAmit Kapila <akapila@postgresql.org>
Tue, 26 Jul 2022 02:52:53 +0000 (08:22 +0530)
Additionally improve the error message similar to how it was done in
2ed532ee8c.

Author: Junwang Zhao, Aleksander Alekseev
Reviewed-by: Amit Kapila, Alvaro Herrera, Kyotaro Horiguchi
Discussion: https://postgr.es/m/CAEG8a3KbVtBm_BYf5tGsKHvmMieQVsq_jBPOg75VViQB7ACL8Q%40mail.gmail.com

src/backend/access/table/table.c
src/test/regress/expected/tid.out

index 744d3b550b3e04af176b176f60f5695cf43fadf8..7e94232f011e3ec7657eaeb8cc75fb16bf4c27a6 100644 (file)
@@ -25,6 +25,7 @@
 #include "access/table.h"
 #include "storage/lmgr.h"
 
+static inline void validate_relation_kind(Relation r);
 
 /* ----------------
  *             table_open - open a table relation by relation OID
@@ -42,17 +43,7 @@ table_open(Oid relationId, LOCKMODE lockmode)
 
        r = relation_open(relationId, lockmode);
 
-       if (r->rd_rel->relkind == RELKIND_INDEX ||
-               r->rd_rel->relkind == RELKIND_PARTITIONED_INDEX)
-               ereport(ERROR,
-                               (errcode(ERRCODE_WRONG_OBJECT_TYPE),
-                                errmsg("\"%s\" is an index",
-                                               RelationGetRelationName(r))));
-       else if (r->rd_rel->relkind == RELKIND_COMPOSITE_TYPE)
-               ereport(ERROR,
-                               (errcode(ERRCODE_WRONG_OBJECT_TYPE),
-                                errmsg("\"%s\" is a composite type",
-                                               RelationGetRelationName(r))));
+       validate_relation_kind(r);
 
        return r;
 }
@@ -76,17 +67,7 @@ try_table_open(Oid relationId, LOCKMODE lockmode)
        if (!r)
                return NULL;
 
-       if (r->rd_rel->relkind == RELKIND_INDEX ||
-               r->rd_rel->relkind == RELKIND_PARTITIONED_INDEX)
-               ereport(ERROR,
-                               (errcode(ERRCODE_WRONG_OBJECT_TYPE),
-                                errmsg("\"%s\" is an index",
-                                               RelationGetRelationName(r))));
-       else if (r->rd_rel->relkind == RELKIND_COMPOSITE_TYPE)
-               ereport(ERROR,
-                               (errcode(ERRCODE_WRONG_OBJECT_TYPE),
-                                errmsg("\"%s\" is a composite type",
-                                               RelationGetRelationName(r))));
+       validate_relation_kind(r);
 
        return r;
 }
@@ -105,17 +86,7 @@ table_openrv(const RangeVar *relation, LOCKMODE lockmode)
 
        r = relation_openrv(relation, lockmode);
 
-       if (r->rd_rel->relkind == RELKIND_INDEX ||
-               r->rd_rel->relkind == RELKIND_PARTITIONED_INDEX)
-               ereport(ERROR,
-                               (errcode(ERRCODE_WRONG_OBJECT_TYPE),
-                                errmsg("\"%s\" is an index",
-                                               RelationGetRelationName(r))));
-       else if (r->rd_rel->relkind == RELKIND_COMPOSITE_TYPE)
-               ereport(ERROR,
-                               (errcode(ERRCODE_WRONG_OBJECT_TYPE),
-                                errmsg("\"%s\" is a composite type",
-                                               RelationGetRelationName(r))));
+       validate_relation_kind(r);
 
        return r;
 }
@@ -137,19 +108,7 @@ table_openrv_extended(const RangeVar *relation, LOCKMODE lockmode,
        r = relation_openrv_extended(relation, lockmode, missing_ok);
 
        if (r)
-       {
-               if (r->rd_rel->relkind == RELKIND_INDEX ||
-                       r->rd_rel->relkind == RELKIND_PARTITIONED_INDEX)
-                       ereport(ERROR,
-                                       (errcode(ERRCODE_WRONG_OBJECT_TYPE),
-                                        errmsg("\"%s\" is an index",
-                                                       RelationGetRelationName(r))));
-               else if (r->rd_rel->relkind == RELKIND_COMPOSITE_TYPE)
-                       ereport(ERROR,
-                                       (errcode(ERRCODE_WRONG_OBJECT_TYPE),
-                                        errmsg("\"%s\" is a composite type",
-                                                       RelationGetRelationName(r))));
-       }
+               validate_relation_kind(r);
 
        return r;
 }
@@ -168,3 +127,22 @@ table_close(Relation relation, LOCKMODE lockmode)
 {
        relation_close(relation, lockmode);
 }
+
+/* ----------------
+ *             validate_relation_kind - check the relation's kind
+ *
+ *             Make sure relkind is not index or composite type
+ * ----------------
+ */
+static inline void
+validate_relation_kind(Relation r)
+{
+       if (r->rd_rel->relkind == RELKIND_INDEX ||
+               r->rd_rel->relkind == RELKIND_PARTITIONED_INDEX ||
+               r->rd_rel->relkind == RELKIND_COMPOSITE_TYPE)
+               ereport(ERROR,
+                               (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+                                errmsg("cannot open relation \"%s\"",
+                                               RelationGetRelationName(r)),
+                                errdetail_relkind_not_supported(r->rd_rel->relkind)));
+}
index 7d8957bd6f742d483082d67f04bc43e0129bf351..8cd6d60595273eae85f1a3d6391a6f63b88ce0b8 100644 (file)
@@ -61,7 +61,8 @@ DROP SEQUENCE tid_seq;
 -- Index, fails with incorrect relation type
 CREATE INDEX tid_ind ON tid_tab(a);
 SELECT currtid2('tid_ind'::text, '(0,1)'::tid); -- fails
-ERROR:  "tid_ind" is an index
+ERROR:  cannot open relation "tid_ind"
+DETAIL:  This operation is not supported for indexes.
 DROP INDEX tid_ind;
 -- Partitioned table, no storage
 CREATE TABLE tid_part (a int) PARTITION BY RANGE (a);