duckdb 0.7.1 → 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
| @@ -5,7 +5,7 @@ | |
| 5 5 | 
             
            #include "duckdb/storage/buffer_manager.hpp"
         | 
| 6 6 | 
             
            #include "duckdb/storage/checkpoint/write_overflow_strings_to_disk.hpp"
         | 
| 7 7 | 
             
            #include "duckdb/storage/segment/uncompressed.hpp"
         | 
| 8 | 
            -
             | 
| 8 | 
            +
             | 
| 9 9 | 
             
            #include "duckdb/storage/table/append_state.hpp"
         | 
| 10 10 | 
             
            #include "duckdb/storage/table/column_data_checkpointer.hpp"
         | 
| 11 11 | 
             
            #include "duckdb/storage/table/column_segment.hpp"
         | 
| @@ -153,13 +153,7 @@ void FixedSizeScan(ColumnSegment &segment, ColumnScanState &state, idx_t scan_co | |
| 153 153 | 
             
            	auto source_data = data + start * sizeof(T);
         | 
| 154 154 |  | 
| 155 155 | 
             
            	result.SetVectorType(VectorType::FLAT_VECTOR);
         | 
| 156 | 
            -
            	 | 
| 157 | 
            -
            		// list columns are modified in-place during the scans to correct the offsets
         | 
| 158 | 
            -
            		// so we can't do a zero-copy there
         | 
| 159 | 
            -
            		memcpy(FlatVector::GetData(result), source_data, scan_count * sizeof(T));
         | 
| 160 | 
            -
            	} else {
         | 
| 161 | 
            -
            		FlatVector::SetData(result, source_data);
         | 
| 162 | 
            -
            	}
         | 
| 156 | 
            +
            	FlatVector::SetData(result, source_data);
         | 
| 163 157 | 
             
            }
         | 
| 164 158 |  | 
| 165 159 | 
             
            //===--------------------------------------------------------------------===//
         | 
| @@ -186,48 +180,52 @@ static unique_ptr<CompressionAppendState> FixedSizeInitAppend(ColumnSegment &seg | |
| 186 180 | 
             
            	return make_unique<CompressionAppendState>(std::move(handle));
         | 
| 187 181 | 
             
            }
         | 
| 188 182 |  | 
| 189 | 
            -
             | 
| 190 | 
            -
             | 
| 191 | 
            -
             | 
| 192 | 
            -
             | 
| 193 | 
            -
             | 
| 194 | 
            -
             | 
| 195 | 
            -
            		 | 
| 196 | 
            -
            			 | 
| 197 | 
            -
             | 
| 198 | 
            -
             | 
| 199 | 
            -
             | 
| 200 | 
            -
            				 | 
| 183 | 
            +
            struct StandardFixedSizeAppend {
         | 
| 184 | 
            +
            	template <class T>
         | 
| 185 | 
            +
            	static void Append(SegmentStatistics &stats, data_ptr_t target, idx_t target_offset, UnifiedVectorFormat &adata,
         | 
| 186 | 
            +
            	                   idx_t offset, idx_t count) {
         | 
| 187 | 
            +
            		auto sdata = (T *)adata.data;
         | 
| 188 | 
            +
            		auto tdata = (T *)target;
         | 
| 189 | 
            +
            		if (!adata.validity.AllValid()) {
         | 
| 190 | 
            +
            			for (idx_t i = 0; i < count; i++) {
         | 
| 191 | 
            +
            				auto source_idx = adata.sel->get_index(offset + i);
         | 
| 192 | 
            +
            				auto target_idx = target_offset + i;
         | 
| 193 | 
            +
            				bool is_null = !adata.validity.RowIsValid(source_idx);
         | 
| 194 | 
            +
            				if (!is_null) {
         | 
| 195 | 
            +
            					NumericStats::Update<T>(stats.statistics, sdata[source_idx]);
         | 
| 196 | 
            +
            					tdata[target_idx] = sdata[source_idx];
         | 
| 197 | 
            +
            				} else {
         | 
| 198 | 
            +
            					// we insert a NullValue<T> in the null gap for debuggability
         | 
| 199 | 
            +
            					// this value should never be used or read anywhere
         | 
| 200 | 
            +
            					tdata[target_idx] = NullValue<T>();
         | 
| 201 | 
            +
            				}
         | 
| 202 | 
            +
            			}
         | 
| 203 | 
            +
            		} else {
         | 
| 204 | 
            +
            			for (idx_t i = 0; i < count; i++) {
         | 
| 205 | 
            +
            				auto source_idx = adata.sel->get_index(offset + i);
         | 
| 206 | 
            +
            				auto target_idx = target_offset + i;
         | 
| 207 | 
            +
            				NumericStats::Update<T>(stats.statistics, sdata[source_idx]);
         | 
| 201 208 | 
             
            				tdata[target_idx] = sdata[source_idx];
         | 
| 202 | 
            -
            			} else {
         | 
| 203 | 
            -
            				// we insert a NullValue<T> in the null gap for debuggability
         | 
| 204 | 
            -
            				// this value should never be used or read anywhere
         | 
| 205 | 
            -
            				tdata[target_idx] = NullValue<T>();
         | 
| 206 209 | 
             
            			}
         | 
| 207 210 | 
             
            		}
         | 
| 208 | 
            -
            	} | 
| 211 | 
            +
            	}
         | 
| 212 | 
            +
            };
         | 
| 213 | 
            +
             | 
| 214 | 
            +
            struct ListFixedSizeAppend {
         | 
| 215 | 
            +
            	template <class T>
         | 
| 216 | 
            +
            	static void Append(SegmentStatistics &stats, data_ptr_t target, idx_t target_offset, UnifiedVectorFormat &adata,
         | 
| 217 | 
            +
            	                   idx_t offset, idx_t count) {
         | 
| 218 | 
            +
            		auto sdata = (uint64_t *)adata.data;
         | 
| 219 | 
            +
            		auto tdata = (uint64_t *)target;
         | 
| 209 220 | 
             
            		for (idx_t i = 0; i < count; i++) {
         | 
| 210 221 | 
             
            			auto source_idx = adata.sel->get_index(offset + i);
         | 
| 211 222 | 
             
            			auto target_idx = target_offset + i;
         | 
| 212 | 
            -
            			NumericStatistics::Update<T>(stats, sdata[source_idx]);
         | 
| 213 223 | 
             
            			tdata[target_idx] = sdata[source_idx];
         | 
| 214 224 | 
             
            		}
         | 
| 215 225 | 
             
            	}
         | 
| 216 | 
            -
            }
         | 
| 217 | 
            -
             | 
| 218 | 
            -
            template <>
         | 
| 219 | 
            -
            void AppendLoop<list_entry_t>(SegmentStatistics &stats, data_ptr_t target, idx_t target_offset,
         | 
| 220 | 
            -
                                          UnifiedVectorFormat &adata, idx_t offset, idx_t count) {
         | 
| 221 | 
            -
            	auto sdata = (list_entry_t *)adata.data;
         | 
| 222 | 
            -
            	auto tdata = (list_entry_t *)target;
         | 
| 223 | 
            -
            	for (idx_t i = 0; i < count; i++) {
         | 
| 224 | 
            -
            		auto source_idx = adata.sel->get_index(offset + i);
         | 
| 225 | 
            -
            		auto target_idx = target_offset + i;
         | 
| 226 | 
            -
            		tdata[target_idx] = sdata[source_idx];
         | 
| 227 | 
            -
            	}
         | 
| 228 | 
            -
            }
         | 
| 226 | 
            +
            };
         | 
| 229 227 |  | 
| 230 | 
            -
            template <class T>
         | 
| 228 | 
            +
            template <class T, class OP>
         | 
| 231 229 | 
             
            idx_t FixedSizeAppend(CompressionAppendState &append_state, ColumnSegment &segment, SegmentStatistics &stats,
         | 
| 232 230 | 
             
                                  UnifiedVectorFormat &data, idx_t offset, idx_t count) {
         | 
| 233 231 | 
             
            	D_ASSERT(segment.GetBlockOffset() == 0);
         | 
| @@ -236,7 +234,7 @@ idx_t FixedSizeAppend(CompressionAppendState &append_state, ColumnSegment &segme | |
| 236 234 | 
             
            	idx_t max_tuple_count = segment.SegmentSize() / sizeof(T);
         | 
| 237 235 | 
             
            	idx_t copy_count = MinValue<idx_t>(count, max_tuple_count - segment.count);
         | 
| 238 236 |  | 
| 239 | 
            -
            	 | 
| 237 | 
            +
            	OP::template Append<T>(stats, target_ptr, segment.count, data, offset, copy_count);
         | 
| 240 238 | 
             
            	segment.count += copy_count;
         | 
| 241 239 | 
             
            	return copy_count;
         | 
| 242 240 | 
             
            }
         | 
| @@ -249,14 +247,14 @@ idx_t FixedSizeFinalizeAppend(ColumnSegment &segment, SegmentStatistics &stats) | |
| 249 247 | 
             
            //===--------------------------------------------------------------------===//
         | 
| 250 248 | 
             
            // Get Function
         | 
| 251 249 | 
             
            //===--------------------------------------------------------------------===//
         | 
| 252 | 
            -
            template <class T>
         | 
| 250 | 
            +
            template <class T, class APPENDER = StandardFixedSizeAppend>
         | 
| 253 251 | 
             
            CompressionFunction FixedSizeGetFunction(PhysicalType data_type) {
         | 
| 254 252 | 
             
            	return CompressionFunction(CompressionType::COMPRESSION_UNCOMPRESSED, data_type, FixedSizeInitAnalyze,
         | 
| 255 253 | 
             
            	                           FixedSizeAnalyze, FixedSizeFinalAnalyze<T>, UncompressedFunctions::InitCompression,
         | 
| 256 254 | 
             
            	                           UncompressedFunctions::Compress, UncompressedFunctions::FinalizeCompress,
         | 
| 257 255 | 
             
            	                           FixedSizeInitScan, FixedSizeScan<T>, FixedSizeScanPartial<T>, FixedSizeFetchRow<T>,
         | 
| 258 | 
            -
            	                           UncompressedFunctions::EmptySkip, nullptr, FixedSizeInitAppend, | 
| 259 | 
            -
            	                           FixedSizeFinalizeAppend<T>, nullptr);
         | 
| 256 | 
            +
            	                           UncompressedFunctions::EmptySkip, nullptr, FixedSizeInitAppend,
         | 
| 257 | 
            +
            	                           FixedSizeAppend<T, APPENDER>, FixedSizeFinalizeAppend<T>, nullptr);
         | 
| 260 258 | 
             
            }
         | 
| 261 259 |  | 
| 262 260 | 
             
            CompressionFunction FixedSizeUncompressed::GetFunction(PhysicalType data_type) {
         | 
| @@ -287,7 +285,7 @@ CompressionFunction FixedSizeUncompressed::GetFunction(PhysicalType data_type) { | |
| 287 285 | 
             
            	case PhysicalType::INTERVAL:
         | 
| 288 286 | 
             
            		return FixedSizeGetFunction<interval_t>(data_type);
         | 
| 289 287 | 
             
            	case PhysicalType::LIST:
         | 
| 290 | 
            -
            		return FixedSizeGetFunction< | 
| 288 | 
            +
            		return FixedSizeGetFunction<uint64_t, ListFixedSizeAppend>(data_type);
         | 
| 291 289 | 
             
            	default:
         | 
| 292 290 | 
             
            		throw InternalException("Unsupported type for FixedSizeUncompressed::GetFunction");
         | 
| 293 291 | 
             
            	}
         | 
| @@ -1,8 +1,7 @@ | |
| 1 1 | 
             
            #include "duckdb/function/compression/compression.hpp"
         | 
| 2 2 | 
             
            #include "duckdb/storage/buffer_manager.hpp"
         | 
| 3 3 | 
             
            #include "duckdb/common/types/vector.hpp"
         | 
| 4 | 
            -
             | 
| 5 | 
            -
            #include "duckdb/storage/statistics/validity_statistics.hpp"
         | 
| 4 | 
            +
             | 
| 6 5 | 
             
            #include "duckdb/storage/table/column_segment.hpp"
         | 
| 7 6 | 
             
            #include "duckdb/function/compression_function.hpp"
         | 
| 8 7 | 
             
            #include "duckdb/storage/segment/uncompressed.hpp"
         | 
| @@ -20,8 +19,8 @@ unique_ptr<SegmentScanState> ConstantInitScan(ColumnSegment &segment) { | |
| 20 19 | 
             
            // Scan Partial
         | 
| 21 20 | 
             
            //===--------------------------------------------------------------------===//
         | 
| 22 21 | 
             
            void ConstantFillFunctionValidity(ColumnSegment &segment, Vector &result, idx_t start_idx, idx_t count) {
         | 
| 23 | 
            -
            	auto & | 
| 24 | 
            -
            	if ( | 
| 22 | 
            +
            	auto &stats = segment.stats.statistics;
         | 
| 23 | 
            +
            	if (stats.CanHaveNull()) {
         | 
| 25 24 | 
             
            		auto &mask = FlatVector::Validity(result);
         | 
| 26 25 | 
             
            		for (idx_t i = 0; i < count; i++) {
         | 
| 27 26 | 
             
            			mask.SetInvalid(start_idx + i);
         | 
| @@ -31,10 +30,10 @@ void ConstantFillFunctionValidity(ColumnSegment &segment, Vector &result, idx_t | |
| 31 30 |  | 
| 32 31 | 
             
            template <class T>
         | 
| 33 32 | 
             
            void ConstantFillFunction(ColumnSegment &segment, Vector &result, idx_t start_idx, idx_t count) {
         | 
| 34 | 
            -
            	auto &nstats =  | 
| 33 | 
            +
            	auto &nstats = segment.stats.statistics;
         | 
| 35 34 |  | 
| 36 35 | 
             
            	auto data = FlatVector::GetData<T>(result);
         | 
| 37 | 
            -
            	auto constant_value =  | 
| 36 | 
            +
            	auto constant_value = NumericStats::GetMin<T>(nstats);
         | 
| 38 37 | 
             
            	for (idx_t i = 0; i < count; i++) {
         | 
| 39 38 | 
             
            		data[start_idx + i] = constant_value;
         | 
| 40 39 | 
             
            	}
         | 
| @@ -55,8 +54,8 @@ void ConstantScanPartial(ColumnSegment &segment, ColumnScanState &state, idx_t s | |
| 55 54 | 
             
            // Scan base data
         | 
| 56 55 | 
             
            //===--------------------------------------------------------------------===//
         | 
| 57 56 | 
             
            void ConstantScanFunctionValidity(ColumnSegment &segment, ColumnScanState &state, idx_t scan_count, Vector &result) {
         | 
| 58 | 
            -
            	auto & | 
| 59 | 
            -
            	if ( | 
| 57 | 
            +
            	auto &stats = segment.stats.statistics;
         | 
| 58 | 
            +
            	if (stats.CanHaveNull()) {
         | 
| 60 59 | 
             
            		if (result.GetVectorType() == VectorType::CONSTANT_VECTOR) {
         | 
| 61 60 | 
             
            			result.SetVectorType(VectorType::CONSTANT_VECTOR);
         | 
| 62 61 | 
             
            			ConstantVector::SetNull(result, true);
         | 
| @@ -69,10 +68,10 @@ void ConstantScanFunctionValidity(ColumnSegment &segment, ColumnScanState &state | |
| 69 68 |  | 
| 70 69 | 
             
            template <class T>
         | 
| 71 70 | 
             
            void ConstantScanFunction(ColumnSegment &segment, ColumnScanState &state, idx_t scan_count, Vector &result) {
         | 
| 72 | 
            -
            	auto &nstats =  | 
| 71 | 
            +
            	auto &nstats = segment.stats.statistics;
         | 
| 73 72 |  | 
| 74 73 | 
             
            	auto data = FlatVector::GetData<T>(result);
         | 
| 75 | 
            -
            	data[0] =  | 
| 74 | 
            +
            	data[0] = NumericStats::GetMin<T>(nstats);
         | 
| 76 75 | 
             
            	result.SetVectorType(VectorType::CONSTANT_VECTOR);
         | 
| 77 76 | 
             
            }
         | 
| 78 77 |  | 
| @@ -10,7 +10,7 @@ | |
| 10 10 | 
             
            #include "duckdb/function/compression_function.hpp"
         | 
| 11 11 | 
             
            #include "duckdb/main/config.hpp"
         | 
| 12 12 | 
             
            #include "duckdb/storage/buffer_manager.hpp"
         | 
| 13 | 
            -
             | 
| 13 | 
            +
             | 
| 14 14 | 
             
            #include "duckdb/storage/table/column_data_checkpointer.hpp"
         | 
| 15 15 | 
             
            #include "duckdb/storage/table/column_segment.hpp"
         | 
| 16 16 | 
             
            #include "duckdb/common/operator/subtract.hpp"
         | 
| @@ -1,5 +1,5 @@ | |
| 1 1 | 
             
            #include "duckdb/function/compression/compression.hpp"
         | 
| 2 | 
            -
             | 
| 2 | 
            +
             | 
| 3 3 | 
             
            #include "duckdb/storage/table/column_segment.hpp"
         | 
| 4 4 | 
             
            #include "duckdb/function/compression_function.hpp"
         | 
| 5 5 | 
             
            #include "duckdb/main/config.hpp"
         | 
| @@ -118,12 +118,12 @@ struct RLEConstants { | |
| 118 118 | 
             
            	static constexpr const idx_t RLE_HEADER_SIZE = sizeof(uint64_t);
         | 
| 119 119 | 
             
            };
         | 
| 120 120 |  | 
| 121 | 
            -
            template <class T>
         | 
| 121 | 
            +
            template <class T, bool WRITE_STATISTICS>
         | 
| 122 122 | 
             
            struct RLECompressState : public CompressionState {
         | 
| 123 123 | 
             
            	struct RLEWriter {
         | 
| 124 124 | 
             
            		template <class VALUE_TYPE>
         | 
| 125 125 | 
             
            		static void Operation(VALUE_TYPE value, rle_count_t count, void *dataptr, bool is_null) {
         | 
| 126 | 
            -
            			auto state = (RLECompressState<T> *)dataptr;
         | 
| 126 | 
            +
            			auto state = (RLECompressState<T, WRITE_STATISTICS> *)dataptr;
         | 
| 127 127 | 
             
            			state->WriteValue(value, count, is_null);
         | 
| 128 128 | 
             
            		}
         | 
| 129 129 | 
             
            	};
         | 
| @@ -160,7 +160,7 @@ struct RLECompressState : public CompressionState { | |
| 160 160 | 
             
            		auto data = (T *)vdata.data;
         | 
| 161 161 | 
             
            		for (idx_t i = 0; i < count; i++) {
         | 
| 162 162 | 
             
            			auto idx = vdata.sel->get_index(i);
         | 
| 163 | 
            -
            			state.template Update<RLECompressState<T>::RLEWriter>(data, vdata.validity, idx);
         | 
| 163 | 
            +
            			state.template Update<RLECompressState<T, WRITE_STATISTICS>::RLEWriter>(data, vdata.validity, idx);
         | 
| 164 164 | 
             
            		}
         | 
| 165 165 | 
             
            	}
         | 
| 166 166 |  | 
| @@ -174,8 +174,8 @@ struct RLECompressState : public CompressionState { | |
| 174 174 | 
             
            		entry_count++;
         | 
| 175 175 |  | 
| 176 176 | 
             
            		// update meta data
         | 
| 177 | 
            -
            		if (!is_null) {
         | 
| 178 | 
            -
            			 | 
| 177 | 
            +
            		if (WRITE_STATISTICS && !is_null) {
         | 
| 178 | 
            +
            			NumericStats::Update<T>(current_segment->stats.statistics, value);
         | 
| 179 179 | 
             
            		}
         | 
| 180 180 | 
             
            		current_segment->count += count;
         | 
| 181 181 |  | 
| @@ -206,7 +206,7 @@ struct RLECompressState : public CompressionState { | |
| 206 206 | 
             
            	}
         | 
| 207 207 |  | 
| 208 208 | 
             
            	void Finalize() {
         | 
| 209 | 
            -
            		state.template Flush<RLECompressState<T>::RLEWriter>();
         | 
| 209 | 
            +
            		state.template Flush<RLECompressState<T, WRITE_STATISTICS>::RLEWriter>();
         | 
| 210 210 |  | 
| 211 211 | 
             
            		FlushSegment();
         | 
| 212 212 | 
             
            		current_segment.reset();
         | 
| @@ -222,23 +222,23 @@ struct RLECompressState : public CompressionState { | |
| 222 222 | 
             
            	idx_t max_rle_count;
         | 
| 223 223 | 
             
            };
         | 
| 224 224 |  | 
| 225 | 
            -
            template <class T>
         | 
| 225 | 
            +
            template <class T, bool WRITE_STATISTICS>
         | 
| 226 226 | 
             
            unique_ptr<CompressionState> RLEInitCompression(ColumnDataCheckpointer &checkpointer, unique_ptr<AnalyzeState> state) {
         | 
| 227 | 
            -
            	return make_unique<RLECompressState<T>>(checkpointer);
         | 
| 227 | 
            +
            	return make_unique<RLECompressState<T, WRITE_STATISTICS>>(checkpointer);
         | 
| 228 228 | 
             
            }
         | 
| 229 229 |  | 
| 230 | 
            -
            template <class T>
         | 
| 230 | 
            +
            template <class T, bool WRITE_STATISTICS>
         | 
| 231 231 | 
             
            void RLECompress(CompressionState &state_p, Vector &scan_vector, idx_t count) {
         | 
| 232 | 
            -
            	auto &state = (RLECompressState<T> &)state_p;
         | 
| 232 | 
            +
            	auto &state = (RLECompressState<T, WRITE_STATISTICS> &)state_p;
         | 
| 233 233 | 
             
            	UnifiedVectorFormat vdata;
         | 
| 234 234 | 
             
            	scan_vector.ToUnifiedFormat(count, vdata);
         | 
| 235 235 |  | 
| 236 236 | 
             
            	state.Append(vdata, count);
         | 
| 237 237 | 
             
            }
         | 
| 238 238 |  | 
| 239 | 
            -
            template <class T>
         | 
| 239 | 
            +
            template <class T, bool WRITE_STATISTICS>
         | 
| 240 240 | 
             
            void RLEFinalizeCompress(CompressionState &state_p) {
         | 
| 241 | 
            -
            	auto &state = (RLECompressState<T> &)state_p;
         | 
| 241 | 
            +
            	auto &state = (RLECompressState<T, WRITE_STATISTICS> &)state_p;
         | 
| 242 242 | 
             
            	state.Finalize();
         | 
| 243 243 | 
             
            }
         | 
| 244 244 |  | 
| @@ -341,10 +341,11 @@ void RLEFetchRow(ColumnSegment &segment, ColumnFetchState &state, row_t row_id, | |
| 341 341 | 
             
            //===--------------------------------------------------------------------===//
         | 
| 342 342 | 
             
            // Get Function
         | 
| 343 343 | 
             
            //===--------------------------------------------------------------------===//
         | 
| 344 | 
            -
            template <class T>
         | 
| 344 | 
            +
            template <class T, bool WRITE_STATISTICS = true>
         | 
| 345 345 | 
             
            CompressionFunction GetRLEFunction(PhysicalType data_type) {
         | 
| 346 346 | 
             
            	return CompressionFunction(CompressionType::COMPRESSION_RLE, data_type, RLEInitAnalyze<T>, RLEAnalyze<T>,
         | 
| 347 | 
            -
            	                           RLEFinalAnalyze<T>, RLEInitCompression<T | 
| 347 | 
            +
            	                           RLEFinalAnalyze<T>, RLEInitCompression<T, WRITE_STATISTICS>,
         | 
| 348 | 
            +
            	                           RLECompress<T, WRITE_STATISTICS>, RLEFinalizeCompress<T, WRITE_STATISTICS>,
         | 
| 348 349 | 
             
            	                           RLEInitScan<T>, RLEScan<T>, RLEScanPartial<T>, RLEFetchRow<T>, RLESkip<T>);
         | 
| 349 350 | 
             
            }
         | 
| 350 351 |  | 
| @@ -373,6 +374,8 @@ CompressionFunction RLEFun::GetFunction(PhysicalType type) { | |
| 373 374 | 
             
            		return GetRLEFunction<float>(type);
         | 
| 374 375 | 
             
            	case PhysicalType::DOUBLE:
         | 
| 375 376 | 
             
            		return GetRLEFunction<double>(type);
         | 
| 377 | 
            +
            	case PhysicalType::LIST:
         | 
| 378 | 
            +
            		return GetRLEFunction<uint64_t, false>(type);
         | 
| 376 379 | 
             
            	default:
         | 
| 377 380 | 
             
            		throw InternalException("Unsupported type for RLE");
         | 
| 378 381 | 
             
            	}
         | 
| @@ -392,6 +395,7 @@ bool RLEFun::TypeIsSupported(PhysicalType type) { | |
| 392 395 | 
             
            	case PhysicalType::UINT64:
         | 
| 393 396 | 
             
            	case PhysicalType::FLOAT:
         | 
| 394 397 | 
             
            	case PhysicalType::DOUBLE:
         | 
| 398 | 
            +
            	case PhysicalType::LIST:
         | 
| 395 399 | 
             
            		return true;
         | 
| 396 400 | 
             
            	default:
         | 
| 397 401 | 
             
            		return false;
         | 
| @@ -2,7 +2,7 @@ | |
| 2 2 | 
             
            #include "duckdb/storage/buffer_manager.hpp"
         | 
| 3 3 | 
             
            #include "duckdb/common/types/vector.hpp"
         | 
| 4 4 | 
             
            #include "duckdb/storage/table/append_state.hpp"
         | 
| 5 | 
            -
             | 
| 5 | 
            +
             | 
| 6 6 | 
             
            #include "duckdb/common/types/null_value.hpp"
         | 
| 7 7 | 
             
            #include "duckdb/storage/table/column_segment.hpp"
         | 
| 8 8 | 
             
            #include "duckdb/function/compression_function.hpp"
         | 
| @@ -410,14 +410,14 @@ unique_ptr<CompressedSegmentState> ValidityInitSegment(ColumnSegment &segment, b | |
| 410 410 | 
             
            idx_t ValidityAppend(CompressionAppendState &append_state, ColumnSegment &segment, SegmentStatistics &stats,
         | 
| 411 411 | 
             
                                 UnifiedVectorFormat &data, idx_t offset, idx_t vcount) {
         | 
| 412 412 | 
             
            	D_ASSERT(segment.GetBlockOffset() == 0);
         | 
| 413 | 
            -
            	auto &validity_stats =  | 
| 413 | 
            +
            	auto &validity_stats = stats.statistics;
         | 
| 414 414 |  | 
| 415 415 | 
             
            	auto max_tuples = segment.SegmentSize() / ValidityMask::STANDARD_MASK_SIZE * STANDARD_VECTOR_SIZE;
         | 
| 416 416 | 
             
            	idx_t append_count = MinValue<idx_t>(vcount, max_tuples - segment.count);
         | 
| 417 417 | 
             
            	if (data.validity.AllValid()) {
         | 
| 418 418 | 
             
            		// no null values: skip append
         | 
| 419 419 | 
             
            		segment.count += append_count;
         | 
| 420 | 
            -
            		validity_stats. | 
| 420 | 
            +
            		validity_stats.SetHasNoNull();
         | 
| 421 421 | 
             
            		return append_count;
         | 
| 422 422 | 
             
            	}
         | 
| 423 423 |  | 
| @@ -426,9 +426,9 @@ idx_t ValidityAppend(CompressionAppendState &append_state, ColumnSegment &segmen | |
| 426 426 | 
             
            		auto idx = data.sel->get_index(offset + i);
         | 
| 427 427 | 
             
            		if (!data.validity.RowIsValidUnsafe(idx)) {
         | 
| 428 428 | 
             
            			mask.SetInvalidUnsafe(segment.count + i);
         | 
| 429 | 
            -
            			validity_stats. | 
| 429 | 
            +
            			validity_stats.SetHasNull();
         | 
| 430 430 | 
             
            		} else {
         | 
| 431 | 
            -
            			validity_stats. | 
| 431 | 
            +
            			validity_stats.SetHasNoNull();
         | 
| 432 432 | 
             
            		}
         | 
| 433 433 | 
             
            	}
         | 
| 434 434 | 
             
            	segment.count += append_count;
         | 
| @@ -45,7 +45,7 @@ DataTable::DataTable(AttachedDatabase &db, shared_ptr<TableIOManager> table_io_m | |
| 45 45 | 
             
            	auto types = GetTypes();
         | 
| 46 46 | 
             
            	this->row_groups =
         | 
| 47 47 | 
             
            	    make_shared<RowGroupCollection>(info, TableIOManager::Get(*this).GetBlockManagerForRowData(), types, 0);
         | 
| 48 | 
            -
            	if (data &&  | 
| 48 | 
            +
            	if (data && data->row_group_count > 0) {
         | 
| 49 49 | 
             
            		this->row_groups->Initialize(*data);
         | 
| 50 50 | 
             
            	} else {
         | 
| 51 51 | 
             
            		this->row_groups->InitializeEmpty();
         | 
| @@ -819,9 +819,10 @@ void DataTable::RevertAppend(idx_t start_row, idx_t count) { | |
| 819 819 | 
             
            //===--------------------------------------------------------------------===//
         | 
| 820 820 | 
             
            // Indexes
         | 
| 821 821 | 
             
            //===--------------------------------------------------------------------===//
         | 
| 822 | 
            -
             | 
| 822 | 
            +
            PreservedError DataTable::AppendToIndexes(TableIndexList &indexes, DataChunk &chunk, row_t row_start) {
         | 
| 823 | 
            +
            	PreservedError error;
         | 
| 823 824 | 
             
            	if (indexes.Empty()) {
         | 
| 824 | 
            -
            		return  | 
| 825 | 
            +
            		return error;
         | 
| 825 826 | 
             
            	}
         | 
| 826 827 | 
             
            	// first generate the vector of row identifiers
         | 
| 827 828 | 
             
            	Vector row_identifiers(LogicalType::ROW_TYPE);
         | 
| @@ -832,11 +833,13 @@ bool DataTable::AppendToIndexes(TableIndexList &indexes, DataChunk &chunk, row_t | |
| 832 833 | 
             
            	// now append the entries to the indices
         | 
| 833 834 | 
             
            	indexes.Scan([&](Index &index) {
         | 
| 834 835 | 
             
            		try {
         | 
| 835 | 
            -
            			 | 
| 836 | 
            -
             | 
| 837 | 
            -
             | 
| 838 | 
            -
             | 
| 839 | 
            -
             | 
| 836 | 
            +
            			error = index.Append(chunk, row_identifiers);
         | 
| 837 | 
            +
            		} catch (Exception &ex) {
         | 
| 838 | 
            +
            			error = PreservedError(ex);
         | 
| 839 | 
            +
            		} catch (std::exception &ex) {
         | 
| 840 | 
            +
            			error = PreservedError(ex);
         | 
| 841 | 
            +
            		}
         | 
| 842 | 
            +
            		if (error) {
         | 
| 840 843 | 
             
            			append_failed = true;
         | 
| 841 844 | 
             
            			return true;
         | 
| 842 845 | 
             
            		}
         | 
| @@ -850,12 +853,11 @@ bool DataTable::AppendToIndexes(TableIndexList &indexes, DataChunk &chunk, row_t | |
| 850 853 | 
             
            		for (auto *index : already_appended) {
         | 
| 851 854 | 
             
            			index->Delete(chunk, row_identifiers);
         | 
| 852 855 | 
             
            		}
         | 
| 853 | 
            -
            		return false;
         | 
| 854 856 | 
             
            	}
         | 
| 855 | 
            -
            	return  | 
| 857 | 
            +
            	return error;
         | 
| 856 858 | 
             
            }
         | 
| 857 859 |  | 
| 858 | 
            -
             | 
| 860 | 
            +
            PreservedError DataTable::AppendToIndexes(DataChunk &chunk, row_t row_start) {
         | 
| 859 861 | 
             
            	D_ASSERT(is_root);
         | 
| 860 862 | 
             
            	return AppendToIndexes(info->indexes, chunk, row_start);
         | 
| 861 863 | 
             
            }
         | 
| @@ -1204,9 +1206,9 @@ void DataTable::WALAddIndex(ClientContext &context, unique_ptr<Index> index, | |
| 1204 1206 | 
             
            			index->ExecuteExpressions(intermediate, result);
         | 
| 1205 1207 |  | 
| 1206 1208 | 
             
            			// insert into the index
         | 
| 1207 | 
            -
            			 | 
| 1208 | 
            -
             | 
| 1209 | 
            -
             | 
| 1209 | 
            +
            			auto error = index->Insert(lock, result, intermediate.data[intermediate.ColumnCount() - 1]);
         | 
| 1210 | 
            +
            			if (error) {
         | 
| 1211 | 
            +
            				throw InternalException("Error during WAL replay: %s", error.Message());
         | 
| 1210 1212 | 
             
            			}
         | 
| 1211 1213 | 
             
            		}
         | 
| 1212 1214 | 
             
            	}
         | 
| @@ -1223,9 +1225,9 @@ unique_ptr<BaseStatistics> DataTable::GetStatistics(ClientContext &context, colu | |
| 1223 1225 | 
             
            	return row_groups->CopyStats(column_id);
         | 
| 1224 1226 | 
             
            }
         | 
| 1225 1227 |  | 
| 1226 | 
            -
            void DataTable:: | 
| 1228 | 
            +
            void DataTable::SetDistinct(column_t column_id, unique_ptr<DistinctStatistics> distinct_stats) {
         | 
| 1227 1229 | 
             
            	D_ASSERT(column_id != COLUMN_IDENTIFIER_ROW_ID);
         | 
| 1228 | 
            -
            	row_groups-> | 
| 1230 | 
            +
            	row_groups->SetDistinct(column_id, std::move(distinct_stats));
         | 
| 1229 1231 | 
             
            }
         | 
| 1230 1232 |  | 
| 1231 1233 | 
             
            //===--------------------------------------------------------------------===//
         | 
| @@ -1234,10 +1236,8 @@ void DataTable::SetStatistics(column_t column_id, const std::function<void(BaseS | |
| 1234 1236 | 
             
            void DataTable::Checkpoint(TableDataWriter &writer) {
         | 
| 1235 1237 | 
             
            	// checkpoint each individual row group
         | 
| 1236 1238 | 
             
            	// FIXME: we might want to combine adjacent row groups in case they have had deletions...
         | 
| 1237 | 
            -
            	 | 
| 1238 | 
            -
            	 | 
| 1239 | 
            -
            		global_stats.push_back(row_groups->CopyStats(i));
         | 
| 1240 | 
            -
            	}
         | 
| 1239 | 
            +
            	TableStatistics global_stats;
         | 
| 1240 | 
            +
            	row_groups->CopyStats(global_stats);
         | 
| 1241 1241 |  | 
| 1242 1242 | 
             
            	row_groups->Checkpoint(writer, global_stats);
         | 
| 1243 1243 |  | 
| @@ -36,7 +36,7 @@ void Index::InitializeLock(IndexLock &state) { | |
| 36 36 | 
             
            	state.index_lock = unique_lock<mutex>(lock);
         | 
| 37 37 | 
             
            }
         | 
| 38 38 |  | 
| 39 | 
            -
             | 
| 39 | 
            +
            PreservedError Index::Append(DataChunk &entries, Vector &row_identifiers) {
         | 
| 40 40 | 
             
            	IndexLock state;
         | 
| 41 41 | 
             
            	InitializeLock(state);
         | 
| 42 42 | 
             
            	return Append(state, entries, row_identifiers);
         | 
| @@ -90,4 +90,15 @@ BlockPointer Index::Serialize(MetaBlockWriter &writer) { | |
| 90 90 | 
             
            	throw NotImplementedException("The implementation of this index serialization does not exist.");
         | 
| 91 91 | 
             
            }
         | 
| 92 92 |  | 
| 93 | 
            +
            string Index::AppendRowError(DataChunk &input, idx_t index) {
         | 
| 94 | 
            +
            	string error;
         | 
| 95 | 
            +
            	for (idx_t c = 0; c < input.ColumnCount(); c++) {
         | 
| 96 | 
            +
            		if (c > 0) {
         | 
| 97 | 
            +
            			error += ", ";
         | 
| 98 | 
            +
            		}
         | 
| 99 | 
            +
            		error += input.GetValue(c, index).ToString();
         | 
| 100 | 
            +
            	}
         | 
| 101 | 
            +
            	return error;
         | 
| 102 | 
            +
            }
         | 
| 103 | 
            +
             | 
| 93 104 | 
             
            } // namespace duckdb
         | 
| @@ -197,16 +197,16 @@ void LocalTableStorage::FlushToDisk() { | |
| 197 197 | 
             
            	optimistic_writer.FinalFlush();
         | 
| 198 198 | 
             
            }
         | 
| 199 199 |  | 
| 200 | 
            -
             | 
| 201 | 
            -
             | 
| 202 | 
            -
             | 
| 200 | 
            +
            PreservedError LocalTableStorage::AppendToIndexes(DuckTransaction &transaction, RowGroupCollection &source,
         | 
| 201 | 
            +
                                                              TableIndexList &index_list, const vector<LogicalType> &table_types,
         | 
| 202 | 
            +
                                                              row_t &start_row) {
         | 
| 203 203 | 
             
            	// only need to scan for index append
         | 
| 204 204 | 
             
            	// figure out which columns we need to scan for the set of indexes
         | 
| 205 205 | 
             
            	auto columns = index_list.GetRequiredColumns();
         | 
| 206 206 | 
             
            	// create an empty mock chunk that contains all the correct types for the table
         | 
| 207 207 | 
             
            	DataChunk mock_chunk;
         | 
| 208 208 | 
             
            	mock_chunk.InitializeEmpty(table_types);
         | 
| 209 | 
            -
            	 | 
| 209 | 
            +
            	PreservedError error;
         | 
| 210 210 | 
             
            	source.Scan(transaction, columns, [&](DataChunk &chunk) -> bool {
         | 
| 211 211 | 
             
            		// construct the mock chunk by referencing the required columns
         | 
| 212 212 | 
             
            		for (idx_t i = 0; i < columns.size(); i++) {
         | 
| @@ -214,28 +214,28 @@ bool LocalTableStorage::AppendToIndexes(DuckTransaction &transaction, RowGroupCo | |
| 214 214 | 
             
            		}
         | 
| 215 215 | 
             
            		mock_chunk.SetCardinality(chunk);
         | 
| 216 216 | 
             
            		// append this chunk to the indexes of the table
         | 
| 217 | 
            -
            		 | 
| 218 | 
            -
             | 
| 217 | 
            +
            		error = DataTable::AppendToIndexes(index_list, mock_chunk, start_row);
         | 
| 218 | 
            +
            		if (error) {
         | 
| 219 219 | 
             
            			return false;
         | 
| 220 220 | 
             
            		}
         | 
| 221 221 | 
             
            		start_row += chunk.size();
         | 
| 222 222 | 
             
            		return true;
         | 
| 223 223 | 
             
            	});
         | 
| 224 | 
            -
            	return  | 
| 224 | 
            +
            	return error;
         | 
| 225 225 | 
             
            }
         | 
| 226 226 |  | 
| 227 227 | 
             
            void LocalTableStorage::AppendToIndexes(DuckTransaction &transaction, TableAppendState &append_state,
         | 
| 228 228 | 
             
                                                    idx_t append_count, bool append_to_table) {
         | 
| 229 | 
            -
            	bool constraint_violated = false;
         | 
| 230 229 | 
             
            	if (append_to_table) {
         | 
| 231 230 | 
             
            		table->InitializeAppend(transaction, append_state, append_count);
         | 
| 232 231 | 
             
            	}
         | 
| 232 | 
            +
            	PreservedError error;
         | 
| 233 233 | 
             
            	if (append_to_table) {
         | 
| 234 234 | 
             
            		// appending: need to scan entire
         | 
| 235 235 | 
             
            		row_groups->Scan(transaction, [&](DataChunk &chunk) -> bool {
         | 
| 236 236 | 
             
            			// append this chunk to the indexes of the table
         | 
| 237 | 
            -
            			 | 
| 238 | 
            -
             | 
| 237 | 
            +
            			error = table->AppendToIndexes(chunk, append_state.current_row);
         | 
| 238 | 
            +
            			if (error) {
         | 
| 239 239 | 
             
            				return false;
         | 
| 240 240 | 
             
            			}
         | 
| 241 241 | 
             
            			// append to base table
         | 
| @@ -243,11 +243,10 @@ void LocalTableStorage::AppendToIndexes(DuckTransaction &transaction, TableAppen | |
| 243 243 | 
             
            			return true;
         | 
| 244 244 | 
             
            		});
         | 
| 245 245 | 
             
            	} else {
         | 
| 246 | 
            -
            		 | 
| 247 | 
            -
             | 
| 246 | 
            +
            		error = AppendToIndexes(transaction, *row_groups, table->info->indexes, table->GetTypes(),
         | 
| 247 | 
            +
            		                        append_state.current_row);
         | 
| 248 248 | 
             
            	}
         | 
| 249 | 
            -
            	if ( | 
| 250 | 
            -
            		PreservedError error;
         | 
| 249 | 
            +
            	if (error) {
         | 
| 251 250 | 
             
            		// need to revert the append
         | 
| 252 251 | 
             
            		row_t current_row = append_state.row_start;
         | 
| 253 252 | 
             
            		// remove the data from the indexes, if there are any indexes
         | 
| @@ -273,10 +272,7 @@ void LocalTableStorage::AppendToIndexes(DuckTransaction &transaction, TableAppen | |
| 273 272 | 
             
            		if (append_to_table) {
         | 
| 274 273 | 
             
            			table->RevertAppendInternal(append_state.row_start, append_count);
         | 
| 275 274 | 
             
            		}
         | 
| 276 | 
            -
            		 | 
| 277 | 
            -
            			error.Throw();
         | 
| 278 | 
            -
            		}
         | 
| 279 | 
            -
            		throw ConstraintException("PRIMARY KEY or UNIQUE constraint violated: duplicated key");
         | 
| 275 | 
            +
            		error.Throw();
         | 
| 280 276 | 
             
            	}
         | 
| 281 277 | 
             
            }
         | 
| 282 278 |  | 
| @@ -412,8 +408,9 @@ void LocalStorage::Append(LocalAppendState &state, DataChunk &chunk) { | |
| 412 408 | 
             
            	// append to unique indices (if any)
         | 
| 413 409 | 
             
            	auto storage = state.storage;
         | 
| 414 410 | 
             
            	idx_t base_id = MAX_ROW_ID + storage->row_groups->GetTotalRows() + state.append_state.total_append_count;
         | 
| 415 | 
            -
            	 | 
| 416 | 
            -
             | 
| 411 | 
            +
            	auto error = DataTable::AppendToIndexes(storage->indexes, chunk, base_id);
         | 
| 412 | 
            +
            	if (error) {
         | 
| 413 | 
            +
            		error.Throw();
         | 
| 417 414 | 
             
            	}
         | 
| 418 415 |  | 
| 419 416 | 
             
            	//! Append the chunk to the local storage
         | 
| @@ -434,9 +431,9 @@ void LocalStorage::LocalMerge(DataTable *table, RowGroupCollection &collection) | |
| 434 431 | 
             
            	if (!storage->indexes.Empty()) {
         | 
| 435 432 | 
             
            		// append data to indexes if required
         | 
| 436 433 | 
             
            		row_t base_id = MAX_ROW_ID + storage->row_groups->GetTotalRows();
         | 
| 437 | 
            -
            		 | 
| 438 | 
            -
            		if ( | 
| 439 | 
            -
            			 | 
| 434 | 
            +
            		auto error = storage->AppendToIndexes(transaction, collection, storage->indexes, table->GetTypes(), base_id);
         | 
| 435 | 
            +
            		if (error) {
         | 
| 436 | 
            +
            			error.Throw();
         | 
| 440 437 | 
             
            		}
         | 
| 441 438 | 
             
            	}
         | 
| 442 439 | 
             
            	storage->row_groups->MergeStorage(collection);
         | 
| @@ -1,5 +1,7 @@ | |
| 1 1 | 
             
            #include "duckdb/storage/meta_block_reader.hpp"
         | 
| 2 2 | 
             
            #include "duckdb/storage/buffer_manager.hpp"
         | 
| 3 | 
            +
            #include "duckdb/main/connection_manager.hpp"
         | 
| 4 | 
            +
            #include "duckdb/main/database.hpp"
         | 
| 3 5 |  | 
| 4 6 | 
             
            #include <cstring>
         | 
| 5 7 |  | 
| @@ -34,6 +36,16 @@ void MetaBlockReader::ReadData(data_ptr_t buffer, idx_t read_size) { | |
| 34 36 | 
             
            	offset += read_size;
         | 
| 35 37 | 
             
            }
         | 
| 36 38 |  | 
| 39 | 
            +
            ClientContext &MetaBlockReader::GetContext() {
         | 
| 40 | 
            +
            	if (!context) {
         | 
| 41 | 
            +
            		throw InternalException("Meta Block Reader is missing context");
         | 
| 42 | 
            +
            	}
         | 
| 43 | 
            +
            	return *context;
         | 
| 44 | 
            +
            }
         | 
| 45 | 
            +
            Catalog *MetaBlockReader::GetCatalog() {
         | 
| 46 | 
            +
            	return catalog;
         | 
| 47 | 
            +
            }
         | 
| 48 | 
            +
             | 
| 37 49 | 
             
            void MetaBlockReader::ReadNewBlock(block_id_t id) {
         | 
| 38 50 | 
             
            	auto &buffer_manager = block_manager.buffer_manager;
         | 
| 39 51 |  | 
| @@ -52,4 +64,14 @@ void MetaBlockReader::ReadNewBlock(block_id_t id) { | |
| 52 64 | 
             
            	offset = sizeof(block_id_t);
         | 
| 53 65 | 
             
            }
         | 
| 54 66 |  | 
| 67 | 
            +
            void MetaBlockReader::SetCatalog(Catalog *catalog_p) {
         | 
| 68 | 
            +
            	D_ASSERT(!catalog);
         | 
| 69 | 
            +
            	catalog = catalog_p;
         | 
| 70 | 
            +
            }
         | 
| 71 | 
            +
             | 
| 72 | 
            +
            void MetaBlockReader::SetContext(ClientContext *context_p) {
         | 
| 73 | 
            +
            	D_ASSERT(!context);
         | 
| 74 | 
            +
            	context = context_p;
         | 
| 75 | 
            +
            }
         | 
| 76 | 
            +
             | 
| 55 77 | 
             
            } // namespace duckdb
         |