@@ -2,6 +2,8 @@ package sqle_test
2
2
3
3
import (
4
4
"context"
5
+ "fmt"
6
+ "github.com/src-d/go-mysql-server/sql/expression"
5
7
"io"
6
8
"math"
7
9
"strings"
@@ -59,6 +61,14 @@ var queries = []struct {
59
61
"SELECT i FROM mytable WHERE i <> 2;" ,
60
62
[]sql.Row {{int64 (1 )}, {int64 (3 )}},
61
63
},
64
+ {
65
+ "SELECT i FROM mytable WHERE i in (1, 3)" ,
66
+ []sql.Row {{int64 (1 )}, {int64 (3 )}},
67
+ },
68
+ {
69
+ "SELECT i FROM mytable WHERE i = 1 or i = 3" ,
70
+ []sql.Row {{int64 (1 )}, {int64 (3 )}},
71
+ },
62
72
{
63
73
"SELECT f32 FROM floattable WHERE f64 = 2.0;" ,
64
74
[]sql.Row {{float32 (2.0 )}},
@@ -1589,21 +1599,146 @@ var queries = []struct {
1589
1599
}
1590
1600
1591
1601
func TestQueries (t * testing.T ) {
1592
- e := newEngine (t )
1593
- t .Run ("sequential" , func (t * testing.T ) {
1594
- for _ , tt := range queries {
1595
- testQuery (t , e , tt .query , tt .expected )
1602
+ type indexDriverInitalizer func (map [string ]* memory.Table ) sql.IndexDriver
1603
+ type indexDriverTestCase struct {
1604
+ name string
1605
+ initializer indexDriverInitalizer
1606
+ }
1607
+
1608
+ // Test all queries with these combinations, for a total of 12 runs:
1609
+ // 1) Partitioned tables / non partitioned tables
1610
+ // 2) Mergeable / unmergeable / no indexes
1611
+ // 3) Parallelism on / off
1612
+ numPartitionsVals := []int {
1613
+ 1 ,
1614
+ testNumPartitions ,
1615
+ }
1616
+ indexDrivers := []* indexDriverTestCase {
1617
+ nil ,
1618
+ {"unmergableIndexes" , unmergableIndexDriver },
1619
+ {"mergableIndexes" , mergableIndexDriver },
1620
+ }
1621
+ parallelVals := []int {
1622
+ 1 ,
1623
+ 2 ,
1624
+ }
1625
+ for _ , numPartitions := range numPartitionsVals {
1626
+ for _ , indexDriverInit := range indexDrivers {
1627
+ for _ , parallelism := range parallelVals {
1628
+ tables := allTestTables (t , numPartitions )
1629
+
1630
+ var indexDriver sql.IndexDriver
1631
+ if indexDriverInit != nil {
1632
+ indexDriver = indexDriverInit .initializer (tables )
1633
+ }
1634
+ engine := newEngineWithParallelism (t , parallelism , tables , indexDriver )
1635
+
1636
+ indexDriverName := "none"
1637
+ if indexDriverInit != nil {
1638
+ indexDriverName = indexDriverInit .name
1639
+ }
1640
+ testName := fmt .Sprintf ("partitions=%d,indexes=%v,parallelism=%v" , numPartitions , indexDriverName , parallelism )
1641
+ t .Run (testName , func (t * testing.T ) {
1642
+ for _ , tt := range queries {
1643
+ testQuery (t , engine , tt .query , tt .expected )
1644
+ }
1645
+ })
1646
+ }
1596
1647
}
1648
+ }
1649
+ }
1650
+
1651
+ func unmergableIndexDriver (tables map [string ]* memory.Table ) sql.IndexDriver {
1652
+ return memory .NewIndexDriver ("mydb" , map [string ][]sql.Index {
1653
+ "mytable" : {
1654
+ newUnmergableIndex (tables , "mytable" ,
1655
+ expression .NewGetFieldWithTable (0 , sql .Int64 , "mytable" , "i" , false )),
1656
+ newUnmergableIndex (tables , "mytable" ,
1657
+ expression .NewGetFieldWithTable (1 , sql .Text , "mytable" , "s" , false )),
1658
+ newUnmergableIndex (tables , "mytable" ,
1659
+ expression .NewGetFieldWithTable (0 , sql .Int64 , "mytable" , "i" , false ),
1660
+ expression .NewGetFieldWithTable (1 , sql .Text , "mytable" , "s" , false )),
1661
+ },
1662
+ "othertable" : {
1663
+ newUnmergableIndex (tables , "othertable" ,
1664
+ expression .NewGetFieldWithTable (0 , sql .Text , "othertable" , "s2" , false )),
1665
+ newUnmergableIndex (tables , "othertable" ,
1666
+ expression .NewGetFieldWithTable (1 , sql .Text , "othertable" , "i2" , false )),
1667
+ newUnmergableIndex (tables , "othertable" ,
1668
+ expression .NewGetFieldWithTable (0 , sql .Text , "othertable" , "s2" , false ),
1669
+ expression .NewGetFieldWithTable (1 , sql .Text , "othertable" , "i2" , false )),
1670
+ },
1671
+ "bigtable" : {
1672
+ newUnmergableIndex (tables , "bigtable" ,
1673
+ expression .NewGetFieldWithTable (0 , sql .Text , "bigtable" , "t" , false )),
1674
+ },
1675
+ "floattable" : {
1676
+ newUnmergableIndex (tables , "floattable" ,
1677
+ expression .NewGetFieldWithTable (2 , sql .Text , "floattable" , "f64" , false )),
1678
+ },
1679
+ "niltable" : {
1680
+ newUnmergableIndex (tables , "niltable" ,
1681
+ expression .NewGetFieldWithTable (0 , sql .Int64 , "niltable" , "i" , false )),
1682
+ },
1597
1683
})
1684
+ }
1598
1685
1599
- ep := newEngineWithParallelism (t , 2 )
1600
- t .Run ("parallel" , func (t * testing.T ) {
1601
- for _ , tt := range queries {
1602
- testQuery (t , ep , tt .query , tt .expected )
1603
- }
1686
+ func mergableIndexDriver (tables map [string ]* memory.Table ) sql.IndexDriver {
1687
+ return memory .NewIndexDriver ("mydb" , map [string ][]sql.Index {
1688
+ "mytable" : {
1689
+ newMergableIndex (tables , "mytable" ,
1690
+ expression .NewGetFieldWithTable (0 , sql .Int64 , "mytable" , "i" , false )),
1691
+ newMergableIndex (tables , "mytable" ,
1692
+ expression .NewGetFieldWithTable (1 , sql .Text , "mytable" , "s" , false )),
1693
+ newMergableIndex (tables , "mytable" ,
1694
+ expression .NewGetFieldWithTable (0 , sql .Int64 , "mytable" , "i" , false ),
1695
+ expression .NewGetFieldWithTable (1 , sql .Text , "mytable" , "s" , false )),
1696
+ },
1697
+ "othertable" : {
1698
+ newMergableIndex (tables , "othertable" ,
1699
+ expression .NewGetFieldWithTable (0 , sql .Text , "othertable" , "s2" , false )),
1700
+ newMergableIndex (tables , "othertable" ,
1701
+ expression .NewGetFieldWithTable (1 , sql .Text , "othertable" , "i2" , false )),
1702
+ newMergableIndex (tables , "othertable" ,
1703
+ expression .NewGetFieldWithTable (0 , sql .Text , "othertable" , "s2" , false ),
1704
+ expression .NewGetFieldWithTable (1 , sql .Text , "othertable" , "i2" , false )),
1705
+ },
1706
+ "bigtable" : {
1707
+ newMergableIndex (tables , "bigtable" ,
1708
+ expression .NewGetFieldWithTable (0 , sql .Text , "bigtable" , "t" , false )),
1709
+ },
1710
+ "floattable" : {
1711
+ newMergableIndex (tables , "floattable" ,
1712
+ expression .NewGetFieldWithTable (2 , sql .Text , "floattable" , "f64" , false )),
1713
+ },
1714
+ "niltable" : {
1715
+ newMergableIndex (tables , "niltable" ,
1716
+ expression .NewGetFieldWithTable (0 , sql .Int64 , "niltable" , "i" , false )),
1717
+ },
1604
1718
})
1605
1719
}
1606
1720
1721
+
1722
+ func newUnmergableIndex (tables map [string ]* memory.Table , tableName string , exprs ... sql.Expression ) * memory.UnmergeableIndex {
1723
+ return & memory.UnmergeableIndex {
1724
+ DB : "mydb" ,
1725
+ DriverName : memory .IndexDriverId ,
1726
+ TableName : tableName ,
1727
+ Tbl : tables [tableName ],
1728
+ Exprs : exprs ,
1729
+ }
1730
+ }
1731
+
1732
+ func newMergableIndex (tables map [string ]* memory.Table , tableName string , exprs ... sql.Expression ) * memory.MergeableIndex {
1733
+ return & memory.MergeableIndex {
1734
+ DB : "mydb" ,
1735
+ DriverName : memory .IndexDriverId ,
1736
+ TableName : tableName ,
1737
+ Tbl : tables [tableName ],
1738
+ Exprs : exprs ,
1739
+ }
1740
+ }
1741
+
1607
1742
func TestSessionSelectLimit (t * testing.T ) {
1608
1743
ctx := newCtx ()
1609
1744
ctx .Session .Set ("sql_select_limit" , sql .Int64 , int64 (1 ))
@@ -1752,7 +1887,7 @@ func TestWarnings(t *testing.T) {
1752
1887
}
1753
1888
1754
1889
e := newEngine (t )
1755
- ep := newEngineWithParallelism (t , 2 )
1890
+ ep := newEngineWithParallelism (t , 2 , allTestTables ( t , testNumPartitions ), nil )
1756
1891
1757
1892
t .Run ("sequential" , func (t * testing.T ) {
1758
1893
for _ , tt := range queries {
@@ -1816,7 +1951,7 @@ func TestClearWarnings(t *testing.T) {
1816
1951
func TestDescribe (t * testing.T ) {
1817
1952
e := newEngine (t )
1818
1953
1819
- ep := newEngineWithParallelism (t , 2 )
1954
+ ep := newEngineWithParallelism (t , 2 , allTestTables ( t , testNumPartitions ), nil )
1820
1955
1821
1956
query := `DESCRIBE FORMAT=TREE SELECT * FROM mytable`
1822
1957
expectedSeq := []sql.Row {
@@ -2822,66 +2957,64 @@ func testQueryWithContext(ctx *sql.Context, t *testing.T, e *sqle.Engine, q stri
2822
2957
})
2823
2958
}
2824
2959
2825
- func newEngine (t * testing.T ) * sqle.Engine {
2826
- return newEngineWithParallelism (t , 1 )
2827
- }
2960
+ func allTestTables (t * testing.T , numPartitions int ) map [string ]* memory.Table {
2961
+ tables := make (map [string ]* memory.Table )
2828
2962
2829
- func newEngineWithParallelism (t * testing.T , parallelism int ) * sqle.Engine {
2830
- table := memory .NewPartitionedTable ("mytable" , sql.Schema {
2963
+ tables ["mytable" ] = memory .NewPartitionedTable ("mytable" , sql.Schema {
2831
2964
{Name : "i" , Type : sql .Int64 , Source : "mytable" },
2832
2965
{Name : "s" , Type : sql .Text , Source : "mytable" },
2833
- }, testNumPartitions )
2966
+ }, numPartitions )
2834
2967
2835
2968
insertRows (
2836
- t , table ,
2969
+ t , tables [ "mytable" ] ,
2837
2970
sql .NewRow (int64 (1 ), "first row" ),
2838
2971
sql .NewRow (int64 (2 ), "second row" ),
2839
2972
sql .NewRow (int64 (3 ), "third row" ),
2840
2973
)
2841
2974
2842
- table2 : = memory .NewPartitionedTable ("othertable" , sql.Schema {
2975
+ tables [ "othertable" ] = memory .NewPartitionedTable ("othertable" , sql.Schema {
2843
2976
{Name : "s2" , Type : sql .Text , Source : "othertable" },
2844
2977
{Name : "i2" , Type : sql .Int64 , Source : "othertable" },
2845
- }, testNumPartitions )
2978
+ }, numPartitions )
2846
2979
2847
2980
insertRows (
2848
- t , table2 ,
2981
+ t , tables [ "othertable" ] ,
2849
2982
sql .NewRow ("first" , int64 (3 )),
2850
2983
sql .NewRow ("second" , int64 (2 )),
2851
2984
sql .NewRow ("third" , int64 (1 )),
2852
2985
)
2853
2986
2854
- table3 : = memory .NewPartitionedTable ("tabletest" , sql.Schema {
2987
+ tables [ "tabletest" ] = memory .NewPartitionedTable ("tabletest" , sql.Schema {
2855
2988
{Name : "i" , Type : sql .Int32 , Source : "tabletest" },
2856
2989
{Name : "s" , Type : sql .Text , Source : "tabletest" },
2857
- }, testNumPartitions )
2990
+ }, numPartitions )
2858
2991
2859
2992
insertRows (
2860
- t , table3 ,
2993
+ t , tables [ "tabletest" ] ,
2861
2994
sql .NewRow (int64 (1 ), "first row" ),
2862
2995
sql .NewRow (int64 (2 ), "second row" ),
2863
2996
sql .NewRow (int64 (3 ), "third row" ),
2864
2997
)
2865
2998
2866
- table4 : = memory .NewPartitionedTable ("other_table" , sql.Schema {
2999
+ tables [ "other_table" ] = memory .NewPartitionedTable ("other_table" , sql.Schema {
2867
3000
{Name : "text" , Type : sql .Text , Source : "tabletest" },
2868
3001
{Name : "number" , Type : sql .Int32 , Source : "tabletest" },
2869
- }, testNumPartitions )
3002
+ }, numPartitions )
2870
3003
2871
3004
insertRows (
2872
- t , table4 ,
3005
+ t , tables [ "other_table" ] ,
2873
3006
sql .NewRow ("a" , int32 (4 )),
2874
3007
sql .NewRow ("b" , int32 (2 )),
2875
3008
sql .NewRow ("c" , int32 (0 )),
2876
3009
)
2877
3010
2878
- bigtable : = memory .NewPartitionedTable ("bigtable" , sql.Schema {
3011
+ tables [ " bigtable" ] = memory .NewPartitionedTable ("bigtable" , sql.Schema {
2879
3012
{Name : "t" , Type : sql .Text , Source : "bigtable" },
2880
3013
{Name : "n" , Type : sql .Int64 , Source : "bigtable" },
2881
- }, testNumPartitions )
3014
+ }, numPartitions )
2882
3015
2883
3016
insertRows (
2884
- t , bigtable ,
3017
+ t , tables [ " bigtable" ] ,
2885
3018
sql .NewRow ("a" , int64 (1 )),
2886
3019
sql .NewRow ("s" , int64 (2 )),
2887
3020
sql .NewRow ("f" , int64 (3 )),
@@ -2898,14 +3031,14 @@ func newEngineWithParallelism(t *testing.T, parallelism int) *sqle.Engine {
2898
3031
sql .NewRow ("b" , int64 (9 )),
2899
3032
)
2900
3033
2901
- floatTable : = memory .NewPartitionedTable ("floattable" , sql.Schema {
3034
+ tables [ "floattable" ] = memory .NewPartitionedTable ("floattable" , sql.Schema {
2902
3035
{Name : "i" , Type : sql .Int64 , Source : "floattable" },
2903
3036
{Name : "f32" , Type : sql .Float32 , Source : "floattable" },
2904
3037
{Name : "f64" , Type : sql .Float64 , Source : "floattable" },
2905
- }, testNumPartitions )
3038
+ }, numPartitions )
2906
3039
2907
3040
insertRows (
2908
- t , floatTable ,
3041
+ t , tables [ "floattable" ] ,
2909
3042
sql .NewRow (int64 (1 ), float32 (1.0 ), float64 (1.0 )),
2910
3043
sql .NewRow (int64 (2 ), float32 (1.5 ), float64 (1.5 )),
2911
3044
sql .NewRow (int64 (3 ), float32 (2.0 ), float64 (2.0 )),
@@ -2914,36 +3047,36 @@ func newEngineWithParallelism(t *testing.T, parallelism int) *sqle.Engine {
2914
3047
sql .NewRow (int64 (- 2 ), float32 (- 1.5 ), float64 (- 1.5 )),
2915
3048
)
2916
3049
2917
- nilTable : = memory .NewPartitionedTable ("niltable" , sql.Schema {
3050
+ tables [ "niltable" ] = memory .NewPartitionedTable ("niltable" , sql.Schema {
2918
3051
{Name : "i" , Type : sql .Int64 , Source : "niltable" , Nullable : true },
2919
3052
{Name : "b" , Type : sql .Boolean , Source : "niltable" , Nullable : true },
2920
3053
{Name : "f" , Type : sql .Float64 , Source : "niltable" , Nullable : true },
2921
- }, testNumPartitions )
3054
+ }, numPartitions )
2922
3055
2923
3056
insertRows (
2924
- t , nilTable ,
3057
+ t , tables [ "niltable" ] ,
2925
3058
sql .NewRow (int64 (1 ), true , float64 (1.0 )),
2926
3059
sql .NewRow (int64 (2 ), nil , float64 (2.0 )),
2927
3060
sql .NewRow (nil , false , float64 (3.0 )),
2928
3061
sql .NewRow (int64 (4 ), true , nil ),
2929
3062
sql .NewRow (nil , nil , nil ),
2930
3063
)
2931
3064
2932
- newlineTable : = memory .NewPartitionedTable ("newlinetable" , sql.Schema {
3065
+ tables [ "newlinetable" ] = memory .NewPartitionedTable ("newlinetable" , sql.Schema {
2933
3066
{Name : "i" , Type : sql .Int64 , Source : "newlinetable" },
2934
3067
{Name : "s" , Type : sql .Text , Source : "newlinetable" },
2935
- }, testNumPartitions )
3068
+ }, numPartitions )
2936
3069
2937
3070
insertRows (
2938
- t , newlineTable ,
3071
+ t , tables [ "newlinetable" ] ,
2939
3072
sql .NewRow (int64 (1 ), "\n there is some text in here" ),
2940
3073
sql .NewRow (int64 (2 ), "there is some\n text in here" ),
2941
3074
sql .NewRow (int64 (3 ), "there is some text\n in here" ),
2942
3075
sql .NewRow (int64 (4 ), "there is some text in here\n " ),
2943
3076
sql .NewRow (int64 (5 ), "there is some text in here" ),
2944
3077
)
2945
3078
2946
- typestable : = memory .NewPartitionedTable ("typestable" , sql.Schema {
3079
+ tables [ " typestable" ] = memory .NewPartitionedTable ("typestable" , sql.Schema {
2947
3080
{Name : "id" , Type : sql .Int64 , Source : "typestable" },
2948
3081
{Name : "i8" , Type : sql .Int8 , Source : "typestable" , Nullable : true },
2949
3082
{Name : "i16" , Type : sql .Int16 , Source : "typestable" , Nullable : true },
@@ -2961,20 +3094,25 @@ func newEngineWithParallelism(t *testing.T, parallelism int) *sqle.Engine {
2961
3094
{Name : "bo" , Type : sql .Boolean , Source : "typestable" , Nullable : true },
2962
3095
{Name : "js" , Type : sql .JSON , Source : "typestable" , Nullable : true },
2963
3096
{Name : "bl" , Type : sql .Blob , Source : "typestable" , Nullable : true },
2964
- }, testNumPartitions )
3097
+ }, numPartitions )
3098
+
3099
+ return tables
3100
+ }
3101
+
3102
+ func newEngine (t * testing.T ) * sqle.Engine {
3103
+ return newEngineWithParallelism (t , 1 , allTestTables (t , testNumPartitions ), nil )
3104
+ }
2965
3105
3106
+ func newEngineWithParallelism (t * testing.T , parallelism int , tables map [string ]* memory.Table , driver sql.IndexDriver ) * sqle.Engine {
2966
3107
db := memory .NewDatabase ("mydb" )
2967
- db .AddTable ("mytable" , table )
2968
- db .AddTable ("othertable" , table2 )
2969
- db .AddTable ("tabletest" , table3 )
2970
- db .AddTable ("bigtable" , bigtable )
2971
- db .AddTable ("floattable" , floatTable )
2972
- db .AddTable ("niltable" , nilTable )
2973
- db .AddTable ("newlinetable" , newlineTable )
2974
- db .AddTable ("typestable" , typestable )
3108
+ for name , table := range tables {
3109
+ if name != "other_table" {
3110
+ db .AddTable (name , table )
3111
+ }
3112
+ }
2975
3113
2976
3114
db2 := memory .NewDatabase ("foo" )
2977
- db2 .AddTable ("other_table" , table4 )
3115
+ db2 .AddTable ("other_table" , tables [ "other_table" ] )
2978
3116
2979
3117
catalog := sql .NewCatalog ()
2980
3118
catalog .AddDatabase (db )
@@ -2988,7 +3126,14 @@ func newEngineWithParallelism(t *testing.T, parallelism int) *sqle.Engine {
2988
3126
a = analyzer .NewDefault (catalog )
2989
3127
}
2990
3128
2991
- return sqle .New (catalog , a , new (sqle.Config ))
3129
+ if driver != nil {
3130
+ catalog .RegisterIndexDriver (driver )
3131
+ }
3132
+
3133
+ engine := sqle .New (catalog , a , new (sqle.Config ))
3134
+ require .NoError (t , engine .Init ())
3135
+
3136
+ return engine
2992
3137
}
2993
3138
2994
3139
const expectedTree = `Limit(5)
0 commit comments