Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Xiaomi
soar
提交
dfe6fba5
S
soar
项目概览
Xiaomi
/
soar
8 个月 前同步成功
通知
373
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,体验更适合开发者的 AI 搜索 >>
提交
dfe6fba5
编写于
2月 23, 2022
作者:
Z
zhangliang032
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
rewrite support regexp replace
add reg2select, for oracle, sql server and other dbms
上级
bc57a23d
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
93 addition
and
19 deletion
+93
-19
Makefile
Makefile
+0
-18
ast/rewrite.go
ast/rewrite.go
+47
-0
ast/rewrite_test.go
ast/rewrite_test.go
+25
-0
ast/testdata/TestListRewriteRules.golden
ast/testdata/TestListRewriteRules.golden
+20
-0
deps.sh
deps.sh
+1
-1
未找到文件。
Makefile
浏览文件 @
dfe6fba5
...
...
@@ -143,24 +143,6 @@ heuristic: doc
go
test
github.com/XiaoMi/soar/advisor
-v
-update
-run
TestMergeConflictHeuristicRules
docker stop soar-mysql 2>/dev/null
||
true
# Update vitess vendor
.PHONY
:
vitess
vitess
:
@
echo
"
$(CGREEN)
Update vitess deps ...
$(CEND)
"
govendor fetch
-v
vitess.io/vitess/...
# Update tidb vendor
.PHONY
:
tidb
tidb
:
@
echo
"
$(CGREEN)
Update tidb deps ...
$(CEND)
"
govendor fetch
-v
github.com/pingcap/tidb/...
# make pingcap parser
.PHONY
:
pingcap-parser
pingcap-parser
:
tidb
@
echo
"
$(CGREEN)
Update pingcap parser deps ...
$(CEND)
"
govendor fetch
-v
github.com/pingcap/parser/...
# Update all vendor
.PHONY
:
vendor
vendor
:
vitess pingcap-parser
...
...
ast/rewrite.go
浏览文件 @
dfe6fba5
...
...
@@ -52,6 +52,13 @@ func init() {
Suggest
:
"select * from film where length > 100"
,
Func
:
(
*
Rewrite
)
.
RewriteDML2Select
,
},
{
Name
:
"reg2select"
,
Description
:
"使用正则的方式将数据库更新请求转换为只读查询请求,便于执行EXPLAIN"
,
Original
:
"DELETE FROM film WHERE length > 100"
,
Suggest
:
"select * from film where length > 100"
,
Func
:
(
*
Rewrite
)
.
RewriteReg2Select
,
},
{
Name
:
"star2columns"
,
Description
:
"为SELECT *补全表的列信息"
,
...
...
@@ -1619,6 +1626,24 @@ func (rw *Rewrite) RewriteDML2Select() *Rewrite {
return
rw
}
func
(
rw
*
Rewrite
)
RewriteReg2Select
()
*
Rewrite
{
var
pre
=
9
if
len
(
rw
.
SQL
)
<
pre
{
// SQL to short no need convert
return
rw
}
if
strings
.
HasPrefix
(
strings
.
ToLower
(
rw
.
SQL
[
:
pre
]),
"select"
)
{
rw
.
NewSQL
=
rw
.
SQL
}
if
strings
.
HasPrefix
(
strings
.
ToLower
(
rw
.
SQL
[
:
pre
]),
"update"
)
{
rw
.
NewSQL
=
regUpdate2Select
(
rw
.
SQL
)
}
if
strings
.
HasPrefix
(
strings
.
ToLower
(
rw
.
SQL
[
:
pre
]),
"delete"
)
{
rw
.
NewSQL
=
regDelete2Select
(
rw
.
SQL
)
}
return
rw
}
// delete2Select 将 Delete 语句改写成 Select
func
delete2Select
(
stmt
*
sqlparser
.
Delete
)
string
{
newSQL
:=
&
sqlparser
.
Select
{
...
...
@@ -1632,6 +1657,17 @@ func delete2Select(stmt *sqlparser.Delete) string {
return
sqlparser
.
String
(
newSQL
)
}
// regDelete2Select convert delete to select by regexp
func
regDelete2Select
(
sql
string
)
string
{
sql
=
strings
.
TrimSpace
(
sql
)
sqlRegexp
:=
regexp
.
MustCompile
(
`^(?i)delete\s+from\s+(.*)$`
)
params
:=
sqlRegexp
.
FindStringSubmatch
(
sql
)
if
len
(
params
)
>
1
{
return
fmt
.
Sprintf
(
`select * from %s`
,
params
[
1
])
}
return
sql
}
// update2Select 将 Update 语句改写成 Select
func
update2Select
(
stmt
*
sqlparser
.
Update
)
string
{
newSQL
:=
&
sqlparser
.
Select
{
...
...
@@ -1646,6 +1682,17 @@ func update2Select(stmt *sqlparser.Update) string {
return
sqlparser
.
String
(
newSQL
)
}
// regUpdate2Select convert update to select by regexp
func
regUpdate2Select
(
sql
string
)
string
{
sql
=
strings
.
TrimSpace
(
sql
)
sqlRegexp
:=
regexp
.
MustCompile
(
`^(?i)update\s+(.*)\s+set\s+(.*)\s+(where\s+.*)$`
)
params
:=
sqlRegexp
.
FindStringSubmatch
(
sql
)
if
len
(
params
)
>
2
{
return
fmt
.
Sprintf
(
`select * from %s %s`
,
params
[
1
],
params
[
3
])
}
return
sql
}
// insert2Select 将 Insert 语句改写成 Select
func
insert2Select
(
stmt
*
sqlparser
.
Insert
)
string
{
switch
row
:=
stmt
.
Rows
.
(
type
)
{
...
...
ast/rewrite_test.go
浏览文件 @
dfe6fba5
...
...
@@ -587,6 +587,31 @@ func TestRewriteDML2Select(t *testing.T) {
common
.
Log
.
Debug
(
"Exiting function: %s"
,
common
.
GetFunctionName
())
}
func
TestRewriteReg2Select
(
t
*
testing
.
T
)
{
common
.
Log
.
Debug
(
"Entering function: %s"
,
common
.
GetFunctionName
())
testSQL
:=
[]
map
[
string
]
string
{
{
"input"
:
"select 1 from dual"
,
"output"
:
"select 1 from dual"
,
},
{
"input"
:
"delete from dual"
,
"output"
:
"select * from dual"
,
},
{
"input"
:
"update tb set col = 1 where col = 2"
,
"output"
:
"select * from tb where col = 2"
,
},
}
for
_
,
sql
:=
range
testSQL
{
rw
:=
NewRewrite
(
sql
[
"input"
])
.
RewriteReg2Select
()
if
rw
.
NewSQL
!=
sql
[
"output"
]
{
t
.
Errorf
(
"want: %s
\n
got: %s"
,
sql
[
"output"
],
rw
.
NewSQL
)
}
}
common
.
Log
.
Debug
(
"Exiting function: %s"
,
common
.
GetFunctionName
())
}
func
TestRewriteDistinctStar
(
t
*
testing
.
T
)
{
common
.
Log
.
Debug
(
"Entering function: %s"
,
common
.
GetFunctionName
())
testSQL
:=
[]
map
[
string
]
string
{
...
...
ast/testdata/TestListRewriteRules.golden
浏览文件 @
dfe6fba5
...
...
@@ -13,6 +13,20 @@ DELETE FROM film WHERE length > 100
* **Suggest**:
```sql
select * from film where length > 100
```
## reg2select
* **Description**:使用正则的方式将数据库更新请求转换为只读查询请求,便于执行EXPLAIN
* **Original**:
```sql
DELETE FROM film WHERE length > 100
```
* **Suggest**:
```sql
select * from film where length > 100
```
...
...
@@ -277,6 +291,12 @@ use sakila;
"Original": "DELETE FROM film WHERE length \u003e 100",
"Suggest": "select * from film where length \u003e 100"
},
{
"Name": "reg2select",
"Description": "使用正则的方式将数据库更新请求转换为只读查询请求,便于执行EXPLAIN",
"Original": "DELETE FROM film WHERE length \u003e 100",
"Suggest": "select * from film where length \u003e 100"
},
{
"Name": "star2columns",
"Description": "为SELECT *补全表的列信息",
...
...
deps.sh
浏览文件 @
dfe6fba5
#!/bin/bash
NEEDED_COMMANDS
=
"docker git go
govendor
retool bats"
NEEDED_COMMANDS
=
"docker git go retool bats"
for
cmd
in
${
NEEDED_COMMANDS
}
;
do
if
!
command
-v
"
${
cmd
}
"
&> /dev/null
;
then
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录