mirror of https://github.com/postgres/postgres
SQL/JSON: Fix default ON ERROR behavior for JSON_TABLE
Use EMPTY ARRAY instead of EMPTY. This change does not affect the runtime behavior of JSON_TABLE(), which continues to return an empty relation ON ERROR. It only alters whether the default ON ERROR behavior is shown in the deparsed output. Reported-by: Jian He <jian.universality@gmail.com> Discussion: https://postgr.es/m/CACJufxEo4sUjKCYtda0_qt9tazqqKPmF1cqhW9KBOUeJFqQd2g@mail.gmail.com Backpatch-through: 17
This commit is contained in:
parent
68222851d5
commit
565caaa79a
|
@ -4603,13 +4603,13 @@ transformJsonFuncExpr(ParseState *pstate, JsonFuncExpr *func)
|
|||
}
|
||||
|
||||
/*
|
||||
* Assume EMPTY ON ERROR when ON ERROR is not specified.
|
||||
* Assume EMPTY ARRAY ON ERROR when ON ERROR is not specified.
|
||||
*
|
||||
* ON EMPTY cannot be specified at the top level but it can be for
|
||||
* the individual columns.
|
||||
*/
|
||||
jsexpr->on_error = transformJsonBehavior(pstate, func->on_error,
|
||||
JSON_BEHAVIOR_EMPTY,
|
||||
JSON_BEHAVIOR_EMPTY_ARRAY,
|
||||
jsexpr->returning);
|
||||
break;
|
||||
|
||||
|
|
|
@ -11875,7 +11875,7 @@ get_json_table(TableFunc *tf, deparse_context *context, bool showimplicit)
|
|||
get_json_table_columns(tf, castNode(JsonTablePathScan, tf->plan), context,
|
||||
showimplicit);
|
||||
|
||||
if (jexpr->on_error->btype != JSON_BEHAVIOR_EMPTY)
|
||||
if (jexpr->on_error->btype != JSON_BEHAVIOR_EMPTY_ARRAY)
|
||||
get_json_behavior(jexpr->on_error, context, "ERROR");
|
||||
|
||||
if (PRETTY_INDENT(context))
|
||||
|
|
|
@ -1150,3 +1150,28 @@ EXPLAIN VERBOSE SELECT * from JSON_TABLE('"a"', '$' COLUMNS (a text PATH '$') ER
|
|||
Table Function Call: JSON_TABLE('"a"'::jsonb, '$' AS json_table_path_0 COLUMNS (a text PATH '$') ERROR ON ERROR)
|
||||
(3 rows)
|
||||
|
||||
-- Test JSON_TABLE() deparsing -- don't emit default ON ERROR behavior
|
||||
EXPLAIN VERBOSE SELECT * from JSON_TABLE('"a"', '$' COLUMNS (a text PATH '$'));
|
||||
QUERY PLAN
|
||||
-----------------------------------------------------------------------------------------------------
|
||||
Table Function Scan on "json_table" (cost=0.01..1.00 rows=100 width=32)
|
||||
Output: a
|
||||
Table Function Call: JSON_TABLE('"a"'::jsonb, '$' AS json_table_path_0 COLUMNS (a text PATH '$'))
|
||||
(3 rows)
|
||||
|
||||
EXPLAIN VERBOSE SELECT * from JSON_TABLE('"a"', '$' COLUMNS (a text PATH '$') EMPTY ON ERROR);
|
||||
QUERY PLAN
|
||||
-----------------------------------------------------------------------------------------------------
|
||||
Table Function Scan on "json_table" (cost=0.01..1.00 rows=100 width=32)
|
||||
Output: a
|
||||
Table Function Call: JSON_TABLE('"a"'::jsonb, '$' AS json_table_path_0 COLUMNS (a text PATH '$'))
|
||||
(3 rows)
|
||||
|
||||
EXPLAIN VERBOSE SELECT * from JSON_TABLE('"a"', '$' COLUMNS (a text PATH '$') EMPTY ARRAY ON ERROR);
|
||||
QUERY PLAN
|
||||
-----------------------------------------------------------------------------------------------------
|
||||
Table Function Scan on "json_table" (cost=0.01..1.00 rows=100 width=32)
|
||||
Output: a
|
||||
Table Function Call: JSON_TABLE('"a"'::jsonb, '$' AS json_table_path_0 COLUMNS (a text PATH '$'))
|
||||
(3 rows)
|
||||
|
||||
|
|
|
@ -547,3 +547,8 @@ SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (a int exists empty object on er
|
|||
-- behavior
|
||||
EXPLAIN VERBOSE SELECT * from JSON_TABLE('"a"', '$' COLUMNS (a text PATH '$'));
|
||||
EXPLAIN VERBOSE SELECT * from JSON_TABLE('"a"', '$' COLUMNS (a text PATH '$') ERROR ON ERROR);
|
||||
|
||||
-- Test JSON_TABLE() deparsing -- don't emit default ON ERROR behavior
|
||||
EXPLAIN VERBOSE SELECT * from JSON_TABLE('"a"', '$' COLUMNS (a text PATH '$'));
|
||||
EXPLAIN VERBOSE SELECT * from JSON_TABLE('"a"', '$' COLUMNS (a text PATH '$') EMPTY ON ERROR);
|
||||
EXPLAIN VERBOSE SELECT * from JSON_TABLE('"a"', '$' COLUMNS (a text PATH '$') EMPTY ARRAY ON ERROR);
|
||||
|
|
Loading…
Reference in New Issue