diff --git a/advisor/explainer.go b/advisor/explainer.go
index 579a1e8535fe08e290163d82a8fa25f4626e9503..c1e3372297db982956c20cb12885f17c77615553 100644
--- a/advisor/explainer.go
+++ b/advisor/explainer.go
@@ -222,7 +222,7 @@ func DigestExplainText(text string) {
return
}
expSuggest := ExplainAdvisor(explainInfo)
- _, output := FormatSuggest("", common.Config.ReportType, expSuggest)
+ _, output := FormatSuggest("", "", common.Config.ReportType, expSuggest)
if common.Config.ReportType == "html" {
fmt.Println(common.MarkdownHTMLHeader())
fmt.Println(common.Markdown2HTML(output))
diff --git a/advisor/rules.go b/advisor/rules.go
index 04014cfbc73d4d821534d3a27797bfa3f89f75f8..617d7cf37514b0ba7205740ddb9548e30eb15747 100644
--- a/advisor/rules.go
+++ b/advisor/rules.go
@@ -1202,7 +1202,7 @@ func InBlackList(sql string) bool {
}
// FormatSuggest 格式化输出优化建议
-func FormatSuggest(sql string, format string, suggests ...map[string]Rule) (map[string]Rule, string) {
+func FormatSuggest(sql string, currentDB string, format string, suggests ...map[string]Rule) (map[string]Rule, string) {
common.Log.Debug("FormatSuggest, Query: %s", sql)
var fingerprint, id string
var buf []string
@@ -1252,17 +1252,7 @@ func FormatSuggest(sql string, format string, suggests ...map[string]Rule) (map[
common.Log.Debug("FormatSuggest, format: %s", format)
switch format {
case "json":
- js, err := json.MarshalIndent(Result{
- ID: id,
- Fingerprint: fingerprint,
- Sample: sql,
- Suggest: suggest,
- }, "", " ")
- if err == nil {
- buf = append(buf, fmt.Sprintln(string(js)))
- } else {
- common.Log.Error("FormatSuggest json.Marshal Error: %v", err)
- }
+ buf = append(buf, formatJSON(sql, currentDB, suggest))
case "text":
for item, rule := range suggest {
@@ -1452,6 +1442,80 @@ func FormatSuggest(sql string, format string, suggests ...map[string]Rule) (map[
return suggest, str
}
+// JSONSuggest json format suggestion
+type JSONSuggest struct {
+ ID string `json:"ID"`
+ Fingerprint string `json:"Fingerprint"`
+ Score int `json:"Score"`
+ Sample string `json:"Sample"`
+ Explain []Rule `json:"Explain"`
+ HeuristicRules []Rule `json:"HeuristicRules"`
+ IndexRules []Rule `json:"IndexRules"`
+ Tables []string `json:"Tables"`
+}
+
+func formatJSON(sql string, db string, suggest map[string]Rule) string {
+ var id, fingerprint, result string
+
+ fingerprint = query.Fingerprint(sql)
+ id = query.Id(fingerprint)
+
+ sug := JSONSuggest{
+ ID: id,
+ Fingerprint: fingerprint,
+ Sample: sql,
+ Tables: ast.SchemaMetaInfo(sql, db),
+ }
+
+ // Explain info
+ var sortItem []string
+ for item := range suggest {
+ if strings.HasPrefix(item, "EXP") {
+ sortItem = append(sortItem, item)
+ }
+ }
+ sort.Strings(sortItem)
+ for _, i := range sortItem {
+ sug.Explain = append(sug.Explain, suggest[i])
+ }
+ sortItem = make([]string, 0)
+
+ // Index advisor
+ for item := range suggest {
+ if strings.HasPrefix(item, "IDX") {
+ sortItem = append(sortItem, item)
+ }
+ }
+ sort.Strings(sortItem)
+ for _, i := range sortItem {
+ sug.IndexRules = append(sug.IndexRules, suggest[i])
+ }
+ sortItem = make([]string, 0)
+
+ // Heuristic rules
+ for item := range suggest {
+ if !strings.HasPrefix(item, "EXP") && !strings.HasPrefix(item, "IDX") {
+ if strings.HasPrefix(item, "ERR") && suggest[item].Content == "" {
+ continue
+ }
+ sortItem = append(sortItem, item)
+ }
+ }
+ sort.Strings(sortItem)
+ for _, i := range sortItem {
+ sug.HeuristicRules = append(sug.HeuristicRules, suggest[i])
+ }
+ sortItem = make([]string, 0)
+
+ js, err := json.MarshalIndent(sug, "", " ")
+ if err == nil {
+ result = fmt.Sprint(string(js))
+ } else {
+ common.Log.Error("formatJSON json.Marshal Error: %v", err)
+ }
+ return result
+}
+
// ListHeuristicRules 打印支持的启发式规则,对应命令行参数-list-heuristic-rules
func ListHeuristicRules(rules ...map[string]Rule) {
switch common.Config.ReportType {
diff --git a/advisor/testdata/TestDigestExplainText.golden b/advisor/testdata/TestDigestExplainText.golden
index c3da0fb4a937305c52a60d52e5f612b96ca9e96d..6459f9ec4ff5bc29e823c6889c2ea77a777491df 100644
--- a/advisor/testdata/TestDigestExplainText.golden
+++ b/advisor/testdata/TestDigestExplainText.golden
@@ -3,7 +3,7 @@
| id | select\_type | table | partitions | type | possible_keys | key | key\_len | ref | rows | filtered | scalability | Extra |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | SIMPLE | *country* | NULL | index | PRIMARY,
country\_id | country | 152 | NULL | 0 | 0.00% | ☠️ **O(n)** | Using index |
-| 1 | SIMPLE | *city* | NULL | ref | idx\_fk\_country\_id,
idx\_country\_id\_city,
idx\_all,
idx\_other | idx\_fk\_country\_id | 2 | sakila.country.country\_id | 0 | 0.00% | ☠️ **O(n)** | Using index |
+| 1 | SIMPLE | *city* | NULL | ref | idx\_fk\_country\_id,
idx\_country\_id\_city,
idx\_all,
idx\_other | idx\_fk\_country\_id | 2 | sakila.country.country\_id | 0 | 0.00% | O(log n) | Using index |
@@ -105,7 +105,7 @@ a:link,a:visited{text-decoration:none}h3,h4{margin-top:2em}h5,h6{margin-top:20px
sakila.country.country_id |
0 |
0.00% |
-☠️ O(n) |
+O(log n) |
Using index |
diff --git a/cmd/soar/soar.go b/cmd/soar/soar.go
index 87a378dcc87181913c45a004644ebfe752adee2c..6a0c1e3644b6fabf9f0041c795c590f0e68aa696 100644
--- a/cmd/soar/soar.go
+++ b/cmd/soar/soar.go
@@ -37,11 +37,13 @@ func main() {
// 全局变量
var err error
var sql string // 单条评审指定的 sql 或 explain
+ var currentDB string // 当前 SQL 使用的 database
sqlCounter := 1 // SQL 计数器
lineCounter := 1 // 行计数器
var alterSQLs []string // 待评审的 SQL 中所有 ALTER 请求
alterTableTimes := make(map[string]int) // 待评审的 SQL 中同一经表 ALTER 请求计数器
suggestMerged := make(map[string]map[string]advisor.Rule) // 优化建议去重, key 为 sql 的 fingerprint.ID
+ var suggestStr []string // string 形式格式化之后的优化建议,用于 -report-type json
tables := make(map[string][]string) // SQL 使用的库表名
// 配置文件&命令行参数解析
@@ -74,7 +76,7 @@ func main() {
// 对指定的库表进行索引重复检查
if common.Config.ReportType == "duplicate-key-checker" {
dupKeySuggest := advisor.DuplicateKeyChecker(rEnv)
- _, str := advisor.FormatSuggest("", common.Config.ReportType, dupKeySuggest)
+ _, str := advisor.FormatSuggest("", currentDB, common.Config.ReportType, dupKeySuggest)
if str == "" {
fmt.Printf("%s/%s 未发现重复索引\n", common.Config.OnlineDSN.Addr, common.Config.OnlineDSN.Schema)
} else {
@@ -129,6 +131,7 @@ func main() {
// +++++++++++++++++++++小工具集[开始]+++++++++++++++++++++++{
fingerprint := strings.TrimSpace(query.Fingerprint(sql))
+ currentDB = env.CurrentDB(sql, currentDB)
switch common.Config.ReportType {
case "fingerprint":
// SQL 指纹
@@ -176,6 +179,7 @@ func main() {
continue
}
}
+ tables[id] = ast.SchemaMetaInfo(sql, currentDB)
// +++++++++++++++++++++小工具集[结束]+++++++++++++++++++++++}
// +++++++++++++++++++++语法检查[开始]+++++++++++++++++++++++{
@@ -202,8 +206,6 @@ func main() {
switch common.Config.ReportType {
case "tables":
- env.ChangeDB(vEnv.Connector, q.Query)
- tables[id] = ast.SchemaMetaInfo(sql, vEnv.Database)
continue
case "query-type":
fmt.Println(syntaxErr)
@@ -384,10 +386,11 @@ func main() {
// +++++++++++++++++++++打印单条 SQL 优化建议[开始]++++++++++++++++++++++++++{
common.Log.Debug("start of print suggestions, Query: %s", q.Query)
- sug, str := advisor.FormatSuggest(q.Query, common.Config.ReportType, heuristicSuggest, idxSuggest, expSuggest, proSuggest, traceSuggest, mysqlSuggest)
+ sug, str := advisor.FormatSuggest(q.Query, currentDB, common.Config.ReportType, heuristicSuggest, idxSuggest, expSuggest, proSuggest, traceSuggest, mysqlSuggest)
suggestMerged[id] = sug
switch common.Config.ReportType {
case "json":
+ suggestStr = append(suggestStr, str)
case "tables":
case "duplicate-key-checker":
case "rewrite":
@@ -428,13 +431,7 @@ func main() {
// 以 JSON 格式化输出
if common.Config.ReportType == "json" {
- js, err := json.MarshalIndent(suggestMerged, "", " ")
- if err == nil {
- fmt.Println(string(js))
- } else {
- common.Log.Error("FormatSuggest json.Marshal Error: %v", err)
- }
- return
+ fmt.Println("[\n", strings.Join(suggestStr, ",\n"), "\n]")
}
// 以 JSON 格式输出 SQL 影响的库表名
diff --git a/cmd/soar/testdata/Test_Main_verboseInfo.golden b/cmd/soar/testdata/Test_Main_verboseInfo.golden
index 01f455b04e81859ecb59e75496f2bee94b5540ee..1557d1cb2721eb145374641215e1e4d79cf99343 100644
--- a/cmd/soar/testdata/Test_Main_verboseInfo.golden
+++ b/cmd/soar/testdata/Test_Main_verboseInfo.golden
@@ -1,5 +1,7 @@
Syntax check OK!
MySQL environment verbose info
* test-dsn: 127.0.0.1:3306 is disable, please check log.
+* online-dsn: 127.0.0.1:3306 is disable, please check log.
MySQL environment verbose info
+* test-dsn: 127.0.0.1:3306 is disable, please check log.
* online-dsn: 127.0.0.1:3306 is disable, please check log.
diff --git a/common/config.go b/common/config.go
index 8240249d834202f94bc4ef5d74e4be3894e0e771..9def954f6219b8b42a1745c18e809f701e9583cb 100644
--- a/common/config.go
+++ b/common/config.go
@@ -882,7 +882,7 @@ var ReportTypes = []ReportType{
{
Name: "tables",
Description: "以 JSON 格式输出 SQL 使用的库表名",
- Example: `echo "select * from film" | soar -report-type meta`,
+ Example: `echo "select * from film" | soar -report-type tables`,
},
{
Name: "query-type",
diff --git a/common/testdata/TestListReportTypes.golden b/common/testdata/TestListReportTypes.golden
index 4cfe9c910173a7f179abd73dc0339101a8f71e98..be230052d2e7f9cc23abb292b62bcc54f0941e9b 100644
--- a/common/testdata/TestListReportTypes.golden
+++ b/common/testdata/TestListReportTypes.golden
@@ -58,13 +58,21 @@ echo "select * from film" | soar -report-type tiast
```bash
echo "select * from film" | soar -report-type tiast-json
```
-## meta
+## tables
* **Description**:以 JSON 格式输出 SQL 使用的库表名
* **Example**:
```bash
-echo "select * from film" | soar -report-type meta
+echo "select * from film" | soar -report-type tables
+```
+## query-type
+* **Description**:SQL 语句的请求类型
+
+* **Example**:
+
+```bash
+echo "select * from film" | soar -report-type query-type
```
## fingerprint
* **Description**:输出SQL的指纹
diff --git a/common/testdata/TestParseDSN.golden b/common/testdata/TestParseDSN.golden
index dcf81847db6e6fdcf7f1384a56acc962f1b82b4d..a03cc825facf5d18ceacfcaacfeddb6f8d258221 100644
--- a/common/testdata/TestParseDSN.golden
+++ b/common/testdata/TestParseDSN.golden
@@ -12,9 +12,9 @@
ServerPubKey: "",
MaxAllowedPacket: 4194304,
Params: {},
- Timeout: 0,
- ReadTimeout: 0,
- WriteTimeout: 0,
+ Timeout: "0s",
+ ReadTimeout: "0s",
+ WriteTimeout: "0s",
AllowNativePasswords: true,
AllowOldPasswords: false,
Disable: false,
@@ -34,9 +34,9 @@ user:password@hostname:3307/database
ServerPubKey: "",
MaxAllowedPacket: 4194304,
Params: {},
- Timeout: 0,
- ReadTimeout: 0,
- WriteTimeout: 0,
+ Timeout: "3s",
+ ReadTimeout: "",
+ WriteTimeout: "",
AllowNativePasswords: true,
AllowOldPasswords: false,
Disable: false,
@@ -56,9 +56,9 @@ user:password@hostname:3307/database?charset=utf8
ServerPubKey: "",
MaxAllowedPacket: 4194304,
Params: {},
- Timeout: 0,
- ReadTimeout: 0,
- WriteTimeout: 0,
+ Timeout: "3s",
+ ReadTimeout: "",
+ WriteTimeout: "",
AllowNativePasswords: true,
AllowOldPasswords: false,
Disable: false,
@@ -78,9 +78,9 @@ user:password@hostname:3307
ServerPubKey: "",
MaxAllowedPacket: 4194304,
Params: {},
- Timeout: 0,
- ReadTimeout: 0,
- WriteTimeout: 0,
+ Timeout: "3s",
+ ReadTimeout: "",
+ WriteTimeout: "",
AllowNativePasswords: true,
AllowOldPasswords: false,
Disable: false,
@@ -100,9 +100,9 @@ user:password@hostname:/database
ServerPubKey: "",
MaxAllowedPacket: 4194304,
Params: {},
- Timeout: 0,
- ReadTimeout: 0,
- WriteTimeout: 0,
+ Timeout: "3s",
+ ReadTimeout: "",
+ WriteTimeout: "",
AllowNativePasswords: true,
AllowOldPasswords: false,
Disable: false,
@@ -122,9 +122,9 @@ user:password@:3307/database
ServerPubKey: "",
MaxAllowedPacket: 4194304,
Params: {},
- Timeout: 0,
- ReadTimeout: 0,
- WriteTimeout: 0,
+ Timeout: "3s",
+ ReadTimeout: "",
+ WriteTimeout: "",
AllowNativePasswords: true,
AllowOldPasswords: false,
Disable: false,
@@ -144,9 +144,9 @@ user@hostname/database
ServerPubKey: "",
MaxAllowedPacket: 4194304,
Params: {},
- Timeout: 0,
- ReadTimeout: 0,
- WriteTimeout: 0,
+ Timeout: "3s",
+ ReadTimeout: "",
+ WriteTimeout: "",
AllowNativePasswords: true,
AllowOldPasswords: false,
Disable: false,
@@ -166,9 +166,9 @@ user:pwd:pwd@pwd/pwd@hostname/database
ServerPubKey: "",
MaxAllowedPacket: 4194304,
Params: {},
- Timeout: 0,
- ReadTimeout: 0,
- WriteTimeout: 0,
+ Timeout: "3s",
+ ReadTimeout: "",
+ WriteTimeout: "",
AllowNativePasswords: true,
AllowOldPasswords: false,
Disable: false,
@@ -188,9 +188,9 @@ user:password@
ServerPubKey: "",
MaxAllowedPacket: 4194304,
Params: {},
- Timeout: 0,
- ReadTimeout: 0,
- WriteTimeout: 0,
+ Timeout: "3s",
+ ReadTimeout: "",
+ WriteTimeout: "",
AllowNativePasswords: true,
AllowOldPasswords: false,
Disable: false,
@@ -210,9 +210,9 @@ hostname:3307/database
ServerPubKey: "",
MaxAllowedPacket: 4194304,
Params: {},
- Timeout: 0,
- ReadTimeout: 0,
- WriteTimeout: 0,
+ Timeout: "3s",
+ ReadTimeout: "",
+ WriteTimeout: "",
AllowNativePasswords: true,
AllowOldPasswords: false,
Disable: false,
@@ -232,9 +232,9 @@ hostname:3307/database
ServerPubKey: "",
MaxAllowedPacket: 4194304,
Params: {},
- Timeout: 0,
- ReadTimeout: 0,
- WriteTimeout: 0,
+ Timeout: "3s",
+ ReadTimeout: "",
+ WriteTimeout: "",
AllowNativePasswords: true,
AllowOldPasswords: false,
Disable: false,
@@ -254,9 +254,9 @@ hostname:3307/database
ServerPubKey: "",
MaxAllowedPacket: 4194304,
Params: {},
- Timeout: 0,
- ReadTimeout: 0,
- WriteTimeout: 0,
+ Timeout: "3s",
+ ReadTimeout: "",
+ WriteTimeout: "",
AllowNativePasswords: true,
AllowOldPasswords: false,
Disable: false,
@@ -276,9 +276,9 @@ hostname
ServerPubKey: "",
MaxAllowedPacket: 4194304,
Params: {},
- Timeout: 0,
- ReadTimeout: 0,
- WriteTimeout: 0,
+ Timeout: "3s",
+ ReadTimeout: "",
+ WriteTimeout: "",
AllowNativePasswords: true,
AllowOldPasswords: false,
Disable: false,
@@ -298,9 +298,9 @@ hostname
ServerPubKey: "",
MaxAllowedPacket: 4194304,
Params: {},
- Timeout: 0,
- ReadTimeout: 0,
- WriteTimeout: 0,
+ Timeout: "0s",
+ ReadTimeout: "0s",
+ WriteTimeout: "0s",
AllowNativePasswords: true,
AllowOldPasswords: false,
Disable: false,
@@ -320,9 +320,9 @@ hostname
ServerPubKey: "",
MaxAllowedPacket: 4194304,
Params: {},
- Timeout: 0,
- ReadTimeout: 0,
- WriteTimeout: 0,
+ Timeout: "3s",
+ ReadTimeout: "",
+ WriteTimeout: "",
AllowNativePasswords: true,
AllowOldPasswords: false,
Disable: false,
@@ -342,9 +342,9 @@ hostname
ServerPubKey: "",
MaxAllowedPacket: 4194304,
Params: {},
- Timeout: 0,
- ReadTimeout: 0,
- WriteTimeout: 0,
+ Timeout: "3s",
+ ReadTimeout: "",
+ WriteTimeout: "",
AllowNativePasswords: true,
AllowOldPasswords: false,
Disable: false,
@@ -364,9 +364,9 @@ hostname
ServerPubKey: "",
MaxAllowedPacket: 4194304,
Params: {},
- Timeout: 0,
- ReadTimeout: 0,
- WriteTimeout: 0,
+ Timeout: "3s",
+ ReadTimeout: "",
+ WriteTimeout: "",
AllowNativePasswords: true,
AllowOldPasswords: false,
Disable: false,
@@ -386,9 +386,9 @@ hostname
ServerPubKey: "",
MaxAllowedPacket: 4194304,
Params: {},
- Timeout: 0,
- ReadTimeout: 0,
- WriteTimeout: 0,
+ Timeout: "0s",
+ ReadTimeout: "0s",
+ WriteTimeout: "0s",
AllowNativePasswords: true,
AllowOldPasswords: false,
Disable: false,
@@ -408,9 +408,9 @@ user@unix(/path/to/socket)/dbname
ServerPubKey: "",
MaxAllowedPacket: 4194304,
Params: {},
- Timeout: 0,
- ReadTimeout: 0,
- WriteTimeout: 0,
+ Timeout: "0s",
+ ReadTimeout: "0s",
+ WriteTimeout: "0s",
AllowNativePasswords: true,
AllowOldPasswords: false,
Disable: false,
@@ -430,9 +430,9 @@ root:pw@unix(/tmp/mysql.sock)/myDatabase?loc=Local
ServerPubKey: "",
MaxAllowedPacket: 4194304,
Params: {},
- Timeout: 0,
- ReadTimeout: 0,
- WriteTimeout: 0,
+ Timeout: "0s",
+ ReadTimeout: "0s",
+ WriteTimeout: "0s",
AllowNativePasswords: true,
AllowOldPasswords: false,
Disable: false,
@@ -452,9 +452,9 @@ user:password@tcp(localhost:5555)/dbname?tls=skip-verify&autocommit=true
ServerPubKey: "",
MaxAllowedPacket: 4194304,
Params: {"autocommit":"true"},
- Timeout: 0,
- ReadTimeout: 0,
- WriteTimeout: 0,
+ Timeout: "0s",
+ ReadTimeout: "0s",
+ WriteTimeout: "0s",
AllowNativePasswords: true,
AllowOldPasswords: false,
Disable: false,
@@ -474,9 +474,9 @@ user:password@/dbname?sql_mode=TRADITIONAL
ServerPubKey: "",
MaxAllowedPacket: 4194304,
Params: {"sql_mode":"TRADITIONAL"},
- Timeout: 0,
- ReadTimeout: 0,
- WriteTimeout: 0,
+ Timeout: "0s",
+ ReadTimeout: "0s",
+ WriteTimeout: "0s",
AllowNativePasswords: true,
AllowOldPasswords: false,
Disable: false,
@@ -496,9 +496,9 @@ user:password@tcp([de:ad:be:ef::ca:fe]:80)/dbname?timeout=90s&collation=utf8mb4_
ServerPubKey: "",
MaxAllowedPacket: 4194304,
Params: {},
- Timeout: 90,
- ReadTimeout: 0,
- WriteTimeout: 0,
+ Timeout: "1m30s",
+ ReadTimeout: "0s",
+ WriteTimeout: "0s",
AllowNativePasswords: true,
AllowOldPasswords: false,
Disable: false,
@@ -518,9 +518,9 @@ id:password@tcp(your-amazonaws-uri.com:3306)/dbname
ServerPubKey: "",
MaxAllowedPacket: 4194304,
Params: {},
- Timeout: 0,
- ReadTimeout: 0,
- WriteTimeout: 0,
+ Timeout: "0s",
+ ReadTimeout: "0s",
+ WriteTimeout: "0s",
AllowNativePasswords: true,
AllowOldPasswords: false,
Disable: false,
@@ -540,9 +540,9 @@ user@cloudsql(project-id:instance-name)/dbname
ServerPubKey: "",
MaxAllowedPacket: 4194304,
Params: {},
- Timeout: 0,
- ReadTimeout: 0,
- WriteTimeout: 0,
+ Timeout: "0s",
+ ReadTimeout: "0s",
+ WriteTimeout: "0s",
AllowNativePasswords: true,
AllowOldPasswords: false,
Disable: false,
@@ -562,9 +562,9 @@ user@cloudsql(project-id:regionname:instance-name)/dbname
ServerPubKey: "",
MaxAllowedPacket: 4194304,
Params: {},
- Timeout: 0,
- ReadTimeout: 0,
- WriteTimeout: 0,
+ Timeout: "0s",
+ ReadTimeout: "0s",
+ WriteTimeout: "0s",
AllowNativePasswords: true,
AllowOldPasswords: false,
Disable: false,
@@ -584,9 +584,9 @@ user:password@tcp/dbname?charset=utf8mb4,utf8&sys_var=esc%40ped
ServerPubKey: "",
MaxAllowedPacket: 4194304,
Params: {"charset":"utf8mb4,utf8", "sys_var":"esc@ped"},
- Timeout: 0,
- ReadTimeout: 0,
- WriteTimeout: 0,
+ Timeout: "0s",
+ ReadTimeout: "0s",
+ WriteTimeout: "0s",
AllowNativePasswords: true,
AllowOldPasswords: false,
Disable: false,
@@ -606,9 +606,9 @@ user:password@/dbname
ServerPubKey: "",
MaxAllowedPacket: 4194304,
Params: {},
- Timeout: 0,
- ReadTimeout: 0,
- WriteTimeout: 0,
+ Timeout: "0s",
+ ReadTimeout: "0s",
+ WriteTimeout: "0s",
AllowNativePasswords: true,
AllowOldPasswords: false,
Disable: false,
@@ -628,9 +628,9 @@ user:password@/
ServerPubKey: "",
MaxAllowedPacket: 4194304,
Params: {},
- Timeout: 0,
- ReadTimeout: 0,
- WriteTimeout: 0,
+ Timeout: "0s",
+ ReadTimeout: "0s",
+ WriteTimeout: "0s",
AllowNativePasswords: true,
AllowOldPasswords: false,
Disable: false,
@@ -650,9 +650,9 @@ user:password@tcp(localhost:3307)/database?charset=utf8&timeout=5s
ServerPubKey: "",
MaxAllowedPacket: 4194304,
Params: {"charset":"utf8"},
- Timeout: 5,
- ReadTimeout: 0,
- WriteTimeout: 0,
+ Timeout: "5s",
+ ReadTimeout: "0s",
+ WriteTimeout: "0s",
AllowNativePasswords: true,
AllowOldPasswords: false,
Disable: false,
diff --git a/common/testdata/TestPrintConfiguration.golden b/common/testdata/TestPrintConfiguration.golden
index aaaea28297f2bb4741ac74efe522b9b380f68ceb..8ffa7d69b973a8865007be25c0626f0ca28a95f9 100644
--- a/common/testdata/TestPrintConfiguration.golden
+++ b/common/testdata/TestPrintConfiguration.golden
@@ -12,9 +12,9 @@ online-dsn:
maxallowedpacket: 4194304
params:
charset: utf8
- timeout: 0
- read-timeout: 0
- write-timeout: 0
+ timeout: 3s
+ read-timeout: 0s
+ write-timeout: 0s
allow-native-passwords: true
allow-old-passwords: false
disable: false
@@ -32,9 +32,9 @@ test-dsn:
maxallowedpacket: 4194304
params:
charset: utf8
- timeout: 0
- read-timeout: 0
- write-timeout: 0
+ timeout: 3s
+ read-timeout: 0s
+ write-timeout: 0s
allow-native-passwords: true
allow-old-passwords: false
disable: false
diff --git a/common/testdata/TestStringStorageReq.golden b/common/testdata/TestStringStorageReq.golden
index 9b51e2265ae4f996cd2b87a919221aa7117d4fdc..da1f23d5cdba224c4147515de3d85640c9302145 100644
--- a/common/testdata/TestStringStorageReq.golden
+++ b/common/testdata/TestStringStorageReq.golden
@@ -1,33 +1,113 @@
-char(10) latin7 10
-char(256) latin7 255
-binary(10) latin7 10
-binary(256) latin7 255
-varchar(10) latin7 11
-varbinary(10) latin7 11
-enum('G','PG','PG-13','R','NC-17') latin7 1
-set('one', 'two') latin7 1
-not_exist latin7 0
-char(-1) latin7 0
-char(10) ujis 30
-char(256) ujis 765
-binary(10) ujis 10
-binary(256) ujis 255
-varchar(10) ujis 31
-varbinary(10) ujis 31
-enum('G','PG','PG-13','R','NC-17') ujis 1
-set('one', 'two') ujis 1
-not_exist ujis 0
-char(-1) ujis 0
-char(10) cp1256 10
-char(256) cp1256 255
-binary(10) cp1256 10
-binary(256) cp1256 255
-varchar(10) cp1256 11
-varbinary(10) cp1256 11
-enum('G','PG','PG-13','R','NC-17') cp1256 1
-set('one', 'two') cp1256 1
-not_exist cp1256 0
-char(-1) cp1256 0
+char(10) hebrew 10
+char(256) hebrew 255
+binary(10) hebrew 10
+binary(256) hebrew 255
+varchar(10) hebrew 11
+varbinary(10) hebrew 11
+enum('G','PG','PG-13','R','NC-17') hebrew 1
+set('one', 'two') hebrew 1
+not_exist hebrew 0
+char(-1) hebrew 0
+char(10) latin2 10
+char(256) latin2 255
+binary(10) latin2 10
+binary(256) latin2 255
+varchar(10) latin2 11
+varbinary(10) latin2 11
+enum('G','PG','PG-13','R','NC-17') latin2 1
+set('one', 'two') latin2 1
+not_exist latin2 0
+char(-1) latin2 0
+char(10) big5 20
+char(256) big5 510
+binary(10) big5 10
+binary(256) big5 255
+varchar(10) big5 21
+varbinary(10) big5 21
+enum('G','PG','PG-13','R','NC-17') big5 1
+set('one', 'two') big5 1
+not_exist big5 0
+char(-1) big5 0
+char(10) cp1250 10
+char(256) cp1250 255
+binary(10) cp1250 10
+binary(256) cp1250 255
+varchar(10) cp1250 11
+varbinary(10) cp1250 11
+enum('G','PG','PG-13','R','NC-17') cp1250 1
+set('one', 'two') cp1250 1
+not_exist cp1250 0
+char(-1) cp1250 0
+char(10) eucjpms 30
+char(256) eucjpms 765
+binary(10) eucjpms 10
+binary(256) eucjpms 255
+varchar(10) eucjpms 31
+varbinary(10) eucjpms 31
+enum('G','PG','PG-13','R','NC-17') eucjpms 1
+set('one', 'two') eucjpms 1
+not_exist eucjpms 0
+char(-1) eucjpms 0
+char(10) latin1 10
+char(256) latin1 255
+binary(10) latin1 10
+binary(256) latin1 255
+varchar(10) latin1 11
+varbinary(10) latin1 11
+enum('G','PG','PG-13','R','NC-17') latin1 1
+set('one', 'two') latin1 1
+not_exist latin1 0
+char(-1) latin1 0
+char(10) macce 10
+char(256) macce 255
+binary(10) macce 10
+binary(256) macce 255
+varchar(10) macce 11
+varbinary(10) macce 11
+enum('G','PG','PG-13','R','NC-17') macce 1
+set('one', 'two') macce 1
+not_exist macce 0
+char(-1) macce 0
+char(10) tis620 10
+char(256) tis620 255
+binary(10) tis620 10
+binary(256) tis620 255
+varchar(10) tis620 11
+varbinary(10) tis620 11
+enum('G','PG','PG-13','R','NC-17') tis620 1
+set('one', 'two') tis620 1
+not_exist tis620 0
+char(-1) tis620 0
+char(10) utf16 40
+char(256) utf16 1020
+binary(10) utf16 10
+binary(256) utf16 255
+varchar(10) utf16 41
+varbinary(10) utf16 41
+enum('G','PG','PG-13','R','NC-17') utf16 1
+set('one', 'two') utf16 1
+not_exist utf16 0
+char(-1) utf16 0
+char(10) utf16le 40
+char(256) utf16le 1020
+binary(10) utf16le 10
+binary(256) utf16le 255
+varchar(10) utf16le 41
+varbinary(10) utf16le 41
+enum('G','PG','PG-13','R','NC-17') utf16le 1
+set('one', 'two') utf16le 1
+not_exist utf16le 0
+char(-1) utf16le 0
+char(10) binary 10
+char(256) binary 255
+binary(10) binary 10
+binary(256) binary 255
+varchar(10) binary 11
+varbinary(10) binary 11
+enum('G','PG','PG-13','R','NC-17') binary 1
+set('one', 'two') binary 1
+not_exist binary 0
+char(-1) binary 0
char(10) cp852 10
char(256) cp852 255
binary(10) cp852 10
@@ -38,36 +118,36 @@ enum('G','PG','PG-13','R','NC-17') cp852 1
set('one', 'two') cp852 1
not_exist cp852 0
char(-1) cp852 0
-char(10) cp866 10
-char(256) cp866 255
-binary(10) cp866 10
-binary(256) cp866 255
-varchar(10) cp866 11
-varbinary(10) cp866 11
-enum('G','PG','PG-13','R','NC-17') cp866 1
-set('one', 'two') cp866 1
-not_exist cp866 0
-char(-1) cp866 0
-char(10) geostd8 10
-char(256) geostd8 255
-binary(10) geostd8 10
-binary(256) geostd8 255
-varchar(10) geostd8 11
-varbinary(10) geostd8 11
-enum('G','PG','PG-13','R','NC-17') geostd8 1
-set('one', 'two') geostd8 1
-not_exist geostd8 0
-char(-1) geostd8 0
-char(10) keybcs2 10
-char(256) keybcs2 255
-binary(10) keybcs2 10
-binary(256) keybcs2 255
-varchar(10) keybcs2 11
-varbinary(10) keybcs2 11
-enum('G','PG','PG-13','R','NC-17') keybcs2 1
-set('one', 'two') keybcs2 1
-not_exist keybcs2 0
-char(-1) keybcs2 0
+char(10) cp932 20
+char(256) cp932 510
+binary(10) cp932 10
+binary(256) cp932 255
+varchar(10) cp932 21
+varbinary(10) cp932 21
+enum('G','PG','PG-13','R','NC-17') cp932 1
+set('one', 'two') cp932 1
+not_exist cp932 0
+char(-1) cp932 0
+char(10) gbk 20
+char(256) gbk 510
+binary(10) gbk 10
+binary(256) gbk 255
+varchar(10) gbk 21
+varbinary(10) gbk 21
+enum('G','PG','PG-13','R','NC-17') gbk 1
+set('one', 'two') gbk 1
+not_exist gbk 0
+char(-1) gbk 0
+char(10) hp8 10
+char(256) hp8 255
+binary(10) hp8 10
+binary(256) hp8 255
+varchar(10) hp8 11
+varbinary(10) hp8 11
+enum('G','PG','PG-13','R','NC-17') hp8 1
+set('one', 'two') hp8 1
+not_exist hp8 0
+char(-1) hp8 0
char(10) ucs2 20
char(256) ucs2 510
binary(10) ucs2 10
@@ -78,36 +158,26 @@ enum('G','PG','PG-13','R','NC-17') ucs2 1
set('one', 'two') ucs2 1
not_exist ucs2 0
char(-1) ucs2 0
-char(10) utf32 40
-char(256) utf32 1020
-binary(10) utf32 10
-binary(256) utf32 255
-varchar(10) utf32 41
-varbinary(10) utf32 41
-enum('G','PG','PG-13','R','NC-17') utf32 1
-set('one', 'two') utf32 1
-not_exist utf32 0
-char(-1) utf32 0
-char(10) armscii8 10
-char(256) armscii8 255
-binary(10) armscii8 10
-binary(256) armscii8 255
-varchar(10) armscii8 11
-varbinary(10) armscii8 11
-enum('G','PG','PG-13','R','NC-17') armscii8 1
-set('one', 'two') armscii8 1
-not_exist armscii8 0
-char(-1) armscii8 0
-char(10) ascii 10
-char(256) ascii 255
-binary(10) ascii 10
-binary(256) ascii 255
-varchar(10) ascii 11
-varbinary(10) ascii 11
-enum('G','PG','PG-13','R','NC-17') ascii 1
-set('one', 'two') ascii 1
-not_exist ascii 0
-char(-1) ascii 0
+char(10) cp1251 10
+char(256) cp1251 255
+binary(10) cp1251 10
+binary(256) cp1251 255
+varchar(10) cp1251 11
+varbinary(10) cp1251 11
+enum('G','PG','PG-13','R','NC-17') cp1251 1
+set('one', 'two') cp1251 1
+not_exist cp1251 0
+char(-1) cp1251 0
+char(10) cp1256 10
+char(256) cp1256 255
+binary(10) cp1256 10
+binary(256) cp1256 255
+varchar(10) cp1256 11
+varbinary(10) cp1256 11
+enum('G','PG','PG-13','R','NC-17') cp1256 1
+set('one', 'two') cp1256 1
+not_exist cp1256 0
+char(-1) cp1256 0
char(10) dec8 10
char(256) dec8 255
binary(10) dec8 10
@@ -118,56 +188,26 @@ enum('G','PG','PG-13','R','NC-17') dec8 1
set('one', 'two') dec8 1
not_exist dec8 0
char(-1) dec8 0
-char(10) eucjpms 30
-char(256) eucjpms 765
-binary(10) eucjpms 10
-binary(256) eucjpms 255
-varchar(10) eucjpms 31
-varbinary(10) eucjpms 31
-enum('G','PG','PG-13','R','NC-17') eucjpms 1
-set('one', 'two') eucjpms 1
-not_exist eucjpms 0
-char(-1) eucjpms 0
-char(10) latin2 10
-char(256) latin2 255
-binary(10) latin2 10
-binary(256) latin2 255
-varchar(10) latin2 11
-varbinary(10) latin2 11
-enum('G','PG','PG-13','R','NC-17') latin2 1
-set('one', 'two') latin2 1
-not_exist latin2 0
-char(-1) latin2 0
-char(10) cp1257 10
-char(256) cp1257 255
-binary(10) cp1257 10
-binary(256) cp1257 255
-varchar(10) cp1257 11
-varbinary(10) cp1257 11
-enum('G','PG','PG-13','R','NC-17') cp1257 1
-set('one', 'two') cp1257 1
-not_exist cp1257 0
-char(-1) cp1257 0
-char(10) cp932 20
-char(256) cp932 510
-binary(10) cp932 10
-binary(256) cp932 255
-varchar(10) cp932 21
-varbinary(10) cp932 21
-enum('G','PG','PG-13','R','NC-17') cp932 1
-set('one', 'two') cp932 1
-not_exist cp932 0
-char(-1) cp932 0
-char(10) cp1250 10
-char(256) cp1250 255
-binary(10) cp1250 10
-binary(256) cp1250 255
-varchar(10) cp1250 11
-varbinary(10) cp1250 11
-enum('G','PG','PG-13','R','NC-17') cp1250 1
-set('one', 'two') cp1250 1
-not_exist cp1250 0
-char(-1) cp1250 0
+char(10) euckr 20
+char(256) euckr 510
+binary(10) euckr 10
+binary(256) euckr 255
+varchar(10) euckr 21
+varbinary(10) euckr 21
+enum('G','PG','PG-13','R','NC-17') euckr 1
+set('one', 'two') euckr 1
+not_exist euckr 0
+char(-1) euckr 0
+char(10) geostd8 10
+char(256) geostd8 255
+binary(10) geostd8 10
+binary(256) geostd8 255
+varchar(10) geostd8 11
+varbinary(10) geostd8 11
+enum('G','PG','PG-13','R','NC-17') geostd8 1
+set('one', 'two') geostd8 1
+not_exist geostd8 0
+char(-1) geostd8 0
char(10) greek 10
char(256) greek 255
binary(10) greek 10
@@ -178,36 +218,26 @@ enum('G','PG','PG-13','R','NC-17') greek 1
set('one', 'two') greek 1
not_exist greek 0
char(-1) greek 0
-char(10) swe7 10
-char(256) swe7 255
-binary(10) swe7 10
-binary(256) swe7 255
-varchar(10) swe7 11
-varbinary(10) swe7 11
-enum('G','PG','PG-13','R','NC-17') swe7 1
-set('one', 'two') swe7 1
-not_exist swe7 0
-char(-1) swe7 0
-char(10) utf8 30
-char(256) utf8 765
-binary(10) utf8 10
-binary(256) utf8 255
-varchar(10) utf8 31
-varbinary(10) utf8 31
-enum('G','PG','PG-13','R','NC-17') utf8 1
-set('one', 'two') utf8 1
-not_exist utf8 0
-char(-1) utf8 0
-char(10) utf8mb4 40
-char(256) utf8mb4 1020
-binary(10) utf8mb4 10
-binary(256) utf8mb4 255
-varchar(10) utf8mb4 41
-varbinary(10) utf8mb4 41
-enum('G','PG','PG-13','R','NC-17') utf8mb4 1
-set('one', 'two') utf8mb4 1
-not_exist utf8mb4 0
-char(-1) utf8mb4 0
+char(10) macroman 10
+char(256) macroman 255
+binary(10) macroman 10
+binary(256) macroman 255
+varchar(10) macroman 11
+varbinary(10) macroman 11
+enum('G','PG','PG-13','R','NC-17') macroman 1
+set('one', 'two') macroman 1
+not_exist macroman 0
+char(-1) macroman 0
+char(10) armscii8 10
+char(256) armscii8 255
+binary(10) armscii8 10
+binary(256) armscii8 255
+varchar(10) armscii8 11
+varbinary(10) armscii8 11
+enum('G','PG','PG-13','R','NC-17') armscii8 1
+set('one', 'two') armscii8 1
+not_exist armscii8 0
+char(-1) armscii8 0
char(10) cp850 10
char(256) cp850 255
binary(10) cp850 10
@@ -218,26 +248,6 @@ enum('G','PG','PG-13','R','NC-17') cp850 1
set('one', 'two') cp850 1
not_exist cp850 0
char(-1) cp850 0
-char(10) euckr 20
-char(256) euckr 510
-binary(10) euckr 10
-binary(256) euckr 255
-varchar(10) euckr 21
-varbinary(10) euckr 21
-enum('G','PG','PG-13','R','NC-17') euckr 1
-set('one', 'two') euckr 1
-not_exist euckr 0
-char(-1) euckr 0
-char(10) hp8 10
-char(256) hp8 255
-binary(10) hp8 10
-binary(256) hp8 255
-varchar(10) hp8 11
-varbinary(10) hp8 11
-enum('G','PG','PG-13','R','NC-17') hp8 1
-set('one', 'two') hp8 1
-not_exist hp8 0
-char(-1) hp8 0
char(10) koi8u 10
char(256) koi8u 255
binary(10) koi8u 10
@@ -248,36 +258,36 @@ enum('G','PG','PG-13','R','NC-17') koi8u 1
set('one', 'two') koi8u 1
not_exist koi8u 0
char(-1) koi8u 0
-char(10) macce 10
-char(256) macce 255
-binary(10) macce 10
-binary(256) macce 255
-varchar(10) macce 11
-varbinary(10) macce 11
-enum('G','PG','PG-13','R','NC-17') macce 1
-set('one', 'two') macce 1
-not_exist macce 0
-char(-1) macce 0
-char(10) binary 10
-char(256) binary 255
-binary(10) binary 10
-binary(256) binary 255
-varchar(10) binary 11
-varbinary(10) binary 11
-enum('G','PG','PG-13','R','NC-17') binary 1
-set('one', 'two') binary 1
-not_exist binary 0
-char(-1) binary 0
-char(10) gb18030 40
-char(256) gb18030 1020
-binary(10) gb18030 10
-binary(256) gb18030 255
-varchar(10) gb18030 41
-varbinary(10) gb18030 41
-enum('G','PG','PG-13','R','NC-17') gb18030 1
-set('one', 'two') gb18030 1
-not_exist gb18030 0
-char(-1) gb18030 0
+char(10) ujis 30
+char(256) ujis 765
+binary(10) ujis 10
+binary(256) ujis 255
+varchar(10) ujis 31
+varbinary(10) ujis 31
+enum('G','PG','PG-13','R','NC-17') ujis 1
+set('one', 'two') ujis 1
+not_exist ujis 0
+char(-1) ujis 0
+char(10) utf32 40
+char(256) utf32 1020
+binary(10) utf32 10
+binary(256) utf32 255
+varchar(10) utf32 41
+varbinary(10) utf32 41
+enum('G','PG','PG-13','R','NC-17') utf32 1
+set('one', 'two') utf32 1
+not_exist utf32 0
+char(-1) utf32 0
+char(10) cp866 10
+char(256) cp866 255
+binary(10) cp866 10
+binary(256) cp866 255
+varchar(10) cp866 11
+varbinary(10) cp866 11
+enum('G','PG','PG-13','R','NC-17') cp866 1
+set('one', 'two') cp866 1
+not_exist cp866 0
+char(-1) cp866 0
char(10) gb2312 20
char(256) gb2312 510
binary(10) gb2312 10
@@ -288,6 +298,36 @@ enum('G','PG','PG-13','R','NC-17') gb2312 1
set('one', 'two') gb2312 1
not_exist gb2312 0
char(-1) gb2312 0
+char(10) swe7 10
+char(256) swe7 255
+binary(10) swe7 10
+binary(256) swe7 255
+varchar(10) swe7 11
+varbinary(10) swe7 11
+enum('G','PG','PG-13','R','NC-17') swe7 1
+set('one', 'two') swe7 1
+not_exist swe7 0
+char(-1) swe7 0
+char(10) utf8mb4 40
+char(256) utf8mb4 1020
+binary(10) utf8mb4 10
+binary(256) utf8mb4 255
+varchar(10) utf8mb4 41
+varbinary(10) utf8mb4 41
+enum('G','PG','PG-13','R','NC-17') utf8mb4 1
+set('one', 'two') utf8mb4 1
+not_exist utf8mb4 0
+char(-1) utf8mb4 0
+char(10) ascii 10
+char(256) ascii 255
+binary(10) ascii 10
+binary(256) ascii 255
+varchar(10) ascii 11
+varbinary(10) ascii 11
+enum('G','PG','PG-13','R','NC-17') ascii 1
+set('one', 'two') ascii 1
+not_exist ascii 0
+char(-1) ascii 0
char(10) latin5 10
char(256) latin5 255
binary(10) latin5 10
@@ -298,16 +338,6 @@ enum('G','PG','PG-13','R','NC-17') latin5 1
set('one', 'two') latin5 1
not_exist latin5 0
char(-1) latin5 0
-char(10) big5 20
-char(256) big5 510
-binary(10) big5 10
-binary(256) big5 255
-varchar(10) big5 21
-varbinary(10) big5 21
-enum('G','PG','PG-13','R','NC-17') big5 1
-set('one', 'two') big5 1
-not_exist big5 0
-char(-1) big5 0
char(10) koi8r 10
char(256) koi8r 255
binary(10) koi8r 10
@@ -318,6 +348,16 @@ enum('G','PG','PG-13','R','NC-17') koi8r 1
set('one', 'two') koi8r 1
not_exist koi8r 0
char(-1) koi8r 0
+char(10) latin7 10
+char(256) latin7 255
+binary(10) latin7 10
+binary(256) latin7 255
+varchar(10) latin7 11
+varbinary(10) latin7 11
+enum('G','PG','PG-13','R','NC-17') latin7 1
+set('one', 'two') latin7 1
+not_exist latin7 0
+char(-1) latin7 0
char(10) sjis 20
char(256) sjis 510
binary(10) sjis 10
@@ -328,83 +368,43 @@ enum('G','PG','PG-13','R','NC-17') sjis 1
set('one', 'two') sjis 1
not_exist sjis 0
char(-1) sjis 0
-char(10) utf16le 40
-char(256) utf16le 1020
-binary(10) utf16le 10
-binary(256) utf16le 255
-varchar(10) utf16le 41
-varbinary(10) utf16le 41
-enum('G','PG','PG-13','R','NC-17') utf16le 1
-set('one', 'two') utf16le 1
-not_exist utf16le 0
-char(-1) utf16le 0
-char(10) tis620 10
-char(256) tis620 255
-binary(10) tis620 10
-binary(256) tis620 255
-varchar(10) tis620 11
-varbinary(10) tis620 11
-enum('G','PG','PG-13','R','NC-17') tis620 1
-set('one', 'two') tis620 1
-not_exist tis620 0
-char(-1) tis620 0
-char(10) utf16 40
-char(256) utf16 1020
-binary(10) utf16 10
-binary(256) utf16 255
-varchar(10) utf16 41
-varbinary(10) utf16 41
-enum('G','PG','PG-13','R','NC-17') utf16 1
-set('one', 'two') utf16 1
-not_exist utf16 0
-char(-1) utf16 0
-char(10) cp1251 10
-char(256) cp1251 255
-binary(10) cp1251 10
-binary(256) cp1251 255
-varchar(10) cp1251 11
-varbinary(10) cp1251 11
-enum('G','PG','PG-13','R','NC-17') cp1251 1
-set('one', 'two') cp1251 1
-not_exist cp1251 0
-char(-1) cp1251 0
-char(10) gbk 20
-char(256) gbk 510
-binary(10) gbk 10
-binary(256) gbk 255
-varchar(10) gbk 21
-varbinary(10) gbk 21
-enum('G','PG','PG-13','R','NC-17') gbk 1
-set('one', 'two') gbk 1
-not_exist gbk 0
-char(-1) gbk 0
-char(10) hebrew 10
-char(256) hebrew 255
-binary(10) hebrew 10
-binary(256) hebrew 255
-varchar(10) hebrew 11
-varbinary(10) hebrew 11
-enum('G','PG','PG-13','R','NC-17') hebrew 1
-set('one', 'two') hebrew 1
-not_exist hebrew 0
-char(-1) hebrew 0
-char(10) latin1 10
-char(256) latin1 255
-binary(10) latin1 10
-binary(256) latin1 255
-varchar(10) latin1 11
-varbinary(10) latin1 11
-enum('G','PG','PG-13','R','NC-17') latin1 1
-set('one', 'two') latin1 1
-not_exist latin1 0
-char(-1) latin1 0
-char(10) macroman 10
-char(256) macroman 255
-binary(10) macroman 10
-binary(256) macroman 255
-varchar(10) macroman 11
-varbinary(10) macroman 11
-enum('G','PG','PG-13','R','NC-17') macroman 1
-set('one', 'two') macroman 1
-not_exist macroman 0
-char(-1) macroman 0
+char(10) utf8 30
+char(256) utf8 765
+binary(10) utf8 10
+binary(256) utf8 255
+varchar(10) utf8 31
+varbinary(10) utf8 31
+enum('G','PG','PG-13','R','NC-17') utf8 1
+set('one', 'two') utf8 1
+not_exist utf8 0
+char(-1) utf8 0
+char(10) cp1257 10
+char(256) cp1257 255
+binary(10) cp1257 10
+binary(256) cp1257 255
+varchar(10) cp1257 11
+varbinary(10) cp1257 11
+enum('G','PG','PG-13','R','NC-17') cp1257 1
+set('one', 'two') cp1257 1
+not_exist cp1257 0
+char(-1) cp1257 0
+char(10) gb18030 40
+char(256) gb18030 1020
+binary(10) gb18030 10
+binary(256) gb18030 255
+varchar(10) gb18030 41
+varbinary(10) gb18030 41
+enum('G','PG','PG-13','R','NC-17') gb18030 1
+set('one', 'two') gb18030 1
+not_exist gb18030 0
+char(-1) gb18030 0
+char(10) keybcs2 10
+char(256) keybcs2 255
+binary(10) keybcs2 10
+binary(256) keybcs2 255
+varchar(10) keybcs2 11
+varbinary(10) keybcs2 11
+enum('G','PG','PG-13','R','NC-17') keybcs2 1
+set('one', 'two') keybcs2 1
+not_exist keybcs2 0
+char(-1) keybcs2 0
diff --git a/database/testdata/TestShowTables.golden b/database/testdata/TestShowTables.golden
index 27a6ad5d1f84e6e101e9dfec5f3baf6fccfe182a..32a52ee40e1ff456c4d39f8e07028f99d7cf888e 100644
--- a/database/testdata/TestShowTables.golden
+++ b/database/testdata/TestShowTables.golden
@@ -21,3 +21,6 @@ sales_by_store
staff
staff_list
store
+t_clinic_info
+t_partition_list
+test_id
diff --git a/doc/report_type.md b/doc/report_type.md
index 1c19fb0250aa568a0da0844a8aacaca931ca32b6..be230052d2e7f9cc23abb292b62bcc54f0941e9b 100644
--- a/doc/report_type.md
+++ b/doc/report_type.md
@@ -64,7 +64,7 @@ echo "select * from film" | soar -report-type tiast-json
* **Example**:
```bash
-echo "select * from film" | soar -report-type meta
+echo "select * from film" | soar -report-type tables
```
## query-type
* **Description**:SQL 语句的请求类型
diff --git a/env/env.go b/env/env.go
index 7601440271dc20a797df717759fbc170d0dd8341..745142df6dc1939f354df91aedfe9127e50500dc 100644
--- a/env/env.go
+++ b/env/env.go
@@ -209,6 +209,24 @@ func ChangeDB(env *database.Connector, sql string) {
}
}
+func CurrentDB(sql, db string) string {
+ stmt, err := sqlparser.Parse(sql)
+ if err != nil {
+ return common.Config.TestDSN.Schema
+ }
+
+ switch stmt := stmt.(type) {
+ case *sqlparser.Use:
+ if stmt.DBName.String() != "" {
+ db = stmt.DBName.String()
+ }
+ }
+ if db == "" {
+ db = common.Config.TestDSN.Schema
+ }
+ return db
+}
+
// BuildVirtualEnv rEnv 为 SQL 源环境,DB 使用的信息从接口获取
// 注意:如果是 USE, DDL 等语句,执行完第一条就会返回,后面的 SQL 不会执行
func (vEnv *VirtualEnv) BuildVirtualEnv(rEnv *database.Connector, SQLs ...string) bool {
diff --git a/test/fixture/test_Check_soar_report_for_json.golden b/test/fixture/test_Check_soar_report_for_json.golden
index c0303909a078c4660b572621eb2a8606aa07db37..d9dd3ae53acb41656d559b006c7f150116cf6c8f 100644
--- a/test/fixture/test_Check_soar_report_for_json.golden
+++ b/test/fixture/test_Check_soar_report_for_json.golden
@@ -1,6 +1,12 @@
-{
- "687D590364E29465": {
- "CLA.001": {
+[
+ {
+ "ID": "687D590364E29465",
+ "Fingerprint": "select * from film",
+ "Score": 0,
+ "Sample": "select * from film",
+ "Explain": null,
+ "HeuristicRules": [
+ {
"Item": "CLA.001",
"Severity": "L4",
"Summary": "最外层 SELECT 未指定 WHERE 条件",
@@ -8,7 +14,7 @@
"Case": "select id from tbl",
"Position": 0
},
- "COL.001": {
+ {
"Item": "COL.001",
"Severity": "L1",
"Summary": "不建议使用 SELECT * 类型查询",
@@ -16,5 +22,10 @@
"Case": "select * from tbl where id=1",
"Position": 0
}
- }
-}
+ ],
+ "IndexRules": null,
+ "Tables": [
+ "`information_schema`.`film`"
+ ]
+}
+]