SQL/JSON: Prevent ON EMPTY for EXISTS columns in JSON_TABLE()

Due to an oversight in de3600452b, 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
pull/165/head
Amit Langote 1 year ago
parent 0ad8153c1f
commit e3c1393efc
  1. 6
      src/backend/parser/gram.y
  2. 5
      src/test/regress/expected/sqljson_jsontable.out
  3. 3
      src/test/regress/sql/sqljson_jsontable.sql

@ -14265,7 +14265,7 @@ json_table_column_definition:
} }
| ColId Typename | ColId Typename
EXISTS json_table_column_path_clause_opt EXISTS json_table_column_path_clause_opt
json_behavior_clause_opt json_on_error_clause_opt
{ {
JsonTableColumn *n = makeNode(JsonTableColumn); JsonTableColumn *n = makeNode(JsonTableColumn);
@ -14276,8 +14276,8 @@ json_table_column_definition:
n->wrapper = JSW_NONE; n->wrapper = JSW_NONE;
n->quotes = JS_QUOTES_UNSPEC; n->quotes = JS_QUOTES_UNSPEC;
n->pathspec = (JsonTablePathSpec *) $4; n->pathspec = (JsonTablePathSpec *) $4;
n->on_empty = (JsonBehavior *) linitial($5); n->on_empty = NULL;
n->on_error = (JsonBehavior *) lsecond($5); n->on_error = (JsonBehavior *) $5;
n->location = @1; n->location = @1;
$$ = (Node *) n; $$ = (Node *) n;
} }

@ -1067,3 +1067,8 @@ CREATE OR REPLACE VIEW public.jsonb_table_view7 AS
) sub ) sub
DROP VIEW jsonb_table_view7; DROP VIEW jsonb_table_view7;
DROP TABLE s; 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));
^

@ -518,3 +518,6 @@ SELECT sub.* FROM s,
\sv jsonb_table_view7 \sv jsonb_table_view7
DROP VIEW jsonb_table_view7; DROP VIEW jsonb_table_view7;
DROP TABLE s; DROP TABLE s;
-- Prevent ON EMPTY specification on EXISTS columns
SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (a int exists empty object on empty));

Loading…
Cancel
Save