1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-17 17:02:08 +03:00

Allow CREATE TABLE (LIKE ...) from composite type

The only reason this didn't work before was that parserOpenTable()
rejects composite types.  So use relation_openrv() directly and
manually do the errposition() setup that parserOpenTable() does.
This commit is contained in:
Peter Eisentraut
2012-03-03 16:03:05 +02:00
parent d923125b77
commit b59ca98209
4 changed files with 37 additions and 17 deletions

View File

@ -636,26 +636,42 @@ transformTableLikeClause(CreateStmtContext *cxt, TableLikeClause *table_like_cla
TupleConstr *constr;
AclResult aclresult;
char *comment;
ParseCallbackState pcbstate;
relation = parserOpenTable(cxt->pstate, table_like_clause->relation,
AccessShareLock);
setup_parser_errposition_callback(&pcbstate, cxt->pstate, table_like_clause->relation->location);
relation = relation_openrv(table_like_clause->relation, AccessShareLock);
if (relation->rd_rel->relkind != RELKIND_RELATION
&& relation->rd_rel->relkind != RELKIND_VIEW
&& relation->rd_rel->relkind != RELKIND_FOREIGN_TABLE)
&& relation->rd_rel->relkind != RELKIND_FOREIGN_TABLE
&& relation->rd_rel->relkind != RELKIND_COMPOSITE_TYPE)
ereport(ERROR,
(errcode(ERRCODE_WRONG_OBJECT_TYPE),
errmsg("LIKE source relation \"%s\" is not a table, view, or foreign table",
errmsg("\"%s\" is not a table, view, composite type, or foreign table",
table_like_clause->relation->relname)));
cancel_parser_errposition_callback(&pcbstate);
/*
* Check for SELECT privileges
* Check for privileges
*/
aclresult = pg_class_aclcheck(RelationGetRelid(relation), GetUserId(),
if (relation->rd_rel->relkind == RELKIND_COMPOSITE_TYPE)
{
aclresult = pg_type_aclcheck(relation->rd_rel->reltype, GetUserId(),
ACL_USAGE);
if (aclresult != ACLCHECK_OK)
aclcheck_error(aclresult, ACL_KIND_TYPE,
RelationGetRelationName(relation));
}
else
{
aclresult = pg_class_aclcheck(RelationGetRelid(relation), GetUserId(),
ACL_SELECT);
if (aclresult != ACLCHECK_OK)
aclcheck_error(aclresult, ACL_KIND_CLASS,
RelationGetRelationName(relation));
if (aclresult != ACLCHECK_OK)
aclcheck_error(aclresult, ACL_KIND_CLASS,
RelationGetRelationName(relation));
}
tupleDesc = RelationGetDescr(relation);
constr = tupleDesc->constr;