Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 39 additions & 39 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -340,46 +340,46 @@ set(DUCKDB_SRC_FILES
src/duckdb/third_party/zstd/dict/divsufsort.cpp
src/duckdb/third_party/zstd/dict/fastcover.cpp
src/duckdb/third_party/zstd/dict/zdict.cpp
src/duckdb/extension/core_functions/function_list.cpp
src/duckdb/extension/core_functions/core_functions_extension.cpp
src/duckdb/extension/core_functions/lambda_functions.cpp
src/duckdb/extension/core_functions/function_list.cpp
src/duckdb/ub_extension_core_functions_aggregate_nested.cpp
src/duckdb/ub_extension_core_functions_aggregate_holistic.cpp
src/duckdb/ub_extension_core_functions_aggregate_regression.cpp
src/duckdb/ub_extension_core_functions_aggregate_algebraic.cpp
src/duckdb/ub_extension_core_functions_aggregate_distributive.cpp
src/duckdb/ub_extension_core_functions_scalar_string.cpp
src/duckdb/ub_extension_core_functions_scalar_enum.cpp
src/duckdb/ub_extension_core_functions_scalar_blob.cpp
src/duckdb/ub_extension_core_functions_scalar_map.cpp
src/duckdb/ub_extension_core_functions_scalar_array.cpp
src/duckdb/ub_extension_core_functions_scalar_bit.cpp
src/duckdb/ub_extension_core_functions_scalar_union.cpp
src/duckdb/ub_extension_core_functions_scalar_blob.cpp
src/duckdb/ub_extension_core_functions_scalar_debug.cpp
src/duckdb/ub_extension_core_functions_scalar_struct.cpp
src/duckdb/ub_extension_core_functions_scalar_random.cpp
src/duckdb/ub_extension_core_functions_scalar_date.cpp
src/duckdb/ub_extension_core_functions_scalar_operators.cpp
src/duckdb/ub_extension_core_functions_scalar_list.cpp
src/duckdb/ub_extension_core_functions_scalar_math.cpp
src/duckdb/ub_extension_core_functions_scalar_operators.cpp
src/duckdb/ub_extension_core_functions_scalar_enum.cpp
src/duckdb/ub_extension_core_functions_scalar_array.cpp
src/duckdb/ub_extension_core_functions_scalar_date.cpp
src/duckdb/ub_extension_core_functions_scalar_map.cpp
src/duckdb/ub_extension_core_functions_scalar_generic.cpp
src/duckdb/ub_extension_core_functions_scalar_bit.cpp
src/duckdb/ub_extension_core_functions_scalar_struct.cpp
src/duckdb/ub_extension_core_functions_aggregate_regression.cpp
src/duckdb/ub_extension_core_functions_aggregate_distributive.cpp
src/duckdb/ub_extension_core_functions_aggregate_nested.cpp
src/duckdb/ub_extension_core_functions_aggregate_holistic.cpp
src/duckdb/ub_extension_core_functions_aggregate_algebraic.cpp
src/duckdb/extension/parquet/parquet_extension.cpp
src/duckdb/extension/parquet/parquet_file_metadata_cache.cpp
src/duckdb/extension/parquet/serialize_parquet.cpp
src/duckdb/extension/parquet/parquet_metadata.cpp
src/duckdb/extension/parquet/parquet_crypto.cpp
src/duckdb/extension/parquet/parquet_float16.cpp
src/duckdb/extension/parquet/zstd_file_system.cpp
src/duckdb/extension/parquet/geo_parquet.cpp
src/duckdb/extension/parquet/parquet_writer.cpp
src/duckdb/extension/parquet/parquet_statistics.cpp
src/duckdb/extension/parquet/column_reader.cpp
src/duckdb/extension/parquet/parquet_reader.cpp
src/duckdb/extension/parquet/column_writer.cpp
src/duckdb/extension/parquet/geo_parquet.cpp
src/duckdb/extension/parquet/parquet_timestamp.cpp
src/duckdb/extension/parquet/parquet_crypto.cpp
src/duckdb/extension/parquet/parquet_file_metadata_cache.cpp
src/duckdb/extension/parquet/parquet_reader.cpp
src/duckdb/extension/parquet/parquet_multi_file_info.cpp
src/duckdb/extension/parquet/zstd_file_system.cpp
src/duckdb/ub_extension_parquet_decoder.cpp
src/duckdb/extension/parquet/column_reader.cpp
src/duckdb/extension/parquet/serialize_parquet.cpp
src/duckdb/extension/parquet/parquet_float16.cpp
src/duckdb/extension/parquet/parquet_metadata.cpp
src/duckdb/extension/parquet/parquet_statistics.cpp
src/duckdb/ub_extension_parquet_writer.cpp
src/duckdb/ub_extension_parquet_decoder.cpp
src/duckdb/ub_extension_parquet_reader.cpp
src/duckdb/third_party/parquet/parquet_types.cpp
src/duckdb/third_party/thrift/thrift/protocol/TProtocol.cpp
Expand Down Expand Up @@ -419,32 +419,32 @@ set(DUCKDB_SRC_FILES
src/duckdb/third_party/brotli/enc/metablock.cpp
src/duckdb/third_party/brotli/enc/static_dict.cpp
src/duckdb/third_party/brotli/enc/utf8_util.cpp
src/duckdb/extension/icu/./icu-datesub.cpp
src/duckdb/extension/icu/./icu_extension.cpp
src/duckdb/extension/icu/./icu-makedate.cpp
src/duckdb/extension/icu/./icu-datefunc.cpp
src/duckdb/extension/icu/./icu-timezone.cpp
src/duckdb/extension/icu/./icu-current.cpp
src/duckdb/extension/icu/./icu-list-range.cpp
src/duckdb/extension/icu/./icu-strptime.cpp
src/duckdb/extension/icu/./icu-dateadd.cpp
src/duckdb/extension/icu/./icu-table-range.cpp
src/duckdb/extension/icu/./icu-current.cpp
src/duckdb/extension/icu/./icu-datesub.cpp
src/duckdb/extension/icu/./icu-datetrunc.cpp
src/duckdb/extension/icu/./icu-timebucket.cpp
src/duckdb/extension/icu/./icu-timezone.cpp
src/duckdb/extension/icu/./icu-datepart.cpp
src/duckdb/extension/icu/./icu-datefunc.cpp
src/duckdb/extension/icu/./icu-makedate.cpp
src/duckdb/extension/icu/./icu-datetrunc.cpp
src/duckdb/extension/icu/./icu-strptime.cpp
src/duckdb/extension/icu/./icu_extension.cpp
src/duckdb/ub_extension_icu_third_party_icu_common.cpp
src/duckdb/ub_extension_icu_third_party_icu_i18n.cpp
src/duckdb/extension/icu/third_party/icu/stubdata/stubdata.cpp
src/duckdb/extension/json/json_extension.cpp
src/duckdb/extension/json/json_enums.cpp
src/duckdb/extension/json/json_multi_file_info.cpp
src/duckdb/extension/json/json_reader.cpp
src/duckdb/extension/json/json_scan.cpp
src/duckdb/extension/json/json_serializer.cpp
src/duckdb/extension/json/json_common.cpp
src/duckdb/extension/json/json_functions.cpp
src/duckdb/extension/json/serialize_json.cpp
src/duckdb/extension/json/json_scan.cpp
src/duckdb/extension/json/json_multi_file_info.cpp
src/duckdb/extension/json/json_deserializer.cpp
src/duckdb/extension/json/json_reader.cpp
src/duckdb/extension/json/serialize_json.cpp
src/duckdb/extension/json/json_functions.cpp
src/duckdb/extension/json/json_extension.cpp
src/duckdb/ub_extension_json_json_functions.cpp)

set(JEMALLOC_SRC_FILES
Expand Down
4 changes: 3 additions & 1 deletion src/duckdb/extension/core_functions/scalar/random/random.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,9 @@ struct ExtractTimestampUuidOperator {
}

// UUID v7 begins with a 48 bit big-endian Unix Epoch timestamp with millisecond granularity.
const int64_t upper = input.upper;
int64_t upper = input.upper;
// flip the top byte
upper ^= NumericLimits<int64_t>::Minimum();
int64_t unix_ts_milli = upper;
unix_ts_milli = unix_ts_milli >> 16;

Expand Down
4 changes: 4 additions & 0 deletions src/duckdb/extension/icu/icu-timezone.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,10 @@ struct ICUToNaiveTimestamp : public ICUDateFunc {
if (!input.context) {
throw InternalException("Missing context for TIMESTAMPTZ to TIMESTAMP cast.");
}
if (input.context->config.disable_timestamptz_casts) {
throw BinderException("Casting from TIMESTAMP WITH TIME ZONE to TIMESTAMP without an explicit time zone "
"has been disabled - use \"AT TIME ZONE ...\"");
}

auto cast_data = make_uniq<CastData>(make_uniq<BindData>(*input.context));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -403,7 +403,7 @@ class StandardColumnWriter : public PrimitiveColumnWriter {
break;
}
case duckdb_parquet::Encoding::BYTE_STREAM_SPLIT: {
if (page_state.bss_initialized) {
if (!page_state.bss_initialized) {
page_state.bss_encoder.BeginWrite(BufferAllocator::Get(writer.GetContext()));
page_state.bss_initialized = true;
}
Expand Down
6 changes: 4 additions & 2 deletions src/duckdb/extension/parquet/parquet_float16.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@ float Float16ToFloat32(const uint16_t &float16_value) {
uint32_t sign = float16_value >> 15;
uint32_t exponent = (float16_value >> 10) & 0x1F;
uint32_t fraction = (float16_value & 0x3FF);
uint32_t float32_value;
// Avoid strict aliasing issues and compiler warnings
uint32_t float32_value = 0;

if (exponent == 0) {
if (fraction == 0) {
// zero
Expand Down Expand Up @@ -39,7 +41,7 @@ float Float16ToFloat32(const uint16_t &float16_value) {
float32_value = (sign << 31) | ((exponent + (127 - 15)) << 23) | (fraction << 13);
}

return *reinterpret_cast<float *>(&float32_value);
return Load<float>(const_data_ptr_cast(&float32_value));
}

} // namespace duckdb
2 changes: 1 addition & 1 deletion src/duckdb/extension/parquet/parquet_reader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1116,7 +1116,7 @@ void ParquetReader::InitializeScan(ClientContext &context, ParquetReaderScanStat
state.prefetch_mode = false;
}

state.file_handle = fs.OpenFile(file_handle->GetPath(), flags);
state.file_handle = fs.OpenFile(file, flags);
}
state.adaptive_filter.reset();
state.scan_filters.clear();
Expand Down
17 changes: 13 additions & 4 deletions src/duckdb/extension/parquet/reader/struct_column_reader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -118,12 +118,21 @@ static bool TypeHasExactRowCount(const LogicalType &type) {
}

idx_t StructColumnReader::GroupRowsAvailable() {
for (idx_t i = 0; i < child_readers.size(); i++) {
if (TypeHasExactRowCount(child_readers[i]->Type())) {
return child_readers[i]->GroupRowsAvailable();
for (auto &child : child_readers) {
if (!child) {
continue;
}
if (TypeHasExactRowCount(child->Type())) {
return child->GroupRowsAvailable();
}
}
for (auto &child : child_readers) {
if (!child) {
continue;
}
return child->GroupRowsAvailable();
}
return child_readers[0]->GroupRowsAvailable();
throw InternalException("No projected columns in struct?");
}

} // namespace duckdb
23 changes: 12 additions & 11 deletions src/duckdb/src/common/local_file_system.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -838,21 +838,21 @@ static string AdditionalLockInfo(const std::wstring path) {

status = RmStartSession(&session, 0, session_key);
if (status != ERROR_SUCCESS) {
return "";
return string();
}

PCWSTR path_ptr = path.c_str();
status = RmRegisterResources(session, 1, &path_ptr, 0, NULL, 0, NULL);
if (status != ERROR_SUCCESS) {
return "";
return string();
}
UINT process_info_size_needed, process_info_size;

// we first call with nProcInfo = 0 to find out how much to allocate
process_info_size = 0;
status = RmGetList(session, &process_info_size_needed, &process_info_size, NULL, &reason);
if (status != ERROR_MORE_DATA || process_info_size_needed == 0) {
return "";
return string();
}

// allocate
Expand All @@ -866,8 +866,7 @@ static string AdditionalLockInfo(const std::wstring path) {
return "";
}

string conflict_string = "File is already open in ";

string conflict_string;
for (UINT process_idx = 0; process_idx < process_info_size; process_idx++) {
string process_name = WindowsUtil::UnicodeToUTF8(process_info[process_idx].strAppName);
auto pid = process_info[process_idx].Process.dwProcessId;
Expand All @@ -886,7 +885,10 @@ static string AdditionalLockInfo(const std::wstring path) {
}

RmEndSession(session);
return conflict_string;
if (conflict_string.empty()) {
return string();
}
return "File is already open in " + conflict_string;
}

bool LocalFileSystem::IsPrivateFile(const string &path_p, FileOpener *opener) {
Expand Down Expand Up @@ -950,12 +952,11 @@ unique_ptr<FileHandle> LocalFileSystem::OpenFile(const string &path_p, FileOpenF
}
auto error = LocalFileSystem::GetLastErrorAsString();

auto better_error = AdditionalLockInfo(unicode_path);
if (!better_error.empty()) {
throw IOException(better_error);
} else {
throw IOException("Cannot open file \"%s\": %s", path.c_str(), error);
auto extended_error = AdditionalLockInfo(unicode_path);
if (!extended_error.empty()) {
extended_error = "\n" + extended_error;
}
throw IOException("Cannot open file \"%s\": %s%s", path.c_str(), error, extended_error);
}
auto handle = make_uniq<WindowsFileHandle>(*this, path.c_str(), hFile, flags);
if (flags.OpenForAppending()) {
Expand Down
36 changes: 30 additions & 6 deletions src/duckdb/src/common/multi_file/multi_file_column_mapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,19 @@ ColumnMapResult MapColumnList(ClientContext &context, const MultiFileColumnDefin
result.column_map = Value::STRUCT(std::move(child_list));
}
}
if (is_selected && child_map.default_value) {
// we have default values at a previous level wrap it in a "list"
child_list_t<LogicalType> default_type_list;
default_type_list.emplace_back("list", child_map.default_value->return_type);
vector<unique_ptr<Expression>> default_expressions;
child_map.default_value->alias = "list";
default_expressions.push_back(std::move(child_map.default_value));
auto default_type = LogicalType::STRUCT(std::move(default_type_list));
auto struct_pack_fun = StructPackFun::GetFunction();
auto bind_data = make_uniq<VariableReturnBindData>(default_type);
result.default_value = make_uniq<BoundFunctionExpression>(std::move(default_type), std::move(struct_pack_fun),
std::move(default_expressions), std::move(bind_data));
}
result.column_index = make_uniq<ColumnIndex>(local_id.GetId(), std::move(child_indexes));
result.mapping = std::move(mapping);
return result;
Expand Down Expand Up @@ -347,7 +360,7 @@ ColumnMapResult MapColumnMap(ClientContext &context, const MultiFileColumnDefini

auto nested_mapper = mapper.Create(local_key_value.children);
child_list_t<Value> column_mapping;
unique_ptr<Expression> default_expression;
vector<unique_ptr<Expression>> default_expressions;
unordered_map<idx_t, const_reference<ColumnIndex>> selected_children;
if (global_index.HasChildren()) {
//! FIXME: is this expected for maps??
Expand Down Expand Up @@ -378,6 +391,10 @@ ColumnMapResult MapColumnMap(ClientContext &context, const MultiFileColumnDefini
// found a column mapping for the component - emplace it
column_mapping.emplace_back(name, std::move(map_result.column_map));
}
if (map_result.default_value) {
map_result.default_value->alias = name;
default_expressions.push_back(std::move(map_result.default_value));
}
}

ColumnMapResult result;
Expand All @@ -393,6 +410,18 @@ ColumnMapResult MapColumnMap(ClientContext &context, const MultiFileColumnDefini
result.column_map = Value::STRUCT(std::move(child_list));
}
}
if (!default_expressions.empty()) {
// we have default values at a previous level wrap it in a "list"
child_list_t<LogicalType> default_type_list;
for (auto &expr : default_expressions) {
default_type_list.emplace_back(expr->GetAlias(), expr->return_type);
}
auto default_type = LogicalType::STRUCT(std::move(default_type_list));
auto struct_pack_fun = StructPackFun::GetFunction();
auto bind_data = make_uniq<VariableReturnBindData>(default_type);
result.default_value = make_uniq<BoundFunctionExpression>(std::move(default_type), std::move(struct_pack_fun),
std::move(default_expressions), std::move(bind_data));
}
vector<ColumnIndex> map_indexes;
map_indexes.emplace_back(0, std::move(child_indexes));

Expand Down Expand Up @@ -563,11 +592,6 @@ unique_ptr<Expression> ConstructMapExpression(ClientContext &context, idx_t loca
}
return expr;
}
// struct column - generate a remap_struct - but only if we have any columns to remap
if (mapping.column_map.IsNull()) {
// no columns to map - emit the default value directly
return std::move(mapping.default_value);
}
// generate the remap_struct function call
vector<unique_ptr<Expression>> children;
children.push_back(std::move(expr));
Expand Down
28 changes: 28 additions & 0 deletions src/duckdb/src/common/types.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -648,6 +648,34 @@ bool LogicalType::IsIntegral() const {
}
}

bool LogicalType::IsSigned() const {
switch (id_) {
case LogicalTypeId::TINYINT:
case LogicalTypeId::SMALLINT:
case LogicalTypeId::INTEGER:
case LogicalTypeId::BIGINT:
case LogicalTypeId::HUGEINT:
return true;
default:
break;
}
return false;
}

bool LogicalType::IsUnsigned() const {
switch (id_) {
case LogicalTypeId::UTINYINT:
case LogicalTypeId::USMALLINT:
case LogicalTypeId::UINTEGER:
case LogicalTypeId::UBIGINT:
case LogicalTypeId::UHUGEINT:
return true;
default:
break;
}
return false;
}

bool LogicalType::IsFloating() const {
switch (id_) {
case LogicalTypeId::FLOAT:
Expand Down
2 changes: 1 addition & 1 deletion src/duckdb/src/common/types/row/tuple_data_segment.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ static inline void SwapTupleDataChunk(TupleDataChunk &a, TupleDataChunk &b) noex
std::swap(a.lock, b.lock);
}

TupleDataChunk::TupleDataChunk(TupleDataChunk &&other) noexcept {
TupleDataChunk::TupleDataChunk(TupleDataChunk &&other) noexcept : count(0) {
SwapTupleDataChunk(*this, other);
}

Expand Down
5 changes: 4 additions & 1 deletion src/duckdb/src/common/types/uuid.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,10 @@ hugeint_t UUIDv7::GenerateRandomUUID(RandomEngine &engine) {
// Fill in variant field.
bytes[8] = (bytes[8] & 0x3f) | 0x80;

return Convert(bytes);
// Flip the top byte
auto result = Convert(bytes);
result.upper ^= NumericLimits<int64_t>::Minimum();
return result;
}

hugeint_t UUIDv7::GenerateRandomUUID() {
Expand Down
Loading