Size: a a a

ClickHouse не тормозит

2020 June 04

DT

Dmitry Titov in ClickHouse не тормозит
Александр Курченков
Привет всем в этом чате.
Есть вопрос по двум, на первый взгляд, одинаковым операциям которые дают разный результат.
Для конструкций вида
if(1 != count(*), max(count_in) - min(count_in), max(count_in))
стреляют ошибки:
> There is no supertype for types Int64, UInt64 because some of them are signed integers and some are unsigned integers, but there is no signed integer type, that can exactly represent all required unsigned integer values
А  конструкция
minus(max(count_in), if(1 >= count(*), 0, min(count_in)))
работает
if(1 != count(*), max(count_in) - min(count_in), max(count_in))
потому что кликхаус вычисляет обе ветки If
источник

АК

Александр Курченков... in ClickHouse не тормозит
А что, разве после операции вычитания может смениться тип результата?
источник

DT

Dmitry Titov in ClickHouse не тормозит
max(count_in) - min(count_in)
первый и второй аргумент UInt64 допустим
если мы будем вычитать их друг из друга, то возможно может получится отрицательно число.
источник

АК

Александр Курченков... in ClickHouse не тормозит
Ммм.
Правильно ли я понял, что движок пытается предсказать возможные граничные условия(значения). И если тип одого из значений, предполагаемый тип, не будет совпадать с типом значения в другой ветке, происходит выброс исключения о конфликте типов?
источник

DT

Dmitry Titov in ClickHouse не тормозит
Александр Курченков
Ммм.
Правильно ли я понял, что движок пытается предсказать возможные граничные условия(значения). И если тип одого из значений, предполагаемый тип, не будет совпадать с типом значения в другой ветке, происходит выброс исключения о конфликте типов?
select If(1=1,toUInt64(1)-toUInt64(1),toUInt64(2));
источник

DT

Dmitry Titov in ClickHouse не тормозит
ну да
источник

АК

Александр Курченков... in ClickHouse не тормозит
да да, я до этого уже дошёл
источник

АК

Александр Курченков... in ClickHouse не тормозит
Но мне не понятно почему это обязательно нужно?
источник

АК

Александр Курченков... in ClickHouse не тормозит
В какой момент происходит смена типа?
источник

АК

Александр Курченков... in ClickHouse не тормозит
Если для min/max аргумент беззнаковый, значит min не может быть меньше 0.
А значит и вычитание не перейдёт через 0.
источник

АК

Александр Курченков... in ClickHouse не тормозит
разве нет ?
источник

АК

Александр Курченков... in ClickHouse не тормозит
Может я чего-то не вижу или недопонимаю ?
источник

АК

Александр Курченков... in ClickHouse не тормозит
Я допускаю что неоднозначность может вносить null. Но в моём конкретном случае, в наборе нет null-ов. Все значения определены.
источник

DT

Dmitry Titov in ClickHouse не тормозит
Александр Курченков
Если для min/max аргумент беззнаковый, значит min не может быть меньше 0.
А значит и вычитание не перейдёт через 0.
ну смотри, ведь у тебя в min max могли быть и другие колонки. и могло быть так что для разных колонок min > max
источник

АК

Александр Курченков... in ClickHouse не тормозит
Могли бы быть, но я оперирую двумя конкретными колонками одного типа.
источник

АК

Александр Курченков... in ClickHouse не тормозит
Если бы колонки были разного типа, то никаких вопросов. Всё чётко и логично.
источник

АК

Александр Курченков... in ClickHouse не тормозит
Но у меня MIN и MAX значений одной колонки.
источник

АК

Александр Курченков... in ClickHouse не тормозит
С чего вдруг их разница должна иметь другой тип или MIN и MAX должны получить разный тип?
источник

DT

Dmitry Titov in ClickHouse не тормозит
Александр Курченков
Могли бы быть, но я оперирую двумя конкретными колонками одного типа.
один кейс из довольно большого числа вариантов, ради него пилить отдельную проверку? смысл?
источник

АК

Александр Курченков... in ClickHouse не тормозит
Стоп. Я не про кейсы а про строгость проверки.
источник