22
33#include " duckdb/catalog/catalog_entry/duck_table_entry.hpp"
44#include " duckdb/catalog/dependency_list.hpp"
5+ #include " duckdb/common/enums/expression_type.hpp"
56#include " duckdb/common/mutex.hpp"
67#include " duckdb/common/serializer/deserializer.hpp"
78#include " duckdb/common/serializer/serializer.hpp"
9+ #include " duckdb/common/typedefs.hpp"
10+ #include " duckdb/common/unique_ptr.hpp"
811#include " duckdb/execution/index/art/art.hpp"
912#include " duckdb/function/function_set.hpp"
1013#include " duckdb/main/attached_database.hpp"
1114#include " duckdb/main/client_config.hpp"
12- #include " duckdb/optimizer/matcher/expression_matcher.hpp"
13- #include " duckdb/planner/expression/bound_between_expression.hpp"
15+ #include " duckdb/planner/expression.hpp"
16+ #include " duckdb/planner/expression/bound_cast_expression.hpp"
17+ #include " duckdb/planner/expression/bound_columnref_expression.hpp"
18+ #include " duckdb/planner/expression/bound_function_expression.hpp"
19+ #include " duckdb/planner/expression/bound_operator_expression.hpp"
1420#include " duckdb/planner/operator/logical_get.hpp"
1521#include " duckdb/storage/data_table.hpp"
1622#include " duckdb/storage/table/scan_state.hpp"
1723#include " duckdb/transaction/duck_transaction.hpp"
1824#include " duckdb/transaction/local_storage.hpp"
1925#include " duckdb/storage/storage_index.hpp"
2026#include " duckdb/main/client_data.hpp"
21- #include " duckdb/common/algorithm.hpp"
2227#include " duckdb/planner/filter/optional_filter.hpp"
2328#include " duckdb/planner/filter/in_filter.hpp"
2429#include " duckdb/planner/expression/bound_constant_expression.hpp"
2530#include " duckdb/planner/expression/bound_comparison_expression.hpp"
2631#include " duckdb/planner/filter/conjunction_filter.hpp"
2732#include " duckdb/common/types/value_map.hpp"
2833
29- #include < list>
30-
3134namespace duckdb {
3235
3336struct TableScanLocalState : public LocalTableFunctionState {
@@ -484,6 +487,42 @@ vector<unique_ptr<Expression>> ExtractFilterExpressions(const ColumnDefinition &
484487 return expressions;
485488}
486489
490+ // Recursively updates column bindings in an index expression to match the current input projection,
491+ // even if they are the child of a function or cast
492+ void UpdateIndexExprColumnBindings (unique_ptr<Expression> &expr, const vector<column_t > &input_column_ids,
493+ const vector<column_t > &indexed_columns) {
494+ if (!expr) { return ; }
495+
496+ switch (expr->GetExpressionClass ()) {
497+ case ExpressionClass::BOUND_COLUMN_REF: {
498+ auto &bound_column_ref_expr = expr->Cast <BoundColumnRefExpression>();
499+
500+ for (idx_t i=0 ; i < input_column_ids.size (); ++i) {
501+ if (input_column_ids[i] == indexed_columns[0 ]) {
502+ bound_column_ref_expr.binding .column_index = i;
503+ break ;
504+ }
505+ }
506+ break ;
507+ }
508+ case ExpressionClass::BOUND_FUNCTION: {
509+ auto &func_expr = expr->Cast <BoundFunctionExpression>();
510+ for (auto &child : func_expr.children ) {
511+ UpdateIndexExprColumnBindings (child, input_column_ids, indexed_columns);
512+ }
513+ break ;
514+ }
515+ // TODO: never end up here, TableScanInitGlobal called without filters in input
516+ // case ExpressionClass::BOUND_CAST: {
517+ // auto &cast_expr = expr->Cast<BoundCastExpression>();
518+ // UpdateIndexExprColumnBindings(cast_expr.child, input_column_ids, indexed_columns);
519+ // break;
520+ // }
521+ default :
522+ break ;
523+ }
524+ }
525+
487526bool TryScanIndex (ART &art, const ColumnList &column_list, TableFunctionInitInput &input, TableFilterSet &filter_set,
488527 idx_t max_count, unsafe_vector<row_t > &row_ids) {
489528 // FIXME: No support for index scans on compound ARTs.
@@ -500,6 +539,9 @@ bool TryScanIndex(ART &art, const ColumnList &column_list, TableFunctionInitInpu
500539 return false ;
501540 }
502541
542+ // Resolve bound column references in the index_expr against the current input
543+ UpdateIndexExprColumnBindings (index_expr, input.column_ids , indexed_columns);
544+
503545 // Get ART column.
504546 auto &col = column_list.GetColumn (LogicalIndex (indexed_columns[0 ]));
505547
0 commit comments