@@ -81,6 +81,8 @@ void cudf_mixed_join(vector<shared_ptr<GPUColumn>>& probe_columns, vector<shared
8181 std::vector<cudf::column_view> build_conditional_columns;
8282
8383 std::vector<cudf::ast::operation> cudf_exprs;
84+ std::vector<cudf::ast::column_reference> owned_left_column_references;
85+ std::vector<cudf::ast::column_reference> owned_right_column_references;
8486 for (int cond_idx = 0 ; cond_idx < conditions.size (); cond_idx++) {
8587 if (conditions[cond_idx].comparison == ExpressionType::COMPARE_EQUAL || conditions[cond_idx].comparison == ExpressionType::COMPARE_NOT_DISTINCT_FROM ) {
8688 probe_equal_columns.push_back (probe_columns[cond_idx]->convertToCudfColumn ());
@@ -91,21 +93,23 @@ void cudf_mixed_join(vector<shared_ptr<GPUColumn>>& probe_columns, vector<shared
9193 build_conditional_columns.push_back (build_columns[cond_idx]->convertToCudfColumn ());
9294
9395 auto not_equal_op = cudf::ast::ast_operator::NOT_EQUAL ;
94- auto left_ref = cudf::ast::column_reference (probe_conditional_columns.size () - 1 , cudf::ast::table_reference::LEFT );
95- auto right_ref = cudf::ast::column_reference (build_conditional_columns.size () - 1 , cudf::ast::table_reference::RIGHT );
96- auto cudf_expr = cudf::ast::operation (not_equal_op, left_ref, right_ref);
97- cudf_exprs.push_back (cudf_expr);
96+ owned_left_column_references.emplace_back (probe_conditional_columns.size () - 1 , cudf::ast::table_reference::LEFT );
97+ owned_right_column_references.emplace_back (build_conditional_columns.size () - 1 , cudf::ast::table_reference::RIGHT );
98+ cudf_exprs.emplace_back (not_equal_op, owned_left_column_references.back (), owned_right_column_references.back ());
9899 } else {
99100 throw NotImplementedException (" Unsupported comparison type" );
100101 }
101102 }
102103 }
103104
104- // merge cudf_exprs into a single expression
105- cudf::ast::operation final_expr = cudf_exprs[0 ];
105+ // merge cudf_exprs into a single expression, it's guaranteed from caller that `cudf_exprs` is not empty
106+ std::vector<cudf::ast::operation> intermediate_cudf_exprs;
107+ intermediate_cudf_exprs.push_back (std::move (cudf_exprs[0 ]));
106108 for (int expr_idx = 1 ; expr_idx < cudf_exprs.size (); expr_idx++) {
107- final_expr = cudf::ast::operation (cudf::ast::ast_operator::BITWISE_AND , final_expr, cudf_exprs[expr_idx]);
109+ intermediate_cudf_exprs.emplace_back (
110+ cudf::ast::ast_operator::BITWISE_AND , intermediate_cudf_exprs.back (), cudf_exprs[expr_idx]);
108111 }
112+ const auto & final_expr = intermediate_cudf_exprs.back ();
109113
110114 auto probe_equal_table = cudf::table_view (probe_equal_columns);
111115 auto build_equal_table = cudf::table_view (build_equal_columns);
0 commit comments