Re: pgsql: Clarify use of temporary tables within partition trees

From: Amit Langote <Langote_Amit_f8(at)lab(dot)ntt(dot)co(dot)jp>
To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, Ashutosh Bapat <ashutosh(dot)bapat(at)enterprisedb(dot)com>
Cc: David Rowley <david(dot)rowley(at)2ndquadrant(dot)com>, Michael Paquier <michael(at)paquier(dot)xyz>, Robert Haas <robertmhaas(at)gmail(dot)com>, pgsql-committers <pgsql-committers(at)postgresql(dot)org>
Subject: Re: pgsql: Clarify use of temporary tables within partition trees
Date: 2018-07-04 01:24:15
Message-ID: 8ed3e6e5-225c-cbf9-f8d9-5415df3e7ae1@lab.ntt.co.jp
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers pgsql-hackers

On 2018/07/04 1:21, Tom Lane wrote:
> Ashutosh Bapat <ashutosh(dot)bapat(at)enterprisedb(dot)com> writes:
>> On Tue, Jul 3, 2018 at 3:20 PM, Amit Langote
>> <Langote_Amit_f8(at)lab(dot)ntt(dot)co(dot)jp> wrote:
>>> Maybe because that's what's done for the root parent in a plain
>>> inheritance hierarchy, which is always a plain table. In that case, one
>>> RTE is for its role as the parent (with rte->inh = true) and another is
>>> for its role as a child (with rte->inh = false). The former is processed
>>> as an append rel and the latter as a plain rel that will get assigned scan
>>> paths such as SeqScan, etc.
>
>> Yes that's true.
>
> Yes, that's exactly why there are two RTEs for the parent table in normal
> inheritance cases. I concur with the idea that it shouldn't be necessary
> to create a child RTE for a partitioning parent table --- we should really
> only need the appendrel RTE plus RTEs for tables that will be scanned.
>
> However, it's not clear to me that this is a trivial change for multilevel
> partitioning cases. Do we need RTEs for the intermediate nonleaf levels?
> In the abstract, the planner and executor might not need them. But the
> code that deals with partitioning constraint management might expect them
> to exist.

We do need RTEs for *all* parents (non-leaf tables) in a partition tree,
each of which we need to process as an append rel (partition pruning is
invoked separately for each non-leaf table). What we *don't* need for
each of them is the duplicate RTE with inh = false, because we don't need
to process them as plain rels.

> Another point is that executor-start-time privilege checking is driven
> off the RTE list, so we need an RTE for any table that requires priv
> checks, so we might need RTEs for intermediate levels just for that.
>
> Also, IIRC, the planner sets up the near-duplicate RTEs for inheritance
> cases so that only one of them is privilege-checked.

Yeah, I see in prepunion.c that the child RTE's requiredPerms is set to 0,
with the following comment justifying it:

"Also, set requiredPerms to zero since all required permissions checks are
done on the original RTE."

> Be careful that
> you don't end up with zero privilege checks on the partition root :-(

The original RTE belongs to the partition root and it's already in the
range table, so its privileges *are* checked.

Thanks,
Amit

In response to

Browse pgsql-committers by date

  From Date Subject
Next Message Michael Paquier 2018-07-04 01:48:40 pgsql: Remove dead code for temporary relations in partition planning
Previous Message Amit Langote 2018-07-04 01:13:06 Re: pgsql: Clarify use of temporary tables within partition trees

Browse pgsql-hackers by date

  From Date Subject
Next Message Ashwin Agrawal 2018-07-04 01:30:26 Re: Bulk Insert into PostgreSQL
Previous Message Amit Langote 2018-07-04 01:13:06 Re: pgsql: Clarify use of temporary tables within partition trees