1
0
mirror of https://github.com/postgres/postgres.git synced 2025-12-12 02:37:31 +03:00

Clarify error message and documentation related to typed tables.

We restrict typed tables (those declared as "OF composite_type")
to be based on stand-alone composite types, not composite types
that are the implicitly-created rowtypes of other tables.
But if you tried to do that, you got the very confusing error
message "type foo is not a composite type".  Provide a more specific
message for that case.  Also clarify related documentation in the
CREATE TABLE man page.

Erik Wienhold and David G. Johnston, per complaint from Hannu Krosing.

Discussion: https://postgr.es/m/CAMT0RQRysCb_Amy5CTENSc5GfsvXL1a4qX3mv_hx31_v74P==g@mail.gmail.com
This commit is contained in:
Tom Lane
2024-07-26 12:39:45 -04:00
parent c883453cb2
commit 5d1d8b3c82
4 changed files with 26 additions and 10 deletions

View File

@@ -6962,8 +6962,15 @@ check_of_type(HeapTuple typetuple)
* the type before the typed table creation/conversion commits.
*/
relation_close(typeRelation, NoLock);
if (!typeOk)
ereport(ERROR,
(errcode(ERRCODE_WRONG_OBJECT_TYPE),
errmsg("type %s is the row type of another table",
format_type_be(typ->oid)),
errdetail("A typed table must use a stand-alone composite type created with CREATE TYPE.")));
}
if (!typeOk)
else
ereport(ERROR,
(errcode(ERRCODE_WRONG_OBJECT_TYPE),
errmsg("type %s is not a composite type",

View File

@@ -89,7 +89,12 @@ 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
ERROR: type stuff is the row type of another table
DETAIL: A typed table must use a stand-alone composite type created with CREATE TYPE.
CREATE TYPE tt_enum_type AS ENUM ('a');
CREATE TABLE of_tt_enum_type OF tt_enum_type; -- not a composite type at all
ERROR: type tt_enum_type is not a composite type
DROP TYPE tt_enum_type;
DROP TABLE stuff;
-- implicit casting
CREATE TYPE person_type AS (id int, name text);

View File

@@ -48,6 +48,10 @@ DROP TYPE person_type CASCADE;
CREATE TABLE persons5 OF stuff; -- only CREATE TYPE AS types may be used
CREATE TYPE tt_enum_type AS ENUM ('a');
CREATE TABLE of_tt_enum_type OF tt_enum_type; -- not a composite type at all
DROP TYPE tt_enum_type;
DROP TABLE stuff;