Merge pull request #61196 from ClickHouse/Avogar-patch-1

Fix lazy execution of default argument in dictGetOrDefault for RangeHashedDictionary
This commit is contained in:
Kruglov Pavel 2024-03-13 17:23:22 +01:00 committed by GitHub
commit d89e26cff5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 42 additions and 4 deletions

View File

@ -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)
{

View File

@ -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;

View File

@ -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;