java-topology/defects/duckdb/patch/duckdb-0001-correlated-columns-dedup-hashset.patch

64 lines
2.2 KiB
Diff

# UNDF: UNDF-2026-000000056
# UNDF:
--- a/src/include/duckdb/planner/binder.hpp
+++ b/src/include/duckdb/planner/binder.hpp
@@ -10,6 +10,7 @@
#include "duckdb/planner/bound_query_node.hpp"
#include "duckdb/planner/bound_statement.hpp"
#include "duckdb/planner/column_binding_map.hpp"
+#include "duckdb/common/unordered_set.hpp"
namespace duckdb {
@@ -104,8 +105,13 @@ struct CorrelatedColumns {
public:
CorrelatedColumns() : delim_index(1ULL << 63) {
}
+
+ bool Contains(const CorrelatedColumnInfo &info) const {
+ return binding_set.count(info.binding) > 0; // O(1) instead of O(N) std::find
+ }
void AddColumn(container_type::value_type info) {
// Add to beginning
+ binding_set.insert(info.binding);
correlated_columns.insert(correlated_columns.begin(), std::move(info));
delim_index++;
}
void AddColumnToBack(container_type::value_type info) {
// Add to end
+ binding_set.insert(info.binding);
correlated_columns.push_back(std::move(info));
}
+ void clear() { // NOLINT: match stl case
+ correlated_columns.clear();
+ binding_set.clear();
+ }
+
private:
container_type correlated_columns;
+ column_binding_set_t binding_set; // O(1) membership test; kept in sync with correlated_columns
idx_t delim_index;
};
--- a/src/planner/binder.cpp
+++ b/src/planner/binder.cpp
@@ -285,7 +285,7 @@ void Binder::AddCorrelatedColumn(const CorrelatedColumnInfo &info) {
// we only add correlated columns to the list if they are not already there
- if (std::find(correlated_columns.begin(), correlated_columns.end(), info) == correlated_columns.end()) {
+ if (!correlated_columns.Contains(info)) { // O(1) via binding_set; was O(N) std::find
correlated_columns.AddColumn(info);
}
}
--- a/src/planner/expression_binder/lateral_binder.cpp
+++ b/src/planner/expression_binder/lateral_binder.cpp
@@ -17,7 +17,7 @@ void LateralBinder::ExtractCorrelatedColumns(Expression &expr) {
// add the correlated column info
CorrelatedColumnInfo info(bound_colref);
- if (std::find(correlated_columns.begin(), correlated_columns.end(), info) == correlated_columns.end()) {
+ if (!correlated_columns.Contains(info)) { // O(1) via binding_set; was O(N) std::find
correlated_columns.AddColumn(std::move(info));
}
}