From 10151e1598c5c91ef5a6d285c8a0ae4489836fc6 Mon Sep 17 00:00:00 2001 From: tiancaiamao Date: Sun, 8 Jul 2018 17:08:29 +0800 Subject: [PATCH] parser,ast: parse statement execution time optimizer hints (#7012) --- ast/misc.go | 3 +++ parser/misc.go | 1 + parser/parser.y | 55 +++++++++++++++++++++++-------------------- parser/parser_test.go | 8 +++++++ 4 files changed, 42 insertions(+), 25 deletions(-) diff --git a/ast/misc.go b/ast/misc.go index b2c548d81297b..67d07c32d2be5 100644 --- a/ast/misc.go +++ b/ast/misc.go @@ -822,6 +822,9 @@ type TableOptimizerHint struct { // It allows only table name or alias (if table has an alias) HintName model.CIStr Tables []model.CIStr + // Statement Execution Time Optimizer Hints + // See https://dev.mysql.com/doc/refman/5.7/en/optimizer-hints.html#optimizer-hints-execution-time + MaxExecutionTime uint64 } // Accept implements Node Accept interface. diff --git a/parser/misc.go b/parser/misc.go index 7caf64a3ea405..6f042e867e24b 100644 --- a/parser/misc.go +++ b/parser/misc.go @@ -330,6 +330,7 @@ var tokenMap = map[string]int{ "MASTER": master, "MAX": max, "MAX_CONNECTIONS_PER_HOUR": maxConnectionsPerHour, + "MAX_EXECUTION_TIME": maxExecutionTime, "MAX_QUERIES_PER_HOUR": maxQueriesPerHour, "MAX_ROWS": maxRows, "MAX_UPDATES_PER_HOUR": maxUpdatesPerHour, diff --git a/parser/parser.y b/parser/parser.y index 883b0ef252d9d..f265283cbe9c2 100644 --- a/parser/parser.y +++ b/parser/parser.y @@ -403,30 +403,31 @@ import ( yearType "YEAR" /* The following tokens belong to NotKeywordToken. */ - addDate "ADDDATE" - bitAnd "BIT_AND" - bitOr "BIT_OR" - bitXor "BIT_XOR" - cast "CAST" - copyKwd "COPY" - count "COUNT" - curTime "CURTIME" - dateAdd "DATE_ADD" - dateSub "DATE_SUB" - extract "EXTRACT" - getFormat "GET_FORMAT" - groupConcat "GROUP_CONCAT" - inplace "INPLACE" - min "MIN" - max "MAX" - now "NOW" - position "POSITION" - subDate "SUBDATE" - sum "SUM" - substring "SUBSTRING" - timestampAdd "TIMESTAMPADD" - timestampDiff "TIMESTAMPDIFF" - trim "TRIM" + addDate "ADDDATE" + bitAnd "BIT_AND" + bitOr "BIT_OR" + bitXor "BIT_XOR" + cast "CAST" + copyKwd "COPY" + count "COUNT" + curTime "CURTIME" + dateAdd "DATE_ADD" + dateSub "DATE_SUB" + extract "EXTRACT" + getFormat "GET_FORMAT" + groupConcat "GROUP_CONCAT" + inplace "INPLACE" + min "MIN" + max "MAX" + maxExecutionTime "MAX_EXECUTION_TIME" + now "NOW" + position "POSITION" + subDate "SUBDATE" + sum "SUM" + substring "SUBSTRING" + timestampAdd "TIMESTAMPADD" + timestampDiff "TIMESTAMPDIFF" + trim "TRIM" /* The following tokens belong to TiDBKeyword. */ admin "ADMIN" @@ -2760,7 +2761,7 @@ TiDBKeyword: NotKeywordToken: "ADDDATE" | "BIT_AND" | "BIT_OR" | "BIT_XOR" | "CAST" | "COPY" | "COUNT" | "CURTIME" | "DATE_ADD" | "DATE_SUB" | "EXTRACT" | "GET_FORMAT" | "GROUP_CONCAT" -| "INPLACE" |"MIN" | "MAX" | "NOW" | "POSITION" | "SUBDATE" | "SUBSTRING" | "SUM" | "TIMESTAMPADD" | "TIMESTAMPDIFF" | "TRIM" +| "INPLACE" |"MIN" | "MAX" | "MAX_EXECUTION_TIME" | "NOW" | "POSITION" | "SUBDATE" | "SUBSTRING" | "SUM" | "TIMESTAMPADD" | "TIMESTAMPDIFF" | "TRIM" /************************************************************************************ * @@ -4598,6 +4599,10 @@ TableOptimizerHintOpt: { $$ = &ast.TableOptimizerHint{HintName: model.NewCIStr($1), Tables: $3.([]model.CIStr)} } +| maxExecutionTime '(' NUM ')' + { + $$ = &ast.TableOptimizerHint{HintName: model.NewCIStr($1), MaxExecutionTime: getUint64FromNUM($3)} + } SelectStmtCalcFoundRows: { diff --git a/parser/parser_test.go b/parser/parser_test.go index e7b4bcf69b632..2d07df6a91dde 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -1756,6 +1756,14 @@ func (s *testParserSuite) TestOptimizerHints(c *C) { c.Assert(hints[1].HintName.L, Equals, "tidb_hj") c.Assert(hints[1].Tables[0].L, Equals, "t3") c.Assert(hints[1].Tables[1].L, Equals, "t4") + + stmt, err = parser.Parse("SELECT /*+ MAX_EXECUTION_TIME(1000) */ * FROM t1 INNER JOIN t2 where t1.c1 = t2.c1", "", "") + c.Assert(err, IsNil) + selectStmt = stmt[0].(*ast.SelectStmt) + hints = selectStmt.TableHints + c.Assert(len(hints), Equals, 1) + c.Assert(hints[0].HintName.L, Equals, "max_execution_time") + c.Assert(hints[0].MaxExecutionTime, Equals, uint64(1000)) } func (s *testParserSuite) TestType(c *C) {