Skip to content

Commit 82a4fd8

Browse files
committed
Merge branch 'main' into zachmu/aggs
2 parents f30849b + 8c883e3 commit 82a4fd8

32 files changed

+574
-186
lines changed

_example/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ func main() {
7373
Protocol: "tcp",
7474
Address: fmt.Sprintf("%s:%d", address, port),
7575
}
76-
s, err := server.NewServer(config, engine, memory.NewSessionBuilder(pro), nil)
76+
s, err := server.NewServer(config, engine, sql.NewContext, memory.NewSessionBuilder(pro), nil)
7777
if err != nil {
7878
panic(err)
7979
}

engine.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,9 @@ func (e *Engine) PrepareParsedQuery(
240240
statementKey, query string,
241241
stmt sqlparser.Statement,
242242
) (sql.Node, error) {
243+
// Make sure there is an active transaction if one hasn't been started yet
244+
e.beginTransaction(ctx)
245+
243246
binder := planbuilder.New(ctx, e.Analyzer.Catalog, e.EventScheduler, e.Parser)
244247
node, _, err := binder.BindOnly(stmt, query, nil)
245248

@@ -265,6 +268,9 @@ func clearWarnings(ctx *sql.Context, node sql.Node) {
265268
case *plan.Offset, *plan.Limit:
266269
// `show warning limit x offset y` is valid, so we need to recurse
267270
clearWarnings(ctx, n.Children()[0])
271+
case *plan.Set:
272+
// We want to maintain warnings when setting the warnings_lock variable.
273+
// Set statements also can't produce warnings, so we don't care about clearing them.
268274
case plan.ShowWarnings:
269275
// ShowWarnings should not clear the warnings, but should still reset the warning count.
270276
ctx.ClearWarningCount()

enginetest/enginetests.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1907,7 +1907,7 @@ func TestComplexIndexQueriesPrepared(t *testing.T, harness Harness) {
19071907
}
19081908

19091909
func TestJsonScriptsPrepared(t *testing.T, harness Harness, skippedTests []string) {
1910-
harness.Setup(setup.MydbData)
1910+
harness.Setup(setup.MydbData, setup.BlobData)
19111911
for _, script := range queries.JsonScripts {
19121912
for _, skippedTest := range skippedTests {
19131913
if strings.Contains(script.Name, skippedTest) {
@@ -5154,13 +5154,16 @@ func TestNullRanges(t *testing.T, harness Harness) {
51545154
}
51555155

51565156
func TestJsonScripts(t *testing.T, harness Harness, skippedTests []string) {
5157+
harness.Setup(setup.MydbData, setup.BlobData)
51575158
for _, script := range queries.JsonScripts {
5158-
for _, skippedTest := range skippedTests {
5159-
if strings.Contains(script.Name, skippedTest) {
5160-
t.Skip()
5159+
t.Run(script.Name, func(t *testing.T) {
5160+
for _, skippedTest := range skippedTests {
5161+
if strings.Contains(script.Name, skippedTest) {
5162+
t.Skip()
5163+
}
51615164
}
5162-
}
5163-
TestScript(t, harness, script)
5165+
TestScript(t, harness, script)
5166+
})
51645167
}
51655168
}
51665169

enginetest/evaluation.go

Lines changed: 46 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -269,12 +269,23 @@ func TestTransactionScript(t *testing.T, harness Harness, script queries.Transac
269269
harness.Setup(setup.MydbData)
270270
e := mustNewEngine(t, harness)
271271
defer e.Close()
272-
TestTransactionScriptWithEngine(t, e, harness, script)
272+
TestTransactionScriptWithEngine(t, e, harness, script, false)
273273
})
274274
}
275275

276-
// TestTransactionScriptWithEngine runs the transaction test script given with the engine provided.
277-
func TestTransactionScriptWithEngine(t *testing.T, e QueryEngine, harness Harness, script queries.TransactionTest) {
276+
// TestTransactionScriptPrepared runs the test script given using prepared statements.
277+
func TestTransactionScriptPrepared(t *testing.T, harness Harness, script queries.TransactionTest) bool {
278+
return t.Run(script.Name, func(t *testing.T) {
279+
harness.Setup(setup.MydbData)
280+
e := mustNewEngine(t, harness)
281+
defer e.Close()
282+
TestTransactionScriptWithEngine(t, e, harness, script, true)
283+
})
284+
}
285+
286+
// TestTransactionScriptWithEngine runs the transaction test script given with the engine provided. If |prepared| is true
287+
// then the queries will be prepared and then executed, otherwise they will be executed directly.
288+
func TestTransactionScriptWithEngine(t *testing.T, e QueryEngine, harness Harness, script queries.TransactionTest, prepared bool) {
278289
setupSession := NewSession(harness)
279290
for _, statement := range script.SetUpScript {
280291
if sh, ok := harness.(SkippingHarness); ok {
@@ -307,17 +318,40 @@ func TestTransactionScriptWithEngine(t *testing.T, e QueryEngine, harness Harnes
307318
}
308319

309320
if assertion.ExpectedErr != nil {
310-
AssertErrWithCtx(t, e, harness, clientSession, assertion.Query, assertion.Bindings, assertion.ExpectedErr)
321+
if prepared {
322+
AssertErrPreparedWithCtx(t, e, harness, clientSession, assertion.Query, assertion.ExpectedErr)
323+
} else {
324+
AssertErrWithCtx(t, e, harness, clientSession, assertion.Query, assertion.Bindings, assertion.ExpectedErr)
325+
}
311326
} else if assertion.ExpectedErrStr != "" {
312-
AssertErrWithCtx(t, e, harness, clientSession, assertion.Query, assertion.Bindings, nil, assertion.ExpectedErrStr)
327+
if prepared {
328+
AssertErrPreparedWithCtx(t, e, harness, clientSession, assertion.Query, nil, assertion.ExpectedErrStr)
329+
} else {
330+
AssertErrWithCtx(t, e, harness, clientSession, assertion.Query, assertion.Bindings, nil, assertion.ExpectedErrStr)
331+
}
313332
} else if assertion.ExpectedWarning != 0 {
314-
AssertWarningAndTestQuery(t, e, nil, harness, assertion.Query, assertion.Expected,
315-
nil, assertion.ExpectedWarning, assertion.ExpectedWarningsCount,
316-
assertion.ExpectedWarningMessageSubstring, false)
333+
if prepared {
334+
// TODO: Looks like we don't have a prepared version of this yet
335+
AssertWarningAndTestQuery(t, e, nil, harness, assertion.Query, assertion.Expected,
336+
nil, assertion.ExpectedWarning, assertion.ExpectedWarningsCount,
337+
assertion.ExpectedWarningMessageSubstring, false)
338+
} else {
339+
AssertWarningAndTestQuery(t, e, nil, harness, assertion.Query, assertion.Expected,
340+
nil, assertion.ExpectedWarning, assertion.ExpectedWarningsCount,
341+
assertion.ExpectedWarningMessageSubstring, false)
342+
}
317343
} else if assertion.SkipResultsCheck {
318-
RunQueryWithContext(t, e, harness, clientSession, assertion.Query)
344+
if prepared {
345+
runQueryPreparedWithCtx(t, clientSession, e, assertion.Query, assertion.Bindings, false)
346+
} else {
347+
RunQueryWithContext(t, e, harness, clientSession, assertion.Query)
348+
}
319349
} else {
320-
TestQueryWithContext(t, clientSession, e, harness, assertion.Query, assertion.Expected, nil, nil, nil)
350+
if prepared {
351+
TestPreparedQueryWithContext(t, clientSession, e, harness, assertion.Query, assertion.Expected, nil, nil, false)
352+
} else {
353+
TestQueryWithContext(t, clientSession, e, harness, assertion.Query, assertion.Expected, nil, nil, nil)
354+
}
321355
}
322356
})
323357
}
@@ -551,7 +585,7 @@ func injectBindVarsAndPrepare(
551585

552586
switch p := parsed.(type) {
553587
case *sqlparser.Load, *sqlparser.Prepare, *sqlparser.Execute:
554-
// LOAD DATA query cannot be used as PREPARED STATEMENT
588+
// LOAD DATA, PREPARE, and EXECUTE queries cannot be used as prepared statements
555589
return q, nil, nil
556590
case *sqlparser.Set:
557591
// SET system variable query cannot be used as PREPARED STATEMENT
@@ -564,7 +598,7 @@ func injectBindVarsAndPrepare(
564598

565599
b := planbuilder.New(ctx, e.EngineAnalyzer().Catalog, e.EngineEventScheduler(), nil)
566600
b.SetParserOptions(sql.LoadSqlMode(ctx).ParserOptions())
567-
resPlan, _, err := b.BindOnly(parsed, q, nil)
601+
resPlan, err := e.PrepareQuery(ctx, q)
568602
if err != nil {
569603
return q, nil, err
570604
}

enginetest/queries/json_scripts.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,17 @@ var JsonScripts = []ScriptTest{
126126
},
127127
},
128128
},
129+
{
130+
Name: "json_object works on text values from tables",
131+
Assertions: []ScriptTestAssertion{
132+
{
133+
Query: `select JSON_OBJECT(t, t) FROM textt where i = 1;`,
134+
Expected: []sql.Row{
135+
{types.MustJSON("{\"first row\": \"first row\"}")},
136+
},
137+
},
138+
},
139+
},
129140
{
130141
Name: "types survive round-trip into tables",
131142
SetUpScript: []string{

enginetest/queries/priv_auth_queries.go

Lines changed: 124 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1230,6 +1230,27 @@ var UserPrivTests = []UserPrivilegeTest{
12301230
Query: "SELECT User, Host, Select_priv FROM mysql.user WHERE User = 'tester';",
12311231
Expected: []sql.Row{{"tester", "localhost", "N"}},
12321232
},
1233+
1234+
{
1235+
// Re-revoking does nothing
1236+
User: "root",
1237+
Host: "localhost",
1238+
Query: "REVOKE SELECT ON *.* FROM tester@localhost;",
1239+
Expected: []sql.Row{{types.NewOkResult(0)}},
1240+
},
1241+
{
1242+
// IF EXISTS option does nothing
1243+
User: "root",
1244+
Host: "localhost",
1245+
Query: "REVOKE IF EXISTS SELECT ON *.* FROM tester@localhost;",
1246+
Expected: []sql.Row{{types.NewOkResult(0)}},
1247+
},
1248+
{
1249+
User: "root",
1250+
Host: "localhost",
1251+
Query: "SELECT User, Host, Select_priv FROM mysql.user WHERE User = 'tester';",
1252+
Expected: []sql.Row{{"tester", "localhost", "N"}},
1253+
},
12331254
},
12341255
},
12351256
{
@@ -1238,7 +1259,11 @@ var UserPrivTests = []UserPrivilegeTest{
12381259
"CREATE TABLE test (pk BIGINT PRIMARY KEY);",
12391260
"INSERT INTO test VALUES (1), (2), (3);",
12401261
"CREATE USER tester@localhost;",
1262+
"CREATE USER tester1@localhost;",
1263+
"CREATE USER tester2@localhost;",
12411264
"GRANT ALL ON *.* TO tester@localhost;",
1265+
"GRANT ALL ON *.* TO tester1@localhost WITH GRANT OPTION;",
1266+
"GRANT ALL ON *.* TO tester2@localhost WITH GRANT OPTION;",
12421267
},
12431268
Assertions: []UserPrivilegeTestAssertion{
12441269
{
@@ -1280,8 +1305,79 @@ var UserPrivTests = []UserPrivilegeTest{
12801305
{
12811306
User: "root",
12821307
Host: "localhost",
1283-
Query: "SELECT User, Host, Select_priv, Insert_priv FROM mysql.user WHERE User = 'tester';",
1284-
Expected: []sql.Row{{"tester", "localhost", "N", "N"}},
1308+
Query: "SELECT User, Host, Select_priv, Insert_priv, Grant_priv FROM mysql.user WHERE User = 'tester';",
1309+
Expected: []sql.Row{{"tester", "localhost", "N", "N", "N"}},
1310+
},
1311+
1312+
{
1313+
User: "root",
1314+
Host: "localhost",
1315+
Query: "SELECT User, Host, Select_priv, Insert_priv, Grant_priv FROM mysql.user WHERE User = 'tester1';",
1316+
Expected: []sql.Row{{"tester1", "localhost", "Y", "Y", "Y"}},
1317+
},
1318+
{
1319+
User: "root",
1320+
Host: "localhost",
1321+
Query: "REVOKE ALL, GRANT OPTION FROM tester1@localhost;",
1322+
Expected: []sql.Row{{types.NewOkResult(0)}},
1323+
},
1324+
{
1325+
User: "root",
1326+
Host: "localhost",
1327+
Query: "SELECT User, Host, Select_priv, Insert_priv, Grant_priv FROM mysql.user WHERE User = 'tester1';",
1328+
Expected: []sql.Row{{"tester1", "localhost", "N", "N", "N"}},
1329+
},
1330+
1331+
{
1332+
User: "root",
1333+
Host: "localhost",
1334+
Query: "SELECT User, Host, Select_priv, Insert_priv, Grant_priv FROM mysql.user WHERE User = 'tester2';",
1335+
Expected: []sql.Row{{"tester2", "localhost", "Y", "Y", "Y"}},
1336+
},
1337+
{
1338+
User: "root",
1339+
Host: "localhost",
1340+
Query: "REVOKE ALL PRIVILEGES, GRANT OPTION FROM tester2@localhost;",
1341+
Expected: []sql.Row{{types.NewOkResult(0)}},
1342+
},
1343+
{
1344+
User: "root",
1345+
Host: "localhost",
1346+
Query: "SELECT User, Host, Select_priv, Insert_priv, Grant_priv FROM mysql.user WHERE User = 'tester2';",
1347+
Expected: []sql.Row{{"tester2", "localhost", "N", "N", "N"}},
1348+
},
1349+
{
1350+
// Re-revoking does nothing
1351+
User: "root",
1352+
Host: "localhost",
1353+
Query: "REVOKE ALL PRIVILEGES, GRANT OPTION FROM tester2@localhost;",
1354+
Expected: []sql.Row{{types.NewOkResult(0)}},
1355+
},
1356+
{
1357+
// IF EXISTS does nothing
1358+
User: "root",
1359+
Host: "localhost",
1360+
Query: "REVOKE IF EXISTS ALL PRIVILEGES, GRANT OPTION FROM tester2@localhost;",
1361+
Expected: []sql.Row{{types.NewOkResult(0)}},
1362+
},
1363+
{
1364+
User: "root",
1365+
Host: "localhost",
1366+
Query: "SELECT User, Host, Select_priv, Insert_priv, Grant_priv FROM mysql.user WHERE User = 'tester2';",
1367+
Expected: []sql.Row{{"tester2", "localhost", "N", "N", "N"}},
1368+
},
1369+
{
1370+
User: "root",
1371+
Host: "localhost",
1372+
Query: "REVOKE IF EXISTS ALL PRIVILEGES, GRANT OPTION FROM fake1@localhost, fake2@localhost, fake3@localhost;",
1373+
ExpectedErr: sql.ErrRevokeUserDoesNotExist,
1374+
},
1375+
{
1376+
// TODO: check warnings
1377+
User: "root",
1378+
Host: "localhost",
1379+
Query: "REVOKE IF EXISTS ALL PRIVILEGES, GRANT OPTION FROM fake1@localhost, fake2@localhost, fake3@localhost IGNORE UNKNOWN USER;",
1380+
Expected: []sql.Row{{types.NewOkResult(0)}},
12851381
},
12861382
},
12871383
},
@@ -1402,6 +1498,32 @@ var UserPrivTests = []UserPrivilegeTest{
14021498
Query: "SELECT COUNT(*) FROM mysql.user WHERE User = 'tester';",
14031499
Expected: []sql.Row{{1}},
14041500
},
1501+
{
1502+
User: "root",
1503+
Host: "localhost",
1504+
Query: "REVOKE fake_role FROM tester@localhost;",
1505+
ExpectedErr: sql.ErrGrantRevokeRoleDoesNotExist,
1506+
},
1507+
{
1508+
// TODO: check for warning
1509+
User: "root",
1510+
Host: "localhost",
1511+
Query: "REVOKE IF EXISTS fake_role FROM tester@localhost;",
1512+
Expected: []sql.Row{{types.NewOkResult(0)}},
1513+
},
1514+
{
1515+
User: "root",
1516+
Host: "localhost",
1517+
Query: "REVOKE test_role FROM fake_user@localhost;",
1518+
ExpectedErr: sql.ErrGrantRevokeRoleDoesNotExist,
1519+
},
1520+
{
1521+
// TODO: check for warning
1522+
User: "root",
1523+
Host: "localhost",
1524+
Query: "REVOKE test_role FROM fake_user@localhost IGNORE UNKNOWN USER;",
1525+
Expected: []sql.Row{{types.NewOkResult(0)}},
1526+
},
14051527
},
14061528
},
14071529
{

enginetest/queries/queries.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10260,6 +10260,16 @@ from typestable`,
1026010260
{false},
1026110261
},
1026210262
},
10263+
{
10264+
Query: "explain plan select count(*) from mytable",
10265+
Expected: []sql.Row{
10266+
{"Project"},
10267+
{" ├─ columns: [count(1)]"},
10268+
{" └─ Project"},
10269+
{" ├─ columns: [mytable.COUNT(1) as COUNT(1)]"},
10270+
{" └─ table_count(mytable) as COUNT(1)"},
10271+
},
10272+
},
1026310273
{
1026410274
Query: "explain select 1",
1026510275
SkipServerEngine: true,
@@ -10268,8 +10278,7 @@ from typestable`,
1026810278
},
1026910279
},
1027010280
{
10271-
Query: "explain plan select 1",
10272-
SkipServerEngine: true,
10281+
Query: "explain plan select 1",
1027310282
Expected: []sql.Row{
1027410283
{"Project"},
1027510284
{" ├─ columns: [1]"},
@@ -10278,8 +10287,7 @@ from typestable`,
1027810287
},
1027910288
},
1028010289
{
10281-
Query: "explain format=tree select 1",
10282-
SkipServerEngine: true,
10290+
Query: "explain format=tree select 1",
1028310291
Expected: []sql.Row{
1028410292
{"Project"},
1028510293
{" ├─ columns: [1]"},

enginetest/queries/script_queries.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7900,6 +7900,31 @@ where
79007900
},
79017901
},
79027902
},
7903+
{
7904+
Name: "special case for not null default enum",
7905+
Dialect: "mysql",
7906+
SetUpScript: []string{
7907+
"create table t (i int primary key, e enum('abc', 'def', 'ghi') not null);",
7908+
},
7909+
Assertions: []ScriptTestAssertion{
7910+
{
7911+
Query: "insert into t(i) values (1)",
7912+
Expected: []sql.Row{
7913+
{types.NewOkResult(1)},
7914+
},
7915+
},
7916+
{
7917+
Query: "insert into t values (2, null)",
7918+
ExpectedErr: sql.ErrInsertIntoNonNullableProvidedNull,
7919+
},
7920+
{
7921+
Query: "select * from t;",
7922+
Expected: []sql.Row{
7923+
{1, "abc"},
7924+
},
7925+
},
7926+
},
7927+
},
79037928
{
79047929
Name: "not expression optimization",
79057930
Dialect: "mysql",

0 commit comments

Comments
 (0)