Bug: Join estimation support LeftExistence join type
Status: In Progress | Priority: Major | Resolution: 
Created: 10/Sep/21 09:00
Affects Version/s: 3.3.0

Join estimation support LeftExistence join type. This can benefit tpcds q10.

Before:
{noformat}
TakeOrderedAndProject (51)
+- * HashAggregate (50)
   +- Exchange (49)
      +- * HashAggregate (48)
         +- * Project (47)
            +- * SortMergeJoin Inner (46)
               :- * Sort (40)
               :  +- Exchange (39)
               :     +- * Project (38)
               :        +- * BroadcastHashJoin Inner BuildRight (37)
               :           :- * Project (31)
               :           :  +- * Filter (30)
               :           :     +- SortMergeJoin ExistenceJoin(exists#1) (29)
               :           :        :- SortMergeJoin ExistenceJoin(exists#2) (21)
               :           :        :  :- * SortMergeJoin LeftSemi (13)
               :           :        :  :  :- * Sort (5)
               :           :        :  :  :  +- Exchange (4)
               :           :        :  :  :     +- * Filter (3)
               :           :        :  :  :        +- * ColumnarToRow (2)
               :           :        :  :  :           +- Scan parquet default.customer (1)
               :           :        :  :  +- * Sort (12)
               :           :        :  :     +- Exchange (11)
               :           :        :  :        +- * Project (10)
               :           :        :  :           +- * BroadcastHashJoin Inner BuildRight (9)
               :           :        :  :              :- * ColumnarToRow (7)
               :           :        :  :              :  +- Scan parquet default.store_sales (6)
               :           :        :  :              +- ReusedExchange (8)
               :           :        :  +- * Sort (20)
               :           :        :     +- Exchange (19)
               :           :        :        +- * Project (18)
               :           :        :           +- * BroadcastHashJoin Inner BuildRight (17)
               :           :        :              :- * ColumnarToRow (15)
               :           :        :              :  +- Scan parquet default.web_sales (14)
               :           :        :              +- ReusedExchange (16)
               :           :        +- * Sort (28)
               :           :           +- Exchange (27)
               :           :              +- * Project (26)
               :           :                 +- * BroadcastHashJoin Inner BuildRight (25)
               :           :                    :- * ColumnarToRow (23)
               :           :                    :  +- Scan parquet default.catalog_sales (22)
               :           :                    +- ReusedExchange (24)
               :           +- BroadcastExchange (36)
               :              +- * Project (35)
               :                 +- * Filter (34)
               :                    +- * ColumnarToRow (33)
               :                       +- Scan parquet default.customer_address (32)
               +- * Sort (45)
                  +- Exchange (44)
                     +- * Filter (43)
                        +- * ColumnarToRow (42)
                           +- Scan parquet default.customer_demographics (41)
{noformat}

After:
{noformat}
TakeOrderedAndProject (48)
+- * HashAggregate (47)
   +- Exchange (46)
      +- * HashAggregate (45)
         +- * Project (44)
            +- * BroadcastHashJoin Inner BuildLeft (43)
               :- BroadcastExchange (39)
               :  +- * Project (38)
               :     +- * BroadcastHashJoin Inner BuildRight (37)
               :        :- * Project (31)
               :        :  +- * Filter (30)
               :        :     +- SortMergeJoin ExistenceJoin(exists#1) (29)
               :        :        :- SortMergeJoin ExistenceJoin(exists#2) (21)
               :        :        :  :- * SortMergeJoin LeftSemi (13)
               :        :        :  :  :- * Sort (5)
               :        :        :  :  :  +- Exchange (4)
               :        :        :  :  :     +- * Filter (3)
               :        :        :  :  :        +- * ColumnarToRow (2)
               :        :        :  :  :           +- Scan parquet default.customer (1)
               :        :        :  :  +- * Sort (12)
               :        :        :  :     +- Exchange (11)
               :        :        :  :        +- * Project (10)
               :        :        :  :           +- * BroadcastHashJoin Inner BuildRight (9)
               :        :        :  :              :- * ColumnarToRow (7)
               :        :        :  :              :  +- Scan parquet default.store_sales (6)
               :        :        :  :              +- ReusedExchange (8)
               :        :        :  +- * Sort (20)
               :        :        :     +- Exchange (19)
               :        :        :        +- * Project (18)
               :        :        :           +- * BroadcastHashJoin Inner BuildRight (17)
               :        :        :              :- * ColumnarToRow (15)
               :        :        :              :  +- Scan parquet default.web_sales (14)
               :        :        :              +- ReusedExchange (16)
               :        :        +- * Sort (28)
               :        :           +- Exchange (27)
               :        :              +- * Project (26)
               :        :                 +- * BroadcastHashJoin Inner BuildRight (25)
               :        :                    :- * ColumnarToRow (23)
               :        :                    :  +- Scan parquet default.catalog_sales (22)
               :        :                    +- ReusedExchange (24)
               :        +- BroadcastExchange (36)
               :           +- * Project (35)
               :              +- * Filter (34)
               :                 +- * ColumnarToRow (33)
               :                    +- Scan parquet default.customer_address (32)
               +- * Filter (42)
                  +- * ColumnarToRow (41)
                     +- Scan parquet default.customer_demographics (40)
{noformat}