summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAmit Langote2024-06-28 04:59:13 +0000
committerAmit Langote2024-06-28 05:01:43 +0000
commite3c1393efc31ac70de7b68e9a283ec3f2d7f9bd2 (patch)
tree501b572b01bbf7e85cd0096d20207612c9fd71ae
parent0ad8153c1f4c7129ff19e8a41d142001d35c8514 (diff)
SQL/JSON: Prevent ON EMPTY for EXISTS columns in JSON_TABLE()
Due to an oversight in de3600452b61, the ON EMPTY clause was incorrectly allowed in the EXISTS column. Fix the grammar to prevent this. Discussion: https://postgr.es/m/CA%2BHiwqHh3YDXTpccgAo4CdfV9Mhy%2Bmg%3Doh6t8rfM5uLW1BJN4g%40mail.gmail.com
-rw-r--r--src/backend/parser/gram.y6
-rw-r--r--src/test/regress/expected/sqljson_jsontable.out5
-rw-r--r--src/test/regress/sql/sqljson_jsontable.sql3
3 files changed, 11 insertions, 3 deletions
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 4a4b47ca501..a043fd4c669 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -14265,7 +14265,7 @@ json_table_column_definition:
}
| ColId Typename
EXISTS json_table_column_path_clause_opt
- json_behavior_clause_opt
+ json_on_error_clause_opt
{
JsonTableColumn *n = makeNode(JsonTableColumn);
@@ -14276,8 +14276,8 @@ json_table_column_definition:
n->wrapper = JSW_NONE;
n->quotes = JS_QUOTES_UNSPEC;
n->pathspec = (JsonTablePathSpec *) $4;
- n->on_empty = (JsonBehavior *) linitial($5);
- n->on_error = (JsonBehavior *) lsecond($5);
+ n->on_empty = NULL;
+ n->on_error = (JsonBehavior *) $5;
n->location = @1;
$$ = (Node *) n;
}
diff --git a/src/test/regress/expected/sqljson_jsontable.out b/src/test/regress/expected/sqljson_jsontable.out
index cee90cead13..73039ea65eb 100644
--- a/src/test/regress/expected/sqljson_jsontable.out
+++ b/src/test/regress/expected/sqljson_jsontable.out
@@ -1067,3 +1067,8 @@ CREATE OR REPLACE VIEW public.jsonb_table_view7 AS
) sub
DROP VIEW jsonb_table_view7;
DROP TABLE s;
+-- Prevent ON EMPTY specification on EXISTS columns
+SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (a int exists empty object on empty));
+ERROR: syntax error at or near "empty"
+LINE 1: ...sonb '1', '$' COLUMNS (a int exists empty object on empty));
+ ^
diff --git a/src/test/regress/sql/sqljson_jsontable.sql b/src/test/regress/sql/sqljson_jsontable.sql
index a1f924146e0..bda57981481 100644
--- a/src/test/regress/sql/sqljson_jsontable.sql
+++ b/src/test/regress/sql/sqljson_jsontable.sql
@@ -518,3 +518,6 @@ SELECT sub.* FROM s,
\sv jsonb_table_view7
DROP VIEW jsonb_table_view7;
DROP TABLE s;
+
+-- Prevent ON EMPTY specification on EXISTS columns
+SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (a int exists empty object on empty));