64 lines
2.2 KiB
Diff
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));
|
|
}
|
|
}
|