duckdb 0.8.2-dev161.0 → 0.8.2-dev1764.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 +15 -12
- package/binding.gyp.in +1 -1
- package/configure.py +1 -1
- package/duckdb_extension_config.cmake +10 -0
- package/package.json +1 -1
- package/src/duckdb/extension/icu/icu-dateadd.cpp +2 -2
- package/src/duckdb/extension/icu/icu-datefunc.cpp +1 -1
- package/src/duckdb/extension/icu/icu-datepart.cpp +2 -2
- package/src/duckdb/extension/icu/icu-datesub.cpp +2 -2
- package/src/duckdb/extension/icu/icu-datetrunc.cpp +1 -1
- package/src/duckdb/extension/icu/icu-list-range.cpp +1 -1
- package/src/duckdb/extension/icu/icu-makedate.cpp +7 -0
- package/src/duckdb/extension/icu/icu-strptime.cpp +4 -4
- package/src/duckdb/extension/icu/icu-table-range.cpp +5 -5
- package/src/duckdb/extension/icu/icu-timebucket.cpp +16 -16
- package/src/duckdb/extension/icu/icu-timezone.cpp +8 -8
- package/src/duckdb/extension/icu/icu_extension.cpp +3 -3
- package/src/duckdb/extension/json/include/json_common.hpp +47 -231
- package/src/duckdb/extension/json/include/json_executors.hpp +49 -13
- package/src/duckdb/extension/json/include/json_functions.hpp +2 -1
- package/src/duckdb/extension/json/json_common.cpp +272 -40
- package/src/duckdb/extension/json/json_functions/json_create.cpp +21 -2
- package/src/duckdb/extension/json/json_functions/json_structure.cpp +1 -1
- package/src/duckdb/extension/json/json_functions/json_transform.cpp +91 -38
- package/src/duckdb/extension/json/json_functions/json_type.cpp +1 -1
- package/src/duckdb/extension/json/json_functions.cpp +24 -24
- package/src/duckdb/extension/json/json_scan.cpp +3 -6
- package/src/duckdb/extension/parquet/column_reader.cpp +19 -21
- package/src/duckdb/extension/parquet/column_writer.cpp +77 -61
- package/src/duckdb/extension/parquet/include/cast_column_reader.hpp +2 -2
- package/src/duckdb/extension/parquet/include/column_reader.hpp +14 -16
- package/src/duckdb/extension/parquet/include/column_writer.hpp +9 -7
- package/src/duckdb/extension/parquet/include/list_column_reader.hpp +2 -2
- package/src/duckdb/extension/parquet/include/parquet_dbp_decoder.hpp +3 -3
- package/src/duckdb/extension/parquet/include/parquet_decimal_utils.hpp +3 -3
- package/src/duckdb/extension/parquet/include/parquet_file_metadata_cache.hpp +2 -2
- package/src/duckdb/extension/parquet/include/parquet_statistics.hpp +2 -2
- package/src/duckdb/extension/parquet/include/parquet_support.hpp +9 -11
- package/src/duckdb/extension/parquet/include/parquet_writer.hpp +24 -5
- package/src/duckdb/extension/parquet/include/string_column_reader.hpp +1 -1
- package/src/duckdb/extension/parquet/include/struct_column_reader.hpp +2 -3
- package/src/duckdb/extension/parquet/include/zstd_file_system.hpp +2 -2
- package/src/duckdb/extension/parquet/parquet_extension.cpp +194 -20
- package/src/duckdb/extension/parquet/parquet_reader.cpp +6 -6
- package/src/duckdb/extension/parquet/parquet_statistics.cpp +7 -6
- package/src/duckdb/extension/parquet/parquet_writer.cpp +79 -16
- package/src/duckdb/extension/parquet/zstd_file_system.cpp +2 -2
- package/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp +1 -1
- package/src/duckdb/src/catalog/catalog_search_path.cpp +5 -4
- package/src/duckdb/src/catalog/default/default_functions.cpp +16 -0
- package/src/duckdb/src/common/adbc/adbc.cpp +75 -10
- package/src/duckdb/src/common/adbc/driver_manager.cpp +6 -11
- package/src/duckdb/src/common/allocator.cpp +14 -2
- package/src/duckdb/src/common/arrow/arrow_appender.cpp +79 -12
- package/src/duckdb/src/common/arrow/arrow_converter.cpp +44 -19
- package/src/duckdb/src/common/assert.cpp +3 -0
- package/src/duckdb/src/common/enum_util.cpp +4619 -4446
- package/src/duckdb/src/common/enums/logical_operator_type.cpp +4 -0
- package/src/duckdb/src/common/enums/optimizer_type.cpp +2 -0
- package/src/duckdb/src/common/enums/physical_operator_type.cpp +4 -0
- package/src/duckdb/src/common/exception.cpp +2 -2
- package/src/duckdb/src/common/extra_type_info.cpp +506 -0
- package/src/duckdb/src/common/file_system.cpp +19 -0
- package/src/duckdb/src/common/hive_partitioning.cpp +10 -6
- package/src/duckdb/src/common/local_file_system.cpp +14 -14
- package/src/duckdb/src/common/multi_file_reader.cpp +184 -20
- package/src/duckdb/src/common/operator/cast_operators.cpp +35 -1
- package/src/duckdb/src/common/radix_partitioning.cpp +26 -8
- package/src/duckdb/src/common/re2_regex.cpp +1 -1
- package/src/duckdb/src/common/row_operations/row_external.cpp +1 -1
- package/src/duckdb/src/common/sort/merge_sorter.cpp +9 -16
- package/src/duckdb/src/common/sort/partition_state.cpp +70 -50
- package/src/duckdb/src/common/types/batched_data_collection.cpp +7 -2
- package/src/duckdb/src/common/types/bit.cpp +51 -0
- package/src/duckdb/src/common/types/column/column_data_allocator.cpp +9 -6
- package/src/duckdb/src/common/types/column/column_data_collection.cpp +17 -2
- package/src/duckdb/src/common/types/column/column_data_collection_segment.cpp +15 -6
- package/src/duckdb/src/common/types/column/partitioned_column_data.cpp +2 -2
- package/src/duckdb/src/common/types/data_chunk.cpp +2 -2
- package/src/duckdb/src/common/types/date.cpp +9 -0
- package/src/duckdb/src/common/types/list_segment.cpp +24 -74
- package/src/duckdb/src/common/types/row/partitioned_tuple_data.cpp +3 -9
- package/src/duckdb/src/common/types/row/tuple_data_collection.cpp +2 -0
- package/src/duckdb/src/common/types/row/tuple_data_scatter_gather.cpp +2 -2
- package/src/duckdb/src/common/types/uuid.cpp +2 -2
- package/src/duckdb/src/common/types/validity_mask.cpp +33 -0
- package/src/duckdb/src/common/types/value.cpp +11 -6
- package/src/duckdb/src/common/types.cpp +9 -656
- package/src/duckdb/src/common/virtual_file_system.cpp +138 -1
- package/src/duckdb/src/core_functions/aggregate/holistic/reservoir_quantile.cpp +2 -0
- package/src/duckdb/src/core_functions/aggregate/nested/list.cpp +2 -2
- package/src/duckdb/src/core_functions/aggregate/regression/regr_avg.cpp +4 -4
- package/src/duckdb/src/core_functions/aggregate/regression/regr_intercept.cpp +4 -4
- package/src/duckdb/src/core_functions/aggregate/regression/regr_r2.cpp +5 -4
- package/src/duckdb/src/core_functions/aggregate/regression/regr_sxx_syy.cpp +8 -8
- package/src/duckdb/src/core_functions/aggregate/regression/regr_sxy.cpp +4 -3
- package/src/duckdb/src/core_functions/function_list.cpp +4 -2
- package/src/duckdb/src/core_functions/scalar/date/date_part.cpp +208 -42
- package/src/duckdb/src/core_functions/scalar/date/epoch.cpp +10 -24
- package/src/duckdb/src/core_functions/scalar/date/make_date.cpp +19 -4
- package/src/duckdb/src/core_functions/scalar/list/list_aggregates.cpp +4 -2
- package/src/duckdb/src/execution/aggregate_hashtable.cpp +34 -18
- package/src/duckdb/src/execution/expression_executor.cpp +1 -1
- package/src/duckdb/src/execution/index/art/art.cpp +149 -139
- package/src/duckdb/src/execution/index/art/fixed_size_allocator.cpp +1 -1
- package/src/duckdb/src/execution/index/art/iterator.cpp +129 -207
- package/src/duckdb/src/execution/index/art/leaf.cpp +8 -37
- package/src/duckdb/src/execution/index/art/node.cpp +113 -120
- package/src/duckdb/src/execution/index/art/node16.cpp +1 -10
- package/src/duckdb/src/execution/index/art/node256.cpp +1 -9
- package/src/duckdb/src/execution/index/art/node4.cpp +12 -13
- package/src/duckdb/src/execution/index/art/node48.cpp +1 -11
- package/src/duckdb/src/execution/index/art/prefix.cpp +228 -350
- package/src/duckdb/src/execution/join_hashtable.cpp +4 -4
- package/src/duckdb/src/execution/operator/aggregate/aggregate_object.cpp +1 -0
- package/src/duckdb/src/execution/operator/aggregate/physical_streaming_window.cpp +8 -3
- package/src/duckdb/src/execution/operator/aggregate/physical_ungrouped_aggregate.cpp +32 -22
- package/src/duckdb/src/execution/operator/aggregate/physical_window.cpp +512 -300
- package/src/duckdb/src/execution/operator/helper/physical_batch_collector.cpp +4 -3
- package/src/duckdb/src/execution/operator/helper/physical_limit.cpp +5 -5
- package/src/duckdb/src/execution/operator/join/physical_asof_join.cpp +444 -284
- package/src/duckdb/src/execution/operator/join/physical_comparison_join.cpp +1 -1
- package/src/duckdb/src/execution/operator/join/physical_hash_join.cpp +21 -10
- package/src/duckdb/src/execution/operator/join/physical_iejoin.cpp +28 -12
- package/src/duckdb/src/execution/operator/join/physical_join.cpp +1 -1
- package/src/duckdb/src/execution/operator/join/physical_piecewise_merge_join.cpp +23 -4
- package/src/duckdb/src/execution/operator/join/physical_range_join.cpp +41 -5
- package/src/duckdb/src/execution/operator/persistent/base_csv_reader.cpp +100 -13
- package/src/duckdb/src/execution/operator/persistent/csv_file_handle.cpp +1 -1
- package/src/duckdb/src/execution/operator/persistent/csv_reader_options.cpp +20 -0
- package/src/duckdb/src/execution/operator/persistent/csv_rejects_table.cpp +48 -0
- package/src/duckdb/src/execution/operator/persistent/parallel_csv_reader.cpp +2 -3
- package/src/duckdb/src/execution/operator/persistent/physical_batch_copy_to_file.cpp +6 -4
- package/src/duckdb/src/execution/operator/persistent/physical_fixed_batch_copy.cpp +3 -3
- package/src/duckdb/src/execution/operator/persistent/physical_insert.cpp +1 -1
- package/src/duckdb/src/execution/operator/projection/physical_pivot.cpp +2 -1
- package/src/duckdb/src/execution/operator/scan/physical_column_data_scan.cpp +19 -0
- package/src/duckdb/src/execution/operator/scan/physical_table_scan.cpp +7 -2
- package/src/duckdb/src/execution/operator/set/physical_cte.cpp +160 -0
- package/src/duckdb/src/execution/operator/set/physical_recursive_cte.cpp +15 -5
- package/src/duckdb/src/execution/partitionable_hashtable.cpp +41 -6
- package/src/duckdb/src/execution/perfect_aggregate_hashtable.cpp +30 -5
- package/src/duckdb/src/execution/physical_plan/plan_aggregate.cpp +43 -10
- package/src/duckdb/src/execution/physical_plan/plan_asof_join.cpp +56 -33
- package/src/duckdb/src/execution/physical_plan/plan_comparison_join.cpp +17 -13
- package/src/duckdb/src/execution/physical_plan/plan_cte.cpp +33 -0
- package/src/duckdb/src/execution/physical_plan/plan_get.cpp +2 -2
- package/src/duckdb/src/execution/physical_plan/plan_recursive_cte.cpp +25 -4
- package/src/duckdb/src/execution/physical_plan_generator.cpp +4 -0
- package/src/duckdb/src/execution/radix_partitioned_hashtable.cpp +290 -43
- package/src/duckdb/src/execution/window_segment_tree.cpp +286 -129
- package/src/duckdb/src/function/aggregate/sorted_aggregate_function.cpp +2 -1
- package/src/duckdb/src/function/cast/bit_cast.cpp +34 -2
- package/src/duckdb/src/function/cast/blob_cast.cpp +3 -0
- package/src/duckdb/src/function/cast/numeric_casts.cpp +2 -0
- package/src/duckdb/src/function/function.cpp +3 -1
- package/src/duckdb/src/function/pragma/pragma_queries.cpp +5 -0
- package/src/duckdb/src/function/scalar/compressed_materialization/compress_integral.cpp +212 -0
- package/src/duckdb/src/function/scalar/compressed_materialization/compress_string.cpp +249 -0
- package/src/duckdb/src/function/scalar/compressed_materialization_functions.cpp +29 -0
- package/src/duckdb/src/function/scalar/list/list_resize.cpp +162 -0
- package/src/duckdb/src/function/scalar/nested_functions.cpp +1 -0
- package/src/duckdb/src/function/scalar/string/like.cpp +12 -4
- package/src/duckdb/src/function/scalar/system/aggregate_export.cpp +12 -5
- package/src/duckdb/src/function/table/arrow.cpp +19 -0
- package/src/duckdb/src/function/table/arrow_conversion.cpp +35 -1
- package/src/duckdb/src/function/table/copy_csv.cpp +8 -1
- package/src/duckdb/src/function/table/read_csv.cpp +100 -17
- package/src/duckdb/src/function/table/system/test_all_types.cpp +7 -0
- package/src/duckdb/src/function/table/system_functions.cpp +1 -0
- package/src/duckdb/src/function/table/table_scan.cpp +9 -0
- package/src/duckdb/src/function/table/version/pragma_version.cpp +46 -2
- package/src/duckdb/src/include/duckdb/common/adbc/adbc.hpp +1 -0
- package/src/duckdb/src/include/duckdb/common/allocator.hpp +2 -0
- package/src/duckdb/src/include/duckdb/common/bswap.hpp +42 -0
- package/src/duckdb/src/include/duckdb/common/dl.hpp +3 -1
- package/src/duckdb/src/include/duckdb/common/enum_util.hpp +616 -584
- package/src/duckdb/src/include/duckdb/common/enums/cte_materialize.hpp +21 -0
- package/src/duckdb/src/include/duckdb/common/enums/joinref_type.hpp +2 -1
- package/src/duckdb/src/include/duckdb/common/enums/logical_operator_type.hpp +2 -0
- package/src/duckdb/src/include/duckdb/common/enums/optimizer_type.hpp +2 -0
- package/src/duckdb/src/include/duckdb/common/enums/physical_operator_type.hpp +2 -0
- package/src/duckdb/src/include/duckdb/common/extra_operator_info.hpp +27 -0
- package/src/duckdb/src/include/duckdb/common/extra_type_info.hpp +219 -0
- package/src/duckdb/src/include/duckdb/common/file_system.hpp +2 -0
- package/src/duckdb/src/include/duckdb/common/hive_partitioning.hpp +1 -1
- package/src/duckdb/src/include/duckdb/common/multi_file_reader.hpp +6 -4
- package/src/duckdb/src/include/duckdb/common/multi_file_reader_options.hpp +10 -42
- package/src/duckdb/src/include/duckdb/common/mutex.hpp +3 -0
- package/src/duckdb/src/include/duckdb/common/opener_file_system.hpp +2 -2
- package/src/duckdb/src/include/duckdb/common/operator/cast_operators.hpp +43 -3
- package/src/duckdb/src/include/duckdb/common/operator/numeric_cast.hpp +10 -0
- package/src/duckdb/src/include/duckdb/common/radix.hpp +9 -20
- package/src/duckdb/src/include/duckdb/common/radix_partitioning.hpp +6 -21
- package/src/duckdb/src/include/duckdb/common/row_operations/row_operations.hpp +3 -3
- package/src/duckdb/src/include/duckdb/common/sort/partition_state.hpp +23 -8
- package/src/duckdb/src/include/duckdb/common/string_util.hpp +11 -0
- package/src/duckdb/src/include/duckdb/common/types/batched_data_collection.hpp +3 -1
- package/src/duckdb/src/include/duckdb/common/types/bit.hpp +81 -0
- package/src/duckdb/src/include/duckdb/common/types/column/column_data_allocator.hpp +1 -1
- package/src/duckdb/src/include/duckdb/common/types/column/column_data_collection.hpp +6 -1
- package/src/duckdb/src/include/duckdb/common/types/column/column_data_collection_segment.hpp +1 -1
- package/src/duckdb/src/include/duckdb/common/types/column/column_data_scan_states.hpp +3 -1
- package/src/duckdb/src/include/duckdb/common/types/data_chunk.hpp +1 -1
- package/src/duckdb/src/include/duckdb/common/types/date.hpp +7 -5
- package/src/duckdb/src/include/duckdb/common/types/list_segment.hpp +6 -8
- package/src/duckdb/src/include/duckdb/common/types/row/partitioned_tuple_data.hpp +5 -2
- package/src/duckdb/src/include/duckdb/common/types/row/tuple_data_collection.hpp +1 -0
- package/src/duckdb/src/include/duckdb/common/types/row/tuple_data_states.hpp +3 -0
- package/src/duckdb/src/include/duckdb/common/types/string_type.hpp +9 -0
- package/src/duckdb/src/include/duckdb/common/types/value.hpp +1 -0
- package/src/duckdb/src/include/duckdb/common/types.hpp +1 -15
- package/src/duckdb/src/include/duckdb/common/virtual_file_system.hpp +38 -97
- package/src/duckdb/src/include/duckdb/core_functions/aggregate/algebraic/corr.hpp +4 -4
- package/src/duckdb/src/include/duckdb/core_functions/aggregate/algebraic/covar.hpp +3 -1
- package/src/duckdb/src/include/duckdb/core_functions/aggregate/algebraic_functions.hpp +3 -1
- package/src/duckdb/src/include/duckdb/core_functions/aggregate/distributive_functions.hpp +3 -1
- package/src/duckdb/src/include/duckdb/core_functions/aggregate/holistic_functions.hpp +3 -1
- package/src/duckdb/src/include/duckdb/core_functions/aggregate/nested_functions.hpp +3 -1
- package/src/duckdb/src/include/duckdb/core_functions/aggregate/regression/regr_count.hpp +1 -0
- package/src/duckdb/src/include/duckdb/core_functions/aggregate/regression/regr_slope.hpp +3 -3
- package/src/duckdb/src/include/duckdb/core_functions/aggregate/regression_functions.hpp +3 -1
- package/src/duckdb/src/include/duckdb/core_functions/scalar/bit_functions.hpp +3 -1
- package/src/duckdb/src/include/duckdb/core_functions/scalar/blob_functions.hpp +3 -1
- package/src/duckdb/src/include/duckdb/core_functions/scalar/date_functions.hpp +31 -11
- package/src/duckdb/src/include/duckdb/core_functions/scalar/enum_functions.hpp +3 -1
- package/src/duckdb/src/include/duckdb/core_functions/scalar/generic_functions.hpp +3 -1
- package/src/duckdb/src/include/duckdb/core_functions/scalar/list_functions.hpp +3 -1
- package/src/duckdb/src/include/duckdb/core_functions/scalar/map_functions.hpp +3 -1
- package/src/duckdb/src/include/duckdb/core_functions/scalar/math_functions.hpp +3 -1
- package/src/duckdb/src/include/duckdb/core_functions/scalar/operators_functions.hpp +3 -1
- package/src/duckdb/src/include/duckdb/core_functions/scalar/random_functions.hpp +3 -1
- package/src/duckdb/src/include/duckdb/core_functions/scalar/string_functions.hpp +3 -1
- package/src/duckdb/src/include/duckdb/core_functions/scalar/struct_functions.hpp +3 -1
- package/src/duckdb/src/include/duckdb/core_functions/scalar/union_functions.hpp +3 -1
- package/src/duckdb/src/include/duckdb/execution/aggregate_hashtable.hpp +21 -3
- package/src/duckdb/src/include/duckdb/execution/executor.hpp +3 -0
- package/src/duckdb/src/include/duckdb/execution/index/art/art.hpp +4 -5
- package/src/duckdb/src/include/duckdb/execution/index/art/iterator.hpp +31 -27
- package/src/duckdb/src/include/duckdb/execution/index/art/leaf.hpp +6 -14
- package/src/duckdb/src/include/duckdb/execution/index/art/node.hpp +4 -10
- package/src/duckdb/src/include/duckdb/execution/index/art/node16.hpp +3 -6
- package/src/duckdb/src/include/duckdb/execution/index/art/node256.hpp +3 -6
- package/src/duckdb/src/include/duckdb/execution/index/art/node4.hpp +5 -8
- package/src/duckdb/src/include/duckdb/execution/index/art/node48.hpp +3 -6
- package/src/duckdb/src/include/duckdb/execution/index/art/prefix.hpp +63 -52
- package/src/duckdb/src/include/duckdb/execution/operator/join/physical_asof_join.hpp +3 -10
- package/src/duckdb/src/include/duckdb/execution/operator/join/physical_iejoin.hpp +1 -1
- package/src/duckdb/src/include/duckdb/execution/operator/join/physical_piecewise_merge_join.hpp +1 -1
- package/src/duckdb/src/include/duckdb/execution/operator/join/physical_range_join.hpp +12 -1
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/base_csv_reader.hpp +2 -2
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_line_info.hpp +4 -3
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_reader_options.hpp +8 -1
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_rejects_table.hpp +36 -0
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/parallel_csv_reader.hpp +1 -1
- package/src/duckdb/src/include/duckdb/execution/operator/scan/physical_column_data_scan.hpp +10 -0
- package/src/duckdb/src/include/duckdb/execution/operator/scan/physical_table_scan.hpp +5 -1
- package/src/duckdb/src/include/duckdb/execution/operator/set/physical_cte.hpp +62 -0
- package/src/duckdb/src/include/duckdb/execution/operator/set/physical_recursive_cte.hpp +8 -2
- package/src/duckdb/src/include/duckdb/execution/partitionable_hashtable.hpp +5 -1
- package/src/duckdb/src/include/duckdb/execution/physical_plan_generator.hpp +3 -0
- package/src/duckdb/src/include/duckdb/execution/radix_partitioned_hashtable.hpp +10 -3
- package/src/duckdb/src/include/duckdb/execution/window_segment_tree.hpp +51 -40
- package/src/duckdb/src/include/duckdb/function/aggregate_function.hpp +1 -1
- package/src/duckdb/src/include/duckdb/function/aggregate_state.hpp +2 -2
- package/src/duckdb/src/include/duckdb/function/built_in_functions.hpp +1 -0
- package/src/duckdb/src/include/duckdb/function/scalar/compressed_materialization_functions.hpp +49 -0
- package/src/duckdb/src/include/duckdb/function/scalar/list/contains_or_position.hpp +1 -1
- package/src/duckdb/src/include/duckdb/function/scalar/nested_functions.hpp +5 -0
- package/src/duckdb/src/include/duckdb/function/scalar/string_functions.hpp +2 -0
- package/src/duckdb/src/include/duckdb/function/table/system_functions.hpp +4 -0
- package/src/duckdb/src/include/duckdb/main/client_config.hpp +5 -0
- package/src/duckdb/src/include/duckdb/main/config.hpp +2 -0
- package/src/duckdb/src/include/duckdb/main/connection.hpp +1 -2
- package/src/duckdb/src/include/duckdb/main/extension/generated_extension_loader.hpp +22 -0
- package/src/duckdb/src/include/duckdb/main/extension_entries.hpp +2 -0
- package/src/duckdb/src/include/duckdb/main/relation/cross_product_relation.hpp +4 -1
- package/src/duckdb/src/include/duckdb/main/relation/join_relation.hpp +5 -2
- package/src/duckdb/src/include/duckdb/main/relation.hpp +4 -2
- package/src/duckdb/src/include/duckdb/main/settings.hpp +39 -1
- package/src/duckdb/src/include/duckdb/optimizer/column_binding_replacer.hpp +47 -0
- package/src/duckdb/src/include/duckdb/optimizer/compressed_materialization.hpp +132 -0
- package/src/duckdb/src/include/duckdb/optimizer/deliminator.hpp +13 -16
- package/src/duckdb/src/include/duckdb/optimizer/filter_pushdown.hpp +3 -0
- package/src/duckdb/src/include/duckdb/optimizer/join_order/cardinality_estimator.hpp +1 -1
- package/src/duckdb/src/include/duckdb/optimizer/join_order/estimated_properties.hpp +10 -1
- package/src/duckdb/src/include/duckdb/optimizer/join_order/join_order_optimizer.hpp +1 -1
- package/src/duckdb/src/include/duckdb/optimizer/join_order/join_relation.hpp +1 -1
- package/src/duckdb/src/include/duckdb/optimizer/join_order/query_graph.hpp +3 -0
- package/src/duckdb/src/include/duckdb/optimizer/matcher/set_matcher.hpp +13 -0
- package/src/duckdb/src/include/duckdb/optimizer/optimizer.hpp +3 -0
- package/src/duckdb/src/include/duckdb/optimizer/remove_duplicate_groups.hpp +40 -0
- package/src/duckdb/src/include/duckdb/optimizer/statistics_propagator.hpp +11 -3
- package/src/duckdb/src/include/duckdb/optimizer/topn_optimizer.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parallel/pipeline.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parallel/task_scheduler.hpp +5 -0
- package/src/duckdb/src/include/duckdb/parser/common_table_expression_info.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/expression/between_expression.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/expression/cast_expression.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/expression/collate_expression.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/expression/columnref_expression.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/expression/comparison_expression.hpp +3 -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 +3 -0
- package/src/duckdb/src/include/duckdb/parser/expression/lambda_expression.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/expression/positional_reference_expression.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/expression/window_expression.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/query_node/cte_node.hpp +54 -0
- package/src/duckdb/src/include/duckdb/parser/query_node/list.hpp +1 -0
- package/src/duckdb/src/include/duckdb/parser/query_node.hpp +2 -1
- package/src/duckdb/src/include/duckdb/parser/tableref/emptytableref.hpp +1 -0
- package/src/duckdb/src/include/duckdb/parser/tableref/joinref.hpp +1 -1
- package/src/duckdb/src/include/duckdb/parser/tableref/subqueryref.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/tokens.hpp +1 -0
- package/src/duckdb/src/include/duckdb/parser/transformer.hpp +15 -8
- package/src/duckdb/src/include/duckdb/planner/binder.hpp +12 -5
- package/src/duckdb/src/include/duckdb/planner/bound_tokens.hpp +1 -0
- package/src/duckdb/src/include/duckdb/planner/column_binding.hpp +4 -0
- package/src/duckdb/src/include/duckdb/planner/constraints/bound_unique_constraint.hpp +3 -3
- package/src/duckdb/src/include/duckdb/planner/expression_binder/lateral_binder.hpp +0 -2
- package/src/duckdb/src/include/duckdb/planner/logical_tokens.hpp +1 -0
- package/src/duckdb/src/include/duckdb/planner/operator/list.hpp +2 -1
- package/src/duckdb/src/include/duckdb/planner/operator/logical_comparison_join.hpp +5 -5
- package/src/duckdb/src/include/duckdb/planner/operator/logical_cteref.hpp +7 -2
- package/src/duckdb/src/include/duckdb/planner/operator/logical_dependent_join.hpp +43 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_get.hpp +4 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_materialized_cte.hpp +49 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_recursive_cte.hpp +5 -4
- package/src/duckdb/src/include/duckdb/planner/query_node/bound_cte_node.hpp +44 -0
- package/src/duckdb/src/include/duckdb/planner/query_node/list.hpp +1 -0
- package/src/duckdb/src/include/duckdb/planner/subquery/flatten_dependent_join.hpp +2 -2
- package/src/duckdb/src/include/duckdb/planner/subquery/has_correlated_expressions.hpp +4 -1
- package/src/duckdb/src/include/duckdb/planner/subquery/recursive_dependent_join_planner.hpp +31 -0
- package/src/duckdb/src/include/duckdb/planner/subquery/rewrite_correlated_expressions.hpp +8 -2
- package/src/duckdb/src/include/duckdb/planner/tableref/bound_cteref.hpp +5 -2
- package/src/duckdb/src/include/duckdb/storage/arena_allocator.hpp +1 -1
- package/src/duckdb/src/include/duckdb/storage/block_manager.hpp +3 -3
- package/src/duckdb/src/include/duckdb/storage/data_table.hpp +1 -1
- package/src/duckdb/src/include/duckdb/storage/object_cache.hpp +22 -0
- package/src/duckdb/src/include/duckdb/storage/single_file_block_manager.hpp +2 -0
- package/src/duckdb/src/include/duckdb/storage/statistics/string_stats.hpp +4 -0
- package/src/duckdb/src/include/duckdb/storage/table/chunk_info.hpp +3 -0
- package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +3 -2
- package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +1 -3
- package/src/duckdb/src/include/duckdb/transaction/local_storage.hpp +2 -3
- package/src/duckdb/src/include/duckdb.h +28 -0
- package/src/duckdb/src/main/capi/arrow-c.cpp +155 -1
- package/src/duckdb/src/main/capi/duckdb_value-c.cpp +1 -1
- package/src/duckdb/src/main/config.cpp +4 -0
- package/src/duckdb/src/main/database.cpp +1 -1
- package/src/duckdb/src/main/extension/extension_helper.cpp +93 -88
- package/src/duckdb/src/main/extension/extension_install.cpp +9 -0
- package/src/duckdb/src/main/extension/extension_load.cpp +10 -1
- package/src/duckdb/src/main/relation/cross_product_relation.cpp +4 -3
- package/src/duckdb/src/main/relation/join_relation.cpp +5 -5
- package/src/duckdb/src/main/relation.cpp +6 -5
- package/src/duckdb/src/main/settings/settings.cpp +79 -18
- package/src/duckdb/src/optimizer/column_binding_replacer.cpp +43 -0
- package/src/duckdb/src/optimizer/column_lifetime_analyzer.cpp +1 -2
- package/src/duckdb/src/optimizer/compressed_materialization/compress_aggregate.cpp +140 -0
- package/src/duckdb/src/optimizer/compressed_materialization/compress_distinct.cpp +42 -0
- package/src/duckdb/src/optimizer/compressed_materialization/compress_order.cpp +65 -0
- package/src/duckdb/src/optimizer/compressed_materialization.cpp +478 -0
- package/src/duckdb/src/optimizer/deliminator.cpp +176 -321
- package/src/duckdb/src/optimizer/filter_pushdown.cpp +9 -0
- package/src/duckdb/src/optimizer/join_order/estimated_properties.cpp +7 -0
- package/src/duckdb/src/optimizer/join_order/join_node.cpp +2 -2
- package/src/duckdb/src/optimizer/join_order/join_order_optimizer.cpp +113 -82
- package/src/duckdb/src/optimizer/join_order/join_relation_set.cpp +2 -6
- package/src/duckdb/src/optimizer/join_order/query_graph.cpp +22 -14
- package/src/duckdb/src/optimizer/optimizer.cpp +49 -14
- package/src/duckdb/src/optimizer/pushdown/pushdown_cross_product.cpp +5 -5
- package/src/duckdb/src/optimizer/pushdown/pushdown_get.cpp +0 -1
- package/src/duckdb/src/optimizer/remove_duplicate_groups.cpp +127 -0
- package/src/duckdb/src/optimizer/remove_unused_columns.cpp +4 -0
- package/src/duckdb/src/optimizer/rule/regex_optimizations.cpp +154 -15
- package/src/duckdb/src/optimizer/statistics/operator/propagate_join.cpp +65 -8
- package/src/duckdb/src/optimizer/statistics/operator/propagate_order.cpp +1 -1
- package/src/duckdb/src/optimizer/statistics_propagator.cpp +7 -5
- package/src/duckdb/src/optimizer/topn_optimizer.cpp +20 -10
- package/src/duckdb/src/parallel/executor.cpp +15 -0
- package/src/duckdb/src/parallel/task_scheduler.cpp +11 -2
- package/src/duckdb/src/parser/common_table_expression_info.cpp +2 -0
- package/src/duckdb/src/parser/expression/between_expression.cpp +3 -15
- package/src/duckdb/src/parser/expression/case_expression.cpp +0 -13
- package/src/duckdb/src/parser/expression/cast_expression.cpp +3 -14
- package/src/duckdb/src/parser/expression/collate_expression.cpp +3 -13
- package/src/duckdb/src/parser/expression/columnref_expression.cpp +3 -12
- package/src/duckdb/src/parser/expression/comparison_expression.cpp +3 -13
- package/src/duckdb/src/parser/expression/conjunction_expression.cpp +0 -12
- package/src/duckdb/src/parser/expression/constant_expression.cpp +3 -11
- package/src/duckdb/src/parser/expression/default_expression.cpp +0 -4
- package/src/duckdb/src/parser/expression/function_expression.cpp +3 -32
- package/src/duckdb/src/parser/expression/lambda_expression.cpp +4 -14
- package/src/duckdb/src/parser/expression/operator_expression.cpp +0 -12
- package/src/duckdb/src/parser/expression/parameter_expression.cpp +0 -12
- package/src/duckdb/src/parser/expression/positional_reference_expression.cpp +4 -11
- package/src/duckdb/src/parser/expression/star_expression.cpp +0 -19
- package/src/duckdb/src/parser/expression/subquery_expression.cpp +0 -18
- package/src/duckdb/src/parser/expression/window_expression.cpp +3 -39
- package/src/duckdb/src/parser/parsed_expression.cpp +0 -70
- package/src/duckdb/src/parser/parsed_expression_iterator.cpp +7 -0
- package/src/duckdb/src/parser/parser.cpp +8 -2
- package/src/duckdb/src/parser/query_node/cte_node.cpp +58 -0
- package/src/duckdb/src/parser/query_node/recursive_cte_node.cpp +0 -19
- package/src/duckdb/src/parser/query_node/select_node.cpp +0 -29
- package/src/duckdb/src/parser/query_node/set_operation_node.cpp +0 -15
- package/src/duckdb/src/parser/query_node.cpp +15 -37
- package/src/duckdb/src/parser/result_modifier.cpp +0 -74
- package/src/duckdb/src/parser/tableref/basetableref.cpp +0 -19
- package/src/duckdb/src/parser/tableref/emptytableref.cpp +0 -4
- package/src/duckdb/src/parser/tableref/expressionlistref.cpp +0 -15
- package/src/duckdb/src/parser/tableref/joinref.cpp +3 -23
- package/src/duckdb/src/parser/tableref/pivotref.cpp +0 -23
- package/src/duckdb/src/parser/tableref/subqueryref.cpp +3 -13
- package/src/duckdb/src/parser/tableref/table_function.cpp +0 -15
- package/src/duckdb/src/parser/tableref.cpp +0 -44
- package/src/duckdb/src/parser/transform/expression/transform_constant.cpp +55 -3
- package/src/duckdb/src/parser/transform/expression/transform_expression.cpp +2 -0
- package/src/duckdb/src/parser/transform/expression/transform_multi_assign_reference.cpp +44 -0
- package/src/duckdb/src/parser/transform/helpers/transform_cte.cpp +19 -1
- package/src/duckdb/src/parser/transform/statement/transform_copy.cpp +13 -0
- package/src/duckdb/src/parser/transform/statement/transform_delete.cpp +6 -1
- package/src/duckdb/src/parser/transform/statement/transform_insert.cpp +6 -1
- package/src/duckdb/src/parser/transform/statement/transform_pivot_stmt.cpp +7 -2
- package/src/duckdb/src/parser/transform/statement/transform_pragma.cpp +14 -11
- package/src/duckdb/src/parser/transform/statement/transform_select_node.cpp +11 -2
- package/src/duckdb/src/parser/transform/statement/transform_update.cpp +6 -1
- package/src/duckdb/src/parser/transformer.cpp +15 -0
- package/src/duckdb/src/planner/binder/query_node/bind_cte_node.cpp +64 -0
- package/src/duckdb/src/planner/binder/query_node/plan_cte_node.cpp +26 -0
- package/src/duckdb/src/planner/binder/query_node/plan_recursive_cte_node.cpp +5 -5
- package/src/duckdb/src/planner/binder/query_node/plan_setop.cpp +4 -4
- package/src/duckdb/src/planner/binder/query_node/plan_subquery.cpp +32 -29
- package/src/duckdb/src/planner/binder/statement/bind_create_table.cpp +5 -4
- package/src/duckdb/src/planner/binder/tableref/bind_basetableref.cpp +11 -2
- package/src/duckdb/src/planner/binder/tableref/bind_joinref.cpp +32 -5
- package/src/duckdb/src/planner/binder/tableref/bind_pivot.cpp +116 -49
- package/src/duckdb/src/planner/binder/tableref/plan_cteref.cpp +1 -1
- package/src/duckdb/src/planner/binder/tableref/plan_joinref.cpp +64 -26
- package/src/duckdb/src/planner/binder/tableref/plan_subqueryref.cpp +3 -3
- package/src/duckdb/src/planner/binder.cpp +44 -31
- package/src/duckdb/src/planner/expression/bound_aggregate_expression.cpp +1 -1
- package/src/duckdb/src/planner/expression_binder/lateral_binder.cpp +4 -31
- package/src/duckdb/src/planner/expression_binder.cpp +3 -0
- package/src/duckdb/src/planner/expression_iterator.cpp +6 -0
- package/src/duckdb/src/planner/logical_operator.cpp +5 -0
- package/src/duckdb/src/planner/logical_operator_visitor.cpp +2 -0
- package/src/duckdb/src/planner/operator/logical_cteref.cpp +3 -1
- package/src/duckdb/src/planner/operator/logical_dependent_join.cpp +26 -0
- package/src/duckdb/src/planner/operator/logical_get.cpp +9 -4
- package/src/duckdb/src/planner/operator/logical_materialized_cte.cpp +21 -0
- package/src/duckdb/src/planner/subquery/flatten_dependent_join.cpp +90 -38
- package/src/duckdb/src/planner/subquery/has_correlated_expressions.cpp +22 -7
- package/src/duckdb/src/planner/subquery/rewrite_correlated_expressions.cpp +65 -7
- package/src/duckdb/src/storage/arena_allocator.cpp +1 -2
- package/src/duckdb/src/storage/buffer/block_manager.cpp +3 -0
- package/src/duckdb/src/storage/checkpoint_manager.cpp +3 -0
- package/src/duckdb/src/storage/compression/rle.cpp +0 -1
- package/src/duckdb/src/storage/data_table.cpp +1 -1
- package/src/duckdb/src/storage/local_storage.cpp +3 -3
- package/src/duckdb/src/storage/serialization/serialize_parsed_expression.cpp +340 -0
- package/src/duckdb/src/storage/serialization/serialize_query_node.cpp +122 -0
- package/src/duckdb/src/storage/serialization/serialize_result_modifier.cpp +86 -0
- package/src/duckdb/src/storage/serialization/serialize_tableref.cpp +166 -0
- package/src/duckdb/src/storage/serialization/serialize_types.cpp +127 -0
- package/src/duckdb/src/storage/single_file_block_manager.cpp +23 -0
- package/src/duckdb/src/storage/statistics/string_stats.cpp +21 -2
- package/src/duckdb/src/storage/storage_info.cpp +1 -1
- package/src/duckdb/src/storage/table/chunk_info.cpp +17 -0
- package/src/duckdb/src/storage/table/row_group.cpp +25 -9
- package/src/duckdb/src/storage/table/row_group_collection.cpp +19 -18
- package/src/duckdb/third_party/concurrentqueue/concurrentqueue.h +2 -2
- package/src/duckdb/third_party/concurrentqueue/lightweightsemaphore.h +76 -0
- package/src/duckdb/third_party/fast_float/fast_float/fast_float.h +2 -0
- package/src/duckdb/third_party/httplib/httplib.hpp +10 -1
- package/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp +9 -0
- package/src/duckdb/third_party/libpg_query/include/parser/gram.hpp +2 -1
- package/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +12487 -12331
- package/src/duckdb/ub_extension_icu_third_party_icu_i18n.cpp +6 -6
- package/src/duckdb/ub_src_common.cpp +2 -0
- package/src/duckdb/ub_src_execution_index_art.cpp +0 -2
- package/src/duckdb/ub_src_execution_operator_persistent.cpp +2 -0
- package/src/duckdb/ub_src_execution_operator_set.cpp +2 -0
- package/src/duckdb/ub_src_execution_physical_plan.cpp +2 -0
- package/src/duckdb/ub_src_function_scalar.cpp +2 -0
- package/src/duckdb/ub_src_function_scalar_compressed_materialization.cpp +4 -0
- package/src/duckdb/ub_src_function_scalar_list.cpp +2 -0
- package/src/duckdb/ub_src_optimizer.cpp +6 -0
- package/src/duckdb/ub_src_optimizer_compressed_materialization.cpp +6 -0
- package/src/duckdb/ub_src_optimizer_statistics_expression.cpp +0 -2
- package/src/duckdb/ub_src_parser_query_node.cpp +2 -0
- package/src/duckdb/ub_src_parser_transform_expression.cpp +2 -0
- package/src/duckdb/ub_src_planner_binder_query_node.cpp +4 -0
- package/src/duckdb/ub_src_planner_operator.cpp +4 -0
- package/src/duckdb/ub_src_storage_serialization.cpp +10 -0
- package/src/statement.cpp +10 -3
- package/test/columns.test.ts +24 -1
- package/test/test_all_types.test.ts +234 -0
- package/tsconfig.json +1 -0
- package/src/duckdb/src/execution/index/art/prefix_segment.cpp +0 -42
- package/src/duckdb/src/include/duckdb/execution/index/art/prefix_segment.hpp +0 -40
- package/src/duckdb/src/optimizer/statistics/expression/propagate_and_compress.cpp +0 -118
@@ -18,6 +18,7 @@
|
|
18
18
|
#include "duckdb/planner/tableref/bound_pivotref.hpp"
|
19
19
|
#include "duckdb/planner/expression/bound_aggregate_expression.hpp"
|
20
20
|
#include "duckdb/main/client_config.hpp"
|
21
|
+
#include "duckdb/catalog/catalog_entry/aggregate_function_catalog_entry.hpp"
|
21
22
|
|
22
23
|
namespace duckdb {
|
23
24
|
|
@@ -66,18 +67,10 @@ static void ExtractPivotExpressions(ParsedExpression &expr, case_insensitive_set
|
|
66
67
|
expr, [&](ParsedExpression &child) { ExtractPivotExpressions(child, handled_columns); });
|
67
68
|
}
|
68
69
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
vector<string> internal_aggregate_names;
|
74
|
-
};
|
75
|
-
|
76
|
-
static unique_ptr<SelectNode> PivotInitialAggregate(PivotBindState &bind_state, PivotRef &ref,
|
77
|
-
vector<unique_ptr<ParsedExpression>> all_columns,
|
78
|
-
const case_insensitive_set_t &handled_columns) {
|
79
|
-
auto subquery_stage1 = make_uniq<SelectNode>();
|
80
|
-
subquery_stage1->from_table = std::move(ref.source);
|
70
|
+
static unique_ptr<SelectNode> ConstructInitialGrouping(PivotRef &ref, vector<unique_ptr<ParsedExpression>> all_columns,
|
71
|
+
const case_insensitive_set_t &handled_columns) {
|
72
|
+
auto subquery = make_uniq<SelectNode>();
|
73
|
+
subquery->from_table = std::move(ref.source);
|
81
74
|
if (ref.groups.empty()) {
|
82
75
|
// if rows are not specified any columns that are not pivoted/aggregated on are added to the GROUP BY clause
|
83
76
|
for (auto &entry : all_columns) {
|
@@ -87,19 +80,74 @@ static unique_ptr<SelectNode> PivotInitialAggregate(PivotBindState &bind_state,
|
|
87
80
|
auto &columnref = entry->Cast<ColumnRefExpression>();
|
88
81
|
if (handled_columns.find(columnref.GetColumnName()) == handled_columns.end()) {
|
89
82
|
// not handled - add to grouping set
|
90
|
-
|
91
|
-
make_uniq<ConstantExpression>(Value::INTEGER(
|
92
|
-
|
83
|
+
subquery->groups.group_expressions.push_back(
|
84
|
+
make_uniq<ConstantExpression>(Value::INTEGER(subquery->select_list.size() + 1)));
|
85
|
+
subquery->select_list.push_back(make_uniq<ColumnRefExpression>(columnref.GetColumnName()));
|
93
86
|
}
|
94
87
|
}
|
95
88
|
} else {
|
96
89
|
// if rows are specified only the columns mentioned in rows are added as groups
|
97
90
|
for (auto &row : ref.groups) {
|
98
|
-
|
99
|
-
make_uniq<ConstantExpression>(Value::INTEGER(
|
100
|
-
|
91
|
+
subquery->groups.group_expressions.push_back(
|
92
|
+
make_uniq<ConstantExpression>(Value::INTEGER(subquery->select_list.size() + 1)));
|
93
|
+
subquery->select_list.push_back(make_uniq<ColumnRefExpression>(row));
|
101
94
|
}
|
102
95
|
}
|
96
|
+
return subquery;
|
97
|
+
}
|
98
|
+
|
99
|
+
static unique_ptr<SelectNode> PivotFilteredAggregate(PivotRef &ref, vector<unique_ptr<ParsedExpression>> all_columns,
|
100
|
+
const case_insensitive_set_t &handled_columns,
|
101
|
+
vector<PivotValueElement> pivot_values) {
|
102
|
+
auto subquery = ConstructInitialGrouping(ref, std::move(all_columns), handled_columns);
|
103
|
+
|
104
|
+
// push the filtered aggregates
|
105
|
+
for (auto &pivot_value : pivot_values) {
|
106
|
+
unique_ptr<ParsedExpression> filter;
|
107
|
+
idx_t pivot_value_idx = 0;
|
108
|
+
for (auto &pivot_column : ref.pivots) {
|
109
|
+
for (auto &pivot_expr : pivot_column.pivot_expressions) {
|
110
|
+
auto column_ref = make_uniq<CastExpression>(LogicalType::VARCHAR, pivot_expr->Copy());
|
111
|
+
auto constant_value = make_uniq<ConstantExpression>(pivot_value.values[pivot_value_idx++]);
|
112
|
+
auto comp_expr = make_uniq<ComparisonExpression>(ExpressionType::COMPARE_NOT_DISTINCT_FROM,
|
113
|
+
std::move(column_ref), std::move(constant_value));
|
114
|
+
if (filter) {
|
115
|
+
filter = make_uniq<ConjunctionExpression>(ExpressionType::CONJUNCTION_AND, std::move(filter),
|
116
|
+
std::move(comp_expr));
|
117
|
+
} else {
|
118
|
+
filter = std::move(comp_expr);
|
119
|
+
}
|
120
|
+
}
|
121
|
+
}
|
122
|
+
for (auto &aggregate : ref.aggregates) {
|
123
|
+
auto copied_aggr = aggregate->Copy();
|
124
|
+
auto &aggr = copied_aggr->Cast<FunctionExpression>();
|
125
|
+
aggr.filter = filter->Copy();
|
126
|
+
auto &aggr_name = aggregate->alias;
|
127
|
+
auto name = pivot_value.name;
|
128
|
+
if (ref.aggregates.size() > 1 || !aggr_name.empty()) {
|
129
|
+
// if there are multiple aggregates specified we add the name of the aggregate as well
|
130
|
+
name += "_" + (aggr_name.empty() ? aggregate->GetName() : aggr_name);
|
131
|
+
}
|
132
|
+
aggr.alias = name;
|
133
|
+
subquery->select_list.push_back(std::move(copied_aggr));
|
134
|
+
}
|
135
|
+
}
|
136
|
+
return subquery;
|
137
|
+
}
|
138
|
+
|
139
|
+
struct PivotBindState {
|
140
|
+
vector<string> internal_group_names;
|
141
|
+
vector<string> group_names;
|
142
|
+
vector<string> aggregate_names;
|
143
|
+
vector<string> internal_aggregate_names;
|
144
|
+
};
|
145
|
+
|
146
|
+
static unique_ptr<SelectNode> PivotInitialAggregate(PivotBindState &bind_state, PivotRef &ref,
|
147
|
+
vector<unique_ptr<ParsedExpression>> all_columns,
|
148
|
+
const case_insensitive_set_t &handled_columns) {
|
149
|
+
auto subquery_stage1 = ConstructInitialGrouping(ref, std::move(all_columns), handled_columns);
|
150
|
+
|
103
151
|
idx_t group_count = 0;
|
104
152
|
for (auto &expr : subquery_stage1->select_list) {
|
105
153
|
bind_state.group_names.push_back(expr->GetName());
|
@@ -134,6 +182,15 @@ static unique_ptr<SelectNode> PivotInitialAggregate(PivotBindState &bind_state,
|
|
134
182
|
return subquery_stage1;
|
135
183
|
}
|
136
184
|
|
185
|
+
unique_ptr<ParsedExpression> ConstructPivotExpression(unique_ptr<ParsedExpression> pivot_expr) {
|
186
|
+
auto cast = make_uniq<CastExpression>(LogicalType::VARCHAR, std::move(pivot_expr));
|
187
|
+
vector<unique_ptr<ParsedExpression>> coalesce_children;
|
188
|
+
coalesce_children.push_back(std::move(cast));
|
189
|
+
coalesce_children.push_back(make_uniq<ConstantExpression>(Value("NULL")));
|
190
|
+
auto coalesce = make_uniq<OperatorExpression>(ExpressionType::OPERATOR_COALESCE, std::move(coalesce_children));
|
191
|
+
return std::move(coalesce);
|
192
|
+
}
|
193
|
+
|
137
194
|
static unique_ptr<SelectNode> PivotListAggregate(PivotBindState &bind_state, PivotRef &ref,
|
138
195
|
unique_ptr<SelectNode> subquery_stage1) {
|
139
196
|
auto subquery_stage2 = make_uniq<SelectNode>();
|
@@ -166,13 +223,7 @@ static unique_ptr<SelectNode> PivotListAggregate(PivotBindState &bind_state, Piv
|
|
166
223
|
for (auto &pivot : ref.pivots) {
|
167
224
|
for (auto &pivot_expr : pivot.pivot_expressions) {
|
168
225
|
// coalesce(pivot::VARCHAR, 'NULL')
|
169
|
-
auto
|
170
|
-
vector<unique_ptr<ParsedExpression>> coalesce_children;
|
171
|
-
coalesce_children.push_back(std::move(cast));
|
172
|
-
coalesce_children.push_back(make_uniq<ConstantExpression>(Value("NULL")));
|
173
|
-
auto coalesce =
|
174
|
-
make_uniq<OperatorExpression>(ExpressionType::OPERATOR_COALESCE, std::move(coalesce_children));
|
175
|
-
|
226
|
+
auto coalesce = ConstructPivotExpression(std::move(pivot_expr));
|
176
227
|
if (!expr) {
|
177
228
|
expr = std::move(coalesce);
|
178
229
|
} else {
|
@@ -250,9 +301,8 @@ unique_ptr<BoundTableRef> Binder::BindBoundPivot(PivotRef &ref) {
|
|
250
301
|
auto &aggregates = result->bound_pivot.aggregates;
|
251
302
|
ExtractPivotAggregates(*result->child, aggregates);
|
252
303
|
if (aggregates.size() != ref.bound_aggregate_names.size()) {
|
253
|
-
throw
|
254
|
-
|
255
|
-
ref.bound_aggregate_names.size(), aggregates.size());
|
304
|
+
throw InternalException("Pivot aggregate count mismatch (expected %llu, found %llu)",
|
305
|
+
ref.bound_aggregate_names.size(), aggregates.size());
|
256
306
|
}
|
257
307
|
|
258
308
|
vector<string> child_names;
|
@@ -313,6 +363,10 @@ unique_ptr<SelectNode> Binder::BindPivot(PivotRef &ref, vector<unique_ptr<Parsed
|
|
313
363
|
if (aggr->IsWindow()) {
|
314
364
|
throw BinderException(FormatError(*aggr, "Pivot expression cannot contain window functions"));
|
315
365
|
}
|
366
|
+
// bind the function as an aggregate to ensure it is an aggregate and not a scalar function
|
367
|
+
auto &aggr_function = aggr->Cast<FunctionExpression>();
|
368
|
+
(void)Catalog::GetEntry<AggregateFunctionCatalogEntry>(context, aggr_function.catalog, aggr_function.schema,
|
369
|
+
aggr_function.function_name);
|
316
370
|
ExtractPivotExpressions(*aggr, handled_columns);
|
317
371
|
}
|
318
372
|
|
@@ -361,40 +415,53 @@ unique_ptr<SelectNode> Binder::BindPivot(PivotRef &ref, vector<unique_ptr<Parsed
|
|
361
415
|
pivots.insert(val);
|
362
416
|
}
|
363
417
|
}
|
364
|
-
auto
|
418
|
+
auto &client_config = ClientConfig::GetConfig(context);
|
419
|
+
auto pivot_limit = client_config.pivot_limit;
|
365
420
|
if (total_pivots >= pivot_limit) {
|
366
421
|
throw BinderException("Pivot column limit of %llu exceeded. Use SET pivot_limit=X to increase the limit.",
|
367
|
-
|
422
|
+
client_config.pivot_limit);
|
368
423
|
}
|
369
424
|
|
370
425
|
// construct the required pivot values recursively
|
371
426
|
vector<PivotValueElement> pivot_values;
|
372
427
|
ConstructPivots(ref, pivot_values);
|
373
428
|
|
429
|
+
unique_ptr<SelectNode> pivot_node;
|
374
430
|
// pivots have three components
|
375
431
|
// - the pivots (i.e. future column names)
|
376
432
|
// - the groups (i.e. the future row names
|
377
433
|
// - the aggregates (i.e. the values of the pivot columns)
|
378
434
|
|
379
|
-
// executing a pivot statement
|
380
|
-
// 1)
|
381
|
-
//
|
382
|
-
//
|
383
|
-
//
|
384
|
-
//
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
435
|
+
// we have two ways of executing a pivot statement
|
436
|
+
// (1) the straightforward manner of filtered aggregates SUM(..) FILTER (pivot_value=X)
|
437
|
+
// (2) computing the aggregates once, then using LIST to group the aggregates together with the PIVOT operator
|
438
|
+
// -> filtered aggregates are faster when there are FEW pivot values
|
439
|
+
// -> LIST is faster when there are MANY pivot values
|
440
|
+
// we switch dynamically based on the number of pivots to compute
|
441
|
+
if (pivot_values.size() <= client_config.pivot_filter_threshold) {
|
442
|
+
// use a set of filtered aggregates
|
443
|
+
pivot_node = PivotFilteredAggregate(ref, std::move(all_columns), handled_columns, std::move(pivot_values));
|
444
|
+
} else {
|
445
|
+
// executing a pivot statement happens in three stages
|
446
|
+
// 1) execute the query "SELECT {groups}, {pivots}, {aggregates} FROM {from_clause} GROUP BY {groups}, {pivots}
|
447
|
+
// this computes all values that are required in the final result, but not yet in the correct orientation
|
448
|
+
// 2) execute the query "SELECT {groups}, LIST({pivots}), LIST({aggregates}) FROM [Q1] GROUP BY {groups}
|
449
|
+
// this pushes all pivots and aggregates that belong to a specific group together in an aligned manner
|
450
|
+
// 3) push a PIVOT operator, that performs the actual pivoting of the values into the different columns
|
451
|
+
|
452
|
+
PivotBindState bind_state;
|
453
|
+
// Pivot Stage 1
|
454
|
+
// SELECT {groups}, {pivots}, {aggregates} FROM {from_clause} GROUP BY {groups}, {pivots}
|
455
|
+
auto subquery_stage1 = PivotInitialAggregate(bind_state, ref, std::move(all_columns), handled_columns);
|
456
|
+
|
457
|
+
// Pivot stage 2
|
458
|
+
// SELECT {groups}, LIST({pivots}), LIST({aggregates}) FROM [Q1] GROUP BY {groups}
|
459
|
+
auto subquery_stage2 = PivotListAggregate(bind_state, ref, std::move(subquery_stage1));
|
460
|
+
|
461
|
+
// Pivot stage 3
|
462
|
+
// construct the final pivot operator
|
463
|
+
pivot_node = PivotFinalOperator(bind_state, ref, std::move(subquery_stage2), std::move(pivot_values));
|
464
|
+
}
|
398
465
|
return pivot_node;
|
399
466
|
}
|
400
467
|
|
@@ -13,7 +13,7 @@ unique_ptr<LogicalOperator> Binder::CreatePlan(BoundCTERef &ref) {
|
|
13
13
|
types.push_back(type);
|
14
14
|
}
|
15
15
|
|
16
|
-
return make_uniq<LogicalCTERef>(index, ref.cte_index, types, ref.bound_columns);
|
16
|
+
return make_uniq<LogicalCTERef>(index, ref.cte_index, types, ref.bound_columns, ref.materialized_cte);
|
17
17
|
}
|
18
18
|
|
19
19
|
} // namespace duckdb
|
@@ -10,11 +10,14 @@
|
|
10
10
|
#include "duckdb/planner/operator/logical_asof_join.hpp"
|
11
11
|
#include "duckdb/planner/operator/logical_comparison_join.hpp"
|
12
12
|
#include "duckdb/planner/operator/logical_cross_product.hpp"
|
13
|
+
#include "duckdb/planner/operator/logical_dependent_join.hpp"
|
13
14
|
#include "duckdb/planner/operator/logical_filter.hpp"
|
14
15
|
#include "duckdb/planner/operator/logical_positional_join.hpp"
|
15
16
|
#include "duckdb/planner/tableref/bound_joinref.hpp"
|
16
17
|
#include "duckdb/main/client_context.hpp"
|
17
18
|
#include "duckdb/planner/expression_binder/lateral_binder.hpp"
|
19
|
+
#include "duckdb/planner/subquery/recursive_dependent_join_planner.hpp"
|
20
|
+
#include "duckdb/execution/expression_executor.hpp"
|
18
21
|
|
19
22
|
namespace duckdb {
|
20
23
|
|
@@ -44,13 +47,11 @@ static bool CreateJoinCondition(Expression &expr, const unordered_set<idx_t> &le
|
|
44
47
|
return false;
|
45
48
|
}
|
46
49
|
|
47
|
-
void LogicalComparisonJoin::ExtractJoinConditions(
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
vector<JoinCondition> &conditions,
|
53
|
-
vector<unique_ptr<Expression>> &arbitrary_expressions) {
|
50
|
+
void LogicalComparisonJoin::ExtractJoinConditions(
|
51
|
+
ClientContext &context, JoinType type, unique_ptr<LogicalOperator> &left_child,
|
52
|
+
unique_ptr<LogicalOperator> &right_child, const unordered_set<idx_t> &left_bindings,
|
53
|
+
const unordered_set<idx_t> &right_bindings, vector<unique_ptr<Expression>> &expressions,
|
54
|
+
vector<JoinCondition> &conditions, vector<unique_ptr<Expression>> &arbitrary_expressions) {
|
54
55
|
for (auto &expr : expressions) {
|
55
56
|
auto total_side = JoinSide::GetJoinSide(*expr, left_bindings, right_bindings);
|
56
57
|
if (total_side != JoinSide::BOTH) {
|
@@ -68,6 +69,15 @@ void LogicalComparisonJoin::ExtractJoinConditions(JoinType type, unique_ptr<Logi
|
|
68
69
|
filter.expressions.push_back(std::move(expr));
|
69
70
|
continue;
|
70
71
|
}
|
72
|
+
// if the join is a LEFT JOIN and the join expression constantly evaluates to TRUE,
|
73
|
+
// then we do not add it to the arbitrary expressions
|
74
|
+
if (type == JoinType::LEFT && expr->IsFoldable()) {
|
75
|
+
Value result;
|
76
|
+
ExpressionExecutor::TryEvaluateScalar(context, *expr, result);
|
77
|
+
if (!result.IsNull() && result == Value(true)) {
|
78
|
+
continue;
|
79
|
+
}
|
80
|
+
}
|
71
81
|
} else if ((expr->type >= ExpressionType::COMPARE_EQUAL &&
|
72
82
|
expr->type <= ExpressionType::COMPARE_GREATERTHANOREQUALTO) ||
|
73
83
|
expr->type == ExpressionType::COMPARE_DISTINCT_FROM ||
|
@@ -82,7 +92,8 @@ void LogicalComparisonJoin::ExtractJoinConditions(JoinType type, unique_ptr<Logi
|
|
82
92
|
}
|
83
93
|
}
|
84
94
|
|
85
|
-
void LogicalComparisonJoin::ExtractJoinConditions(
|
95
|
+
void LogicalComparisonJoin::ExtractJoinConditions(ClientContext &context, JoinType type,
|
96
|
+
unique_ptr<LogicalOperator> &left_child,
|
86
97
|
unique_ptr<LogicalOperator> &right_child,
|
87
98
|
vector<unique_ptr<Expression>> &expressions,
|
88
99
|
vector<JoinCondition> &conditions,
|
@@ -90,11 +101,12 @@ void LogicalComparisonJoin::ExtractJoinConditions(JoinType type, unique_ptr<Logi
|
|
90
101
|
unordered_set<idx_t> left_bindings, right_bindings;
|
91
102
|
LogicalJoin::GetTableReferences(*left_child, left_bindings);
|
92
103
|
LogicalJoin::GetTableReferences(*right_child, right_bindings);
|
93
|
-
return ExtractJoinConditions(type, left_child, right_child, left_bindings, right_bindings, expressions,
|
94
|
-
arbitrary_expressions);
|
104
|
+
return ExtractJoinConditions(context, type, left_child, right_child, left_bindings, right_bindings, expressions,
|
105
|
+
conditions, arbitrary_expressions);
|
95
106
|
}
|
96
107
|
|
97
|
-
void LogicalComparisonJoin::ExtractJoinConditions(
|
108
|
+
void LogicalComparisonJoin::ExtractJoinConditions(ClientContext &context, JoinType type,
|
109
|
+
unique_ptr<LogicalOperator> &left_child,
|
98
110
|
unique_ptr<LogicalOperator> &right_child,
|
99
111
|
unique_ptr<Expression> condition, vector<JoinCondition> &conditions,
|
100
112
|
vector<unique_ptr<Expression>> &arbitrary_expressions) {
|
@@ -102,10 +114,12 @@ void LogicalComparisonJoin::ExtractJoinConditions(JoinType type, unique_ptr<Logi
|
|
102
114
|
vector<unique_ptr<Expression>> expressions;
|
103
115
|
expressions.push_back(std::move(condition));
|
104
116
|
LogicalFilter::SplitPredicates(expressions);
|
105
|
-
return ExtractJoinConditions(type, left_child, right_child, expressions, conditions,
|
117
|
+
return ExtractJoinConditions(context, type, left_child, right_child, expressions, conditions,
|
118
|
+
arbitrary_expressions);
|
106
119
|
}
|
107
120
|
|
108
|
-
unique_ptr<LogicalOperator> LogicalComparisonJoin::CreateJoin(
|
121
|
+
unique_ptr<LogicalOperator> LogicalComparisonJoin::CreateJoin(ClientContext &context, JoinType type,
|
122
|
+
JoinRefType reftype,
|
109
123
|
unique_ptr<LogicalOperator> left_child,
|
110
124
|
unique_ptr<LogicalOperator> right_child,
|
111
125
|
vector<JoinCondition> conditions,
|
@@ -123,6 +137,9 @@ unique_ptr<LogicalOperator> LogicalComparisonJoin::CreateJoin(JoinType type, Joi
|
|
123
137
|
case ExpressionType::COMPARE_NOT_DISTINCT_FROM:
|
124
138
|
break;
|
125
139
|
case ExpressionType::COMPARE_GREATERTHANOREQUALTO:
|
140
|
+
case ExpressionType::COMPARE_GREATERTHAN:
|
141
|
+
case ExpressionType::COMPARE_LESSTHANOREQUALTO:
|
142
|
+
case ExpressionType::COMPARE_LESSTHAN:
|
126
143
|
if (asof_idx < conditions.size()) {
|
127
144
|
throw BinderException("Multiple ASOF JOIN inequalities");
|
128
145
|
}
|
@@ -216,29 +233,37 @@ static bool HasCorrelatedColumns(Expression &expression) {
|
|
216
233
|
return has_correlated_columns;
|
217
234
|
}
|
218
235
|
|
219
|
-
unique_ptr<LogicalOperator> LogicalComparisonJoin::CreateJoin(
|
236
|
+
unique_ptr<LogicalOperator> LogicalComparisonJoin::CreateJoin(ClientContext &context, JoinType type,
|
237
|
+
JoinRefType reftype,
|
220
238
|
unique_ptr<LogicalOperator> left_child,
|
221
239
|
unique_ptr<LogicalOperator> right_child,
|
222
240
|
unique_ptr<Expression> condition) {
|
223
241
|
vector<JoinCondition> conditions;
|
224
242
|
vector<unique_ptr<Expression>> arbitrary_expressions;
|
225
|
-
LogicalComparisonJoin::ExtractJoinConditions(type, left_child, right_child, std::move(condition),
|
226
|
-
arbitrary_expressions);
|
227
|
-
return LogicalComparisonJoin::CreateJoin(type, reftype, std::move(left_child), std::move(right_child),
|
243
|
+
LogicalComparisonJoin::ExtractJoinConditions(context, type, left_child, right_child, std::move(condition),
|
244
|
+
conditions, arbitrary_expressions);
|
245
|
+
return LogicalComparisonJoin::CreateJoin(context, type, reftype, std::move(left_child), std::move(right_child),
|
228
246
|
std::move(conditions), std::move(arbitrary_expressions));
|
229
247
|
}
|
230
248
|
|
231
249
|
unique_ptr<LogicalOperator> Binder::CreatePlan(BoundJoinRef &ref) {
|
250
|
+
auto old_is_outside_flattened = is_outside_flattened;
|
251
|
+
// Plan laterals from outermost to innermost
|
252
|
+
if (ref.lateral) {
|
253
|
+
// Set the flag to ensure that children do not flatten before the root
|
254
|
+
is_outside_flattened = false;
|
255
|
+
}
|
232
256
|
auto left = CreatePlan(*ref.left);
|
233
257
|
auto right = CreatePlan(*ref.right);
|
258
|
+
is_outside_flattened = old_is_outside_flattened;
|
259
|
+
|
260
|
+
// For joins, depth of the bindings will be one higher on the right because of the lateral binder
|
261
|
+
// If the current join does not have correlations between left and right, then the right bindings
|
262
|
+
// have depth 1 too high and can be reduced by 1 throughout
|
234
263
|
if (!ref.lateral && !ref.correlated_columns.empty()) {
|
235
|
-
// non-lateral join with correlated columns
|
236
|
-
// this happens if there is a join (or cross product) in a correlated subquery
|
237
|
-
// due to the lateral binder the expression depth of all correlated columns in the "ref.correlated_columns" set
|
238
|
-
// is 1 too high
|
239
|
-
// we reduce expression depth of all columns in the "ref.correlated_columns" set by 1
|
240
264
|
LateralBinder::ReduceExpressionDepth(*right, ref.correlated_columns);
|
241
265
|
}
|
266
|
+
|
242
267
|
if (ref.type == JoinType::RIGHT && ref.ref_type != JoinRefType::ASOF &&
|
243
268
|
ClientConfig::GetConfig(context).enable_optimizer) {
|
244
269
|
// we turn any right outer joins into left outer joins for optimization purposes
|
@@ -247,9 +272,22 @@ unique_ptr<LogicalOperator> Binder::CreatePlan(BoundJoinRef &ref) {
|
|
247
272
|
std::swap(left, right);
|
248
273
|
}
|
249
274
|
if (ref.lateral) {
|
250
|
-
|
251
|
-
|
252
|
-
|
275
|
+
if (!is_outside_flattened) {
|
276
|
+
// If outer dependent joins is yet to be flattened, only plan the lateral
|
277
|
+
has_unplanned_dependent_joins = true;
|
278
|
+
return LogicalDependentJoin::Create(std::move(left), std::move(right), ref.correlated_columns, ref.type,
|
279
|
+
std::move(ref.condition));
|
280
|
+
} else {
|
281
|
+
// All outer dependent joins have been planned and flattened, so plan and flatten lateral and recursively
|
282
|
+
// plan the children
|
283
|
+
auto new_plan = PlanLateralJoin(std::move(left), std::move(right), ref.correlated_columns, ref.type,
|
284
|
+
std::move(ref.condition));
|
285
|
+
if (has_unplanned_dependent_joins) {
|
286
|
+
RecursiveDependentJoinPlanner plan(*this);
|
287
|
+
plan.VisitOperator(*new_plan);
|
288
|
+
}
|
289
|
+
return new_plan;
|
290
|
+
}
|
253
291
|
}
|
254
292
|
switch (ref.ref_type) {
|
255
293
|
case JoinRefType::CROSS:
|
@@ -275,7 +313,7 @@ unique_ptr<LogicalOperator> Binder::CreatePlan(BoundJoinRef &ref) {
|
|
275
313
|
}
|
276
314
|
|
277
315
|
// now create the join operator from the join condition
|
278
|
-
auto result = LogicalComparisonJoin::CreateJoin(ref.type, ref.ref_type, std::move(left), std::move(right),
|
316
|
+
auto result = LogicalComparisonJoin::CreateJoin(context, ref.type, ref.ref_type, std::move(left), std::move(right),
|
279
317
|
std::move(ref.condition));
|
280
318
|
|
281
319
|
optional_ptr<LogicalOperator> join;
|
@@ -6,10 +6,10 @@ namespace duckdb {
|
|
6
6
|
unique_ptr<LogicalOperator> Binder::CreatePlan(BoundSubqueryRef &ref) {
|
7
7
|
// generate the logical plan for the subquery
|
8
8
|
// this happens separately from the current LogicalPlan generation
|
9
|
-
ref.binder->
|
9
|
+
ref.binder->is_outside_flattened = is_outside_flattened;
|
10
10
|
auto subquery = ref.binder->CreatePlan(*ref.subquery);
|
11
|
-
if (ref.binder->
|
12
|
-
|
11
|
+
if (ref.binder->has_unplanned_dependent_joins) {
|
12
|
+
has_unplanned_dependent_joins = true;
|
13
13
|
}
|
14
14
|
return subquery;
|
15
15
|
}
|
@@ -21,7 +21,31 @@
|
|
21
21
|
|
22
22
|
namespace duckdb {
|
23
23
|
|
24
|
+
Binder *Binder::GetRootBinder() {
|
25
|
+
Binder *root = this;
|
26
|
+
while (root->parent) {
|
27
|
+
root = root->parent.get();
|
28
|
+
}
|
29
|
+
return root;
|
30
|
+
}
|
31
|
+
|
32
|
+
idx_t Binder::GetBinderDepth() const {
|
33
|
+
const Binder *root = this;
|
34
|
+
idx_t depth = 1;
|
35
|
+
while (root->parent) {
|
36
|
+
depth++;
|
37
|
+
root = root->parent.get();
|
38
|
+
}
|
39
|
+
return depth;
|
40
|
+
}
|
41
|
+
|
24
42
|
shared_ptr<Binder> Binder::CreateBinder(ClientContext &context, optional_ptr<Binder> parent, bool inherit_ctes) {
|
43
|
+
auto depth = parent ? parent->GetBinderDepth() : 0;
|
44
|
+
if (depth > context.config.max_expression_depth) {
|
45
|
+
throw BinderException("Max expression depth limit of %lld exceeded. Use \"SET max_expression_depth TO x\" to "
|
46
|
+
"increase the maximum expression depth.",
|
47
|
+
context.config.max_expression_depth);
|
48
|
+
}
|
25
49
|
return make_shared<Binder>(true, context, parent ? parent->shared_from_this() : nullptr, inherit_ctes);
|
26
50
|
}
|
27
51
|
|
@@ -117,6 +141,9 @@ unique_ptr<BoundQueryNode> Binder::BindNode(QueryNode &node) {
|
|
117
141
|
case QueryNodeType::RECURSIVE_CTE_NODE:
|
118
142
|
result = BindNode(node.Cast<RecursiveCTENode>());
|
119
143
|
break;
|
144
|
+
case QueryNodeType::CTE_NODE:
|
145
|
+
result = BindNode(node.Cast<CTENode>());
|
146
|
+
break;
|
120
147
|
default:
|
121
148
|
D_ASSERT(node.type == QueryNodeType::SET_OPERATION_NODE);
|
122
149
|
result = BindNode(node.Cast<SetOperationNode>());
|
@@ -145,6 +172,8 @@ unique_ptr<LogicalOperator> Binder::CreatePlan(BoundQueryNode &node) {
|
|
145
172
|
return CreatePlan(node.Cast<BoundSetOperationNode>());
|
146
173
|
case QueryNodeType::RECURSIVE_CTE_NODE:
|
147
174
|
return CreatePlan(node.Cast<BoundRecursiveCTENode>());
|
175
|
+
case QueryNodeType::CTE_NODE:
|
176
|
+
return CreatePlan(node.Cast<BoundCTENode>());
|
148
177
|
default:
|
149
178
|
throw InternalException("Unsupported bound query node type");
|
150
179
|
}
|
@@ -266,11 +295,8 @@ void Binder::AddBoundView(ViewCatalogEntry &view) {
|
|
266
295
|
}
|
267
296
|
|
268
297
|
idx_t Binder::GenerateTableIndex() {
|
269
|
-
|
270
|
-
|
271
|
-
return parent->GenerateTableIndex();
|
272
|
-
}
|
273
|
-
return bound_tables++;
|
298
|
+
auto root_binder = GetRootBinder();
|
299
|
+
return root_binder->bound_tables++;
|
274
300
|
}
|
275
301
|
|
276
302
|
void Binder::PushExpressionBinder(ExpressionBinder &binder) {
|
@@ -296,18 +322,13 @@ bool Binder::HasActiveBinder() {
|
|
296
322
|
}
|
297
323
|
|
298
324
|
vector<reference<ExpressionBinder>> &Binder::GetActiveBinders() {
|
299
|
-
|
300
|
-
|
301
|
-
}
|
302
|
-
return active_binders;
|
325
|
+
auto root_binder = GetRootBinder();
|
326
|
+
return root_binder->active_binders;
|
303
327
|
}
|
304
328
|
|
305
329
|
void Binder::AddUsingBindingSet(unique_ptr<UsingColumnSet> set) {
|
306
|
-
|
307
|
-
|
308
|
-
return;
|
309
|
-
}
|
310
|
-
bind_context.AddUsingBindingSet(std::move(set));
|
330
|
+
auto root_binder = GetRootBinder();
|
331
|
+
root_binder->bind_context.AddUsingBindingSet(std::move(set));
|
311
332
|
}
|
312
333
|
|
313
334
|
void Binder::MoveCorrelatedExpressions(Binder &other) {
|
@@ -376,17 +397,14 @@ bool Binder::HasMatchingBinding(const string &catalog_name, const string &schema
|
|
376
397
|
}
|
377
398
|
|
378
399
|
void Binder::SetBindingMode(BindingMode mode) {
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
this->mode = mode;
|
400
|
+
auto root_binder = GetRootBinder();
|
401
|
+
// FIXME: this used to also set the 'mode' for the current binder, was that necessary?
|
402
|
+
root_binder->mode = mode;
|
383
403
|
}
|
384
404
|
|
385
405
|
BindingMode Binder::GetBindingMode() {
|
386
|
-
|
387
|
-
|
388
|
-
}
|
389
|
-
return mode;
|
406
|
+
auto root_binder = GetRootBinder();
|
407
|
+
return root_binder->mode;
|
390
408
|
}
|
391
409
|
|
392
410
|
void Binder::SetCanContainNulls(bool can_contain_nulls_p) {
|
@@ -394,18 +412,13 @@ void Binder::SetCanContainNulls(bool can_contain_nulls_p) {
|
|
394
412
|
}
|
395
413
|
|
396
414
|
void Binder::AddTableName(string table_name) {
|
397
|
-
|
398
|
-
|
399
|
-
return;
|
400
|
-
}
|
401
|
-
table_names.insert(std::move(table_name));
|
415
|
+
auto root_binder = GetRootBinder();
|
416
|
+
root_binder->table_names.insert(std::move(table_name));
|
402
417
|
}
|
403
418
|
|
404
419
|
const unordered_set<string> &Binder::GetTableNames() {
|
405
|
-
|
406
|
-
|
407
|
-
}
|
408
|
-
return table_names;
|
420
|
+
auto root_binder = GetRootBinder();
|
421
|
+
return root_binder->table_names;
|
409
422
|
}
|
410
423
|
|
411
424
|
string Binder::FormatError(ParsedExpression &expr_context, const string &message) {
|
@@ -15,7 +15,7 @@ BoundAggregateExpression::BoundAggregateExpression(AggregateFunction function, v
|
|
15
15
|
: Expression(ExpressionType::BOUND_AGGREGATE, ExpressionClass::BOUND_AGGREGATE, function.return_type),
|
16
16
|
function(std::move(function)), children(std::move(children)), bind_info(std::move(bind_info)),
|
17
17
|
aggr_type(aggr_type), filter(std::move(filter)) {
|
18
|
-
D_ASSERT(!function.name.empty());
|
18
|
+
D_ASSERT(!this->function.name.empty());
|
19
19
|
}
|
20
20
|
|
21
21
|
string BoundAggregateExpression::ToString() const {
|
@@ -31,41 +31,10 @@ BindResult LateralBinder::BindColumnRef(unique_ptr<ParsedExpression> &expr_ptr,
|
|
31
31
|
if (result.HasError()) {
|
32
32
|
return result;
|
33
33
|
}
|
34
|
-
if (depth > 1) {
|
35
|
-
throw BinderException("Nested lateral joins are not supported yet");
|
36
|
-
}
|
37
34
|
ExtractCorrelatedColumns(*result.expression);
|
38
35
|
return result;
|
39
36
|
}
|
40
37
|
|
41
|
-
vector<CorrelatedColumnInfo> LateralBinder::ExtractCorrelatedColumns(Binder &binder) {
|
42
|
-
|
43
|
-
if (correlated_columns.empty()) {
|
44
|
-
return binder.correlated_columns;
|
45
|
-
}
|
46
|
-
|
47
|
-
// clear outer
|
48
|
-
correlated_columns.clear();
|
49
|
-
auto all_correlated_columns = binder.correlated_columns;
|
50
|
-
|
51
|
-
// remove outer from inner
|
52
|
-
for (auto &corr_column : correlated_columns) {
|
53
|
-
auto entry = std::find(binder.correlated_columns.begin(), binder.correlated_columns.end(), corr_column);
|
54
|
-
if (entry != binder.correlated_columns.end()) {
|
55
|
-
binder.correlated_columns.erase(entry);
|
56
|
-
}
|
57
|
-
}
|
58
|
-
|
59
|
-
// add inner to outer
|
60
|
-
for (auto &corr_column : binder.correlated_columns) {
|
61
|
-
correlated_columns.push_back(corr_column);
|
62
|
-
}
|
63
|
-
|
64
|
-
// clear inner
|
65
|
-
binder.correlated_columns.clear();
|
66
|
-
return all_correlated_columns;
|
67
|
-
}
|
68
|
-
|
69
38
|
BindResult LateralBinder::BindExpression(unique_ptr<ParsedExpression> &expr_ptr, idx_t depth, bool root_expression) {
|
70
39
|
auto &expr = *expr_ptr;
|
71
40
|
switch (expr.GetExpressionClass()) {
|
@@ -125,7 +94,11 @@ protected:
|
|
125
94
|
ReduceColumnRefDepth(expr.Cast<BoundColumnRefExpression>());
|
126
95
|
}
|
127
96
|
if (expr.GetExpressionClass() == ExpressionClass::BOUND_SUBQUERY) {
|
97
|
+
auto &subquery_ref = expr.Cast<BoundSubqueryExpression>();
|
128
98
|
ReduceExpressionSubquery(expr.Cast<BoundSubqueryExpression>());
|
99
|
+
// Recursively update the depth in the bindings of the children nodes
|
100
|
+
ExpressionIterator::EnumerateQueryNodeChildren(
|
101
|
+
*subquery_ref.subquery, [&](Expression &child_expr) { ReduceExpressionDepth(child_expr); });
|
129
102
|
}
|
130
103
|
}
|
131
104
|
|
@@ -79,9 +79,12 @@ bool ExpressionBinder::BindCorrelatedColumns(unique_ptr<ParsedExpression> &expr)
|
|
79
79
|
auto &active_binders = binder.GetActiveBinders();
|
80
80
|
// make a copy of the set of binders, so we can restore it later
|
81
81
|
auto binders = active_binders;
|
82
|
+
|
83
|
+
// we already failed with the current binder
|
82
84
|
active_binders.pop_back();
|
83
85
|
idx_t depth = 1;
|
84
86
|
bool success = false;
|
87
|
+
|
85
88
|
while (!active_binders.empty()) {
|
86
89
|
auto &next_binder = active_binders.back().get();
|
87
90
|
ExpressionBinder::QualifyColumnNames(next_binder.binder, expr);
|