ClickHouse/src/Interpreters/ColumnAliasesVisitor.h

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

90 lines
3.2 KiB
C++
Raw Normal View History

#pragma once
2020-12-12 16:42:15 +00:00
#include <Core/Names.h>
#include <Interpreters/InDepthNodeVisitor.h>
#include <Storages/ColumnsDescription.h>
namespace DB
{
class IAST;
using ASTPtr = std::shared_ptr<IAST>;
class IDataType;
2020-12-12 16:42:15 +00:00
class ASTFunction;
class ASTIdentifier;
using DataTypePtr = std::shared_ptr<const IDataType>;
2020-12-13 11:30:53 +00:00
/// Visits AST node to rewrite alias columns in query
/// Currently works only 3 kind ways below
/// For example:
// CREATE TABLE test_table
// (
// `timestamp` DateTime,
// `value` UInt64,
// `day` Date ALIAS toDate(timestamp),
// `day1` Date ALIAS day + 1,
// `day2` Date ALIAS day1 + 1,
// `time` DateTime ALIAS timestamp
// )ENGINE = MergeTree
// PARTITION BY toYYYYMMDD(timestamp)
// ORDER BY timestamp SETTINGS index_granularity = 1;
2020-12-17 02:17:59 +00:00
/// 1. Rewrite the filters in query when enable optimize_respect_aliases
2020-12-13 11:30:53 +00:00
/// this could help with `optimize_trivial_count`, Partition Prune in `KeyCondition` and secondary indexes.
2021-01-12 20:24:18 +00:00
/// eg: select max(value) from test_table where day2 = today(), filters will be: ((toDate(timestamp) + 1) + 1) = today() .
2020-12-13 11:30:53 +00:00
/// 2. Alias on alias for `required_columns` extracted in `InterpreterSelectQuery.cpp`, it could help get all dependent physical columns for query.
2021-01-12 20:24:18 +00:00
/// eg: select day2 from test_table. `required_columns` can got require columns from the temporary rewritten AST `((toDate(timestamp) + 1) + 1)`.
2020-12-13 11:30:53 +00:00
/// 3. Help with `optimize_aggregation_in_order` and `optimize_read_in_order` in `ReadInOrderOptimizer.cpp`:
/// For queries with alias columns in `orderBy` and `groupBy`, these ASTs will not change.
2021-01-08 08:18:12 +00:00
/// But we generate temporary asts and generate temporary Actions to get the `InputOrderInfo`
2020-12-13 11:30:53 +00:00
/// eg: select day1 from test_table order by day1;
class ColumnAliasesMatcher
{
public:
using Visitor = InDepthNodeVisitor<ColumnAliasesMatcher, false, true>;
struct Data
{
const ColumnsDescription & columns;
2020-12-15 08:35:19 +00:00
2021-05-21 17:01:21 +00:00
/// columns from array_join_result_to_source cannot be expanded.
NameSet array_join_result_columns;
NameSet array_join_source_columns;
2021-06-01 12:20:52 +00:00
ContextPtr context;
const std::unordered_set<IAST *> & excluded_nodes;
2020-12-15 08:35:19 +00:00
/// private_aliases are from lambda, so these are local names.
2020-12-12 16:42:15 +00:00
NameSet private_aliases;
2021-07-18 15:27:19 +00:00
/// Check if query is changed by this visitor.
bool changed = false;
Data(const ColumnsDescription & columns_, const NameToNameMap & array_join_result_columns_, ContextPtr context_, const std::unordered_set<IAST *> & excluded_nodes_)
: columns(columns_), context(context_), excluded_nodes(excluded_nodes_)
2021-05-21 17:01:21 +00:00
{
for (const auto & [result, source] : array_join_result_columns_)
{
array_join_result_columns.insert(result);
array_join_source_columns.insert(source);
}
}
};
static void visit(ASTPtr & ast, Data & data);
static bool needChildVisit(const ASTPtr & node, const ASTPtr & child, const Data & data);
2020-12-12 16:42:15 +00:00
private:
2020-12-13 01:55:56 +00:00
static void visit(ASTIdentifier & node, ASTPtr & ast, Data & data);
2020-12-12 16:42:15 +00:00
static void visit(ASTFunction & node, ASTPtr & ast, Data & data);
};
using ColumnAliasesVisitor = ColumnAliasesMatcher::Visitor;
}