On Sat, Jul 17, 2021 at 3:45 PM David Rowley <dgrowle...@gmail.com> wrote: > > On Sat, 17 Jul 2021 at 19:32, Andy Fan <zhihui.fan1...@gmail.com> wrote: > > SELECT * FROM t1, t2 WHERE t1.pk = t2.pk; > > > > Then when I populate_baserel_uniquekeys for t1, we already have > > EC{Members={t1.pk, t2.pk}} in root->eq_classes already. Then I use > > this EC directly for t1's UniqueKey. The result is: > > > > T1's UniqueKey : [ EC{Members={t1.pk, t2.pk}} ]. > > > > *Would this be OK since at the baserel level, the "t1.pk = t2.pk" is not > > executed yet?* > > > > I tried the below example to test how PathKey is maintained. > > CREATE TABLE t1 (a INT, b INT); > > CREATE TABLE t2 (a INT, b INT); > > CREATE INDEX ON t1(b); > > > > SELECT * FROM t1, t2 WHERE t1.b = t2.b and t1.b > 3; > > > > then we can get t1's Path: > > > > Index Scan on (b), PathKey.pk_class include 2 members (t1.b, t2.b} > > even before the Join. > > > > So looks the answer for my question should be "yes"? Hope I have > > made myself clear. > > I don't see the problem.
Thanks for the double check, that removes a big blocker for my development. I'd submit a new patch very soon. > The reason PathKeys use EquivalenceClasses is > so that queries like: SELECT * FROM tab WHERE a=b ORDER BY b; can see > that they're also ordered by a. This is useful because if there > happens to be an index on tab(a) then we can use it to provide the > required ordering for this query. > > We'll want the same with UniqueKeys. The same thing there looks like: > > CREATE TABLE tab (a int primary key, b int not null); > > select distinct b from tab where a=b; > > Since we have the EquivalenceClass with {a,b} stored in the UniqueKey, > then we should be able to execute this without doing any distinct > operation. > > David -- Best Regards Andy Fan (https://www.aliyun.com/)