ExecPrepareExprList and per-query context

Started by Amit Langotealmost 9 years ago3 messages
#1Amit Langote
Langote_Amit_f8@lab.ntt.co.jp

As of b8d7f053c5c, ExecPrepareExprList is (must be?) used instead of
ExecPrepareExpr when the caller wants to initialize expressions in a list,
for example, FormIndexDatum. ExecPrepareExpr doesn't require the caller
to have switched to per-query context, because it itself will. Same is
not however true for the new ExecPrepareExprList. That means the List
node that it creates might be in a context that is not necessarily
per-query context, where it previously would be. That breaks third-party
users of FormIndexDatum that rely on the list to have been created in
per-query context (pg_bulkload was broken by this).

Should ExecPrepareExprList also switch to estate->es_query_cxt? Or maybe
ExecPrepareExpr could itself detect that passed-in node is a List and
create the list of ExprState nodes by itself. I guess the reason to
separate list case is because ExecInitExpr() does not take Lists anymore.

Thanks,
Amit

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Amit Langote (#1)
Re: ExecPrepareExprList and per-query context

Amit Langote <Langote_Amit_f8@lab.ntt.co.jp> writes:

Should ExecPrepareExprList also switch to estate->es_query_cxt?

Good point; I'm surprised we haven't noted any failures from that.
We surely want the entire result data structure to be in the same
memory context. There are not very many callers right now, and
I guess they are all in the right context already (or we aren't
testing them :-().

Or maybe
ExecPrepareExpr could itself detect that passed-in node is a List and
create the list of ExprState nodes by itself.

-1. That's just breaking the API of ExecPrepareExpr.

regards, tom lane

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#3Amit Langote
Langote_Amit_f8@lab.ntt.co.jp
In reply to: Tom Lane (#2)
Re: ExecPrepareExprList and per-query context

On 2017/04/08 1:49, Tom Lane wrote:

Amit Langote <Langote_Amit_f8@lab.ntt.co.jp> writes:

Should ExecPrepareExprList also switch to estate->es_query_cxt?

Good point; I'm surprised we haven't noted any failures from that.
We surely want the entire result data structure to be in the same
memory context. There are not very many callers right now, and
I guess they are all in the right context already (or we aren't
testing them :-().

Thanks for the fix.

Or maybe
ExecPrepareExpr could itself detect that passed-in node is a List and
create the list of ExprState nodes by itself.

-1. That's just breaking the API of ExecPrepareExpr.

I guess you're right. I was just thinking that passing a List through
ExecPrepareExpr() used to work and now it doesn't.

Thanks,
Amit

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers