Re: CREATE TABLE creates a composite type corresponding to the table row, which is and is not there

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: CREATE TABLE creates a composite type corresponding to the table row, which is and is not there
Дата
Msg-id 1556597.1721939351@sss.pgh.pa.us
обсуждение исходный текст
Ответ на Re: CREATE TABLE creates a composite type corresponding to the table row, which is and is not there  (Erik Wienhold <ewie@ewie.name>)
Ответы Re: CREATE TABLE creates a composite type corresponding to the table row, which is and is not there
Список pgsql-hackers
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

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;



В списке pgsql-hackers по дате отправления:

Предыдущее
От: Jeff Davis
Дата:
Сообщение: [18] separate collation and ctype versions, and cleanup of pg_database locale fields
Следующее
От: Tom Lane
Дата:
Сообщение: Re: [PATCH] Fix docs to use canonical links