Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 21 additions & 11 deletions engine.go
Original file line number Diff line number Diff line change
Expand Up @@ -248,8 +248,24 @@ func (e *Engine) QueryNodeWithBindings(ctx *sql.Context, query string, bindings
}
}

// Give the integrator a chance to reject the session before proceeding
err = ctx.Session.ValidateSession(ctx)
if err != nil {
return nil, nil, err
}

err = e.beginTransaction(ctx)
if err != nil {
return nil, nil, err
}

parsed, err := planbuilder.Parse(ctx, e.Analyzer.Catalog, query)
if err != nil {
err2 := clearAutocommitTransaction(ctx)
if err2 != nil {
err = errors.Wrap(err, "unable to clear autocommit transaction: "+err2.Error())
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Better to return an err from here directly rather than letting happen by code outside the block

Same comment on the lines below

}

return nil, nil, err
}

Expand Down Expand Up @@ -294,27 +310,21 @@ func (e *Engine) QueryNodeWithBindings(ctx *sql.Context, query string, bindings
}
parsed, err = planbuilder.Parse(ctx, e.Analyzer.Catalog, query)
if err != nil {
err2 := clearAutocommitTransaction(ctx)
if err2 != nil {
err = errors.Wrap(err, "unable to clear autocommit transaction: "+err2.Error())
}

return nil, nil, err
}

}

// Give the integrator a chance to reject the session before proceeding
err = ctx.Session.ValidateSession(ctx)
if err != nil {
return nil, nil, err
}

err = e.readOnlyCheck(parsed)
if err != nil {
return nil, nil, err
}

err = e.beginTransaction(ctx)
if err != nil {
return nil, nil, err
}

// TODO: eventually, we should have this logic be in the RowIter() of the respective plans
// along with a new rule that handles analysis
var analyzed sql.Node
Expand Down
10 changes: 8 additions & 2 deletions enginetest/evaluation.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ func TestScriptWithEngine(t *testing.T, e *sqle.Engine, harness Harness, script
}
}
ctx := NewContext(harness).WithQuery(statement)
//ctx = NewContext(harness).WithQuery(statement)
RunQueryWithContext(t, e, harness, ctx, statement)
}

Expand Down Expand Up @@ -362,14 +363,15 @@ func injectBindVarsAndPrepare(
) (string, map[string]*querypb.BindVariable, error) {
parsed, err := sqlparser.Parse(q)
if err != nil {
return q, nil, err
return q, nil, sql.ErrSyntaxError.New(err)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this wrapping necessary here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some error tests expected this errors.Kind. I could also change the tests

}

resPlan, err := planbuilder.Parse(ctx, e.Analyzer.Catalog, q)
if err != nil {
return q, nil, err
}

b := planbuilder.New(ctx, sql.MapCatalog{})
_, isInsert := resPlan.(*plan.InsertInto)
bindVars := make(map[string]*querypb.BindVariable)
var bindCnt int
Expand All @@ -382,7 +384,6 @@ func injectBindVarsAndPrepare(
case sqlparser.HexNum, sqlparser.HexVal:
return false, nil
}
b := planbuilder.New(ctx, sql.MapCatalog{})
e := b.ConvertVal(n)
val, _, err := e.Type().Promote().Convert(e.(*expression.Literal).Value())
if err != nil {
Expand Down Expand Up @@ -414,6 +415,8 @@ func injectBindVarsAndPrepare(

buf := sqlparser.NewTrackedBuffer(nil)
parsed.Format(buf)
println(q)
println(buf.String())
e.PreparedDataCache.CacheStmt(ctx.Session.ID(), buf.String(), parsed)

_, isDatabaser := resPlan.(sql.Databaser)
Expand Down Expand Up @@ -512,6 +515,9 @@ func checkResults(
for i, row := range widenedExpected {
for j, field := range row {
if cvv, isCustom := field.(CustomValueValidator); isCustom {
if i >= len(widenedRows) {
continue
}
actual := widenedRows[i][j] // shouldn't panic, but fine if it does
ok, err := cvv.Validate(actual)
if err != nil {
Expand Down
4 changes: 0 additions & 4 deletions enginetest/queries/index_queries.go
Original file line number Diff line number Diff line change
Expand Up @@ -1883,10 +1883,6 @@ var ComplexIndexQueries = []QueryTest{
Query: `SELECT * FROM comp_index_t2 WHERE ((v1<=7 AND v2 BETWEEN 55 AND 81) OR (v1<>56 AND v2<=76 AND v3<>36)) AND (v1<56 AND v2<>69 AND v3=25);`,
Expected: []sql.Row{},
},
{
Query: ``,
Expected: []sql.Row{},
},
{
Query: `SELECT * FROM comp_index_t2 WHERE ((v1<>18) OR (v1>=42 AND v2<=65 AND v3=87 AND v4=80));`,
Expected: []sql.Row{sql.Row{41, 35, 6, 86, 74}, sql.Row{49, 43, 23, 15, 0}, sql.Row{98, 94, 43, 71, 43}, sql.Row{99, 94, 79, 53, 73}, sql.Row{22, 12, 46, 43, 23}, sql.Row{40, 34, 89, 27, 90}, sql.Row{48, 41, 21, 82, 54}, sql.Row{56, 50, 39, 26, 37}, sql.Row{76, 71, 48, 89, 99}, sql.Row{81, 76, 74, 97, 18}, sql.Row{20, 12, 0, 33, 62}, sql.Row{35, 33, 29, 69, 6}, sql.Row{52, 47, 94, 56, 21}, sql.Row{54, 50, 26, 23, 71}, sql.Row{65, 63, 50, 20, 43}, sql.Row{68, 64, 41, 74, 85}, sql.Row{72, 69, 81, 70, 37}, sql.Row{87, 84, 56, 78, 18}, sql.Row{28, 22, 21, 28, 78}, sql.Row{43, 37, 35, 6, 44}, sql.Row{90, 87, 23, 16, 63}, sql.Row{23, 15, 42, 17, 60}, sql.Row{62, 53, 48, 19, 36}, sql.Row{78, 73, 91, 56, 0}, sql.Row{82, 82, 29, 66, 71}, sql.Row{83, 82, 31, 22, 99}, sql.Row{88, 85, 2, 3, 88}, sql.Row{9, 5, 17, 52, 13}, sql.Row{21, 12, 42, 15, 31}, sql.Row{96, 91, 23, 2, 9}, sql.Row{91, 87, 66, 8, 22}, sql.Row{95, 90, 25, 0, 17}, sql.Row{67, 64, 26, 77, 97}, sql.Row{85, 83, 37, 36, 16}, sql.Row{92, 88, 57, 12, 88}, sql.Row{11, 5, 76, 70, 46}, sql.Row{17, 9, 7, 74, 92}, sql.Row{10, 5, 32, 30, 48}, sql.Row{66, 64, 23, 33, 5}, sql.Row{86, 83, 41, 53, 57}, sql.Row{0, 0, 33, 2, 67}, sql.Row{2, 1, 43, 13, 36}, sql.Row{93, 89, 1, 27, 50}, sql.Row{15, 8, 54, 46, 87}, sql.Row{31, 24, 26, 69, 25}, sql.Row{24, 17, 49, 14, 7}, sql.Row{36, 33, 53, 56, 88}, sql.Row{8, 4, 27, 77, 5}, sql.Row{14, 7, 76, 26, 47}, sql.Row{55, 50, 36, 73, 58}, sql.Row{5, 3, 31, 22, 81}, sql.Row{16, 8, 99, 43, 1}, sql.Row{39, 34, 87, 13, 51}, sql.Row{59, 51, 97, 39, 36}, sql.Row{70, 66, 97, 6, 39}, sql.Row{79, 74, 22, 42, 16}, sql.Row{89, 86, 7, 57, 96}, sql.Row{94, 89, 91, 7, 45}, sql.Row{3, 1, 72, 29, 21}, sql.Row{12, 7, 7, 66, 62}, sql.Row{29, 22, 98, 22, 21}, sql.Row{38, 34, 55, 37, 34}, sql.Row{42, 36, 7, 40, 16}, sql.Row{57, 50, 79, 10, 12}, sql.Row{74, 70, 56, 21, 22}, sql.Row{1, 0, 55, 14, 32}, sql.Row{13, 7, 21, 75, 70}, sql.Row{44, 37, 41, 36, 10}, sql.Row{46, 39, 45, 75, 55}, sql.Row{53, 48, 3, 11, 18}, sql.Row{84, 82, 70, 5, 47}, sql.Row{100, 96, 73, 38, 38}, sql.Row{34, 32, 16, 97, 29}, sql.Row{37, 33, 86, 12, 22}, sql.Row{25, 17, 75, 86, 18}, sql.Row{27, 21, 21, 32, 8}, sql.Row{30, 23, 43, 13, 11}, sql.Row{47, 41, 1, 85, 9}, sql.Row{60, 52, 72, 44, 2}, sql.Row{64, 57, 25, 97, 65}, sql.Row{7, 4, 10, 53, 69}, sql.Row{19, 10, 36, 27, 5}, sql.Row{97, 93, 56, 71, 53}, sql.Row{77, 73, 10, 2, 0}, sql.Row{45, 38, 71, 22, 37}, sql.Row{51, 45, 9, 76, 9}, sql.Row{33, 29, 72, 97, 93}, sql.Row{50, 43, 66, 85, 66}, sql.Row{58, 50, 97, 0, 79}, sql.Row{71, 67, 39, 87, 15}, sql.Row{73, 70, 40, 19, 5}, sql.Row{18, 9, 19, 38, 35}, sql.Row{32, 24, 45, 96, 0}, sql.Row{26, 20, 30, 34, 71}, sql.Row{61, 53, 6, 53, 89}, sql.Row{63, 55, 31, 29, 92}, sql.Row{69, 64, 77, 41, 17}, sql.Row{75, 71, 3, 49, 55}, sql.Row{80, 74, 35, 72, 97}, sql.Row{4, 2, 27, 1, 75}, sql.Row{6, 4, 6, 67, 80}},
Expand Down
30 changes: 30 additions & 0 deletions enginetest/queries/join_queries.go
Original file line number Diff line number Diff line change
Expand Up @@ -745,6 +745,36 @@ var JoinScriptTests = []ScriptTest{
},
},
},
{
Name: "Join with truthy condition",
SetUpScript: []string{
"CREATE TABLE `a` (aa int);",
"INSERT INTO `a` VALUES (1), (2);",

"CREATE TABLE `b` (bb int);",
"INSERT INTO `b` VALUES (1), (2);",
},
Assertions: []ScriptTestAssertion{
{
Query: "SELECT * FROM a LEFT JOIN b ON 1;",
Expected: []sql.Row{
{1, 2},
{1, 1},
{2, 2},
{2, 1},
},
},
{
Query: "SELECT * FROM a RIGHT JOIN b ON 8+9;",
Expected: []sql.Row{
{1, 2},
{1, 1},
{2, 2},
{2, 1},
},
},
},
},
}

var SkippedJoinQueryTests = []QueryTest{
Expand Down
58 changes: 58 additions & 0 deletions enginetest/queries/json_scripts.go
Original file line number Diff line number Diff line change
Expand Up @@ -569,4 +569,62 @@ var JsonScripts = []ScriptTest{
},
},
},
{
Name: "json_contains_path returns true if the path exists",
SetUpScript: []string{
`create table t (pk int primary key, col1 json);`,
`insert into t values (1, '{"a": 1}');`,
`insert into t values (2, '{"a": 1, "b": 2, "c": {"d": 4}}');`,
`insert into t values (3, '{"w": 1, "x": 2, "c": {"d": 4}}');`,
`insert into t values (4, '{}');`,
`insert into t values (5, null);`,
},

Assertions: []ScriptTestAssertion{
{
Query: "select pk, json_contains_path(col1, 'one', '$.a') from t order by pk;",
Expected: []sql.Row{
{1, true},
{2, true},
{3, false},
{4, false},
{5, nil},
},
},
{
Query: "select pk, json_contains_path(col1, 'one', '$.a', '$.x', '$.c.d') from t order by pk;",
Expected: []sql.Row{
{1, true},
{2, true},
{3, true},
{4, false},
{5, nil},
},
},
{
Query: "select pk, json_contains_path(col1, 'all', '$.a', '$.x') from t order by pk;",
Expected: []sql.Row{
{1, false},
{2, false},
{3, false},
{4, false},
{5, nil},
},
},
{
Query: "select pk, json_contains_path(col1, 'all', '$.c.d', '$.x') from t order by pk;",
Expected: []sql.Row{
{1, false},
{2, false},
{3, true},
{4, false},
{5, nil},
},
},
{
Query: "select pk, json_contains_path(col1, 'other', '$.c.d', '$.x') from t order by pk;",
ExpectedErrStr: "The oneOrAll argument to json_contains_path may take these values: 'one' or 'all'",
},
},
},
}
12 changes: 12 additions & 0 deletions enginetest/queries/query_plans.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,18 @@ type QueryPlanTest struct {
// easier to construct this way. To regenerate these plans after analyzer changes, use the TestWriteQueryPlans function
// in testgen_test.go.
var PlanTests = []QueryPlanTest{
{
Query: `select * from MYTABLE where I = 2 and s = 'first row'`,
ExpectedPlan: "Filter\n" +
" ├─ Eq\n" +
" │ ├─ mytable.s:1!null\n" +
" │ └─ first row (longtext)\n" +
" └─ IndexedTableAccess(mytable)\n" +
" ├─ index: [mytable.s,mytable.i]\n" +
" ├─ static: [{[first row, first row], [2, 2]}]\n" +
" └─ columns: [i s]\n" +
"",
},
{
Query: `select /*+ JOIN_ORDER(scalarSubq0,xy) */ count(*) from xy where y in (select distinct v from uv);`,
ExpectedPlan: "Project\n" +
Expand Down
96 changes: 86 additions & 10 deletions enginetest/queries/script_queries.go
Original file line number Diff line number Diff line change
Expand Up @@ -1200,7 +1200,7 @@ var ScriptTests = []ScriptTest{
Expected: []sql.Row{{"fabric;color"}, {"shape;color"}},
},
{
Query: "SELECT group_concat(o_id) FROM t WHERE `attribute`='color' order by o_id",
Query: "SELECT group_concat(o_id order by o_id) FROM t WHERE `attribute`='color' order by o_id",
Expected: []sql.Row{{"2,3"}},
},
{
Expand Down Expand Up @@ -1519,7 +1519,7 @@ var ScriptTests = []ScriptTest{
dcim_rackgroup.level
FROM dcim_rackgroup
order by 2 limit 1`,
Expected: []sql.Row{{1, "5c107f979f434bf7a7820622f18a5211", types.JSONDocument{Val: map[string]interface{}{}}, "Parent Rack Group 1", "parent-rack-group-1", "f0471f313b694d388c8ec39d9590e396", interface{}(nil), "", uint64(1), uint64(2), uint64(1), uint64(0)}},
Expected: []sql.Row{{1, "5c107f979f434bf7a7820622f18a5211", types.JSONDocument{Val: map[string]interface{}{}}, "Parent Rack Group 1", "parent-rack-group-1", "f0471f313b694d388c8ec39d9590e396", nil, "", uint64(1), uint64(2), uint64(1), uint64(0)}},
},
},
},
Expand Down Expand Up @@ -1832,12 +1832,6 @@ var ScriptTests = []ScriptTest{
},
},
},
{
Name: "Issue #709",
SetUpScript: []string{
"create table a(id int primary key, v int , key (v));",
},
},
{
Name: "Show create table with various keys and constraints",
SetUpScript: []string{
Expand Down Expand Up @@ -2390,7 +2384,7 @@ var ScriptTests = []ScriptTest{
{
Name: "sum() and avg() on non-DECIMAL type column returns the DOUBLE type result",
SetUpScript: []string{
"create table float_table (id int, val1 double, val2 float);",
"create table float_table (id int primary key, val1 double, val2 float);",
"insert into float_table values (1,-2.5633000000000384, 2.3);",
"insert into float_table values (2,2.5633000000000370, 2.4);",
"insert into float_table values (3,0.0000000000000004, 5.3);",
Expand All @@ -2401,7 +2395,11 @@ var ScriptTests = []ScriptTest{
Expected: []sql.Row{{float64(6), -9.322676295501879e-16, 10.000000238418579}},
},
{
Query: "SELECT avg(id), avg(val1), avg(val2) FROM float_table ORDER BY id;;",
Query: "SELECT sum(id), sum(val1), sum(val2) FROM float_table ORDER BY id;",
Expected: []sql.Row{{float64(6), -9.322676295501879e-16, 10.000000238418579}},
},
{
Query: "SELECT avg(id), avg(val1), avg(val2) FROM float_table ORDER BY id;",
Expected: []sql.Row{{float64(2), -3.107558765167293e-16, 3.333333412806193}},
},
},
Expand Down Expand Up @@ -3327,6 +3325,84 @@ var ScriptTests = []ScriptTest{
},
},
},
{
Name: "case insensitive index handling",
SetUpScript: []string{
"create table table_One (Id int primary key, Val1 int);",
"create table TableTwo (iD int primary key, VAL2 int, vAL3 int);",
},
Assertions: []ScriptTestAssertion{
{
Query: "create index idx_one on TABLE_ONE (vAL1);",
Expected: []sql.Row{{types.NewOkResult(0)}},
},
{
Query: "show create table TABLE_one;",
Expected: []sql.Row{{"table_One",
"CREATE TABLE `table_One` (\n" +
" `Id` int NOT NULL,\n" +
" `Val1` int,\n" +
" PRIMARY KEY (`Id`),\n" +
" KEY `idx_one` (`Val1`)\n" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_bin"}},
},
{
Query: "show index from TABLE_one;",
Expected: []sql.Row{
{"table_One", 0, "PRIMARY", 1, "Id", nil, 0, nil, nil, "", "BTREE", "", "", "YES", nil},
{"table_One", 1, "idx_one", 1, "Val1", nil, 0, nil, nil, "YES", "BTREE", "", "", "YES", nil},
},
},
{
Query: "create index idx_one on TABLEtwo (VAL2, VAL3);",
Expected: []sql.Row{{types.NewOkResult(0)}},
},
{
Query: "show create table TABLETWO;",
Expected: []sql.Row{{"TableTwo", "CREATE TABLE `TableTwo` (\n" +
" `iD` int NOT NULL,\n" +
" `VAL2` int,\n" +
" `vAL3` int,\n" +
" PRIMARY KEY (`iD`),\n" +
" KEY `idx_one` (`VAL2`,`vAL3`)\n" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_bin"}},
},
{
Query: "show index from tABLEtwo;",
Expected: []sql.Row{
{"TableTwo", 0, "PRIMARY", 1, "iD", nil, 0, nil, nil, "", "BTREE", "", "", "YES", nil},
{"TableTwo", 1, "idx_one", 1, "VAL2", nil, 0, nil, nil, "YES", "BTREE", "", "", "YES", nil},
{"TableTwo", 1, "idx_one", 2, "vAL3", nil, 0, nil, nil, "YES", "BTREE", "", "", "YES", nil},
},
},
{
Query: "drop index IDX_ONE on TABLE_one;",
Expected: []sql.Row{{types.NewOkResult(0)}},
},
{
Query: "drop index IDX_ONE on TABLEtwo;",
Expected: []sql.Row{{types.NewOkResult(0)}},
},
{
Query: "show create table TABLE_one;",
Expected: []sql.Row{{"table_One",
"CREATE TABLE `table_One` (\n" +
" `Id` int NOT NULL,\n" +
" `Val1` int,\n" +
" PRIMARY KEY (`Id`)\n" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_bin"}},
},
{
Query: "show create table TABLETWO;",
Expected: []sql.Row{{"TableTwo", "CREATE TABLE `TableTwo` (\n" +
" `iD` int NOT NULL,\n" +
" `VAL2` int,\n" +
" `vAL3` int,\n" +
" PRIMARY KEY (`iD`)\n" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_bin"}},
},
},
},
}

var SpatialScriptTests = []ScriptTest{
Expand Down
4 changes: 3 additions & 1 deletion enginetest/queries/update_queries.go
Original file line number Diff line number Diff line change
Expand Up @@ -268,8 +268,10 @@ var UpdateTests = []WriteQueryTest{
},
},
{
WriteQuery: `update mytable h join mytable on h.i = mytable.i and h.s <> mytable.s set h.i = mytable.i;`,
WriteQuery: `update mytable h join mytable on h.i = mytable.i and h.s <> mytable.s set h.i = mytable.i+1;`,
ExpectedWriteResult: []sql.Row{{newUpdateResult(0, 0)}},
SelectQuery: "select * from mytable",
ExpectedSelect: []sql.Row{{1, "first row"}, {2, "second row"}, {3, "third row"}},
},
{
WriteQuery: `UPDATE othertable CROSS JOIN tabletest set othertable.i2 = othertable.i2 * 10`, // cross join
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ require (
github.com/dolthub/go-icu-regex v0.0.0-20230524105445-af7e7991c97e
github.com/dolthub/jsonpath v0.0.2-0.20230525180605-8dc13778fd72
github.com/dolthub/sqllogictest/go v0.0.0-20201107003712-816f3ae12d81
github.com/dolthub/vitess v0.0.0-20230807221018-450b338616d9
github.com/dolthub/vitess v0.0.0-20230810182612-a2a338eddb8d
github.com/go-kit/kit v0.10.0
github.com/go-sql-driver/mysql v1.6.0
github.com/gocraft/dbr/v2 v2.7.2
Expand Down
Loading