Skip to content

Commit 988b921

Browse files
authored
Merge pull request #39 from sirius-db/fix/cudf_join_crash
Fix crashing and potential invalid intermediate cudf expr in cudf_join
2 parents ae6afcb + 80779d1 commit 988b921

1 file changed

Lines changed: 11 additions & 7 deletions

File tree

src/cuda/cudf/cudf_join.cu

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)