提交 2ced8df9 编写于 作者: martianzhang's avatar martianzhang

fix #87

上级 febac91f
...@@ -176,14 +176,15 @@ func (idxAdv *IndexAdvisor) RuleImplicitConversion() Rule { ...@@ -176,14 +176,15 @@ func (idxAdv *IndexAdvisor) RuleImplicitConversion() Rule {
var values []*sqlparser.SQLVal var values []*sqlparser.SQLVal
// condition 左右两侧有且只有如下几种可能: // condition 左右两侧有且只有如下几种可能:
// 1. 左列 & 右列 // 1. 列与列比较,如: col1 = col2
// 2. 左列 & 右值(含函数) (或相反) // 2. 列与值比较,如: col = val
// 3. 左值(含函数) & 右值(含函数) (无需关注) // 3. 值与值比较,如: val1 = val2 暂不处理
// 如果列包含在一个函数中,认为这个条件为值,如: col = func(col) 认定为 列与值比较
switch node := cond.(type) { switch node := cond.(type) {
case *sqlparser.ComparisonExpr: case *sqlparser.ComparisonExpr:
// 获取condition左侧的信息 // 获取 condition 左侧的信息
switch nLeft := node.Left.(type) { 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) { err := sqlparser.Walk(func(node sqlparser.SQLNode) (kontinue bool, err error) {
switch val := node.(type) { switch val := node.(type) {
case *sqlparser.SQLVal: case *sqlparser.SQLVal:
...@@ -201,9 +202,9 @@ func (idxAdv *IndexAdvisor) RuleImplicitConversion() Rule { ...@@ -201,9 +202,9 @@ func (idxAdv *IndexAdvisor) RuleImplicitConversion() Rule {
colList = append(colList, left) colList = append(colList, left)
} }
// 获取condition右侧的信息 // 获取 condition 右侧的信息
switch nRight := node.Right.(type) { 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) { err := sqlparser.Walk(func(node sqlparser.SQLNode) (kontinue bool, err error) {
switch val := node.(type) { switch val := node.(type) {
case *sqlparser.SQLVal: case *sqlparser.SQLVal:
...@@ -309,14 +310,14 @@ func (idxAdv *IndexAdvisor) RuleImplicitConversion() Rule { ...@@ -309,14 +310,14 @@ func (idxAdv *IndexAdvisor) RuleImplicitConversion() Rule {
// 列与值比较 // 列与值比较
for _, val := range values { for _, val := range values {
if colList[0].DataType == "" { 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 break
} }
isCovered := true isCovered := true
if types, ok := typMap[val.Type]; ok { if tps, ok := typMap[val.Type]; ok {
for _, t := range types { for _, tp := range tps {
if strings.HasPrefix(colList[0].DataType, t) { if strings.HasPrefix(colList[0].DataType, tp) {
isCovered = false isCovered = false
} }
} }
......
...@@ -67,9 +67,8 @@ func TestRuleImplicitConversion(t *testing.T) { ...@@ -67,9 +67,8 @@ func TestRuleImplicitConversion(t *testing.T) {
"SELECT * FROM t1 WHERE title >= 60;", "SELECT * FROM t1 WHERE title >= 60;",
"SELECT * FROM t1, t2 WHERE t1.title = t2.title;", "SELECT * FROM t1, t2 WHERE t1.title = t2.title;",
"SELECT * FROM t1, t3 WHERE t1.title = t3.title;", "SELECT * FROM t1, t3 WHERE t1.title = t3.title;",
// TODO: "SELECT * FROM t1 WHERE title in (60, '60');",
// "SELECT * FROM t1 WHERE title in (60);", "SELECT * FROM t1 WHERE title in (60);",
// "SELECT * FROM t1 WHERE title in (60, '60');",
} }
for _, sql := range sqls { for _, sql := range sqls {
stmt, syntaxErr := sqlparser.Parse(sql) stmt, syntaxErr := sqlparser.Parse(sql)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册