mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-21 23:21:59 +00:00
dbms: development [#CONV-2944].
This commit is contained in:
parent
2d530f9b84
commit
5b7f634b59
@ -51,11 +51,12 @@ private:
|
||||
NamesSet required_columns;
|
||||
|
||||
|
||||
/** Для узлов - литералов - прописать их типы данных.
|
||||
/** Для узлов - звёздочек - раскрыть их в список всех столбцов.
|
||||
* Для узлов - литералов - прописать их типы данных.
|
||||
* Для узлов - функций - прописать ссылки на функции и заменить имена на канонические.
|
||||
* Для узлов - идентификаторов - прописать ссылки на их типы.
|
||||
*/
|
||||
void addSemantic(ASTPtr ast);
|
||||
void addSemantic(ASTPtr & ast);
|
||||
|
||||
/** Проверить, что все функции применимы.
|
||||
*/
|
||||
|
19
dbms/include/DB/Parsers/ASTAsterisk.h
Normal file
19
dbms/include/DB/Parsers/ASTAsterisk.h
Normal file
@ -0,0 +1,19 @@
|
||||
#pragma once
|
||||
|
||||
#include <DB/Parsers/IAST.h>
|
||||
|
||||
|
||||
namespace DB
|
||||
{
|
||||
|
||||
/** Звёздочка.
|
||||
*/
|
||||
class ASTAsterisk : public IAST
|
||||
{
|
||||
public:
|
||||
ASTAsterisk() {}
|
||||
ASTAsterisk(StringRange range_) : IAST(range_) {}
|
||||
String getID() { return "Asterisk"; }
|
||||
};
|
||||
|
||||
}
|
@ -1,5 +1,4 @@
|
||||
#ifndef DBMS_PARSERS_ASTEXPRESSIONLIST_H
|
||||
#define DBMS_PARSERS_ASTEXPRESSIONLIST_H
|
||||
#pragma once
|
||||
|
||||
#include <DB/Parsers/IAST.h>
|
||||
|
||||
@ -23,5 +22,3 @@ public:
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -87,7 +87,7 @@ protected:
|
||||
};
|
||||
|
||||
|
||||
/** Элемент выражения - одно из: выражение в круглых скобках, массив, литерал, функция, идентификатор.
|
||||
/** Элемент выражения - одно из: выражение в круглых скобках, массив, литерал, функция, идентификатор, звёздочка.
|
||||
*/
|
||||
class ParserExpressionElement : public IParserBase
|
||||
{
|
||||
|
@ -11,6 +11,7 @@
|
||||
#include <DB/Parsers/ASTIdentifier.h>
|
||||
#include <DB/Parsers/ASTLiteral.h>
|
||||
#include <DB/Parsers/ASTNameTypePair.h>
|
||||
#include <DB/Parsers/ASTAsterisk.h>
|
||||
|
||||
|
||||
namespace DB
|
||||
@ -27,6 +28,7 @@ void formatAST(const ASTFunction & ast, std::ostream & s);
|
||||
void formatAST(const ASTIdentifier & ast, std::ostream & s);
|
||||
void formatAST(const ASTLiteral & ast, std::ostream & s);
|
||||
void formatAST(const ASTNameTypePair & ast, std::ostream & s);
|
||||
void formatAST(const ASTAsterisk & ast, std::ostream & s);
|
||||
|
||||
}
|
||||
|
||||
|
@ -3,6 +3,7 @@
|
||||
#include <DB/Parsers/ASTFunction.h>
|
||||
#include <DB/Parsers/ASTIdentifier.h>
|
||||
#include <DB/Parsers/ASTLiteral.h>
|
||||
#include <DB/Parsers/ASTAsterisk.h>
|
||||
#include <DB/Parsers/ASTExpressionList.h>
|
||||
|
||||
#include <DB/Interpreters/Expression.h>
|
||||
@ -11,9 +12,16 @@
|
||||
namespace DB
|
||||
{
|
||||
|
||||
void Expression::addSemantic(ASTPtr ast)
|
||||
void Expression::addSemantic(ASTPtr & ast)
|
||||
{
|
||||
if (ASTFunction * node = dynamic_cast<ASTFunction *>(&*ast))
|
||||
if (dynamic_cast<ASTAsterisk *>(&*ast))
|
||||
{
|
||||
ASTExpressionList * all_columns = new ASTExpressionList(ast->range);
|
||||
for (NamesAndTypes::const_iterator it = context.columns.begin(); it != context.columns.end(); ++it)
|
||||
all_columns->children.push_back(new ASTIdentifier(ast->range, it->first));
|
||||
ast = all_columns;
|
||||
}
|
||||
else if (ASTFunction * node = dynamic_cast<ASTFunction *>(&*ast))
|
||||
{
|
||||
Functions::const_iterator it = context.functions->find(node->name);
|
||||
if (it == context.functions->end())
|
||||
|
@ -6,6 +6,7 @@
|
||||
#include <DB/Parsers/ASTFunction.h>
|
||||
#include <DB/Parsers/ASTIdentifier.h>
|
||||
#include <DB/Parsers/ASTLiteral.h>
|
||||
#include <DB/Parsers/ASTAsterisk.h>
|
||||
|
||||
#include <DB/Parsers/CommonParsers.h>
|
||||
#include <DB/Parsers/ExpressionListParsers.h>
|
||||
@ -301,6 +302,7 @@ bool ParserExpressionElement::parseImpl(Pos & pos, Pos end, ASTPtr & node, Strin
|
||||
ParserLiteral lit_p;
|
||||
ParserFunction fun_p;
|
||||
ParserIdentifier id_p;
|
||||
ParserString asterisk_p("*");
|
||||
|
||||
if (paren_p.parse(pos, end, node, expected))
|
||||
return true;
|
||||
@ -322,7 +324,14 @@ bool ParserExpressionElement::parseImpl(Pos & pos, Pos end, ASTPtr & node, Strin
|
||||
return true;
|
||||
pos = begin;
|
||||
|
||||
expected = "expression element: one of array, literal, function, identifier, parenthised expression";
|
||||
if (asterisk_p.parse(pos, end, node, expected))
|
||||
{
|
||||
node = new ASTAsterisk(StringRange(begin, pos));
|
||||
return true;
|
||||
}
|
||||
pos = begin;
|
||||
|
||||
expected = "expression element: one of array, literal, function, identifier, asterisk, parenthised expression";
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -67,6 +67,13 @@ void formatAST(const IAST & ast, std::ostream & s)
|
||||
return;
|
||||
}
|
||||
|
||||
const ASTAsterisk * asterisk = dynamic_cast<const ASTAsterisk *>(&ast);
|
||||
if (asterisk)
|
||||
{
|
||||
formatAST(*asterisk, s);
|
||||
return;
|
||||
}
|
||||
|
||||
throw DB::Exception("Unknown element in AST", ErrorCodes::UNKNOWN_ELEMENT_IN_AST);
|
||||
}
|
||||
|
||||
@ -167,5 +174,10 @@ void formatAST(const ASTNameTypePair & ast, std::ostream & s)
|
||||
formatAST(*ast.type, s);
|
||||
}
|
||||
|
||||
void formatAST(const ASTAsterisk & ast, std::ostream & s)
|
||||
{
|
||||
s << "*";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user