summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Eisentraut2019-04-01 08:46:37 +0000
committerPeter Eisentraut2019-04-01 08:46:37 +0000
commit7241911782a7420e38b6e50b57d304ea48bc5362 (patch)
tree687e642d5b3256ab24d35cb4d16f86002c6f1df9
parent4ae7f02b0364ccba49a82efbfff46125fb357d6c (diff)
Catch syntax error in generated column definition
The syntax GENERATED BY DEFAULT AS (expr) is not allowed but we have to accept it in the grammar to avoid shift/reduce conflicts because of the similar syntax for identity columns. The existing code just ignored this, incorrectly. Add an explicit error check and a bespoke error message. Reported-by: Justin Pryzby <[email protected]>
-rw-r--r--src/backend/parser/gram.y13
-rw-r--r--src/test/regress/expected/generated.out5
-rw-r--r--src/test/regress/sql/generated.sql3
3 files changed, 21 insertions, 0 deletions
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 01521789e8..b51f12dc23 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -3505,6 +3505,19 @@ ColConstraintElem:
n->raw_expr = $5;
n->cooked_expr = NULL;
n->location = @1;
+
+ /*
+ * Can't do this in the grammar because of shift/reduce
+ * conflicts. (IDENTITY allows both ALWAYS and BY
+ * DEFAULT, but generated columns only allow ALWAYS.) We
+ * can also give a more useful error message and location.
+ */
+ if ($2 != ATTRIBUTE_IDENTITY_ALWAYS)
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("for a generated column, GENERATED ALWAYS must be specified"),
+ parser_errposition(@2)));
+
$$ = (Node *)n;
}
| REFERENCES qualified_name opt_column_list key_match key_actions
diff --git a/src/test/regress/expected/generated.out b/src/test/regress/expected/generated.out
index e0d1d88f17..d4ed3f7ae1 100644
--- a/src/test/regress/expected/generated.out
+++ b/src/test/regress/expected/generated.out
@@ -85,6 +85,11 @@ CREATE TABLE gtest_err_7d (a int PRIMARY KEY, b int GENERATED ALWAYS AS (generat
ERROR: set-returning functions are not allowed in column generation expressions
LINE 1: ...7d (a int PRIMARY KEY, b int GENERATED ALWAYS AS (generate_s...
^
+-- GENERATED BY DEFAULT not allowed
+CREATE TABLE gtest_err_8 (a int PRIMARY KEY, b int GENERATED BY DEFAULT AS (a * 2) STORED);
+ERROR: for a generated column, GENERATED ALWAYS must be specified
+LINE 1: ...E gtest_err_8 (a int PRIMARY KEY, b int GENERATED BY DEFAULT...
+ ^
INSERT INTO gtest1 VALUES (1);
INSERT INTO gtest1 VALUES (2, DEFAULT);
INSERT INTO gtest1 VALUES (3, 33); -- error
diff --git a/src/test/regress/sql/generated.sql b/src/test/regress/sql/generated.sql
index 6d71594dc4..da11b8c9b8 100644
--- a/src/test/regress/sql/generated.sql
+++ b/src/test/regress/sql/generated.sql
@@ -37,6 +37,9 @@ CREATE TABLE gtest_err_7b (a int PRIMARY KEY, b int GENERATED ALWAYS AS (row_num
CREATE TABLE gtest_err_7c (a int PRIMARY KEY, b int GENERATED ALWAYS AS ((SELECT a)) STORED);
CREATE TABLE gtest_err_7d (a int PRIMARY KEY, b int GENERATED ALWAYS AS (generate_series(1, a)) STORED);
+-- GENERATED BY DEFAULT not allowed
+CREATE TABLE gtest_err_8 (a int PRIMARY KEY, b int GENERATED BY DEFAULT AS (a * 2) STORED);
+
INSERT INTO gtest1 VALUES (1);
INSERT INTO gtest1 VALUES (2, DEFAULT);
INSERT INTO gtest1 VALUES (3, 33); -- error