From 7af086018167a9295073f85cab3e97ea5a154c3c Mon Sep 17 00:00:00 2001 From: BugsGuru Date: Fri, 24 Jan 2025 16:28:10 +0800 Subject: [PATCH] fix unit test --- sqle/driver/mysql/advisor_test.go | 106 ++++++++++++++++++++ sqle/driver/mysql/audit_test.go | 113 ++++++++++++++++++++-- sqle/driver/mysql/pt_osc_test.go | 2 +- sqle/driver/mysql/session/context.go | 4 + sqle/driver/mysql/session/mock_context.go | 27 ++++++ sqle/driver/mysql/util/visitor_test.go | 2 +- 6 files changed, 244 insertions(+), 10 deletions(-) diff --git a/sqle/driver/mysql/advisor_test.go b/sqle/driver/mysql/advisor_test.go index 8be889b0e..8e44976f8 100644 --- a/sqle/driver/mysql/advisor_test.go +++ b/sqle/driver/mysql/advisor_test.go @@ -23,6 +23,7 @@ var explainColumns []string = []string{"type", "table"} const explainTypeAll string = "ALL" const drivingTable string = "exist_tb_1" const explainFormat string = "EXPLAIN %s" +const showWarnings = "SHOW WARNINGS" func mockPrefixIndexOptimizeResult(caseName string, c optimizerTestContent, t *testing.T) []*OptimizeResult { return mockOptimizeResultWithAdvisor(c.sql, c.maxColumn, c.queryResults, caseName, t, newPrefixIndexAdvisor) @@ -147,6 +148,9 @@ func TestPrefixIndexOptimize(t *testing.T) { { query: regexp.QuoteMeta(fmt.Sprintf(explainFormat, `SELECT * FROM exist_tb_1 WHERE v1 LIKE "%_set"`)), result: sqlmock.NewRows(explainColumns).AddRow(explainTypeAll, drivingTable), + }, { + query: regexp.QuoteMeta(showWarnings), + result: sqlmock.NewRows([]string{"Level", "Code", "Message"}), }, }, expectResults: []*OptimizeResult{ @@ -160,6 +164,9 @@ func TestPrefixIndexOptimize(t *testing.T) { { query: regexp.QuoteMeta(fmt.Sprintf(explainFormat, `SELECT * FROM exist_tb_1 WHERE v1 LIKE upper("_set")`)), result: sqlmock.NewRows(explainColumns).AddRow(explainTypeAll, drivingTable), + }, { + query: regexp.QuoteMeta(showWarnings), + result: sqlmock.NewRows([]string{"Level", "Code", "Message"}), }, }, expectResults: []*OptimizeResult{ @@ -173,6 +180,9 @@ func TestPrefixIndexOptimize(t *testing.T) { { query: regexp.QuoteMeta(fmt.Sprintf(explainFormat, `SELECT * FROM exist_tb_1 WHERE v1 = '_set'`)), result: sqlmock.NewRows(explainColumns).AddRow(explainTypeAll, drivingTable), + }, { + query: regexp.QuoteMeta(showWarnings), + result: sqlmock.NewRows([]string{"Level", "Code", "Message"}), }, }, maxColumn: 1, @@ -183,6 +193,9 @@ func TestPrefixIndexOptimize(t *testing.T) { { query: regexp.QuoteMeta(fmt.Sprintf(explainFormat, `SELECT * FROM exist_tb_1`)), result: sqlmock.NewRows(explainColumns).AddRow(explainTypeAll, drivingTable), + }, { + query: regexp.QuoteMeta(showWarnings), + result: sqlmock.NewRows([]string{"Level", "Code", "Message"}), }, }, maxColumn: 1, @@ -193,6 +206,9 @@ func TestPrefixIndexOptimize(t *testing.T) { { query: regexp.QuoteMeta(fmt.Sprintf(explainFormat, `SELECT * FROM exist_tb_1 WHERE v1 LIKE upper("_set_")`)), result: sqlmock.NewRows(explainColumns).AddRow(explainTypeAll, drivingTable), + }, { + query: regexp.QuoteMeta(showWarnings), + result: sqlmock.NewRows([]string{"Level", "Code", "Message"}), }, }, maxColumn: 1, @@ -208,6 +224,9 @@ func TestFunctionIndexOptimize(t *testing.T) { { query: regexp.QuoteMeta(fmt.Sprintf(explainFormat, `SELECT v1 FROM exist_tb_1 WHERE LOWER(v1) = "s"`)), result: sqlmock.NewRows(explainColumns).AddRow(explainTypeAll, drivingTable), + }, { + query: regexp.QuoteMeta(showWarnings), + result: sqlmock.NewRows([]string{"Level", "Code", "Message"}), }, { query: regexp.QuoteMeta("SHOW GLOBAL VARIABLES LIKE 'version'"), result: sqlmock.NewRows([]string{"Value"}).AddRow("8.0.13"), @@ -224,6 +243,9 @@ func TestFunctionIndexOptimize(t *testing.T) { { query: regexp.QuoteMeta(fmt.Sprintf(explainFormat, `SELECT v1 FROM exist_tb_1 WHERE LOWER(v1) = "s"`)), result: sqlmock.NewRows(explainColumns).AddRow(explainTypeAll, drivingTable), + }, { + query: regexp.QuoteMeta(showWarnings), + result: sqlmock.NewRows([]string{"Level", "Code", "Message"}), }, { query: regexp.QuoteMeta("SHOW GLOBAL VARIABLES LIKE 'version'"), result: sqlmock.NewRows([]string{"Value"}).AddRow("5.7.1"), @@ -240,6 +262,9 @@ func TestFunctionIndexOptimize(t *testing.T) { { query: regexp.QuoteMeta(fmt.Sprintf(explainFormat, `SELECT v1 FROM exist_tb_1 WHERE LOWER(v1) = "s"`)), result: sqlmock.NewRows(explainColumns).AddRow(explainTypeAll, drivingTable), + }, { + query: regexp.QuoteMeta(showWarnings), + result: sqlmock.NewRows([]string{"Level", "Code", "Message"}), }, { query: regexp.QuoteMeta("SHOW GLOBAL VARIABLES LIKE 'version'"), result: sqlmock.NewRows([]string{"Value"}).AddRow("5.2.1"), @@ -253,6 +278,9 @@ func TestFunctionIndexOptimize(t *testing.T) { { query: regexp.QuoteMeta(fmt.Sprintf(explainFormat, `SELECT v1 FROM exist_tb_1 WHERE v1 = "s"`)), result: sqlmock.NewRows(explainColumns).AddRow(explainTypeAll, drivingTable), + }, { + query: regexp.QuoteMeta(showWarnings), + result: sqlmock.NewRows([]string{"Level", "Code", "Message"}), }, { query: regexp.QuoteMeta("SHOW GLOBAL VARIABLES LIKE 'version'"), result: sqlmock.NewRows([]string{"Value"}).AddRow("5.2.1"), @@ -266,6 +294,9 @@ func TestFunctionIndexOptimize(t *testing.T) { { query: regexp.QuoteMeta(fmt.Sprintf(explainFormat, `SELECT v1 FROM exist_tb_1 WHERE LOWER(v1) = "s"`)), result: sqlmock.NewRows(explainColumns).AddRow(explainTypeAll, drivingTable), + }, { + query: regexp.QuoteMeta(showWarnings), + result: sqlmock.NewRows([]string{"Level", "Code", "Message"}), }, { query: regexp.QuoteMeta("SHOW GLOBAL VARIABLES LIKE 'version'"), result: sqlmock.NewRows([]string{"Value"}).AddRow("?,?,?"), @@ -282,6 +313,9 @@ func TestFunctionIndexOptimize(t *testing.T) { { query: regexp.QuoteMeta(fmt.Sprintf(explainFormat, `SELECT v1 FROM exist_tb_1`)), result: sqlmock.NewRows(explainColumns).AddRow(explainTypeAll, drivingTable), + }, { + query: regexp.QuoteMeta(showWarnings), + result: sqlmock.NewRows([]string{"Level", "Code", "Message"}), }, }, maxColumn: 4, @@ -297,6 +331,9 @@ func TestThreeStarOptimize(t *testing.T) { { query: regexp.QuoteMeta(fmt.Sprintf(explainFormat, `SELECT v1,v2 FROM exist_tb_3 WHERE v1 = "s" ORDER BY v3`)), result: sqlmock.NewRows(explainColumns).AddRow(explainTypeAll, "exist_tb_3"), + }, { + query: regexp.QuoteMeta(showWarnings), + result: sqlmock.NewRows([]string{"Level", "Code", "Message"}), }, { query: regexp.QuoteMeta(`SELECT COUNT`), // 组成请求的来源包含map,会导致query的形式随机 result: sqlmock.NewRows([]string{"id", "v1", "v2", "v3"}).AddRow(100, 70.12, 80.98, 34.2), @@ -313,6 +350,9 @@ func TestThreeStarOptimize(t *testing.T) { { query: regexp.QuoteMeta(fmt.Sprintf(explainFormat, `SELECT id,v1,v2,v3 FROM exist_tb_3 WHERE v1 = "s" ORDER BY v3`)), result: sqlmock.NewRows(explainColumns).AddRow(explainTypeAll, "exist_tb_3"), + }, { + query: regexp.QuoteMeta(showWarnings), + result: sqlmock.NewRows([]string{"Level", "Code", "Message"}), }, { query: regexp.QuoteMeta(`SELECT COUNT`), result: sqlmock.NewRows([]string{"v1", "v3", "id", "v2"}).AddRow(100.00, 23.56, 70.12, 80.98), @@ -329,6 +369,9 @@ func TestThreeStarOptimize(t *testing.T) { { query: regexp.QuoteMeta(fmt.Sprintf(explainFormat, `SELECT id,v1,v2,v3 FROM exist_tb_3 WHERE v1 = "s" ORDER BY v3`)), result: sqlmock.NewRows(explainColumns).AddRow(explainTypeAll, "exist_tb_3"), + }, { + query: regexp.QuoteMeta(showWarnings), + result: sqlmock.NewRows([]string{"Level", "Code", "Message"}), }, { query: regexp.QuoteMeta(`SELECT COUNT`), result: sqlmock.NewRows([]string{"id", "v1", "v2", "v3"}).AddRow(100.00, 23.56, 70.12, 80.98), @@ -345,6 +388,9 @@ func TestThreeStarOptimize(t *testing.T) { { query: regexp.QuoteMeta(fmt.Sprintf(explainFormat, `SELECT id,v1,v2,v3 FROM exist_tb_3 WHERE v1 = "s" AND v2 = "s" AND id = 20 ORDER BY v3`)), result: sqlmock.NewRows(explainColumns).AddRow(explainTypeAll, "exist_tb_3"), + }, { + query: regexp.QuoteMeta(showWarnings), + result: sqlmock.NewRows([]string{"Level", "Code", "Message"}), }, { query: regexp.QuoteMeta(`SELECT COUNT`), result: sqlmock.NewRows([]string{"id", "v1", "v2", "v3"}).AddRow(100.00, 23.56, 70.12, 80.98), @@ -361,6 +407,9 @@ func TestThreeStarOptimize(t *testing.T) { { query: regexp.QuoteMeta(fmt.Sprintf(explainFormat, `SELECT id,v1,v2,v3 FROM exist_tb_3 WHERE v1 = "s" AND v2 = "s" AND id = 20 ORDER BY v2`)), result: sqlmock.NewRows(explainColumns).AddRow(explainTypeAll, "exist_tb_3"), + }, { + query: regexp.QuoteMeta(showWarnings), + result: sqlmock.NewRows([]string{"Level", "Code", "Message"}), }, { query: regexp.QuoteMeta(`SELECT COUNT`), result: sqlmock.NewRows([]string{"id", "v1", "v2", "v3"}).AddRow(100.00, 23.56, 70.12, 80.98), @@ -377,6 +426,9 @@ func TestThreeStarOptimize(t *testing.T) { { query: regexp.QuoteMeta(fmt.Sprintf(explainFormat, `SELECT id,v1,v2,v3 FROM exist_tb_3 WHERE v1 = "s" AND v2 = "s" AND id <= 20 ORDER BY v3`)), result: sqlmock.NewRows(explainColumns).AddRow(explainTypeAll, "exist_tb_3"), + }, { + query: regexp.QuoteMeta(showWarnings), + result: sqlmock.NewRows([]string{"Level", "Code", "Message"}), }, { query: regexp.QuoteMeta(`SELECT COUNT`), result: sqlmock.NewRows([]string{"id", "v1", "v2", "v3"}).AddRow(100.00, 23.56, 70.12, 80.98), @@ -393,6 +445,9 @@ func TestThreeStarOptimize(t *testing.T) { { query: regexp.QuoteMeta(fmt.Sprintf(explainFormat, `SELECT id,v1,v2,v3 FROM exist_tb_3 WHERE v1 = "s" AND v3 = "6" AND v2 = "s" OR id = 3 ORDER BY v3`)), result: sqlmock.NewRows(explainColumns).AddRow(explainTypeAll, "exist_tb_3"), + }, { + query: regexp.QuoteMeta(showWarnings), + result: sqlmock.NewRows([]string{"Level", "Code", "Message"}), }, { query: regexp.QuoteMeta(`SELECT COUNT`), result: sqlmock.NewRows([]string{"id", "v1", "v2", "v3"}).AddRow(100.00, 23.56, 70.12, 80.98), @@ -406,6 +461,9 @@ func TestThreeStarOptimize(t *testing.T) { { query: regexp.QuoteMeta(fmt.Sprintf(explainFormat, `SELECT id,v1,v2,v3 FROM exist_tb_3 WHERE v1 = "s" AND v3 = "6" AND v2 = "s" OR id = 3 ORDER BY v3`)), result: sqlmock.NewRows(explainColumns).AddRow(explainTypeAll, "exist_tb_3"), + }, { + query: regexp.QuoteMeta(showWarnings), + result: sqlmock.NewRows([]string{"Level", "Code", "Message"}), }, { query: regexp.QuoteMeta(`SELECT COUNT`), result: sqlmock.NewRows([]string{"id", "v1", "v2", "v3"}).AddRow(100.00, 23.56, 70.12, 80.98), @@ -422,6 +480,9 @@ func TestThreeStarOptimize(t *testing.T) { { query: regexp.QuoteMeta(fmt.Sprintf(explainFormat, `SELECT * FROM exist_tb_3 WHERE v1 = "s" AND v3 = "6" AND v2 = "s" OR id = 3 ORDER BY v3`)), result: sqlmock.NewRows(explainColumns).AddRow(explainTypeAll, "exist_tb_3"), + }, { + query: regexp.QuoteMeta(showWarnings), + result: sqlmock.NewRows([]string{"Level", "Code", "Message"}), }, { query: regexp.QuoteMeta(`SELECT COUNT`), result: sqlmock.NewRows([]string{"id", "v1", "v2", "v3"}).AddRow(100.00, 23.56, 70.12, 80.98), @@ -438,6 +499,9 @@ func TestThreeStarOptimize(t *testing.T) { { query: regexp.QuoteMeta(fmt.Sprintf(explainFormat, `SELECT id,v1,v2,v3 FROM exist_tb_10 WHERE (v1 in (1,2,3,4,5,6))`)), result: sqlmock.NewRows(explainColumns).AddRow(explainTypeAll, "exist_tb_10"), + }, { + query: regexp.QuoteMeta(showWarnings), + result: sqlmock.NewRows([]string{"Level", "Code", "Message"}), }, { query: regexp.QuoteMeta(`SELECT COUNT`), result: sqlmock.NewRows([]string{"id", "v1", "v2", "v3", "v4", "v5"}).AddRow(100.00, 23.56, 70.12, 80.98, 23.4, 21.2), @@ -454,6 +518,9 @@ func TestThreeStarOptimize(t *testing.T) { { query: regexp.QuoteMeta(fmt.Sprintf(explainFormat, `SELECT id,v1,v2 FROM exist_tb_10 WHERE v3 = "text" AND v1 in (1,2,3,4,5,6)`)), result: sqlmock.NewRows(explainColumns).AddRow(explainTypeAll, "exist_tb_10"), + }, { + query: regexp.QuoteMeta(showWarnings), + result: sqlmock.NewRows([]string{"Level", "Code", "Message"}), }, { query: regexp.QuoteMeta(`SELECT COUNT`), result: sqlmock.NewRows([]string{"id", "v1", "v2", "v3", "v4", "v5"}).AddRow(100.00, 23.56, 70.12, 80.98, 23.4, 21.2), @@ -470,6 +537,9 @@ func TestThreeStarOptimize(t *testing.T) { { query: regexp.QuoteMeta(fmt.Sprintf(explainFormat, `SELECT id,v1,v2 FROM exist_tb_10 WHERE v5 = 1 AND v1 in (1,2,3,4,5,6)`)), result: sqlmock.NewRows(explainColumns).AddRow(explainTypeAll, "exist_tb_10"), + }, { + query: regexp.QuoteMeta(showWarnings), + result: sqlmock.NewRows([]string{"Level", "Code", "Message"}), }, { query: regexp.QuoteMeta(`SELECT COUNT`), result: sqlmock.NewRows([]string{"id", "v1", "v2", "v3", "v4", "v5"}).AddRow(100.00, 23.56, 70.12, 2, 23.4, 2), @@ -486,6 +556,9 @@ func TestThreeStarOptimize(t *testing.T) { { query: regexp.QuoteMeta(fmt.Sprintf(explainFormat, `SELECT t10.id,t10.v1,t10.v2,t3.v3 FROM exist_tb_10 t10 LEFT JOIN exist_tb_3 t3 ON t10.id = t3.id WHERE t10.v5 = t3.v3 AND t10.v1 in (1,2,3,4,5,6)`)), result: sqlmock.NewRows(explainColumns).AddRow(explainTypeAll, "exist_tb_10"), + }, { + query: regexp.QuoteMeta(showWarnings), + result: sqlmock.NewRows([]string{"Level", "Code", "Message"}), }, { query: regexp.QuoteMeta(`SELECT COUNT`), result: sqlmock.NewRows([]string{"id", "v1", "v2", "v3", "v4", "v5"}).AddRow(100.00, 23.56, 70.12, 2, 23.4, 30.1), @@ -502,6 +575,9 @@ func TestThreeStarOptimize(t *testing.T) { { query: regexp.QuoteMeta(fmt.Sprintf(explainFormat, `SELECT v1 FROM exist_tb_1 where v2 IN (SELECT v2 FROM exist_tb_10 WHERE id > 10);`)), result: sqlmock.NewRows(explainColumns).AddRow(explainTypeAll, "exist_tb_10"), + }, { + query: regexp.QuoteMeta(showWarnings), + result: sqlmock.NewRows([]string{"Level", "Code", "Message"}), }, { query: regexp.QuoteMeta(`SELECT COUNT`), result: sqlmock.NewRows([]string{"id", "v1", "v2", "v3", "v4", "v5"}).AddRow(100.00, 23.56, 70.12, 2, 23.4, 30.1), @@ -515,6 +591,9 @@ func TestThreeStarOptimize(t *testing.T) { { query: regexp.QuoteMeta(fmt.Sprintf(explainFormat, `SELECT v5,t1.* FROM exist_tb_1 t1 LEFT JOIN exist_tb_10 t10 on t1.id = t10.id;`)), result: sqlmock.NewRows(explainColumns).AddRow(explainTypeAll, "exist_tb_10"), + }, { + query: regexp.QuoteMeta(showWarnings), + result: sqlmock.NewRows([]string{"Level", "Code", "Message"}), }, { query: regexp.QuoteMeta(`SELECT COUNT`), result: sqlmock.NewRows([]string{"id", "v1", "v2", "v3", "v4", "v5"}).AddRow(100.00, 23.56, 70.12, 2, 23.4, 30.1), @@ -531,6 +610,9 @@ func TestThreeStarOptimize(t *testing.T) { { query: regexp.QuoteMeta(fmt.Sprintf(explainFormat, `SELECT v5,t11.* FROM exist_tb_1 t1 LEFT JOIN exist_tb_11 t11 on t1.id = t11.id;`)), result: sqlmock.NewRows(explainColumns).AddRow(explainTypeAll, "exist_tb_11"), + }, { + query: regexp.QuoteMeta(showWarnings), + result: sqlmock.NewRows([]string{"Level", "Code", "Message"}), }, { query: regexp.QuoteMeta(`SELECT COUNT`), result: sqlmock.NewRows([]string{"id", "create_time", "upgrade_time", "year_time", "data_time", "data_time2"}).AddRow(100.00, 78.56, 72.12, 12.0, 67.9, 45.1), @@ -552,6 +634,9 @@ func TestExtremalOptimize(t *testing.T) { { query: regexp.QuoteMeta(fmt.Sprintf(explainFormat, `SELECT MIN(v3),MAX(v2) FROM exist_tb_1 WHERE v1 = "s" GROUP BY v2`)), result: sqlmock.NewRows(explainColumns).AddRow(explainTypeAll, drivingTable), + }, { + query: regexp.QuoteMeta(showWarnings), + result: sqlmock.NewRows([]string{"Level", "Code", "Message"}), }, }, expectResults: []*OptimizeResult{ @@ -566,6 +651,9 @@ func TestExtremalOptimize(t *testing.T) { { query: regexp.QuoteMeta(fmt.Sprintf(explainFormat, `SELECT v1,MIN(v2) FROM exist_tb_1 WHERE v1 = "s" GROUP BY v1`)), result: sqlmock.NewRows(explainColumns).AddRow(explainTypeAll, drivingTable), + }, { + query: regexp.QuoteMeta(showWarnings), + result: sqlmock.NewRows([]string{"Level", "Code", "Message"}), }, }, expectResults: []*OptimizeResult{ @@ -579,6 +667,9 @@ func TestExtremalOptimize(t *testing.T) { { query: regexp.QuoteMeta(fmt.Sprintf(explainFormat, `SELECT MAX(v1),MIN(v2) FROM exist_tb_1 WHERE v1 = "s" GROUP BY v1`)), result: sqlmock.NewRows(explainColumns).AddRow(explainTypeAll, drivingTable), + }, { + query: regexp.QuoteMeta(showWarnings), + result: sqlmock.NewRows([]string{"Level", "Code", "Message"}), }, }, expectResults: []*OptimizeResult{ @@ -592,6 +683,9 @@ func TestExtremalOptimize(t *testing.T) { { query: regexp.QuoteMeta(fmt.Sprintf(explainFormat, `SELECT v1,v2 FROM exist_tb_1 WHERE v1 = "s" GROUP BY v1`)), result: sqlmock.NewRows(explainColumns).AddRow(explainTypeAll, drivingTable), + }, { + query: regexp.QuoteMeta(showWarnings), + result: sqlmock.NewRows([]string{"Level", "Code", "Message"}), }, }, maxColumn: 4, @@ -602,6 +696,9 @@ func TestExtremalOptimize(t *testing.T) { { query: regexp.QuoteMeta(fmt.Sprintf(explainFormat, `SELECT MAX(v1) FROM exist_tb_1 WHERE v1 = "s" GROUP BY v1`)), result: sqlmock.NewRows(explainColumns).AddRow(explainTypeAll, drivingTable), + }, { + query: regexp.QuoteMeta(showWarnings), + result: sqlmock.NewRows([]string{"Level", "Code", "Message"}), }, }, maxColumn: 1, @@ -617,6 +714,9 @@ func TestJoinOptimize(t *testing.T) { { query: regexp.QuoteMeta(fmt.Sprintf(explainFormat, `SELECT t1.v1, t1.v2 FROM exist_tb_1 t1 JOIN exist_tb_2 t2 ON t1.v1 = t2.v1 WHERE t1.v1 = "s"`)), result: sqlmock.NewRows(explainColumns).AddRow(explainTypeAll, "t1").AddRow(explainTypeAll, "t2"), + }, { + query: regexp.QuoteMeta(showWarnings), + result: sqlmock.NewRows([]string{"Level", "Code", "Message"}), }, }, maxColumn: 1, @@ -630,6 +730,9 @@ func TestJoinOptimize(t *testing.T) { { query: regexp.QuoteMeta(fmt.Sprintf(explainFormat, `SELECT t1.v1, t1.v2 FROM exist_tb_1 t1 JOIN exist_tb_2 t2 USING(v1) WHERE t1.v1 = "s"`)), result: sqlmock.NewRows(explainColumns).AddRow(explainTypeAll, "t1").AddRow(explainTypeAll, "t2"), + }, { + query: regexp.QuoteMeta(showWarnings), + result: sqlmock.NewRows([]string{"Level", "Code", "Message"}), }, }, maxColumn: 1, @@ -643,6 +746,9 @@ func TestJoinOptimize(t *testing.T) { { query: regexp.QuoteMeta(fmt.Sprintf(explainFormat, `SELECT t1.v1, t1.v2 FROM exist_tb_1 t1 JOIN exist_tb_2 t2 WHERE t1.v1 = "s"`)), result: sqlmock.NewRows(explainColumns).AddRow(explainTypeAll, "t1").AddRow(explainTypeAll, "t2"), + }, { + query: regexp.QuoteMeta(showWarnings), + result: sqlmock.NewRows([]string{"Level", "Code", "Message"}), }, }, maxColumn: 1, diff --git a/sqle/driver/mysql/audit_test.go b/sqle/driver/mysql/audit_test.go index e8aabbbde..8224cf2d9 100644 --- a/sqle/driver/mysql/audit_test.go +++ b/sqle/driver/mysql/audit_test.go @@ -4333,11 +4333,11 @@ func TestCheckIndexOption(t *testing.T) { assert.NoError(t, err) inspect1 := NewMockInspect(e) - handler.ExpectQuery(regexp.QuoteMeta("SELECT COUNT( DISTINCT ( `v1` ) ) / COUNT( * ) * 100 AS 'v1' FROM (SELECT `v1` FROM `exist_db`.`exist_tb_3` LIMIT 50000) t;")). + handler.ExpectQuery(regexp.QuoteMeta("SELECT COUNT( DISTINCT ( `v1` ) ) / COUNT( * ) * 100 AS 'v1' FROM (SELECT `v1` FROM `exist_db`.`exist_tb_2` LIMIT 50000) t;")). WillReturnRows( sqlmock.NewRows([]string{"v1"}).AddRow("100.0000"), ) - runSingleRuleInspectCase(rule, t, "", inspect1, "alter table exist_tb_3 add primary key (v1);", newTestResult()) + runSingleRuleInspectCase(rule, t, "", inspect1, "alter table exist_tb_2 add primary key (v1);", newTestResult()) inspect2 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("SELECT COUNT( DISTINCT ( `v1` ) ) / COUNT( * ) * 100 AS 'v1' FROM (SELECT `v1` FROM `exist_db`.`exist_tb_3` LIMIT 50000) t;")). @@ -4378,26 +4378,32 @@ func Test_CheckExplain_ShouldError(t *testing.T) { handler.ExpectQuery(regexp.QuoteMeta("select * from exist_tb_1")). WillReturnRows(sqlmock.NewRows([]string{"type", "rows"}). AddRow("ALL", "10001")) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) runSingleRuleInspectCase(rulepkg.RuleHandlerMap[rulepkg.DMLCheckExplainAccessTypeAll].Rule, t, "", inspect1, "select * from exist_tb_1", newTestResult().addResult(rulepkg.DMLCheckExplainAccessTypeAll, 10001)) inspect2 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("select * from exist_tb_1")). WillReturnRows(sqlmock.NewRows([]string{"type", "rows", "Extra"}). AddRow("ALL", "10", executor.ExplainRecordExtraUsingTemporary)) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) runSingleRuleInspectCase(rulepkg.RuleHandlerMap[rulepkg.DMLCheckExplainExtraUsingTemporary].Rule, t, "", inspect2, "select * from exist_tb_1", newTestResult().addResult(rulepkg.DMLCheckExplainExtraUsingTemporary)) inspect3 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("select * from exist_tb_1")). WillReturnRows(sqlmock.NewRows([]string{"type", "rows", "Extra"}). AddRow("ALL", "10", executor.ExplainRecordExtraUsingFilesort)) - + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) runSingleRuleInspectCase(rulepkg.RuleHandlerMap[rulepkg.DMLCheckExplainExtraUsingFilesort].Rule, t, "", inspect3, "select * from exist_tb_1", newTestResult().addResult(rulepkg.DMLCheckExplainExtraUsingFilesort)) inspect4 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("select * from exist_tb_1")). WillReturnRows(sqlmock.NewRows([]string{"type", "rows", "Extra"}). AddRow("ALL", "100001", strings.Join([]string{executor.ExplainRecordExtraUsingFilesort, executor.ExplainRecordExtraUsingTemporary}, ";"))) - + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) ruleDMLCheckExplainExtraUsingFilesort := rulepkg.RuleHandlerMap[rulepkg.DMLCheckExplainExtraUsingFilesort].Rule ruleDMLCheckExplainExtraUsingTemporary := rulepkg.RuleHandlerMap[rulepkg.DMLCheckExplainExtraUsingTemporary].Rule ruleDMLCheckExplainAccessTypeAll := rulepkg.RuleHandlerMap[rulepkg.DMLCheckExplainAccessTypeAll].Rule @@ -4414,15 +4420,18 @@ func Test_CheckExplain_ShouldError(t *testing.T) { handler.ExpectQuery(regexp.QuoteMeta("select * from exist_tb_1")). WillReturnRows(sqlmock.NewRows([]string{"type", "rows"}). AddRow("ALL", "100001")) - + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) handler.ExpectQuery(regexp.QuoteMeta("select * from exist_tb_1 where id = 1;")). WillReturnRows(sqlmock.NewRows([]string{"Extra"}). AddRow(executor.ExplainRecordExtraUsingFilesort)) - + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) handler.ExpectQuery(regexp.QuoteMeta("select * from exist_tb_1 where id = 2;")). WillReturnRows(sqlmock.NewRows([]string{"Extra"}). AddRow(executor.ExplainRecordExtraUsingTemporary)) - + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) inspect5.rules = []*driverV2.Rule{ &ruleDMLCheckExplainExtraUsingFilesort, &ruleDMLCheckExplainExtraUsingTemporary, @@ -4434,18 +4443,24 @@ func Test_CheckExplain_ShouldError(t *testing.T) { inspect6 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("select * from exist_tb_2")). WillReturnRows(sqlmock.NewRows([]string{"type"}).AddRow(executor.ExplainRecordAccessTypeIndex)) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) runSingleRuleInspectCase(rulepkg.RuleHandlerMap[rulepkg.DMLCheckExplainFullIndexScan].Rule, t, "", inspect6, "select * from exist_tb_2", newTestResult().addResult(rulepkg.DMLCheckExplainFullIndexScan)) inspect7 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("select * from exist_tb_2")). WillReturnRows(sqlmock.NewRows([]string{"Extra"}).AddRow(executor.ExplainRecordExtraUsingIndexForSkipScan)) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) runSingleRuleInspectCase(rulepkg.RuleHandlerMap[rulepkg.DMLCheckExplainExtraUsingIndexForSkipScan].Rule, t, "", inspect7, "select * from exist_tb_2", newTestResult().addResult(rulepkg.DMLCheckExplainExtraUsingIndexForSkipScan)) inspect8 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("select * from exist_tb_2 where v1='a'")). WillReturnRows(sqlmock.NewRows([]string{"key", "Extra"}).AddRow("", "Using where")) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) runSingleRuleInspectCase(rulepkg.RuleHandlerMap[rulepkg.DMLCheckExplainUsingIndex].Rule, t, "", inspect8, "select * from exist_tb_2 where v1='a'", newTestResult().addResult(rulepkg.DMLCheckExplainUsingIndex)) @@ -6334,6 +6349,8 @@ func TestDMLCheckIndexSelectivity(t *testing.T) { inspect1 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("select * from exist_tb_6")). WillReturnRows(sqlmock.NewRows([]string{"key", "table"}).AddRow("v1", "exist_tb_6")) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) handler.ExpectQuery(regexp.QuoteMeta(`SELECT (s.CARDINALITY / t.TABLE_ROWS) * 100 AS INDEX_SELECTIVITY,s.INDEX_NAME FROM INFORMATION_SCHEMA.STATISTICS s JOIN INFORMATION_SCHEMA.TABLES t ON s.TABLE_SCHEMA = t.TABLE_SCHEMA AND s.TABLE_NAME = t.TABLE_NAME WHERE (s.TABLE_SCHEMA , s.TABLE_NAME , s.INDEX_NAME) IN (('exist_db', 'exist_tb_6', 'v1'));`)). WillReturnRows( sqlmock.NewRows([]string{"INDEX_SELECTIVITY", "INDEX_NAME"}).AddRow("50.0000", "v1"), @@ -6343,6 +6360,8 @@ func TestDMLCheckIndexSelectivity(t *testing.T) { inspect2 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("select * from exist_tb_6 where id in (select id from exist_tb_6 where v1='10')")). WillReturnRows(sqlmock.NewRows([]string{"key", "table"}).AddRow("v1", "exist_tb_6").AddRow("primary", "exist_tb_6")) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) handler.ExpectQuery(regexp.QuoteMeta(`SELECT (s.CARDINALITY / t.TABLE_ROWS) * 100 AS INDEX_SELECTIVITY,s.INDEX_NAME FROM INFORMATION_SCHEMA.STATISTICS s JOIN INFORMATION_SCHEMA.TABLES t ON s.TABLE_SCHEMA = t.TABLE_SCHEMA AND s.TABLE_NAME = t.TABLE_NAME WHERE (s.TABLE_SCHEMA , s.TABLE_NAME , s.INDEX_NAME) IN (('exist_db', 'exist_tb_6', 'v1'));`)). WillReturnRows(sqlmock.NewRows([]string{"INDEX_SELECTIVITY", "INDEX_NAME"}). AddRow("50.0000", "v1")) @@ -6351,6 +6370,8 @@ func TestDMLCheckIndexSelectivity(t *testing.T) { inspect3 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("select * from exist_tb_6")). WillReturnRows(sqlmock.NewRows([]string{"key", "table"}).AddRow("v1", "exist_tb_6")) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) handler.ExpectQuery(regexp.QuoteMeta(`SELECT (s.CARDINALITY / t.TABLE_ROWS) * 100 AS INDEX_SELECTIVITY,s.INDEX_NAME FROM INFORMATION_SCHEMA.STATISTICS s JOIN INFORMATION_SCHEMA.TABLES t ON s.TABLE_SCHEMA = t.TABLE_SCHEMA AND s.TABLE_NAME = t.TABLE_NAME WHERE (s.TABLE_SCHEMA , s.TABLE_NAME , s.INDEX_NAME) IN (('exist_db', 'exist_tb_6', 'v1'));`)). WillReturnRows(sqlmock.NewRows([]string{"INDEX_SELECTIVITY", "INDEX_NAME"}). AddRow("80.0000", "v1")) @@ -6359,6 +6380,8 @@ func TestDMLCheckIndexSelectivity(t *testing.T) { inspect4 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("select * from exist_tb_6 where id in (select id from exist_tb_6 where v1='10')")). WillReturnRows(sqlmock.NewRows([]string{"key", "table"}).AddRow("v1", "exist_tb_6")) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) handler.ExpectQuery(regexp.QuoteMeta(`SELECT (s.CARDINALITY / t.TABLE_ROWS) * 100 AS INDEX_SELECTIVITY,s.INDEX_NAME FROM INFORMATION_SCHEMA.STATISTICS s JOIN INFORMATION_SCHEMA.TABLES t ON s.TABLE_SCHEMA = t.TABLE_SCHEMA AND s.TABLE_NAME = t.TABLE_NAME WHERE (s.TABLE_SCHEMA , s.TABLE_NAME , s.INDEX_NAME) IN (('exist_db', 'exist_tb_6', 'v1'));`)). WillReturnRows(sqlmock.NewRows([]string{"INDEX_SELECTIVITY", "INDEX_NAME"}). AddRow("80.0000", "v1")) @@ -6475,11 +6498,15 @@ func TestDMLCheckSelectRows(t *testing.T) { inspect1 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("select * from exist_tb_2 where v1 = 'a'")). WillReturnRows(sqlmock.NewRows([]string{"type"}).AddRow("range")) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) runSingleRuleInspectCase(rule, t, "", inspect1, "select * from exist_tb_2 where v1 = 'a'", newTestResult()) inspect2 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("select * from exist_tb_1")). WillReturnRows(sqlmock.NewRows([]string{"type"}).AddRow(executor.ExplainRecordAccessTypeIndex)) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) handler.ExpectQuery(regexp.QuoteMeta("SELECT COUNT(1) FROM `exist_tb_1`")). WillReturnRows(sqlmock.NewRows([]string{"COUNT(1)"}).AddRow("100")) runSingleRuleInspectCase(rule, t, "", inspect2, "select * from exist_tb_1", newTestResult()) @@ -6487,6 +6514,8 @@ func TestDMLCheckSelectRows(t *testing.T) { inspect3 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("select * from exist_tb_1 where id=1")). WillReturnRows(sqlmock.NewRows([]string{"type"}).AddRow(executor.ExplainRecordAccessTypeAll)) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) handler.ExpectQuery(regexp.QuoteMeta("SELECT COUNT(1) FROM `exist_tb_1` WHERE `id`=1")). WillReturnRows(sqlmock.NewRows([]string{"COUNT(1)"}).AddRow("100")) runSingleRuleInspectCase(rule, t, "", inspect3, "select * from exist_tb_1 where id=1", newTestResult()) @@ -6494,11 +6523,15 @@ func TestDMLCheckSelectRows(t *testing.T) { inspect4 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("select * from exist_tb_1 where id in (select id from exist_tb_2)")). WillReturnRows(sqlmock.NewRows([]string{"type"}).AddRow("ref").AddRow("ref")) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) runSingleRuleInspectCase(rule, t, "", inspect4, "select * from exist_tb_1 where id in (select id from exist_tb_2)", newTestResult()) inspect5 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("select * from exist_tb_3 where v2='b'")). WillReturnRows(sqlmock.NewRows([]string{"type"}).AddRow(executor.ExplainRecordAccessTypeIndex)) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) handler.ExpectQuery(regexp.QuoteMeta("SELECT COUNT(1) FROM `exist_tb_3` WHERE `v2`='b'")). WillReturnRows(sqlmock.NewRows([]string{"COUNT(1)"}).AddRow("100000000")) runSingleRuleInspectCase(rule, t, "", inspect5, "select * from exist_tb_3 where v2='b'", newTestResult().addResult(rulepkg.DMLCheckSelectRows)) @@ -6506,6 +6539,8 @@ func TestDMLCheckSelectRows(t *testing.T) { inspect6 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("select * from exist_tb_2 where user_id in (select v3 from exist_tb_3)")). WillReturnRows(sqlmock.NewRows([]string{"type"}).AddRow(executor.ExplainRecordAccessTypeIndex).AddRow("range")) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) handler.ExpectQuery(regexp.QuoteMeta("SELECT COUNT(1) FROM `exist_tb_2` WHERE `user_id` IN (SELECT `v3` FROM `exist_tb_3`)")). WillReturnRows(sqlmock.NewRows([]string{"COUNT(1)"}).AddRow("100000000")) runSingleRuleInspectCase(rule, t, "", inspect6, "select * from exist_tb_2 where user_id in (select v3 from exist_tb_3)", newTestResult().addResult(rulepkg.DMLCheckSelectRows)) @@ -6513,6 +6548,8 @@ func TestDMLCheckSelectRows(t *testing.T) { inspect7 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("select id, v1 as id from exist_tb_2 limit 10, 10")). WillReturnRows(sqlmock.NewRows([]string{"type"}).AddRow(executor.ExplainRecordAccessTypeIndex).AddRow("range")) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) handler.ExpectQuery(regexp.QuoteMeta("select count(*) from (SELECT 1 FROM `exist_tb_2` LIMIT 10,10) as t")). WillReturnRows(sqlmock.NewRows([]string{"count(*)"}).AddRow("100000000")) runSingleRuleInspectCase(rule, t, "", inspect7, "select id, v1 as id from exist_tb_2 limit 10, 10", newTestResult().addResult(rulepkg.DMLCheckSelectRows)) @@ -6520,6 +6557,8 @@ func TestDMLCheckSelectRows(t *testing.T) { inspect8 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("select id, v1 as id from exist_tb_2 group by id, v1")). WillReturnRows(sqlmock.NewRows([]string{"type"}).AddRow(executor.ExplainRecordAccessTypeIndex).AddRow("range")) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) handler.ExpectQuery(regexp.QuoteMeta("select count(*) from (SELECT 1 FROM `exist_tb_2` GROUP BY `id`,`v1`) as t")). WillReturnRows(sqlmock.NewRows([]string{"count(*)"}).AddRow("100000000")) runSingleRuleInspectCase(rule, t, "", inspect8, "select id, v1 as id from exist_tb_2 group by id, v1", newTestResult().addResult(rulepkg.DMLCheckSelectRows)) @@ -6527,6 +6566,8 @@ func TestDMLCheckSelectRows(t *testing.T) { inspect9 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("select id, v1 as id from exist_tb_2 limit 10, 10")). WillReturnRows(sqlmock.NewRows([]string{"type"}).AddRow(executor.ExplainRecordAccessTypeIndex).AddRow("range")) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) handler.ExpectQuery(regexp.QuoteMeta("select count(*) from (SELECT 1 FROM `exist_tb_2` LIMIT 10,10) as t")). WillReturnRows(sqlmock.NewRows([]string{"count(*)"}).AddRow("10")) runSingleRuleInspectCase(rule, t, "", inspect9, "select id, v1 as id from exist_tb_2 limit 10, 10", newTestResult()) @@ -6534,6 +6575,8 @@ func TestDMLCheckSelectRows(t *testing.T) { inspect10 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("select id, v1 as id from exist_tb_2 group by id, v1")). WillReturnRows(sqlmock.NewRows([]string{"type"}).AddRow(executor.ExplainRecordAccessTypeIndex).AddRow("range")) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) handler.ExpectQuery(regexp.QuoteMeta("select count(*) from (SELECT 1 FROM `exist_tb_2` GROUP BY `id`,`v1`) as t")). WillReturnRows(sqlmock.NewRows([]string{"count(*)"}).AddRow("10")) runSingleRuleInspectCase(rule, t, "", inspect10, "select id, v1 as id from exist_tb_2 group by id, v1", newTestResult()) @@ -6541,6 +6584,8 @@ func TestDMLCheckSelectRows(t *testing.T) { inspect11 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("select max(v1) from exist_tb_2 group by id")). WillReturnRows(sqlmock.NewRows([]string{"type"}).AddRow(executor.ExplainRecordAccessTypeIndex).AddRow("range")) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) handler.ExpectQuery(regexp.QuoteMeta("select count(*) from (SELECT 1 FROM `exist_tb_2` GROUP BY `id`) as t")). WillReturnRows(sqlmock.NewRows([]string{"count(*)"}).AddRow("10")) runSingleRuleInspectCase(rule, t, "", inspect11, "select max(v1) from exist_tb_2 group by id", newTestResult()) @@ -6548,6 +6593,8 @@ func TestDMLCheckSelectRows(t *testing.T) { inspect12 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("select max(v1) from exist_tb_2 group by id")). WillReturnRows(sqlmock.NewRows([]string{"type"}).AddRow(executor.ExplainRecordAccessTypeIndex).AddRow("range")) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) handler.ExpectQuery(regexp.QuoteMeta("select count(*) from (SELECT 1 FROM `exist_tb_2` GROUP BY `id`) as t")). WillReturnRows(sqlmock.NewRows([]string{"count(*)"}).AddRow("10000000")) runSingleRuleInspectCase(rule, t, "", inspect12, "select max(v1) from exist_tb_2 group by id", newTestResult().addResult(rulepkg.DMLCheckSelectRows)) @@ -6555,6 +6602,8 @@ func TestDMLCheckSelectRows(t *testing.T) { inspect13 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("select max(v1) as id, id from exist_tb_2 group by id")). WillReturnRows(sqlmock.NewRows([]string{"type"}).AddRow(executor.ExplainRecordAccessTypeIndex).AddRow("range")) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) handler.ExpectQuery(regexp.QuoteMeta("select count(*) from (SELECT 1 FROM `exist_tb_2` GROUP BY `id`) as t")). WillReturnRows(sqlmock.NewRows([]string{"count(*)"}).AddRow("10")) runSingleRuleInspectCase(rule, t, "", inspect13, "select max(v1) as id, id from exist_tb_2 group by id", newTestResult()) @@ -6562,6 +6611,8 @@ func TestDMLCheckSelectRows(t *testing.T) { inspect14 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("select max(v1) as id, id from exist_tb_2 group by id")). WillReturnRows(sqlmock.NewRows([]string{"type"}).AddRow(executor.ExplainRecordAccessTypeIndex).AddRow("range")) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) handler.ExpectQuery(regexp.QuoteMeta("select count(*) from (SELECT 1 FROM `exist_tb_2` GROUP BY `id`) as t")). WillReturnRows(sqlmock.NewRows([]string{"count(*)"}).AddRow("10000000")) runSingleRuleInspectCase(rule, t, "", inspect14, "select max(v1) as id, id from exist_tb_2 group by id", newTestResult().addResult(rulepkg.DMLCheckSelectRows)) @@ -6576,56 +6627,78 @@ func TestDMLCheckScanRows(t *testing.T) { inspect1 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("select * from exist_tb_2 where v1 = 'a'")). WillReturnRows(sqlmock.NewRows([]string{"rows", "type"}).AddRow("100000000000", executor.ExplainRecordAccessTypeIndex)) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) runSingleRuleInspectCase(rule, t, "", inspect1, "select * from exist_tb_2 where v1 = 'a'", newTestResult().addResult(rulepkg.DMLCheckScanRows)) inspect2 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("select * from exist_tb_2 where v1 = 'a'")). WillReturnRows(sqlmock.NewRows([]string{"rows", "type"}).AddRow("1000", executor.ExplainRecordAccessTypeIndex)) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) runSingleRuleInspectCase(rule, t, "", inspect2, "select * from exist_tb_2 where v1 = 'a'", newTestResult()) inspect3 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("select * from exist_tb_2 where v1 = 'a'")). WillReturnRows(sqlmock.NewRows([]string{"rows", "type"}).AddRow("100000000000", "const")) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) runSingleRuleInspectCase(rule, t, "", inspect3, "select * from exist_tb_2 where v1 = 'a'", newTestResult().addResult(rulepkg.DMLCheckScanRows)) inspect4 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("select * from exist_tb_2 where v1 in (select v2 from exist_tb_1)")). WillReturnRows(sqlmock.NewRows([]string{"rows", "type"}).AddRow("100", executor.ExplainRecordAccessTypeAll).AddRow("1000", executor.ExplainRecordAccessTypeAll)) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) runSingleRuleInspectCase(rule, t, "", inspect4, "select * from exist_tb_2 where v1 in (select v2 from exist_tb_1)", newTestResult()) inspect5 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("select * from exist_tb_2 where v1 in (select v2 from exist_tb_1)")). WillReturnRows(sqlmock.NewRows([]string{"rows", "type"}).AddRow("100", executor.ExplainRecordAccessTypeAll).AddRow("100000000", executor.ExplainRecordAccessTypeAll)) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) runSingleRuleInspectCase(rule, t, "", inspect5, "select * from exist_tb_2 where v1 in (select v2 from exist_tb_1)", newTestResult().addResult(rulepkg.DMLCheckScanRows)) inspect6 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("update exist_tb_2 set v1=1")). WillReturnRows(sqlmock.NewRows([]string{"rows", "type"}).AddRow("100000000", executor.ExplainRecordAccessTypeIndex)) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) runSingleRuleInspectCase(rule, t, "", inspect6, "update exist_tb_2 set v1=1", newTestResult().addResult(rulepkg.DMLCheckScanRows)) inspect7 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("update exist_tb_2 set v1=1")). WillReturnRows(sqlmock.NewRows([]string{"rows", "type"}).AddRow("100", executor.ExplainRecordAccessTypeIndex)) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) runSingleRuleInspectCase(rule, t, "", inspect7, "update exist_tb_2 set v1=1", newTestResult()) inspect8 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("update exist_tb_2 set v1=1 where v2=1")). WillReturnRows(sqlmock.NewRows([]string{"rows", "type"}).AddRow("100000000", "range")) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) runSingleRuleInspectCase(rule, t, "", inspect8, "update exist_tb_2 set v1=1 where v2=1", newTestResult().addResult(rulepkg.DMLCheckScanRows)) inspect9 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("update exist_tb_2 set v1=1 where v2=1")). WillReturnRows(sqlmock.NewRows([]string{"rows", "type"}).AddRow("100000000", executor.ExplainRecordAccessTypeIndex)) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) runSingleRuleInspectCase(rule, t, "", inspect9, "update exist_tb_2 set v1=1 where v2=1", newTestResult().addResult(rulepkg.DMLCheckScanRows)) inspect10 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("delete from exist_tb_2 where v1=1")). WillReturnRows(sqlmock.NewRows([]string{"rows", "type"}).AddRow("100000000", executor.ExplainRecordAccessTypeAll)) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) runSingleRuleInspectCase(rule, t, "", inspect10, "delete from exist_tb_2 where v1=1", newTestResult().addResult(rulepkg.DMLCheckScanRows)) inspect11 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("delete from exist_tb_2 where v1=1")). WillReturnRows(sqlmock.NewRows([]string{"rows", "type"}).AddRow("100000000", "range")) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) runSingleRuleInspectCase(rule, t, "", inspect11, "delete from exist_tb_2 where v1=1", newTestResult().addResult(rulepkg.DMLCheckScanRows)) } @@ -7577,62 +7650,86 @@ func Test_CheckSQLExplainLowestLevel(t *testing.T) { handler.ExpectQuery(regexp.QuoteMeta("select * from exist_tb_1")). WillReturnRows(sqlmock.NewRows([]string{"type"}).AddRow("ALL")) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) runSingleRuleInspectCase(rule, t, "", inspect1, "select * from exist_tb_1", newTestResult().addResult(rulepkg.DMLSQLExplainLowestLevel, param)) inspect2 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("select id from exist_tb_1")). WillReturnRows(sqlmock.NewRows([]string{"type"}).AddRow("INDEX")) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) runSingleRuleInspectCase(rule, t, "", inspect2, "select id from exist_tb_1", newTestResult().addResult(rulepkg.DMLSQLExplainLowestLevel, param)) inspect3 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("select * from exist_tb_1 where id > 1")). WillReturnRows(sqlmock.NewRows([]string{"type"}).AddRow("range")) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) runSingleRuleInspectCase(rule, t, "", inspect3, "select * from exist_tb_1 where id > 1", newTestResult()) inspect4 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("select * from exist_tb_1 where id = 1")). WillReturnRows(sqlmock.NewRows([]string{"type"}).AddRow("const")) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) runSingleRuleInspectCase(rule, t, "", inspect4, "select * from exist_tb_1 where id = 1", newTestResult()) inspect5 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("select 1")). WillReturnRows(sqlmock.NewRows([]string{"type"}).AddRow("null")) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) runSingleRuleInspectCase(rule, t, "", inspect5, "select 1", newTestResult()) inspect6 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("select * from exist_tb_1 where id >= 1")). WillReturnRows(sqlmock.NewRows([]string{"type"}).AddRow("eq_ref")) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) runSingleRuleInspectCase(rule, t, "", inspect6, "select * from exist_tb_1 where id >= 1", newTestResult()) inspect7 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("update exist_tb_1 set v1 = 'a'")). WillReturnRows(sqlmock.NewRows([]string{"type"}).AddRow("ALL")) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) runSingleRuleInspectCase(rule, t, "", inspect7, "update exist_tb_1 set v1 = 'a'", newTestResult().addResult(rulepkg.DMLSQLExplainLowestLevel, param)) inspect8 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("update exist_tb_1 set v1 = 'a' where id = 1")). WillReturnRows(sqlmock.NewRows([]string{"type"}).AddRow("const")) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) runSingleRuleInspectCase(rule, t, "", inspect8, "update exist_tb_1 set v1 = 'a' where id = 1", newTestResult()) inspect9 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("update exist_tb_1 set v1 = 'a' where id > 1")). WillReturnRows(sqlmock.NewRows([]string{"type"}).AddRow("ref")) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) runSingleRuleInspectCase(rule, t, "", inspect9, "update exist_tb_1 set v1 = 'a' where id > 1", newTestResult()) inspect10 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("delete from exist_tb_1")). WillReturnRows(sqlmock.NewRows([]string{"type"}).AddRow("ALL")) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) runSingleRuleInspectCase(rule, t, "", inspect10, "delete from exist_tb_1", newTestResult().addResult(rulepkg.DMLSQLExplainLowestLevel, param)) inspect11 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("delete from exist_tb_1 where id > 10")). WillReturnRows(sqlmock.NewRows([]string{"type"}).AddRow("ref")) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) runSingleRuleInspectCase(rule, t, "", inspect11, "delete from exist_tb_1 where id > 10", newTestResult()) inspect12 := NewMockInspect(e) handler.ExpectQuery(regexp.QuoteMeta("delete from exist_tb_1 where id = 10")). WillReturnRows(sqlmock.NewRows([]string{"type"}).AddRow("const")) + handler.ExpectQuery(regexp.QuoteMeta(showWarnings)). + WillReturnRows(sqlmock.NewRows([]string{"Level", "Code", "Message"})) runSingleRuleInspectCase(rule, t, "", inspect12, "delete from exist_tb_1 where id = 10", newTestResult()) inspect13 := NewMockInspect(e) @@ -7844,7 +7941,7 @@ func TestNotAllowInsertAutoincrement(t *testing.T) { `INSERT exist_tb_1 SET id=1,v1="sqle"`, // 没有主键的自增 `INSERT INTO exist_tb_12(id,v1) VALUES(1,"sqle")`, - `INSERT INTO exist_tb_12 VALUES(1,"sqle")`, + `INSERT INTO exist_tb_12 VALUES(1,"sqle","1","sqle")`, `INSERT INTO exist_tb_12(id) SELECT id FROM exist_tb_2 WHERE id=1`, `UPDATE exist_tb_12 SET id=1 WHERE id=2`, `INSERT exist_tb_12 SET id=1`, diff --git a/sqle/driver/mysql/pt_osc_test.go b/sqle/driver/mysql/pt_osc_test.go index 49abd4db1..0981b3bf1 100644 --- a/sqle/driver/mysql/pt_osc_test.go +++ b/sqle/driver/mysql/pt_osc_test.go @@ -19,7 +19,7 @@ func TestPTOSC(t *testing.T) { plocale.Bundle.LocalizeMsgByLang(language.Chinese, plocale.PTOSCAvoidNoDefaultValueOnNotNullColumn)) runOSCCase(t, "not pk and unique key", - "alter table exist_tb_3 add column v3 varchar(255);", + "alter table exist_tb_13 add column v4 varchar(255);", plocale.Bundle.LocalizeMsgByLang(language.Chinese, plocale.PTOSCNoUniqueIndexOrPrimaryKey)) runOSCCase(t, "rename table", diff --git a/sqle/driver/mysql/session/context.go b/sqle/driver/mysql/session/context.go index 7254a42aa..1ade61600 100644 --- a/sqle/driver/mysql/session/context.go +++ b/sqle/driver/mysql/session/context.go @@ -1094,6 +1094,10 @@ func (c *Context) GetExecutionPlan(sql string) ([]*executor.ExplainRecord, error return ep.Plan, nil } + if c.e == nil { + return nil, nil + } + r, err := c.fetchExecutionPlanWithWarnings(sql) if err != nil { return nil, err diff --git a/sqle/driver/mysql/session/mock_context.go b/sqle/driver/mysql/session/mock_context.go index 49fa558ee..25deea7cf 100644 --- a/sqle/driver/mysql/session/mock_context.go +++ b/sqle/driver/mysql/session/mock_context.go @@ -97,6 +97,12 @@ func NewMockContext(e *executor.Executor) *Context { Size: 1, OriginalTable: getTestCreateTableStmt12(), }, + "exist_tb_13": { + sizeLoad: true, + isLoad: true, + Size: 1, + OriginalTable: getTestCreateTableStmt13(), + }, }, }, "myisam_utf8_db": { @@ -286,6 +292,12 @@ func NewMockContextForTestTableSize(e *executor.Executor, tableSize map[string] Size: float64(tableSize["exist_tb_12"]), OriginalTable: getTestCreateTableStmt12(), }, + "exist_tb_13": { + sizeLoad: true, + isLoad: true, + Size: float64(tableSize["exist_tb_13"]), + OriginalTable: getTestCreateTableStmt13(), + }, }, }, "myisam_utf8_db": { @@ -550,6 +562,21 @@ PRIMARY KEY (id) USING BTREE stmt, _ := node.(*ast.CreateTableStmt) return stmt } +func getTestCreateTableStmt13() *ast.CreateTableStmt { + baseCreateQuery := ` +CREATE TABLE exist_db.exist_tb_13 ( +id bigint(10) unsigned NOT NULL AUTO_INCREMENT COMMENT "unit test", +v1 blob, +v2 int +)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT="unit test"; +` + node, err := util.ParseOneSql(baseCreateQuery) + if err != nil { + panic(err) + } + stmt, _ := node.(*ast.CreateTableStmt) + return stmt +} type AIMockContext struct { createContextSqls []string diff --git a/sqle/driver/mysql/util/visitor_test.go b/sqle/driver/mysql/util/visitor_test.go index 45ad01ad7..63882b8ff 100644 --- a/sqle/driver/mysql/util/visitor_test.go +++ b/sqle/driver/mysql/util/visitor_test.go @@ -207,7 +207,7 @@ func TestWhereStmtNotAlwaysTrue(t *testing.T) { t.Run(tt.input, func(t *testing.T) { stmt, err := parser.New().ParseOneStmt(tt.input, "", "") assert.NoError(t, err) - got := WhereStmtNotAlwaysTrue(stmt.(*ast.SelectStmt).Where) + got := !WhereStmtNotAlwaysTrue(stmt.(*ast.SelectStmt).Where) assert.Equal(t, tt.want, got) }) }