ClickHouse/dbms/include/DB/Interpreters/InJoinSubqueriesPreprocessor.h

60 lines
1.8 KiB
C++
Raw Normal View History

2015-09-18 13:36:10 +00:00
#pragma once
2017-01-03 07:37:29 +00:00
#include <string>
#include <DB/Core/Types.h>
#include <DB/Interpreters/SettingsCommon.h>
2015-09-18 13:36:10 +00:00
namespace DB
{
2017-01-03 07:37:29 +00:00
class IAST;
class IStorage;
class ASTSelectQuery;
class Context;
2015-09-18 13:36:10 +00:00
2017-01-03 07:37:29 +00:00
struct Attributes
2015-09-18 13:36:10 +00:00
{
2017-01-03 07:37:29 +00:00
/// Указатель на начало секции [NOT]IN или JOIN в которой включен этот узел,
/// если имеется такая секция.
IAST * enclosing_in_or_join = nullptr;
2015-09-18 13:36:10 +00:00
2017-01-03 07:37:29 +00:00
/** Глубина одного узла N - это глубина того запроса SELECT, которому принадлежит N.
* Дальше глубина одного запроса SELECT определяется следующим образом:
* - если запрос Q корневой, то select_query_depth(Q) = 0
* - если запрос S является непосредственным подзапросом одного запроса R,
* то select_query_depth(S) = select_query_depth(R) + 1
*/
UInt32 select_query_depth = 0;
2015-09-18 13:36:10 +00:00
2017-01-03 07:37:29 +00:00
bool is_in = false;
bool is_join = false;
2017-01-03 07:37:29 +00:00
bool is_global = false;
};
2015-09-18 13:36:10 +00:00
2017-01-03 07:37:29 +00:00
using ASTProperties = std::unordered_map<void *, Attributes>;
2015-09-18 13:36:10 +00:00
2017-01-03 07:37:29 +00:00
class InJoinSubqueriesPreprocessor
2015-09-18 13:36:10 +00:00
{
public:
2017-01-03 07:37:29 +00:00
InJoinSubqueriesPreprocessor(const Context & context) : context(context) {}
void process(ASTSelectQuery * query) const;
2015-09-18 13:36:10 +00:00
2017-01-03 07:37:29 +00:00
/// These methods could be overriden for the need of the unit test.
virtual bool hasAtLeastTwoShards(const IStorage & table) const;
virtual std::pair<std::string, std::string> getRemoteDatabaseAndTableName(const IStorage & table) const;
virtual ~InJoinSubqueriesPreprocessor() {}
2015-09-18 13:36:10 +00:00
private:
2017-01-03 07:37:29 +00:00
void preprocessSubquery(ASTSelectQuery & sub_select_query, ASTProperties & shadow_ast, SettingDistributedProductMode distributed_product_mode) const;
IStorage * getDistributedStorage(const ASTSelectQuery & select_query) const;
2015-09-18 13:36:10 +00:00
const Context & context;
};
2017-01-03 07:37:29 +00:00
2015-09-18 13:36:10 +00:00
}