Add array expression
Project: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/commit/a7031a34 Tree: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/tree/a7031a34 Diff: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/diff/a7031a34 Branch: refs/heads/refactor-type Commit: a7031a343814bb003353c6b0b75957f66db6240c Parents: ebf44cd Author: Jianqiao Zhu <[email protected]> Authored: Mon Oct 2 01:30:46 2017 -0500 Committer: Jianqiao Zhu <[email protected]> Committed: Wed Oct 11 13:37:54 2017 -0500 ---------------------------------------------------------------------- parser/ParseBasicExpressions.cpp | 27 + parser/ParseBasicExpressions.hpp | 42 + parser/ParseExpression.hpp | 1 + parser/SqlLexer.lpp | 1 + parser/SqlParser.ypp | 29 + parser/preprocessed/SqlLexer_gen.cpp | 1429 ++++++------ parser/preprocessed/SqlLexer_gen.hpp | 2 +- parser/preprocessed/SqlParser_gen.cpp | 3339 +++++++++++++++------------- parser/preprocessed/SqlParser_gen.hpp | 115 +- query_optimizer/resolver/Resolver.cpp | 28 + query_optimizer/resolver/Resolver.hpp | 6 + types/ArrayType.cpp | 2 +- 12 files changed, 2651 insertions(+), 2370 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/a7031a34/parser/ParseBasicExpressions.cpp ---------------------------------------------------------------------- diff --git a/parser/ParseBasicExpressions.cpp b/parser/ParseBasicExpressions.cpp index 580cd09..fd9094c 100644 --- a/parser/ParseBasicExpressions.cpp +++ b/parser/ParseBasicExpressions.cpp @@ -127,4 +127,31 @@ void ParseFunctionCall::getFieldStringItems( } } +std::string ParseArray::generateName() const { + string name("{"); + if (!elements_.empty()) { + name.append(elements_.front()->generateName()); + for (std::size_t i = 1; i < elements_.size(); ++i) { + name.append(","); + name.append(elements_.at(i)->generateName()); + } + } + name.append("}"); + return name; +} + +void ParseArray::getFieldStringItems( + std::vector<std::string> *inline_field_names, + std::vector<std::string> *inline_field_values, + std::vector<std::string> *non_container_child_field_names, + std::vector<const ParseTreeNode*> *non_container_child_fields, + std::vector<std::string> *container_child_field_names, + std::vector<std::vector<const ParseTreeNode*>> *container_child_fields) const { + container_child_field_names->emplace_back("elements"); + container_child_fields->emplace_back(); + for (const auto &element : elements_) { + container_child_fields->back().emplace_back(element.get()); + } +} + } // namespace quickstep http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/a7031a34/parser/ParseBasicExpressions.hpp ---------------------------------------------------------------------- diff --git a/parser/ParseBasicExpressions.hpp b/parser/ParseBasicExpressions.hpp index 4572214..af2393f 100644 --- a/parser/ParseBasicExpressions.hpp +++ b/parser/ParseBasicExpressions.hpp @@ -344,6 +344,48 @@ class ParseFunctionCall : public ParseExpression { DISALLOW_COPY_AND_ASSIGN(ParseFunctionCall); }; + +class ParseArray : public ParseExpression { + public: + ParseArray(const int line_number, const int column_number) + : ParseExpression(line_number, column_number) {} + + ~ParseArray() override { + } + + ExpressionType getExpressionType() const override { + return kArray; + } + + std::string getName() const override { + return "Array"; + } + + std::string generateName() const override; + + const std::vector<std::unique_ptr<ParseExpression>>& elements() const { + return elements_; + } + + void add(ParseExpression *element) { + elements_.emplace_back(std::unique_ptr<ParseExpression>(element)); + } + + protected: + void getFieldStringItems( + std::vector<std::string> *inline_field_names, + std::vector<std::string> *inline_field_values, + std::vector<std::string> *non_container_child_field_names, + std::vector<const ParseTreeNode*> *non_container_child_fields, + std::vector<std::string> *container_child_field_names, + std::vector<std::vector<const ParseTreeNode*>> *container_child_fields) const override; + + private: + std::vector<std::unique_ptr<ParseExpression>> elements_; + + DISALLOW_COPY_AND_ASSIGN(ParseArray); +}; + /** @} */ } // namespace quickstep http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/a7031a34/parser/ParseExpression.hpp ---------------------------------------------------------------------- diff --git a/parser/ParseExpression.hpp b/parser/ParseExpression.hpp index 94b4487..f9a33a2 100644 --- a/parser/ParseExpression.hpp +++ b/parser/ParseExpression.hpp @@ -37,6 +37,7 @@ namespace quickstep { class ParseExpression : public ParseTreeNode { public: enum ExpressionType { + kArray, kAttribute, kBinaryExpression, kFunctionCall, http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/a7031a34/parser/SqlLexer.lpp ---------------------------------------------------------------------- diff --git a/parser/SqlLexer.lpp b/parser/SqlLexer.lpp index 9a63483..b45d8ab 100644 --- a/parser/SqlLexer.lpp +++ b/parser/SqlLexer.lpp @@ -39,6 +39,7 @@ namespace quickstep { class BinaryOperation; class Comparison; +class ParseArray; class ParseAssignment; class ParseAttribute; class ParseAttributeDefinition; http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/a7031a34/parser/SqlParser.ypp ---------------------------------------------------------------------- diff --git a/parser/SqlParser.ypp b/parser/SqlParser.ypp index 156e9e7..01be345 100644 --- a/parser/SqlParser.ypp +++ b/parser/SqlParser.ypp @@ -186,6 +186,7 @@ typedef void* yyscan_t; quickstep::ParseString *unary_operation_; quickstep::ParseString *binary_operation_; + quickstep::ParseArray *array_expression_; quickstep::ParseFunctionCall *function_call_; quickstep::PtrList<quickstep::ParseExpression> *expression_list_; @@ -396,6 +397,11 @@ void NotSupported(const YYLTYPE *location, yyscan_t yyscanner, const std::string extract_function substr_function + +%type <array_expression_> + array_expression + array_element_commalist + %type <attribute_> attribute_ref @@ -1710,6 +1716,9 @@ expression_base: | literal_value { $$ = new quickstep::ParseScalarLiteral($1); } + | array_expression { + $$ = $1; + } | function_call { $$ = $1; } @@ -1740,6 +1749,26 @@ expression_base: $$ = $1; }; +array_expression: + array_element_commalist TOKEN_RBRACE { + $$ = $1; + } + | TOKEN_LBRACE TOKEN_RBRACE { + $$ = new quickstep::ParseArray(@1.first_line, @1.first_column); + } + ; + +array_element_commalist: + array_element_commalist ',' add_expression { + $$ = $1; + $$->add($3); + } + | TOKEN_LBRACE add_expression { + $$ = new quickstep::ParseArray(@1.first_line, @1.first_column); + $$->add($2); + } + ; + function_call: any_name '(' ')' { $$ = new quickstep::ParseFunctionCall(
