diff --git a/src/common/backend/parser/gram.y b/src/common/backend/parser/gram.y index 7f6c57db0..201f5b61f 100755 --- a/src/common/backend/parser/gram.y +++ b/src/common/backend/parser/gram.y @@ -17418,6 +17418,10 @@ columnref: ColId { $$ = makeColumnRef($1, $2, @1, yyscanner); } + | EXCLUDED indirection + { + $$ = makeColumnRef("excluded", $2, @2, yyscanner); + } ; indirection_el: @@ -17810,7 +17814,6 @@ SignedIconst: Iconst { $$ = $1; } ColId: IDENT { $$ = $1; } | unreserved_keyword { $$ = pstrdup($1); } | col_name_keyword { $$ = pstrdup($1); } - | EXCLUDED { $$ = pstrdup($1); } ; /* Type/function identifier --- names that can be type or function names. diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h index 6fa202ba7..ca07883ce 100755 --- a/src/include/parser/kwlist.h +++ b/src/include/parser/kwlist.h @@ -191,6 +191,7 @@ PG_KEYWORD("every", EVERY, UNRESERVED_KEYWORD) PG_KEYWORD("except", EXCEPT, RESERVED_KEYWORD) PG_KEYWORD("exchange", EXCHANGE, UNRESERVED_KEYWORD) PG_KEYWORD("exclude", EXCLUDE, UNRESERVED_KEYWORD) +PG_KEYWORD("excluded", EXCLUDED, RESERVED_KEYWORD) PG_KEYWORD("excluding", EXCLUDING, UNRESERVED_KEYWORD) PG_KEYWORD("exclusive", EXCLUSIVE, UNRESERVED_KEYWORD) PG_KEYWORD("execute", EXECUTE, UNRESERVED_KEYWORD) diff --git a/src/test/regress/expected/upsert_clean.out b/src/test/regress/expected/upsert_clean.out index e6157a7f1..01aded6ec 100644 --- a/src/test/regress/expected/upsert_clean.out +++ b/src/test/regress/expected/upsert_clean.out @@ -1,12 +1,13 @@ \c upsert DROP SCHEMA upsert_test CASCADE; -NOTICE: drop cascades to 8 other objects +NOTICE: drop cascades to 9 other objects DETAIL: drop cascades to type upsert_test.atype drop cascades to type upsert_test.btype drop cascades to table upsert_test.t_grammer drop cascades to table upsert_test.t_default drop cascades to table upsert_test.t_data drop cascades to table upsert_test.t_trigger +drop cascades to table upsert_test."excluded" drop cascades to function upsert_test.upsert_before_func() drop cascades to function upsert_test.upsert_after_func() DROP SCHEMA upsert_test_unlog CASCADE; diff --git a/src/test/regress/expected/upsert_grammer_test_01.out b/src/test/regress/expected/upsert_grammer_test_01.out index 378d916f5..ce10511d8 100644 --- a/src/test/regress/expected/upsert_grammer_test_01.out +++ b/src/test/regress/expected/upsert_grammer_test_01.out @@ -186,3 +186,25 @@ SELECT * FROM t_default ORDER BY 1; --? 92 | .840485369320959 | Sun May 17 00:00:00 2020 (3 rows) +-- for table named excluded +INSERT INTO excluded values(1,1),(2,2) ON DUPLICATE KEY UPDATE b = excluded.b + 1; +ERROR: syntax error at or near "excluded" +LINE 1: INSERT INTO excluded values(1,1),(2,2) ON DUPLICATE KEY UPDA... + ^ +INSERT INTO "excluded" values(1,1),(2,2) ON DUPLICATE KEY UPDATE b = excluded.b + 1; +ERROR: table reference "excluded" is ambiguous +LINE 1: ...alues(1,1),(2,2) ON DUPLICATE KEY UPDATE b = excluded.b + 1; + ^ +CONTEXT: referenced column: b +INSERT INTO "excluded" values(5,5),(6,6) ON DUPLICATE KEY UPDATE b = 1; +SELECT * FROM excluded; +ERROR: syntax error at or near "excluded" +LINE 1: SELECT * FROM excluded; + ^ +SELECT * FROM "excluded"; + a | b +---+--- + 5 | 5 + 6 | 6 +(2 rows) + diff --git a/src/test/regress/expected/upsert_prepare.out b/src/test/regress/expected/upsert_prepare.out index 57868e0e4..bcd9988ea 100644 --- a/src/test/regress/expected/upsert_prepare.out +++ b/src/test/regress/expected/upsert_prepare.out @@ -22,6 +22,12 @@ CREATE TABLE t_data (c_int INT PRIMARY KEY, c_tiny TINYINT, c_smallint SMALLINT, NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "t_data_pkey" for table "t_data" CREATE TABLE t_trigger (key INT PRIMARY KEY, color TEXT); NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "t_trigger_pkey" for table "t_trigger" +CREATE TABLE excluded (a int primary key, b int); +ERROR: syntax error at or near "excluded" +LINE 1: CREATE TABLE excluded (a int primary key, b int); + ^ +CREATE TABLE "excluded" (a int primary key, b int); +NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "excluded_pkey" for table "excluded" -- unlogged table CREATE SCHEMA upsert_test_unlog; SET CURRENT_SCHEMA TO upsert_test_unlog; diff --git a/src/test/regress/sql/upsert_grammer_test_01.sql b/src/test/regress/sql/upsert_grammer_test_01.sql index 7124bed4c..385ca8382 100644 --- a/src/test/regress/sql/upsert_grammer_test_01.sql +++ b/src/test/regress/sql/upsert_grammer_test_01.sql @@ -111,3 +111,10 @@ INSERT INTO t_grammer VALUES(0, 0) ON DUPLICATE KEY UPDATE c2 = c4.a; SELECT * FROM t_data ORDER BY 1; SELECT * FROM t_grammer ORDER BY 1; SELECT * FROM t_default ORDER BY 1; + +-- for table named excluded +INSERT INTO excluded values(1,1),(2,2) ON DUPLICATE KEY UPDATE b = excluded.b + 1; +INSERT INTO "excluded" values(1,1),(2,2) ON DUPLICATE KEY UPDATE b = excluded.b + 1; +INSERT INTO "excluded" values(5,5),(6,6) ON DUPLICATE KEY UPDATE b = 1; +SELECT * FROM excluded; +SELECT * FROM "excluded"; diff --git a/src/test/regress/sql/upsert_prepare.sql b/src/test/regress/sql/upsert_prepare.sql index 4ff4a7807..72794228a 100644 --- a/src/test/regress/sql/upsert_prepare.sql +++ b/src/test/regress/sql/upsert_prepare.sql @@ -20,6 +20,9 @@ CREATE TABLE t_data (c_int INT PRIMARY KEY, c_tiny TINYINT, c_smallint SMALLINT, c_var VARCHAR, c_text TEXT, c_bytea BYTEA, c_date DATE, c_timestamp TIMESTAMP, c_time TIME, c_intarray INT[3], c_com atype); CREATE TABLE t_trigger (key INT PRIMARY KEY, color TEXT); +CREATE TABLE excluded (a int primary key, b int); +CREATE TABLE "excluded" (a int primary key, b int); + -- unlogged table CREATE SCHEMA upsert_test_unlog;