]> granicus.if.org Git - postgresql/commitdiff
Support CREATE TABLE (LIKE ...) with foreign tables and views
authorPeter Eisentraut <peter_e@gmx.net>
Tue, 10 Jan 2012 19:46:29 +0000 (21:46 +0200)
committerPeter Eisentraut <peter_e@gmx.net>
Tue, 10 Jan 2012 19:46:29 +0000 (21:46 +0200)
Composite types are not yet supported, because parserOpenTable()
rejects them.

doc/src/sgml/ref/create_table.sgml
src/backend/parser/parse_utilcmd.c
src/test/regress/expected/create_table_like.out
src/test/regress/sql/create_table_like.sql

index 97968bb9eb2316c4dacaf0e4c80667d27cc4908e..f55a0010de50f4687098a8aaff1888f1c8a470ef 100644 (file)
@@ -368,6 +368,11 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI
       If the same name is specified explicitly or in another
       <literal>LIKE</literal> clause, an error is signalled.
      </para>
+     <para>
+      The <literal>LIKE</literal> clause can also be used to copy columns from
+      views or foreign tables.  Inapplicable options (e.g., <literal>INCLUDING
+      INDEXES</literal> from a view) are ignored.
+     </para>
     </listitem>
    </varlistentry>
 
index e14ae09e6f9797940de492154bc32cbd02608765..335bdc6b0754aabb0bbcac43dcfeb8c794817c32 100644 (file)
@@ -644,10 +644,12 @@ transformTableLikeClause(CreateStmtContext *cxt, TableLikeClause *table_like_cla
        relation = parserOpenTable(cxt->pstate, table_like_clause->relation,
                                                           AccessShareLock);
 
-       if (relation->rd_rel->relkind != RELKIND_RELATION)
+       if (relation->rd_rel->relkind != RELKIND_RELATION
+               && relation->rd_rel->relkind != RELKIND_VIEW
+               && relation->rd_rel->relkind != RELKIND_FOREIGN_TABLE)
                ereport(ERROR,
                                (errcode(ERRCODE_WRONG_OBJECT_TYPE),
-                                errmsg("LIKE source relation \"%s\" is not a table",
+                                errmsg("LIKE source relation \"%s\" is not a table, view, or foreign table",
                                                table_like_clause->relation->relname)));
 
        /*
index 9ff632ecee65264035a0cf7a141970cac49b5082..40b6766892a14f09c2018b37e6176d68d992f55e 100644 (file)
@@ -220,3 +220,22 @@ ERROR:  column "a" has a storage parameter conflict
 DETAIL:  MAIN versus EXTENDED
 DROP TABLE ctlt1, ctlt2, ctlt3, ctlt4, ctlt12_storage, ctlt12_comments, ctlt1_inh, ctlt13_inh, ctlt13_like, ctlt_all, ctla, ctlb CASCADE;
 NOTICE:  drop cascades to table inhe
+/* LIKE with other relation kinds */
+CREATE TABLE ctlt4 (a int, b text);
+CREATE SEQUENCE ctlseq1;
+CREATE TABLE ctlt10 (LIKE ctlseq1);  -- fail
+ERROR:  LIKE source relation "ctlseq1" is not a table, view, or foreign table
+CREATE VIEW ctlv1 AS SELECT * FROM ctlt4;
+CREATE TABLE ctlt11 (LIKE ctlv1);
+CREATE TABLE ctlt11a (LIKE ctlv1 INCLUDING ALL);
+CREATE TYPE ctlty1 AS (a int, b text);
+CREATE TABLE ctlt12 (LIKE ctlty1);  -- currently fails
+ERROR:  "ctlty1" is a composite type
+LINE 1: CREATE TABLE ctlt12 (LIKE ctlty1);
+                                  ^
+DROP SEQUENCE ctlseq1;
+DROP TYPE ctlty1;
+DROP VIEW ctlv1;
+DROP TABLE IF EXISTS ctlt4, ctlt10, ctlt11, ctlt11a, ctlt12;
+NOTICE:  table "ctlt10" does not exist, skipping
+NOTICE:  table "ctlt12" does not exist, skipping
index 58cea443381607181b8498f9a32806dceae15ed6..db66e48d45713c1af076a63940ae7154b9c1907a 100644 (file)
@@ -97,3 +97,23 @@ CREATE TABLE inh_error1 () INHERITS (ctlt1, ctlt4);
 CREATE TABLE inh_error2 (LIKE ctlt4 INCLUDING STORAGE) INHERITS (ctlt1);
 
 DROP TABLE ctlt1, ctlt2, ctlt3, ctlt4, ctlt12_storage, ctlt12_comments, ctlt1_inh, ctlt13_inh, ctlt13_like, ctlt_all, ctla, ctlb CASCADE;
+
+
+/* LIKE with other relation kinds */
+
+CREATE TABLE ctlt4 (a int, b text);
+
+CREATE SEQUENCE ctlseq1;
+CREATE TABLE ctlt10 (LIKE ctlseq1);  -- fail
+
+CREATE VIEW ctlv1 AS SELECT * FROM ctlt4;
+CREATE TABLE ctlt11 (LIKE ctlv1);
+CREATE TABLE ctlt11a (LIKE ctlv1 INCLUDING ALL);
+
+CREATE TYPE ctlty1 AS (a int, b text);
+CREATE TABLE ctlt12 (LIKE ctlty1);  -- currently fails
+
+DROP SEQUENCE ctlseq1;
+DROP TYPE ctlty1;
+DROP VIEW ctlv1;
+DROP TABLE IF EXISTS ctlt4, ctlt10, ctlt11, ctlt11a, ctlt12;