pg.ddx.io  pgsql-hackers@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Tom Lane <tgl@sss.pgh.pa.us>
To: Erik Wienhold <ewie@ewie.name>
Cc: David G. Johnston <david.g.johnston@gmail.com>
Cc: Robert Haas <robertmhaas@gmail.com>
Cc: Hannu Krosing <hannuk@google.com>
Cc: Peter Eisentraut <peter@eisentraut.org>
Cc: PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Subject: Re: CREATE TABLE creates a composite type corresponding to the table row, which is and is not there
Date: Thu, 25 Jul 2024 16:29:11 -0400
Message-ID: <1556597.1721939351@sss.pgh.pa.us> (raw)
In-Reply-To: <1cd8a224-4038-43ba-bb11-a4cd8d015462@ewie.name>
References: <nb4cfr26yhqfdirpkuwqxiaalfgloceuhfnmyor7w2pwgud5wl@c3mb7yd6uz4q>
	<itvvmotar2z565azdxbtsc7ajpymer6xmqc7tzifzw4zuxnxo6@puia7azj3x5c>
	<CAKFQuwYcV+AZMbyzHyDdxFhp_GH5Nty_GL1U5JkPYJeya0MLYQ@mail.gmail.com>
	<73jtqglviqor5ozqrthjmau7nj4xi7z4obzaqflf7cvliaf4em@4obr7wqlqkye>
	<CAKFQuwYCqsapMBvQm9hTpD7urTaaOtJbpkpe7GaXr5ksMT58rA@mail.gmail.com>
	<efxy4vnyrwhowyyv7vk6s7ps6bwkyizdmaehs7mppjzapssvxl@n5nuyelnyfcj>
	<CA+TgmoZ4cUNV8BbMz6anMTsbcKkCQSs+V_ZWdCd5=2SB9pe67Q@mail.gmail.com>
	<CAKFQuwZQ2+YAerqxo4zJ0mreowBqe9T0k0KPvAaqwgvFNGOR5A@mail.gmail.com>
	<e905f37d-7535-4df7-b171-ce1e569f4b40@ewie.name>
	<CAKFQuwZkVT0RDoYzt-v=-+330xaEaVo=vqLOqezuLZZ5X5-3oA@mail.gmail.com>
	<1cd8a224-4038-43ba-bb11-a4cd8d015462@ewie.name>

Erik Wienhold <ewie@ewie.name> writes:
> Thanks, I didn't know that guideline.  Both fixed in v6.

This still isn't following our usual message style IMO.  Here's a
proposed v7 that outputs

-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.

I did a bit of copy-editing on the docs changes too.  One notable
point is that I dropped the parenthetical bit about "(name optionally
schema-qualified)".  That struck me as quite unnecessary, and
it definitely doesn't read well to have two parenthetical comments
in a single four-line sentence.

			regards, tom lane

Attachments:

v7-0001-Document-that-typed-tables-rely-on-CREATE-TYPE.patch (text/x-diff, 3.8K) download diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml index f19306e776..93b3f664f2 100644 --- a/doc/src/sgml/ref/create_table.sgml +++ b/doc/src/sgml/ref/create_table.sgml @@ -249,18 +249,18 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM <listitem> <para> Creates a <firstterm>typed table</firstterm>, which takes its - structure from the specified composite type (name optionally - schema-qualified). A typed table is tied to its type; for - example the table will be dropped if the type is dropped - (with <literal>DROP TYPE ... CASCADE</literal>). + structure from the specified stand-alone composite type (that is, + one created using <xref linkend="sql-createtype"/>) though it still + produces a new composite type as well. The table will have a + dependency on the referenced type, meaning that cascaded alter and + drop actions on that type will propagate to the table. </para> <para> - When a typed table is created, then the data types of the - columns are determined by the underlying composite type and are - not specified by the <literal>CREATE TABLE</literal> command. + A typed table always has the same column names and data types as the + type it is derived from, so you cannot specify additional columns. But the <literal>CREATE TABLE</literal> command can add defaults - and constraints to the table and can specify storage parameters. + and constraints to the table, as well as specify storage parameters. </para> </listitem> </varlistentry> diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 721d24783b..0b2a52463f 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 2e47ecbcf5..b6fbda3f21 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 9ef0cdfcc7..57ce12782b 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; =

view thread (17+ messages)  latest in thread

Message-ID: <1556597.1721939351@sss.pgh.pa.us>
Permalink:  ../1556597.1721939351@sss.pgh.pa.us/
Also on:    postgresql.org/message-id/1556597.1721939351@sss.pgh.pa.us

 ·  · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-hackers@postgresql.org
  Cc: tgl@sss.pgh.pa.us, ewie@ewie.name, david.g.johnston@gmail.com, robertmhaas@gmail.com, hannuk@google.com, peter@eisentraut.org, pgsql-hackers@lists.postgresql.org
  Subject: Re: CREATE TABLE creates a composite type corresponding to the table row, which is and is not there
  In-Reply-To: <1556597.1721939351@sss.pgh.pa.us>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox