diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c index a37ba4dd55..8c1e124db6 100644 --- a/src/backend/executor/execExprInterp.c +++ b/src/backend/executor/execExprInterp.c @@ -4479,10 +4479,7 @@ ExecEvalJsonConstructor(ExprState *state, ExprEvalStep *op, jcstate->constructor->absent_on_null, jcstate->constructor->unique); else - { - res = (Datum) 0; elog(ERROR, "invalid JsonConstructorExpr type %d", ctor->type); - } *op->resvalue = res; *op->resnull = isnull; diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index a134878b1e..d706b3dd9e 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -3138,7 +3138,7 @@ makeJsonByteaToTextConversion(Node *expr, JsonFormat *format, int location) } /* - * Make CaseTestExpr node. + * Make a CaseTestExpr node. */ static Node * makeCaseTestExpr(Node *expr) @@ -3456,6 +3456,9 @@ coerceJsonFuncExpr(ParseState *pstate, Node *expr, return res; } +/* + * Make a JsonConstructorExpr node. + */ static Node * makeJsonConstructorExpr(ParseState *pstate, JsonConstructorType type, List *args, Expr *fexpr, JsonReturning *returning, @@ -3464,8 +3467,6 @@ makeJsonConstructorExpr(ParseState *pstate, JsonConstructorType type, JsonConstructorExpr *jsctor = makeNode(JsonConstructorExpr); Node *placeholder; Node *coercion; - Oid intermediate_typid = - returning->format->format_type == JS_FORMAT_JSONB ? JSONBOID : JSONOID; jsctor->args = args; jsctor->func = fexpr; @@ -3481,7 +3482,8 @@ makeJsonConstructorExpr(ParseState *pstate, JsonConstructorType type, { CaseTestExpr *cte = makeNode(CaseTestExpr); - cte->typeId = intermediate_typid; + cte->typeId = returning->format->format_type == JS_FORMAT_JSONB ? + JSONBOID : JSONOID; cte->typeMod = -1; cte->collation = InvalidOid; @@ -3501,7 +3503,7 @@ makeJsonConstructorExpr(ParseState *pstate, JsonConstructorType type, * * JSON_OBJECT() is transformed into json[b]_build_object[_ext]() call * depending on the output JSON format. The first two arguments of - * json[b]_build_object_ext() are absent_on_null and check_key_uniqueness. + * json[b]_build_object_ext() are absent_on_null and check_unique. * * Then function call result is coerced to the target type. */ @@ -3615,9 +3617,11 @@ transformJsonAggConstructor(ParseState *pstate, JsonAggConstructor *agg_ctor, { Oid aggfnoid; Node *node; - Expr *aggfilter = agg_ctor->agg_filter ? (Expr *) - transformWhereClause(pstate, agg_ctor->agg_filter, - EXPR_KIND_FILTER, "FILTER") : NULL; + Expr *aggfilter; + + aggfilter = agg_ctor->agg_filter ? (Expr *) + transformWhereClause(pstate, agg_ctor->agg_filter, + EXPR_KIND_FILTER, "FILTER") : NULL; aggfnoid = DatumGetInt32(DirectFunctionCall1(regprocin, CStringGetDatum(aggfn))); @@ -3631,10 +3635,10 @@ transformJsonAggConstructor(ParseState *pstate, JsonAggConstructor *agg_ctor, wfunc->wintype = aggtype; /* wincollid and inputcollid will be set by parse_collate.c */ wfunc->args = args; + wfunc->aggfilter = aggfilter; /* winref will be set by transformWindowFuncCall */ wfunc->winstar = false; wfunc->winagg = true; - wfunc->aggfilter = aggfilter; wfunc->location = agg_ctor->location; /* @@ -3659,7 +3663,7 @@ transformJsonAggConstructor(ParseState *pstate, JsonAggConstructor *agg_ctor, aggref->aggtype = aggtype; /* aggcollid and inputcollid will be set by parse_collate.c */ - aggref->aggtranstype = InvalidOid; /* will be set by planner */ + /* aggtranstype will be set by planner */ /* aggargtypes will be set by transformAggregateCall */ /* aggdirectargs and args will be set by transformAggregateCall */ /* aggorder and aggdistinct will be set by transformAggregateCall */ @@ -3667,8 +3671,11 @@ transformJsonAggConstructor(ParseState *pstate, JsonAggConstructor *agg_ctor, aggref->aggstar = false; aggref->aggvariadic = false; aggref->aggkind = AGGKIND_NORMAL; + aggref->aggpresorted = false; /* agglevelsup will be set by transformAggregateCall */ aggref->aggsplit = AGGSPLIT_SIMPLE; /* planner might change this */ + aggref->aggno = -1; /* planner will set aggno and aggtransno */ + aggref->aggtransno = -1; aggref->location = agg_ctor->location; transformAggregateCall(pstate, aggref, args, agg_ctor->agg_order, false); @@ -3685,7 +3692,7 @@ transformJsonAggConstructor(ParseState *pstate, JsonAggConstructor *agg_ctor, * Transform JSON_OBJECTAGG() aggregate function. * * JSON_OBJECTAGG() is transformed into - * json[b]_objectagg(key, value, absent_on_null, check_unique) call depending on + * json[b]_objectagg[_unique][_strict](key, value) call depending on * the output JSON format. Then the function call result is coerced to the * target output type. */ diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 5f953338f3..1c078d700d 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -10654,7 +10654,7 @@ get_json_constructor(JsonConstructorExpr *ctor, deparse_context *context, funcname = "JSON_ARRAY"; break; default: - elog(ERROR, "invalid JsonConstructorExprType %d", ctor->type); + elog(ERROR, "invalid JsonConstructorType %d", ctor->type); } appendStringInfo(buf, "%s(", funcname); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 1c296da326..cc7b32b279 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -1809,7 +1809,7 @@ typedef struct JsonObjectAgg /* * JsonArrayAgg - - * untransformed representation of JSON_ARRRAYAGG() + * untransformed representation of JSON_ARRAYAGG() */ typedef struct JsonArrayAgg { diff --git a/src/include/nodes/primnodes.h b/src/include/nodes/primnodes.h index de1701c213..1764b61cdb 100644 --- a/src/include/nodes/primnodes.h +++ b/src/include/nodes/primnodes.h @@ -1548,7 +1548,7 @@ typedef struct JsonReturning /* * JsonValueExpr - - * representation of JSON value expression (expr [FORMAT json_format]) + * representation of JSON value expression (expr [FORMAT JsonFormat]) */ typedef struct JsonValueExpr {