From 5b7f634b595f01659eab04569628ceda7840e4a8 Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Sun, 28 Aug 2011 08:50:27 +0000 Subject: [PATCH] dbms: development [#CONV-2944]. --- dbms/include/DB/Interpreters/Expression.h | 5 +++-- dbms/include/DB/Parsers/ASTAsterisk.h | 19 +++++++++++++++++++ dbms/include/DB/Parsers/ASTExpressionList.h | 5 +---- .../DB/Parsers/ExpressionElementParsers.h | 2 +- dbms/include/DB/Parsers/formatAST.h | 2 ++ dbms/src/Interpreters/Expression.cpp | 12 ++++++++++-- dbms/src/Parsers/ExpressionElementParsers.cpp | 11 ++++++++++- dbms/src/Parsers/formatAST.cpp | 12 ++++++++++++ 8 files changed, 58 insertions(+), 10 deletions(-) create mode 100644 dbms/include/DB/Parsers/ASTAsterisk.h diff --git a/dbms/include/DB/Interpreters/Expression.h b/dbms/include/DB/Interpreters/Expression.h index 972f0c86053..19cacd915b0 100644 --- a/dbms/include/DB/Interpreters/Expression.h +++ b/dbms/include/DB/Interpreters/Expression.h @@ -51,11 +51,12 @@ private: NamesSet required_columns; - /** Для узлов - литералов - прописать их типы данных. + /** Для узлов - звёздочек - раскрыть их в список всех столбцов. + * Для узлов - литералов - прописать их типы данных. * Для узлов - функций - прописать ссылки на функции и заменить имена на канонические. * Для узлов - идентификаторов - прописать ссылки на их типы. */ - void addSemantic(ASTPtr ast); + void addSemantic(ASTPtr & ast); /** Проверить, что все функции применимы. */ diff --git a/dbms/include/DB/Parsers/ASTAsterisk.h b/dbms/include/DB/Parsers/ASTAsterisk.h new file mode 100644 index 00000000000..85fdba647ae --- /dev/null +++ b/dbms/include/DB/Parsers/ASTAsterisk.h @@ -0,0 +1,19 @@ +#pragma once + +#include + + +namespace DB +{ + +/** Звёздочка. + */ +class ASTAsterisk : public IAST +{ +public: + ASTAsterisk() {} + ASTAsterisk(StringRange range_) : IAST(range_) {} + String getID() { return "Asterisk"; } +}; + +} diff --git a/dbms/include/DB/Parsers/ASTExpressionList.h b/dbms/include/DB/Parsers/ASTExpressionList.h index d78e6592c86..3f796dcc592 100644 --- a/dbms/include/DB/Parsers/ASTExpressionList.h +++ b/dbms/include/DB/Parsers/ASTExpressionList.h @@ -1,5 +1,4 @@ -#ifndef DBMS_PARSERS_ASTEXPRESSIONLIST_H -#define DBMS_PARSERS_ASTEXPRESSIONLIST_H +#pragma once #include @@ -23,5 +22,3 @@ public: }; } - -#endif diff --git a/dbms/include/DB/Parsers/ExpressionElementParsers.h b/dbms/include/DB/Parsers/ExpressionElementParsers.h index fa2fbe7dbe4..ac797abd82c 100644 --- a/dbms/include/DB/Parsers/ExpressionElementParsers.h +++ b/dbms/include/DB/Parsers/ExpressionElementParsers.h @@ -87,7 +87,7 @@ protected: }; -/** Элемент выражения - одно из: выражение в круглых скобках, массив, литерал, функция, идентификатор. +/** Элемент выражения - одно из: выражение в круглых скобках, массив, литерал, функция, идентификатор, звёздочка. */ class ParserExpressionElement : public IParserBase { diff --git a/dbms/include/DB/Parsers/formatAST.h b/dbms/include/DB/Parsers/formatAST.h index 8511d54053a..1c09b1d57f4 100644 --- a/dbms/include/DB/Parsers/formatAST.h +++ b/dbms/include/DB/Parsers/formatAST.h @@ -11,6 +11,7 @@ #include #include #include +#include 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); } diff --git a/dbms/src/Interpreters/Expression.cpp b/dbms/src/Interpreters/Expression.cpp index 637aa75ccae..2150144a82f 100644 --- a/dbms/src/Interpreters/Expression.cpp +++ b/dbms/src/Interpreters/Expression.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -11,9 +12,16 @@ namespace DB { -void Expression::addSemantic(ASTPtr ast) +void Expression::addSemantic(ASTPtr & ast) { - if (ASTFunction * node = dynamic_cast(&*ast)) + if (dynamic_cast(&*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(&*ast)) { Functions::const_iterator it = context.functions->find(node->name); if (it == context.functions->end()) diff --git a/dbms/src/Parsers/ExpressionElementParsers.cpp b/dbms/src/Parsers/ExpressionElementParsers.cpp index b5b6d9676f0..2f8ea8e2b52 100644 --- a/dbms/src/Parsers/ExpressionElementParsers.cpp +++ b/dbms/src/Parsers/ExpressionElementParsers.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -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; } diff --git a/dbms/src/Parsers/formatAST.cpp b/dbms/src/Parsers/formatAST.cpp index d31e0ef12de..56eb895efad 100644 --- a/dbms/src/Parsers/formatAST.cpp +++ b/dbms/src/Parsers/formatAST.cpp @@ -67,6 +67,13 @@ void formatAST(const IAST & ast, std::ostream & s) return; } + const ASTAsterisk * asterisk = dynamic_cast(&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 << "*"; +} + }