mirror of
https://github.com/postgres/postgres.git
synced 2025-04-24 10:47:04 +03:00
Only allow typed tables to hang off composite types, not e.g. tables.
This also ensures that we take a relation lock on the composite type when creating a typed table, which is necessary to prevent the composite type and the typed table from getting out of step in the face of concurrent DDL. Noah Misch, with some changes.
This commit is contained in:
parent
b7b86924c6
commit
04db0fdbfa
@ -825,6 +825,7 @@ transformOfType(CreateStmtContext *cxt, TypeName *ofTypename)
|
||||
TupleDesc tupdesc;
|
||||
int i;
|
||||
Oid ofTypeId;
|
||||
bool typeOk = false;
|
||||
|
||||
AssertArg(ofTypename);
|
||||
|
||||
@ -833,7 +834,21 @@ transformOfType(CreateStmtContext *cxt, TypeName *ofTypename)
|
||||
ofTypeId = HeapTupleGetOid(tuple);
|
||||
ofTypename->typeOid = ofTypeId; /* cached for later */
|
||||
|
||||
if (typ->typtype != TYPTYPE_COMPOSITE)
|
||||
if (typ->typtype == TYPTYPE_COMPOSITE)
|
||||
{
|
||||
Relation typeRelation;
|
||||
|
||||
Assert(OidIsValid(typ->typrelid));
|
||||
typeRelation = relation_open(typ->typrelid, AccessShareLock);
|
||||
typeOk = (typeRelation->rd_rel->relkind == RELKIND_COMPOSITE_TYPE);
|
||||
/*
|
||||
* Close the parent rel, but keep our AccessShareLock on it until xact
|
||||
* commit. That will prevent someone else from deleting or ALTERing
|
||||
* the type before the typed table creation commits.
|
||||
*/
|
||||
relation_close(typeRelation, NoLock);
|
||||
}
|
||||
if (!typeOk)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_WRONG_OBJECT_TYPE),
|
||||
errmsg("type %s is not a composite type",
|
||||
|
@ -91,6 +91,8 @@ DETAIL: drop cascades to table persons
|
||||
drop cascades to function get_all_persons()
|
||||
drop cascades to table persons2
|
||||
drop cascades to table persons3
|
||||
CREATE TABLE persons5 OF stuff; -- only CREATE TYPE AS types may be used
|
||||
ERROR: type stuff is not a composite type
|
||||
DROP TABLE stuff;
|
||||
-- implicit casting
|
||||
CREATE TYPE person_type AS (id int, name text);
|
||||
|
@ -46,6 +46,8 @@ CREATE TABLE persons4 OF person_type (
|
||||
DROP TYPE person_type RESTRICT;
|
||||
DROP TYPE person_type CASCADE;
|
||||
|
||||
CREATE TABLE persons5 OF stuff; -- only CREATE TYPE AS types may be used
|
||||
|
||||
DROP TABLE stuff;
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user