Specialize date time comparision.

This commit is contained in:
Amos Bird 2021-08-03 14:23:46 +08:00
parent 98326ec028
commit 4f7e007d35
No known key found for this signature in database
GPG Key ID: 80D430DCBECFEDB4
2 changed files with 29 additions and 9 deletions

View File

@ -1218,18 +1218,37 @@ public:
{ {
return res; return res;
} }
else if ((isColumnedAsDecimal(left_type) || isColumnedAsDecimal(right_type)) else if ((isColumnedAsDecimal(left_type) || isColumnedAsDecimal(right_type)))
{
// Comparing Date and DateTime64 requires implicit conversion, // Comparing Date and DateTime64 requires implicit conversion,
// otherwise Date is treated as number. if (date_and_datetime && (isDate(left_type) || isDate(right_type)))
&& !(date_and_datetime && (isDate(left_type) || isDate(right_type)))) {
DataTypePtr common_type = getLeastSupertype({left_type, right_type});
ColumnPtr c0_converted = castColumn(col_with_type_and_name_left, common_type);
ColumnPtr c1_converted = castColumn(col_with_type_and_name_right, common_type);
return executeDecimal({c0_converted, common_type, "left"}, {c1_converted, common_type, "right"});
}
else
{ {
// compare // compare
if (!allowDecimalComparison(left_type, right_type) && !date_and_datetime) if (!allowDecimalComparison(left_type, right_type) && !date_and_datetime)
throw Exception("No operation " + getName() + " between " + left_type->getName() + " and " + right_type->getName(), throw Exception(
"No operation " + getName() + " between " + left_type->getName() + " and " + right_type->getName(),
ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
return executeDecimal(col_with_type_and_name_left, col_with_type_and_name_right); return executeDecimal(col_with_type_and_name_left, col_with_type_and_name_right);
} }
}
else if (date_and_datetime)
{
DataTypePtr common_type = getLeastSupertype({left_type, right_type});
ColumnPtr c0_converted = castColumn(col_with_type_and_name_left, common_type);
ColumnPtr c1_converted = castColumn(col_with_type_and_name_right, common_type);
if (!((res = executeNumLeftType<UInt32>(c0_converted.get(), c1_converted.get()))
|| (res = executeNumLeftType<UInt64>(c0_converted.get(), c1_converted.get()))))
throw Exception("Date related common types can only be UInt32 or UInt64", ErrorCodes::LOGICAL_ERROR);
return res;
}
else if (left_type->equals(*right_type)) else if (left_type->equals(*right_type))
{ {
return executeGenericIdenticalTypes(col_left_untyped, col_right_untyped); return executeGenericIdenticalTypes(col_left_untyped, col_right_untyped);

View File

@ -2,4 +2,5 @@
<query>SELECT count() FROM numbers(1000000000) WHERE materialize(now()) > toString(toDateTime('2020-09-30 00:00:00'))</query> <query>SELECT count() FROM numbers(1000000000) WHERE materialize(now()) > toString(toDateTime('2020-09-30 00:00:00'))</query>
<query>SELECT count() FROM numbers(1000000000) WHERE materialize(now()) > toUInt32(toDateTime('2020-09-30 00:00:00'))</query> <query>SELECT count() FROM numbers(1000000000) WHERE materialize(now()) > toUInt32(toDateTime('2020-09-30 00:00:00'))</query>
<query>SELECT count() FROM numbers(1000000000) WHERE materialize(now()) > toDateTime('2020-09-30 00:00:00')</query> <query>SELECT count() FROM numbers(1000000000) WHERE materialize(now()) > toDateTime('2020-09-30 00:00:00')</query>
<query>SELECT count() FROM numbers(1000000000) WHERE materialize(now()) > toDate('2020-09-30 00:00:00')</query>
</test> </test>