You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@quickstep.apache.org by zu...@apache.org on 2016/06/25 02:01:23 UTC
[6/7] incubator-quickstep git commit: Added PRIORITY clause in parser.
Added PRIORITY clause in parser.
- SQL statements (right now only SELECT statements) support "WITH
PRIORITY N" clause.
- The priority value should be a non-zero unsigned integer.
- The priority value is a part of the QueryHandle class.
Project: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/commit/d6428914
Tree: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/tree/d6428914
Diff: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/diff/d6428914
Branch: refs/heads/SQL-window-aggregation
Commit: d64289148bee499e2232637602b4197da6791fc4
Parents: 07435a4
Author: Harshad Deshmukh <hb...@apache.org>
Authored: Fri Jun 17 16:01:19 2016 -0500
Committer: Harshad Deshmukh <hb...@apache.org>
Committed: Mon Jun 20 12:30:20 2016 -0500
----------------------------------------------------------------------
parser/CMakeLists.txt | 8 +
parser/ParsePriority.hpp | 94 +
parser/ParseStatement.hpp | 33 +-
parser/SqlLexer.lpp | 2 +
parser/SqlParser.ypp | 37 +-
parser/preprocessed/SqlLexer_gen.cpp | 1263 +++---
parser/preprocessed/SqlLexer_gen.hpp | 16 +-
parser/preprocessed/SqlParser_gen.cpp | 5699 +++++++++++++++-------------
parser/preprocessed/SqlParser_gen.hpp | 323 +-
parser/tests/Select.test | 43 +
query_optimizer/QueryHandle.hpp | 13 +-
query_optimizer/QueryProcessor.cpp | 4 +-
12 files changed, 4120 insertions(+), 3415 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/d6428914/parser/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/parser/CMakeLists.txt b/parser/CMakeLists.txt
index 114ad14..32ea1a9 100644
--- a/parser/CMakeLists.txt
+++ b/parser/CMakeLists.txt
@@ -103,6 +103,7 @@ add_library(quickstep_parser_ParsePartitionClause ../empty_src.cpp ParsePartitio
add_library(quickstep_parser_ParsePredicate ParsePredicate.cpp ParsePredicate.hpp)
add_library(quickstep_parser_ParsePredicateExists ../empty_src.cpp ParsePredicateExists.hpp)
add_library(quickstep_parser_ParsePredicateInTableQuery ../empty_src.cpp ParsePredicateInTableQuery.hpp)
+add_library(quickstep_parser_ParsePriority ../empty_src.cpp ParsePriority.hpp)
add_library(quickstep_parser_ParseSample ParseSample.cpp ParseSample.hpp)
add_library(quickstep_parser_ParseSelect ../empty_src.cpp ParseSelect.hpp)
add_library(quickstep_parser_ParseSelectionClause ParseSelectionClause.cpp ParseSelectionClause.hpp)
@@ -229,6 +230,10 @@ target_link_libraries(quickstep_parser_ParsePredicateInTableQuery
quickstep_parser_ParsePredicate
quickstep_parser_ParseSubqueryExpression
quickstep_utility_Macros)
+target_link_libraries(quickstep_parser_ParsePriority
+ quickstep_parser_ParseLiteralValue
+ quickstep_parser_ParseTreeNode
+ quickstep_utility_Macros)
target_link_libraries(quickstep_parser_ParseSample
quickstep_parser_ParseLiteralValue
quickstep_parser_ParseTreeNode
@@ -267,6 +272,7 @@ target_link_libraries(quickstep_parser_ParseStatement
quickstep_parser_ParseKeyValue
quickstep_parser_ParsePartitionClause
quickstep_parser_ParsePredicate
+ quickstep_parser_ParsePriority
quickstep_parser_ParseSelect
quickstep_parser_ParseString
quickstep_parser_ParseSubqueryTableReference
@@ -337,6 +343,7 @@ target_link_libraries(quickstep_parser_SqlParser
quickstep_parser_ParsePredicate
quickstep_parser_ParsePredicateExists
quickstep_parser_ParsePredicateInTableQuery
+ quickstep_parser_ParsePriority
quickstep_parser_ParseSample
quickstep_parser_ParseSelect
quickstep_parser_ParseSelectionClause
@@ -414,6 +421,7 @@ target_link_libraries(quickstep_parser
quickstep_parser_ParsePredicate
quickstep_parser_ParsePredicateExists
quickstep_parser_ParsePredicateInTableQuery
+ quickstep_parser_ParsePriority
quickstep_parser_ParserUtil
quickstep_parser_ParseSample
quickstep_parser_ParseSelect
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/d6428914/parser/ParsePriority.hpp
----------------------------------------------------------------------
diff --git a/parser/ParsePriority.hpp b/parser/ParsePriority.hpp
new file mode 100644
index 0000000..89806d4
--- /dev/null
+++ b/parser/ParsePriority.hpp
@@ -0,0 +1,94 @@
+/**
+ * Copyright 2016, Quickstep Research Group, Computer Sciences Department,
+ * University of Wisconsin\u2014Madison.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ **/
+
+#ifndef QUICKSTEP_PARSER_PARSE_PRIORITY_HPP_
+#define QUICKSTEP_PARSER_PARSE_PRIORITY_HPP_
+
+#include <memory>
+#include <string>
+#include <vector>
+
+#include "parser/ParseLiteralValue.hpp"
+#include "parser/ParseTreeNode.hpp"
+#include "utility/Macros.hpp"
+
+namespace quickstep {
+
+/** \addtogroup Parser
+ * @{
+ */
+
+/**
+ * @brief A parsed representation of PRIORITY.
+ **/
+class ParsePriority : public ParseTreeNode {
+ public:
+ /**
+ * @brief Constructor.
+ *
+ * @param line_number The line number of "PRIORITY" in the SQL statement.
+ * @param column_number The column number of "PRIORITY" in the SQL statement.
+ * @param priority_expression The PRIORITY value expression.
+ **/
+ ParsePriority(const int line_number,
+ const int column_number,
+ NumericParseLiteralValue *priority_expression)
+ : ParseTreeNode(line_number, column_number),
+ priority_expression_(priority_expression) {}
+
+ /**
+ * @brief Destructor.
+ */
+ ~ParsePriority() override {}
+
+ /**
+ * @brief Gets the PRIORITY expression.
+ *
+ * @return PRIORITY expression
+ */
+ const NumericParseLiteralValue* priority_expression() const {
+ return priority_expression_.get();
+ }
+
+ std::string getName() const override {
+ return "PRIORITY";
+ }
+
+ 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 {
+ non_container_child_field_names->push_back("");
+ non_container_child_fields->push_back(priority_expression_.get());
+ }
+
+ private:
+ std::unique_ptr<NumericParseLiteralValue> priority_expression_;
+
+ DISALLOW_COPY_AND_ASSIGN(ParsePriority);
+};
+
+/** @} */
+
+} // namespace quickstep
+
+#endif // QUICKSTEP_PARSER_PARSE_PRIORITY_HPP_
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/d6428914/parser/ParseStatement.hpp
----------------------------------------------------------------------
diff --git a/parser/ParseStatement.hpp b/parser/ParseStatement.hpp
index 65acc68..61475a9 100644
--- a/parser/ParseStatement.hpp
+++ b/parser/ParseStatement.hpp
@@ -32,6 +32,7 @@
#include "parser/ParseKeyValue.hpp"
#include "parser/ParsePartitionClause.hpp"
#include "parser/ParsePredicate.hpp"
+#include "parser/ParsePriority.hpp"
#include "parser/ParseSelect.hpp"
#include "parser/ParseString.hpp"
#include "parser/ParseSubqueryTableReference.hpp"
@@ -83,6 +84,16 @@ class ParseStatement : public ParseTreeNode {
**/
virtual StatementType getStatementType() const = 0;
+ /**
+ * @brief Get the priority of the SQL statement. Note that the priority is
+ * an unsigned non-zero integer.
+ *
+ * @return The priority of the SQL statement. The default priority is 1.
+ **/
+ virtual const std::uint64_t getPriority() const {
+ return 1;
+ }
+
protected:
ParseStatement(const int line_number, const int column_number)
: ParseTreeNode(line_number, column_number) {
@@ -480,14 +491,18 @@ class ParseStatementSelect : public ParseStatement {
* @param column_number Column number of the first token of this node in the SQL statement.
* @param select_query The top-level SELECT query.
* @param with_clause The WITH clause of common table query expressions.
+ * @param priority_clause The PRIORITY clause of this query. If not valid or
+ * not present, this is NULL.
**/
ParseStatementSelect(const int line_number,
const int column_number,
ParseSelect *select_query,
- PtrVector<ParseSubqueryTableReference> *with_clause)
+ PtrVector<ParseSubqueryTableReference> *with_clause,
+ ParsePriority *priority_clause)
: ParseStatement(line_number, column_number),
select_query_(select_query),
- with_clause_(with_clause) {
+ with_clause_(with_clause),
+ priority_clause_(priority_clause) {
}
/**
@@ -518,6 +533,14 @@ class ParseStatementSelect : public ParseStatement {
return with_clause_.get();
}
+ const std::uint64_t getPriority() const override {
+ if (priority_clause_ != nullptr) {
+ DCHECK(priority_clause_->priority_expression() != nullptr);
+ return priority_clause_->priority_expression()->long_value();
+ }
+ return 1;
+ }
+
protected:
void getFieldStringItems(
std::vector<std::string> *inline_field_names,
@@ -536,11 +559,17 @@ class ParseStatementSelect : public ParseStatement {
container_child_fields->back().push_back(&common_subquery);
}
}
+
+ if (priority_clause_ != nullptr) {
+ non_container_child_field_names->push_back("priority");
+ non_container_child_fields->push_back(priority_clause_.get());
+ }
}
private:
std::unique_ptr<ParseSelect> select_query_;
std::unique_ptr<PtrVector<ParseSubqueryTableReference>> with_clause_;
+ std::unique_ptr<ParsePriority> priority_clause_;
DISALLOW_COPY_AND_ASSIGN(ParseStatementSelect);
};
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/d6428914/parser/SqlLexer.lpp
----------------------------------------------------------------------
diff --git a/parser/SqlLexer.lpp b/parser/SqlLexer.lpp
index ee34400..ec18f38 100644
--- a/parser/SqlLexer.lpp
+++ b/parser/SqlLexer.lpp
@@ -61,6 +61,7 @@ class ParseOrderBy;
class ParseOrderByItem;
class ParsePartitionClause;
class ParsePredicate;
+class ParsePriority;
class ParseSample;
class ParseScalarLiteral;
class ParseSearchedWhenClause;
@@ -253,6 +254,7 @@ unsigned_numeric_literal {exact_numeric_literal}|{approximate_numeric_literal}
"percent" return TOKEN_PERCENT;
"preceding" return TOKEN_PRECEDING;
"primary" return TOKEN_PRIMARY;
+ "priority" return TOKEN_PRIORITY;
"quit" return TOKEN_QUIT;
"range" return TOKEN_RANGE;
"real" return TOKEN_REAL;
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/d6428914/parser/SqlParser.ypp
----------------------------------------------------------------------
diff --git a/parser/SqlParser.ypp b/parser/SqlParser.ypp
index 81fa3ae..382ea44 100644
--- a/parser/SqlParser.ypp
+++ b/parser/SqlParser.ypp
@@ -85,6 +85,7 @@ typedef struct YYLTYPE {
#include "parser/ParsePredicate.hpp"
#include "parser/ParsePredicateExists.hpp"
#include "parser/ParsePredicateInTableQuery.hpp"
+#include "parser/ParsePriority.hpp"
#include "parser/ParserUtil.hpp"
#include "parser/ParseSample.hpp"
#include "parser/ParseSelect.hpp"
@@ -212,6 +213,8 @@ typedef void* yyscan_t;
quickstep::PtrVector<quickstep::ParseSubqueryTableReference> *with_list_;
quickstep::ParseSubqueryTableReference *with_list_element_;
+
+ quickstep::ParsePriority *opt_priority_clause_;
}
%{
@@ -319,6 +322,7 @@ void NotSupported(const YYLTYPE *location, yyscan_t yyscanner, const std::string
%token TOKEN_PERCENT;
%token TOKEN_PRECEDING;
%token TOKEN_PRIMARY;
+%token TOKEN_PRIORITY;
%token TOKEN_QUIT;
%token TOKEN_RANGE;
%token TOKEN_REAL;
@@ -583,6 +587,9 @@ void NotSupported(const YYLTYPE *location, yyscan_t yyscanner, const std::string
%type <window_frame_info_>
opt_window_frame
+%type <opt_priority_clause_>
+ opt_priority_clause
+
%type <with_list_>
with_clause
with_list
@@ -1143,13 +1150,35 @@ assignment_item:
/* Select Queries */
select_statement:
- select_query {
- $$ = new quickstep::ParseStatementSelect(@1.first_line, @1.first_column, $1, nullptr);
+ select_query opt_priority_clause {
+ $$ = new quickstep::ParseStatementSelect(@1.first_line, @1.first_column, $1, nullptr, $2);
}
- | with_clause select_query {
- $$ = new quickstep::ParseStatementSelect(@1.first_line, @1.first_column, $2, $1);
+ | with_clause select_query opt_priority_clause {
+ $$ = new quickstep::ParseStatementSelect(@1.first_line, @1.first_column, $2, $1, $3);
};
+opt_priority_clause:
+ {
+ $$ = nullptr;
+ }
+ | TOKEN_WITH TOKEN_PRIORITY TOKEN_UNSIGNED_NUMVAL {
+ if ($3->float_like()) {
+ delete $3;
+ $$ = nullptr;
+ quickstep_yyerror(&@3, yyscanner, nullptr, "PRIORITY value must be an integer");
+ YYERROR;
+ } else {
+ if ($3->long_value() <= 0) {
+ delete $3;
+ $$ = nullptr;
+ quickstep_yyerror(&@3, yyscanner, nullptr, "PRIORITY value must be positive");
+ YYERROR;
+ } else {
+ $$ = new quickstep::ParsePriority(@1.first_line, @1.first_column, $3);
+ }
+ }
+ };
+
with_clause:
TOKEN_WITH with_list {
$$ = $2;