Skip to content
Open
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
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
82 changes: 41 additions & 41 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -351,52 +351,52 @@ 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/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_aggregate_distributive.cpp
src/duckdb/extension/core_functions/function_list.cpp
src/duckdb/extension/core_functions/lambda_functions.cpp
src/duckdb/ub_extension_core_functions_aggregate_nested.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_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_scalar_string.cpp
src/duckdb/ub_extension_core_functions_scalar_generic.cpp
src/duckdb/extension/core_functions/scalar/bit/bitstring.cpp
src/duckdb/extension/core_functions/scalar/operators/bitwise.cpp
src/duckdb/extension/core_functions/scalar/enum/enum_functions.cpp
src/duckdb/ub_extension_core_functions_scalar_string.cpp
src/duckdb/ub_extension_core_functions_scalar_debug.cpp
src/duckdb/ub_extension_core_functions_scalar_map.cpp
src/duckdb/ub_extension_core_functions_scalar_random.cpp
src/duckdb/extension/core_functions/scalar/math/numeric.cpp
src/duckdb/ub_extension_core_functions_scalar_union.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_list.cpp
src/duckdb/extension/core_functions/scalar/operators/bitwise.cpp
src/duckdb/ub_extension_core_functions_scalar_union.cpp
src/duckdb/ub_extension_core_functions_scalar_array.cpp
src/duckdb/ub_extension_core_functions_scalar_debug.cpp
src/duckdb/ub_extension_core_functions_scalar_blob.cpp
src/duckdb/extension/core_functions/scalar/enum/enum_functions.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_list.cpp
src/duckdb/extension/core_functions/scalar/math/numeric.cpp
src/duckdb/extension/parquet/parquet_file_metadata_cache.cpp
src/duckdb/extension/parquet/parquet_field_id.cpp
src/duckdb/extension/parquet/parquet_writer.cpp
src/duckdb/extension/parquet/zstd_file_system.cpp
src/duckdb/extension/parquet/parquet_column_schema.cpp
src/duckdb/extension/parquet/parquet_multi_file_info.cpp
src/duckdb/extension/parquet/parquet_metadata.cpp
src/duckdb/extension/parquet/parquet_crypto.cpp
src/duckdb/extension/parquet/parquet_reader.cpp
src/duckdb/extension/parquet/parquet_timestamp.cpp
src/duckdb/extension/parquet/parquet_float16.cpp
src/duckdb/extension/parquet/parquet_statistics.cpp
src/duckdb/extension/parquet/parquet_shredding.cpp
src/duckdb/extension/parquet/parquet_geometry.cpp
src/duckdb/extension/parquet/parquet_multi_file_info.cpp
src/duckdb/extension/parquet/column_reader.cpp
src/duckdb/extension/parquet/parquet_field_id.cpp
src/duckdb/extension/parquet/parquet_extension.cpp
src/duckdb/extension/parquet/parquet_column_schema.cpp
src/duckdb/extension/parquet/column_writer.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_reader.cpp
src/duckdb/extension/parquet/column_reader.cpp
src/duckdb/extension/parquet/parquet_float16.cpp
src/duckdb/extension/parquet/zstd_file_system.cpp
src/duckdb/extension/parquet/parquet_shredding.cpp
src/duckdb/extension/parquet/parquet_geometry.cpp
src/duckdb/extension/parquet/parquet_statistics.cpp
src/duckdb/ub_extension_parquet_writer.cpp
src/duckdb/ub_extension_parquet_writer_variant.cpp
src/duckdb/ub_extension_parquet_decoder.cpp
src/duckdb/ub_extension_parquet_reader.cpp
src/duckdb/ub_extension_parquet_reader_variant.cpp
src/duckdb/ub_extension_parquet_writer.cpp
src/duckdb/ub_extension_parquet_writer_variant.cpp
src/duckdb/third_party/parquet/parquet_types.cpp
src/duckdb/third_party/thrift/thrift/protocol/TProtocol.cpp
src/duckdb/third_party/thrift/thrift/transport/TTransportException.cpp
Expand Down Expand Up @@ -436,31 +436,31 @@ set(DUCKDB_SRC_FILES
src/duckdb/third_party/brotli/enc/static_dict.cpp
src/duckdb/third_party/brotli/enc/utf8_util.cpp
src/duckdb/extension/icu/./icu_extension.cpp
src/duckdb/extension/icu/./icu-table-range.cpp
src/duckdb/extension/icu/./icu-list-range.cpp
src/duckdb/extension/icu/./icu-strptime.cpp
src/duckdb/extension/icu/./icu-datepart.cpp
src/duckdb/extension/icu/./icu-makedate.cpp
src/duckdb/extension/icu/./icu-datefunc.cpp
src/duckdb/extension/icu/./icu-datetrunc.cpp
src/duckdb/extension/icu/./icu-current.cpp
src/duckdb/extension/icu/./icu-timezone.cpp
src/duckdb/extension/icu/./icu-table-range.cpp
src/duckdb/extension/icu/./icu-dateadd.cpp
src/duckdb/extension/icu/./icu-timebucket.cpp
src/duckdb/extension/icu/./icu-datesub.cpp
src/duckdb/extension/icu/./icu-datetrunc.cpp
src/duckdb/extension/icu/./icu-list-range.cpp
src/duckdb/extension/icu/./icu-timebucket.cpp
src/duckdb/extension/icu/./icu-makedate.cpp
src/duckdb/extension/icu/./icu-dateadd.cpp
src/duckdb/extension/icu/./icu-datepart.cpp
src/duckdb/extension/icu/./icu-datefunc.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_reader.cpp
src/duckdb/extension/json/json_functions.cpp
src/duckdb/extension/json/json_extension.cpp
src/duckdb/extension/json/serialize_json.cpp
src/duckdb/extension/json/json_scan.cpp
src/duckdb/extension/json/json_reader.cpp
src/duckdb/extension/json/json_multi_file_info.cpp
src/duckdb/extension/json/json_enums.cpp
src/duckdb/extension/json/serialize_json.cpp
src/duckdb/extension/json/json_common.cpp
src/duckdb/extension/json/json_deserializer.cpp
src/duckdb/extension/json/json_enums.cpp
src/duckdb/extension/json/json_serializer.cpp
src/duckdb/extension/json/json_extension.cpp
src/duckdb/extension/json/json_functions.cpp
src/duckdb/extension/json/json_deserializer.cpp
src/duckdb/ub_extension_json_json_functions.cpp
src/duckdb/generated_extension_loader_package_build.cpp)

Expand Down
67 changes: 55 additions & 12 deletions src/duckdb/extension/core_functions/aggregate/holistic/mode.cpp
Original file line number Diff line number Diff line change
@@ -1,17 +1,11 @@
#include "duckdb/common/exception.hpp"
#include "duckdb/common/uhugeint.hpp"
#include "duckdb/common/vector_operations/vector_operations.hpp"
#include "duckdb/common/operator/comparison_operators.hpp"
#include "duckdb/common/types/column/column_data_collection.hpp"
#include "core_functions/aggregate/distributive_functions.hpp"
#include "core_functions/aggregate/holistic_functions.hpp"
#include "duckdb/planner/expression/bound_aggregate_expression.hpp"
#include "duckdb/common/unordered_map.hpp"
#include "duckdb/common/owning_string_map.hpp"
#include "duckdb/function/create_sort_key.hpp"
#include "duckdb/function/aggregate/sort_key_helpers.hpp"
#include "duckdb/common/algorithm.hpp"
#include <functional>

// MODE( <expr1> )
// Returns the most frequent value for the values within expr1.
Expand Down Expand Up @@ -44,6 +38,18 @@ struct ModeStandard {
static RESULT_TYPE Assign(Vector &result, INPUT_TYPE input) {
return RESULT_TYPE(input);
}

static void Destroy(T *mode) {
}

static T *Update(T *mode, const T &key) {
if (!mode) {
mode = new T(key);
}
*mode = key;

return mode;
}
};

struct ModeString {
Expand All @@ -60,6 +66,42 @@ struct ModeString {
static RESULT_TYPE Assign(Vector &result, INPUT_TYPE input) {
return StringVector::AddStringOrBlob(result, input);
}

static void Destroy(string_t *mode) {
if (mode && !mode->IsInlined()) {
delete[] mode->GetData();
mode->SetPointer(nullptr);
}
}

static string_t *Update(string_t *mode, const string_t &key) {
if (key.IsInlined()) {
Destroy(mode);
if (!mode) {
mode = new string_t(nullptr, 0);
}
*mode = key;
return mode;
}

// non-inlined string, need to allocate space for it somehow
const auto len = key.GetSize();
char *ptr;
if (!mode || mode->GetSize() < len) {
// we cannot fit this into the current slot - destroy it and re-allocate
Destroy(mode);
if (!mode) {
mode = new string_t(nullptr, 0);
}
ptr = new char[len];
} else {
// this fits into the current slot - take over the pointer
ptr = mode->GetDataWriteable();
}
memcpy(ptr, key.GetData(), len);
*mode = string_t(ptr, UnsafeNumericCast<uint32_t>(len));
return mode;
}
};

template <class KEY_TYPE, class TYPE_OP>
Expand Down Expand Up @@ -92,6 +134,7 @@ struct ModeState {
delete frequency_map;
}
if (mode) {
TYPE_OP::Destroy(mode);
delete mode;
}
if (scan) {
Expand Down Expand Up @@ -163,11 +206,7 @@ struct ModeState {
if (new_count > count) {
valid = true;
count = new_count;
if (mode) {
*mode = key;
} else {
mode = new KEY_TYPE(key);
}
Update(key);
}
}

Expand All @@ -183,6 +222,10 @@ struct ModeState {
}
}

void Update(const KEY_TYPE &key) {
mode = TYPE_OP::Update(mode, key);
}

typename Counts::const_iterator Scan() const {
//! Initialize control variables to first variable of the frequency map
auto highest_frequency = frequency_map->begin();
Expand Down Expand Up @@ -363,7 +406,7 @@ struct ModeFunction : TypedModeFunction<TYPE_OP> {
// Rescan
auto highest_frequency = state.Scan();
if (highest_frequency != state.frequency_map->end()) {
*(state.mode) = highest_frequency->first;
state.Update(highest_frequency->first);
state.count = highest_frequency->second.count;
state.valid = (state.count > 0);
}
Expand Down
2 changes: 2 additions & 0 deletions src/duckdb/extension/core_functions/function_list.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,7 @@ static const StaticFunctionDefinition core_functions[] = {
DUCKDB_SCALAR_FUNCTION_SET(GenerateSeriesFun),
DUCKDB_SCALAR_FUNCTION(GetBitFun),
DUCKDB_SCALAR_FUNCTION(GetCurrentTimestampFun),
DUCKDB_SCALAR_FUNCTION(GetTypeFun),
DUCKDB_SCALAR_FUNCTION_SET_ALIAS(GradeUpFun),
DUCKDB_SCALAR_FUNCTION_SET(GreatestFun),
DUCKDB_SCALAR_FUNCTION_SET(GreatestCommonDivisorFun),
Expand Down Expand Up @@ -266,6 +267,7 @@ static const StaticFunctionDefinition core_functions[] = {
DUCKDB_SCALAR_FUNCTION_SET(MakeTimestampFun),
DUCKDB_SCALAR_FUNCTION_SET(MakeTimestampMsFun),
DUCKDB_SCALAR_FUNCTION_SET(MakeTimestampNsFun),
DUCKDB_SCALAR_FUNCTION(MakeTypeFun),
DUCKDB_SCALAR_FUNCTION_SET(MapFun),
DUCKDB_SCALAR_FUNCTION(MapConcatFun),
DUCKDB_SCALAR_FUNCTION(MapEntriesFun),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,26 @@ struct TypeOfFun {
static ScalarFunction GetFunction();
};

struct GetTypeFun {
static constexpr const char *Name = "get_type";
static constexpr const char *Parameters = "expression";
static constexpr const char *Description = "Returns the type of the result of the expression";
static constexpr const char *Example = "get_type('abc')";
static constexpr const char *Categories = "";

static ScalarFunction GetFunction();
};

struct MakeTypeFun {
static constexpr const char *Name = "make_type";
static constexpr const char *Parameters = "name,...";
static constexpr const char *Description = "Construct a type from its name and optional parameters";
static constexpr const char *Example = "make_type('DECIMAL', 10, 2)";
static constexpr const char *Categories = "";

static ScalarFunction GetFunction();
};

struct CanCastImplicitlyFun {
static constexpr const char *Name = "can_cast_implicitly";
static constexpr const char *Parameters = "source_type,target_type";
Expand Down
1 change: 1 addition & 0 deletions src/duckdb/extension/core_functions/lambda_functions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

#include "duckdb/planner/expression/bound_function_expression.hpp"
#include "duckdb/planner/expression/bound_cast_expression.hpp"
#include "duckdb/planner/expression/bound_lambda_expression.hpp"

namespace duckdb {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -517,7 +517,8 @@ unique_ptr<BaseStatistics> DateTruncStatistics(vector<BaseStatistics> &child_sta
auto result = NumericStats::CreateEmpty(min_value.type());
NumericStats::SetMin(result, min_value);
NumericStats::SetMax(result, max_value);
result.CopyValidity(child_stats[0]);

result.CombineValidity(child_stats[0], child_stats[1]);
return result.ToUnique();
}

Expand Down
Loading
Loading