Fix inconsistencies and style issues in new SQL/JSON code
authorAlvaro Herrera <[email protected]>
Thu, 30 Mar 2023 19:05:35 +0000 (21:05 +0200)
committerAlvaro Herrera <[email protected]>
Thu, 30 Mar 2023 19:06:31 +0000 (21:06 +0200)
Reported by Alexander Lakhin.

Discussion: https://postgr.es/m/60483139-5c34-851d-baee-6c0d014e1710@gmail.com

src/backend/executor/execExprInterp.c
src/backend/parser/parse_expr.c
src/backend/utils/adt/ruleutils.c
src/include/nodes/parsenodes.h
src/include/nodes/primnodes.h

index a37ba4dd55bc1e7482be3489fd439992ad378659..8c1e124db677c762f2cd1a833fb27119788a193c 100644 (file)
@@ -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;
index a134878b1e931dd09a7b493055d8363abe75e843..d706b3dd9e5eed40c4393957f072465d0e6832c9 100644 (file)
@@ -3138,7 +3138,7 @@ makeJsonByteaToTextConversion(Node *expr, JsonFormat *format, int location)
 }
 
 /*
- * Make CaseTestExpr node.
+ * Make 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.
  */
index 5f953338f3d695df12f5f69d72b96b0f3c51f575..1c078d700d459d26d20c40c815c3ed13e06ffc27 100644 (file)
@@ -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);
index 1c296da326f5e72763c50f65293b2a2cedc3f2fb..cc7b32b279a0f274317a5746a6a8fb756730a403 100644 (file)
@@ -1809,7 +1809,7 @@ typedef struct JsonObjectAgg
 
 /*
  * JsonArrayAgg -
- *             untransformed representation of JSON_ARRRAYAGG()
+ *             untransformed representation of JSON_ARRAYAGG()
  */
 typedef struct JsonArrayAgg
 {
index de1701c21364fca21a545ed75d5c8476d44f8648..1764b61cdbd785f052012542e8508596aff1b8bf 100644 (file)
@@ -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
 {