Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Xiaomi
soar
提交
2ced8df9
S
soar
项目概览
Xiaomi
/
soar
大约 1 年 前同步成功
通知
387
Star
8512
Fork
1328
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
soar
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
2ced8df9
编写于
11月 07, 2018
作者:
martianzhang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix #87
上级
febac91f
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
14 addition
and
14 deletion
+14
-14
advisor/heuristic.go
advisor/heuristic.go
+12
-11
advisor/index_test.go
advisor/index_test.go
+2
-3
未找到文件。
advisor/heuristic.go
浏览文件 @
2ced8df9
...
...
@@ -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
t
ype
s
,
ok
:=
typMap
[
val
.
Type
];
ok
{
for
_
,
t
:=
range
type
s
{
if
strings
.
HasPrefix
(
colList
[
0
]
.
DataType
,
t
)
{
if
t
p
s
,
ok
:=
typMap
[
val
.
Type
];
ok
{
for
_
,
t
p
:=
range
tp
s
{
if
strings
.
HasPrefix
(
colList
[
0
]
.
DataType
,
t
p
)
{
isCovered
=
false
}
}
...
...
advisor/index_test.go
浏览文件 @
2ced8df9
...
...
@@ -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
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录