From 5d1d8b3c82c2a796bf7d89f2a5785ce9424acab1 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 26 Jul 2024 12:39:45 -0400 Subject: 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 --- src/backend/commands/tablecmds.c | 9 ++++++++- src/test/regress/expected/typed_table.out | 7 ++++++- src/test/regress/sql/typed_table.sql | 4 ++++ 3 files changed, 18 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 721d24783b4..0b2a52463f1 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -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", diff --git a/src/test/regress/expected/typed_table.out b/src/test/regress/expected/typed_table.out index 2e47ecbcf50..b6fbda3f217 100644 --- a/src/test/regress/expected/typed_table.out +++ b/src/test/regress/expected/typed_table.out @@ -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); diff --git a/src/test/regress/sql/typed_table.sql b/src/test/regress/sql/typed_table.sql index 9ef0cdfcc7e..57ce12782b0 100644 --- a/src/test/regress/sql/typed_table.sql +++ b/src/test/regress/sql/typed_table.sql @@ -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; -- cgit v1.2.3