@@ -123,6 +123,8 @@ void QueryToOperatorTransformer::Visit(parser::SelectStatement *op) {
123123 predicates_ = std::move (pre_predicates);
124124}
125125void QueryToOperatorTransformer::Visit (parser::JoinDefinition *node) {
126+ auto pre_predicates = std::move (predicates_);
127+
126128 // Get left operator
127129 node->left ->Accept (this );
128130 auto left_expr = output_expr_;
@@ -137,25 +139,25 @@ void QueryToOperatorTransformer::Visit(parser::JoinDefinition *node) {
137139 case JoinType::INNER: {
138140 predicates_ = CollectPredicates (node->condition .get (), predicates_);
139141 join_expr = std::make_shared<OperatorExpression>(
140- LogicalJoin::make (JoinType::INNER));
142+ LogicalJoin::make (JoinType::INNER, predicates_ ));
141143 break ;
142144 }
143145 case JoinType::OUTER: {
144146 predicates_ = CollectPredicates (node->condition .get (), predicates_);
145147 join_expr = std::make_shared<OperatorExpression>(
146- LogicalJoin::make (JoinType::OUTER));
148+ LogicalJoin::make (JoinType::OUTER, predicates_ ));
147149 break ;
148150 }
149151 case JoinType::LEFT: {
150152 predicates_ = CollectPredicates (node->condition .get (), predicates_);
151153 join_expr = std::make_shared<OperatorExpression>(
152- LogicalJoin::make (JoinType::LEFT));
154+ LogicalJoin::make (JoinType::LEFT, predicates_ ));
153155 break ;
154156 }
155157 case JoinType::RIGHT: {
156158 predicates_ = CollectPredicates (node->condition .get (), predicates_);
157159 join_expr = std::make_shared<OperatorExpression>(
158- LogicalJoin::make (JoinType::RIGHT));
160+ LogicalJoin::make (JoinType::RIGHT, predicates_ ));
159161 break ;
160162 }
161163 case JoinType::SEMI: {
@@ -171,6 +173,7 @@ void QueryToOperatorTransformer::Visit(parser::JoinDefinition *node) {
171173 join_expr->PushChild (right_expr);
172174
173175 output_expr_ = join_expr;
176+ predicates_ = std::move (pre_predicates);
174177}
175178void QueryToOperatorTransformer::Visit (parser::TableRef *node) {
176179 if (node->select != nullptr ) {
0 commit comments