mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-20 00:30:49 +00:00
Merge pull request #61196 from ClickHouse/Avogar-patch-1
Fix lazy execution of default argument in dictGetOrDefault for RangeHashedDictionary
This commit is contained in:
commit
d89e26cff5
@ -4561,7 +4561,7 @@ arguments, result_type, input_rows_count); \
|
||||
|
||||
if (from_low_cardinality)
|
||||
{
|
||||
const auto * col_low_cardinality = typeid_cast<const ColumnLowCardinality *>(arguments[0].column.get());
|
||||
const auto * col_low_cardinality = assert_cast<const ColumnLowCardinality *>(arguments[0].column.get());
|
||||
|
||||
if (skip_not_null_check && col_low_cardinality->containsNull())
|
||||
throw Exception(ErrorCodes::CANNOT_INSERT_NULL_IN_ORDINARY_COLUMN, "Cannot convert NULL value to non-Nullable type");
|
||||
@ -4586,7 +4586,7 @@ arguments, result_type, input_rows_count); \
|
||||
if (to_low_cardinality)
|
||||
{
|
||||
auto res_column = to_low_cardinality->createColumn();
|
||||
auto * col_low_cardinality = typeid_cast<ColumnLowCardinality *>(res_column.get());
|
||||
auto * col_low_cardinality = assert_cast<ColumnLowCardinality *>(res_column.get());
|
||||
|
||||
if (from_low_cardinality && !src_converted_to_full_column)
|
||||
{
|
||||
|
@ -324,12 +324,15 @@ public:
|
||||
String getName() const override { return name; }
|
||||
|
||||
bool isVariadic() const override { return true; }
|
||||
bool isShortCircuit(ShortCircuitSettings & settings, size_t /*number_of_arguments*/) const override
|
||||
bool isShortCircuit(ShortCircuitSettings & settings, size_t number_of_arguments) const override
|
||||
{
|
||||
if constexpr (dictionary_get_function_type != DictionaryGetFunctionType::getOrDefault)
|
||||
return false;
|
||||
|
||||
settings.arguments_with_disabled_lazy_execution.insert({0, 1, 2});
|
||||
/// We execute lazily only last argument with default expression.
|
||||
for (size_t i = 0; i != number_of_arguments - 1; ++i)
|
||||
settings.arguments_with_disabled_lazy_execution.insert(i);
|
||||
|
||||
settings.enable_lazy_execution_for_common_descendants_of_arguments = false;
|
||||
settings.force_enable_lazy_execution = false;
|
||||
return true;
|
||||
|
@ -0,0 +1 @@
|
||||
2
|
@ -0,0 +1,34 @@
|
||||
DROP DICTIONARY IF EXISTS range_dictionary;
|
||||
DROP TABLE IF EXISTS range_dictionary_nullable_source_table;
|
||||
|
||||
|
||||
CREATE TABLE range_dictionary_nullable_source_table
|
||||
(
|
||||
key UInt64,
|
||||
start_date Date,
|
||||
end_date Date,
|
||||
value Nullable(UInt64)
|
||||
)
|
||||
ENGINE = TinyLog;
|
||||
|
||||
INSERT INTO range_dictionary_nullable_source_table VALUES (0, toDate('2019-05-05'), toDate('2019-05-20'), 0), (1, toDate('2019-05-05'), toDate('2019-05-20'), NULL);
|
||||
|
||||
CREATE DICTIONARY range_dictionary
|
||||
(
|
||||
key UInt64,
|
||||
start_date Date,
|
||||
end_date Date,
|
||||
value Nullable(UInt64) DEFAULT NULL
|
||||
)
|
||||
PRIMARY KEY key
|
||||
SOURCE(CLICKHOUSE(HOST 'localhost' PORT tcpPort() TABLE 'range_dictionary_nullable_source_table'))
|
||||
LIFETIME(MIN 1 MAX 1000)
|
||||
LAYOUT(RANGE_HASHED())
|
||||
RANGE(MIN start_date MAX end_date);
|
||||
|
||||
SELECT dictGetOrDefault('range_dictionary', 'value', toUInt64(2), toDate(toLowCardinality(materialize('2019-05-15'))), 2);
|
||||
|
||||
|
||||
DROP DICTIONARY IF EXISTS range_dictionary;
|
||||
DROP TABLE IF EXISTS range_dictionary_nullable_source_table;
|
||||
|
Loading…
Reference in New Issue
Block a user