v33-json_table.nocfbot
application/octet-stream
Filename: v33-json_table.nocfbot
Type: application/octet-stream
Part: 0
Message:
Re: remaining sql/json patches
diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c
index e474e064..09962210 100644
--- a/src/backend/parser/parse_expr.c
+++ b/src/backend/parser/parse_expr.c
@@ -4219,7 +4219,7 @@ transformJsonSerializeExpr(ParseState *pstate, JsonSerializeExpr *expr)
}
/*
- * Transform JSON_VALUE, JSON_QUERY, JSON_EXISTS functions into a JsonExpr node.
+ * Transform JSON_VALUE, JSON_QUERY, JSON_EXISTS, JSON_TABLE functions into a JsonExpr node.
*/
static Node *
transformJsonFuncExpr(ParseState *pstate, JsonFuncExpr *func)
@@ -4372,13 +4372,11 @@ transformJsonFuncExpr(ParseState *pstate, JsonFuncExpr *func)
break;
case JSON_TABLE_OP:
- func_name = "JSON_TABLE";
-
- jsexpr = transformJsonExprCommon(pstate, func, func_name);
- jsexpr->returning = makeNode(JsonReturning);
- jsexpr->returning->format = makeJsonFormat(JS_FORMAT_DEFAULT, JS_ENC_DEFAULT, -1);
- jsexpr->returning->typid = exprType(jsexpr->formatted_expr);
- jsexpr->returning->typmod = -1;
+ if (!OidIsValid(jsexpr->returning->typid))
+ {
+ jsexpr->returning->typid = exprType(jsexpr->formatted_expr);
+ jsexpr->returning->typmod = -1;
+ }
jsexpr->on_error = transformJsonBehavior(pstate, func->on_error,
JSON_BEHAVIOR_EMPTY,
jsexpr->returning);
diff --git a/src/backend/parser/parse_jsontable.c b/src/backend/parser/parse_jsontable.c
index ee9123c3..a47f1ce3 100644
--- a/src/backend/parser/parse_jsontable.c
+++ b/src/backend/parser/parse_jsontable.c
@@ -71,14 +71,13 @@ transformJsonTableColumn(JsonTableColumn *jtc, Node *contextItemExpr,
List *passingArgs, bool errorOnError)
{
JsonFuncExpr *jfexpr = makeNode(JsonFuncExpr);
- JsonOutput *output = makeNode(JsonOutput);
char *pathspec;
JsonFormat *default_format;
jfexpr->op =
jtc->coltype == JTC_REGULAR ? JSON_VALUE_OP :
jtc->coltype == JTC_EXISTS ? JSON_EXISTS_OP : JSON_QUERY_OP;
- jfexpr->output = output;
+ jfexpr->output = makeNode(JsonOutput);
jfexpr->on_empty = jtc->on_empty;
jfexpr->on_error = jtc->on_error;
if (jfexpr->on_error == NULL && errorOnError)
@@ -88,9 +87,9 @@ transformJsonTableColumn(JsonTableColumn *jtc, Node *contextItemExpr,
jfexpr->wrapper = jtc->wrapper;
jfexpr->location = jtc->location;
- output->typeName = jtc->typeName;
- output->returning = makeNode(JsonReturning);
- output->returning->format = jtc->format;
+ jfexpr->output->typeName = jtc->typeName;
+ jfexpr->output->returning = makeNode(JsonReturning);
+ jfexpr->output->returning->format = jtc->format;
default_format = makeJsonFormat(JS_FORMAT_DEFAULT, JS_ENC_DEFAULT, -1);
@@ -493,7 +492,7 @@ appendJsonTableColumns(JsonTableParseContext * cxt, List *columns)
" without also specifying FORMAT clause"),
parser_errposition(pstate, rawc->location)));
- /* FALLTHROUGH */
+ /* FALL THROUGH */
case JTC_EXISTS:
case JTC_FORMATTED:
{
@@ -735,7 +734,7 @@ transformJsonTable(ParseState *pstate, JsonTable *jt)
castNode(A_Const, jt->pathspec)->val.node.type != T_String)
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("only string constants supported in JSON_TABLE path specification"),
+ errmsg("only string are constants supported in the JSON_TABLE path specification"),
parser_errposition(pstate,
exprLocation(jt->pathspec))));
diff --git a/src/backend/utils/adt/jsonpath_exec.c b/src/backend/utils/adt/jsonpath_exec.c
index 49be9c0e..d820d457 100644
--- a/src/backend/utils/adt/jsonpath_exec.c
+++ b/src/backend/utils/adt/jsonpath_exec.c
@@ -3521,6 +3521,7 @@ static bool
JsonTablePlanNextRow(JsonTablePlanState * state)
{
JsonTableJoinState *join;
+ bool left;
if (state->type == JSON_TABLE_SCAN_STATE)
return JsonTableScanNextRow((JsonTableScanState *) state);
@@ -3542,7 +3543,7 @@ JsonTablePlanNextRow(JsonTablePlanState * state)
while (!join->advanceRight)
{
/* fetch next outer row */
- bool left = JsonTablePlanNextRow(join->left);
+ left = JsonTablePlanNextRow(join->left);
if (join->cross)
{
diff --git a/src/test/regress/expected/jsonb_sqljson.out b/src/test/regress/expected/jsonb_sqljson.out
index ef52e4ce..1b7d55b7 100644
--- a/src/test/regress/expected/jsonb_sqljson.out
+++ b/src/test/regress/expected/jsonb_sqljson.out
@@ -2203,6 +2203,6 @@ SELECT JSON_QUERY(jsonb '{"a": 123}', 'error' || ' ' || 'error');
ERROR: syntax error at or near " " of jsonpath input
-- Should fail (not supported)
SELECT * FROM JSON_TABLE(jsonb '{"a": 123}', '$' || '.' || 'a' COLUMNS (foo int));
-ERROR: only string constants supported in JSON_TABLE path specification
+ERROR: only string are constants supported in the JSON_TABLE path specification
LINE 1: SELECT * FROM JSON_TABLE(jsonb '{"a": 123}', '$' || '.' || '...
^