Re: Early WIP/PoC for inlining CTEs - Mailing list pgsql-hackers

From Andrew Gierth
Subject Re: Early WIP/PoC for inlining CTEs
Date
Msg-id 87r2dxrw1z.fsf@news-spur.riddles.org.uk
Whole thread Raw
In response to Re: Early WIP/PoC for inlining CTEs  (Andreas Karlsson <andreas@proxel.se>)
Responses Re: Early WIP/PoC for inlining CTEs  (Andreas Karlsson <andreas@proxel.se>)
Re: Early WIP/PoC for inlining CTEs  (Andreas Karlsson <andreas@proxel.se>)
List pgsql-hackers
>>>>> "Andreas" == Andreas Karlsson <andreas@proxel.se> writes:

 Andreas> +   if (rte->rtekind == RTE_CTE &&
 Andreas> +       strcmp(rte->ctename, context->ctename) == 0 &&
 Andreas> +       rte->ctelevelsup == context->levelsup)
 Andreas> +   {
 Andreas> +       Query *newquery = copyObject(context->ctequery);
 Andreas> +
 Andreas> +       /* Preserve outer references, for example to other CTEs */
 Andreas> +       if (context->levelsup > 0)
 Andreas> +           IncrementVarSublevelsUp((Node *) newquery, context->levelsup, 1);

I had a comment around here which seems to have been lost:

 * Secondly, views (and explicit subqueries) currently have
 * different behaviour w.r.t. SELECT FOR UPDATE than CTEs do. A
 * FOR UPDATE clause is treated as extending into views and
 * subqueries, but not into CTEs. We preserve this distinction
 * by not trying to push rowmarks into the new subquery.

This comment seems to me to be worth preserving (unless this behavior is
changed). What I'm referring to is the following, which is unchanged by
the patch:

create table t1 as select 123 as a;
create view v1 as select * from t1;
select * from t1 for update;  -- locks row in t1
select * from t1 for update of t1;  -- locks row in t1
select * from v1 for update;  -- locks row in t1
select * from v1 for update of v1;  -- locks row in t1
select * from (select * from t1) s1 for update;  -- locks row in t1
select * from (select * from t1) s1 for update of s1;  -- locks row in t1
with c1 as (select * from t1)
  select * from c1 for update;  -- does NOT lock anything at all
with c1 as (select * from t1)
  select * from c1 for update of c1;  -- parse-time error

(Obviously, inlining decisions should not change what gets locked;
the behavior here should not be changed unless it is changed for both
inlined and non-inlined CTEs.)

-- 
Andrew (irc:RhodiumToad)


pgsql-hackers by date:

Previous
From: Michael Paquier
Date:
Subject: Re: Removing --disable-strong-random from the code
Next
From: Michael Paquier
Date:
Subject: Re: [PATCH] check for ctags utility in make_ctags