From: Pavan Deolasee Date: Fri, 15 Jan 2016 10:34:10 +0000 (+0530) Subject: Support yet another syntax for specifying distribution strategy for X-Git-Tag: XL9_5_R1BETA1~97 X-Git-Url: http://git.postgresql.org/gitweb/static/gitweb.js?a=commitdiff_plain;h=c676d7f98e227dd2e173d9176d540f81b508cfbc;p=postgres-xl.git Support yet another syntax for specifying distribution strategy for a table DISTSTYLE KEY DISTKEY (col) maps to DISTRIBUTE BY HASH (col) DISTSTYLE EVEN maps to DISTRIBUTE BY ROUNDROBIN DISTSTYLE ALL maps to DISTRIBUTE BY REPLICATION --- diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml index c001195d56..1a87c24b41 100755 --- a/doc/src/sgml/ref/create_table.sgml +++ b/doc/src/sgml/ref/create_table.sgml @@ -31,7 +31,11 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI [ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ] [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ] [ TABLESPACE tablespace_name ] -[ DISTRIBUTE BY { REPLICATION | ROUNDROBIN | { [HASH | MODULO ] ( column_name ) } } ] +[ + DISTRIBUTE BY { REPLICATION | ROUNDROBIN | { [HASH | MODULO ] ( column_name ) } } | + DISTRIBUTED { BY ( column_name ) } | + DISTSTYLE { EVEN | KEY | ALL } DISTKEY ( column_name ) +] [ TO { GROUP groupname | NODE ( nodename [, ... ] ) } ] CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name @@ -43,7 +47,11 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI [ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ] [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ] [ TABLESPACE tablespace_name ] -[ DISTRIBUTE BY { REPLICATION | ROUNDROBIN | { [HASH | MODULO ] ( column_name ) } } ] +[ + DISTRIBUTE BY { REPLICATION | ROUNDROBIN | { [HASH | MODULO ] ( column_name ) } } | + DISTRIBUTED { BY ( column_name ) } | + DISTSTYLE { EVEN | KEY | ALL } DISTKEY ( column_name ) +] [ TO { GROUP groupname | NODE ( nodename [, ... ] ) } ] where column_constraint is: diff --git a/doc/src/sgml/ref/create_table_as.sgml b/doc/src/sgml/ref/create_table_as.sgml index 790597f9d3..273157b243 100755 --- a/doc/src/sgml/ref/create_table_as.sgml +++ b/doc/src/sgml/ref/create_table_as.sgml @@ -26,7 +26,11 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI [ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ] [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ] [ TABLESPACE tablespace_name ] - [ DISTRIBUTE BY { REPLICATION | ROUNDROBIN | { [HASH | MODULO ] ( column_name ) } } ] + [ + DISTRIBUTE BY { REPLICATION | ROUNDROBIN | { [HASH | MODULO ] ( column_name ) } } | + DISTRIBUTED { BY ( column_name ) } | + DISTSTYLE { EVEN | KEY | ALL } DISTKEY ( column_name ) + ] [ TO { GROUP groupname | NODE ( nodename [, ... ] ) } ] AS query [ WITH [ NO ] DATA ] diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 8d272573c0..3d12c3cc03 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -552,7 +552,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); opt_frame_clause frame_extent frame_bound %type opt_existing_window_name /* PGXC_BEGIN */ -%type opt_barrier_id OptDistributeType +%type opt_barrier_id OptDistributeType DistributeStyle OptDistKey %type OptDistributeBy OptDistributeByInternal %type OptSubCluster OptSubClusterInternal /* PGXC_END */ @@ -580,7 +580,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); */ /* ordinary key words in alphabetical order */ -/* PGXC - added DISTRIBUTE, DISTRIBUTED, RANDOMLY, DIRECT, COORDINATOR, CLEAN, NODE, BARRIER */ +/* PGXC - added DISTRIBUTE, DISTRIBUTED, DISTSYLE, DISTKEY, RANDOMLY, DIRECT, COORDINATOR, CLEAN, NODE, BARRIER */ %token ABORT_P ABSOLUTE_P ACCESS ACTION ADD_P ADMIN AFTER AGGREGATE ALL ALSO ALTER ALWAYS ANALYSE ANALYZE AND ANY ARRAY AS ASC ASSERTION ASSIGNMENT ASYMMETRIC AT ATTRIBUTE AUTHORIZATION @@ -600,7 +600,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); DATA_P DATABASE DAY_P DEALLOCATE DEC DECIMAL_P DECLARE DEFAULT DEFAULTS DEFERRABLE DEFERRED DEFINER DELETE_P DELIMITER DELIMITERS DESC /* PGXC_BEGIN */ - DICTIONARY DIRECT DISABLE_P DISCARD DISTINCT DISTRIBUTE DISTRIBUTED DO DOCUMENT_P DOMAIN_P DOUBLE_P + DICTIONARY DIRECT DISABLE_P DISCARD DISTINCT DISTKEY DISTRIBUTE DISTRIBUTED + DISTSTYLE DO DOCUMENT_P DOMAIN_P DOUBLE_P /* PGXC_END */ DROP @@ -3569,6 +3570,22 @@ OptDistributeBy: OptDistributeByInternal { $$ = $1; } OptDistributeType: IDENT { $$ = $1; } ; +DistributeStyle: ALL { $$ = strdup("all"); } + | KEY { $$ = strdup("key"); } + | IDENT + { + if (strcmp($1, "even") != 0) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("unrecognized distribution style \"%s\"", $1))); + $$ = $1; + } + ; + +OptDistKey: DISTKEY '(' name ')' { $$ = $3; } + | /* EMPTY */ { $$ = NULL; } + ; + OptDistributeByInternal: DISTRIBUTE BY OptDistributeType '(' name ')' { DistributeBy *n = makeNode(DistributeBy); @@ -3611,6 +3628,34 @@ OptDistributeByInternal: DISTRIBUTE BY OptDistributeType '(' name ')' n->colname = NULL; $$ = n; } + | DISTSTYLE DistributeStyle OptDistKey + { + DistributeBy *n = makeNode(DistributeBy); + if (strcmp($2, "even") == 0) + n->disttype = DISTTYPE_ROUNDROBIN; + else if (strcmp($2, "key") == 0) + n->disttype = DISTTYPE_HASH; + else if (strcmp($2, "all") == 0) + n->disttype = DISTTYPE_REPLICATION; + else + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("unrecognized distribution style \"%s\"", $2))); + if ((n->disttype == DISTTYPE_ROUNDROBIN || + n->disttype == DISTTYPE_REPLICATION) && + ($3 != NULL)) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("distribution key cannot be specified for distribution style \"%s\"", $2))); + + if ((n->disttype == DISTTYPE_HASH) && ($3 == NULL)) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("distribution key must be specified for distribution style \"%s\"", $2))); + + n->colname = $3; + $$ = n; + } ; OptSubCluster: OptSubClusterInternal { $$ = $1; } @@ -14143,8 +14188,10 @@ unreserved_keyword: | DISABLE_P | DISCARD /* PGXC_BEGIN */ + | DISTKEY | DISTRIBUTE | DISTRIBUTED + | DISTSTYLE /* PGXC_END */ | DOCUMENT_P | DOMAIN_P diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h index ec5c880c91..13ac665f82 100644 --- a/src/include/parser/kwlist.h +++ b/src/include/parser/kwlist.h @@ -140,8 +140,10 @@ PG_KEYWORD("disable", DISABLE_P, UNRESERVED_KEYWORD) PG_KEYWORD("discard", DISCARD, UNRESERVED_KEYWORD) PG_KEYWORD("distinct", DISTINCT, RESERVED_KEYWORD) #ifdef PGXC +PG_KEYWORD("distkey", DISTKEY, UNRESERVED_KEYWORD) PG_KEYWORD("distribute", DISTRIBUTE, UNRESERVED_KEYWORD) PG_KEYWORD("distributed", DISTRIBUTED, UNRESERVED_KEYWORD) +PG_KEYWORD("diststyle", DISTSTYLE, UNRESERVED_KEYWORD) #endif PG_KEYWORD("do", DO, RESERVED_KEYWORD) PG_KEYWORD("document", DOCUMENT_P, UNRESERVED_KEYWORD)