duckdb 0.7.2-dev12.0 → 0.7.2-dev1244.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/binding.gyp +12 -7
- package/lib/duckdb.d.ts +55 -2
- package/lib/duckdb.js +20 -1
- package/package.json +1 -1
- package/src/connection.cpp +1 -2
- package/src/database.cpp +1 -1
- package/src/duckdb/extension/icu/icu-extension.cpp +4 -0
- package/src/duckdb/extension/icu/icu-list-range.cpp +207 -0
- package/src/duckdb/extension/icu/icu-table-range.cpp +194 -0
- package/src/duckdb/extension/icu/include/icu-list-range.hpp +17 -0
- package/src/duckdb/extension/icu/include/icu-table-range.hpp +17 -0
- package/src/duckdb/extension/icu/third_party/icu/stubdata/stubdata.cpp +1 -1
- package/src/duckdb/extension/json/include/json_common.hpp +1 -0
- package/src/duckdb/extension/json/include/json_functions.hpp +2 -0
- package/src/duckdb/extension/json/include/json_serializer.hpp +77 -0
- package/src/duckdb/extension/json/json_functions/json_serialize_sql.cpp +147 -0
- package/src/duckdb/extension/json/json_functions/read_json.cpp +6 -5
- package/src/duckdb/extension/json/json_functions.cpp +12 -4
- package/src/duckdb/extension/json/json_scan.cpp +2 -2
- package/src/duckdb/extension/json/json_serializer.cpp +217 -0
- package/src/duckdb/extension/parquet/column_reader.cpp +94 -15
- package/src/duckdb/extension/parquet/column_writer.cpp +0 -1
- package/src/duckdb/extension/parquet/include/column_reader.hpp +1 -2
- package/src/duckdb/extension/parquet/include/decode_utils.hpp +5 -4
- package/src/duckdb/extension/parquet/include/generated_column_reader.hpp +1 -11
- package/src/duckdb/extension/parquet/include/parquet_timestamp.hpp +2 -1
- package/src/duckdb/extension/parquet/parquet-extension.cpp +14 -3
- package/src/duckdb/extension/parquet/parquet_reader.cpp +6 -1
- package/src/duckdb/extension/parquet/parquet_statistics.cpp +49 -36
- package/src/duckdb/extension/parquet/parquet_timestamp.cpp +16 -6
- package/src/duckdb/src/catalog/catalog.cpp +34 -5
- package/src/duckdb/src/catalog/catalog_entry/duck_schema_entry.cpp +4 -0
- package/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp +2 -21
- package/src/duckdb/src/catalog/catalog_entry/scalar_function_catalog_entry.cpp +7 -6
- package/src/duckdb/src/catalog/catalog_entry/table_catalog_entry.cpp +3 -3
- package/src/duckdb/src/catalog/catalog_entry/table_function_catalog_entry.cpp +20 -1
- package/src/duckdb/src/catalog/catalog_entry/type_catalog_entry.cpp +8 -2
- package/src/duckdb/src/catalog/catalog_set.cpp +1 -0
- package/src/duckdb/src/catalog/default/default_functions.cpp +3 -0
- package/src/duckdb/src/catalog/dependency_list.cpp +12 -0
- package/src/duckdb/src/catalog/duck_catalog.cpp +34 -7
- package/src/duckdb/src/common/arrow/arrow_appender.cpp +48 -4
- package/src/duckdb/src/common/arrow/arrow_converter.cpp +1 -1
- package/src/duckdb/src/common/box_renderer.cpp +109 -23
- package/src/duckdb/src/common/enums/expression_type.cpp +8 -222
- package/src/duckdb/src/common/enums/join_type.cpp +3 -22
- package/src/duckdb/src/common/enums/logical_operator_type.cpp +2 -0
- package/src/duckdb/src/common/enums/statement_type.cpp +2 -0
- package/src/duckdb/src/common/exception.cpp +15 -1
- package/src/duckdb/src/common/field_writer.cpp +1 -0
- package/src/duckdb/src/common/hive_partitioning.cpp +3 -1
- package/src/duckdb/src/common/local_file_system.cpp +64 -7
- package/src/duckdb/src/common/operator/cast_operators.cpp +1 -1
- package/src/duckdb/src/common/preserved_error.cpp +7 -5
- package/src/duckdb/src/common/progress_bar/progress_bar.cpp +7 -0
- package/src/duckdb/src/common/serializer/buffered_deserializer.cpp +4 -0
- package/src/duckdb/src/common/serializer/buffered_file_reader.cpp +15 -2
- package/src/duckdb/src/common/serializer/enum_serializer.cpp +1176 -0
- package/src/duckdb/src/common/sort/comparators.cpp +14 -5
- package/src/duckdb/src/common/sort/sort_state.cpp +5 -7
- package/src/duckdb/src/common/sort/sorted_block.cpp +0 -1
- package/src/duckdb/src/common/string_util.cpp +18 -1
- package/src/duckdb/src/common/types/bit.cpp +166 -87
- package/src/duckdb/src/common/types/blob.cpp +1 -1
- package/src/duckdb/src/common/types/chunk_collection.cpp +2 -2
- package/src/duckdb/src/common/types/column_data_collection.cpp +39 -2
- package/src/duckdb/src/common/types/column_data_collection_segment.cpp +12 -10
- package/src/duckdb/src/common/types/data_chunk.cpp +1 -1
- package/src/duckdb/src/common/types/interval.cpp +0 -41
- package/src/duckdb/src/common/types/list_segment.cpp +658 -0
- package/src/duckdb/src/common/types/string_heap.cpp +1 -1
- package/src/duckdb/src/common/types/string_type.cpp +1 -1
- package/src/duckdb/src/common/types/time.cpp +13 -0
- package/src/duckdb/src/common/types/validity_mask.cpp +24 -7
- package/src/duckdb/src/common/types/value.cpp +320 -154
- package/src/duckdb/src/common/types/vector.cpp +158 -134
- package/src/duckdb/src/common/types.cpp +313 -153
- package/src/duckdb/src/common/value_operations/comparison_operations.cpp +14 -22
- package/src/duckdb/src/common/vector_operations/comparison_operators.cpp +10 -10
- package/src/duckdb/src/common/vector_operations/is_distinct_from.cpp +11 -10
- package/src/duckdb/src/common/vector_operations/vector_cast.cpp +2 -1
- package/src/duckdb/src/execution/aggregate_hashtable.cpp +98 -74
- package/src/duckdb/src/execution/column_binding_resolver.cpp +21 -5
- package/src/duckdb/src/execution/expression_executor/execute_cast.cpp +2 -1
- package/src/duckdb/src/execution/expression_executor/execute_comparison.cpp +2 -2
- package/src/duckdb/src/execution/index/art/art.cpp +19 -5
- package/src/duckdb/src/execution/join_hashtable.cpp +3 -1
- package/src/duckdb/src/execution/operator/aggregate/physical_hash_aggregate.cpp +1 -1
- package/src/duckdb/src/execution/operator/aggregate/physical_perfecthash_aggregate.cpp +4 -5
- package/src/duckdb/src/execution/operator/aggregate/physical_window.cpp +117 -26
- package/src/duckdb/src/execution/operator/helper/physical_limit.cpp +3 -0
- package/src/duckdb/src/execution/operator/helper/physical_vacuum.cpp +5 -3
- package/src/duckdb/src/execution/operator/join/physical_blockwise_nl_join.cpp +64 -17
- package/src/duckdb/src/execution/operator/join/physical_hash_join.cpp +2 -0
- package/src/duckdb/src/execution/operator/join/physical_iejoin.cpp +2 -2
- package/src/duckdb/src/execution/operator/join/physical_index_join.cpp +13 -4
- package/src/duckdb/src/execution/operator/join/physical_join.cpp +0 -3
- package/src/duckdb/src/execution/operator/join/physical_piecewise_merge_join.cpp +6 -11
- package/src/duckdb/src/execution/operator/join/physical_range_join.cpp +3 -1
- package/src/duckdb/src/execution/operator/persistent/base_csv_reader.cpp +11 -4
- package/src/duckdb/src/execution/operator/persistent/buffered_csv_reader.cpp +24 -19
- package/src/duckdb/src/execution/operator/persistent/csv_reader_options.cpp +3 -0
- package/src/duckdb/src/execution/operator/persistent/physical_batch_insert.cpp +2 -1
- package/src/duckdb/src/execution/operator/persistent/physical_copy_to_file.cpp +2 -2
- package/src/duckdb/src/execution/operator/persistent/physical_delete.cpp +1 -3
- package/src/duckdb/src/execution/operator/persistent/physical_insert.cpp +1 -0
- package/src/duckdb/src/execution/operator/projection/physical_projection.cpp +34 -0
- package/src/duckdb/src/execution/operator/scan/physical_positional_scan.cpp +20 -5
- package/src/duckdb/src/execution/operator/schema/physical_create_type.cpp +20 -40
- package/src/duckdb/src/execution/operator/set/physical_recursive_cte.cpp +2 -5
- package/src/duckdb/src/execution/partitionable_hashtable.cpp +20 -5
- package/src/duckdb/src/execution/physical_plan/plan_aggregate.cpp +22 -16
- package/src/duckdb/src/execution/physical_plan/plan_asof_join.cpp +97 -0
- package/src/duckdb/src/execution/physical_plan/plan_comparison_join.cpp +95 -47
- package/src/duckdb/src/execution/physical_plan/plan_create_index.cpp +2 -1
- package/src/duckdb/src/execution/physical_plan/plan_distinct.cpp +5 -8
- package/src/duckdb/src/execution/physical_plan/plan_positional_join.cpp +14 -5
- package/src/duckdb/src/execution/physical_plan_generator.cpp +3 -0
- package/src/duckdb/src/execution/radix_partitioned_hashtable.cpp +23 -15
- package/src/duckdb/src/execution/window_segment_tree.cpp +173 -1
- package/src/duckdb/src/function/aggregate/algebraic/avg.cpp +0 -6
- package/src/duckdb/src/function/aggregate/distributive/bitagg.cpp +99 -95
- package/src/duckdb/src/function/aggregate/distributive/bitstring_agg.cpp +269 -0
- package/src/duckdb/src/function/aggregate/distributive/bool.cpp +2 -0
- package/src/duckdb/src/function/aggregate/distributive/count.cpp +3 -4
- package/src/duckdb/src/function/aggregate/distributive/first.cpp +1 -0
- package/src/duckdb/src/function/aggregate/distributive/minmax.cpp +2 -0
- package/src/duckdb/src/function/aggregate/distributive/sum.cpp +19 -16
- package/src/duckdb/src/function/aggregate/distributive_functions.cpp +1 -0
- package/src/duckdb/src/function/aggregate/holistic/approximate_quantile.cpp +5 -2
- package/src/duckdb/src/function/aggregate/holistic/mode.cpp +1 -1
- package/src/duckdb/src/function/aggregate/holistic/quantile.cpp +16 -1
- package/src/duckdb/src/function/aggregate/nested/list.cpp +6 -712
- package/src/duckdb/src/function/aggregate/sorted_aggregate_function.cpp +138 -45
- package/src/duckdb/src/function/cast/bit_cast.cpp +0 -2
- package/src/duckdb/src/function/cast/blob_cast.cpp +0 -1
- package/src/duckdb/src/function/cast/cast_function_set.cpp +1 -1
- package/src/duckdb/src/function/cast/enum_casts.cpp +25 -3
- package/src/duckdb/src/function/cast/list_casts.cpp +17 -4
- package/src/duckdb/src/function/cast/map_cast.cpp +5 -2
- package/src/duckdb/src/function/cast/string_cast.cpp +36 -10
- package/src/duckdb/src/function/cast/struct_cast.cpp +24 -4
- package/src/duckdb/src/function/cast/time_casts.cpp +2 -2
- package/src/duckdb/src/function/cast/union_casts.cpp +33 -7
- package/src/duckdb/src/function/cast_rules.cpp +9 -4
- package/src/duckdb/src/function/function_binder.cpp +1 -8
- package/src/duckdb/src/function/pragma/pragma_queries.cpp +24 -1
- package/src/duckdb/src/function/scalar/bit/bitstring.cpp +100 -0
- package/src/duckdb/src/function/scalar/date/current.cpp +0 -2
- package/src/duckdb/src/function/scalar/date/date_diff.cpp +0 -1
- package/src/duckdb/src/function/scalar/date/date_part.cpp +18 -26
- package/src/duckdb/src/function/scalar/date/date_sub.cpp +0 -1
- package/src/duckdb/src/function/scalar/date/date_trunc.cpp +10 -14
- package/src/duckdb/src/function/scalar/generic/stats.cpp +2 -4
- package/src/duckdb/src/function/scalar/list/contains_or_position.cpp +4 -146
- package/src/duckdb/src/function/scalar/list/flatten.cpp +5 -12
- package/src/duckdb/src/function/scalar/list/list_aggregates.cpp +1 -1
- package/src/duckdb/src/function/scalar/list/list_concat.cpp +8 -12
- package/src/duckdb/src/function/scalar/list/list_extract.cpp +5 -12
- package/src/duckdb/src/function/scalar/list/list_lambdas.cpp +7 -3
- package/src/duckdb/src/function/scalar/list/list_sort.cpp +25 -18
- package/src/duckdb/src/function/scalar/list/list_value.cpp +6 -10
- package/src/duckdb/src/function/scalar/map/map.cpp +47 -1
- package/src/duckdb/src/function/scalar/map/map_entries.cpp +61 -0
- package/src/duckdb/src/function/scalar/map/map_extract.cpp +68 -26
- package/src/duckdb/src/function/scalar/map/map_keys_values.cpp +97 -0
- package/src/duckdb/src/function/scalar/math/numeric.cpp +101 -17
- package/src/duckdb/src/function/scalar/math_functions.cpp +3 -0
- package/src/duckdb/src/function/scalar/nested_functions.cpp +3 -0
- package/src/duckdb/src/function/scalar/operators/add.cpp +0 -9
- package/src/duckdb/src/function/scalar/operators/arithmetic.cpp +29 -48
- package/src/duckdb/src/function/scalar/operators/bitwise.cpp +0 -63
- package/src/duckdb/src/function/scalar/operators/multiply.cpp +5 -6
- package/src/duckdb/src/function/scalar/operators/subtract.cpp +0 -6
- package/src/duckdb/src/function/scalar/string/caseconvert.cpp +2 -6
- package/src/duckdb/src/function/scalar/string/hex.cpp +201 -0
- package/src/duckdb/src/function/scalar/string/instr.cpp +2 -6
- package/src/duckdb/src/function/scalar/string/length.cpp +2 -6
- package/src/duckdb/src/function/scalar/string/like.cpp +2 -6
- package/src/duckdb/src/function/scalar/string/regexp/regexp_extract_all.cpp +243 -0
- package/src/duckdb/src/function/scalar/string/regexp/regexp_util.cpp +79 -0
- package/src/duckdb/src/function/scalar/string/regexp.cpp +21 -80
- package/src/duckdb/src/function/scalar/string/substring.cpp +2 -6
- package/src/duckdb/src/function/scalar/string_functions.cpp +2 -0
- package/src/duckdb/src/function/scalar/struct/struct_extract.cpp +5 -10
- package/src/duckdb/src/function/scalar/struct/struct_insert.cpp +11 -14
- package/src/duckdb/src/function/scalar/struct/struct_pack.cpp +6 -7
- package/src/duckdb/src/function/table/arrow.cpp +5 -2
- package/src/duckdb/src/function/table/arrow_conversion.cpp +25 -1
- package/src/duckdb/src/function/table/checkpoint.cpp +5 -1
- package/src/duckdb/src/function/table/read_csv.cpp +60 -0
- package/src/duckdb/src/function/table/system/duckdb_constraints.cpp +2 -2
- package/src/duckdb/src/function/table/system/test_all_types.cpp +2 -2
- package/src/duckdb/src/function/table/table_scan.cpp +9 -12
- package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
- package/src/duckdb/src/function/table_function.cpp +30 -11
- package/src/duckdb/src/include/duckdb/catalog/catalog.hpp +6 -0
- package/src/duckdb/src/include/duckdb/catalog/catalog_entry/duck_table_entry.hpp +1 -1
- package/src/duckdb/src/include/duckdb/catalog/catalog_entry/table_function_catalog_entry.hpp +6 -8
- package/src/duckdb/src/include/duckdb/catalog/dependency_list.hpp +3 -0
- package/src/duckdb/src/include/duckdb/catalog/duck_catalog.hpp +2 -1
- package/src/duckdb/src/include/duckdb/common/box_renderer.hpp +8 -2
- package/src/duckdb/src/include/duckdb/common/constants.hpp +0 -19
- package/src/duckdb/src/include/duckdb/common/enums/aggregate_handling.hpp +2 -0
- package/src/duckdb/src/include/duckdb/common/enums/expression_type.hpp +2 -3
- package/src/duckdb/src/include/duckdb/common/enums/joinref_type.hpp +7 -4
- package/src/duckdb/src/include/duckdb/common/enums/logical_operator_type.hpp +1 -0
- package/src/duckdb/src/include/duckdb/common/enums/order_type.hpp +2 -0
- package/src/duckdb/src/include/duckdb/common/enums/set_operation_type.hpp +2 -1
- package/src/duckdb/src/include/duckdb/common/enums/statement_type.hpp +2 -1
- package/src/duckdb/src/include/duckdb/common/enums/tableref_type.hpp +2 -1
- package/src/duckdb/src/include/duckdb/common/exception.hpp +69 -2
- package/src/duckdb/src/include/duckdb/common/field_writer.hpp +12 -4
- package/src/duckdb/src/include/duckdb/common/helper.hpp +1 -1
- package/src/duckdb/src/include/duckdb/common/{http_stats.hpp → http_state.hpp} +18 -4
- package/src/duckdb/src/include/duckdb/common/operator/comparison_operators.hpp +45 -149
- package/src/duckdb/src/include/duckdb/common/operator/multiply.hpp +2 -0
- package/src/duckdb/src/include/duckdb/common/optional_ptr.hpp +45 -0
- package/src/duckdb/src/include/duckdb/common/preserved_error.hpp +6 -1
- package/src/duckdb/src/include/duckdb/common/progress_bar/progress_bar.hpp +2 -0
- package/src/duckdb/src/include/duckdb/common/serializer/buffered_deserializer.hpp +4 -2
- package/src/duckdb/src/include/duckdb/common/serializer/buffered_file_reader.hpp +8 -2
- package/src/duckdb/src/include/duckdb/common/serializer/enum_serializer.hpp +113 -0
- package/src/duckdb/src/include/duckdb/common/serializer/format_deserializer.hpp +336 -0
- package/src/duckdb/src/include/duckdb/common/serializer/format_serializer.hpp +268 -0
- package/src/duckdb/src/include/duckdb/common/serializer/serialization_traits.hpp +126 -0
- package/src/duckdb/src/include/duckdb/common/serializer.hpp +13 -0
- package/src/duckdb/src/include/duckdb/common/string_util.hpp +27 -0
- package/src/duckdb/src/include/duckdb/common/types/bit.hpp +12 -7
- package/src/duckdb/src/include/duckdb/common/types/interval.hpp +39 -3
- package/src/duckdb/src/include/duckdb/common/types/list_segment.hpp +70 -0
- package/src/duckdb/src/include/duckdb/common/types/string_type.hpp +73 -3
- package/src/duckdb/src/include/duckdb/common/types/time.hpp +3 -0
- package/src/duckdb/src/include/duckdb/common/types/validity_mask.hpp +4 -1
- package/src/duckdb/src/include/duckdb/common/types/value.hpp +17 -48
- package/src/duckdb/src/include/duckdb/common/types/value_map.hpp +1 -1
- package/src/duckdb/src/include/duckdb/common/types/vector.hpp +3 -1
- package/src/duckdb/src/include/duckdb/common/types.hpp +45 -8
- package/src/duckdb/src/include/duckdb/common/vector_operations/unary_executor.hpp +2 -2
- package/src/duckdb/src/include/duckdb/execution/aggregate_hashtable.hpp +35 -20
- package/src/duckdb/src/include/duckdb/execution/index/art/art.hpp +3 -14
- package/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_perfecthash_aggregate.hpp +1 -1
- package/src/duckdb/src/include/duckdb/execution/operator/join/physical_cross_product.hpp +2 -0
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_file_handle.hpp +1 -0
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_reader_options.hpp +10 -0
- package/src/duckdb/src/include/duckdb/execution/operator/projection/physical_projection.hpp +5 -0
- package/src/duckdb/src/include/duckdb/execution/partitionable_hashtable.hpp +5 -1
- package/src/duckdb/src/include/duckdb/execution/physical_plan_generator.hpp +1 -3
- package/src/duckdb/src/include/duckdb/execution/window_segment_tree.hpp +54 -0
- package/src/duckdb/src/include/duckdb/function/aggregate/distributive_functions.hpp +5 -0
- package/src/duckdb/src/include/duckdb/function/aggregate_function.hpp +18 -6
- package/src/duckdb/src/include/duckdb/function/cast/bound_cast_data.hpp +84 -0
- package/src/duckdb/src/include/duckdb/function/cast/cast_function_set.hpp +2 -2
- package/src/duckdb/src/include/duckdb/function/cast/default_casts.hpp +28 -64
- package/src/duckdb/src/include/duckdb/function/function_binder.hpp +3 -6
- package/src/duckdb/src/include/duckdb/function/scalar/bit_functions.hpp +4 -0
- package/src/duckdb/src/include/duckdb/function/scalar/list/contains_or_position.hpp +138 -0
- package/src/duckdb/src/include/duckdb/function/scalar/math_functions.hpp +8 -0
- package/src/duckdb/src/include/duckdb/function/scalar/nested_functions.hpp +59 -0
- package/src/duckdb/src/include/duckdb/function/scalar/regexp.hpp +81 -1
- package/src/duckdb/src/include/duckdb/function/scalar/string_functions.hpp +4 -0
- package/src/duckdb/src/include/duckdb/function/scalar_function.hpp +2 -2
- package/src/duckdb/src/include/duckdb/function/table/arrow.hpp +12 -1
- package/src/duckdb/src/include/duckdb/function/table_function.hpp +10 -0
- package/src/duckdb/src/include/duckdb/main/capi/capi_internal.hpp +2 -0
- package/src/duckdb/src/include/duckdb/main/client_config.hpp +2 -0
- package/src/duckdb/src/include/duckdb/main/client_data.hpp +3 -3
- package/src/duckdb/src/include/duckdb/main/config.hpp +3 -0
- package/src/duckdb/src/include/duckdb/main/connection_manager.hpp +2 -0
- package/src/duckdb/src/include/duckdb/main/database.hpp +1 -0
- package/src/duckdb/src/include/duckdb/main/extension_entries.hpp +2 -0
- package/src/duckdb/src/include/duckdb/main/prepared_statement.hpp +2 -0
- package/src/duckdb/src/include/duckdb/main/relation/explain_relation.hpp +2 -1
- package/src/duckdb/src/include/duckdb/main/relation.hpp +2 -1
- package/src/duckdb/src/include/duckdb/optimizer/filter_pushdown.hpp +2 -0
- package/src/duckdb/src/include/duckdb/optimizer/join_order/cardinality_estimator.hpp +2 -2
- package/src/duckdb/src/include/duckdb/optimizer/rule/list.hpp +1 -0
- package/src/duckdb/src/include/duckdb/optimizer/rule/ordered_aggregate_optimizer.hpp +24 -0
- package/src/duckdb/src/include/duckdb/parser/common_table_expression_info.hpp +4 -0
- package/src/duckdb/src/include/duckdb/parser/expression/between_expression.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/expression/bound_expression.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/expression/case_expression.hpp +5 -0
- package/src/duckdb/src/include/duckdb/parser/expression/cast_expression.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/expression/collate_expression.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/expression/columnref_expression.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/expression/comparison_expression.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/expression/conjunction_expression.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/expression/constant_expression.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/expression/default_expression.hpp +1 -0
- package/src/duckdb/src/include/duckdb/parser/expression/function_expression.hpp +4 -2
- package/src/duckdb/src/include/duckdb/parser/expression/lambda_expression.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/expression/operator_expression.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/expression/parameter_expression.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/expression/positional_reference_expression.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/expression/star_expression.hpp +4 -2
- package/src/duckdb/src/include/duckdb/parser/expression/subquery_expression.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/expression/window_expression.hpp +5 -0
- package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_info.hpp +5 -1
- package/src/duckdb/src/include/duckdb/parser/parsed_data/{alter_function_info.hpp → alter_scalar_function_info.hpp} +13 -13
- package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_function_info.hpp +47 -0
- package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_info.hpp +6 -0
- package/src/duckdb/src/include/duckdb/parser/parsed_data/create_table_function_info.hpp +2 -1
- package/src/duckdb/src/include/duckdb/parser/parsed_data/sample_options.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/parsed_expression.hpp +5 -0
- package/src/duckdb/src/include/duckdb/parser/query_node/recursive_cte_node.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/query_node/select_node.hpp +5 -0
- package/src/duckdb/src/include/duckdb/parser/query_node/set_operation_node.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/query_node.hpp +13 -2
- package/src/duckdb/src/include/duckdb/parser/result_modifier.hpp +24 -1
- package/src/duckdb/src/include/duckdb/parser/sql_statement.hpp +2 -1
- package/src/duckdb/src/include/duckdb/parser/statement/multi_statement.hpp +28 -0
- package/src/duckdb/src/include/duckdb/parser/statement/select_statement.hpp +6 -1
- package/src/duckdb/src/include/duckdb/parser/tableref/basetableref.hpp +4 -0
- package/src/duckdb/src/include/duckdb/parser/tableref/emptytableref.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/tableref/expressionlistref.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/tableref/joinref.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/tableref/list.hpp +1 -0
- package/src/duckdb/src/include/duckdb/parser/tableref/pivotref.hpp +87 -0
- package/src/duckdb/src/include/duckdb/parser/tableref/subqueryref.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/tableref/table_function_ref.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/tableref.hpp +3 -1
- package/src/duckdb/src/include/duckdb/parser/tokens.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/transformer.hpp +33 -0
- package/src/duckdb/src/include/duckdb/planner/bind_context.hpp +2 -0
- package/src/duckdb/src/include/duckdb/planner/binder.hpp +15 -4
- package/src/duckdb/src/include/duckdb/planner/bound_result_modifier.hpp +3 -0
- package/src/duckdb/src/include/duckdb/planner/expression/bound_aggregate_expression.hpp +3 -0
- package/src/duckdb/src/include/duckdb/planner/expression_binder/base_select_binder.hpp +64 -0
- package/src/duckdb/src/include/duckdb/planner/expression_binder/having_binder.hpp +2 -2
- package/src/duckdb/src/include/duckdb/planner/expression_binder/order_binder.hpp +4 -1
- package/src/duckdb/src/include/duckdb/planner/expression_binder/qualify_binder.hpp +2 -2
- package/src/duckdb/src/include/duckdb/planner/expression_binder/select_binder.hpp +9 -38
- package/src/duckdb/src/include/duckdb/planner/expression_binder.hpp +1 -1
- package/src/duckdb/src/include/duckdb/planner/logical_tokens.hpp +1 -0
- package/src/duckdb/src/include/duckdb/planner/operator/list.hpp +1 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_asof_join.hpp +22 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_comparison_join.hpp +5 -2
- package/src/duckdb/src/include/duckdb/planner/operator/logical_distinct.hpp +3 -0
- package/src/duckdb/src/include/duckdb/planner/query_node/bound_select_node.hpp +8 -2
- package/src/duckdb/src/include/duckdb/storage/buffer/block_handle.hpp +2 -0
- package/src/duckdb/src/include/duckdb/storage/buffer_manager.hpp +76 -44
- package/src/duckdb/src/include/duckdb/storage/checkpoint/table_data_writer.hpp +3 -2
- package/src/duckdb/src/include/duckdb/storage/checkpoint_manager.hpp +1 -1
- package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_compress.hpp +2 -2
- package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_fetch.hpp +1 -1
- package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_scan.hpp +2 -1
- package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_compress.hpp +2 -2
- package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_fetch.hpp +1 -1
- package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_scan.hpp +2 -1
- package/src/duckdb/src/include/duckdb/storage/data_pointer.hpp +4 -3
- package/src/duckdb/src/include/duckdb/storage/data_table.hpp +4 -3
- package/src/duckdb/src/include/duckdb/storage/index.hpp +5 -4
- package/src/duckdb/src/include/duckdb/storage/meta_block_reader.hpp +7 -0
- package/src/duckdb/src/include/duckdb/storage/statistics/base_statistics.hpp +93 -29
- package/src/duckdb/src/include/duckdb/storage/statistics/column_statistics.hpp +22 -3
- package/src/duckdb/src/include/duckdb/storage/statistics/distinct_statistics.hpp +8 -6
- package/src/duckdb/src/include/duckdb/storage/statistics/list_stats.hpp +41 -0
- package/src/duckdb/src/include/duckdb/storage/statistics/node_statistics.hpp +26 -0
- package/src/duckdb/src/include/duckdb/storage/statistics/numeric_stats.hpp +114 -0
- package/src/duckdb/src/include/duckdb/storage/statistics/numeric_stats_union.hpp +62 -0
- package/src/duckdb/src/include/duckdb/storage/statistics/segment_statistics.hpp +2 -7
- package/src/duckdb/src/include/duckdb/storage/statistics/string_stats.hpp +74 -0
- package/src/duckdb/src/include/duckdb/storage/statistics/struct_stats.hpp +42 -0
- package/src/duckdb/src/include/duckdb/storage/string_uncompressed.hpp +2 -3
- package/src/duckdb/src/include/duckdb/storage/table/column_checkpoint_state.hpp +2 -1
- package/src/duckdb/src/include/duckdb/storage/table/column_data.hpp +21 -7
- package/src/duckdb/src/include/duckdb/storage/table/column_data_checkpointer.hpp +3 -2
- package/src/duckdb/src/include/duckdb/storage/table/column_segment.hpp +5 -6
- package/src/duckdb/src/include/duckdb/storage/table/column_segment_tree.hpp +18 -0
- package/src/duckdb/src/include/duckdb/storage/table/list_column_data.hpp +1 -1
- package/src/duckdb/src/include/duckdb/storage/table/persistent_table_data.hpp +6 -3
- package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +41 -45
- package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +23 -7
- package/src/duckdb/src/include/duckdb/storage/table/row_group_segment_tree.hpp +35 -0
- package/src/duckdb/src/include/duckdb/storage/table/scan_state.hpp +21 -29
- package/src/duckdb/src/include/duckdb/storage/table/segment_base.hpp +6 -6
- package/src/duckdb/src/include/duckdb/storage/table/segment_tree.hpp +281 -26
- package/src/duckdb/src/include/duckdb/storage/table/standard_column_data.hpp +0 -4
- package/src/duckdb/src/include/duckdb/storage/table/table_statistics.hpp +5 -0
- package/src/duckdb/src/include/duckdb/storage/table/update_segment.hpp +0 -1
- package/src/duckdb/src/include/duckdb/storage/write_ahead_log.hpp +1 -1
- package/src/duckdb/src/include/duckdb/transaction/local_storage.hpp +6 -3
- package/src/duckdb/src/include/duckdb.h +71 -2
- package/src/duckdb/src/include/duckdb.hpp +0 -1
- package/src/duckdb/src/main/capi/pending-c.cpp +16 -3
- package/src/duckdb/src/main/capi/result-c.cpp +27 -1
- package/src/duckdb/src/main/capi/stream-c.cpp +25 -0
- package/src/duckdb/src/main/capi/table_function-c.cpp +23 -0
- package/src/duckdb/src/main/client_context.cpp +38 -34
- package/src/duckdb/src/main/client_data.cpp +7 -6
- package/src/duckdb/src/main/config.cpp +70 -1
- package/src/duckdb/src/main/database.cpp +19 -2
- package/src/duckdb/src/main/extension/extension_install.cpp +7 -2
- package/src/duckdb/src/main/prepared_statement.cpp +4 -0
- package/src/duckdb/src/main/query_profiler.cpp +17 -15
- package/src/duckdb/src/main/relation/explain_relation.cpp +3 -3
- package/src/duckdb/src/main/relation.cpp +3 -2
- package/src/duckdb/src/main/settings/settings.cpp +20 -8
- package/src/duckdb/src/optimizer/column_lifetime_analyzer.cpp +1 -0
- package/src/duckdb/src/optimizer/deliminator.cpp +1 -1
- package/src/duckdb/src/optimizer/filter_combiner.cpp +3 -6
- package/src/duckdb/src/optimizer/filter_pullup.cpp +3 -1
- package/src/duckdb/src/optimizer/filter_pushdown.cpp +14 -8
- package/src/duckdb/src/optimizer/join_order/cardinality_estimator.cpp +107 -71
- package/src/duckdb/src/optimizer/join_order/join_order_optimizer.cpp +32 -12
- package/src/duckdb/src/optimizer/optimizer.cpp +1 -0
- package/src/duckdb/src/optimizer/pullup/pullup_from_left.cpp +2 -2
- package/src/duckdb/src/optimizer/pushdown/pushdown_aggregate.cpp +33 -5
- package/src/duckdb/src/optimizer/pushdown/pushdown_cross_product.cpp +1 -1
- package/src/duckdb/src/optimizer/pushdown/pushdown_inner_join.cpp +3 -0
- package/src/duckdb/src/optimizer/pushdown/pushdown_left_join.cpp +5 -12
- package/src/duckdb/src/optimizer/pushdown/pushdown_mark_join.cpp +2 -2
- package/src/duckdb/src/optimizer/pushdown/pushdown_single_join.cpp +1 -1
- package/src/duckdb/src/optimizer/remove_unused_columns.cpp +1 -0
- package/src/duckdb/src/optimizer/rule/move_constants.cpp +10 -4
- package/src/duckdb/src/optimizer/rule/ordered_aggregate_optimizer.cpp +30 -0
- package/src/duckdb/src/optimizer/rule/regex_optimizations.cpp +9 -2
- package/src/duckdb/src/optimizer/statistics/expression/propagate_aggregate.cpp +9 -3
- package/src/duckdb/src/optimizer/statistics/expression/propagate_and_compress.cpp +6 -7
- package/src/duckdb/src/optimizer/statistics/expression/propagate_cast.cpp +14 -11
- package/src/duckdb/src/optimizer/statistics/expression/propagate_columnref.cpp +1 -1
- package/src/duckdb/src/optimizer/statistics/expression/propagate_comparison.cpp +13 -15
- package/src/duckdb/src/optimizer/statistics/expression/propagate_conjunction.cpp +0 -1
- package/src/duckdb/src/optimizer/statistics/expression/propagate_constant.cpp +3 -75
- package/src/duckdb/src/optimizer/statistics/expression/propagate_function.cpp +7 -2
- package/src/duckdb/src/optimizer/statistics/expression/propagate_operator.cpp +10 -0
- package/src/duckdb/src/optimizer/statistics/operator/propagate_aggregate.cpp +2 -3
- package/src/duckdb/src/optimizer/statistics/operator/propagate_filter.cpp +29 -32
- package/src/duckdb/src/optimizer/statistics/operator/propagate_join.cpp +5 -5
- package/src/duckdb/src/optimizer/statistics/operator/propagate_set_operation.cpp +3 -3
- package/src/duckdb/src/optimizer/statistics_propagator.cpp +2 -1
- package/src/duckdb/src/optimizer/unnest_rewriter.cpp +2 -2
- package/src/duckdb/src/parallel/meta_pipeline.cpp +0 -7
- package/src/duckdb/src/parser/common_table_expression_info.cpp +19 -0
- package/src/duckdb/src/parser/expression/between_expression.cpp +17 -0
- package/src/duckdb/src/parser/expression/case_expression.cpp +28 -0
- package/src/duckdb/src/parser/expression/cast_expression.cpp +17 -0
- package/src/duckdb/src/parser/expression/collate_expression.cpp +16 -0
- package/src/duckdb/src/parser/expression/columnref_expression.cpp +15 -0
- package/src/duckdb/src/parser/expression/comparison_expression.cpp +16 -0
- package/src/duckdb/src/parser/expression/conjunction_expression.cpp +17 -0
- package/src/duckdb/src/parser/expression/constant_expression.cpp +14 -0
- package/src/duckdb/src/parser/expression/default_expression.cpp +7 -0
- package/src/duckdb/src/parser/expression/function_expression.cpp +35 -0
- package/src/duckdb/src/parser/expression/lambda_expression.cpp +16 -0
- package/src/duckdb/src/parser/expression/operator_expression.cpp +15 -0
- package/src/duckdb/src/parser/expression/parameter_expression.cpp +15 -0
- package/src/duckdb/src/parser/expression/positional_reference_expression.cpp +14 -0
- package/src/duckdb/src/parser/expression/star_expression.cpp +26 -6
- package/src/duckdb/src/parser/expression/subquery_expression.cpp +20 -0
- package/src/duckdb/src/parser/expression/window_expression.cpp +43 -0
- package/src/duckdb/src/parser/parsed_data/alter_info.cpp +7 -3
- package/src/duckdb/src/parser/parsed_data/alter_scalar_function_info.cpp +56 -0
- package/src/duckdb/src/parser/parsed_data/alter_table_function_info.cpp +51 -0
- package/src/duckdb/src/parser/parsed_data/create_scalar_function_info.cpp +3 -2
- package/src/duckdb/src/parser/parsed_data/create_table_function_info.cpp +6 -0
- package/src/duckdb/src/parser/parsed_data/sample_options.cpp +22 -10
- package/src/duckdb/src/parser/parsed_expression.cpp +72 -0
- package/src/duckdb/src/parser/parsed_expression_iterator.cpp +15 -1
- package/src/duckdb/src/parser/query_node/recursive_cte_node.cpp +21 -0
- package/src/duckdb/src/parser/query_node/select_node.cpp +31 -0
- package/src/duckdb/src/parser/query_node/set_operation_node.cpp +17 -0
- package/src/duckdb/src/parser/query_node.cpp +51 -1
- package/src/duckdb/src/parser/result_modifier.cpp +78 -0
- package/src/duckdb/src/parser/statement/multi_statement.cpp +18 -0
- package/src/duckdb/src/parser/statement/select_statement.cpp +12 -0
- package/src/duckdb/src/parser/tableref/basetableref.cpp +21 -0
- package/src/duckdb/src/parser/tableref/emptytableref.cpp +4 -0
- package/src/duckdb/src/parser/tableref/expressionlistref.cpp +17 -0
- package/src/duckdb/src/parser/tableref/joinref.cpp +29 -0
- package/src/duckdb/src/parser/tableref/pivotref.cpp +373 -0
- package/src/duckdb/src/parser/tableref/subqueryref.cpp +15 -0
- package/src/duckdb/src/parser/tableref/table_function.cpp +17 -0
- package/src/duckdb/src/parser/tableref.cpp +49 -0
- package/src/duckdb/src/parser/transform/expression/transform_array_access.cpp +11 -0
- package/src/duckdb/src/parser/transform/expression/transform_bool_expr.cpp +1 -1
- package/src/duckdb/src/parser/transform/expression/transform_columnref.cpp +17 -2
- package/src/duckdb/src/parser/transform/expression/transform_function.cpp +85 -42
- package/src/duckdb/src/parser/transform/expression/transform_operator.cpp +1 -1
- package/src/duckdb/src/parser/transform/expression/transform_subquery.cpp +1 -1
- package/src/duckdb/src/parser/transform/helpers/transform_alias.cpp +12 -6
- package/src/duckdb/src/parser/transform/helpers/transform_cte.cpp +24 -0
- package/src/duckdb/src/parser/transform/helpers/transform_groupby.cpp +7 -0
- package/src/duckdb/src/parser/transform/helpers/transform_orderby.cpp +0 -7
- package/src/duckdb/src/parser/transform/helpers/transform_typename.cpp +3 -2
- package/src/duckdb/src/parser/transform/statement/transform_create_function.cpp +4 -0
- package/src/duckdb/src/parser/transform/statement/transform_create_view.cpp +4 -0
- package/src/duckdb/src/parser/transform/statement/transform_pivot_stmt.cpp +179 -0
- package/src/duckdb/src/parser/transform/statement/transform_rename.cpp +3 -4
- package/src/duckdb/src/parser/transform/statement/transform_select.cpp +8 -0
- package/src/duckdb/src/parser/transform/statement/transform_select_node.cpp +2 -3
- package/src/duckdb/src/parser/transform/tableref/transform_join.cpp +12 -1
- package/src/duckdb/src/parser/transform/tableref/transform_pivot.cpp +121 -0
- package/src/duckdb/src/parser/transform/tableref/transform_tableref.cpp +2 -0
- package/src/duckdb/src/parser/transformer.cpp +15 -3
- package/src/duckdb/src/planner/bind_context.cpp +18 -25
- package/src/duckdb/src/planner/binder/expression/bind_aggregate_expression.cpp +9 -7
- package/src/duckdb/src/planner/binder/expression/bind_columnref_expression.cpp +4 -3
- package/src/duckdb/src/planner/binder/expression/bind_function_expression.cpp +23 -12
- package/src/duckdb/src/planner/binder/expression/bind_lambda.cpp +3 -2
- package/src/duckdb/src/planner/binder/expression/bind_star_expression.cpp +176 -0
- package/src/duckdb/src/planner/binder/expression/bind_subquery_expression.cpp +4 -0
- package/src/duckdb/src/planner/binder/expression/bind_unnest_expression.cpp +163 -24
- package/src/duckdb/src/planner/binder/expression/bind_window_expression.cpp +2 -2
- package/src/duckdb/src/planner/binder/query_node/bind_select_node.cpp +109 -94
- package/src/duckdb/src/planner/binder/query_node/plan_query_node.cpp +11 -0
- package/src/duckdb/src/planner/binder/query_node/plan_select_node.cpp +9 -4
- package/src/duckdb/src/planner/binder/statement/bind_copy.cpp +5 -3
- package/src/duckdb/src/planner/binder/statement/bind_create.cpp +3 -2
- package/src/duckdb/src/planner/binder/statement/bind_create_table.cpp +10 -1
- package/src/duckdb/src/planner/binder/statement/bind_delete.cpp +1 -1
- package/src/duckdb/src/planner/binder/statement/bind_insert.cpp +12 -8
- package/src/duckdb/src/planner/binder/statement/bind_logical_plan.cpp +17 -0
- package/src/duckdb/src/planner/binder/statement/bind_update.cpp +4 -2
- package/src/duckdb/src/planner/binder/tableref/bind_joinref.cpp +19 -3
- package/src/duckdb/src/planner/binder/tableref/bind_pivot.cpp +366 -0
- package/src/duckdb/src/planner/binder/tableref/bind_table_function.cpp +11 -1
- package/src/duckdb/src/planner/binder/tableref/plan_cteref.cpp +1 -0
- package/src/duckdb/src/planner/binder/tableref/plan_joinref.cpp +61 -13
- package/src/duckdb/src/planner/binder.cpp +19 -24
- package/src/duckdb/src/planner/bound_result_modifier.cpp +27 -1
- package/src/duckdb/src/planner/expression/bound_aggregate_expression.cpp +9 -2
- package/src/duckdb/src/planner/expression/bound_expression.cpp +4 -0
- package/src/duckdb/src/planner/expression/bound_window_expression.cpp +1 -1
- package/src/duckdb/src/planner/expression_binder/base_select_binder.cpp +146 -0
- package/src/duckdb/src/planner/expression_binder/having_binder.cpp +6 -3
- package/src/duckdb/src/planner/expression_binder/qualify_binder.cpp +3 -3
- package/src/duckdb/src/planner/expression_binder/select_binder.cpp +1 -132
- package/src/duckdb/src/planner/expression_binder.cpp +10 -3
- package/src/duckdb/src/planner/expression_iterator.cpp +17 -10
- package/src/duckdb/src/planner/filter/constant_filter.cpp +4 -6
- package/src/duckdb/src/planner/logical_operator.cpp +7 -2
- package/src/duckdb/src/planner/logical_operator_visitor.cpp +6 -0
- package/src/duckdb/src/planner/operator/logical_asof_join.cpp +8 -0
- package/src/duckdb/src/planner/operator/logical_distinct.cpp +3 -0
- package/src/duckdb/src/planner/planner.cpp +2 -1
- package/src/duckdb/src/planner/pragma_handler.cpp +10 -2
- package/src/duckdb/src/planner/subquery/flatten_dependent_join.cpp +3 -1
- package/src/duckdb/src/storage/buffer_manager.cpp +44 -46
- package/src/duckdb/src/storage/checkpoint/row_group_writer.cpp +1 -1
- package/src/duckdb/src/storage/checkpoint/table_data_reader.cpp +4 -15
- package/src/duckdb/src/storage/checkpoint/table_data_writer.cpp +10 -4
- package/src/duckdb/src/storage/checkpoint_manager.cpp +9 -3
- package/src/duckdb/src/storage/compression/bitpacking.cpp +29 -25
- package/src/duckdb/src/storage/compression/fixed_size_uncompressed.cpp +45 -46
- package/src/duckdb/src/storage/compression/numeric_constant.cpp +10 -11
- package/src/duckdb/src/storage/compression/patas.cpp +1 -1
- package/src/duckdb/src/storage/compression/rle.cpp +20 -15
- package/src/duckdb/src/storage/compression/validity_uncompressed.cpp +6 -6
- package/src/duckdb/src/storage/data_table.cpp +23 -23
- package/src/duckdb/src/storage/index.cpp +12 -1
- package/src/duckdb/src/storage/local_storage.cpp +27 -23
- package/src/duckdb/src/storage/meta_block_reader.cpp +22 -0
- package/src/duckdb/src/storage/statistics/base_statistics.cpp +373 -128
- package/src/duckdb/src/storage/statistics/column_statistics.cpp +57 -3
- package/src/duckdb/src/storage/statistics/distinct_statistics.cpp +8 -9
- package/src/duckdb/src/storage/statistics/list_stats.cpp +121 -0
- package/src/duckdb/src/storage/statistics/numeric_stats.cpp +591 -0
- package/src/duckdb/src/storage/statistics/numeric_stats_union.cpp +65 -0
- package/src/duckdb/src/storage/statistics/segment_statistics.cpp +2 -11
- package/src/duckdb/src/storage/statistics/string_stats.cpp +273 -0
- package/src/duckdb/src/storage/statistics/struct_stats.cpp +133 -0
- package/src/duckdb/src/storage/storage_info.cpp +2 -2
- package/src/duckdb/src/storage/table/column_checkpoint_state.cpp +4 -10
- package/src/duckdb/src/storage/table/column_data.cpp +118 -62
- package/src/duckdb/src/storage/table/column_data_checkpointer.cpp +10 -9
- package/src/duckdb/src/storage/table/column_segment.cpp +30 -45
- package/src/duckdb/src/storage/table/list_column_data.cpp +50 -71
- package/src/duckdb/src/storage/table/persistent_table_data.cpp +2 -1
- package/src/duckdb/src/storage/table/row_group.cpp +213 -143
- package/src/duckdb/src/storage/table/row_group_collection.cpp +151 -105
- package/src/duckdb/src/storage/table/scan_state.cpp +45 -33
- package/src/duckdb/src/storage/table/standard_column_data.cpp +11 -12
- package/src/duckdb/src/storage/table/struct_column_data.cpp +27 -34
- package/src/duckdb/src/storage/table/table_statistics.cpp +27 -7
- package/src/duckdb/src/storage/table/update_segment.cpp +23 -18
- package/src/duckdb/src/storage/wal_replay.cpp +8 -5
- package/src/duckdb/src/storage/write_ahead_log.cpp +2 -2
- package/src/duckdb/src/transaction/commit_state.cpp +11 -7
- package/src/duckdb/src/verification/deserialized_statement_verifier.cpp +0 -1
- package/src/duckdb/third_party/libpg_query/include/nodes/nodes.hpp +35 -0
- package/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp +36 -2
- package/src/duckdb/third_party/libpg_query/include/nodes/primnodes.hpp +3 -3
- package/src/duckdb/third_party/libpg_query/include/parser/gram.hpp +1022 -530
- package/src/duckdb/third_party/libpg_query/include/parser/kwlist.hpp +8 -0
- package/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +24462 -22828
- package/src/duckdb/third_party/re2/re2/re2.cc +9 -0
- package/src/duckdb/third_party/re2/re2/re2.h +2 -0
- package/src/duckdb/ub_extension_icu_third_party_icu_i18n.cpp +4 -4
- package/src/duckdb/ub_extension_json_json_functions.cpp +2 -0
- package/src/duckdb/ub_src_common_serializer.cpp +2 -0
- package/src/duckdb/ub_src_common_types.cpp +2 -0
- package/src/duckdb/ub_src_execution_physical_plan.cpp +2 -0
- package/src/duckdb/ub_src_function_aggregate_distributive.cpp +2 -0
- package/src/duckdb/ub_src_function_scalar_bit.cpp +2 -0
- package/src/duckdb/ub_src_function_scalar_map.cpp +4 -0
- package/src/duckdb/ub_src_function_scalar_string.cpp +2 -0
- package/src/duckdb/ub_src_function_scalar_string_regexp.cpp +4 -0
- package/src/duckdb/ub_src_main_capi.cpp +2 -0
- package/src/duckdb/ub_src_optimizer_rule.cpp +2 -0
- package/src/duckdb/ub_src_parser.cpp +2 -0
- package/src/duckdb/ub_src_parser_parsed_data.cpp +4 -2
- package/src/duckdb/ub_src_parser_statement.cpp +2 -0
- package/src/duckdb/ub_src_parser_tableref.cpp +2 -0
- package/src/duckdb/ub_src_parser_transform_statement.cpp +2 -0
- package/src/duckdb/ub_src_parser_transform_tableref.cpp +2 -0
- package/src/duckdb/ub_src_planner_binder_expression.cpp +2 -0
- package/src/duckdb/ub_src_planner_binder_tableref.cpp +2 -0
- package/src/duckdb/ub_src_planner_expression_binder.cpp +2 -0
- package/src/duckdb/ub_src_planner_operator.cpp +2 -0
- package/src/duckdb/ub_src_storage_statistics.cpp +6 -6
- package/src/duckdb/ub_src_storage_table.cpp +0 -2
- package/src/duckdb_node.hpp +2 -1
- package/src/statement.cpp +5 -5
- package/src/utils.cpp +27 -2
- package/test/extension.test.ts +44 -26
- package/test/syntax_error.test.ts +3 -1
- package/filelist.cache +0 -0
- package/src/duckdb/src/include/duckdb/main/loadable_extension.hpp +0 -59
- package/src/duckdb/src/include/duckdb/storage/statistics/list_statistics.hpp +0 -36
- package/src/duckdb/src/include/duckdb/storage/statistics/numeric_statistics.hpp +0 -75
- package/src/duckdb/src/include/duckdb/storage/statistics/string_statistics.hpp +0 -49
- package/src/duckdb/src/include/duckdb/storage/statistics/struct_statistics.hpp +0 -36
- package/src/duckdb/src/include/duckdb/storage/statistics/validity_statistics.hpp +0 -45
- package/src/duckdb/src/parser/parsed_data/alter_function_info.cpp +0 -55
- package/src/duckdb/src/storage/statistics/list_statistics.cpp +0 -94
- package/src/duckdb/src/storage/statistics/numeric_statistics.cpp +0 -307
- package/src/duckdb/src/storage/statistics/string_statistics.cpp +0 -220
- package/src/duckdb/src/storage/statistics/struct_statistics.cpp +0 -108
- package/src/duckdb/src/storage/statistics/validity_statistics.cpp +0 -91
- package/src/duckdb/src/storage/table/segment_tree.cpp +0 -179
|
@@ -23,6 +23,7 @@ unique_ptr<LogicalOperator> FilterPushdown::Rewrite(unique_ptr<LogicalOperator>
|
|
|
23
23
|
return PushdownCrossProduct(std::move(op));
|
|
24
24
|
case LogicalOperatorType::LOGICAL_COMPARISON_JOIN:
|
|
25
25
|
case LogicalOperatorType::LOGICAL_ANY_JOIN:
|
|
26
|
+
case LogicalOperatorType::LOGICAL_ASOF_JOIN:
|
|
26
27
|
case LogicalOperatorType::LOGICAL_DELIM_JOIN:
|
|
27
28
|
return PushdownJoin(std::move(op));
|
|
28
29
|
case LogicalOperatorType::LOGICAL_PROJECTION:
|
|
@@ -48,7 +49,8 @@ unique_ptr<LogicalOperator> FilterPushdown::Rewrite(unique_ptr<LogicalOperator>
|
|
|
48
49
|
|
|
49
50
|
unique_ptr<LogicalOperator> FilterPushdown::PushdownJoin(unique_ptr<LogicalOperator> op) {
|
|
50
51
|
D_ASSERT(op->type == LogicalOperatorType::LOGICAL_COMPARISON_JOIN ||
|
|
51
|
-
op->type == LogicalOperatorType::
|
|
52
|
+
op->type == LogicalOperatorType::LOGICAL_ASOF_JOIN || op->type == LogicalOperatorType::LOGICAL_ANY_JOIN ||
|
|
53
|
+
op->type == LogicalOperatorType::LOGICAL_DELIM_JOIN);
|
|
52
54
|
auto &join = (LogicalJoin &)*op;
|
|
53
55
|
unordered_set<idx_t> left_bindings, right_bindings;
|
|
54
56
|
LogicalJoin::GetTableReferences(*op->children[0], left_bindings);
|
|
@@ -105,13 +107,7 @@ void FilterPushdown::GenerateFilters() {
|
|
|
105
107
|
});
|
|
106
108
|
}
|
|
107
109
|
|
|
108
|
-
unique_ptr<LogicalOperator> FilterPushdown::
|
|
109
|
-
// unhandled type, first perform filter pushdown in its children
|
|
110
|
-
for (auto &child : op->children) {
|
|
111
|
-
FilterPushdown pushdown(optimizer);
|
|
112
|
-
child = pushdown.Rewrite(std::move(child));
|
|
113
|
-
}
|
|
114
|
-
// now push any existing filters
|
|
110
|
+
unique_ptr<LogicalOperator> FilterPushdown::PushFinalFilters(unique_ptr<LogicalOperator> op) {
|
|
115
111
|
if (filters.empty()) {
|
|
116
112
|
// no filters to push
|
|
117
113
|
return op;
|
|
@@ -124,6 +120,16 @@ unique_ptr<LogicalOperator> FilterPushdown::FinishPushdown(unique_ptr<LogicalOpe
|
|
|
124
120
|
return std::move(filter);
|
|
125
121
|
}
|
|
126
122
|
|
|
123
|
+
unique_ptr<LogicalOperator> FilterPushdown::FinishPushdown(unique_ptr<LogicalOperator> op) {
|
|
124
|
+
// unhandled type, first perform filter pushdown in its children
|
|
125
|
+
for (auto &child : op->children) {
|
|
126
|
+
FilterPushdown pushdown(optimizer);
|
|
127
|
+
child = pushdown.Rewrite(std::move(child));
|
|
128
|
+
}
|
|
129
|
+
// now push any existing filters
|
|
130
|
+
return PushFinalFilters(std::move(op));
|
|
131
|
+
}
|
|
132
|
+
|
|
127
133
|
void FilterPushdown::Filter::ExtractBindings() {
|
|
128
134
|
bindings.clear();
|
|
129
135
|
LogicalJoin::GetExpressionBindings(*filter, bindings);
|
|
@@ -6,24 +6,20 @@
|
|
|
6
6
|
#include "duckdb/planner/operator/logical_comparison_join.hpp"
|
|
7
7
|
#include "duckdb/planner/operator/logical_get.hpp"
|
|
8
8
|
#include "duckdb/storage/data_table.hpp"
|
|
9
|
-
#include "duckdb/storage/statistics/numeric_statistics.hpp"
|
|
10
9
|
#include "duckdb/catalog/catalog_entry/table_catalog_entry.hpp"
|
|
11
10
|
|
|
11
|
+
#include <cmath>
|
|
12
|
+
|
|
12
13
|
namespace duckdb {
|
|
13
14
|
|
|
14
15
|
static TableCatalogEntry *GetCatalogTableEntry(LogicalOperator *op) {
|
|
15
|
-
if (op
|
|
16
|
-
|
|
17
|
-
TableCatalogEntry *entry = get->GetTable();
|
|
18
|
-
return entry;
|
|
19
|
-
}
|
|
20
|
-
for (auto &child : op->children) {
|
|
21
|
-
TableCatalogEntry *entry = GetCatalogTableEntry(child.get());
|
|
22
|
-
if (entry != nullptr) {
|
|
23
|
-
return entry;
|
|
24
|
-
}
|
|
16
|
+
if (!op) {
|
|
17
|
+
return nullptr;
|
|
25
18
|
}
|
|
26
|
-
|
|
19
|
+
D_ASSERT(op->type == LogicalOperatorType::LOGICAL_GET);
|
|
20
|
+
auto get = (LogicalGet *)op;
|
|
21
|
+
TableCatalogEntry *entry = get->GetTable();
|
|
22
|
+
return entry;
|
|
27
23
|
}
|
|
28
24
|
|
|
29
25
|
// The filter was made on top of a logical sample or other projection,
|
|
@@ -45,8 +41,7 @@ void CardinalityEstimator::AddRelationTdom(FilterInfo *filter_info) {
|
|
|
45
41
|
}
|
|
46
42
|
}
|
|
47
43
|
auto key = ColumnBinding(filter_info->left_binding.table_index, filter_info->left_binding.column_index);
|
|
48
|
-
column_binding_set_t
|
|
49
|
-
relations_to_tdoms.emplace_back(RelationsToTDom(tmp));
|
|
44
|
+
relations_to_tdoms.emplace_back(column_binding_set_t({key}));
|
|
50
45
|
}
|
|
51
46
|
|
|
52
47
|
bool CardinalityEstimator::SingleColumnFilter(FilterInfo *filter_info) {
|
|
@@ -99,7 +94,7 @@ void CardinalityEstimator::AddToEquivalenceSets(FilterInfo *filter_info, vector<
|
|
|
99
94
|
column_binding_set_t tmp;
|
|
100
95
|
tmp.insert(filter_info->left_binding);
|
|
101
96
|
tmp.insert(filter_info->right_binding);
|
|
102
|
-
relations_to_tdoms.emplace_back(
|
|
97
|
+
relations_to_tdoms.emplace_back(tmp);
|
|
103
98
|
relations_to_tdoms.back().filters.push_back(filter_info);
|
|
104
99
|
}
|
|
105
100
|
}
|
|
@@ -265,7 +260,7 @@ double CardinalityEstimator::EstimateCardinalityWithSet(JoinRelationSet *new_set
|
|
|
265
260
|
// connection to any subgraph in subgraphs. Add a new subgraph, and maybe later there will be
|
|
266
261
|
// a connection.
|
|
267
262
|
if (!found_match) {
|
|
268
|
-
subgraphs.emplace_back(
|
|
263
|
+
subgraphs.emplace_back();
|
|
269
264
|
auto subgraph = &subgraphs.back();
|
|
270
265
|
subgraph->relations.insert(filter->left_binding.table_index);
|
|
271
266
|
subgraph->relations.insert(filter->right_binding.table_index);
|
|
@@ -304,23 +299,37 @@ static bool IsLogicalFilter(LogicalOperator *op) {
|
|
|
304
299
|
return op->type == LogicalOperatorType::LOGICAL_FILTER;
|
|
305
300
|
}
|
|
306
301
|
|
|
307
|
-
static LogicalGet *GetLogicalGet(LogicalOperator *op) {
|
|
302
|
+
static LogicalGet *GetLogicalGet(LogicalOperator *op, idx_t table_index = DConstants::INVALID_INDEX) {
|
|
308
303
|
LogicalGet *get = nullptr;
|
|
309
304
|
switch (op->type) {
|
|
310
305
|
case LogicalOperatorType::LOGICAL_GET:
|
|
311
306
|
get = (LogicalGet *)op;
|
|
312
307
|
break;
|
|
313
308
|
case LogicalOperatorType::LOGICAL_FILTER:
|
|
314
|
-
get = GetLogicalGet(op->children.at(0).get());
|
|
309
|
+
get = GetLogicalGet(op->children.at(0).get(), table_index);
|
|
315
310
|
break;
|
|
316
311
|
case LogicalOperatorType::LOGICAL_PROJECTION:
|
|
317
|
-
get = GetLogicalGet(op->children.at(0).get());
|
|
312
|
+
get = GetLogicalGet(op->children.at(0).get(), table_index);
|
|
318
313
|
break;
|
|
314
|
+
case LogicalOperatorType::LOGICAL_ASOF_JOIN:
|
|
319
315
|
case LogicalOperatorType::LOGICAL_COMPARISON_JOIN: {
|
|
320
316
|
LogicalComparisonJoin *join = (LogicalComparisonJoin *)op;
|
|
317
|
+
// We should never be calling GetLogicalGet without a valid table_index.
|
|
318
|
+
// We are attempting to get the catalog table for a relation (for statistics/cardinality estimation)
|
|
319
|
+
// A logical join means there is a non-reorderable relation in the join plan. This means we need
|
|
320
|
+
// to know the exact table index to return.
|
|
321
|
+
D_ASSERT(table_index != DConstants::INVALID_INDEX);
|
|
321
322
|
if (join->join_type == JoinType::MARK || join->join_type == JoinType::LEFT) {
|
|
322
323
|
auto child = join->children.at(0).get();
|
|
323
|
-
get = GetLogicalGet(child);
|
|
324
|
+
get = GetLogicalGet(child, table_index);
|
|
325
|
+
if (get && get->table_index == table_index) {
|
|
326
|
+
return get;
|
|
327
|
+
}
|
|
328
|
+
child = join->children.at(1).get();
|
|
329
|
+
get = GetLogicalGet(child, table_index);
|
|
330
|
+
if (get && get->table_index == table_index) {
|
|
331
|
+
return get;
|
|
332
|
+
}
|
|
324
333
|
}
|
|
325
334
|
break;
|
|
326
335
|
}
|
|
@@ -370,16 +379,20 @@ void CardinalityEstimator::InitCardinalityEstimatorProps(vector<NodeOp> *node_op
|
|
|
370
379
|
if (op->type == LogicalOperatorType::LOGICAL_COMPARISON_JOIN) {
|
|
371
380
|
auto &join = (LogicalComparisonJoin &)*op;
|
|
372
381
|
if (join.join_type == JoinType::LEFT) {
|
|
373
|
-
//
|
|
374
|
-
//
|
|
375
|
-
//
|
|
376
|
-
//
|
|
377
|
-
//
|
|
382
|
+
// If a base op is a Logical Comparison join it is probably a left join,
|
|
383
|
+
// so the cost of the larger table is a fine estimate.
|
|
384
|
+
// TODO: provide better estimates for cost of mark joins
|
|
385
|
+
// MARK joins are used for anti and semi joins, so the cost can conceivably be
|
|
386
|
+
// less than the base table cardinality.
|
|
378
387
|
join_node->SetCost(join_node->GetBaseTableCardinality());
|
|
379
388
|
}
|
|
389
|
+
} else if (op->type == LogicalOperatorType::LOGICAL_ASOF_JOIN) {
|
|
390
|
+
// AsOf joins have the cardinality of the LHS
|
|
391
|
+
join_node->SetCost(join_node->GetBaseTableCardinality());
|
|
380
392
|
}
|
|
381
|
-
// update cardinality
|
|
393
|
+
// Total domains can be affected by filters. So we update base table cardinality first
|
|
382
394
|
EstimateBaseTableCardinality(join_node, op);
|
|
395
|
+
// Then update total domains.
|
|
383
396
|
UpdateTotalDomains(join_node, op);
|
|
384
397
|
}
|
|
385
398
|
|
|
@@ -390,74 +403,84 @@ void CardinalityEstimator::InitCardinalityEstimatorProps(vector<NodeOp> *node_op
|
|
|
390
403
|
void CardinalityEstimator::UpdateTotalDomains(JoinNode *node, LogicalOperator *op) {
|
|
391
404
|
auto relation_id = node->set->relations[0];
|
|
392
405
|
relation_attributes[relation_id].cardinality = node->GetCardinality<double>();
|
|
406
|
+
//! Initialize the distinct count for all columns used in joins with the current relation.
|
|
407
|
+
idx_t distinct_count = node->GetBaseTableCardinality();
|
|
393
408
|
TableCatalogEntry *catalog_table = nullptr;
|
|
394
|
-
auto get = GetLogicalGet(op);
|
|
395
|
-
if (get) {
|
|
396
|
-
catalog_table = GetCatalogTableEntry(get);
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
//! Initialize the tdoms for all columns the relation uses in join conditions.
|
|
400
|
-
unordered_set<idx_t>::iterator ite;
|
|
401
|
-
idx_t count = node->GetBaseTableCardinality();
|
|
402
409
|
|
|
403
410
|
bool direct_filter = false;
|
|
411
|
+
LogicalGet *get = nullptr;
|
|
412
|
+
bool get_updated = true;
|
|
404
413
|
for (auto &column : relation_attributes[relation_id].columns) {
|
|
405
|
-
//! for every column in the relation, get the count via
|
|
414
|
+
//! for every column used in a filter in the relation, get the distinct count via HLL, or assume it to be
|
|
406
415
|
//! the cardinality
|
|
407
416
|
ColumnBinding key = ColumnBinding(relation_id, column);
|
|
417
|
+
auto actual_binding = relation_column_to_original_column.find(key);
|
|
418
|
+
// each relation has columns that are either projected or used as filters
|
|
419
|
+
// In order to get column statistics we need to make sure the actual binding still
|
|
420
|
+
// refers to the same base table relation, as non-reorderable joins may involve 2+
|
|
421
|
+
// base table relations and therefore the columns may also refer to 2 different
|
|
422
|
+
// base table relations
|
|
423
|
+
if (actual_binding != relation_column_to_original_column.end() &&
|
|
424
|
+
(!get || get->table_index != actual_binding->second.table_index)) {
|
|
425
|
+
get = GetLogicalGet(op, actual_binding->second.table_index);
|
|
426
|
+
get_updated = true;
|
|
427
|
+
} else {
|
|
428
|
+
get_updated = false;
|
|
429
|
+
}
|
|
408
430
|
|
|
409
|
-
if (
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
auto actual_binding = relation_column_to_original_column[key];
|
|
431
|
+
if (get_updated) {
|
|
432
|
+
catalog_table = GetCatalogTableEntry(get);
|
|
433
|
+
}
|
|
413
434
|
|
|
414
|
-
|
|
435
|
+
if (catalog_table && actual_binding != relation_column_to_original_column.end()) {
|
|
436
|
+
// Get HLL stats here
|
|
437
|
+
auto base_stats = catalog_table->GetStatistics(context, actual_binding->second.column_index);
|
|
415
438
|
if (base_stats) {
|
|
416
|
-
|
|
439
|
+
distinct_count = base_stats->GetDistinctCount();
|
|
417
440
|
}
|
|
418
441
|
|
|
419
|
-
// means you have a direct filter on a column. The
|
|
442
|
+
// means you have a direct filter on a column. The distinct_count/total domain for the column
|
|
420
443
|
// should be decreased to match the predicted total domain matching the filter.
|
|
421
444
|
// We decrease the total domain for all columns in the equivalence set because filter pushdown
|
|
422
445
|
// will mean all columns are affected.
|
|
423
446
|
if (direct_filter) {
|
|
424
|
-
|
|
447
|
+
distinct_count = node->GetCardinality<idx_t>();
|
|
425
448
|
}
|
|
426
449
|
|
|
427
|
-
// HLL has estimation error,
|
|
428
|
-
if (
|
|
429
|
-
|
|
450
|
+
// HLL has estimation error, distinct_count can't be greater than cardinality of the table before filters
|
|
451
|
+
if (distinct_count > node->GetBaseTableCardinality()) {
|
|
452
|
+
distinct_count = node->GetBaseTableCardinality();
|
|
430
453
|
}
|
|
431
454
|
} else {
|
|
432
|
-
// No HLL. So if we know there is a direct filter, reduce count to cardinality
|
|
433
|
-
//
|
|
455
|
+
// No HLL. So if we know there is a direct filter, reduce the distinct count to the cardinality
|
|
456
|
+
// with filter effects. Otherwise assume the distinct count is still the cardinality
|
|
434
457
|
if (direct_filter) {
|
|
435
|
-
|
|
458
|
+
distinct_count = node->GetCardinality<idx_t>();
|
|
436
459
|
} else {
|
|
437
|
-
|
|
460
|
+
distinct_count = node->GetBaseTableCardinality();
|
|
438
461
|
}
|
|
439
462
|
}
|
|
440
|
-
|
|
463
|
+
// Update the relation_to_tdom set with the estimated distinct count (or tdom) calculated above
|
|
441
464
|
for (auto &relation_to_tdom : relations_to_tdoms) {
|
|
442
465
|
column_binding_set_t i_set = relation_to_tdom.equivalent_relations;
|
|
443
466
|
if (i_set.count(key) != 1) {
|
|
444
467
|
continue;
|
|
445
468
|
}
|
|
446
469
|
if (catalog_table) {
|
|
447
|
-
if (relation_to_tdom.tdom_hll <
|
|
448
|
-
relation_to_tdom.tdom_hll =
|
|
470
|
+
if (relation_to_tdom.tdom_hll < distinct_count) {
|
|
471
|
+
relation_to_tdom.tdom_hll = distinct_count;
|
|
449
472
|
relation_to_tdom.has_tdom_hll = true;
|
|
450
473
|
}
|
|
451
|
-
if (relation_to_tdom.tdom_no_hll >
|
|
452
|
-
relation_to_tdom.tdom_no_hll =
|
|
474
|
+
if (relation_to_tdom.tdom_no_hll > distinct_count) {
|
|
475
|
+
relation_to_tdom.tdom_no_hll = distinct_count;
|
|
453
476
|
}
|
|
454
477
|
} else {
|
|
455
478
|
// Here we don't have catalog statistics, and the following is how we determine
|
|
456
479
|
// the tdom
|
|
457
480
|
// 1. If there is any hll data in the equivalence set, use that
|
|
458
481
|
// 2. Otherwise, use the table with the smallest cardinality
|
|
459
|
-
if (relation_to_tdom.tdom_no_hll >
|
|
460
|
-
relation_to_tdom.tdom_no_hll =
|
|
482
|
+
if (relation_to_tdom.tdom_no_hll > distinct_count && !relation_to_tdom.has_tdom_hll) {
|
|
483
|
+
relation_to_tdom.tdom_no_hll = distinct_count;
|
|
461
484
|
}
|
|
462
485
|
}
|
|
463
486
|
break;
|
|
@@ -465,9 +488,8 @@ void CardinalityEstimator::UpdateTotalDomains(JoinNode *node, LogicalOperator *o
|
|
|
465
488
|
}
|
|
466
489
|
}
|
|
467
490
|
|
|
468
|
-
TableFilterSet *CardinalityEstimator::GetTableFilters(LogicalOperator *op) {
|
|
469
|
-
|
|
470
|
-
auto get = GetLogicalGet(op);
|
|
491
|
+
TableFilterSet *CardinalityEstimator::GetTableFilters(LogicalOperator *op, idx_t table_index) {
|
|
492
|
+
auto get = GetLogicalGet(op, table_index);
|
|
471
493
|
return get ? &get->table_filters : nullptr;
|
|
472
494
|
}
|
|
473
495
|
|
|
@@ -529,9 +551,10 @@ idx_t CardinalityEstimator::InspectConjunctionOR(idx_t cardinality, idx_t column
|
|
|
529
551
|
return cardinality_after_filters;
|
|
530
552
|
}
|
|
531
553
|
|
|
532
|
-
idx_t CardinalityEstimator::InspectTableFilters(idx_t cardinality, LogicalOperator *op, TableFilterSet *table_filters
|
|
554
|
+
idx_t CardinalityEstimator::InspectTableFilters(idx_t cardinality, LogicalOperator *op, TableFilterSet *table_filters,
|
|
555
|
+
idx_t table_index) {
|
|
533
556
|
idx_t cardinality_after_filters = cardinality;
|
|
534
|
-
auto get = GetLogicalGet(op);
|
|
557
|
+
auto get = GetLogicalGet(op, table_index);
|
|
535
558
|
unique_ptr<BaseStatistics> column_statistics;
|
|
536
559
|
for (auto &it : table_filters->filters) {
|
|
537
560
|
column_statistics = nullptr;
|
|
@@ -562,17 +585,30 @@ idx_t CardinalityEstimator::InspectTableFilters(idx_t cardinality, LogicalOperat
|
|
|
562
585
|
|
|
563
586
|
void CardinalityEstimator::EstimateBaseTableCardinality(JoinNode *node, LogicalOperator *op) {
|
|
564
587
|
auto has_logical_filter = IsLogicalFilter(op);
|
|
565
|
-
|
|
588
|
+
D_ASSERT(node->set->count == 1);
|
|
589
|
+
auto relation_id = node->set->relations[0];
|
|
566
590
|
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
591
|
+
double lowest_card_found = NumericLimits<double>::Maximum();
|
|
592
|
+
for (auto &column : relation_attributes[relation_id].columns) {
|
|
593
|
+
auto card_after_filters = node->GetBaseTableCardinality();
|
|
594
|
+
ColumnBinding key = ColumnBinding(relation_id, column);
|
|
595
|
+
TableFilterSet *table_filters = nullptr;
|
|
596
|
+
auto actual_binding = relation_column_to_original_column.find(key);
|
|
597
|
+
if (actual_binding != relation_column_to_original_column.end()) {
|
|
598
|
+
table_filters = GetTableFilters(op, actual_binding->second.table_index);
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
if (table_filters) {
|
|
602
|
+
double inspect_result =
|
|
603
|
+
(double)InspectTableFilters(card_after_filters, op, table_filters, actual_binding->second.table_index);
|
|
604
|
+
card_after_filters = MinValue(inspect_result, (double)card_after_filters);
|
|
605
|
+
}
|
|
606
|
+
if (has_logical_filter) {
|
|
607
|
+
card_after_filters *= DEFAULT_SELECTIVITY;
|
|
608
|
+
}
|
|
609
|
+
lowest_card_found = MinValue(card_after_filters, lowest_card_found);
|
|
574
610
|
}
|
|
575
|
-
node->SetEstimatedCardinality(
|
|
611
|
+
node->SetEstimatedCardinality(lowest_card_found);
|
|
576
612
|
}
|
|
577
613
|
|
|
578
614
|
} // namespace duckdb
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
#include "duckdb/planner/operator/list.hpp"
|
|
8
8
|
|
|
9
9
|
#include <algorithm>
|
|
10
|
+
#include <cmath>
|
|
10
11
|
|
|
11
12
|
namespace std {
|
|
12
13
|
|
|
@@ -113,7 +114,7 @@ bool JoinOrderOptimizer::ExtractJoinRelations(LogicalOperator &input_op, vector<
|
|
|
113
114
|
bool non_reorderable_operation = false;
|
|
114
115
|
if (op->type == LogicalOperatorType::LOGICAL_UNION || op->type == LogicalOperatorType::LOGICAL_EXCEPT ||
|
|
115
116
|
op->type == LogicalOperatorType::LOGICAL_INTERSECT || op->type == LogicalOperatorType::LOGICAL_DELIM_JOIN ||
|
|
116
|
-
op->type == LogicalOperatorType::LOGICAL_ANY_JOIN) {
|
|
117
|
+
op->type == LogicalOperatorType::LOGICAL_ANY_JOIN || op->type == LogicalOperatorType::LOGICAL_ASOF_JOIN) {
|
|
117
118
|
// set operation, optimize separately in children
|
|
118
119
|
non_reorderable_operation = true;
|
|
119
120
|
}
|
|
@@ -138,7 +139,7 @@ bool JoinOrderOptimizer::ExtractJoinRelations(LogicalOperator &input_op, vector<
|
|
|
138
139
|
std::swap(join.children[0], join.children[1]);
|
|
139
140
|
for (auto &cond : join.conditions) {
|
|
140
141
|
std::swap(cond.left, cond.right);
|
|
141
|
-
cond.comparison =
|
|
142
|
+
cond.comparison = FlipComparisonExpression(cond.comparison);
|
|
142
143
|
}
|
|
143
144
|
}
|
|
144
145
|
}
|
|
@@ -152,11 +153,11 @@ bool JoinOrderOptimizer::ExtractJoinRelations(LogicalOperator &input_op, vector<
|
|
|
152
153
|
// new NULL values in the right side, so pushing this condition through the join leads to incorrect results
|
|
153
154
|
// for this reason, we just start a new JoinOptimizer pass in each of the children of the join
|
|
154
155
|
|
|
155
|
-
// Keep track of all
|
|
156
|
+
// Keep track of all filter bindings the new join order optimizer makes
|
|
156
157
|
vector<column_binding_map_t<ColumnBinding>> child_binding_maps;
|
|
157
158
|
idx_t child_bindings_it = 0;
|
|
158
159
|
for (auto &child : op->children) {
|
|
159
|
-
child_binding_maps.emplace_back(
|
|
160
|
+
child_binding_maps.emplace_back();
|
|
160
161
|
JoinOrderOptimizer optimizer(context);
|
|
161
162
|
child = optimizer.Optimize(std::move(child));
|
|
162
163
|
// save the relation bindings from the optimized child. These later all get added to the
|
|
@@ -184,6 +185,7 @@ bool JoinOrderOptimizer::ExtractJoinRelations(LogicalOperator &input_op, vector<
|
|
|
184
185
|
}
|
|
185
186
|
|
|
186
187
|
switch (op->type) {
|
|
188
|
+
case LogicalOperatorType::LOGICAL_ASOF_JOIN:
|
|
187
189
|
case LogicalOperatorType::LOGICAL_COMPARISON_JOIN:
|
|
188
190
|
case LogicalOperatorType::LOGICAL_CROSS_PRODUCT: {
|
|
189
191
|
// inner join or cross product
|
|
@@ -222,12 +224,25 @@ bool JoinOrderOptimizer::ExtractJoinRelations(LogicalOperator &input_op, vector<
|
|
|
222
224
|
}
|
|
223
225
|
case LogicalOperatorType::LOGICAL_PROJECTION: {
|
|
224
226
|
auto proj = (LogicalProjection *)op;
|
|
225
|
-
// we run the join order optimizer
|
|
227
|
+
// we run the join order optimizer within the subquery as well
|
|
226
228
|
JoinOrderOptimizer optimizer(context);
|
|
227
229
|
op->children[0] = optimizer.Optimize(std::move(op->children[0]));
|
|
228
230
|
// projection, add to the set of relations
|
|
229
231
|
auto relation = make_unique<SingleJoinRelation>(&input_op, parent);
|
|
230
|
-
|
|
232
|
+
auto relation_id = relations.size();
|
|
233
|
+
// push one child column binding map back.
|
|
234
|
+
vector<column_binding_map_t<ColumnBinding>> child_binding_maps;
|
|
235
|
+
child_binding_maps.emplace_back();
|
|
236
|
+
optimizer.cardinality_estimator.CopyRelationMap(child_binding_maps.at(0));
|
|
237
|
+
// This logical projection may sit on top of a logical comparison join that has been pushed down
|
|
238
|
+
// we want to copy the binding info of both tables
|
|
239
|
+
relation_mapping[proj->table_index] = relation_id;
|
|
240
|
+
for (auto &binding_info : child_binding_maps.at(0)) {
|
|
241
|
+
cardinality_estimator.AddRelationToColumnMapping(
|
|
242
|
+
ColumnBinding(proj->table_index, binding_info.first.column_index), binding_info.second);
|
|
243
|
+
cardinality_estimator.AddColumnToRelationMap(binding_info.second.table_index,
|
|
244
|
+
binding_info.second.column_index);
|
|
245
|
+
}
|
|
231
246
|
relations.push_back(std::move(relation));
|
|
232
247
|
return true;
|
|
233
248
|
}
|
|
@@ -756,7 +771,7 @@ JoinOrderOptimizer::GenerateJoins(vector<unique_ptr<LogicalOperator>> &extracted
|
|
|
756
771
|
|
|
757
772
|
if (invert) {
|
|
758
773
|
// reverse comparison expression if we reverse the order of the children
|
|
759
|
-
cond.comparison =
|
|
774
|
+
cond.comparison = FlipComparisonExpression(cond.comparison);
|
|
760
775
|
}
|
|
761
776
|
join->conditions.push_back(std::move(cond));
|
|
762
777
|
}
|
|
@@ -833,7 +848,7 @@ JoinOrderOptimizer::GenerateJoins(vector<unique_ptr<LogicalOperator>> &extracted
|
|
|
833
848
|
cond.comparison = comparison.type;
|
|
834
849
|
if (invert) {
|
|
835
850
|
// reverse comparison expression if we reverse the order of the children
|
|
836
|
-
cond.comparison =
|
|
851
|
+
cond.comparison = FlipComparisonExpression(comparison.type);
|
|
837
852
|
}
|
|
838
853
|
// now find the join to push it into
|
|
839
854
|
auto node = result_operator.get();
|
|
@@ -853,7 +868,8 @@ JoinOrderOptimizer::GenerateJoins(vector<unique_ptr<LogicalOperator>> &extracted
|
|
|
853
868
|
result_operator->children[0] = std::move(comp_join);
|
|
854
869
|
}
|
|
855
870
|
} else {
|
|
856
|
-
D_ASSERT(node->type == LogicalOperatorType::LOGICAL_COMPARISON_JOIN
|
|
871
|
+
D_ASSERT(node->type == LogicalOperatorType::LOGICAL_COMPARISON_JOIN ||
|
|
872
|
+
node->type == LogicalOperatorType::LOGICAL_ASOF_JOIN);
|
|
857
873
|
auto &comp_join = (LogicalComparisonJoin &)*node;
|
|
858
874
|
comp_join.conditions.push_back(std::move(cond));
|
|
859
875
|
}
|
|
@@ -869,9 +885,11 @@ unique_ptr<LogicalOperator> JoinOrderOptimizer::RewritePlan(unique_ptr<LogicalOp
|
|
|
869
885
|
|
|
870
886
|
// first we will extract all relations from the main plan
|
|
871
887
|
vector<unique_ptr<LogicalOperator>> extracted_relations;
|
|
888
|
+
extracted_relations.reserve(relations.size());
|
|
872
889
|
for (auto &relation : relations) {
|
|
873
890
|
extracted_relations.push_back(ExtractJoinRelation(*relation));
|
|
874
891
|
}
|
|
892
|
+
|
|
875
893
|
// now we generate the actual joins
|
|
876
894
|
auto join_tree = GenerateJoins(extracted_relations, node);
|
|
877
895
|
// perform the final pushdown of remaining filters
|
|
@@ -893,7 +911,8 @@ unique_ptr<LogicalOperator> JoinOrderOptimizer::RewritePlan(unique_ptr<LogicalOp
|
|
|
893
911
|
auto op = plan.get();
|
|
894
912
|
auto parent = plan.get();
|
|
895
913
|
while (op->type != LogicalOperatorType::LOGICAL_CROSS_PRODUCT &&
|
|
896
|
-
op->type != LogicalOperatorType::LOGICAL_COMPARISON_JOIN
|
|
914
|
+
op->type != LogicalOperatorType::LOGICAL_COMPARISON_JOIN &&
|
|
915
|
+
op->type != LogicalOperatorType::LOGICAL_ASOF_JOIN) {
|
|
897
916
|
D_ASSERT(op->children.size() == 1);
|
|
898
917
|
parent = op;
|
|
899
918
|
op = op->children[0].get();
|
|
@@ -928,7 +947,8 @@ unique_ptr<LogicalOperator> JoinOrderOptimizer::Optimize(unique_ptr<LogicalOpera
|
|
|
928
947
|
// filters in the process
|
|
929
948
|
expression_set_t filter_set;
|
|
930
949
|
for (auto &f_op : filter_operators) {
|
|
931
|
-
if (f_op->type == LogicalOperatorType::LOGICAL_COMPARISON_JOIN
|
|
950
|
+
if (f_op->type == LogicalOperatorType::LOGICAL_COMPARISON_JOIN ||
|
|
951
|
+
f_op->type == LogicalOperatorType::LOGICAL_ASOF_JOIN) {
|
|
932
952
|
auto &join = (LogicalComparisonJoin &)*f_op;
|
|
933
953
|
D_ASSERT(join.join_type == JoinType::INNER);
|
|
934
954
|
D_ASSERT(join.expressions.empty());
|
|
@@ -999,7 +1019,7 @@ unique_ptr<LogicalOperator> JoinOrderOptimizer::Optimize(unique_ptr<LogicalOpera
|
|
|
999
1019
|
for (idx_t i = 0; i < relations.size(); i++) {
|
|
1000
1020
|
auto &rel = *relations[i];
|
|
1001
1021
|
auto node = set_manager.GetJoinRelation(i);
|
|
1002
|
-
nodes_ops.emplace_back(
|
|
1022
|
+
nodes_ops.emplace_back(make_unique<JoinNode>(node, 0), rel.op);
|
|
1003
1023
|
}
|
|
1004
1024
|
|
|
1005
1025
|
cardinality_estimator.InitCardinalityEstimatorProps(&nodes_ops, &filter_infos);
|
|
@@ -39,6 +39,7 @@ Optimizer::Optimizer(Binder &binder, ClientContext &context) : context(context),
|
|
|
39
39
|
rewriter.rules.push_back(make_unique<EqualOrNullSimplification>(rewriter));
|
|
40
40
|
rewriter.rules.push_back(make_unique<MoveConstantsRule>(rewriter));
|
|
41
41
|
rewriter.rules.push_back(make_unique<LikeOptimizationRule>(rewriter));
|
|
42
|
+
rewriter.rules.push_back(make_unique<OrderedAggregateOptimizer>(rewriter));
|
|
42
43
|
rewriter.rules.push_back(make_unique<RegexOptimizationRule>(rewriter));
|
|
43
44
|
rewriter.rules.push_back(make_unique<EmptyNeedleRemovalRule>(rewriter));
|
|
44
45
|
rewriter.rules.push_back(make_unique<EnumComparisonRule>(rewriter));
|
|
@@ -6,8 +6,8 @@ namespace duckdb {
|
|
|
6
6
|
|
|
7
7
|
unique_ptr<LogicalOperator> FilterPullup::PullupFromLeft(unique_ptr<LogicalOperator> op) {
|
|
8
8
|
D_ASSERT(op->type == LogicalOperatorType::LOGICAL_COMPARISON_JOIN ||
|
|
9
|
-
op->type == LogicalOperatorType::
|
|
10
|
-
op->type == LogicalOperatorType::LOGICAL_DELIM_JOIN);
|
|
9
|
+
op->type == LogicalOperatorType::LOGICAL_ASOF_JOIN || op->type == LogicalOperatorType::LOGICAL_ANY_JOIN ||
|
|
10
|
+
op->type == LogicalOperatorType::LOGICAL_EXCEPT || op->type == LogicalOperatorType::LOGICAL_DELIM_JOIN);
|
|
11
11
|
|
|
12
12
|
FilterPullup left_pullup(true, can_add_column);
|
|
13
13
|
FilterPullup right_pullup(false, can_add_column);
|
|
@@ -9,6 +9,14 @@ namespace duckdb {
|
|
|
9
9
|
|
|
10
10
|
using Filter = FilterPushdown::Filter;
|
|
11
11
|
|
|
12
|
+
static void ExtractFilterBindings(Expression &expr, vector<ColumnBinding> &bindings) {
|
|
13
|
+
if (expr.type == ExpressionType::BOUND_COLUMN_REF) {
|
|
14
|
+
auto &colref = (BoundColumnRefExpression &)expr;
|
|
15
|
+
bindings.push_back(colref.binding);
|
|
16
|
+
}
|
|
17
|
+
ExpressionIterator::EnumerateChildren(expr, [&](Expression &child) { ExtractFilterBindings(child, bindings); });
|
|
18
|
+
}
|
|
19
|
+
|
|
12
20
|
static unique_ptr<Expression> ReplaceGroupBindings(LogicalAggregate &proj, unique_ptr<Expression> expr) {
|
|
13
21
|
if (expr->type == ExpressionType::BOUND_COLUMN_REF) {
|
|
14
22
|
auto &colref = (BoundColumnRefExpression &)*expr;
|
|
@@ -40,14 +48,34 @@ unique_ptr<LogicalOperator> FilterPushdown::PushdownAggregate(unique_ptr<Logical
|
|
|
40
48
|
// filter on GROUPINGS function: cannot pushdown
|
|
41
49
|
continue;
|
|
42
50
|
}
|
|
43
|
-
//
|
|
44
|
-
|
|
51
|
+
// no aggregate! we are filtering on a group
|
|
52
|
+
// we can only push this down if the filter is in all grouping sets
|
|
53
|
+
vector<ColumnBinding> bindings;
|
|
54
|
+
ExtractFilterBindings(*f.filter, bindings);
|
|
55
|
+
|
|
56
|
+
bool can_pushdown_filter = true;
|
|
57
|
+
if (aggr.grouping_sets.empty()) {
|
|
58
|
+
// empty grouping set - we cannot pushdown the filter
|
|
59
|
+
can_pushdown_filter = false;
|
|
60
|
+
}
|
|
45
61
|
for (auto &grp : aggr.grouping_sets) {
|
|
46
|
-
if
|
|
47
|
-
|
|
62
|
+
// check for each of the grouping sets if they contain all groups
|
|
63
|
+
if (bindings.empty()) {
|
|
64
|
+
// we can never push down empty grouping sets
|
|
65
|
+
can_pushdown_filter = false;
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
for (auto &binding : bindings) {
|
|
69
|
+
if (grp.find(binding.column_index) == grp.end()) {
|
|
70
|
+
can_pushdown_filter = false;
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (!can_pushdown_filter) {
|
|
75
|
+
break;
|
|
48
76
|
}
|
|
49
77
|
}
|
|
50
|
-
if (
|
|
78
|
+
if (!can_pushdown_filter) {
|
|
51
79
|
continue;
|
|
52
80
|
}
|
|
53
81
|
// no aggregate! we can push this down
|
|
@@ -46,7 +46,7 @@ unique_ptr<LogicalOperator> FilterPushdown::PushdownCrossProduct(unique_ptr<Logi
|
|
|
46
46
|
right_bindings, join_expressions, conditions,
|
|
47
47
|
arbitrary_expressions);
|
|
48
48
|
// create the join from the join conditions
|
|
49
|
-
return LogicalComparisonJoin::CreateJoin(JoinType::INNER, std::move(op->children[0]),
|
|
49
|
+
return LogicalComparisonJoin::CreateJoin(JoinType::INNER, JoinRefType::REGULAR, std::move(op->children[0]),
|
|
50
50
|
std::move(op->children[1]), std::move(conditions),
|
|
51
51
|
std::move(arbitrary_expressions));
|
|
52
52
|
} else {
|
|
@@ -24,6 +24,9 @@ unique_ptr<LogicalOperator> FilterPushdown::PushdownInnerJoin(unique_ptr<Logical
|
|
|
24
24
|
// filter statically evaluates to false, strip tree
|
|
25
25
|
return make_unique<LogicalEmptyResult>(std::move(op));
|
|
26
26
|
}
|
|
27
|
+
} else if (op->type == LogicalOperatorType::LOGICAL_ASOF_JOIN) {
|
|
28
|
+
// Don't mess with non-standard condition interpretations
|
|
29
|
+
return FinishPushdown(std::move(op));
|
|
27
30
|
} else {
|
|
28
31
|
// comparison join
|
|
29
32
|
D_ASSERT(op->type == LogicalOperatorType::LOGICAL_COMPARISON_JOIN);
|
|
@@ -68,7 +68,9 @@ unique_ptr<LogicalOperator> FilterPushdown::PushdownLeftJoin(unique_ptr<LogicalO
|
|
|
68
68
|
// for a comparison join we create a FilterCombiner that checks if we can push conditions on LHS join conditions
|
|
69
69
|
// into the RHS of the join
|
|
70
70
|
FilterCombiner filter_combiner(optimizer);
|
|
71
|
-
|
|
71
|
+
const auto isComparison = (op->type == LogicalOperatorType::LOGICAL_COMPARISON_JOIN ||
|
|
72
|
+
op->type == LogicalOperatorType::LOGICAL_ASOF_JOIN);
|
|
73
|
+
if (isComparison) {
|
|
72
74
|
// add all comparison conditions
|
|
73
75
|
auto &comparison_join = (LogicalComparisonJoin &)*op;
|
|
74
76
|
for (auto &cond : comparison_join.conditions) {
|
|
@@ -82,7 +84,7 @@ unique_ptr<LogicalOperator> FilterPushdown::PushdownLeftJoin(unique_ptr<LogicalO
|
|
|
82
84
|
if (side == JoinSide::LEFT) {
|
|
83
85
|
// bindings match left side
|
|
84
86
|
// we can push the filter into the left side
|
|
85
|
-
if (
|
|
87
|
+
if (isComparison) {
|
|
86
88
|
// we MIGHT be able to push it down the RHS as well, but only if it is a comparison that matches the
|
|
87
89
|
// join predicates we use the FilterCombiner to figure this out add the expression to the FilterCombiner
|
|
88
90
|
filter_combiner.AddFilter(filters[i]->filter->Copy());
|
|
@@ -122,16 +124,7 @@ unique_ptr<LogicalOperator> FilterPushdown::PushdownLeftJoin(unique_ptr<LogicalO
|
|
|
122
124
|
right_pushdown.GenerateFilters();
|
|
123
125
|
op->children[0] = left_pushdown.Rewrite(std::move(op->children[0]));
|
|
124
126
|
op->children[1] = right_pushdown.Rewrite(std::move(op->children[1]));
|
|
125
|
-
|
|
126
|
-
// no filters to push
|
|
127
|
-
return op;
|
|
128
|
-
}
|
|
129
|
-
auto filter = make_unique<LogicalFilter>();
|
|
130
|
-
for (auto &f : filters) {
|
|
131
|
-
filter->expressions.push_back(std::move(f->filter));
|
|
132
|
-
}
|
|
133
|
-
filter->children.push_back(std::move(op));
|
|
134
|
-
return std::move(filter);
|
|
127
|
+
return PushFinalFilters(std::move(op));
|
|
135
128
|
}
|
|
136
129
|
|
|
137
130
|
} // namespace duckdb
|
|
@@ -13,7 +13,7 @@ unique_ptr<LogicalOperator> FilterPushdown::PushdownMarkJoin(unique_ptr<LogicalO
|
|
|
13
13
|
auto &comp_join = (LogicalComparisonJoin &)*op;
|
|
14
14
|
D_ASSERT(join.join_type == JoinType::MARK);
|
|
15
15
|
D_ASSERT(op->type == LogicalOperatorType::LOGICAL_COMPARISON_JOIN ||
|
|
16
|
-
op->type == LogicalOperatorType::LOGICAL_DELIM_JOIN);
|
|
16
|
+
op->type == LogicalOperatorType::LOGICAL_DELIM_JOIN || op->type == LogicalOperatorType::LOGICAL_ASOF_JOIN);
|
|
17
17
|
|
|
18
18
|
right_bindings.insert(comp_join.mark_index);
|
|
19
19
|
FilterPushdown left_pushdown(optimizer), right_pushdown(optimizer);
|
|
@@ -77,7 +77,7 @@ unique_ptr<LogicalOperator> FilterPushdown::PushdownMarkJoin(unique_ptr<LogicalO
|
|
|
77
77
|
}
|
|
78
78
|
op->children[0] = left_pushdown.Rewrite(std::move(op->children[0]));
|
|
79
79
|
op->children[1] = right_pushdown.Rewrite(std::move(op->children[1]));
|
|
80
|
-
return
|
|
80
|
+
return PushFinalFilters(std::move(op));
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
} // namespace duckdb
|