Robert Haas <robertmh...@gmail.com> writes:
> On Wed, Aug 5, 2020 at 2:22 PM Tom Lane <t...@sss.pgh.pa.us> wrote:
>> In the longer term, it's annoying that we have no test methodology
>> for this other than "manually set a breakpoint here".  If we're going
>> to allow plan-relevant DDL changes to happen with less than full table
>> lock, I think we need to improve that.  I spent a little bit of time
>> just now trying to build an isolationtester case for this, and failed
>> completely.  So I wonder if we can create some sort of test module that
>> allows capture of a plan tree and then execution of that plan tree later
>> (even after relcache inval would normally have forced replanning).
>> Obviously that could not be a normal SQL-accessible feature, because
>> some types of invals would make the plan completely wrong, but for
>> testing purposes it'd be mighty helpful to check that a stale plan
>> still works.

> That's an interesting idea. I don't know exactly how it would work,
> but I agree that it would allow useful testing that we can't do today.

After thinking about it for a little bit, I'm envisioning a test module
that can be loaded into a session, and then it gets into the planner_hook,
and what it does is after each planner execution, take and release an
advisory lock with some selectable ID.  Then we can construct
isolationtester specs that do something like

        session 1                               session 2

        LOAD test-module;
        SET custom_guc_for_lock_id = n;
        prepare test tables;

                                                SELECT pg_advisory_lock(n);
                
        SELECT victim-query-here;
        ... after planning, query blocks on lock

                                                perform DDL changes;
                                                SELECT pg_advisory_unlock(n);

        ... query executes with now-stale plan

                        regards, tom lane


Reply via email to