Fix trailing whitespaces in FROM/IN clause with subqueries in multiline
mode, and also changes the output of the queries slightly in a more
human friendly way.
Before:
$ clickhouse-format <<<'select * from system.one, (select * from system.one)'
SELECT *
FROM system.one
,
(
SELECT *
FROM system.one
)
After:
$ clickhouse-format <<<'select * from system.one, (select * from system.one)'
SELECT *
FROM system.one,
(
SELECT *
FROM system.one
)
v2: Fix subqueries formatting in a different way
v3: Adjust *.reference in tests
v4: Fix modernize-loop-convert in ASTTablesInSelectQuery
TODO (suggested by Nikolai)
1. Build query plan fro current query (inside storage::read) up to WithMergableState
2. Check, that plan is simple enough: Aggregating - Expression - Filter - ReadFromStorage (or simplier)
3. Check, that filter is the same as filter in projection, and also expression calculates the same aggregation keys as in projection
4. Return WithMergableState if projection applies
3 will be easier to do with ActionsDAG, cause it sees all functions, and dependencies are direct (but it is possible with ExpressionActions also)
Also need to figure out how prewhere works for projections, and
row_filter_policies.
wip
fuzzer sometimes [1] may inserts tupleElement() created from ASTLiteral:
Function_tupleElement, 0xx
-ExpressionList_, 0xx
--Literal_Int64_255, 0xx
--Literal_Int64_100, 0xx
And in this case it will be printed as "255.100", which
later will be parsed as float, and formatting will be
inconsistent.
So instead of printing it as regular tuple,
let's print it as ExpressionList instead (i.e. with ", " delimiter).
Simple reproducer:
void ast()
{
auto arg1 = std::make_shared<ASTLiteral>(Field(255));
auto arg2 = std::make_shared<ASTLiteral>(Field(100));
auto func = makeASTFunction("tupleElement", arg1, arg2);
auto ast = func;
std::cerr << ast->formatForErrorMessage() << std::endl;
std::cerr << ast->dumpTree() << std::endl;
}
[1]: https://clickhouse-test-reports.s3.yandex.net/23517/f1187aeb69109c88f0be978b8083080c7a843820/fuzzer_debug/report.html#fail1