From 6cfe8076e63197294780fb1b935a98dd48d91572 Mon Sep 17 00:00:00 2001 From: Amit Langote Date: Wed, 26 Jun 2024 22:58:20 +0900 Subject: [PATCH v2 2/2] SQL/JSON: Prevent ON EMPTY for EXISTS columns in JSON_TABLE() Fix the grammar production to that end. --- src/backend/parser/gram.y | 6 +++--- src/test/regress/expected/sqljson_jsontable.out | 5 +++++ src/test/regress/sql/sqljson_jsontable.sql | 3 +++ 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 4a4b47ca50..a043fd4c66 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 b1da088785..3a5dd51e30 100644 --- a/src/test/regress/expected/sqljson_jsontable.out +++ b/src/test/regress/expected/sqljson_jsontable.out @@ -1078,3 +1078,8 @@ ERROR: invalid ON ERROR behavior for column "a" LINE 1: ...M JSON_TABLE(jsonb '1', '$' COLUMNS (a int exists empty obje... ^ DETAIL: Only ERROR, TRUE, FALSE, or UNKNOWN is allowed in ON ERROR for EXISTS columns. +-- 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 4562f08aed..36eadd9648 100644 --- a/src/test/regress/sql/sqljson_jsontable.sql +++ b/src/test/regress/sql/sqljson_jsontable.sql @@ -524,3 +524,6 @@ SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (a int) NULL ON ERROR); -- fail SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (a int true on empty)); SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (a int omit quotes true on error)); SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (a int exists empty object on error)); + +-- Prevent ON EMPTY specification on EXISTS columns +SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (a int exists empty object on empty)); -- 2.43.0