disable some optimization related to LIMIT clause if LIMIT BY clause is present [#METR-23881]

This commit is contained in:
artpaul 2016-12-29 17:53:35 +05:00
parent 2b38babb89
commit 1f49735581

View File

@ -630,12 +630,15 @@ void InterpreterSelectQuery::executeSingleQuery()
/** Оптимизация - если источников несколько и есть LIMIT, то сначала применим предварительный LIMIT,
* ограничивающий число записей в каждом до offset + limit.
*/
if (query.limit_length && hasMoreThanOneStream() && !query.distinct)
if (query.limit_length && hasMoreThanOneStream() && !query.distinct && !query.limit_by_expression_list)
executePreLimit();
if (need_second_distinct_pass)
union_within_single_query = true;
if (query.limit_by_expression_list && hasMoreThanOneStream())
union_within_single_query = true;
if (union_within_single_query || stream_with_non_joined_data)
executeUnion();
@ -782,7 +785,7 @@ QueryProcessingStage::Enum InterpreterSelectQuery::executeFetchColumns()
size_t limit_offset = 0;
getLimitLengthAndOffset(query, limit_length, limit_offset);
/** Оптимизация - если не указаны DISTINCT, WHERE, GROUP, HAVING, ORDER, но указан LIMIT, и limit + offset < max_block_size,
/** Оптимизация - если не указаны DISTINCT, WHERE, GROUP, HAVING, ORDER, LIMIT BY но указан LIMIT, и limit + offset < max_block_size,
* то в качестве размера блока будем использовать limit + offset (чтобы не читать из таблицы больше, чем запрошено),
* а также установим количество потоков в 1.
*/
@ -792,6 +795,7 @@ QueryProcessingStage::Enum InterpreterSelectQuery::executeFetchColumns()
&& !query.group_expression_list
&& !query.having_expression
&& !query.order_expression_list
&& !query.limit_by_expression_list
&& query.limit_length
&& !query_analyzer->hasAggregation()
&& limit_length + limit_offset < settings.max_block_size)