Backport #71761 to 24.3: Forbid Dynamic/Variant types in min/max functions to avoid confusion

This commit is contained in:
robot-clickhouse 2024-11-20 15:07:16 +00:00
parent 9e905e1cf6
commit 8ef817d890
6 changed files with 50 additions and 0 deletions

View File

@ -79,6 +79,14 @@ public:
"Illegal type {} of second argument of aggregate function {} because the values of that data type are not comparable", "Illegal type {} of second argument of aggregate function {} because the values of that data type are not comparable",
type_val->getName(), type_val->getName(),
getName()); getName());
if (isDynamic(this->type_val) || isVariant(this->type_val))
throw Exception(
ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT,
"Illegal type {} of argument of aggregate function {} because the column of that type can contain values with different "
"data types. Consider using typed subcolumns or cast column to a specific data type",
this->type_val->getName(),
getName());
} }
void create(AggregateDataPtr __restrict place) const override /// NOLINT void create(AggregateDataPtr __restrict place) const override /// NOLINT

View File

@ -35,6 +35,14 @@ public:
"Illegal type {} of argument of aggregate function {} because the values of that data type are not comparable", "Illegal type {} of argument of aggregate function {} because the values of that data type are not comparable",
this->result_type->getName(), this->result_type->getName(),
getName()); getName());
if (isDynamic(this->result_type) || isVariant(this->result_type))
throw Exception(
ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT,
"Illegal type {} of argument of aggregate function {} because the column of that type can contain values with different "
"data types. Consider using typed subcolumns or cast column to a specific data type",
this->result_type->getName(),
getName());
} }
String getName() const override String getName() const override

View File

@ -63,6 +63,14 @@ public:
"Illegal type {} for combinator {} because the values of that data type are not comparable", "Illegal type {} for combinator {} because the values of that data type are not comparable",
arguments[key_col]->getName(), arguments[key_col]->getName(),
getName()); getName());
if (isDynamic(arguments[key_col]) || isVariant(arguments[key_col]))
throw Exception(
ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT,
"Illegal type {} of argument of aggregate function {} because the column of that type can contain values with different "
"data types. Consider using typed subcolumns or cast column to a specific data type",
arguments[key_col]->getName(),
getName());
} }
String getName() const override String getName() const override

View File

@ -231,6 +231,14 @@ void minmaxIndexValidator(const IndexDescription & index, bool attach)
"Data type of argument for minmax index must be comparable, got {} type for column {} instead", "Data type of argument for minmax index must be comparable, got {} type for column {} instead",
column.type->getName(), column.name); column.type->getName(), column.name);
} }
if (isDynamic(column.type) || isVariant(column.type))
{
throw Exception(ErrorCodes::BAD_ARGUMENTS,
"{} data type of column {} is not allowed in minmax index because the column of that type can contain values with different data "
"types. Consider using typed subcolumns or cast column to a specific data type",
column.type->getName(), column.name);
}
} }
} }

View File

@ -0,0 +1,18 @@
set allow_experimental_dynamic_type=1;
select max(number::Dynamic) from numbers(10); -- {serverError ILLEGAL_TYPE_OF_ARGUMENT}
select min(number::Dynamic) from numbers(10); -- {serverError ILLEGAL_TYPE_OF_ARGUMENT}
select argMax(number, number::Dynamic) from numbers(10); -- {serverError ILLEGAL_TYPE_OF_ARGUMENT}
select argMin(number, number::Dynamic) from numbers(10); -- {serverError ILLEGAL_TYPE_OF_ARGUMENT}
select anyArgMax(number, number::Dynamic) from numbers(10); -- {serverError ILLEGAL_TYPE_OF_ARGUMENT}
select anyArgMin(number, number::Dynamic) from numbers(10); -- {serverError ILLEGAL_TYPE_OF_ARGUMENT}
create table test (d Dynamic, index idx d type minmax); -- {serverError BAD_ARGUMENTS}
set allow_experimental_variant_type=1;
select max(number::Variant(UInt64)) from numbers(10); -- {serverError ILLEGAL_TYPE_OF_ARGUMENT}
select min(number::Variant(UInt64)) from numbers(10); -- {serverError ILLEGAL_TYPE_OF_ARGUMENT}
select argMax(number, number::Variant(UInt64)) from numbers(10); -- {serverError ILLEGAL_TYPE_OF_ARGUMENT}
select argMin(number, number::Variant(UInt64)) from numbers(10); -- {serverError ILLEGAL_TYPE_OF_ARGUMENT}
select anyArgMax(number, number::Variant(UInt64)) from numbers(10); -- {serverError ILLEGAL_TYPE_OF_ARGUMENT}
select anyArgMin(number, number::Variant(UInt64)) from numbers(10); -- {serverError ILLEGAL_TYPE_OF_ARGUMENT}
create table test (d Variant(UInt64), index idx d type minmax); -- {serverError BAD_ARGUMENTS}