Skip to content

Commit ebf9aee

Browse files
authored
Merge pull request #35 from liquidata-inc/zachmu/arithmetic-fixes
Fixed null comparison panics in artithmetic operations and added tests
2 parents 92623b7 + 05f0a16 commit ebf9aee

File tree

3 files changed

+60
-22
lines changed

3 files changed

+60
-22
lines changed

engine_test.go

Lines changed: 43 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ var queries = []queryTest{
143143
},
144144
{
145145
"SELECT i FROM mytable WHERE 'hello';",
146-
[]sql.Row{},
146+
nil,
147147
},
148148
{
149149
"SELECT i FROM mytable WHERE not 'hello';",
@@ -637,7 +637,7 @@ var queries = []queryTest{
637637
},
638638
{
639639
"SELECT * FROM mytable WHERE 1 > 5",
640-
[]sql.Row{},
640+
nil,
641641
},
642642
{
643643
"SELECT SUM(i) + 1, i FROM mytable GROUP BY i ORDER BY i",
@@ -665,7 +665,7 @@ var queries = []queryTest{
665665
},
666666
{
667667
`/*!40101 SET NAMES utf8 */`,
668-
[]sql.Row{},
668+
nil,
669669
},
670670
{
671671
`SHOW DATABASES`,
@@ -822,15 +822,15 @@ var queries = []queryTest{
822822
`
823823
SHOW WARNINGS
824824
`,
825-
[]sql.Row{},
825+
nil,
826826
},
827827
{
828828
`SHOW WARNINGS LIMIT 0`,
829-
[]sql.Row{},
829+
nil,
830830
},
831831
{
832832
`SET SESSION NET_READ_TIMEOUT= 700, SESSION NET_WRITE_TIMEOUT= 700`,
833-
[]sql.Row{},
833+
nil,
834834
},
835835
{
836836
`SELECT NULL`,
@@ -898,6 +898,30 @@ var queries = []queryTest{
898898
{int8(123)},
899899
},
900900
},
901+
{
902+
"SELECT i FROM mytable where NULL > 10;",
903+
nil,
904+
},
905+
{
906+
"SELECT i FROM mytable where NULL in (10);",
907+
nil,
908+
},
909+
{
910+
"SELECT i FROM mytable where NULL in (NULL, NULL);",
911+
nil,
912+
},
913+
{
914+
"SELECT i FROM mytable where NOT NULL NOT IN (NULL);",
915+
nil,
916+
},
917+
{
918+
"SELECT i FROM mytable where NOT (NULL) <> 10;",
919+
nil,
920+
},
921+
{
922+
"SELECT i FROM mytable where NOT NULL <> NULL;",
923+
nil,
924+
},
901925
{
902926
`SELECT round(15728640/1024/1024)`,
903927
[]sql.Row{
@@ -940,23 +964,23 @@ var queries = []queryTest{
940964
},
941965
{
942966
`SHOW COLLATION LIKE 'foo'`,
943-
[]sql.Row{},
967+
nil,
944968
},
945969
{
946970
`SHOW COLLATION LIKE 'utf8%'`,
947971
[]sql.Row{{"utf8_bin", "utf8mb4", int64(1), "Yes", "Yes", int64(1)}},
948972
},
949973
{
950974
`SHOW COLLATION WHERE charset = 'foo'`,
951-
[]sql.Row{},
975+
nil,
952976
},
953977
{
954978
"SHOW COLLATION WHERE `Default` = 'Yes'",
955979
[]sql.Row{{"utf8_bin", "utf8mb4", int64(1), "Yes", "Yes", int64(1)}},
956980
},
957981
{
958982
"ROLLBACK",
959-
[]sql.Row{},
983+
nil,
960984
},
961985
{
962986
"SELECT substring(s, 1, 1) FROM mytable ORDER BY substring(s, 1, 1)",
@@ -1212,7 +1236,7 @@ var queries = []queryTest{
12121236
},
12131237
{
12141238
`SELECT * FROM mytable WHERE NULL AND i = 3`,
1215-
[]sql.Row{},
1239+
nil,
12161240
},
12171241
{
12181242
`SELECT 1 FROM mytable GROUP BY i HAVING i > 1`,
@@ -1284,7 +1308,7 @@ var queries = []queryTest{
12841308
},
12851309
{
12861310
`SELECT EXPLODE(REGEXP_MATCHES("helloworld", "bop"))`,
1287-
[]sql.Row{},
1311+
nil,
12881312
},
12891313
{
12901314
`SELECT EXPLODE(REGEXP_MATCHES("", ""))`,
@@ -1578,7 +1602,7 @@ var infoSchemaQueries = []queryTest {
15781602
GROUP BY LOGFILE_GROUP_NAME, FILE_NAME, ENGINE, TOTAL_EXTENTS, INITIAL_SIZE
15791603
ORDER BY LOGFILE_GROUP_NAME
15801604
`,
1581-
[]sql.Row{},
1605+
nil,
15821606
},
15831607
{
15841608
`
@@ -1588,7 +1612,7 @@ var infoSchemaQueries = []queryTest {
15881612
WHERE FILE_TYPE = 'DATAFILE'
15891613
ORDER BY TABLESPACE_NAME, LOGFILE_GROUP_NAME
15901614
`,
1591-
[]sql.Row{},
1615+
nil,
15921616
},
15931617
{
15941618
`
@@ -1599,7 +1623,7 @@ var infoSchemaQueries = []queryTest {
15991623
WHERE SCHEMA_NAME = 'mydb'
16001624
AND TABLE_NAME = 'mytable'
16011625
`,
1602-
[]sql.Row{},
1626+
nil,
16031627
},
16041628
{
16051629
`
@@ -2071,7 +2095,7 @@ func TestWarnings(t *testing.T) {
20712095
`
20722096
SHOW WARNINGS LIMIT 10,1
20732097
`,
2074-
[]sql.Row{},
2098+
nil,
20752099
},
20762100
}
20772101

@@ -3265,7 +3289,7 @@ func testQueryWithContext(ctx *sql.Context, t *testing.T, e *sqle.Engine, q stri
32653289
require.NoError(err)
32663290

32673291
// .Equal gives better error messages than .ElementsMatch, so use it when possible
3268-
if orderBy || len(rows) == 1 {
3292+
if orderBy || len(expected) <= 1 {
32693293
require.Equal(expected, rows)
32703294
} else {
32713295
require.ElementsMatch(expected, rows)
@@ -3814,7 +3838,7 @@ func TestDeleteFrom(t *testing.T) {
38143838
"DELETE FROM mytable;",
38153839
[]sql.Row{{int64(3)}},
38163840
"SELECT * FROM mytable;",
3817-
[]sql.Row{},
3841+
nil,
38183842
},
38193843
{
38203844
"DELETE FROM mytable WHERE i = 2;",
@@ -3856,13 +3880,13 @@ func TestDeleteFrom(t *testing.T) {
38563880
"DELETE FROM mytable WHERE s <> 'dne';",
38573881
[]sql.Row{{int64(3)}},
38583882
"SELECT * FROM mytable;",
3859-
[]sql.Row{},
3883+
nil,
38603884
},
38613885
{
38623886
"DELETE FROM mytable WHERE s LIKE '%row';",
38633887
[]sql.Row{{int64(3)}},
38643888
"SELECT * FROM mytable;",
3865-
[]sql.Row{},
3889+
nil,
38663890
},
38673891
{
38683892
"DELETE FROM mytable WHERE s = 'dne';",

sql/analyzer/optimization_rules.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,13 +418,15 @@ func isFalse(e sql.Expression) bool {
418418
lit, ok := e.(*expression.Literal)
419419
return ok &&
420420
lit.Type() == sql.Boolean &&
421+
lit.Value() != nil &&
421422
!lit.Value().(bool)
422423
}
423424

424425
func isTrue(e sql.Expression) bool {
425426
lit, ok := e.(*expression.Literal)
426427
return ok &&
427428
lit.Type() == sql.Boolean &&
429+
lit.Value() != nil &&
428430
lit.Value().(bool)
429431
}
430432

sql/expression/arithmetic.go

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -507,14 +507,26 @@ func (e *UnaryMinus) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) {
507507
return -n, nil
508508
case float32:
509509
return -n, nil
510-
case int64:
510+
case int:
511+
return -n, nil
512+
case int8:
513+
return -n, nil
514+
case int16:
511515
return -n, nil
512-
case uint64:
513-
return -int64(n), nil
514516
case int32:
515517
return -n, nil
518+
case int64:
519+
return -n, nil
520+
case uint:
521+
return -int(n), nil
522+
case uint8:
523+
return -int8(n), nil
524+
case uint16:
525+
return -int16(n), nil
516526
case uint32:
517527
return -int32(n), nil
528+
case uint64:
529+
return -int64(n), nil
518530
default:
519531
return nil, sql.ErrInvalidType.New(reflect.TypeOf(n))
520532
}

0 commit comments

Comments
 (0)