Thread: Why does exec_simple_query requires 2 snapshots

Why does exec_simple_query requires 2 snapshots

From
Andy Fan
Date:
Hi,

When I run "SELECT * FROM pg_class LIMIT 1";  then postgresql
run GetSnapshotData twice, one is

/*
 * Set up a snapshot if parse analysis/planning will need one.
 */
if (analyze_requires_snapshot(parsetree))
{
    PushActiveSnapshot(GetTransactionSnapshot());
    snapshot_set = true;
}


the other one is in PortalStart.

My question is why can't we share the same snapshot for the 2 cases?
parser & planner requires Catalog Snapshot which should be the 
latest one, but in the above case, looks the executor can reuse it as
well. Is there anything I missed?

Thanks

-- 
Best Regards
Andy Fan




Re: Why does exec_simple_query requires 2 snapshots

From
Tom Lane
Date:
Andy Fan <zhihuifan1213@163.com> writes:
> My question is why can't we share the same snapshot for the 2 cases?
> parser & planner requires Catalog Snapshot which should be the 
> latest one, but in the above case, looks the executor can reuse it as
> well. Is there anything I missed?

Many years ago, we committed a patch to do exactly that.  We had
to back it out again because it broke too many real-world scenarios.
I'm too lazy to search the archives for you, but you might be able
to find the commit and revert by searching the git history.

            regards, tom lane



Re: Why does exec_simple_query requires 2 snapshots

From
Andy Fan
Date:
Tom Lane <tgl@sss.pgh.pa.us> writes:

> Andy Fan <zhihuifan1213@163.com> writes:
>> My question is why can't we share the same snapshot for the 2 cases?
>> parser & planner requires Catalog Snapshot which should be the 
>> latest one, but in the above case, looks the executor can reuse it as
>> well. Is there anything I missed?
>
> Many years ago, we committed a patch to do exactly that.  We had
> to back it out again because it broke too many real-world scenarios.
> I'm too lazy to search the archives for you, but you might be able
> to find the commit and revert by searching the git history.
>
>             regards, tom lane

Commit id is 532994299e2, thank you Tom!

-- 
Best Regards
Andy Fan




Re: Why does exec_simple_query requires 2 snapshots

From
Tom Lane
Date:
Andy Fan <zhihuifan1213@163.com> writes:
> Tom Lane <tgl@sss.pgh.pa.us> writes:
>> Many years ago, we committed a patch to do exactly that.  We had
>> to back it out again because it broke too many real-world scenarios.
>> I'm too lazy to search the archives for you, but you might be able
>> to find the commit and revert by searching the git history.

> Commit id is 532994299e2, thank you Tom!

Ah, cool.  If you didn't find it already, there should be a
pgsql-hackers or pgsql-bugs thread of approximately that date
with more detail.  Sadly, we didn't adopt the convention of
including Discussion: links in commit messages till some
years after that.

            regards, tom lane



Re: Why does exec_simple_query requires 2 snapshots

From
Andy Fan
Date:
Tom Lane <tgl@sss.pgh.pa.us> writes:

> Andy Fan <zhihuifan1213@163.com> writes:
>> Tom Lane <tgl@sss.pgh.pa.us> writes:
>>> Many years ago, we committed a patch to do exactly that.  We had
>>> to back it out again because it broke too many real-world scenarios.
>>> I'm too lazy to search the archives for you, but you might be able
>>> to find the commit and revert by searching the git history.
>
>> Commit id is 532994299e2, thank you Tom!
>
> links in commit messages till some years after that.

Links in commit messages is a really great change.

I have found more details at [1], the issue can be summaried as IIUC:

The current strategy is below:
t1: snapshot1
parser&planner
t2: snapshot2
executor.

which makes the committed tuple between (t1, t2] are visible to user, but if
we share the same snapshot, the committed tuple would not be visible to
user, Chaning it would be a behavior change. 

[1] https://www.postgresql.org/message-id/5075D8DF.6050500%40fuzzy.cz

-- 
Best Regards
Andy Fan