Re: Making Vars outer-join aware
От | Richard Guo |
---|---|
Тема | Re: Making Vars outer-join aware |
Дата | |
Msg-id | CAMbWs4_pH7w7voY0AejUM4RiKq-Xuf+sXmoF8PcQwzNrsagEXA@mail.gmail.com обсуждение исходный текст |
Ответ на | Re: Making Vars outer-join aware (Tom Lane <tgl@sss.pgh.pa.us>) |
Ответы |
Re: Making Vars outer-join aware
|
Список | pgsql-hackers |
On Sun, Nov 6, 2022 at 5:53 AM Tom Lane <tgl@sss.pgh.pa.us> wrote:
I wrote:
> I've been working away at this patch series, and here is an up-to-date
> version.
This needs a rebase after ff8fa0bf7 and b0b72c64a. I also re-ordered
the patches so that the commit messages' claims about when regression
tests start to pass are true again. No interesting changes, though.
I'm reviewing the part about multiple version clauses, and I find a case
that may not work as expected. I tried with some query as below
(A leftjoin (B leftjoin C on (Pbc)) on (Pab)) left join D on (Pcd)
Assume Pbc is strict for B and Pcd is strict for C.
According to identity 3, we know one of its equivalent form is
((A leftjoin B on (Pab)) leftjoin C on (Pbc)) left join D on (Pcd)
For outer join clause Pcd, we would generate two versions from the first
form
Version 1: C Vars with nullingrels as {A/B}
Version 2: C Vars with nullingrels as {B/C, A/B}
I understand version 2 is reasonable as the nullingrels from parser
would be set as that. But it seems version 1 is not applicable in
either form.
Looking at the two forms again, it seems the expected two versions for
Pcd should be
Version 1: C Vars with nullingrels as {B/C}
Version 2: C Vars with nullingrels as {B/C, A/B}
With this we may have another problem that the two versions are both
applicable at the C/D join according to clause_is_computable_at(), in
both forms.
Another thing is I believe we have another equivalent form as
(A left join B on (Pab)) left join (C left join D on (Pcd)) on (Pbc)
Currently this form cannot be generated because of the issue discussed
in [1]. But someday when we can do that, I think we should have a third
version for Pcd
Version 3: C Vars with empty nullingrels
[1] https://www.postgresql.org/message-id/flat/CAMbWs4_8n5ANh_aX2PinRZ9V9mtBguhnRd4DOVt9msPgHmEMOQ%40mail.gmail.com
Thanks
Richard
that may not work as expected. I tried with some query as below
(A leftjoin (B leftjoin C on (Pbc)) on (Pab)) left join D on (Pcd)
Assume Pbc is strict for B and Pcd is strict for C.
According to identity 3, we know one of its equivalent form is
((A leftjoin B on (Pab)) leftjoin C on (Pbc)) left join D on (Pcd)
For outer join clause Pcd, we would generate two versions from the first
form
Version 1: C Vars with nullingrels as {A/B}
Version 2: C Vars with nullingrels as {B/C, A/B}
I understand version 2 is reasonable as the nullingrels from parser
would be set as that. But it seems version 1 is not applicable in
either form.
Looking at the two forms again, it seems the expected two versions for
Pcd should be
Version 1: C Vars with nullingrels as {B/C}
Version 2: C Vars with nullingrels as {B/C, A/B}
With this we may have another problem that the two versions are both
applicable at the C/D join according to clause_is_computable_at(), in
both forms.
Another thing is I believe we have another equivalent form as
(A left join B on (Pab)) left join (C left join D on (Pcd)) on (Pbc)
Currently this form cannot be generated because of the issue discussed
in [1]. But someday when we can do that, I think we should have a third
version for Pcd
Version 3: C Vars with empty nullingrels
[1] https://www.postgresql.org/message-id/flat/CAMbWs4_8n5ANh_aX2PinRZ9V9mtBguhnRd4DOVt9msPgHmEMOQ%40mail.gmail.com
Thanks
Richard
В списке pgsql-hackers по дате отправления: