You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafodion.apache.org by hz...@apache.org on 2017/12/12 18:16:30 UTC
[3/6] incubator-trafodion git commit: add limit clause for
insert-as-select statement
add limit clause for insert-as-select statement
add limit clause for insert-as-select statement
Project: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/commit/f574b540
Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/tree/f574b540
Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/diff/f574b540
Branch: refs/heads/master
Commit: f574b540d6ba7de35493a672da544887b7d146e6
Parents: 083f58d
Author: eedy <cq...@gmail.com>
Authored: Wed Nov 22 20:48:35 2017 +0800
Committer: EEDY <cq...@gmail.com>
Committed: Mon Dec 11 09:38:58 2017 +0800
----------------------------------------------------------------------
core/sql/parser/sqlparser.y | 123 ++++++++++++++++++++++++++++++++++++---
1 file changed, 116 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/f574b540/core/sql/parser/sqlparser.y
----------------------------------------------------------------------
diff --git a/core/sql/parser/sqlparser.y b/core/sql/parser/sqlparser.y
index 5460024..2580127 100755
--- a/core/sql/parser/sqlparser.y
+++ b/core/sql/parser/sqlparser.y
@@ -19239,9 +19239,31 @@ boolean_primary : predicate
}
/* type relx */
-Rest_Of_insert_statement : no_check_log no_rollback TOK_INTO table_name query_expression order_by_clause access_type
+Rest_Of_insert_statement : no_check_log no_rollback TOK_INTO table_name query_expression order_by_clause access_type optional_limit_spec
{
if (!finalizeAccessOptions($5, $7)) YYERROR;
+
+ //limit clause
+ if ($8)
+ {
+ RelExpr *query = $5;
+
+ if (query->getFirstNRows() >= 0)
+ {
+ // cannot specify LIMIT and FIRST N clauses together.
+ YYERROR;
+ }
+ else
+ {
+ NABoolean negate;
+ if ($8->castToConstValue(negate))
+ {
+ ConstValue * limit = (ConstValue*)$8;
+ Lng32 scale = 0;
+ query->setFirstNRows(limit->getExactNumericValue(scale));
+ }
+ }
+ }
// insert into all columns
$$ = new (PARSERHEAP())
@@ -19272,10 +19294,32 @@ Rest_Of_insert_statement : no_check_log no_rollback TOK_INTO table_name query_ex
}
|
- no_check_log no_rollback TOK_INTO TOK_TABLE table_name query_expression order_by_clause access_type
+ no_check_log no_rollback TOK_INTO TOK_TABLE table_name query_expression order_by_clause access_type optional_limit_spec
{
if (!finalizeAccessOptions($6, $8)) YYERROR;
-
+
+ //limit clause
+ if ($9)
+ {
+ RelExpr *query = $6;
+
+ if (query->getFirstNRows() >= 0)
+ {
+ // cannot specify LIMIT and FIRST N clauses together.
+ YYERROR;
+ }
+ else
+ {
+ NABoolean negate;
+ if ($9->castToConstValue(negate))
+ {
+ ConstValue * limit = (ConstValue*)$9;
+ Lng32 scale = 0;
+ query->setFirstNRows(limit->getExactNumericValue(scale));
+ }
+ }
+ }
+
// insert into all columns
$$ = new (PARSERHEAP())
Insert(CorrName(*$5, PARSERHEAP()),
@@ -19302,10 +19346,32 @@ Rest_Of_insert_statement : no_check_log no_rollback TOK_INTO table_name query_ex
delete $5;
}
|
- TOK_OVERWRITE TOK_TABLE table_name query_expression order_by_clause access_type
+ TOK_OVERWRITE TOK_TABLE table_name query_expression order_by_clause access_type optional_limit_spec
{
if (!finalizeAccessOptions($4, $6)) YYERROR;
-
+
+ //limit clause
+ if ($7)
+ {
+ RelExpr *query = $4;
+
+ if (query->getFirstNRows() >= 0)
+ {
+ // cannot specify LIMIT and FIRST N clauses together.
+ YYERROR;
+ }
+ else
+ {
+ NABoolean negate;
+ if ($7->castToConstValue(negate))
+ {
+ ConstValue * limit = (ConstValue*)$7;
+ Lng32 scale = 0;
+ query->setFirstNRows(limit->getExactNumericValue(scale));
+ }
+ }
+ }
+
// insert into all columns
$$ = new (PARSERHEAP())
Insert(CorrName(*$3, PARSERHEAP()),
@@ -19320,10 +19386,32 @@ Rest_Of_insert_statement : no_check_log no_rollback TOK_INTO table_name query_ex
delete $3;
}
- | no_check_log no_rollback TOK_INTO table_name '(' '*' ')' query_expression order_by_clause access_type
+ | no_check_log no_rollback TOK_INTO table_name '(' '*' ')' query_expression order_by_clause access_type optional_limit_spec
{
if (!finalizeAccessOptions($8, $10)) YYERROR;
+ //limit clause
+ if ($11)
+ {
+ RelExpr *query = $8;
+
+ if (query->getFirstNRows() >= 0)
+ {
+ // cannot specify LIMIT and FIRST N clauses together.
+ YYERROR;
+ }
+ else
+ {
+ NABoolean negate;
+ if ($11->castToConstValue(negate))
+ {
+ ConstValue * limit = (ConstValue*)$11;
+ Lng32 scale = 0;
+ query->setFirstNRows(limit->getExactNumericValue(scale));
+ }
+ }
+ }
+
// insert into all columns --
// Tandem extension to INSERT statement;
// just ignore the redundant "(*)" columnlist.
@@ -19406,8 +19494,29 @@ Rest_Of_insert_statement : no_check_log no_rollback TOK_INTO table_name query_ex
delete $4;
}
- | no_check_log no_rollback TOK_INTO table_name '(' column_list ')' query_expression order_by_clause
+ | no_check_log no_rollback TOK_INTO table_name '(' column_list ')' query_expression order_by_clause optional_limit_spec
{
+ //limit clause
+ if ($10)
+ {
+ RelExpr *query = $8;
+ if (query->getFirstNRows() >= 0)
+ {
+ // cannot specify LIMIT and FIRST N clauses together.
+ YYERROR;
+ }
+ else
+ {
+ NABoolean negate;
+ if ($10->castToConstValue(negate))
+ {
+ ConstValue * limit = (ConstValue*)$10;
+ Lng32 scale = 0;
+ query->setFirstNRows(limit->getExactNumericValue(scale));
+ }
+ }
+ }
+
// insert into specified columns
$$ = new (PARSERHEAP())
Insert(CorrName(*$4, PARSERHEAP()),