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
70 changes: 36 additions & 34 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,7 @@ set(DUCKDB_SRC_FILES
src/duckdb/ub_src_storage_compression_alp.cpp
src/duckdb/ub_src_storage_compression.cpp
src/duckdb/ub_src_storage_compression_chimp.cpp
src/duckdb/ub_src_storage_compression_dict_fsst.cpp
src/duckdb/ub_src_storage_compression_dictionary.cpp
src/duckdb/ub_src_storage_compression_roaring.cpp
src/duckdb/ub_src_storage_metadata.cpp
Expand Down Expand Up @@ -338,43 +339,44 @@ 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/lambda_functions.cpp
src/duckdb/extension/core_functions/function_list.cpp
src/duckdb/extension/core_functions/core_functions_extension.cpp
src/duckdb/ub_extension_core_functions_scalar_struct.cpp
src/duckdb/ub_extension_core_functions_scalar_bit.cpp
src/duckdb/ub_extension_core_functions_scalar_blob.cpp
src/duckdb/ub_extension_core_functions_scalar_generic.cpp
src/duckdb/ub_extension_core_functions_scalar_string.cpp
src/duckdb/ub_extension_core_functions_scalar_union.cpp
src/duckdb/ub_extension_core_functions_scalar_debug.cpp
src/duckdb/ub_extension_core_functions_scalar_math.cpp
src/duckdb/ub_extension_core_functions_scalar_array.cpp
src/duckdb/ub_extension_core_functions_scalar_list.cpp
src/duckdb/ub_extension_core_functions_scalar_date.cpp
src/duckdb/ub_extension_core_functions_scalar_random.cpp
src/duckdb/ub_extension_core_functions_scalar_enum.cpp
src/duckdb/ub_extension_core_functions_scalar_generic.cpp
src/duckdb/ub_extension_core_functions_scalar_struct.cpp
src/duckdb/ub_extension_core_functions_scalar_map.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_operators.cpp
src/duckdb/ub_extension_core_functions_scalar_debug.cpp
src/duckdb/ub_extension_core_functions_scalar_date.cpp
src/duckdb/ub_extension_core_functions_scalar_math.cpp
src/duckdb/ub_extension_core_functions_scalar_array.cpp
src/duckdb/ub_extension_core_functions_aggregate_algebraic.cpp
src/duckdb/ub_extension_core_functions_aggregate_regression.cpp
src/duckdb/ub_extension_core_functions_aggregate_holistic.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_distributive.cpp
src/duckdb/extension/parquet/parquet_extension.cpp
src/duckdb/extension/parquet/geo_parquet.cpp
src/duckdb/extension/parquet/column_reader.cpp
src/duckdb/extension/parquet/parquet_timestamp.cpp
src/duckdb/extension/parquet/column_writer.cpp
src/duckdb/extension/parquet/zstd_file_system.cpp
src/duckdb/ub_extension_core_functions_aggregate_algebraic.cpp
src/duckdb/extension/parquet/parquet_reader.cpp
src/duckdb/extension/parquet/serialize_parquet.cpp
src/duckdb/extension/parquet/parquet_writer.cpp
src/duckdb/extension/parquet/parquet_multi_file_info.cpp
src/duckdb/extension/parquet/column_writer.cpp
src/duckdb/extension/parquet/parquet_timestamp.cpp
src/duckdb/extension/parquet/parquet_float16.cpp
src/duckdb/extension/parquet/geo_parquet.cpp
src/duckdb/extension/parquet/parquet_extension.cpp
src/duckdb/extension/parquet/parquet_crypto.cpp
src/duckdb/extension/parquet/parquet_multi_file_info.cpp
src/duckdb/extension/parquet/parquet_metadata.cpp
src/duckdb/extension/parquet/parquet_writer.cpp
src/duckdb/extension/parquet/parquet_file_metadata_cache.cpp
src/duckdb/extension/parquet/parquet_statistics.cpp
src/duckdb/extension/parquet/parquet_metadata.cpp
src/duckdb/extension/parquet/serialize_parquet.cpp
src/duckdb/extension/parquet/zstd_file_system.cpp
src/duckdb/extension/parquet/column_reader.cpp
src/duckdb/ub_extension_parquet_decoder.cpp
src/duckdb/ub_extension_parquet_reader.cpp
src/duckdb/ub_extension_parquet_writer.cpp
Expand Down Expand Up @@ -416,32 +418,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-strptime.cpp
src/duckdb/extension/icu/./icu-datefunc.cpp
src/duckdb/extension/icu/./icu-list-range.cpp
src/duckdb/extension/icu/./icu-datetrunc.cpp
src/duckdb/extension/icu/./icu-makedate.cpp
src/duckdb/extension/icu/./icu-timebucket.cpp
src/duckdb/extension/icu/./icu_extension.cpp
src/duckdb/extension/icu/./icu-current.cpp
src/duckdb/extension/icu/./icu-datepart.cpp
src/duckdb/extension/icu/./icu-datesub.cpp
src/duckdb/extension/icu/./icu-datefunc.cpp
src/duckdb/extension/icu/./icu-table-range.cpp
src/duckdb/extension/icu/./icu-makedate.cpp
src/duckdb/extension/icu/./icu-datetrunc.cpp
src/duckdb/extension/icu/./icu-datepart.cpp
src/duckdb/extension/icu/./icu-timezone.cpp
src/duckdb/extension/icu/./icu-dateadd.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-timezone.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_enums.cpp
src/duckdb/extension/json/json_serializer.cpp
src/duckdb/extension/json/json_multi_file_info.cpp
src/duckdb/extension/json/serialize_json.cpp
src/duckdb/extension/json/json_scan.cpp
src/duckdb/extension/json/json_enums.cpp
src/duckdb/extension/json/json_reader.cpp
src/duckdb/extension/json/json_common.cpp
src/duckdb/extension/json/json_functions.cpp
src/duckdb/extension/json/json_reader.cpp
src/duckdb/extension/json/json_deserializer.cpp
src/duckdb/extension/json/json_scan.cpp
src/duckdb/extension/json/json_extension.cpp
src/duckdb/extension/json/json_serializer.cpp
src/duckdb/ub_extension_json_json_functions.cpp)

set(JEMALLOC_SRC_FILES
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ static void MapExtractValueFunc(DataChunk &args, ExpressionState &state, Vector

// Collect the matching positions
Vector pos_vec(LogicalType::INTEGER, count);
ListSearchOp<true>(map_vec, key_vec, arg_vec, pos_vec, args.size());
ListSearchOp<int32_t>(map_vec, key_vec, arg_vec, pos_vec, args.size());

UnifiedVectorFormat pos_format;
UnifiedVectorFormat lst_format;
Expand All @@ -68,7 +68,6 @@ static void MapExtractValueFunc(DataChunk &args, ExpressionState &state, Vector
const auto pos_data = UnifiedVectorFormat::GetData<int32_t>(pos_format);
const auto inc_list_data = ListVector::GetData(map_vec);

auto &result_validity = FlatVector::Validity(result);
for (idx_t row_idx = 0; row_idx < count; row_idx++) {
auto lst_idx = lst_format.sel->get_index(row_idx);
if (!lst_format.validity.RowIsValid(lst_idx)) {
Expand All @@ -79,7 +78,7 @@ static void MapExtractValueFunc(DataChunk &args, ExpressionState &state, Vector
const auto pos_idx = pos_format.sel->get_index(row_idx);
if (!pos_format.validity.RowIsValid(pos_idx)) {
// We didnt find the key in the map, so return NULL
result_validity.SetInvalid(row_idx);
FlatVector::SetNull(result, row_idx, true);
continue;
}

Expand Down Expand Up @@ -118,7 +117,7 @@ static void MapExtractListFunc(DataChunk &args, ExpressionState &state, Vector &

// Collect the matching positions
Vector pos_vec(LogicalType::INTEGER, count);
ListSearchOp<true>(map_vec, key_vec, arg_vec, pos_vec, args.size());
ListSearchOp<int32_t>(map_vec, key_vec, arg_vec, pos_vec, args.size());

UnifiedVectorFormat val_format;
UnifiedVectorFormat pos_format;
Expand Down
57 changes: 53 additions & 4 deletions src/duckdb/extension/core_functions/scalar/math/numeric.cpp
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#include "duckdb/common/operator/decimal_cast_operators.hpp"
#include "duckdb/common/vector_operations/vector_operations.hpp"
#include "duckdb/common/algorithm.hpp"
#include "duckdb/common/likely.hpp"
Expand Down Expand Up @@ -566,6 +567,34 @@ struct RoundDecimalOperator {
}
};

struct RoundIntegerOperator {
template <class TA, class TB, class TR>
static inline TR Operation(TA input, TB precision) {
if (precision < 0) {
// Do all the arithmetic at higher precision
using POWERS_OF_TEN_CLASS = typename DecimalCastTraits<TA>::POWERS_OF_TEN_CLASS;
if (precision <= -POWERS_OF_TEN_CLASS::CACHED_POWERS_OF_TEN) {
return 0;
}
const auto power_of_ten = POWERS_OF_TEN_CLASS::POWERS_OF_TEN[-precision];
auto addition = power_of_ten / 2;
if (input < 0) {
addition = -addition;
}
addition += input;
addition /= power_of_ten;
if (addition) {
return UnsafeNumericCast<TR>(addition * power_of_ten);
} else {
return 0;
}
} else {
// Rounding integers to higher precision is a NOP
return input;
}
}
};

struct RoundPrecisionFunctionData : public FunctionData {
explicit RoundPrecisionFunctionData(int32_t target_scale) : target_scale(target_scale) {
}
Expand Down Expand Up @@ -698,10 +727,6 @@ ScalarFunctionSet RoundFun::GetFunctions() {
scalar_function_t round_func = nullptr;
bind_scalar_function_t bind_func = nullptr;
bind_scalar_function_t bind_prec_func = nullptr;
if (type.IsIntegral()) {
// no round for integral numbers
continue;
}
switch (type.id()) {
case LogicalTypeId::FLOAT:
round_func = ScalarFunction::UnaryFunction<float, float, RoundOperator>;
Expand All @@ -715,7 +740,31 @@ ScalarFunctionSet RoundFun::GetFunctions() {
bind_func = BindGenericRoundFunctionDecimal<RoundDecimalOperator>;
bind_prec_func = BindDecimalRoundPrecision;
break;
case LogicalTypeId::TINYINT:
round_func = ScalarFunction::NopFunction;
round_prec_func = ScalarFunction::BinaryFunction<int8_t, int32_t, int8_t, RoundIntegerOperator>;
break;
case LogicalTypeId::SMALLINT:
round_func = ScalarFunction::NopFunction;
round_prec_func = ScalarFunction::BinaryFunction<int16_t, int32_t, int16_t, RoundIntegerOperator>;
break;
case LogicalTypeId::INTEGER:
round_func = ScalarFunction::NopFunction;
round_prec_func = ScalarFunction::BinaryFunction<int32_t, int32_t, int32_t, RoundIntegerOperator>;
break;
case LogicalTypeId::BIGINT:
round_func = ScalarFunction::NopFunction;
round_prec_func = ScalarFunction::BinaryFunction<int64_t, int32_t, int64_t, RoundIntegerOperator>;
break;
case LogicalTypeId::HUGEINT:
round_func = ScalarFunction::NopFunction;
round_prec_func = ScalarFunction::BinaryFunction<hugeint_t, int32_t, hugeint_t, RoundIntegerOperator>;
break;
default:
if (type.IsIntegral()) {
// no round for integral numbers
continue;
}
throw InternalException("Unimplemented numeric type for function \"floor\"");
}
round.AddFunction(ScalarFunction({type}, type, round_func, bind_func));
Expand Down
43 changes: 39 additions & 4 deletions src/duckdb/extension/icu/icu-table-range.cpp
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
#include "duckdb/common/exception.hpp"
#include "duckdb/common/operator/subtract.hpp"
#include "duckdb/common/types/interval.hpp"
#include "duckdb/common/types/timestamp.hpp"
#include "duckdb/main/extension_util.hpp"
#include "duckdb/function/function_set.hpp"
#include "duckdb/function/table_function.hpp"
#include "duckdb/parser/parsed_data/create_table_function_info.hpp"
#include "include/icu-datefunc.hpp"
#include "unicode/calendar.h"
#include "tz_calendar.hpp"
Expand All @@ -17,10 +17,10 @@ struct ICUTableRange {
struct ICURangeBindData : public TableFunctionData {
ICURangeBindData(const ICURangeBindData &other)
: TableFunctionData(other), tz_setting(other.tz_setting), cal_setting(other.cal_setting),
calendar(other.calendar->clone()) {
calendar(other.calendar->clone()), cardinality(other.cardinality) {
}

explicit ICURangeBindData(ClientContext &context) {
explicit ICURangeBindData(ClientContext &context, const vector<Value> &inputs) {
Value tz_value;
if (context.TryGetCurrentSetting("TimeZone", tz_value)) {
tz_setting = tz_value.ToString();
Expand All @@ -43,11 +43,36 @@ struct ICUTableRange {
if (U_FAILURE(success)) {
throw InternalException("Unable to create ICU calendar.");
}

timestamp_tz_t bounds[2];
interval_t step;
for (idx_t i = 0; i < inputs.size(); i++) {
if (inputs[i].IsNull()) {
return;
}
if (i >= 2) {
step = inputs[i].GetValue<interval_t>();
} else {
bounds[i] = inputs[i].GetValue<timestamp_tz_t>();
}
}
// Estimate cardinality using micros.
int64_t increment = 0;
if (!Interval::TryGetMicro(step, increment) || !increment) {
return;
}
int64_t delta = 0;
if (!TrySubtractOperator::Operation(bounds[1].value, bounds[0].value, delta)) {
return;
}

cardinality = idx_t(delta / increment);
}

string tz_setting;
string cal_setting;
CalendarPtr calendar;
idx_t cardinality;
};

struct ICURangeLocalState : public LocalTableFunctionState {
Expand Down Expand Up @@ -130,7 +155,7 @@ struct ICUTableRange {
template <bool GENERATE_SERIES>
static unique_ptr<FunctionData> Bind(ClientContext &context, TableFunctionBindInput &input,
vector<LogicalType> &return_types, vector<string> &names) {
auto result = make_uniq<ICURangeBindData>(context);
auto result = make_uniq<ICURangeBindData>(context, input.inputs);

return_types.push_back(LogicalType::TIMESTAMP_TZ);
if (GENERATE_SERIES) {
Expand All @@ -147,6 +172,14 @@ struct ICUTableRange {
return make_uniq<ICURangeLocalState>();
}

static unique_ptr<NodeStatistics> Cardinality(ClientContext &context, const FunctionData *bind_data_p) {
if (!bind_data_p) {
return nullptr;
}
auto &bind_data = bind_data_p->Cast<ICURangeBindData>();
return make_uniq<NodeStatistics>(bind_data.cardinality, bind_data.cardinality);
}

template <bool GENERATE_SERIES>
static OperatorResultType ICUTableRangeFunction(ExecutionContext &context, TableFunctionInput &data_p,
DataChunk &input, DataChunk &output) {
Expand Down Expand Up @@ -201,6 +234,7 @@ struct ICUTableRange {
TableFunction range_function({LogicalType::TIMESTAMP_TZ, LogicalType::TIMESTAMP_TZ, LogicalType::INTERVAL},
nullptr, Bind<false>, nullptr, RangeDateTimeLocalInit);
range_function.in_out_function = ICUTableRangeFunction<false>;
range_function.cardinality = Cardinality;
range.AddFunction(range_function);
ExtensionUtil::RegisterFunction(db, range);

Expand All @@ -210,6 +244,7 @@ struct ICUTableRange {
{LogicalType::TIMESTAMP_TZ, LogicalType::TIMESTAMP_TZ, LogicalType::INTERVAL}, nullptr, Bind<true>, nullptr,
RangeDateTimeLocalInit);
generate_series_function.in_out_function = ICUTableRangeFunction<true>;
generate_series_function.cardinality = Cardinality;
generate_series.AddFunction(generate_series_function);
ExtensionUtil::RegisterFunction(db, generate_series);
}
Expand Down
6 changes: 5 additions & 1 deletion src/duckdb/extension/icu/third_party/icu/common/unistr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1563,7 +1563,11 @@ UnicodeString::doAppend(const UChar *srcChars, int32_t srcStart, int32_t srcLeng
}

int32_t oldLength = length();
int32_t newLength = oldLength + srcLength;
int32_t newLength;
if (uprv_add32_overflow(oldLength, srcLength, &newLength)) {
setToBogus();
return *this;
}

// Check for append onto ourself
const UChar* oldArray = getArrayStart();
Expand Down
Loading