Class TransformCorrelatedScalarSubquery

java.lang.Object
io.trino.sql.planner.iterative.rule.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.