mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-25 09:02:00 +00:00
dbms: development [#CONV-2944].
This commit is contained in:
parent
9f5cc680a4
commit
568a4de64c
27
dbms/include/DB/Interpreters/Context.h
Normal file
27
dbms/include/DB/Interpreters/Context.h
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
#include <Poco/SharedPtr.h>
|
||||||
|
|
||||||
|
#include <DB/Core/NamesAndTypes.h>
|
||||||
|
#include <DB/Functions/IFunction.h>
|
||||||
|
|
||||||
|
|
||||||
|
namespace DB
|
||||||
|
{
|
||||||
|
|
||||||
|
using Poco::SharedPtr;
|
||||||
|
|
||||||
|
typedef std::map<String, SharedPtr<IFunction> > Functions;
|
||||||
|
|
||||||
|
/** Набор известных объектов, которые могут быть использованы в запросе.
|
||||||
|
*/
|
||||||
|
struct Context
|
||||||
|
{
|
||||||
|
Functions functions;
|
||||||
|
NamesAndTypes columns;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
}
|
53
dbms/include/DB/Interpreters/Expression.h
Normal file
53
dbms/include/DB/Interpreters/Expression.h
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <Poco/SharedPtr.h>
|
||||||
|
|
||||||
|
#include <DB/Parsers/IAST.h>
|
||||||
|
#include <DB/Interpreters/Context.h>
|
||||||
|
|
||||||
|
|
||||||
|
namespace DB
|
||||||
|
{
|
||||||
|
|
||||||
|
/** Интерпретирует выражение из синтаксического дерева,
|
||||||
|
* в котором присутствуют имена столбцов, константы и обычные функции.
|
||||||
|
*/
|
||||||
|
class Expression
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Expression(IAST & ast_, const Context & context_) : ast(ast_), context(context_)
|
||||||
|
{
|
||||||
|
addSemantic();
|
||||||
|
checkTypes();
|
||||||
|
glueTree();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Выполнить выражение над блоком. Блок должен содержать все столбцы - идентификаторы.
|
||||||
|
*/
|
||||||
|
void execute(Block & block);
|
||||||
|
|
||||||
|
private:
|
||||||
|
IAST & ast;
|
||||||
|
Context & context;
|
||||||
|
|
||||||
|
|
||||||
|
/** Для узлов - литералов, создать соответствующие столбцы-константы и типы данных.
|
||||||
|
* Для узлов - функций - прописать ссылки на функции и заменить имена на канонические.
|
||||||
|
* Для узлов - идентификаторов - прописать ссылки на их типы.
|
||||||
|
*/
|
||||||
|
void addSemantic();
|
||||||
|
|
||||||
|
/** Проверить, что все функции применимы.
|
||||||
|
*/
|
||||||
|
void checkTypes();
|
||||||
|
|
||||||
|
/** Склеить одинаковые узлы в синтаксическом дереве (превращая его в направленный ациклический граф).
|
||||||
|
* Это означает, в том числе то, что функции с одними и теми же аргументами, будут выполняться только один раз.
|
||||||
|
* Например, выражение rand(), rand() вернёт два идентичных столбца.
|
||||||
|
* Поэтому, все функции, в которых такое поведение нежелательно, должны содержать дополнительный параметр "тег".
|
||||||
|
*/
|
||||||
|
void glueTree();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user