@@ -18,6 +18,7 @@ import (
1818 "github.com/src-d/go-mysql-server/sql/plan"
1919 "github.com/src-d/go-mysql-server/test"
2020
21+
2122 "github.com/stretchr/testify/require"
2223)
2324
@@ -2245,6 +2246,142 @@ func TestReplaceIntoErrors(t *testing.T) {
22452246 }
22462247}
22472248
2249+ func TestUpdate (t * testing.T ) {
2250+ var updates = []struct {
2251+ updateQuery string
2252+ expectedUpdate []sql.Row
2253+ selectQuery string
2254+ expectedSelect []sql.Row
2255+ }{
2256+ {
2257+ "UPDATE mytable SET s = 'updated';" ,
2258+ []sql.Row {{int64 (3 ), int64 (3 )}},
2259+ "SELECT * FROM mytable;" ,
2260+ []sql.Row {{int64 (1 ), "updated" }, {int64 (2 ), "updated" }, {int64 (3 ), "updated" }},
2261+ },
2262+ {
2263+ "UPDATE mytable SET s = 'updated' WHERE i > 9999;" ,
2264+ []sql.Row {{int64 (0 ), int64 (0 )}},
2265+ "SELECT * FROM mytable;" ,
2266+ []sql.Row {{int64 (1 ), "first row" }, {int64 (2 ), "second row" }, {int64 (3 ), "third row" }},
2267+ },
2268+ {
2269+ "UPDATE mytable SET s = 'updated' WHERE i = 1;" ,
2270+ []sql.Row {{int64 (1 ), int64 (1 )}},
2271+ "SELECT * FROM mytable;" ,
2272+ []sql.Row {{int64 (1 ), "updated" }, {int64 (2 ), "second row" }, {int64 (3 ), "third row" }},
2273+ },
2274+ {
2275+ "UPDATE mytable SET s = 'updated' WHERE i <> 9999;" ,
2276+ []sql.Row {{int64 (3 ), int64 (3 )}},
2277+ "SELECT * FROM mytable;" ,
2278+ []sql.Row {{int64 (1 ), "updated" },{int64 (2 ), "updated" },{int64 (3 ), "updated" }},
2279+ },
2280+ {
2281+ "UPDATE floattable SET f32 = f32 + f32, f64 = f32 * f64 WHERE i = 2;" ,
2282+ []sql.Row {{int64 (1 ), int64 (1 )}},
2283+ "SELECT * FROM floattable WHERE i = 2;" ,
2284+ []sql.Row {{int64 (2 ), float32 (3.0 ), float64 (4.5 )}},
2285+ },
2286+ {
2287+ "UPDATE floattable SET f32 = 5, f32 = 4 WHERE i = 1;" ,
2288+ []sql.Row {{int64 (1 ), int64 (1 )}},
2289+ "SELECT f32 FROM floattable WHERE i = 1;" ,
2290+ []sql.Row {{float32 (4.0 )}},
2291+ },
2292+ {
2293+ "UPDATE mytable SET s = 'first row' WHERE i = 1;" ,
2294+ []sql.Row {{int64 (1 ), int64 (0 )}},
2295+ "SELECT * FROM mytable;" ,
2296+ []sql.Row {{int64 (1 ), "first row" }, {int64 (2 ), "second row" }, {int64 (3 ), "third row" }},
2297+ },
2298+ {
2299+ "UPDATE niltable SET b = NULL WHERE f IS NULL;" ,
2300+ []sql.Row {{int64 (2 ), int64 (1 )}},
2301+ "SELECT * FROM niltable WHERE f IS NULL;" ,
2302+ []sql.Row {{int64 (4 ), nil , nil }, {nil , nil , nil }},
2303+ },
2304+ {
2305+ "UPDATE mytable SET s = 'updated' ORDER BY i ASC LIMIT 2;" ,
2306+ []sql.Row {{int64 (2 ), int64 (2 )}},
2307+ "SELECT * FROM mytable;" ,
2308+ []sql.Row {{int64 (1 ), "updated" }, {int64 (2 ), "updated" }, {int64 (3 ), "third row" }},
2309+ },
2310+ {
2311+ "UPDATE mytable SET s = 'updated' ORDER BY i DESC LIMIT 2;" ,
2312+ []sql.Row {{int64 (2 ), int64 (2 )}},
2313+ "SELECT * FROM mytable;" ,
2314+ []sql.Row {{int64 (1 ), "first row" }, {int64 (2 ), "updated" }, {int64 (3 ), "updated" }},
2315+ },
2316+ {
2317+ "UPDATE mytable SET s = 'updated' ORDER BY i LIMIT 1 OFFSET 1;" ,
2318+ []sql.Row {{int64 (1 ), int64 (1 )}},
2319+ "SELECT * FROM mytable;" ,
2320+ []sql.Row {{int64 (1 ), "first row" }, {int64 (2 ), "updated" }, {int64 (3 ), "third row" }},
2321+ },
2322+ {
2323+ "UPDATE mytable SET s = 'updated';" ,
2324+ []sql.Row {{int64 (3 ), int64 (3 )}},
2325+ "SELECT * FROM mytable;" ,
2326+ []sql.Row {{int64 (1 ), "updated" }, {int64 (2 ), "updated" }, {int64 (3 ), "updated" }},
2327+ },
2328+ }
2329+
2330+ for _ , update := range updates {
2331+ e := newEngine (t )
2332+ ctx := newCtx ()
2333+ testQueryWithContext (ctx , t , e , update .updateQuery , update .expectedUpdate )
2334+ testQueryWithContext (ctx , t , e , update .selectQuery , update .expectedSelect )
2335+ }
2336+ }
2337+
2338+ func TestUpdateErrors (t * testing.T ) {
2339+ var expectedFailures = []struct {
2340+ name string
2341+ query string
2342+ }{
2343+ {
2344+ "invalid table" ,
2345+ "UPDATE doesnotexist SET i = 0;" ,
2346+ },
2347+ {
2348+ "invalid column set" ,
2349+ "UPDATE mytable SET z = 0;" ,
2350+ },
2351+ {
2352+ "invalid column set value" ,
2353+ "UPDATE mytable SET i = z;" ,
2354+ },
2355+ {
2356+ "invalid column where" ,
2357+ "UPDATE mytable SET s = 'hi' WHERE z = 1;" ,
2358+ },
2359+ {
2360+ "invalid column order by" ,
2361+ "UPDATE mytable SET s = 'hi' ORDER BY z;" ,
2362+ },
2363+ {
2364+ "negative limit" ,
2365+ "UPDATE mytable SET s = 'hi' LIMIT -1;" ,
2366+ },
2367+ {
2368+ "negative offset" ,
2369+ "UPDATE mytable SET s = 'hi' LIMIT 1 OFFSET -1;" ,
2370+ },
2371+ {
2372+ "set null on non-nullable" ,
2373+ "UPDATE mytable SET s = NULL;" ,
2374+ },
2375+ }
2376+
2377+ for _ , expectedFailure := range expectedFailures {
2378+ t .Run (expectedFailure .name , func (t * testing.T ) {
2379+ _ , _ , err := newEngine (t ).Query (newCtx (), expectedFailure .query )
2380+ require .Error (t , err )
2381+ })
2382+ }
2383+ }
2384+
22482385const testNumPartitions = 5
22492386
22502387func TestAmbiguousColumnResolution (t * testing.T ) {
@@ -2670,12 +2807,12 @@ func newEngineWithParallelism(t *testing.T, parallelism int) *sqle.Engine {
26702807
26712808 insertRows (
26722809 t , floatTable ,
2673- sql .NewRow (1 , float32 (1.0 ), float64 (1.0 )),
2674- sql .NewRow (2 , float32 (1.5 ), float64 (1.5 )),
2675- sql .NewRow (3 , float32 (2.0 ), float64 (2.0 )),
2676- sql .NewRow (4 , float32 (2.5 ), float64 (2.5 )),
2677- sql .NewRow (- 1 , float32 (- 1.0 ), float64 (- 1.0 )),
2678- sql .NewRow (- 2 , float32 (- 1.5 ), float64 (- 1.5 )),
2810+ sql .NewRow (int64 ( 1 ) , float32 (1.0 ), float64 (1.0 )),
2811+ sql .NewRow (int64 ( 2 ) , float32 (1.5 ), float64 (1.5 )),
2812+ sql .NewRow (int64 ( 3 ) , float32 (2.0 ), float64 (2.0 )),
2813+ sql .NewRow (int64 ( 4 ) , float32 (2.5 ), float64 (2.5 )),
2814+ sql .NewRow (int64 ( - 1 ) , float32 (- 1.0 ), float64 (- 1.0 )),
2815+ sql .NewRow (int64 ( - 2 ) , float32 (- 1.5 ), float64 (- 1.5 )),
26792816 )
26802817
26812818 nilTable := memory .NewPartitionedTable ("niltable" , sql.Schema {
0 commit comments