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

  • Агрегация без 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.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *