aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/tcop/utility.c23
-rw-r--r--src/test/regress/expected/create_table_like.out18
-rw-r--r--src/test/regress/sql/create_table_like.sql5
3 files changed, 40 insertions, 6 deletions
diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c
index 9713a7ac41a..9a35147b26a 100644
--- a/src/backend/tcop/utility.c
+++ b/src/backend/tcop/utility.c
@@ -1139,6 +1139,7 @@ ProcessUtilitySlow(ParseState *pstate,
{
List *stmts;
ListCell *l;
+ RangeVar *table_rv = NULL;
/* Run parse analysis ... */
stmts = transformCreateStmt((CreateStmt *) parsetree,
@@ -1151,11 +1152,15 @@ ProcessUtilitySlow(ParseState *pstate,
if (IsA(stmt, CreateStmt))
{
+ CreateStmt *cstmt = (CreateStmt *) stmt;
Datum toast_options;
static char *validnsps[] = HEAP_RELOPT_NAMESPACES;
+ /* Remember transformed RangeVar for LIKE */
+ table_rv = cstmt->relation;
+
/* Create the table itself */
- address = DefineRelation((CreateStmt *) stmt,
+ address = DefineRelation(cstmt,
RELKIND_RELATION,
InvalidOid, NULL,
queryString);
@@ -1174,7 +1179,7 @@ ProcessUtilitySlow(ParseState *pstate,
* table
*/
toast_options = transformRelOptions((Datum) 0,
- ((CreateStmt *) stmt)->options,
+ cstmt->options,
"toast",
validnsps,
true,
@@ -1188,12 +1193,17 @@ ProcessUtilitySlow(ParseState *pstate,
}
else if (IsA(stmt, CreateForeignTableStmt))
{
+ CreateForeignTableStmt *cstmt = (CreateForeignTableStmt *) stmt;
+
+ /* Remember transformed RangeVar for LIKE */
+ table_rv = cstmt->base.relation;
+
/* Create the table itself */
- address = DefineRelation((CreateStmt *) stmt,
+ address = DefineRelation(&cstmt->base,
RELKIND_FOREIGN_TABLE,
InvalidOid, NULL,
queryString);
- CreateForeignTable((CreateForeignTableStmt *) stmt,
+ CreateForeignTable(cstmt,
address.objectId);
EventTriggerCollectSimpleCommand(address,
secondaryObject,
@@ -1208,10 +1218,11 @@ ProcessUtilitySlow(ParseState *pstate,
* to-do list.
*/
TableLikeClause *like = (TableLikeClause *) stmt;
- RangeVar *rv = ((CreateStmt *) parsetree)->relation;
List *morestmts;
- morestmts = expandTableLikeClause(rv, like);
+ Assert(table_rv != NULL);
+
+ morestmts = expandTableLikeClause(table_rv, like);
stmts = list_concat(stmts, morestmts);
/*
diff --git a/src/test/regress/expected/create_table_like.out b/src/test/regress/expected/create_table_like.out
index e3edbd8b511..912c73d351e 100644
--- a/src/test/regress/expected/create_table_like.out
+++ b/src/test/regress/expected/create_table_like.out
@@ -421,6 +421,24 @@ CREATE TABLE inh_error2 (LIKE ctlt4 INCLUDING STORAGE) INHERITS (ctlt1);
NOTICE: merging column "a" with inherited definition
ERROR: column "a" has a storage parameter conflict
DETAIL: MAIN versus EXTENDED
+-- Check that LIKE isn't confused by a system catalog of the same name
+CREATE TABLE pg_attrdef (LIKE ctlt1 INCLUDING ALL);
+\d+ public.pg_attrdef
+ Table "public.pg_attrdef"
+ Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
+--------+------+-----------+----------+---------+----------+--------------+-------------
+ a | text | | not null | | main | | A
+ b | text | | | | extended | | B
+Indexes:
+ "pg_attrdef_pkey" PRIMARY KEY, btree (a)
+ "pg_attrdef_b_idx" btree (b)
+ "pg_attrdef_expr_idx" btree ((a || b))
+Check constraints:
+ "ctlt1_a_check" CHECK (length(a) > 2)
+Statistics objects:
+ "public"."pg_attrdef_a_b_stat" (ndistinct, dependencies, mcv) ON a, b FROM public.pg_attrdef
+
+DROP TABLE public.pg_attrdef;
DROP TABLE ctlt1, ctlt2, ctlt3, ctlt4, ctlt12_storage, ctlt12_comments, ctlt1_inh, ctlt13_inh, ctlt13_like, ctlt_all, ctla, ctlb CASCADE;
NOTICE: drop cascades to table inhe
-- LIKE must respect NO INHERIT property of constraints
diff --git a/src/test/regress/sql/create_table_like.sql b/src/test/regress/sql/create_table_like.sql
index f0a8a56b76f..e484bac0a46 100644
--- a/src/test/regress/sql/create_table_like.sql
+++ b/src/test/regress/sql/create_table_like.sql
@@ -163,6 +163,11 @@ SELECT s.stxname, objsubid, description FROM pg_description, pg_statistic_ext s
CREATE TABLE inh_error1 () INHERITS (ctlt1, ctlt4);
CREATE TABLE inh_error2 (LIKE ctlt4 INCLUDING STORAGE) INHERITS (ctlt1);
+-- Check that LIKE isn't confused by a system catalog of the same name
+CREATE TABLE pg_attrdef (LIKE ctlt1 INCLUDING ALL);
+\d+ public.pg_attrdef
+DROP TABLE public.pg_attrdef;
+
DROP TABLE ctlt1, ctlt2, ctlt3, ctlt4, ctlt12_storage, ctlt12_comments, ctlt1_inh, ctlt13_inh, ctlt13_like, ctlt_all, ctla, ctlb CASCADE;
-- LIKE must respect NO INHERIT property of constraints