Недавно столкнулась с необычным кейсом, связанный с несоответствием типов данных в КХ.
У нас есть таблица-источник, поверх вьюшка:
CREATE TABLE t (id String)
ENGINE = MergeTree()
ORDER BY id;
INSERT INTO t VALUES
('187'),
('2298'),
('9');
CREATE VIEW v (id Int32) AS
SELECT id
FROM t;
Обратите внимание, что в табличке лежит String, а во вьюшке Int.
Потом ищем минимумы:
SELECT min(id) FROM t;
--187
SELECT min(id) FROM v;
--9
Тут вопросиков нет: в таблице сортировка строк (поэтому с 1 будет минимальным), во вьюшке - как обычно.
А потом мы пытаем разделить на 2 диапазона по минимуму, и тут происходит какая-то дичь:
SELECT count() FROM v WHERE id >= '187';
--2
SELECT count() FROM v WHERE id < '187';
--0 ??? (должно быть 1)
SELECT count() FROM v WHERE id >= '9';
--1 ??? (должно быть 3)
SELECT count() FROM v WHERE id < '9';
--0
Причем если сравнивать без кавычек, то вываливается ошибка:
There is no supertype for types String, Int32
То есть в этих сравнениях какие-то значения сравниваются как строки, а какие-то как числа, и я не вижу никакого паттерна😭
Зато в плейграунде все работает как надо😑
Т.е. напрашивается, что особенности могут быть связаны именно с настройкой кластера