Class TransformCorrelatedScalarSubquery

  • All Implemented Interfaces:
    Rule<CorrelatedJoinNode>

    public class TransformCorrelatedScalarSubquery
    extends Object
    implements Rule<CorrelatedJoinNode>
    Scalar filter scan query is something like:
         SELECT a,b,c FROM rel WHERE a = correlated1 AND b = correlated2
     

    This optimizer can rewrite to mark distinct and filter over a left outer join:

    From:

     - CorrelatedJoin (with correlation list: [C])
       - (input) plan which produces symbols: [A, B, C]
       - (scalar subquery) Project F
         - Filter(D = C AND E > 5)
           - plan which produces symbols: [D, E, F]
     
    to:
     - Filter(CASE isDistinct WHEN true THEN true ELSE fail('Scalar sub-query has returned multiple rows'))
       - MarkDistinct(isDistinct)
         - CorrelatedJoin (with correlation list: [C])
           - AssignUniqueId(adds symbol U)
             - (input) plan which produces symbols: [A, B, C]
           - non scalar subquery
     

    This must be run after aggregation decorrelation rules.