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;
|
2016-07-22 20:39:28 +00:00
|
|
|
|
|
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
|
|
|
|
}
|