duckdb 0.7.2-dev0.0 → 0.7.2-dev1034.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/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 +12 -2
- package/src/duckdb/extension/parquet/parquet_reader.cpp +1 -1
- package/src/duckdb/extension/parquet/parquet_statistics.cpp +26 -32
- 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/operator/cast_operators.cpp +1 -1
- package/src/duckdb/src/common/preserved_error.cpp +7 -5
- 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/sort_state.cpp +5 -7
- package/src/duckdb/src/common/sort/sorted_block.cpp +0 -1
- package/src/duckdb/src/common/string_util.cpp +4 -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 +11 -6
- package/src/duckdb/src/common/types/data_chunk.cpp +1 -1
- package/src/duckdb/src/common/types/time.cpp +13 -0
- package/src/duckdb/src/common/types/value.cpp +320 -154
- package/src/duckdb/src/common/types/vector.cpp +155 -127
- package/src/duckdb/src/common/types.cpp +313 -153
- package/src/duckdb/src/common/vector_operations/vector_cast.cpp +2 -1
- package/src/duckdb/src/execution/aggregate_hashtable.cpp +10 -5
- 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/index/art/art.cpp +6 -5
- 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_iejoin.cpp +2 -2
- package/src/duckdb/src/execution/operator/join/physical_index_join.cpp +12 -4
- 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 +6 -3
- package/src/duckdb/src/execution/operator/persistent/buffered_csv_reader.cpp +6 -14
- package/src/duckdb/src/execution/operator/persistent/physical_copy_to_file.cpp +2 -2
- 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/partitionable_hashtable.cpp +14 -2
- package/src/duckdb/src/execution/physical_plan/plan_aggregate.cpp +21 -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_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/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 +8 -8
- package/src/duckdb/src/function/aggregate/sorted_aggregate_function.cpp +58 -16
- 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/function_binder.cpp +1 -8
- 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_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 +55 -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 +1 -1
- 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/{http_stats.hpp → http_state.hpp} +18 -4
- 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/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 +25 -0
- package/src/duckdb/src/include/duckdb/common/types/bit.hpp +12 -7
- package/src/duckdb/src/include/duckdb/common/types/time.hpp +3 -0
- 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 +1 -0
- package/src/duckdb/src/include/duckdb/execution/index/art/art.hpp +2 -2
- 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 +6 -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 +3 -0
- 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_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 +1 -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 +1 -1
- package/src/duckdb/src/include/duckdb/storage/data_pointer.hpp +5 -2
- package/src/duckdb/src/include/duckdb/storage/data_table.hpp +3 -3
- package/src/duckdb/src/include/duckdb/storage/index.hpp +4 -3
- 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 +6 -3
- 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 +7 -5
- 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 -2
- package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +10 -6
- package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +8 -5
- package/src/duckdb/src/include/duckdb/storage/table/row_group_segment_tree.hpp +37 -0
- package/src/duckdb/src/include/duckdb/storage/table/scan_state.hpp +10 -1
- package/src/duckdb/src/include/duckdb/storage/table/segment_base.hpp +4 -3
- package/src/duckdb/src/include/duckdb/storage/table/segment_tree.hpp +271 -26
- 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 +2 -2
- package/src/duckdb/src/include/duckdb.h +50 -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/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/optimizer/column_lifetime_analyzer.cpp +1 -0
- package/src/duckdb/src/optimizer/deliminator.cpp +1 -1
- package/src/duckdb/src/optimizer/filter_combiner.cpp +1 -1
- 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 +105 -71
- package/src/duckdb/src/optimizer/join_order/join_order_optimizer.cpp +31 -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 -4
- 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 +63 -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 +9 -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 +28 -24
- package/src/duckdb/src/storage/compression/fixed_size_uncompressed.cpp +43 -45
- package/src/duckdb/src/storage/compression/numeric_constant.cpp +9 -10
- package/src/duckdb/src/storage/compression/patas.cpp +1 -1
- package/src/duckdb/src/storage/compression/rle.cpp +19 -15
- package/src/duckdb/src/storage/compression/validity_uncompressed.cpp +5 -5
- package/src/duckdb/src/storage/data_table.cpp +20 -20
- package/src/duckdb/src/storage/index.cpp +12 -1
- package/src/duckdb/src/storage/local_storage.cpp +20 -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 +45 -46
- package/src/duckdb/src/storage/table/column_data_checkpointer.cpp +7 -8
- package/src/duckdb/src/storage/table/column_segment.cpp +13 -14
- package/src/duckdb/src/storage/table/list_column_data.cpp +41 -59
- package/src/duckdb/src/storage/table/persistent_table_data.cpp +2 -1
- package/src/duckdb/src/storage/table/row_group.cpp +38 -32
- package/src/duckdb/src/storage/table/row_group_collection.cpp +94 -78
- package/src/duckdb/src/storage/table/scan_state.cpp +22 -3
- package/src/duckdb/src/storage/table/standard_column_data.cpp +7 -6
- package/src/duckdb/src/storage/table/struct_column_data.cpp +16 -16
- package/src/duckdb/src/storage/table/table_statistics.cpp +27 -7
- package/src/duckdb/src/storage/table/update_segment.cpp +20 -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_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
|
@@ -6,24 +6,18 @@
|
|
|
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
|
|
|
12
11
|
namespace duckdb {
|
|
13
12
|
|
|
14
13
|
static TableCatalogEntry *GetCatalogTableEntry(LogicalOperator *op) {
|
|
15
|
-
if (op
|
|
16
|
-
|
|
17
|
-
TableCatalogEntry *entry = get->GetTable();
|
|
18
|
-
return entry;
|
|
14
|
+
if (!op) {
|
|
15
|
+
return nullptr;
|
|
19
16
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
return nullptr;
|
|
17
|
+
D_ASSERT(op->type == LogicalOperatorType::LOGICAL_GET);
|
|
18
|
+
auto get = (LogicalGet *)op;
|
|
19
|
+
TableCatalogEntry *entry = get->GetTable();
|
|
20
|
+
return entry;
|
|
27
21
|
}
|
|
28
22
|
|
|
29
23
|
// The filter was made on top of a logical sample or other projection,
|
|
@@ -45,8 +39,7 @@ void CardinalityEstimator::AddRelationTdom(FilterInfo *filter_info) {
|
|
|
45
39
|
}
|
|
46
40
|
}
|
|
47
41
|
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));
|
|
42
|
+
relations_to_tdoms.emplace_back(column_binding_set_t({key}));
|
|
50
43
|
}
|
|
51
44
|
|
|
52
45
|
bool CardinalityEstimator::SingleColumnFilter(FilterInfo *filter_info) {
|
|
@@ -99,7 +92,7 @@ void CardinalityEstimator::AddToEquivalenceSets(FilterInfo *filter_info, vector<
|
|
|
99
92
|
column_binding_set_t tmp;
|
|
100
93
|
tmp.insert(filter_info->left_binding);
|
|
101
94
|
tmp.insert(filter_info->right_binding);
|
|
102
|
-
relations_to_tdoms.emplace_back(
|
|
95
|
+
relations_to_tdoms.emplace_back(tmp);
|
|
103
96
|
relations_to_tdoms.back().filters.push_back(filter_info);
|
|
104
97
|
}
|
|
105
98
|
}
|
|
@@ -265,7 +258,7 @@ double CardinalityEstimator::EstimateCardinalityWithSet(JoinRelationSet *new_set
|
|
|
265
258
|
// connection to any subgraph in subgraphs. Add a new subgraph, and maybe later there will be
|
|
266
259
|
// a connection.
|
|
267
260
|
if (!found_match) {
|
|
268
|
-
subgraphs.emplace_back(
|
|
261
|
+
subgraphs.emplace_back();
|
|
269
262
|
auto subgraph = &subgraphs.back();
|
|
270
263
|
subgraph->relations.insert(filter->left_binding.table_index);
|
|
271
264
|
subgraph->relations.insert(filter->right_binding.table_index);
|
|
@@ -304,23 +297,37 @@ static bool IsLogicalFilter(LogicalOperator *op) {
|
|
|
304
297
|
return op->type == LogicalOperatorType::LOGICAL_FILTER;
|
|
305
298
|
}
|
|
306
299
|
|
|
307
|
-
static LogicalGet *GetLogicalGet(LogicalOperator *op) {
|
|
300
|
+
static LogicalGet *GetLogicalGet(LogicalOperator *op, idx_t table_index = DConstants::INVALID_INDEX) {
|
|
308
301
|
LogicalGet *get = nullptr;
|
|
309
302
|
switch (op->type) {
|
|
310
303
|
case LogicalOperatorType::LOGICAL_GET:
|
|
311
304
|
get = (LogicalGet *)op;
|
|
312
305
|
break;
|
|
313
306
|
case LogicalOperatorType::LOGICAL_FILTER:
|
|
314
|
-
get = GetLogicalGet(op->children.at(0).get());
|
|
307
|
+
get = GetLogicalGet(op->children.at(0).get(), table_index);
|
|
315
308
|
break;
|
|
316
309
|
case LogicalOperatorType::LOGICAL_PROJECTION:
|
|
317
|
-
get = GetLogicalGet(op->children.at(0).get());
|
|
310
|
+
get = GetLogicalGet(op->children.at(0).get(), table_index);
|
|
318
311
|
break;
|
|
312
|
+
case LogicalOperatorType::LOGICAL_ASOF_JOIN:
|
|
319
313
|
case LogicalOperatorType::LOGICAL_COMPARISON_JOIN: {
|
|
320
314
|
LogicalComparisonJoin *join = (LogicalComparisonJoin *)op;
|
|
315
|
+
// We should never be calling GetLogicalGet without a valid table_index.
|
|
316
|
+
// We are attempting to get the catalog table for a relation (for statistics/cardinality estimation)
|
|
317
|
+
// A logical join means there is a non-reorderable relation in the join plan. This means we need
|
|
318
|
+
// to know the exact table index to return.
|
|
319
|
+
D_ASSERT(table_index != DConstants::INVALID_INDEX);
|
|
321
320
|
if (join->join_type == JoinType::MARK || join->join_type == JoinType::LEFT) {
|
|
322
321
|
auto child = join->children.at(0).get();
|
|
323
|
-
get = GetLogicalGet(child);
|
|
322
|
+
get = GetLogicalGet(child, table_index);
|
|
323
|
+
if (get && get->table_index == table_index) {
|
|
324
|
+
return get;
|
|
325
|
+
}
|
|
326
|
+
child = join->children.at(1).get();
|
|
327
|
+
get = GetLogicalGet(child, table_index);
|
|
328
|
+
if (get && get->table_index == table_index) {
|
|
329
|
+
return get;
|
|
330
|
+
}
|
|
324
331
|
}
|
|
325
332
|
break;
|
|
326
333
|
}
|
|
@@ -370,16 +377,20 @@ void CardinalityEstimator::InitCardinalityEstimatorProps(vector<NodeOp> *node_op
|
|
|
370
377
|
if (op->type == LogicalOperatorType::LOGICAL_COMPARISON_JOIN) {
|
|
371
378
|
auto &join = (LogicalComparisonJoin &)*op;
|
|
372
379
|
if (join.join_type == JoinType::LEFT) {
|
|
373
|
-
//
|
|
374
|
-
//
|
|
375
|
-
//
|
|
376
|
-
//
|
|
377
|
-
//
|
|
380
|
+
// If a base op is a Logical Comparison join it is probably a left join,
|
|
381
|
+
// so the cost of the larger table is a fine estimate.
|
|
382
|
+
// TODO: provide better estimates for cost of mark joins
|
|
383
|
+
// MARK joins are used for anti and semi joins, so the cost can conceivably be
|
|
384
|
+
// less than the base table cardinality.
|
|
378
385
|
join_node->SetCost(join_node->GetBaseTableCardinality());
|
|
379
386
|
}
|
|
387
|
+
} else if (op->type == LogicalOperatorType::LOGICAL_ASOF_JOIN) {
|
|
388
|
+
// AsOf joins have the cardinality of the LHS
|
|
389
|
+
join_node->SetCost(join_node->GetBaseTableCardinality());
|
|
380
390
|
}
|
|
381
|
-
// update cardinality
|
|
391
|
+
// Total domains can be affected by filters. So we update base table cardinality first
|
|
382
392
|
EstimateBaseTableCardinality(join_node, op);
|
|
393
|
+
// Then update total domains.
|
|
383
394
|
UpdateTotalDomains(join_node, op);
|
|
384
395
|
}
|
|
385
396
|
|
|
@@ -390,74 +401,84 @@ void CardinalityEstimator::InitCardinalityEstimatorProps(vector<NodeOp> *node_op
|
|
|
390
401
|
void CardinalityEstimator::UpdateTotalDomains(JoinNode *node, LogicalOperator *op) {
|
|
391
402
|
auto relation_id = node->set->relations[0];
|
|
392
403
|
relation_attributes[relation_id].cardinality = node->GetCardinality<double>();
|
|
404
|
+
//! Initialize the distinct count for all columns used in joins with the current relation.
|
|
405
|
+
idx_t distinct_count = node->GetBaseTableCardinality();
|
|
393
406
|
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
407
|
|
|
403
408
|
bool direct_filter = false;
|
|
409
|
+
LogicalGet *get = nullptr;
|
|
410
|
+
bool get_updated = true;
|
|
404
411
|
for (auto &column : relation_attributes[relation_id].columns) {
|
|
405
|
-
//! for every column in the relation, get the count via
|
|
412
|
+
//! for every column used in a filter in the relation, get the distinct count via HLL, or assume it to be
|
|
406
413
|
//! the cardinality
|
|
407
414
|
ColumnBinding key = ColumnBinding(relation_id, column);
|
|
415
|
+
auto actual_binding = relation_column_to_original_column.find(key);
|
|
416
|
+
// each relation has columns that are either projected or used as filters
|
|
417
|
+
// In order to get column statistics we need to make sure the actual binding still
|
|
418
|
+
// refers to the same base table relation, as non-reorderable joins may involve 2+
|
|
419
|
+
// base table relations and therefore the columns may also refer to 2 different
|
|
420
|
+
// base table relations
|
|
421
|
+
if (actual_binding != relation_column_to_original_column.end() &&
|
|
422
|
+
(!get || get->table_index != actual_binding->second.table_index)) {
|
|
423
|
+
get = GetLogicalGet(op, actual_binding->second.table_index);
|
|
424
|
+
get_updated = true;
|
|
425
|
+
} else {
|
|
426
|
+
get_updated = false;
|
|
427
|
+
}
|
|
408
428
|
|
|
409
|
-
if (
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
auto actual_binding = relation_column_to_original_column[key];
|
|
429
|
+
if (get_updated) {
|
|
430
|
+
catalog_table = GetCatalogTableEntry(get);
|
|
431
|
+
}
|
|
413
432
|
|
|
414
|
-
|
|
433
|
+
if (catalog_table && actual_binding != relation_column_to_original_column.end()) {
|
|
434
|
+
// Get HLL stats here
|
|
435
|
+
auto base_stats = catalog_table->GetStatistics(context, actual_binding->second.column_index);
|
|
415
436
|
if (base_stats) {
|
|
416
|
-
|
|
437
|
+
distinct_count = base_stats->GetDistinctCount();
|
|
417
438
|
}
|
|
418
439
|
|
|
419
|
-
// means you have a direct filter on a column. The
|
|
440
|
+
// means you have a direct filter on a column. The distinct_count/total domain for the column
|
|
420
441
|
// should be decreased to match the predicted total domain matching the filter.
|
|
421
442
|
// We decrease the total domain for all columns in the equivalence set because filter pushdown
|
|
422
443
|
// will mean all columns are affected.
|
|
423
444
|
if (direct_filter) {
|
|
424
|
-
|
|
445
|
+
distinct_count = node->GetCardinality<idx_t>();
|
|
425
446
|
}
|
|
426
447
|
|
|
427
|
-
// HLL has estimation error,
|
|
428
|
-
if (
|
|
429
|
-
|
|
448
|
+
// HLL has estimation error, distinct_count can't be greater than cardinality of the table before filters
|
|
449
|
+
if (distinct_count > node->GetBaseTableCardinality()) {
|
|
450
|
+
distinct_count = node->GetBaseTableCardinality();
|
|
430
451
|
}
|
|
431
452
|
} else {
|
|
432
|
-
// No HLL. So if we know there is a direct filter, reduce count to cardinality
|
|
433
|
-
//
|
|
453
|
+
// No HLL. So if we know there is a direct filter, reduce the distinct count to the cardinality
|
|
454
|
+
// with filter effects. Otherwise assume the distinct count is still the cardinality
|
|
434
455
|
if (direct_filter) {
|
|
435
|
-
|
|
456
|
+
distinct_count = node->GetCardinality<idx_t>();
|
|
436
457
|
} else {
|
|
437
|
-
|
|
458
|
+
distinct_count = node->GetBaseTableCardinality();
|
|
438
459
|
}
|
|
439
460
|
}
|
|
440
|
-
|
|
461
|
+
// Update the relation_to_tdom set with the estimated distinct count (or tdom) calculated above
|
|
441
462
|
for (auto &relation_to_tdom : relations_to_tdoms) {
|
|
442
463
|
column_binding_set_t i_set = relation_to_tdom.equivalent_relations;
|
|
443
464
|
if (i_set.count(key) != 1) {
|
|
444
465
|
continue;
|
|
445
466
|
}
|
|
446
467
|
if (catalog_table) {
|
|
447
|
-
if (relation_to_tdom.tdom_hll <
|
|
448
|
-
relation_to_tdom.tdom_hll =
|
|
468
|
+
if (relation_to_tdom.tdom_hll < distinct_count) {
|
|
469
|
+
relation_to_tdom.tdom_hll = distinct_count;
|
|
449
470
|
relation_to_tdom.has_tdom_hll = true;
|
|
450
471
|
}
|
|
451
|
-
if (relation_to_tdom.tdom_no_hll >
|
|
452
|
-
relation_to_tdom.tdom_no_hll =
|
|
472
|
+
if (relation_to_tdom.tdom_no_hll > distinct_count) {
|
|
473
|
+
relation_to_tdom.tdom_no_hll = distinct_count;
|
|
453
474
|
}
|
|
454
475
|
} else {
|
|
455
476
|
// Here we don't have catalog statistics, and the following is how we determine
|
|
456
477
|
// the tdom
|
|
457
478
|
// 1. If there is any hll data in the equivalence set, use that
|
|
458
479
|
// 2. Otherwise, use the table with the smallest cardinality
|
|
459
|
-
if (relation_to_tdom.tdom_no_hll >
|
|
460
|
-
relation_to_tdom.tdom_no_hll =
|
|
480
|
+
if (relation_to_tdom.tdom_no_hll > distinct_count && !relation_to_tdom.has_tdom_hll) {
|
|
481
|
+
relation_to_tdom.tdom_no_hll = distinct_count;
|
|
461
482
|
}
|
|
462
483
|
}
|
|
463
484
|
break;
|
|
@@ -465,9 +486,8 @@ void CardinalityEstimator::UpdateTotalDomains(JoinNode *node, LogicalOperator *o
|
|
|
465
486
|
}
|
|
466
487
|
}
|
|
467
488
|
|
|
468
|
-
TableFilterSet *CardinalityEstimator::GetTableFilters(LogicalOperator *op) {
|
|
469
|
-
|
|
470
|
-
auto get = GetLogicalGet(op);
|
|
489
|
+
TableFilterSet *CardinalityEstimator::GetTableFilters(LogicalOperator *op, idx_t table_index) {
|
|
490
|
+
auto get = GetLogicalGet(op, table_index);
|
|
471
491
|
return get ? &get->table_filters : nullptr;
|
|
472
492
|
}
|
|
473
493
|
|
|
@@ -529,9 +549,10 @@ idx_t CardinalityEstimator::InspectConjunctionOR(idx_t cardinality, idx_t column
|
|
|
529
549
|
return cardinality_after_filters;
|
|
530
550
|
}
|
|
531
551
|
|
|
532
|
-
idx_t CardinalityEstimator::InspectTableFilters(idx_t cardinality, LogicalOperator *op, TableFilterSet *table_filters
|
|
552
|
+
idx_t CardinalityEstimator::InspectTableFilters(idx_t cardinality, LogicalOperator *op, TableFilterSet *table_filters,
|
|
553
|
+
idx_t table_index) {
|
|
533
554
|
idx_t cardinality_after_filters = cardinality;
|
|
534
|
-
auto get = GetLogicalGet(op);
|
|
555
|
+
auto get = GetLogicalGet(op, table_index);
|
|
535
556
|
unique_ptr<BaseStatistics> column_statistics;
|
|
536
557
|
for (auto &it : table_filters->filters) {
|
|
537
558
|
column_statistics = nullptr;
|
|
@@ -562,17 +583,30 @@ idx_t CardinalityEstimator::InspectTableFilters(idx_t cardinality, LogicalOperat
|
|
|
562
583
|
|
|
563
584
|
void CardinalityEstimator::EstimateBaseTableCardinality(JoinNode *node, LogicalOperator *op) {
|
|
564
585
|
auto has_logical_filter = IsLogicalFilter(op);
|
|
565
|
-
|
|
586
|
+
D_ASSERT(node->set->count == 1);
|
|
587
|
+
auto relation_id = node->set->relations[0];
|
|
566
588
|
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
589
|
+
double lowest_card_found = NumericLimits<double>::Maximum();
|
|
590
|
+
for (auto &column : relation_attributes[relation_id].columns) {
|
|
591
|
+
auto card_after_filters = node->GetBaseTableCardinality();
|
|
592
|
+
ColumnBinding key = ColumnBinding(relation_id, column);
|
|
593
|
+
TableFilterSet *table_filters = nullptr;
|
|
594
|
+
auto actual_binding = relation_column_to_original_column.find(key);
|
|
595
|
+
if (actual_binding != relation_column_to_original_column.end()) {
|
|
596
|
+
table_filters = GetTableFilters(op, actual_binding->second.table_index);
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
if (table_filters) {
|
|
600
|
+
double inspect_result =
|
|
601
|
+
(double)InspectTableFilters(card_after_filters, op, table_filters, actual_binding->second.table_index);
|
|
602
|
+
card_after_filters = MinValue(inspect_result, (double)card_after_filters);
|
|
603
|
+
}
|
|
604
|
+
if (has_logical_filter) {
|
|
605
|
+
card_after_filters *= DEFAULT_SELECTIVITY;
|
|
606
|
+
}
|
|
607
|
+
lowest_card_found = MinValue(card_after_filters, lowest_card_found);
|
|
574
608
|
}
|
|
575
|
-
node->SetEstimatedCardinality(
|
|
609
|
+
node->SetEstimatedCardinality(lowest_card_found);
|
|
576
610
|
}
|
|
577
611
|
|
|
578
612
|
} // namespace duckdb
|
|
@@ -113,7 +113,7 @@ bool JoinOrderOptimizer::ExtractJoinRelations(LogicalOperator &input_op, vector<
|
|
|
113
113
|
bool non_reorderable_operation = false;
|
|
114
114
|
if (op->type == LogicalOperatorType::LOGICAL_UNION || op->type == LogicalOperatorType::LOGICAL_EXCEPT ||
|
|
115
115
|
op->type == LogicalOperatorType::LOGICAL_INTERSECT || op->type == LogicalOperatorType::LOGICAL_DELIM_JOIN ||
|
|
116
|
-
op->type == LogicalOperatorType::LOGICAL_ANY_JOIN) {
|
|
116
|
+
op->type == LogicalOperatorType::LOGICAL_ANY_JOIN || op->type == LogicalOperatorType::LOGICAL_ASOF_JOIN) {
|
|
117
117
|
// set operation, optimize separately in children
|
|
118
118
|
non_reorderable_operation = true;
|
|
119
119
|
}
|
|
@@ -138,7 +138,7 @@ bool JoinOrderOptimizer::ExtractJoinRelations(LogicalOperator &input_op, vector<
|
|
|
138
138
|
std::swap(join.children[0], join.children[1]);
|
|
139
139
|
for (auto &cond : join.conditions) {
|
|
140
140
|
std::swap(cond.left, cond.right);
|
|
141
|
-
cond.comparison =
|
|
141
|
+
cond.comparison = FlipComparisonExpression(cond.comparison);
|
|
142
142
|
}
|
|
143
143
|
}
|
|
144
144
|
}
|
|
@@ -152,11 +152,11 @@ bool JoinOrderOptimizer::ExtractJoinRelations(LogicalOperator &input_op, vector<
|
|
|
152
152
|
// new NULL values in the right side, so pushing this condition through the join leads to incorrect results
|
|
153
153
|
// for this reason, we just start a new JoinOptimizer pass in each of the children of the join
|
|
154
154
|
|
|
155
|
-
// Keep track of all
|
|
155
|
+
// Keep track of all filter bindings the new join order optimizer makes
|
|
156
156
|
vector<column_binding_map_t<ColumnBinding>> child_binding_maps;
|
|
157
157
|
idx_t child_bindings_it = 0;
|
|
158
158
|
for (auto &child : op->children) {
|
|
159
|
-
child_binding_maps.emplace_back(
|
|
159
|
+
child_binding_maps.emplace_back();
|
|
160
160
|
JoinOrderOptimizer optimizer(context);
|
|
161
161
|
child = optimizer.Optimize(std::move(child));
|
|
162
162
|
// save the relation bindings from the optimized child. These later all get added to the
|
|
@@ -184,6 +184,7 @@ bool JoinOrderOptimizer::ExtractJoinRelations(LogicalOperator &input_op, vector<
|
|
|
184
184
|
}
|
|
185
185
|
|
|
186
186
|
switch (op->type) {
|
|
187
|
+
case LogicalOperatorType::LOGICAL_ASOF_JOIN:
|
|
187
188
|
case LogicalOperatorType::LOGICAL_COMPARISON_JOIN:
|
|
188
189
|
case LogicalOperatorType::LOGICAL_CROSS_PRODUCT: {
|
|
189
190
|
// inner join or cross product
|
|
@@ -222,12 +223,25 @@ bool JoinOrderOptimizer::ExtractJoinRelations(LogicalOperator &input_op, vector<
|
|
|
222
223
|
}
|
|
223
224
|
case LogicalOperatorType::LOGICAL_PROJECTION: {
|
|
224
225
|
auto proj = (LogicalProjection *)op;
|
|
225
|
-
// we run the join order optimizer
|
|
226
|
+
// we run the join order optimizer within the subquery as well
|
|
226
227
|
JoinOrderOptimizer optimizer(context);
|
|
227
228
|
op->children[0] = optimizer.Optimize(std::move(op->children[0]));
|
|
228
229
|
// projection, add to the set of relations
|
|
229
230
|
auto relation = make_unique<SingleJoinRelation>(&input_op, parent);
|
|
230
|
-
|
|
231
|
+
auto relation_id = relations.size();
|
|
232
|
+
// push one child column binding map back.
|
|
233
|
+
vector<column_binding_map_t<ColumnBinding>> child_binding_maps;
|
|
234
|
+
child_binding_maps.emplace_back();
|
|
235
|
+
optimizer.cardinality_estimator.CopyRelationMap(child_binding_maps.at(0));
|
|
236
|
+
// This logical projection may sit on top of a logical comparison join that has been pushed down
|
|
237
|
+
// we want to copy the binding info of both tables
|
|
238
|
+
relation_mapping[proj->table_index] = relation_id;
|
|
239
|
+
for (auto &binding_info : child_binding_maps.at(0)) {
|
|
240
|
+
cardinality_estimator.AddRelationToColumnMapping(
|
|
241
|
+
ColumnBinding(proj->table_index, binding_info.first.column_index), binding_info.second);
|
|
242
|
+
cardinality_estimator.AddColumnToRelationMap(binding_info.second.table_index,
|
|
243
|
+
binding_info.second.column_index);
|
|
244
|
+
}
|
|
231
245
|
relations.push_back(std::move(relation));
|
|
232
246
|
return true;
|
|
233
247
|
}
|
|
@@ -756,7 +770,7 @@ JoinOrderOptimizer::GenerateJoins(vector<unique_ptr<LogicalOperator>> &extracted
|
|
|
756
770
|
|
|
757
771
|
if (invert) {
|
|
758
772
|
// reverse comparison expression if we reverse the order of the children
|
|
759
|
-
cond.comparison =
|
|
773
|
+
cond.comparison = FlipComparisonExpression(cond.comparison);
|
|
760
774
|
}
|
|
761
775
|
join->conditions.push_back(std::move(cond));
|
|
762
776
|
}
|
|
@@ -833,7 +847,7 @@ JoinOrderOptimizer::GenerateJoins(vector<unique_ptr<LogicalOperator>> &extracted
|
|
|
833
847
|
cond.comparison = comparison.type;
|
|
834
848
|
if (invert) {
|
|
835
849
|
// reverse comparison expression if we reverse the order of the children
|
|
836
|
-
cond.comparison =
|
|
850
|
+
cond.comparison = FlipComparisonExpression(comparison.type);
|
|
837
851
|
}
|
|
838
852
|
// now find the join to push it into
|
|
839
853
|
auto node = result_operator.get();
|
|
@@ -853,7 +867,8 @@ JoinOrderOptimizer::GenerateJoins(vector<unique_ptr<LogicalOperator>> &extracted
|
|
|
853
867
|
result_operator->children[0] = std::move(comp_join);
|
|
854
868
|
}
|
|
855
869
|
} else {
|
|
856
|
-
D_ASSERT(node->type == LogicalOperatorType::LOGICAL_COMPARISON_JOIN
|
|
870
|
+
D_ASSERT(node->type == LogicalOperatorType::LOGICAL_COMPARISON_JOIN ||
|
|
871
|
+
node->type == LogicalOperatorType::LOGICAL_ASOF_JOIN);
|
|
857
872
|
auto &comp_join = (LogicalComparisonJoin &)*node;
|
|
858
873
|
comp_join.conditions.push_back(std::move(cond));
|
|
859
874
|
}
|
|
@@ -869,9 +884,11 @@ unique_ptr<LogicalOperator> JoinOrderOptimizer::RewritePlan(unique_ptr<LogicalOp
|
|
|
869
884
|
|
|
870
885
|
// first we will extract all relations from the main plan
|
|
871
886
|
vector<unique_ptr<LogicalOperator>> extracted_relations;
|
|
887
|
+
extracted_relations.reserve(relations.size());
|
|
872
888
|
for (auto &relation : relations) {
|
|
873
889
|
extracted_relations.push_back(ExtractJoinRelation(*relation));
|
|
874
890
|
}
|
|
891
|
+
|
|
875
892
|
// now we generate the actual joins
|
|
876
893
|
auto join_tree = GenerateJoins(extracted_relations, node);
|
|
877
894
|
// perform the final pushdown of remaining filters
|
|
@@ -893,7 +910,8 @@ unique_ptr<LogicalOperator> JoinOrderOptimizer::RewritePlan(unique_ptr<LogicalOp
|
|
|
893
910
|
auto op = plan.get();
|
|
894
911
|
auto parent = plan.get();
|
|
895
912
|
while (op->type != LogicalOperatorType::LOGICAL_CROSS_PRODUCT &&
|
|
896
|
-
op->type != LogicalOperatorType::LOGICAL_COMPARISON_JOIN
|
|
913
|
+
op->type != LogicalOperatorType::LOGICAL_COMPARISON_JOIN &&
|
|
914
|
+
op->type != LogicalOperatorType::LOGICAL_ASOF_JOIN) {
|
|
897
915
|
D_ASSERT(op->children.size() == 1);
|
|
898
916
|
parent = op;
|
|
899
917
|
op = op->children[0].get();
|
|
@@ -928,7 +946,8 @@ unique_ptr<LogicalOperator> JoinOrderOptimizer::Optimize(unique_ptr<LogicalOpera
|
|
|
928
946
|
// filters in the process
|
|
929
947
|
expression_set_t filter_set;
|
|
930
948
|
for (auto &f_op : filter_operators) {
|
|
931
|
-
if (f_op->type == LogicalOperatorType::LOGICAL_COMPARISON_JOIN
|
|
949
|
+
if (f_op->type == LogicalOperatorType::LOGICAL_COMPARISON_JOIN ||
|
|
950
|
+
f_op->type == LogicalOperatorType::LOGICAL_ASOF_JOIN) {
|
|
932
951
|
auto &join = (LogicalComparisonJoin &)*f_op;
|
|
933
952
|
D_ASSERT(join.join_type == JoinType::INNER);
|
|
934
953
|
D_ASSERT(join.expressions.empty());
|
|
@@ -999,7 +1018,7 @@ unique_ptr<LogicalOperator> JoinOrderOptimizer::Optimize(unique_ptr<LogicalOpera
|
|
|
999
1018
|
for (idx_t i = 0; i < relations.size(); i++) {
|
|
1000
1019
|
auto &rel = *relations[i];
|
|
1001
1020
|
auto node = set_manager.GetJoinRelation(i);
|
|
1002
|
-
nodes_ops.emplace_back(
|
|
1021
|
+
nodes_ops.emplace_back(make_unique<JoinNode>(node, 0), rel.op);
|
|
1003
1022
|
}
|
|
1004
1023
|
|
|
1005
1024
|
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
|
|
@@ -23,7 +23,7 @@ unique_ptr<LogicalOperator> FilterPushdown::PushdownSingleJoin(unique_ptr<Logica
|
|
|
23
23
|
}
|
|
24
24
|
op->children[0] = left_pushdown.Rewrite(std::move(op->children[0]));
|
|
25
25
|
op->children[1] = right_pushdown.Rewrite(std::move(op->children[1]));
|
|
26
|
-
return
|
|
26
|
+
return PushFinalFilters(std::move(op));
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
} // namespace duckdb
|
|
@@ -71,6 +71,7 @@ void RemoveUnusedColumns::VisitOperator(LogicalOperator &op) {
|
|
|
71
71
|
remove.VisitOperator(*op.children[0]);
|
|
72
72
|
return;
|
|
73
73
|
}
|
|
74
|
+
case LogicalOperatorType::LOGICAL_ASOF_JOIN:
|
|
74
75
|
case LogicalOperatorType::LOGICAL_DELIM_JOIN:
|
|
75
76
|
case LogicalOperatorType::LOGICAL_COMPARISON_JOIN: {
|
|
76
77
|
if (!everything_referenced) {
|
|
@@ -73,7 +73,10 @@ unique_ptr<Expression> MoveConstantsRule::Apply(LogicalOperator &op, vector<Expr
|
|
|
73
73
|
}
|
|
74
74
|
auto result_value = Value::HUGEINT(outer_value);
|
|
75
75
|
if (!result_value.DefaultTryCastAs(constant_type)) {
|
|
76
|
-
// if the cast is not possible then
|
|
76
|
+
// if the cast is not possible then an equality comparison is not possible
|
|
77
|
+
if (comparison->type != ExpressionType::COMPARE_EQUAL) {
|
|
78
|
+
return nullptr;
|
|
79
|
+
}
|
|
77
80
|
return ExpressionRewriter::ConstantOrNull(std::move(arithmetic->children[arithmetic_child_index]),
|
|
78
81
|
Value::BOOLEAN(false));
|
|
79
82
|
}
|
|
@@ -86,14 +89,17 @@ unique_ptr<Expression> MoveConstantsRule::Apply(LogicalOperator &op, vector<Expr
|
|
|
86
89
|
}
|
|
87
90
|
auto result_value = Value::HUGEINT(inner_value);
|
|
88
91
|
if (!result_value.DefaultTryCastAs(constant_type)) {
|
|
89
|
-
// if the cast is not possible then
|
|
92
|
+
// if the cast is not possible then an equality comparison is not possible
|
|
93
|
+
if (comparison->type != ExpressionType::COMPARE_EQUAL) {
|
|
94
|
+
return nullptr;
|
|
95
|
+
}
|
|
90
96
|
return ExpressionRewriter::ConstantOrNull(std::move(arithmetic->children[arithmetic_child_index]),
|
|
91
97
|
Value::BOOLEAN(false));
|
|
92
98
|
}
|
|
93
99
|
outer_constant->value = std::move(result_value);
|
|
94
100
|
// in this case, we should also flip the comparison
|
|
95
101
|
// e.g. if we have [4 - x < 2] then we should have [x > 2]
|
|
96
|
-
comparison->type =
|
|
102
|
+
comparison->type = FlipComparisonExpression(comparison->type);
|
|
97
103
|
}
|
|
98
104
|
} else {
|
|
99
105
|
D_ASSERT(op_type == "*");
|
|
@@ -123,7 +129,7 @@ unique_ptr<Expression> MoveConstantsRule::Apply(LogicalOperator &op, vector<Expr
|
|
|
123
129
|
}
|
|
124
130
|
if (inner_value < 0) {
|
|
125
131
|
// multiply by negative value, need to flip expression
|
|
126
|
-
comparison->type =
|
|
132
|
+
comparison->type = FlipComparisonExpression(comparison->type);
|
|
127
133
|
}
|
|
128
134
|
// else divide the RHS by the LHS
|
|
129
135
|
// we need to do a range check on the cast even though we do a division
|