From 79a19a004d01ea193799a3963f4202bc49d0d63e Mon Sep 17 00:00:00 2001 From: yupeng Date: Thu, 5 Nov 2020 21:29:47 +0800 Subject: [PATCH] support foreign key --- doc/src/sgml/ref/alter_table.sgmlin | 4 +- doc/src/sgml/ref/create_table.sgmlin | 6 +- .../sgml/ref/create_table_partition.sgmlin | 4 +- src/test/regress/expected/alter_table_000.out | 87 +++++++++++++++++ src/test/regress/expected/create_table.out | 95 +++++++++++++++++++ src/test/regress/sql/alter_table_000.sql | 2 + src/test/regress/sql/create_table.sql | 3 + 7 files changed, 197 insertions(+), 4 deletions(-) diff --git a/doc/src/sgml/ref/alter_table.sgmlin b/doc/src/sgml/ref/alter_table.sgmlin index 77c015684..894c02f14 100755 --- a/doc/src/sgml/ref/alter_table.sgmlin +++ b/doc/src/sgml/ref/alter_table.sgmlin @@ -80,7 +80,9 @@ where table_constraint can be: { CHECK ( expression ) | UNIQUE ( column_name [, ... ] ) index_parameters | PRIMARY KEY ( column_name [, ... ] ) index_parameters | - PARTIAL CLUSTER KEY ( column_name [, ... ] ) } + PARTIAL CLUSTER KEY ( column_name [, ... ] ) | + FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ] + [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] } [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] where index_parameters can be: [ WITH ( {storage_parameter = value} [, ... ] ) ] diff --git a/doc/src/sgml/ref/create_table.sgmlin b/doc/src/sgml/ref/create_table.sgmlin index 272a7351b..ac0390dc0 100644 --- a/doc/src/sgml/ref/create_table.sgmlin +++ b/doc/src/sgml/ref/create_table.sgmlin @@ -35,7 +35,9 @@ where table_constraint can be: { CHECK ( expression ) | UNIQUE ( column_name [, ... ] ) index_parameters | PRIMARY KEY ( column_name [, ... ] ) index_parameters | - PARTIAL CLUSTER KEY ( column_name [, ... ] ) } + PARTIAL CLUSTER KEY ( column_name [, ... ] ) | + FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ] + [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] } [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] where compress_mode can be: { DELTA | PREFIX | DICTIONARY | NUMSTR | NOCOMPRESS } @@ -46,4 +48,4 @@ where index_parameters can be: [ USING INDEX TABLESPACE tablespace_name ] - \ No newline at end of file + diff --git a/doc/src/sgml/ref/create_table_partition.sgmlin b/doc/src/sgml/ref/create_table_partition.sgmlin index 42d3a0593..b1e73446e 100644 --- a/doc/src/sgml/ref/create_table_partition.sgmlin +++ b/doc/src/sgml/ref/create_table_partition.sgmlin @@ -40,7 +40,9 @@ where table_constraint can be: [ CONSTRAINT constraint_name ] { CHECK ( expression ) | UNIQUE ( column_name [, ... ] ) index_parameters | - PRIMARY KEY ( column_name [, ... ] ) index_parameters} + PRIMARY KEY ( column_name [, ... ] ) index_parameters | + FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ] + [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] } [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] where index_parameters can be: [ WITH ( {storage_parameter = value} [, ... ] ) ] diff --git a/src/test/regress/expected/alter_table_000.out b/src/test/regress/expected/alter_table_000.out index acc7ad3a3..0d3d8f50e 100644 --- a/src/test/regress/expected/alter_table_000.out +++ b/src/test/regress/expected/alter_table_000.out @@ -1,6 +1,93 @@ -- --- ALTER TABLE related tickets or bugs fixed -- +-- ATLER TABLE SYNTAX +\h alter table +Command: ALTER TABLE +Description: change the definition of a table +Syntax: +ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name )} + action [, ... ]; +ALTER TABLE [ IF EXISTS ] table_name + ADD ( { column_name data_type [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ]} [, ...] ); +ALTER TABLE [ IF EXISTS ] table_name + MODIFY ( { column_name data_type | column_name [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ] | column_name [ CONSTRAINT constraint_name ] NULL } [, ...] ); +ALTER TABLE [ IF EXISTS ] table_name + RENAME TO new_table_name; +ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name )} + RENAME [ COLUMN ] column_name TO new_column_name; +ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name )} + RENAME CONSTRAINT constraint_name TO new_constraint_name; +ALTER TABLE [ IF EXISTS ] table_name + SET SCHEMA new_schema; + +where action can be: +column_clause + | ADD table_constraint [ NOT VALID ] + | ADD table_constraint_using_index + | VALIDATE CONSTRAINT constraint_name + | DROP CONSTRAINT [ IF EXISTS ] constraint_name [ RESTRICT | CASCADE ] + | CLUSTER ON index_name + | SET WITHOUT CLUSTER + | SET ( {storage_parameter = value} [, ... ] ) + | RESET ( storage_parameter [, ... ] ) + | OWNER TO new_owner + | SET TABLESPACE new_tablespace + | SET {COMPRESS|NOCOMPRESS} + | TO { GROUP groupname | NODE ( nodename [, ... ] ) } + | ADD NODE ( nodename [, ... ] ) + | DELETE NODE ( nodename [, ... ] ) + | DISABLE TRIGGER [ trigger_name | ALL | USER ] + | ENABLE TRIGGER [ trigger_name | ALL | USER ] + | ENABLE REPLICA TRIGGER trigger_name + | ENABLE ALWAYS TRIGGER trigger_name + | ENABLE ROW LEVEL SECURITY + | DISABLE ROW LEVEL SECURITY + | FORCE ROW LEVEL SECURITY + | NO FORCE ROW LEVEL SECURITY +where column_clause can be: +ADD [ COLUMN ] column_name data_type [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ] + | MODIFY column_name data_type + | MODIFY column_name [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ] + | MODIFY column_name [ CONSTRAINT constraint_name ] NULL + | DROP [ COLUMN ] [ IF EXISTS ] column_name [ RESTRICT | CASCADE ] + | ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ USING expression ] + | ALTER [ COLUMN ] column_name { SET DEFAULT expression | DROP DEFAULT } + | ALTER [ COLUMN ] column_name { SET | DROP } NOT NULL + | ALTER [ COLUMN ] column_name SET STATISTICS [PERCENT] integer + | ADD STATISTICS (( column_1_name, column_2_name [, ...] )) + | DELETE STATISTICS (( column_1_name, column_2_name [, ...] )) + | ALTER [ COLUMN ] column_name SET ( {attribute_option = value} [, ... ] ) + | ALTER [ COLUMN ] column_name RESET ( attribute_option [, ... ] ) + | ALTER [ COLUMN ] column_name SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN } +where column_constraint can be: +[ CONSTRAINT constraint_name ] + { NOT NULL | + NULL | + CHECK ( expression ) | + DEFAULT default_expr | + UNIQUE index_parameters | + PRIMARY KEY index_parameters } + [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] +where compress_mode can be: +{ DELTA | PREFIX | DICTIONARY | NUMSTR | NOCOMPRESS } +where table_constraint can be: +[ CONSTRAINT constraint_name ] + { CHECK ( expression ) | + UNIQUE ( column_name [, ... ] ) index_parameters | + PRIMARY KEY ( column_name [, ... ] ) index_parameters | + PARTIAL CLUSTER KEY ( column_name [, ... ] ) | + FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ] + [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] } + [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] +where index_parameters can be: +[ WITH ( {storage_parameter = value} [, ... ] ) ] + [ USING INDEX TABLESPACE tablespace_name ] +where table_constraint_using_index can be: +[ CONSTRAINT constraint_name ] + { UNIQUE | PRIMARY KEY } USING INDEX index_name + [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] + --custom script --create table CREATE TABLE TBL_DOMAIN diff --git a/src/test/regress/expected/create_table.out b/src/test/regress/expected/create_table.out index c043560b4..9309cc0f6 100644 --- a/src/test/regress/expected/create_table.out +++ b/src/test/regress/expected/create_table.out @@ -1,6 +1,101 @@ -- -- CREATE_TABLE -- +-- CREATE TABLE SYNTAX +\h create table +Command: CREATE TABLE +Description: define a new table +Syntax: +CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name +({ column_name data_type [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ] + | table_constraint + | LIKE source_table [ like_option [...] ] } + [, ... ]) +[ WITH ( {storage_parameter = value} [, ... ] ) ] +[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ] +[ COMPRESS | NOCOMPRESS ] +[ TABLESPACE tablespace_name ] +[ TO { GROUP groupname | NODE ( nodename [, ... ] ) } ]; + +where column_constraint can be: +[ CONSTRAINT constraint_name ] +{ NOT NULL | + NULL | + CHECK ( expression ) | + DEFAULT default_expr | + UNIQUE index_parameters | + PRIMARY KEY index_parameters } +[ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] +where table_constraint can be: +[ CONSTRAINT constraint_name ] +{ CHECK ( expression ) | + UNIQUE ( column_name [, ... ] ) index_parameters | + PRIMARY KEY ( column_name [, ... ] ) index_parameters | + PARTIAL CLUSTER KEY ( column_name [, ... ] ) | + FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ] + [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] } +[ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] +where compress_mode can be: +{ DELTA | PREFIX | DICTIONARY | NUMSTR | NOCOMPRESS } +where like_option can be: +{ INCLUDING | EXCLUDING } { DEFAULTS | CONSTRAINTS | INDEXES | STORAGE | COMMENTS | PARTITION | RELOPTIONS | DISTRIBUTION | ALL } +where index_parameters can be: +[ WITH ( {storage_parameter = value} [, ... ] ) ] +[ USING INDEX TABLESPACE tablespace_name ] + +\h create table part +Command: CREATE TABLE PARTITION +Description: define a new table partition +Syntax: +CREATE TABLE [ IF NOT EXISTS ] partition_table_name +( [ + { column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ] + | table_constraint + | LIKE source_table [ like_option [...] ] } + [, ... ] +] ) +[ WITH ( {storage_parameter = value} [, ... ] ) ] +[ COMPRESS | NOCOMPRESS ] +[ TABLESPACE tablespace_name ] +[ TO { GROUP groupname | NODE ( nodename [, ... ] ) } ] +PARTITION BY { + {VALUES (partition_key)} | + {RANGE (partition_key) ( partition_less_than_item [, ... ] )} | + {RANGE (partition_key) ( partition_start_end_item [, ... ] )} +} [ { ENABLE | DISABLE } ROW MOVEMENT ]; + +where column_constraint can be: +[ CONSTRAINT constraint_name ] +{ NOT NULL | + NULL | + CHECK ( expression ) | + DEFAULT default_expr | + UNIQUE index_parameters | + PRIMARY KEY index_parameters } +[ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] +where table_constraint can be: +[ CONSTRAINT constraint_name ] +{ CHECK ( expression ) | + UNIQUE ( column_name [, ... ] ) index_parameters | + PRIMARY KEY ( column_name [, ... ] ) index_parameters | + FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ] + [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] } +[ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] +where index_parameters can be: +[ WITH ( {storage_parameter = value} [, ... ] ) ] +[ USING INDEX TABLESPACE tablespace_name ] +where like_option can be: +{ INCLUDING | EXCLUDING } { DEFAULTS | CONSTRAINTS | INDEXES | STORAGE | COMMENTS | RELOPTIONS | DISTRIBUTION | ALL } +where partition_less_than_item can be: +PARTITION partition_name VALUES LESS THAN ( { partition_value | MAXVALUE } ) [TABLESPACE tablespace_name] +where partition_start_end_item can be: +PARTITION partition_name { + {START(partition_value) END (partition_value) EVERY (interval_value)} | + {START(partition_value) END ({partition_value | MAXVALUE})} | + {START(partition_value)} | + {END({partition_value | MAXVALUE})} +} [TABLESPACE tablespace_name] + -- -- CLASS DEFINITIONS -- diff --git a/src/test/regress/sql/alter_table_000.sql b/src/test/regress/sql/alter_table_000.sql index f6713264e..1139a1cf0 100644 --- a/src/test/regress/sql/alter_table_000.sql +++ b/src/test/regress/sql/alter_table_000.sql @@ -1,6 +1,8 @@ -- --- ALTER TABLE related tickets or bugs fixed -- +-- ATLER TABLE SYNTAX +\h alter table --custom script --create table CREATE TABLE TBL_DOMAIN diff --git a/src/test/regress/sql/create_table.sql b/src/test/regress/sql/create_table.sql index d18462d1d..5cbbadc44 100644 --- a/src/test/regress/sql/create_table.sql +++ b/src/test/regress/sql/create_table.sql @@ -1,6 +1,9 @@ -- -- CREATE_TABLE -- +-- CREATE TABLE SYNTAX +\h create table +\h create table part -- -- CLASS DEFINITIONS --