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}', '$' || '.' || '... ^