[parser] parser: add agg_to_cop hint (#517)
This commit is contained in:
committed by
Ti Chi Robot
parent
c7bb4e645c
commit
aa86dbe09c
@ -2064,7 +2064,7 @@ func (n *TableOptimizerHint) Restore(ctx *RestoreCtx) error {
|
||||
}
|
||||
// Hints without args except query block.
|
||||
switch n.HintName.L {
|
||||
case "hash_agg", "stream_agg", "read_consistent_replica", "no_index_merge", "qb_name":
|
||||
case "hash_agg", "stream_agg", "agg_to_cop", "read_consistent_replica", "no_index_merge", "qb_name":
|
||||
ctx.WritePlain(")")
|
||||
return nil
|
||||
}
|
||||
|
||||
@ -239,6 +239,8 @@ func (ts *testMiscSuite) TestTableOptimizerHintRestore(c *C) {
|
||||
{"HASH_AGG(@sel1)", "HASH_AGG(@`sel1`)"},
|
||||
{"STREAM_AGG()", "STREAM_AGG()"},
|
||||
{"STREAM_AGG(@sel1)", "STREAM_AGG(@`sel1`)"},
|
||||
{"AGG_TO_COP()", "AGG_TO_COP()"},
|
||||
{"AGG_TO_COP(@sel_1)", "AGG_TO_COP(@`sel_1`)"},
|
||||
{"NO_INDEX_MERGE()", "NO_INDEX_MERGE()"},
|
||||
{"NO_INDEX_MERGE(@sel1)", "NO_INDEX_MERGE(@`sel1`)"},
|
||||
{"READ_CONSISTENT_REPLICA()", "READ_CONSISTENT_REPLICA()"},
|
||||
|
||||
@ -138,6 +138,7 @@ var tokenMap = map[string]int{
|
||||
"ADDDATE": addDate,
|
||||
"ADMIN": admin,
|
||||
"AFTER": after,
|
||||
"AGG_TO_COP": hintAggToCop,
|
||||
"ALL": all,
|
||||
"ALGORITHM": algorithm,
|
||||
"ALTER": alter,
|
||||
|
||||
14507
parser/parser.go
14507
parser/parser.go
File diff suppressed because it is too large
Load Diff
@ -579,6 +579,7 @@ import (
|
||||
statsBuckets "STATS_BUCKETS"
|
||||
statsHealthy "STATS_HEALTHY"
|
||||
tidb "TIDB"
|
||||
hintAggToCop "AGG_TO_COP"
|
||||
hintHJ "HASH_JOIN"
|
||||
hintSMJ "SM_JOIN"
|
||||
hintINLJ "INL_JOIN"
|
||||
@ -4209,7 +4210,7 @@ UnReservedKeyword:
|
||||
|
||||
TiDBKeyword:
|
||||
"ADMIN" | "BUCKETS" | "CANCEL" | "CMSKETCH" | "DDL" | "DEPTH" | "DRAINER" | "JOBS" | "JOB" | "NODE_ID" | "NODE_STATE" | "PUMP" | "SAMPLES" | "STATS" | "STATS_META" | "STATS_HISTOGRAMS" | "STATS_BUCKETS" | "STATS_HEALTHY" | "TIDB"
|
||||
| "HASH_JOIN" | "SM_JOIN" | "INL_JOIN" | "HASH_AGG" | "STREAM_AGG" | "USE_INDEX_MERGE" | "NO_INDEX_MERGE" | "USE_TOJA" | "ENABLE_PLAN_CACHE" | "USE_PLAN_CACHE"
|
||||
| "AGG_TO_COP" | "HASH_JOIN" | "SM_JOIN" | "INL_JOIN" | "HASH_AGG" | "STREAM_AGG" | "USE_INDEX_MERGE" | "NO_INDEX_MERGE" | "USE_TOJA" | "ENABLE_PLAN_CACHE" | "USE_PLAN_CACHE"
|
||||
| "READ_CONSISTENT_REPLICA" | "QB_NAME" | "QUERY_TYPE" | "MEMORY_QUOTA" | "OLAP" | "OLTP" |"TOPN" | "SPLIT" | "OPTIMISTIC" | "PESSIMISTIC" | "WIDTH" | "REGIONS"
|
||||
|
||||
NotKeywordToken:
|
||||
@ -6558,6 +6559,10 @@ TableOptimizerHintOpt:
|
||||
{
|
||||
$$ = &ast.TableOptimizerHint{HintName: model.NewCIStr($1), QBName: $3.(model.CIStr)}
|
||||
}
|
||||
| hintAggToCop '(' QueryBlockOpt ')'
|
||||
{
|
||||
$$ = &ast.TableOptimizerHint{HintName: model.NewCIStr($1), QBName: $3.(model.CIStr)}
|
||||
}
|
||||
| hintNoIndexMerge '(' QueryBlockOpt ')'
|
||||
{
|
||||
$$ = &ast.TableOptimizerHint{HintName: model.NewCIStr($1), QBName: $3.(model.CIStr)}
|
||||
|
||||
@ -2868,6 +2868,16 @@ func (s *testParserSuite) TestOptimizerHints(c *C) {
|
||||
c.Assert(hints[0].HintName.L, Equals, "stream_agg")
|
||||
c.Assert(hints[1].HintName.L, Equals, "stream_agg")
|
||||
|
||||
// Test AGG_TO_COP
|
||||
stmt, _, err = parser.Parse("select /*+ AGG_TO_COP(), agg_to_cop() */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "")
|
||||
c.Assert(err, IsNil)
|
||||
selectStmt = stmt[0].(*ast.SelectStmt)
|
||||
|
||||
hints = selectStmt.TableHints
|
||||
c.Assert(hints, HasLen, 2)
|
||||
c.Assert(hints[0].HintName.L, Equals, "agg_to_cop")
|
||||
c.Assert(hints[1].HintName.L, Equals, "agg_to_cop")
|
||||
|
||||
// Test NO_INDEX_MERGE
|
||||
stmt, _, err = parser.Parse("select /*+ NO_INDEX_MERGE(), no_index_merge() */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "")
|
||||
c.Assert(err, IsNil)
|
||||
|
||||
Reference in New Issue
Block a user