dbms: development [#CONV-2944].

This commit is contained in:
Alexey Milovidov 2011-08-28 08:50:27 +00:00
parent 2d530f9b84
commit 5b7f634b59
8 changed files with 58 additions and 10 deletions

View File

@ -51,11 +51,12 @@ private:
NamesSet required_columns;
/** Для узлов - литералов - прописать их типы данных.
/** Для узлов - звёздочек - раскрыть их в список всех столбцов.
* Для узлов - литералов - прописать их типы данных.
* Для узлов - функций - прописать ссылки на функции и заменить имена на канонические.
* Для узлов - идентификаторов - прописать ссылки на их типы.
*/
void addSemantic(ASTPtr ast);
void addSemantic(ASTPtr & ast);
/** Проверить, что все функции применимы.
*/

View 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"; }
};
}

View File

@ -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

View File

@ -87,7 +87,7 @@ protected:
};
/** Элемент выражения - одно из: выражение в круглых скобках, массив, литерал, функция, идентификатор.
/** Элемент выражения - одно из: выражение в круглых скобках, массив, литерал, функция, идентификатор, звёздочка.
*/
class ParserExpressionElement : public IParserBase
{

View File

@ -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);
}

View File

@ -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())

View File

@ -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;
}

View File

@ -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 << "*";
}
}