Skip to content

Commit 08a8bf7

Browse files
Update vendored DuckDB sources to 0069af20ab
1 parent 239f150 commit 08a8bf7

File tree

120 files changed

+1328
-377
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

120 files changed

+1328
-377
lines changed

CMakeLists.txt

+36-36
Original file line numberDiff line numberDiff line change
@@ -334,45 +334,45 @@ set(DUCKDB_SRC_FILES
334334
src/duckdb/third_party/zstd/dict/divsufsort.cpp
335335
src/duckdb/third_party/zstd/dict/fastcover.cpp
336336
src/duckdb/third_party/zstd/dict/zdict.cpp
337+
src/duckdb/extension/core_functions/function_list.cpp
337338
src/duckdb/extension/core_functions/lambda_functions.cpp
338339
src/duckdb/extension/core_functions/core_functions_extension.cpp
339-
src/duckdb/extension/core_functions/function_list.cpp
340-
src/duckdb/ub_extension_core_functions_aggregate_distributive.cpp
341-
src/duckdb/ub_extension_core_functions_aggregate_regression.cpp
342-
src/duckdb/ub_extension_core_functions_aggregate_nested.cpp
343-
src/duckdb/ub_extension_core_functions_aggregate_holistic.cpp
344-
src/duckdb/ub_extension_core_functions_aggregate_algebraic.cpp
345-
src/duckdb/ub_extension_core_functions_scalar_union.cpp
340+
src/duckdb/ub_extension_core_functions_scalar_struct.cpp
341+
src/duckdb/ub_extension_core_functions_scalar_bit.cpp
342+
src/duckdb/ub_extension_core_functions_scalar_blob.cpp
346343
src/duckdb/ub_extension_core_functions_scalar_generic.cpp
344+
src/duckdb/ub_extension_core_functions_scalar_string.cpp
345+
src/duckdb/ub_extension_core_functions_scalar_union.cpp
346+
src/duckdb/ub_extension_core_functions_scalar_list.cpp
347+
src/duckdb/ub_extension_core_functions_scalar_random.cpp
347348
src/duckdb/ub_extension_core_functions_scalar_enum.cpp
348-
src/duckdb/ub_extension_core_functions_scalar_blob.cpp
349-
src/duckdb/ub_extension_core_functions_scalar_array.cpp
350349
src/duckdb/ub_extension_core_functions_scalar_map.cpp
351-
src/duckdb/ub_extension_core_functions_scalar_math.cpp
350+
src/duckdb/ub_extension_core_functions_scalar_operators.cpp
352351
src/duckdb/ub_extension_core_functions_scalar_debug.cpp
353-
src/duckdb/ub_extension_core_functions_scalar_list.cpp
354-
src/duckdb/ub_extension_core_functions_scalar_string.cpp
355-
src/duckdb/ub_extension_core_functions_scalar_random.cpp
356352
src/duckdb/ub_extension_core_functions_scalar_date.cpp
357-
src/duckdb/ub_extension_core_functions_scalar_struct.cpp
358-
src/duckdb/ub_extension_core_functions_scalar_operators.cpp
359-
src/duckdb/ub_extension_core_functions_scalar_bit.cpp
353+
src/duckdb/ub_extension_core_functions_scalar_math.cpp
354+
src/duckdb/ub_extension_core_functions_scalar_array.cpp
355+
src/duckdb/ub_extension_core_functions_aggregate_algebraic.cpp
356+
src/duckdb/ub_extension_core_functions_aggregate_regression.cpp
357+
src/duckdb/ub_extension_core_functions_aggregate_holistic.cpp
358+
src/duckdb/ub_extension_core_functions_aggregate_nested.cpp
359+
src/duckdb/ub_extension_core_functions_aggregate_distributive.cpp
360+
src/duckdb/extension/parquet/parquet_extension.cpp
361+
src/duckdb/extension/parquet/geo_parquet.cpp
362+
src/duckdb/extension/parquet/column_reader.cpp
363+
src/duckdb/extension/parquet/parquet_timestamp.cpp
360364
src/duckdb/extension/parquet/column_writer.cpp
361-
src/duckdb/extension/parquet/serialize_parquet.cpp
362-
src/duckdb/extension/parquet/parquet_float16.cpp
365+
src/duckdb/extension/parquet/zstd_file_system.cpp
363366
src/duckdb/extension/parquet/parquet_reader.cpp
364-
src/duckdb/extension/parquet/parquet_statistics.cpp
367+
src/duckdb/extension/parquet/serialize_parquet.cpp
365368
src/duckdb/extension/parquet/parquet_writer.cpp
366-
src/duckdb/extension/parquet/zstd_file_system.cpp
369+
src/duckdb/extension/parquet/parquet_float16.cpp
367370
src/duckdb/extension/parquet/parquet_crypto.cpp
368-
src/duckdb/extension/parquet/parquet_extension.cpp
369-
src/duckdb/extension/parquet/column_reader.cpp
370-
src/duckdb/extension/parquet/geo_parquet.cpp
371371
src/duckdb/extension/parquet/parquet_metadata.cpp
372-
src/duckdb/extension/parquet/parquet_timestamp.cpp
373-
src/duckdb/ub_extension_parquet_writer.cpp
374-
src/duckdb/ub_extension_parquet_reader.cpp
372+
src/duckdb/extension/parquet/parquet_statistics.cpp
375373
src/duckdb/ub_extension_parquet_decoder.cpp
374+
src/duckdb/ub_extension_parquet_reader.cpp
375+
src/duckdb/ub_extension_parquet_writer.cpp
376376
src/duckdb/third_party/parquet/parquet_types.cpp
377377
src/duckdb/third_party/thrift/thrift/protocol/TProtocol.cpp
378378
src/duckdb/third_party/thrift/thrift/transport/TTransportException.cpp
@@ -411,30 +411,30 @@ set(DUCKDB_SRC_FILES
411411
src/duckdb/third_party/brotli/enc/metablock.cpp
412412
src/duckdb/third_party/brotli/enc/static_dict.cpp
413413
src/duckdb/third_party/brotli/enc/utf8_util.cpp
414-
src/duckdb/extension/icu/./icu-timezone.cpp
415-
src/duckdb/extension/icu/./icu-timebucket.cpp
416414
src/duckdb/extension/icu/./icu-strptime.cpp
417-
src/duckdb/extension/icu/./icu-datefunc.cpp
415+
src/duckdb/extension/icu/./icu-timebucket.cpp
418416
src/duckdb/extension/icu/./icu_extension.cpp
419-
src/duckdb/extension/icu/./icu-table-range.cpp
420417
src/duckdb/extension/icu/./icu-datesub.cpp
421-
src/duckdb/extension/icu/./icu-list-range.cpp
418+
src/duckdb/extension/icu/./icu-datefunc.cpp
419+
src/duckdb/extension/icu/./icu-table-range.cpp
422420
src/duckdb/extension/icu/./icu-makedate.cpp
423421
src/duckdb/extension/icu/./icu-datetrunc.cpp
424422
src/duckdb/extension/icu/./icu-datepart.cpp
425-
src/duckdb/extension/icu/./icu-current.cpp
423+
src/duckdb/extension/icu/./icu-timezone.cpp
426424
src/duckdb/extension/icu/./icu-dateadd.cpp
425+
src/duckdb/extension/icu/./icu-current.cpp
426+
src/duckdb/extension/icu/./icu-list-range.cpp
427427
src/duckdb/ub_extension_icu_third_party_icu_common.cpp
428428
src/duckdb/ub_extension_icu_third_party_icu_i18n.cpp
429429
src/duckdb/extension/icu/third_party/icu/stubdata/stubdata.cpp
430-
src/duckdb/extension/json/json_multi_file_info.cpp
431-
src/duckdb/extension/json/json_deserializer.cpp
432430
src/duckdb/extension/json/json_enums.cpp
433-
src/duckdb/extension/json/json_scan.cpp
434-
src/duckdb/extension/json/json_functions.cpp
431+
src/duckdb/extension/json/json_multi_file_info.cpp
435432
src/duckdb/extension/json/serialize_json.cpp
433+
src/duckdb/extension/json/json_scan.cpp
436434
src/duckdb/extension/json/json_common.cpp
435+
src/duckdb/extension/json/json_functions.cpp
437436
src/duckdb/extension/json/json_reader.cpp
437+
src/duckdb/extension/json/json_deserializer.cpp
438438
src/duckdb/extension/json/json_extension.cpp
439439
src/duckdb/extension/json/json_serializer.cpp
440440
src/duckdb/ub_extension_json_json_functions.cpp)

src/duckdb/extension/core_functions/aggregate/distributive/kurtosis.cpp

+10-6
Original file line numberDiff line numberDiff line change
@@ -99,15 +99,19 @@ struct KurtosisOperation {
9999
};
100100

101101
AggregateFunction KurtosisFun::GetFunction() {
102-
return AggregateFunction::UnaryAggregate<KurtosisState, double, double,
103-
KurtosisOperation<KurtosisFlagBiasCorrection>>(LogicalType::DOUBLE,
104-
LogicalType::DOUBLE);
102+
auto result =
103+
AggregateFunction::UnaryAggregate<KurtosisState, double, double, KurtosisOperation<KurtosisFlagBiasCorrection>>(
104+
LogicalType::DOUBLE, LogicalType::DOUBLE);
105+
result.errors = FunctionErrors::CAN_THROW_RUNTIME_ERROR;
106+
return result;
105107
}
106108

107109
AggregateFunction KurtosisPopFun::GetFunction() {
108-
return AggregateFunction::UnaryAggregate<KurtosisState, double, double,
109-
KurtosisOperation<KurtosisFlagNoBiasCorrection>>(LogicalType::DOUBLE,
110-
LogicalType::DOUBLE);
110+
auto result = AggregateFunction::UnaryAggregate<KurtosisState, double, double,
111+
KurtosisOperation<KurtosisFlagNoBiasCorrection>>(
112+
LogicalType::DOUBLE, LogicalType::DOUBLE);
113+
result.errors = FunctionErrors::CAN_THROW_RUNTIME_ERROR;
114+
return result;
111115
}
112116

113117
} // namespace duckdb

src/duckdb/extension/core_functions/function_list.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ static const StaticFunctionDefinition core_functions[] = {
122122
DUCKDB_AGGREGATE_FUNCTION(BoolOrFun),
123123
DUCKDB_SCALAR_FUNCTION(CanCastImplicitlyFun),
124124
DUCKDB_SCALAR_FUNCTION(CardinalityFun),
125+
DUCKDB_SCALAR_FUNCTION(CastToTypeFun),
125126
DUCKDB_SCALAR_FUNCTION(CbrtFun),
126127
DUCKDB_SCALAR_FUNCTION_SET(CeilFun),
127128
DUCKDB_SCALAR_FUNCTION_SET_ALIAS(CeilingFun),

src/duckdb/extension/core_functions/include/core_functions/scalar/generic_functions.hpp

+10
Original file line numberDiff line numberDiff line change
@@ -185,4 +185,14 @@ struct IsHistogramOtherBinFun {
185185
static ScalarFunction GetFunction();
186186
};
187187

188+
struct CastToTypeFun {
189+
static constexpr const char *Name = "cast_to_type";
190+
static constexpr const char *Parameters = "param,type";
191+
static constexpr const char *Description = "Casts the first argument to the type of the second argument";
192+
static constexpr const char *Example = "cast_to_type('42', NULL::INTEGER)";
193+
static constexpr const char *Categories = "";
194+
195+
static ScalarFunction GetFunction();
196+
};
197+
188198
} // namespace duckdb
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#include "core_functions/scalar/generic_functions.hpp"
2+
#include "duckdb/planner/expression/bound_cast_expression.hpp"
3+
4+
namespace duckdb {
5+
6+
static void CastToTypeFunction(DataChunk &args, ExpressionState &state, Vector &result) {
7+
throw InternalException("CastToType function cannot be executed directly");
8+
}
9+
10+
unique_ptr<Expression> BindCastToTypeFunction(FunctionBindExpressionInput &input) {
11+
auto &return_type = input.children[1]->return_type;
12+
if (return_type.id() == LogicalTypeId::UNKNOWN) {
13+
// parameter - unknown return type
14+
throw ParameterNotResolvedException();
15+
}
16+
if (return_type.id() == LogicalTypeId::SQLNULL) {
17+
throw InvalidInputException("cast_to_type cannot be used to cast to NULL");
18+
}
19+
return BoundCastExpression::AddCastToType(input.context, std::move(input.children[0]), return_type);
20+
}
21+
22+
ScalarFunction CastToTypeFun::GetFunction() {
23+
auto fun = ScalarFunction({LogicalType::ANY, LogicalType::ANY}, LogicalType::ANY, CastToTypeFunction);
24+
fun.null_handling = FunctionNullHandling::SPECIAL_HANDLING;
25+
fun.bind_expression = BindCastToTypeFunction;
26+
return fun;
27+
}
28+
29+
} // namespace duckdb

src/duckdb/extension/icu/icu-timezone.cpp

+11-5
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
#include "duckdb/function/cast/cast_function_set.hpp"
66
#include "duckdb/function/cast_rules.hpp"
77
#include "duckdb/main/extension_util.hpp"
8-
#include "duckdb/parser/parsed_data/create_scalar_function_info.hpp"
9-
#include "duckdb/parser/parsed_data/create_table_function_info.hpp"
108
#include "include/icu-casts.hpp"
119
#include "include/icu-datefunc.hpp"
1210
#include "duckdb/transaction/meta_transaction.hpp"
@@ -149,14 +147,14 @@ struct ICUFromNaiveTimestamp : public ICUDateFunc {
149147
}
150148
};
151149

152-
template <class OP>
150+
template <class OP, class T = timestamp_t>
153151
static bool CastFromNaive(Vector &source, Vector &result, idx_t count, CastParameters &parameters) {
154152
auto &cast_data = parameters.cast_data->Cast<CastData>();
155153
auto &info = cast_data.info->Cast<BindData>();
156154
CalendarPtr calendar(info.calendar->clone());
157155

158-
UnaryExecutor::Execute<timestamp_t, timestamp_t>(source, result, count, [&](timestamp_t input) {
159-
return Operation(calendar.get(), OP::template Operation<timestamp_t, timestamp_t>(input));
156+
UnaryExecutor::Execute<T, timestamp_t>(source, result, count, [&](T input) {
157+
return Operation(calendar.get(), OP::template Operation<T, timestamp_t>(input));
160158
});
161159
return true;
162160
}
@@ -165,6 +163,11 @@ struct ICUFromNaiveTimestamp : public ICUDateFunc {
165163
if (!input.context) {
166164
throw InternalException("Missing context for TIMESTAMP to TIMESTAMPTZ cast.");
167165
}
166+
if (input.context->config.disable_timestamptz_casts) {
167+
throw BinderException("Casting from TIMESTAMP to TIMESTAMP WITH TIME ZONE without an explicit time zone "
168+
"has been disabled - use \"AT TIME ZONE ...\"",
169+
LogicalTypeIdToString(source.id()));
170+
}
168171

169172
auto cast_data = make_uniq<CastData>(make_uniq<BindData>(*input.context));
170173
switch (source.id()) {
@@ -176,6 +179,8 @@ struct ICUFromNaiveTimestamp : public ICUDateFunc {
176179
return BoundCastInfo(CastFromNaive<CastTimestampNsToUs>, std::move(cast_data));
177180
case LogicalTypeId::TIMESTAMP_SEC:
178181
return BoundCastInfo(CastFromNaive<CastTimestampSecToUs>, std::move(cast_data));
182+
case LogicalTypeId::DATE:
183+
return BoundCastInfo(CastFromNaive<Cast, date_t>, std::move(cast_data));
179184
default:
180185
throw InternalException("Type %s not handled in BindCastFromNaive", LogicalTypeIdToString(source.id()));
181186
}
@@ -190,6 +195,7 @@ struct ICUFromNaiveTimestamp : public ICUDateFunc {
190195
casts.RegisterCastFunction(LogicalType::TIMESTAMP_MS, LogicalType::TIMESTAMP_TZ, BindCastFromNaive);
191196
casts.RegisterCastFunction(LogicalType::TIMESTAMP_NS, LogicalType::TIMESTAMP_TZ, BindCastFromNaive);
192197
casts.RegisterCastFunction(LogicalType::TIMESTAMP_S, LogicalType::TIMESTAMP_TZ, BindCastFromNaive);
198+
casts.RegisterCastFunction(LogicalType::DATE, LogicalType::TIMESTAMP_TZ, BindCastFromNaive);
193199
}
194200
};
195201

src/duckdb/extension/parquet/decoder/dictionary_decoder.cpp

+23-10
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
#include "column_reader.hpp"
33
#include "parquet_reader.hpp"
44
#include "duckdb/planner/filter/conjunction_filter.hpp"
5-
#include "duckdb/planner/filter/constant_filter.hpp"
6-
#include "duckdb/planner/filter/struct_filter.hpp"
5+
#include "duckdb/planner/filter/expression_filter.hpp"
6+
#include "duckdb/planner/table_filter_state.hpp"
77

88
namespace duckdb {
99

@@ -35,7 +35,7 @@ void DictionaryDecoder::InitializeDictionary(idx_t new_dictionary_size, optional
3535
}
3636
reader.Plain(reader.block, nullptr, dictionary_size, 0, *dictionary);
3737

38-
if (filter && CanFilter(*filter)) {
38+
if (filter && CanFilter(*filter, *filter_state)) {
3939
// no filter result yet - apply filter to the dictionary
4040
// initialize the filter result - setting everything to false
4141
filter_result = make_unsafe_uniq_array<bool>(dictionary_size);
@@ -135,21 +135,27 @@ void DictionaryDecoder::Skip(uint8_t *defines, idx_t skip_count) {
135135
dict_decoder->Skip(valid_count);
136136
}
137137

138-
bool DictionarySupportsFilter(const TableFilter &filter) {
138+
bool DictionaryDecoder::DictionarySupportsFilter(const TableFilter &filter, TableFilterState &filter_state) {
139139
switch (filter.filter_type) {
140140
case TableFilterType::CONJUNCTION_OR: {
141141
auto &conjunction = filter.Cast<ConjunctionOrFilter>();
142-
for (auto &child_filter : conjunction.child_filters) {
143-
if (!DictionarySupportsFilter(*child_filter)) {
142+
auto &state = filter_state.Cast<ConjunctionOrFilterState>();
143+
for (idx_t child_idx = 0; child_idx < conjunction.child_filters.size(); child_idx++) {
144+
auto &child_filter = *conjunction.child_filters[child_idx];
145+
auto &child_state = *state.child_states[child_idx];
146+
if (!DictionarySupportsFilter(child_filter, child_state)) {
144147
return false;
145148
}
146149
}
147150
return true;
148151
}
149152
case TableFilterType::CONJUNCTION_AND: {
150153
auto &conjunction = filter.Cast<ConjunctionAndFilter>();
151-
for (auto &child_filter : conjunction.child_filters) {
152-
if (!DictionarySupportsFilter(*child_filter)) {
154+
auto &state = filter_state.Cast<ConjunctionAndFilterState>();
155+
for (idx_t child_idx = 0; child_idx < conjunction.child_filters.size(); child_idx++) {
156+
auto &child_filter = *conjunction.child_filters[child_idx];
157+
auto &child_state = *state.child_states[child_idx];
158+
if (!DictionarySupportsFilter(child_filter, child_state)) {
153159
return false;
154160
}
155161
}
@@ -158,6 +164,13 @@ bool DictionarySupportsFilter(const TableFilter &filter) {
158164
case TableFilterType::CONSTANT_COMPARISON:
159165
case TableFilterType::IS_NOT_NULL:
160166
return true;
167+
case TableFilterType::EXPRESSION_FILTER: {
168+
// expression filters can only be pushed into the dictionary if they filter out NULL values
169+
auto &expr_filter = filter.Cast<ExpressionFilter>();
170+
auto &state = filter_state.Cast<ExpressionFilterState>();
171+
auto emits_nulls = expr_filter.EvaluateWithConstant(state.executor, Value(reader.Type()));
172+
return !emits_nulls;
173+
}
161174
case TableFilterType::IS_NULL:
162175
case TableFilterType::DYNAMIC_FILTER:
163176
case TableFilterType::OPTIONAL_FILTER:
@@ -167,12 +180,12 @@ bool DictionarySupportsFilter(const TableFilter &filter) {
167180
}
168181
}
169182

170-
bool DictionaryDecoder::CanFilter(const TableFilter &filter) {
183+
bool DictionaryDecoder::CanFilter(const TableFilter &filter, TableFilterState &filter_state) {
171184
if (dictionary_size == 0) {
172185
return false;
173186
}
174187
// We can only push the filter if the filter removes NULL values
175-
if (!DictionarySupportsFilter(filter)) {
188+
if (!DictionarySupportsFilter(filter, filter_state)) {
176189
return false;
177190
}
178191
return true;

src/duckdb/extension/parquet/include/decoder/dictionary_decoder.hpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ class DictionaryDecoder {
2626
void InitializePage();
2727
idx_t Read(uint8_t *defines, idx_t read_count, Vector &result, idx_t result_offset);
2828
void Skip(uint8_t *defines, idx_t skip_count);
29-
bool CanFilter(const TableFilter &filter);
29+
bool CanFilter(const TableFilter &filter, TableFilterState &filter_state);
30+
bool DictionarySupportsFilter(const TableFilter &filter, TableFilterState &filter_state);
3031
void Filter(uint8_t *defines, idx_t read_count, Vector &result, SelectionVector &sel, idx_t &approved_tuple_count);
3132
bool HasFilter() const {
3233
return filter_result.get();

src/duckdb/extension/parquet/parquet_extension.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -250,12 +250,17 @@ class ParquetScanFunction {
250250
table_function.statistics = MultiFileFunction<ParquetMultiFileInfo>::MultiFileScanStats;
251251
table_function.serialize = ParquetScanSerialize;
252252
table_function.deserialize = ParquetScanDeserialize;
253+
table_function.pushdown_expression = ParquetScanPushdownExpression;
253254
table_function.filter_pushdown = true;
254255
table_function.filter_prune = true;
255256

256257
return MultiFileReader::CreateFunctionSet(static_cast<TableFunction>(table_function));
257258
}
258259

260+
static bool ParquetScanPushdownExpression(ClientContext &context, const LogicalGet &get, Expression &expr) {
261+
return true;
262+
}
263+
259264
static void VerifyParquetSchemaParameter(const Value &schema) {
260265
LogicalType::MAP(LogicalType::BLOB, LogicalType::STRUCT({{{"name", LogicalType::VARCHAR},
261266
{"type", LogicalType::VARCHAR},

src/duckdb/extension/parquet/parquet_reader.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1056,7 +1056,7 @@ idx_t ParquetReader::NumRowGroups() const {
10561056

10571057
ParquetScanFilter::ParquetScanFilter(ClientContext &context, idx_t filter_idx, TableFilter &filter)
10581058
: filter_idx(filter_idx), filter(filter) {
1059-
filter_state = TableFilterState::Initialize(filter);
1059+
filter_state = TableFilterState::Initialize(context, filter);
10601060
}
10611061

10621062
ParquetScanFilter::~ParquetScanFilter() {

0 commit comments

Comments
 (0)