diff options
Diffstat (limited to 'src/backend/parser/parse_utilcmd.c')
-rw-r--r-- | src/backend/parser/parse_utilcmd.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c index 57ea3fa1163..ebf9d19b874 100644 --- a/src/backend/parser/parse_utilcmd.c +++ b/src/backend/parser/parse_utilcmd.c @@ -909,12 +909,16 @@ transformTableLikeClause(CreateStmtContext *cxt, TableLikeClause *table_like_cla * yet know what column numbers the copied columns will have in the * finished table. If any of those options are specified, add the LIKE * clause to cxt->likeclauses so that expandTableLikeClause will be called - * after we do know that. + * after we do know that. Also, remember the relation OID so that + * expandTableLikeClause is certain to open the same table. */ if (table_like_clause->options & (CREATE_TABLE_LIKE_CONSTRAINTS | CREATE_TABLE_LIKE_INDEXES)) + { + table_like_clause->relationOid = RelationGetRelid(relation); cxt->likeclauses = lappend(cxt->likeclauses, table_like_clause); + } /* * Close the parent rel, but keep our AccessShareLock on it until xact @@ -948,9 +952,13 @@ expandTableLikeClause(RangeVar *heapRel, TableLikeClause *table_like_clause) * Open the relation referenced by the LIKE clause. We should still have * the table lock obtained by transformTableLikeClause (and this'll throw * an assertion failure if not). Hence, no need to recheck privileges - * etc. + * etc. We must open the rel by OID not name, to be sure we get the same + * table. */ - relation = relation_openrv(table_like_clause->relation, NoLock); + if (!OidIsValid(table_like_clause->relationOid)) + elog(ERROR, "expandTableLikeClause called on untransformed LIKE clause"); + + relation = relation_open(table_like_clause->relationOid, NoLock); tupleDesc = RelationGetDescr(relation); constr = tupleDesc->constr; |