[ WITH ( <replaceable class="PARAMETER">storage_parameter</replaceable> [= <replaceable class="PARAMETER">value</replaceable>] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE <replaceable class="PARAMETER">tablespace_name</replaceable> ]
-[ DISTRIBUTE BY { REPLICATION | ROUNDROBIN | { [HASH | MODULO ] ( <replaceable class="PARAMETER">column_name</replaceable> ) } } ]
+[
+ DISTRIBUTE BY { REPLICATION | ROUNDROBIN | { [HASH | MODULO ] ( <replaceable class="PARAMETER">column_name</replaceable> ) } } |
+ DISTRIBUTED { BY ( <replaceable class="PARAMETER">column_name</replaceable> ) } |
+ DISTSTYLE { EVEN | KEY | ALL } DISTKEY ( <replaceable class="PARAMETER">column_name</replaceable> )
+]
[ TO { GROUP <replaceable class="PARAMETER">groupname</replaceable> | NODE ( <replaceable class="PARAMETER">nodename</replaceable> [, ... ] ) } ]
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] <replaceable class="PARAMETER">table_name</replaceable>
[ WITH ( <replaceable class="PARAMETER">storage_parameter</replaceable> [= <replaceable class="PARAMETER">value</replaceable>] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE <replaceable class="PARAMETER">tablespace_name</replaceable> ]
-[ DISTRIBUTE BY { REPLICATION | ROUNDROBIN | { [HASH | MODULO ] ( <replaceable class="PARAMETER">column_name</replaceable> ) } } ]
+[
+ DISTRIBUTE BY { REPLICATION | ROUNDROBIN | { [HASH | MODULO ] ( <replaceable class="PARAMETER">column_name</replaceable> ) } } |
+ DISTRIBUTED { BY ( <replaceable class="PARAMETER">column_name</replaceable> ) } |
+ DISTSTYLE { EVEN | KEY | ALL } DISTKEY ( <replaceable class="PARAMETER">column_name</replaceable> )
+]
[ TO { GROUP <replaceable class="PARAMETER">groupname</replaceable> | NODE ( <replaceable class="PARAMETER">nodename</replaceable> [, ... ] ) } ]
<phrase>where <replaceable class="PARAMETER">column_constraint</replaceable> is:</phrase>
[ WITH ( <replaceable class="PARAMETER">storage_parameter</replaceable> [= <replaceable class="PARAMETER">value</replaceable>] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE <replaceable class="PARAMETER">tablespace_name</replaceable> ]
- [ DISTRIBUTE BY { REPLICATION | ROUNDROBIN | { [HASH | MODULO ] ( <replaceable class="PARAMETER">column_name</replaceable> ) } } ]
+ [
+ DISTRIBUTE BY { REPLICATION | ROUNDROBIN | { [HASH | MODULO ] ( <replaceable class="PARAMETER">column_name</replaceable> ) } } |
+ DISTRIBUTED { BY ( <replaceable class="PARAMETER">column_name</replaceable> ) } |
+ DISTSTYLE { EVEN | KEY | ALL } DISTKEY ( <replaceable class="PARAMETER">column_name</replaceable> )
+ ]
[ TO { GROUP <replaceable class="PARAMETER">groupname</replaceable> | NODE ( <replaceable class="PARAMETER">nodename</replaceable> [, ... ] ) } ]
AS <replaceable>query</replaceable>
[ WITH [ NO ] DATA ]
opt_frame_clause frame_extent frame_bound
%type <str> opt_existing_window_name
/* PGXC_BEGIN */
-%type <str> opt_barrier_id OptDistributeType
+%type <str> opt_barrier_id OptDistributeType DistributeStyle OptDistKey
%type <distby> OptDistributeBy OptDistributeByInternal
%type <subclus> OptSubCluster OptSubClusterInternal
/* PGXC_END */
*/
/* 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 <keyword> 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
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
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);
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; }
| DISABLE_P
| DISCARD
/* PGXC_BEGIN */
+ | DISTKEY
| DISTRIBUTE
| DISTRIBUTED
+ | DISTSTYLE
/* PGXC_END */
| DOCUMENT_P
| DOMAIN_P
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)