Simplify transformJsonAggConstructor() API
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Thu, 30 Mar 2023 19:07:24 +0000 (21:07 +0200)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Thu, 30 Mar 2023 19:07:24 +0000 (21:07 +0200)
There's no need for callers to pass aggregate names so that the function
can resolve them to OIDs, when callers can just pass aggregate OIDs
directly to begin with.

src/backend/parser/parse_expr.c

index d706b3dd9e5eed40c4393957f072465d0e6832c9..737b479f5418ef2defd9800cab6f00ff1f0ab8dc 100644 (file)
@@ -3611,11 +3611,10 @@ transformJsonArrayQueryConstructor(ParseState *pstate,
 static Node *
 transformJsonAggConstructor(ParseState *pstate, JsonAggConstructor *agg_ctor,
                            JsonReturning *returning, List *args,
-                           const char *aggfn, Oid aggtype,
+                           Oid aggfnoid, Oid aggtype,
                            JsonConstructorType ctor_type,
                            bool unique, bool absent_on_null)
 {
-   Oid         aggfnoid;
    Node       *node;
    Expr       *aggfilter;
 
@@ -3623,9 +3622,6 @@ transformJsonAggConstructor(ParseState *pstate, JsonAggConstructor *agg_ctor,
        transformWhereClause(pstate, agg_ctor->agg_filter,
                             EXPR_KIND_FILTER, "FILTER") : NULL;
 
-   aggfnoid = DatumGetInt32(DirectFunctionCall1(regprocin,
-                                                CStringGetDatum(aggfn)));
-
    if (agg_ctor->over)
    {
        /* window function */
@@ -3703,7 +3699,7 @@ transformJsonObjectAgg(ParseState *pstate, JsonObjectAgg *agg)
    Node       *key;
    Node       *val;
    List       *args;
-   const char *aggfnname;
+   Oid         aggfnoid;
    Oid         aggtype;
 
    key = transformExprRecurse(pstate, (Node *) agg->arg->key);
@@ -3717,13 +3713,13 @@ transformJsonObjectAgg(ParseState *pstate, JsonObjectAgg *agg)
    {
        if (agg->absent_on_null)
            if (agg->unique)
-               aggfnname = "pg_catalog.jsonb_object_agg_unique_strict";
+               aggfnoid = F_JSONB_OBJECT_AGG_UNIQUE_STRICT;
            else
-               aggfnname = "pg_catalog.jsonb_object_agg_strict";
+               aggfnoid = F_JSONB_OBJECT_AGG_STRICT;
        else if (agg->unique)
-           aggfnname = "pg_catalog.jsonb_object_agg_unique";
+           aggfnoid = F_JSONB_OBJECT_AGG_UNIQUE;
        else
-           aggfnname = "pg_catalog.jsonb_object_agg";
+           aggfnoid = F_JSONB_OBJECT_AGG;
 
        aggtype = JSONBOID;
    }
@@ -3731,19 +3727,19 @@ transformJsonObjectAgg(ParseState *pstate, JsonObjectAgg *agg)
    {
        if (agg->absent_on_null)
            if (agg->unique)
-               aggfnname = "pg_catalog.json_object_agg_unique_strict";
+               aggfnoid = F_JSON_OBJECT_AGG_UNIQUE_STRICT;
            else
-               aggfnname = "pg_catalog.json_object_agg_strict";
+               aggfnoid = F_JSON_OBJECT_AGG_STRICT;
        else if (agg->unique)
-           aggfnname = "pg_catalog.json_object_agg_unique";
+           aggfnoid = F_JSON_OBJECT_AGG_UNIQUE;
        else
-           aggfnname = "pg_catalog.json_object_agg";
+           aggfnoid = F_JSON_OBJECT_AGG;
 
        aggtype = JSONOID;
    }
 
    return transformJsonAggConstructor(pstate, agg->constructor, returning,
-                                      args, aggfnname, aggtype,
+                                      args, aggfnoid, aggtype,
                                       JSCTOR_JSON_OBJECTAGG,
                                       agg->unique, agg->absent_on_null);
 }
@@ -3760,7 +3756,7 @@ transformJsonArrayAgg(ParseState *pstate, JsonArrayAgg *agg)
 {
    JsonReturning *returning;
    Node       *arg;
-   const char *aggfnname;
+   Oid         aggfnoid;
    Oid         aggtype;
 
    arg = transformJsonValueExpr(pstate, agg->arg, JS_FORMAT_DEFAULT);
@@ -3770,19 +3766,17 @@ transformJsonArrayAgg(ParseState *pstate, JsonArrayAgg *agg)
 
    if (returning->format->format_type == JS_FORMAT_JSONB)
    {
-       aggfnname = agg->absent_on_null ?
-           "pg_catalog.jsonb_agg_strict" : "pg_catalog.jsonb_agg";
+       aggfnoid = agg->absent_on_null ? F_JSONB_AGG_STRICT : F_JSONB_AGG;
        aggtype = JSONBOID;
    }
    else
    {
-       aggfnname = agg->absent_on_null ?
-           "pg_catalog.json_agg_strict" : "pg_catalog.json_agg";
+       aggfnoid = agg->absent_on_null ? F_JSON_AGG_STRICT : F_JSON_AGG;
        aggtype = JSONOID;
    }
 
    return transformJsonAggConstructor(pstate, agg->constructor, returning,
-                                      list_make1(arg), aggfnname, aggtype,
+                                      list_make1(arg), aggfnoid, aggtype,
                                       JSCTOR_JSON_ARRAYAGG,
                                       false, agg->absent_on_null);
 }