Релиз ClickHouse 1.1.54362

В этом релизе есть два очень полезных исправления:

  • Агрегация без GROUP BY по пустому множеству.
  • Исправлены случаи ошибочного удаления ненужных столбцов из подзапросов.

Первое дает нам ожидаемое поведение, если результат агрегации равен нулю.

Например, у нас есть пустая таблица:

:) CREATE TEMPORARY TABLE example(
:-]     Value Int8
:-] );
CREATE TEMPORARY TABLE example
(
    Value Int8
)
Ok.
0 rows in set. Elapsed: 0.001 sec. 

Если мы выполним запрос COUNT(*) к этой таблице на версии ClickHouse server старше 1.1.54362 (для примера будем брать версию 1.1.54342), то сервер вернёт нам пустой результат.

:) SELECT COUNT(*) FROM example;
SELECT COUNT(*)
FROM example
Ok.
0 rows in set. Elapsed: 0.002 sec.

Если мы выполним этот запрос на версии ClickHouse server 1.1.54362, то получим вполне ожидаемый результат.

:) SELECT COUNT(*) FROM example;
SELECT COUNT(*)
FROM example
┌─COUNT()─┐
       0 
└─────────┘
1 rows in set. Elapsed: 0.007 sec.

Второе, очень важное исправление, связано с ошибочным удалением столбцов из подзапросов.

Пример:

ClickHouse client version 1.1.54362.
Connecting to 172.17.0.4:9000.
Connected to ClickHouse server version 1.1.54342.
:) SELECT sum(x) FROM (SELECT x, y FROM (SELECT number AS x, number + 1 AS y FROM system.numbers LIMIT 10) ORDER BY y LIMIT 1 BY y)
SELECT sum(x)
FROM
(
    SELECT
        x,
        y
    FROM
    (
        SELECT
            number AS x,
            number + 1 AS y
        FROM system.numbers
        LIMIT 10
    )
    ORDER BY y ASC
    LIMIT 1 BY y
)
Received exception from server (version 1.1.54342):
Code: 10. DB::Exception: Received from 172.17.0.4:9000. DB::Exception: Not found column y in block. There are only columns: x.
0 rows in set. Elapsed: 0.119 sec. 

При этом для исправления ситуации приходилось писать достаточно странные запросы.

Пример запроса:

ClickHouse client version 1.1.54362.
Connecting to 172.17.0.4:9000.
Connected to ClickHouse server version 1.1.54342.
:) SELECT sum(x) FROM (SELECT x, y FROM (SELECT number AS x, number + 1 AS y FROM system.numbers LIMIT 10) ORDER BY y LIMIT 1 BY y) WHERE y <> -42
SELECT sum(x)
FROM
(
    SELECT
        x,
        y
    FROM
    (
        SELECT
            number AS x,
            number + 1 AS y
        FROM system.numbers
        LIMIT 10
    )
    ORDER BY y ASC
    LIMIT 1 BY y
)
WHERE y != -42 /*-- FIX--*/
┌─sum(x)─┐
     45 
└────────┘
1 rows in set. Elapsed: 0.005 sec. 

Начиная с версии ClickHouse server 1.1.54362 такой проблемы больше нет.

ClickHouse client version 1.1.54362.
Connecting to localhost:9000.
Connected to ClickHouse server version 1.1.54362.
:) SELECT sum(x) FROM (SELECT x, y FROM (SELECT number AS x, number + 1 AS y FROM system.numbers LIMIT 10) ORDER BY y LIMIT 1 BY y)
SELECT sum(x)
FROM
(
    SELECT
        x,
        y
    FROM
    (
        SELECT
            number AS x,
            number + 1 AS y
        FROM system.numbers
        LIMIT 10
    )
    ORDER BY y ASC
    LIMIT 1 BY y
)
┌─sum(x)─┐
     45 
└────────┘
1 rows in set. Elapsed: 0.021 sec.