From: | Amit Langote <Langote_Amit_f8(at)lab(dot)ntt(dot)co(dot)jp> |
---|---|
To: | Robert Haas <robertmhaas(at)gmail(dot)com>, Ashutosh Bapat <ashutosh(dot)bapat(at)enterprisedb(dot)com> |
Cc: | pgsql-hackers <pgsql-hackers(at)postgresql(dot)org>, Amit Langote <amitlangote09(at)gmail(dot)com> |
Subject: | Re: A bug in mapping attributes in ATExecAttachPartition() |
Date: | 2017-06-09 06:13:27 |
Message-ID: | 8d26530c-8283-e3c0-8214-591af5eb09a5@lab.ntt.co.jp |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
On 2017/06/08 18:43, Amit Langote wrote:
> On 2017/06/08 1:44, Robert Haas wrote:
>> On Wed, Jun 7, 2017 at 7:47 AM, Ashutosh Bapat
>> <ashutosh(dot)bapat(at)enterprisedb(dot)com> wrote:
>>> In ATExecAttachPartition() there's following code
>>>
>>> 13715 partnatts = get_partition_natts(key);
>>> 13716 for (i = 0; i < partnatts; i++)
>>> 13717 {
>>> 13718 AttrNumber partattno;
>>> 13719
>>> 13720 partattno = get_partition_col_attnum(key, i);
>>> 13721
>>> 13722 /* If partition key is an expression, must not skip
>>> validation */
>>> 13723 if (!partition_accepts_null &&
>>> 13724 (partattno == 0 ||
>>> 13725 !bms_is_member(partattno, not_null_attrs)))
>>> 13726 skip_validate = false;
>>> 13727 }
>>>
>>> partattno obtained from the partition key is the attribute number of
>>> the partitioned table but not_null_attrs contains the attribute
>>> numbers of attributes of the table being attached which have NOT NULL
>>> constraint on them. But the attribute numbers of partitioned table and
>>> the table being attached may not agree i.e. partition key attribute in
>>> partitioned table may have a different position in the table being
>>> attached. So, this code looks buggy. Probably we don't have a test
>>> which tests this code with different attribute order between
>>> partitioned table and the table being attached. I didn't get time to
>>> actually construct a testcase and test it.
>
> There seem to be couple of bugs here:
>
> 1. When partition's key attributes differ in ordering from the parent,
> predicate_implied_by() will give up due to structural inequality of
> Vars in the expressions. By fixing this, we can get it to return
> 'true' when it's really so.
>
> 2. As you said, we store partition's attribute numbers in the
> not_null_attrs bitmap, but then check partattno (which is the parent's
> attribute number which might differ) against the bitmap, which seems
> like it might produce incorrect result. If, for example,
> predicate_implied_by() set skip_validate to true, and the above code
> failed to set skip_validate to false where it should have, then we
> would wrongly end up skipping the scan. That is, rows in the partition
> will contain null values whereas the partition constraint does not
> allow it. It's hard to reproduce this currently, because with
> different ordering of attributes, predicate_refute_by() never returns
> true (as mentioned in 1 above), so skip_validate does not need to be
> set to false again.
>
> Consider this example:
>
> create table p (a int, b char) partition by list (a);
>
> create table p1 (b char not null, a int check (a in (1)));
> insert into p1 values ('b', null);
>
> Note that not_null_attrs for p1 will contain 1 corresponding to column b,
> which matches key attribute of the parent, that is 1, corresponding to
> column a. Hence we end up wrongly concluding that p1's partition key
> column does not allow nulls.
[ ... ]
> I am working on a patch to fix the above mentioned issues and will post
> the same no later than Friday.
And here is the patch.
Thanks,
Amit
Attachment | Content-Type | Size |
---|---|---|
0001-Fixes-around-partition-constraint-handling-when-atta.patch | text/plain | 11.4 KB |
From | Date | Subject | |
---|---|---|---|
Next Message | Noah Misch | 2017-06-09 06:17:38 | Re: BUG #14680: startup process on standby encounter a deadlock of TwoPhaseStateLock when redo 2PC xlog |
Previous Message | Noah Misch | 2017-06-09 06:09:51 | Re: BUG #14682: row level security not work with partitioned table |