Re: pg_stat_statements and "IN" conditions - Mailing list pgsql-hackers

From Sami Imseih
Subject Re: pg_stat_statements and "IN" conditions
Date
Msg-id CAA5RZ0uVeUykm9dBkz16bCyNdbKnpqjr5rVjrW7sHBDVj+P8kQ@mail.gmail.com
Whole thread Raw
In response to Re: pg_stat_statements and "IN" conditions  (Sami Imseih <samimseih@gmail.com>)
Responses Re: pg_stat_statements and "IN" conditions
List pgsql-hackers
> This should do it. The last patch for today,

I looked at v27 today and have a few comments.

1/ It looks like the CTE test is missing a check for results.

"""
-- Test constants evaluation in a CTE, which was causing issues in the past
WITH cte AS (
SELECT 'const' as const FROM test_merge
)
SELECT ARRAY['a', 'b', 'c', const::varchar] AS result
FROM cte;

-- Simple array would be merged as well
SELECT pg_stat_statements_reset() IS NOT NULL AS t;
"""

2/ Looking at IsMergeableConst, I am not sure why we care about
things like function volatility, implicit cast or funcid > FirstGenbkiObjectId?

+               if (func->funcid > FirstGenbkiObjectId)
+                       return false;
+
+               if (func->funcformat != COERCE_IMPLICIT_CAST)
+                       return false;
+
+               if (!list_member_oid(*known_immutable_funcs, func->funcid))
+               {
+                       /* Not found in the cache, verify and add if needed */
+                       if(func_volatile(func->funcid) != PROVOLATILE_IMMUTABLE)
+                               return false;
+
+                       *known_immutable_funcs =
lappend_oid(*known_immutable_funcs,
+
                          func->funcid);
+               }

Shouldn't we just be looking for Constants (or PARAM_EXTERNAL) and if so
record the location, and for all other conditions, simply call _jumbleNode? Why
wouldn't that be enough?

3/ Here, this looks wrong as we could end up traversing an elements list
twice. Once inside IsMergeableConstList and if that call returns false, we end
up traversing through the elements list again in _jumbleNode.

+       Node *first, *last;
+       if (IsMergeableConstList(elements, &first, &last))
+       {
+               /*
+                * Both first and last constants have to be recorded.
The first one
+                * will indicate the merged interval, the last one
will tell us the
+                * length of the interval within the query text.
+                *
+                * Note that for the last expression we actually need
not the expression
+                * location (which is the leftmost expression), but
where it ends. For
+                * the limited set of supported cases now (implicit coerce via
+                * FuncExpr, Const) it's fine to use exprLocation, but
if more complex
+                * composite expressions will be supported, e.g.
OpExpr or FuncExpr as
+                * an explicit call, the rightmost expression will be needed.
+                */
+               RecordConstLocation(jstate, exprLocation(first), true);
+               RecordConstLocation(jstate, exprLocation(last), true);
+       }
+       else
+       {
+               _jumbleNode(jstate, (Node *) elements);
+       }
+}


Regards,

Sami



pgsql-hackers by date:

Previous
From: Japin Li
Date:
Subject: Re: Incorrect translator comment for ListenServerPort()?
Next
From: Mark Wong
Date:
Subject: Re: New buildfarm animals with FIPS mode enabled