From f0795b394991874289658fb51d83dce9a11f026e Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 28 Jul 2016 13:26:59 -0400 Subject: [PATCH] Improve documentation about CREATE TABLE ... LIKE. The docs failed to explain that LIKE INCLUDING INDEXES would not preserve the names of indexes and associated constraints. Also, it wasn't mentioned that EXCLUDE constraints would be copied by this option. The latter oversight seems enough of a documentation bug to justify back-patching. In passing, do some minor copy-editing in the same area, and add an entry for LIKE under "Compatibility", since it's not exactly a faithful implementation of the standard's feature. Discussion: <20160728151154.AABE64016B@smtp.hushmail.com> --- doc/src/sgml/ref/create_table.sgml | 51 ++++++++++++++++++++---------- src/backend/parser/parse_utilcmd.c | 4 ++- 2 files changed, 38 insertions(+), 17 deletions(-) diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml index 0a6e0fc87a8..fc92d6bc588 100644 --- a/doc/src/sgml/ref/create_table.sgml +++ b/doc/src/sgml/ref/create_table.sgml @@ -321,26 +321,33 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI table. - Default expressions for the copied column definitions will only be - copied if INCLUDING DEFAULTS is specified. The + Default expressions for the copied column definitions will be copied + only if INCLUDING DEFAULTS is specified. The default behavior is to exclude default expressions, resulting in the copied columns in the new table having null defaults. + Note that copying defaults that call database-modification functions, + such as nextval, may create a functional linkage between + the original and new tables. Not-null constraints are always copied to the new table. - CHECK constraints will only be copied if - INCLUDING CONSTRAINTS is specified; other types of - constraints will never be copied. Also, no distinction is made between - column constraints and table constraints — when constraints are - requested, all check constraints are copied. + CHECK constraints will be copied only if + INCLUDING CONSTRAINTS is specified. + No distinction is made between column constraints and table + constraints. - Any indexes on the original table will not be created on the new - table, unless the INCLUDING INDEXES clause is - specified. + Indexes, PRIMARY KEY, UNIQUE, + and EXCLUDE constraints on the original table will be + created on the new table only if INCLUDING INDEXES + is specified. Names for the new indexes and constraints are + chosen according to the default rules, regardless of how the originals + were named. (This behavior avoids possible duplicate-name failures for + the new indexes.) - STORAGE settings for the copied column definitions will only - be copied if INCLUDING STORAGE is specified. The + + STORAGE settings for the copied column definitions will be + copied only if INCLUDING STORAGE is specified. The default behavior is to exclude STORAGE settings, resulting in the copied columns in the new table having type-specific default settings. For more on STORAGE settings, see @@ -348,19 +355,20 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI Comments for the copied columns, constraints, and indexes - will only be copied if INCLUDING COMMENTS + will be copied only if INCLUDING COMMENTS is specified. The default behavior is to exclude comments, resulting in the copied columns and constraints in the new table having no comments. - INCLUDING ALL is an abbreviated form of + + INCLUDING ALL is an abbreviated form of INCLUDING DEFAULTS INCLUDING CONSTRAINTS INCLUDING INDEXES INCLUDING STORAGE INCLUDING COMMENTS. - Note also that unlike INHERITS, columns and + Note that unlike INHERITS, columns and constraints copied by LIKE are not merged with similarly named columns and constraints. If the same name is specified explicitly or in another - LIKE clause, an error is signalled. + LIKE clause, an error is signaled. @@ -1381,6 +1389,17 @@ CREATE TABLE employees OF employee_type ( + + <literal>LIKE</> Clause + + + While a LIKE clause exists in the SQL standard, many of the + options that PostgreSQL accepts for it are not + in the standard, and some of the standard's options are not implemented + by PostgreSQL. + + + <literal>WITH</> Clause diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c index eb4e4212fc9..0ba59927eed 100644 --- a/src/backend/parser/parse_utilcmd.c +++ b/src/backend/parser/parse_utilcmd.c @@ -1010,7 +1010,9 @@ generateClonedIndexStmt(CreateStmtContext *cxt, Relation source_idx, /* * We don't try to preserve the name of the source index; instead, just - * let DefineIndex() choose a reasonable name. + * let DefineIndex() choose a reasonable name. (If we tried to preserve + * the name, we'd get duplicate-relation-name failures unless the source + * table was in a different schema.) */ index->idxname = NULL; -- 2.30.2