Extended statistics are copied to the new table if
<literal>INCLUDING STATISTICS</literal> is specified.
</para>
+ <para>
+ Distribution strategy is copied to the new table if
+ <literal>INCLUDING DISTRIBUTE</literal> is specified.
+ </para>
+ <para>
+ Distribution nodes are copied to the new table if
+ <literal>INCLUDING NODE</literal> is specified.
+ </para>
<para>
Indexes, <literal>PRIMARY KEY</>, <literal>UNIQUE</>,
and <literal>EXCLUDE</> constraints on the original table will be
</para>
<para>
<literal>INCLUDING ALL</literal> is an abbreviated form of
- <literal>INCLUDING COMMENTS INCLUDING CONSTRAINTS INCLUDING DEFAULTS INCLUDING IDENTITY INCLUDING INDEXES INCLUDING STATISTICS INCLUDING STORAGE</literal>.
+ <literal>INCLUDING COMMENTS INCLUDING CONSTRAINTS INCLUDING DEFAULTS INCLUDING IDENTITY INCLUDING INDEXES INCLUDING STATISTICS INCLUDING STORAGE INCLUDING DISTRIBUTE INCLUDING NODE</literal>.
</para>
<para>
Note that unlike <literal>INHERITS</literal>, columns and
| INDEXES { $$ = CREATE_TABLE_LIKE_INDEXES; }
| STATISTICS { $$ = CREATE_TABLE_LIKE_STATISTICS; }
| STORAGE { $$ = CREATE_TABLE_LIKE_STORAGE; }
+ | DISTRIBUTE { $$ = CREATE_TABLE_LIKE_DISTRIBUTE; }
+ | NODE { $$ = CREATE_TABLE_LIKE_NODE; }
| ALL { $$ = CREATE_TABLE_LIKE_ALL; }
;
List *alist; /* "after list" of things to do after creating
* the table */
IndexStmt *pkey; /* PRIMARY KEY index, if any */
+
#ifdef PGXC
FallbackSrc fallback_source;
List *fallback_dist_cols;
- DistributeBy *distributeby; /* original distribute by column of CREATE TABLE */
- PGXCSubCluster *subcluster; /* original subcluster option of CREATE TABLE */
+
+ /* original or derived distribute by column of CREATE TABLE */
+ DistributeBy *distributeby;
+ /* original or derived subcluster option of CREATE TABLE */
+ PGXCSubCluster *subcluster;
#endif
bool ispartitioned; /* true if table is partitioned */
PartitionBoundSpec *partbound; /* transformed FOR VALUES */
stmt->tableElts = cxt.columns;
stmt->constraints = cxt.ckconstraints;
+ if (stmt->distributeby == NULL)
+ stmt->distributeby = cxt.distributeby;
+ if (stmt->subcluster == NULL)
+ stmt->subcluster = cxt.subcluster;
+
result = lappend(cxt.blist, stmt);
result = list_concat(result, cxt.alist);
result = list_concat(result, save_alist);
AclResult aclresult;
char *comment;
ParseCallbackState pcbstate;
+ RelationLocInfo *rel_loc_info;
setup_parser_errposition_callback(&pcbstate, cxt->pstate,
table_like_clause->relation->location);
RelationGetRelationName(relation));
}
+ rel_loc_info = RelationGetLocInfo(relation);
+
+ if ((table_like_clause->options & CREATE_TABLE_LIKE_DISTRIBUTE) &&
+ (cxt->distributeby == NULL) &&
+ (rel_loc_info != NULL))
+ {
+ cxt->distributeby = makeNode(DistributeBy);
+ switch (rel_loc_info->locatorType)
+ {
+ case LOCATOR_TYPE_HASH:
+ cxt->distributeby->disttype = DISTTYPE_HASH;
+ cxt->distributeby->colname = pstrdup(rel_loc_info->partAttrName);
+ break;
+ case LOCATOR_TYPE_MODULO:
+ cxt->distributeby->disttype = DISTTYPE_MODULO;
+ cxt->distributeby->colname = pstrdup(rel_loc_info->partAttrName);
+ break;
+ case LOCATOR_TYPE_RROBIN:
+ cxt->distributeby->disttype = DISTTYPE_ROUNDROBIN;
+ break;
+ case LOCATOR_TYPE_REPLICATED:
+ cxt->distributeby->disttype = DISTTYPE_REPLICATION;
+ break;
+ }
+ }
+
+ if ((table_like_clause->options & CREATE_TABLE_LIKE_NODE) &&
+ (cxt->subcluster == NULL) &&
+ (rel_loc_info != NULL))
+ {
+ if (rel_loc_info->rl_nodeList)
+ cxt->subcluster = makeSubCluster(rel_loc_info->rl_nodeList);
+ }
+
tupleDesc = RelationGetDescr(relation);
constr = tupleDesc->constr;
CREATE_TABLE_LIKE_STORAGE = 1 << 4,
CREATE_TABLE_LIKE_COMMENTS = 1 << 5,
CREATE_TABLE_LIKE_STATISTICS = 1 << 6,
+ CREATE_TABLE_LIKE_DISTRIBUTE = 1 << 7,
+ CREATE_TABLE_LIKE_NODE = 1 << 8,
CREATE_TABLE_LIKE_ALL = PG_INT32_MAX
} TableLikeOption;
DROP TABLE has_oid, no_oid, like_test, like_test2, like_test3,
like_test4, like_test5;
+-- xl tests
+CREATE TABLE like_test6 (a INT, b INT, c TEXT) DISTRIBUTE BY HASH(b);
+CREATE TABLE like_test7 (LIKE like_test6 INCLUDING ALL);
+\d+ like_test7
+ Table "public.like_test7"
+ Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
+--------+---------+-----------+----------+---------+----------+--------------+-------------
+ a | integer | | | | plain | |
+ b | integer | | | | plain | |
+ c | text | | | | extended | |
+Distribute By: HASH(b)
+Location Nodes: ALL DATANODES
+
+DROP TABLE like_test7;
+CREATE TABLE like_test7 (LIKE like_test6 INCLUDING DISTRIBUTE);
+\d+ like_test7
+ Table "public.like_test7"
+ Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
+--------+---------+-----------+----------+---------+----------+--------------+-------------
+ a | integer | | | | plain | |
+ b | integer | | | | plain | |
+ c | text | | | | extended | |
+Distribute By: HASH(b)
+Location Nodes: ALL DATANODES
+
+DROP TABLE like_test7;
+-- explicit distribution clause overwrites like clause
+CREATE TABLE like_test7 (LIKE like_test6 INCLUDING DISTRIBUTE) DISTRIBUTE BY REPLICATION;
+\d+ like_test7
+ Table "public.like_test7"
+ Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
+--------+---------+-----------+----------+---------+----------+--------------+-------------
+ a | integer | | | | plain | |
+ b | integer | | | | plain | |
+ c | text | | | | extended | |
+Distribute By: REPLICATION
+Location Nodes: ALL DATANODES
+
+DROP TABLE like_test7;
+DROP TABLE like_test6;
+CREATE TABLE like_test6 (a INT, b INT, c TEXT) DISTRIBUTE BY HASH(b) TO NODE (datanode_1);
+CREATE TABLE like_test7 (LIKE like_test6 INCLUDING DISTRIBUTE INCLUDING NODE);
+\d+ like_test7
+ Table "public.like_test7"
+ Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
+--------+---------+-----------+----------+---------+----------+--------------+-------------
+ a | integer | | | | plain | |
+ b | integer | | | | plain | |
+ c | text | | | | extended | |
+Distribute By: HASH(b)
+Location Nodes: datanode_1
+
+DROP TABLE like_test7;
+-- check if excluding works ok
+CREATE TABLE like_test7 (LIKE like_test6 INCLUDING DISTRIBUTE EXCLUDING NODE);
+\d+ like_test7
+ Table "public.like_test7"
+ Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
+--------+---------+-----------+----------+---------+----------+--------------+-------------
+ a | integer | | | | plain | |
+ b | integer | | | | plain | |
+ c | text | | | | extended | |
+Distribute By: HASH(b)
+Location Nodes: ALL DATANODES
+
+DROP TABLE like_test7;
+DROP TABLE like_test6;
SELECT oid FROM like_test5;
DROP TABLE has_oid, no_oid, like_test, like_test2, like_test3,
like_test4, like_test5;
+
+-- xl tests
+CREATE TABLE like_test6 (a INT, b INT, c TEXT) DISTRIBUTE BY HASH(b);
+CREATE TABLE like_test7 (LIKE like_test6 INCLUDING ALL);
+\d+ like_test7
+DROP TABLE like_test7;
+CREATE TABLE like_test7 (LIKE like_test6 INCLUDING DISTRIBUTE);
+\d+ like_test7
+DROP TABLE like_test7;
+-- explicit distribution clause overwrites like clause
+CREATE TABLE like_test7 (LIKE like_test6 INCLUDING DISTRIBUTE) DISTRIBUTE BY REPLICATION;
+\d+ like_test7
+DROP TABLE like_test7;
+DROP TABLE like_test6;
+CREATE TABLE like_test6 (a INT, b INT, c TEXT) DISTRIBUTE BY HASH(b) TO NODE (datanode_1);
+CREATE TABLE like_test7 (LIKE like_test6 INCLUDING DISTRIBUTE INCLUDING NODE);
+\d+ like_test7
+DROP TABLE like_test7;
+-- check if excluding works ok
+CREATE TABLE like_test7 (LIKE like_test6 INCLUDING DISTRIBUTE EXCLUDING NODE);
+\d+ like_test7
+DROP TABLE like_test7;
+DROP TABLE like_test6;