From 2ced8df9e2bcd1582a21d46a0c0982d8769052ee Mon Sep 17 00:00:00 2001 From: Leon Zhang Date: Wed, 7 Nov 2018 18:22:05 +0800 Subject: [PATCH] fix #87 --- advisor/heuristic.go | 23 ++++++++++++----------- advisor/index_test.go | 5 ++--- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/advisor/heuristic.go b/advisor/heuristic.go index 46fbf5c..20c25b0 100644 --- a/advisor/heuristic.go +++ b/advisor/heuristic.go @@ -176,14 +176,15 @@ func (idxAdv *IndexAdvisor) RuleImplicitConversion() Rule { var values []*sqlparser.SQLVal // condition 左右两侧有且只有如下几种可能: - // 1. 左列 & 右列 - // 2. 左列 & 右值(含函数) (或相反) - // 3. 左值(含函数) & 右值(含函数) (无需关注) + // 1. 列与列比较,如: col1 = col2 + // 2. 列与值比较,如: col = val + // 3. 值与值比较,如: val1 = val2 暂不处理 + // 如果列包含在一个函数中,认为这个条件为值,如: col = func(col) 认定为 列与值比较 switch node := cond.(type) { case *sqlparser.ComparisonExpr: - // 获取condition左侧的信息 + // 获取 condition 左侧的信息 switch nLeft := node.Left.(type) { - case *sqlparser.SQLVal, *sqlparser.ValTuple: + case *sqlparser.SQLVal, sqlparser.ValTuple: err := sqlparser.Walk(func(node sqlparser.SQLNode) (kontinue bool, err error) { switch val := node.(type) { case *sqlparser.SQLVal: @@ -201,9 +202,9 @@ func (idxAdv *IndexAdvisor) RuleImplicitConversion() Rule { colList = append(colList, left) } - // 获取condition右侧的信息 + // 获取 condition 右侧的信息 switch nRight := node.Right.(type) { - case *sqlparser.SQLVal, *sqlparser.ValTuple: + case *sqlparser.SQLVal, sqlparser.ValTuple: err := sqlparser.Walk(func(node sqlparser.SQLNode) (kontinue bool, err error) { switch val := node.(type) { case *sqlparser.SQLVal: @@ -309,14 +310,14 @@ func (idxAdv *IndexAdvisor) RuleImplicitConversion() Rule { // 列与值比较 for _, val := range values { if colList[0].DataType == "" { - common.Log.Debug("Can't get %s datatype", colList[0].Name) + common.Log.Debug("Can't get %s data type", colList[0].Name) break } isCovered := true - if types, ok := typMap[val.Type]; ok { - for _, t := range types { - if strings.HasPrefix(colList[0].DataType, t) { + if tps, ok := typMap[val.Type]; ok { + for _, tp := range tps { + if strings.HasPrefix(colList[0].DataType, tp) { isCovered = false } } diff --git a/advisor/index_test.go b/advisor/index_test.go index a61dd2e..b0e35d0 100644 --- a/advisor/index_test.go +++ b/advisor/index_test.go @@ -67,9 +67,8 @@ func TestRuleImplicitConversion(t *testing.T) { "SELECT * FROM t1 WHERE title >= 60;", "SELECT * FROM t1, t2 WHERE t1.title = t2.title;", "SELECT * FROM t1, t3 WHERE t1.title = t3.title;", - // TODO: - // "SELECT * FROM t1 WHERE title in (60);", - // "SELECT * FROM t1 WHERE title in (60, '60');", + "SELECT * FROM t1 WHERE title in (60, '60');", + "SELECT * FROM t1 WHERE title in (60);", } for _, sql := range sqls { stmt, syntaxErr := sqlparser.Parse(sql) -- GitLab