mirror of
https://github.com/dolthub/dolt.git
synced 2026-03-06 10:29:33 -06:00
optimize keyless read row (#2094)
This commit is contained in:
@@ -24,7 +24,8 @@ import (
|
||||
)
|
||||
|
||||
func init() {
|
||||
sqle.MinRowsPerPartition = 2
|
||||
sqle.MinRowsPerPartition = 8
|
||||
sqle.MaxRowsPerPartition = 1024
|
||||
}
|
||||
|
||||
func TestQueries(t *testing.T) {
|
||||
|
||||
@@ -26,6 +26,38 @@ import (
|
||||
"github.com/dolthub/dolt/go/store/types"
|
||||
)
|
||||
|
||||
var _ sql.RowIter = (*keylessRowIter)(nil)
|
||||
|
||||
type keylessRowIter struct {
|
||||
keyedIter *DoltMapIter
|
||||
|
||||
cardIdx int
|
||||
nonCardCols int
|
||||
|
||||
lastRead sql.Row
|
||||
lastCard uint64
|
||||
}
|
||||
|
||||
func (k *keylessRowIter) Next() (sql.Row, error) {
|
||||
if k.lastCard == 0 {
|
||||
r, err := k.keyedIter.Next()
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
k.lastCard = r[k.cardIdx].(uint64)
|
||||
k.lastRead = r[:k.nonCardCols]
|
||||
}
|
||||
|
||||
k.lastCard--
|
||||
return k.lastRead, nil
|
||||
}
|
||||
|
||||
func (k keylessRowIter) Close(ctx *sql.Context) error {
|
||||
return k.keyedIter.Close(ctx)
|
||||
}
|
||||
|
||||
// An iterator over the rows of a table.
|
||||
type doltTableRowIter struct {
|
||||
sql.RowIter
|
||||
@@ -43,48 +75,71 @@ func newRowIterator(ctx *sql.Context, tbl *doltdb.Table, projCols []string, part
|
||||
|
||||
if schema.IsKeyless(sch) {
|
||||
// would be more optimal to project columns into keyless tables also
|
||||
return newKeylessRowIterator(ctx, tbl, partition)
|
||||
return newKeylessRowIterator(ctx, tbl, projCols, partition)
|
||||
} else {
|
||||
return newKeyedRowIter(ctx, tbl, projCols, partition)
|
||||
}
|
||||
}
|
||||
|
||||
func newKeylessRowIterator(ctx *sql.Context, tbl *doltdb.Table, partition *doltTablePartition) (*doltTableRowIter, error) {
|
||||
var iter table.SqlTableReader
|
||||
var err error
|
||||
if partition.end == NoUpperBound {
|
||||
iter, err = table.NewBufferedTableReader(ctx, tbl)
|
||||
} else {
|
||||
iter, err = table.NewBufferedTableReaderForPartition(ctx, tbl, partition.start, partition.end)
|
||||
}
|
||||
|
||||
func newKeylessRowIterator(ctx *sql.Context, tbl *doltdb.Table, projectedCols []string, partition *doltTablePartition) (sql.RowIter, error) {
|
||||
mapIter, err := iterForPartition(ctx, partition)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &doltTableRowIter{
|
||||
ctx: ctx,
|
||||
reader: iter,
|
||||
cols, tagToSqlColIdx, err := getTagToResColIdx(ctx, tbl, projectedCols)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
idxOfCardinality := len(cols)
|
||||
tagToSqlColIdx[schema.KeylessRowCardinalityTag] = idxOfCardinality
|
||||
|
||||
colsCopy := make([]schema.Column, len(cols), len(cols)+1)
|
||||
copy(colsCopy, cols)
|
||||
colsCopy = append(colsCopy, schema.NewColumn("__cardinality__", schema.KeylessRowCardinalityTag, types.UintKind, false))
|
||||
|
||||
conv := NewKVToSqlRowConverter(tbl.Format(), tagToSqlColIdx, colsCopy, len(colsCopy))
|
||||
keyedItr, err := NewDoltMapIter(ctx, mapIter.NextTuple, nil, conv), nil
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &keylessRowIter{
|
||||
keyedIter: keyedItr,
|
||||
cardIdx: idxOfCardinality,
|
||||
nonCardCols: len(cols),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func newKeyedRowIter(ctx context.Context, tbl *doltdb.Table, projectedCols []string, partition *doltTablePartition) (sql.RowIter, error) {
|
||||
var err error
|
||||
var mapIter types.MapTupleIterator
|
||||
mapIter, err := iterForPartition(ctx, partition)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
cols, tagToSqlColIdx, err := getTagToResColIdx(ctx, tbl, projectedCols)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
conv := NewKVToSqlRowConverter(tbl.Format(), tagToSqlColIdx, cols, len(cols))
|
||||
return NewDoltMapIter(ctx, mapIter.NextTuple, nil, conv), nil
|
||||
}
|
||||
|
||||
func iterForPartition(ctx context.Context, partition *doltTablePartition) (types.MapTupleIterator, error) {
|
||||
rowData := partition.rowData
|
||||
if partition.end == NoUpperBound {
|
||||
mapIter, err = rowData.RangeIterator(ctx, 0, rowData.Len())
|
||||
return rowData.RangeIterator(ctx, 0, rowData.Len())
|
||||
} else {
|
||||
mapIter, err = partition.IteratorForPartition(ctx, rowData)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return partition.IteratorForPartition(ctx, rowData)
|
||||
}
|
||||
}
|
||||
|
||||
func getTagToResColIdx(ctx context.Context, tbl *doltdb.Table, projectedCols []string) ([]schema.Column, map[uint64]int, error) {
|
||||
sch, err := tbl.GetSchema(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
cols := sch.GetAllCols().GetColumns()
|
||||
@@ -96,9 +151,7 @@ func newKeyedRowIter(ctx context.Context, tbl *doltdb.Table, projectedCols []str
|
||||
tagToSqlColIdx[col.Tag] = i
|
||||
}
|
||||
}
|
||||
|
||||
conv := NewKVToSqlRowConverter(tbl.Format(), tagToSqlColIdx, cols, len(cols))
|
||||
return NewDoltMapIter(ctx, mapIter.NextTuple, nil, conv), nil
|
||||
return cols, tagToSqlColIdx, nil
|
||||
}
|
||||
|
||||
// Next returns the next row in this row iterator, or an io.EOF error if there aren't any more.
|
||||
|
||||
@@ -47,6 +47,7 @@ const (
|
||||
partitionMultiplier = 2.0
|
||||
)
|
||||
|
||||
var MaxRowsPerPartition uint64 = 32 * 1024
|
||||
var MinRowsPerPartition uint64 = 1024
|
||||
|
||||
func init() {
|
||||
@@ -358,15 +359,20 @@ func (t *DoltTable) Partitions(ctx *sql.Context) (sql.PartitionIter, error) {
|
||||
return newDoltTablePartitionIter(rowData, doltTablePartition{0, 0, rowData}), nil
|
||||
}
|
||||
|
||||
maxPartitions := uint64(partitionMultiplier * runtime.NumCPU())
|
||||
numPartitions := (numElements / MinRowsPerPartition) + 1
|
||||
itemsPerPartition := MaxRowsPerPartition
|
||||
numPartitions := (numElements / itemsPerPartition) + 1
|
||||
if numPartitions < uint64(partitionMultiplier*runtime.NumCPU()) {
|
||||
itemsPerPartition = numElements / uint64(partitionMultiplier*runtime.NumCPU())
|
||||
|
||||
if numPartitions > maxPartitions {
|
||||
numPartitions = maxPartitions
|
||||
if itemsPerPartition == 0 {
|
||||
itemsPerPartition = numElements
|
||||
numPartitions = 1
|
||||
} else {
|
||||
numPartitions = (numElements / itemsPerPartition) + 1
|
||||
}
|
||||
}
|
||||
|
||||
partitions := make([]doltTablePartition, numPartitions)
|
||||
itemsPerPartition := numElements / numPartitions
|
||||
for i := uint64(0); i < numPartitions-1; i++ {
|
||||
partitions[i] = doltTablePartition{i * itemsPerPartition, (i + 1) * itemsPerPartition, rowData}
|
||||
}
|
||||
|
||||
@@ -23,13 +23,13 @@ teardown() {
|
||||
|
||||
run dolt sql -q "INSERT INTO test (c0) VALUES (44);"
|
||||
[ "$status" -eq 0 ]
|
||||
run dolt sql -q "SELECT * FROM test WHERE c0 = 44;" -r csv
|
||||
run dolt sql -q "SELECT * FROM test WHERE c0 = 44 ORDER BY pk;" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "4,44" ]] || false
|
||||
|
||||
run dolt sql -q "INSERT INTO test (c0) VALUES (55),(66);"
|
||||
[ "$status" -eq 0 ]
|
||||
run dolt sql -q "SELECT * FROM test WHERE c0 > 50;" -r csv
|
||||
run dolt sql -q "SELECT * FROM test WHERE c0 > 50 ORDER BY pk;" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "5,55" ]] || false
|
||||
[[ "$output" =~ "6,66" ]] || false
|
||||
@@ -45,7 +45,7 @@ CREATE TABLE ai (
|
||||
INSERT INTO ai VALUES (NULL,1),(NULL,2),(NULL,3);
|
||||
SQL
|
||||
[ "$status" -eq 0 ]
|
||||
run dolt sql -q "SELECT * FROM ai;" -r csv
|
||||
run dolt sql -q "SELECT * FROM ai ORDER BY pk;" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "1,1" ]] || false
|
||||
[[ "$output" =~ "2,2" ]] || false
|
||||
@@ -55,7 +55,7 @@ SQL
|
||||
@test "auto_increment: insert into empty auto_increment table" {
|
||||
run dolt sql -q "INSERT INTO test (c0) VALUES (1);"
|
||||
[ "$status" -eq 0 ]
|
||||
run dolt sql -q "SELECT * FROM test WHERE c0 = 1;" -r csv
|
||||
run dolt sql -q "SELECT * FROM test WHERE c0 = 1 ORDER BY pk;" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "1,1" ]] || false
|
||||
}
|
||||
@@ -67,7 +67,7 @@ SQL
|
||||
[ "$status" -eq 0 ]
|
||||
run dolt sql -q "INSERT INTO test VALUES (2,2);"
|
||||
[ "$status" -eq 0 ]
|
||||
run dolt sql -q "SELECT * FROM test;" -r csv
|
||||
run dolt sql -q "SELECT * FROM test ORDER BY pk;" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "1,1" ]] || false
|
||||
[[ "$output" =~ "2,2" ]] || false
|
||||
@@ -80,13 +80,14 @@ SQL
|
||||
|
||||
run dolt sql -q "INSERT INTO test (pk,c0) VALUES (NULL,2);"
|
||||
[ "$status" -eq 0 ]
|
||||
run dolt sql -q "SELECT * FROM test WHERE c0 > 1;" -r csv
|
||||
run dolt sql -q "SELECT * FROM test WHERE c0 > 1 ORDER BY pk;" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "2,2" ]] || false
|
||||
|
||||
run dolt sql -q "INSERT INTO test VALUES (NULL,3), (10,10), (NULL,11);"
|
||||
[ "$status" -eq 0 ]
|
||||
run dolt sql -q "SELECT * FROM test WHERE c0 > 2;" -r csv
|
||||
run dolt sql -q "SELECT * FROM test WHERE c0 > 2 ORDER BY pk;" -r csv
|
||||
echo $output
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "3,3" ]] || false
|
||||
[[ "$output" =~ "10,10" ]] || false
|
||||
@@ -98,13 +99,13 @@ SQL
|
||||
|
||||
run dolt sql -q "INSERT INTO test (pk,c0) VALUES (0,2);"
|
||||
[ "$status" -eq 0 ]
|
||||
run dolt sql -q "SELECT * FROM test WHERE c0 > 1;" -r csv
|
||||
run dolt sql -q "SELECT * FROM test WHERE c0 > 1 ORDER BY pk;" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "2,2" ]] || false
|
||||
|
||||
run dolt sql -q "INSERT INTO test VALUES (0,3), (10,10), (0,11);"
|
||||
[ "$status" -eq 0 ]
|
||||
run dolt sql -q "SELECT * FROM test WHERE c0 > 2;" -r csv
|
||||
run dolt sql -q "SELECT * FROM test WHERE c0 > 2 ORDER BY pk;" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "3,3" ]] || false
|
||||
[[ "$output" =~ "10,10" ]] || false
|
||||
@@ -121,7 +122,7 @@ INSERT INTO test (c0) VALUES (21);
|
||||
SQL
|
||||
[ "$status" -eq 0 ]
|
||||
|
||||
run dolt sql -q "SELECT * FROM test;" -r csv
|
||||
run dolt sql -q "SELECT * FROM test ORDER BY pk;" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "1,1" ]] || false
|
||||
[[ "$output" =~ "2,2" ]] || false
|
||||
@@ -143,7 +144,7 @@ INSERT INTO test2 SELECT (pk + 20), c0 FROM test2;
|
||||
SQL
|
||||
[ "$status" -eq 0 ]
|
||||
|
||||
run dolt sql -q "select * from test2 order by pk" -r csv
|
||||
run dolt sql -q "select * from test2 ORDER BY pk" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "1,1" ]] || false
|
||||
[[ "$output" =~ "2,2" ]] || false
|
||||
@@ -170,7 +171,7 @@ SQL
|
||||
dolt sql -q "INSERT INTO auto_float (pk, c0) VALUES (3.9,4);"
|
||||
dolt sql -q "INSERT INTO auto_float (c0) VALUES (5);"
|
||||
|
||||
run dolt sql -q "SELECT * FROM auto_float;" -r csv
|
||||
run dolt sql -q "SELECT * FROM auto_float ORDER BY pk;" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "1,1" ]] || false
|
||||
[[ "$output" =~ "2.1,2" ]] || false
|
||||
@@ -193,7 +194,7 @@ SQL
|
||||
echo "$TYPE"
|
||||
run dolt sql -q "INSERT INTO auto_$TYPE (c0) VALUES (2);"
|
||||
[ "$status" -eq 0 ]
|
||||
run dolt sql -q "SELECT * FROM auto_$TYPE WHERE c0 > 1;" -r csv
|
||||
run dolt sql -q "SELECT * FROM auto_$TYPE WHERE c0 > 1 ORDER BY pk;" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "2,2" ]] || false
|
||||
done
|
||||
@@ -211,7 +212,7 @@ SQL
|
||||
echo "$TYPE"
|
||||
run dolt sql -q "INSERT INTO auto2_$TYPE (c0) VALUES (2);"
|
||||
[ "$status" -eq 0 ]
|
||||
run dolt sql -q "SELECT * FROM auto2_$TYPE WHERE c0 > 1;" -r csv
|
||||
run dolt sql -q "SELECT * FROM auto2_$TYPE WHERE c0 > 1 ORDER BY pk;" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "2,2" ]] || false
|
||||
done
|
||||
@@ -248,7 +249,7 @@ SQL
|
||||
dolt merge other
|
||||
|
||||
dolt sql -q "INSERT INTO test VALUES (NULL,22);"
|
||||
run dolt sql -q "SELECT pk FROM test WHERE c0 = 22;" -r csv
|
||||
run dolt sql -q "SELECT pk FROM test WHERE c0 = 22 ORDER BY pk;" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "22" ]] || false
|
||||
}
|
||||
@@ -271,7 +272,7 @@ SQL
|
||||
dolt checkout master
|
||||
dolt merge other
|
||||
dolt sql -q "INSERT INTO test VALUES (NULL,22);"
|
||||
run dolt sql -q "SELECT pk FROM test WHERE c0 = 22;" -r csv
|
||||
run dolt sql -q "SELECT pk FROM test WHERE c0 = 22 ORDER BY pk;" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "22" ]] || false
|
||||
}
|
||||
@@ -280,7 +281,7 @@ SQL
|
||||
run dolt sql -q "ALTER TABLE test AUTO_INCREMENT = 10;"
|
||||
[ "$status" -eq 0 ]
|
||||
dolt sql -q "INSERT INTO test VALUES (NULL,10);"
|
||||
run dolt sql -q "SELECT * FROM test;" -r csv
|
||||
run dolt sql -q "SELECT * FROM test ORDER BY pk;" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "10,10" ]] || false
|
||||
|
||||
@@ -288,7 +289,7 @@ SQL
|
||||
ALTER TABLE test AUTO_INCREMENT = 20;
|
||||
INSERT INTO test VALUES (NULL,20),(30,30),(NULL,31);
|
||||
SQL
|
||||
run dolt sql -q "SELECT * FROM test;" -r csv
|
||||
run dolt sql -q "SELECT * FROM test ORDER BY pk;" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "10,10" ]] || false
|
||||
[[ "$output" =~ "20,20" ]] || false
|
||||
@@ -310,7 +311,7 @@ ALTER TABLE index_test ADD INDEX (c0);
|
||||
INSERT INTO index_test (c0) VALUES (4),(5),(6);
|
||||
SQL
|
||||
|
||||
run dolt sql -q "select * from index_test" -r csv
|
||||
run dolt sql -q "select * from index_test ORDER BY pk" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "${lines[0]}" =~ "pk,c0" ]] || false
|
||||
[[ "${lines[1]}" =~ "1,1" ]] || false
|
||||
@@ -329,7 +330,7 @@ SQL
|
||||
|
||||
dolt sql -q "INSERT INTO test (c0) SELECT pk FROM other;"
|
||||
|
||||
run dolt sql -q "SELECT * FROM test;" -r csv
|
||||
run dolt sql -q "SELECT * FROM test ORDER BY pk;" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "${lines[0]}" =~ "pk,c0" ]] || false
|
||||
[[ "${lines[1]}" =~ "1,1" ]] || false
|
||||
@@ -351,7 +352,7 @@ TRUNCATE t;
|
||||
INSERT INTO t (c0) VALUES (1),(2),(3);
|
||||
SQL
|
||||
|
||||
run dolt sql -q "SELECT * FROM t;" -r csv
|
||||
run dolt sql -q "SELECT * FROM t ORDER BY pk;" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "${lines[0]}" =~ "pk,c0" ]] || false
|
||||
[[ "${lines[1]}" =~ "1,1" ]] || false
|
||||
@@ -370,7 +371,7 @@ INSERT INTO t (c0) VALUES (1),(2),(3);
|
||||
INSERT INTO t (c0) VALUES (4),(5),(6);
|
||||
SQL
|
||||
|
||||
run dolt sql -q "SELECT * FROM t;" -r csv
|
||||
run dolt sql -q "SELECT * FROM t ORDER BY pk;" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "${lines[0]}" =~ "pk,c0" ]] || false
|
||||
[[ "${lines[1]}" =~ "1,1" ]] || false
|
||||
@@ -393,7 +394,7 @@ INSERT INTO t VALUES (4, 4);
|
||||
INSERT INTO t (c0) VALUES (5),(6),(7);
|
||||
SQL
|
||||
|
||||
run dolt sql -q "SELECT * FROM t;" -r csv
|
||||
run dolt sql -q "SELECT * FROM t ORDER BY pk;" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "${lines[0]}" =~ "pk,c0" ]] || false
|
||||
[[ "${lines[1]}" =~ "1,1" ]] || false
|
||||
@@ -419,7 +420,7 @@ INSERT into t VALUES (3, 3);
|
||||
INSERT INTO t (c0) VALUES (8);
|
||||
SQL
|
||||
|
||||
run dolt sql -q "SELECT * FROM t;" -r csv
|
||||
run dolt sql -q "SELECT * FROM t ORDER BY pk;" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "${lines[0]}" =~ "pk,c0" ]] || false
|
||||
[[ "${lines[1]}" =~ "1,1" ]] || false
|
||||
@@ -451,7 +452,7 @@ SELECT DOLT_MERGE('test');
|
||||
INSERT INTO t VALUES (NULL,5),(6,6),(NULL,7);
|
||||
SQL
|
||||
|
||||
run dolt sql -q "SELECT * FROM t;" -r csv
|
||||
run dolt sql -q "SELECT * FROM t ORDER BY pk;" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "${lines[0]}" =~ "pk,c0" ]] || false
|
||||
[[ "${lines[1]}" =~ "1,1" ]] || false
|
||||
@@ -482,7 +483,7 @@ SELECT DOLT_MERGE('test');
|
||||
INSERT INTO t VALUES (10,10),(NULL,11);
|
||||
SQL
|
||||
|
||||
run dolt sql -q "SELECT * FROM t;" -r csv
|
||||
run dolt sql -q "SELECT * FROM t ORDER BY pk;" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "${lines[0]}" =~ "pk,c0" ]] || false
|
||||
[[ "${lines[1]}" =~ "1,1" ]] || false
|
||||
@@ -515,7 +516,7 @@ SELECT DOLT_MERGE('test');
|
||||
INSERT INTO t VALUES (3,3),(NULL,6);
|
||||
SQL
|
||||
|
||||
run dolt sql -q "SELECT * FROM t;" -r csv
|
||||
run dolt sql -q "SELECT * FROM t ORDER BY pk;" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "${lines[0]}" =~ "pk,c0" ]] || false
|
||||
[[ "${lines[1]}" =~ "1,1" ]] || false
|
||||
@@ -548,7 +549,7 @@ SELECT DOLT_MERGE('test');
|
||||
INSERT INTO t VALUES (NULL,6);
|
||||
SQL
|
||||
|
||||
run dolt sql -q "SELECT * FROM t;" -r csv
|
||||
run dolt sql -q "SELECT * FROM t ORDER BY pk;" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "${lines[0]}" =~ "pk,c0" ]] || false
|
||||
[[ "${lines[1]}" =~ "1,1" ]] || false
|
||||
@@ -564,7 +565,7 @@ SQL
|
||||
[ "$status" -eq 0 ]
|
||||
|
||||
dolt sql -q "insert into test2 values (0, 'john', 0)"
|
||||
run dolt sql -q "SELECT * from test2" -r csv
|
||||
run dolt sql -q "SELECT * from test2 ORDER BY pk" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "0,john,0" ]] || false
|
||||
}
|
||||
@@ -574,7 +575,7 @@ SQL
|
||||
dolt sql -q "ALTER TABLE t CHANGE COLUMN pk pk int NOT NULL AUTO_INCREMENT PRIMARY KEY;"
|
||||
|
||||
dolt sql -q 'insert into t values (NULL), (NULL), (NULL)'
|
||||
run dolt sql -q "SELECT * FROM t" -r csv
|
||||
run dolt sql -q "SELECT * FROM t ORDER BY pk" -r csv
|
||||
[[ "${lines[0]}" =~ "pk" ]] || false
|
||||
[[ "${lines[1]}" =~ "1" ]] || false
|
||||
[[ "${lines[2]}" =~ "2" ]] || false
|
||||
|
||||
@@ -100,12 +100,12 @@ test_mutation() {
|
||||
expected="$3"
|
||||
uses_pk="$4"
|
||||
dolt sql -q "$dml"
|
||||
run dolt sql -q "select * from $table" -r csv
|
||||
run dolt sql -q "select * from $table ORDER BY pk1" -r csv
|
||||
[ "$status" -eq "0" ]
|
||||
[ "$output" == "$expected" ] || (echo $output && exit 1)
|
||||
dolt reset --hard
|
||||
dolt sql --batch -q "$dml ; $dml"
|
||||
run dolt sql -q "select * from $table" -r csv
|
||||
run dolt sql -q "select * from $table ORDER BY pk1" -r csv
|
||||
[ "$status" -eq "0" ]
|
||||
[ "$output" == "$expected" ] || (echo $output && exit 1)
|
||||
run dolt sql -q "explain $dml"
|
||||
|
||||
@@ -392,7 +392,7 @@ SQL
|
||||
run dolt ls
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "test" ]] || false
|
||||
run dolt sql -q "select * from test"
|
||||
run dolt sql -q "select * from test ORDER BY pk"
|
||||
[ "$status" -eq 0 ]
|
||||
[ "${#lines[@]}" -eq 11 ]
|
||||
[ "${lines[3]}" = '| a | "" | 1 |' ]
|
||||
@@ -418,7 +418,7 @@ SQL
|
||||
[ "$status" -eq 0 ]
|
||||
|
||||
# schema argument subsets the data and adds empty column
|
||||
run dolt sql -r csv -q "select * from subset"
|
||||
run dolt sql -r csv -q "select * from subset ORDER BY pk"
|
||||
[ "$status" -eq 0 ]
|
||||
[ "${lines[0]}" = "pk,c1,c3,noData" ]
|
||||
[ "${lines[1]}" = "0,1,3," ]
|
||||
@@ -440,7 +440,7 @@ SQL
|
||||
run dolt ls
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "empty_strings_null_values" ]] || false
|
||||
run dolt sql -q "select * from empty_strings_null_values"
|
||||
run dolt sql -q "select * from empty_strings_null_values ORDER BY pk"
|
||||
[ "$status" -eq 0 ]
|
||||
[ "${#lines[@]}" -eq 11 ]
|
||||
[ "${lines[3]}" = '| a | "" | 1 |' ]
|
||||
@@ -467,7 +467,7 @@ SQL
|
||||
run dolt ls
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "test" ]] || false
|
||||
run dolt sql -q "select * from test"
|
||||
run dolt sql -q "select * from test ORDER BY pk"
|
||||
[ "$status" -eq 0 ]
|
||||
[ "${#lines[@]}" -eq 11 ]
|
||||
[ "${lines[3]}" = '| a | "" | 1 |' ]
|
||||
|
||||
@@ -2025,13 +2025,13 @@ CREATE TABLE test2 (
|
||||
INSERT INTO test VALUES (0, NULL), (1, NULL), (2, NULL);
|
||||
INSERT INTO test2 VALUES (0, NULL, NULL), (1, NULL, NULL), (2, 1, NULL), (3, 1, NULL), (4, NULL, 1), (5, NULL, 1);
|
||||
SQL
|
||||
run dolt sql -q "SELECT * FROM test" -r=json
|
||||
run dolt sql -q "SELECT * FROM test order by pk" -r=json
|
||||
[ "$status" -eq "0" ]
|
||||
[[ "$output" =~ '{"rows": [{"pk":0},{"pk":1},{"pk":2}]}' ]] || false
|
||||
run dolt sql -q "SELECT * FROM test WHERE v1 IS NULL" -r=json
|
||||
run dolt sql -q "SELECT * FROM test WHERE v1 IS NULL order by pk" -r=json
|
||||
[ "$status" -eq "0" ]
|
||||
[[ "$output" =~ '{"rows": [{"pk":0},{"pk":1},{"pk":2}]}' ]] || false
|
||||
run dolt sql -q "SELECT * FROM test2" -r=json
|
||||
run dolt sql -q "SELECT * FROM test2 order by pk" -r=json
|
||||
[ "$status" -eq "0" ]
|
||||
[[ "$output" =~ '{"rows": [{"pk":0},{"pk":1},{"pk":2,"v1":1},{"pk":3,"v1":1},{"pk":4,"v2":1},{"pk":5,"v2":1}]}' ]] || false
|
||||
}
|
||||
|
||||
@@ -336,7 +336,7 @@ SQL
|
||||
dolt checkout master
|
||||
run dolt merge other
|
||||
[ "$status" -eq 0 ]
|
||||
run dolt sql -q "SELECT * FROM quiz;" -r csv
|
||||
run dolt sql -q "SELECT * FROM quiz ORDER BY pk;" -r csv
|
||||
[[ "${lines[0]}" =~ "pk" ]] || false
|
||||
[[ "${lines[1]}" =~ "10" ]] || false
|
||||
[[ "${lines[2]}" =~ "11" ]] || false
|
||||
|
||||
@@ -100,7 +100,7 @@ teardown() {
|
||||
|
||||
@test "query-catalog: executed saved" {
|
||||
Q1="select pk, pk1, pk2 from one_pk,two_pk where one_pk.c1=two_pk.c1 order by 1"
|
||||
Q2="select pk from one_pk"
|
||||
Q2="select pk from one_pk order by pk"
|
||||
dolt sql -q "$Q1" -s name1
|
||||
dolt sql -q "$Q2" -s name2
|
||||
|
||||
@@ -138,7 +138,7 @@ EOF
|
||||
EXPECTED=$(cat <<'EOF'
|
||||
id,display_order,name,query,description
|
||||
name1,1,name1,"select pk, pk1, pk2 from one_pk,two_pk where one_pk.c1=two_pk.c1 order by 1",""
|
||||
name2,2,name2,select pk from one_pk,""
|
||||
name2,2,name2,select pk from one_pk order by pk,""
|
||||
EOF
|
||||
)
|
||||
|
||||
@@ -154,7 +154,7 @@ EOF
|
||||
EXPECTED=$(cat <<'EOF'
|
||||
id,display_order,name,query,description
|
||||
name1,1,name1,"select pk, pk1, pk2 from one_pk,two_pk where one_pk.c1=two_pk.c1 and pk < 3 order by 1 desc",""
|
||||
name2,2,name2,select pk from one_pk,""
|
||||
name2,2,name2,select pk from one_pk order by pk,""
|
||||
EOF
|
||||
)
|
||||
|
||||
|
||||
@@ -683,7 +683,7 @@ SQL
|
||||
SELECT DOLT_MERGE('feature-branch');
|
||||
"
|
||||
|
||||
server_query repo1 1 "SELECT * FROM test" "pk\n1\n2\n3\n1000"
|
||||
server_query repo1 1 "SELECT * FROM test ORDER BY pk" "pk\n1\n2\n3\n1000"
|
||||
|
||||
server_query repo1 1 "SELECT COUNT(*) FROM dolt_log" "COUNT(*)\n3"
|
||||
}
|
||||
|
||||
@@ -324,23 +324,23 @@ SQL
|
||||
}
|
||||
|
||||
@test "sql: basic inner join" {
|
||||
run dolt sql -q "select pk,pk1,pk2 from one_pk join two_pk on one_pk.c1=two_pk.c1"
|
||||
run dolt sql -q "select pk,pk1,pk2 from one_pk join two_pk on one_pk.c1=two_pk.c1 order by pk"
|
||||
[ "$status" -eq 0 ]
|
||||
[ "${#lines[@]}" -eq 8 ]
|
||||
first_join_output=$output
|
||||
run dolt sql -q "select pk,pk1,pk2 from two_pk join one_pk on one_pk.c1=two_pk.c1"
|
||||
run dolt sql -q "select pk,pk1,pk2 from two_pk join one_pk on one_pk.c1=two_pk.c1 order by pk"
|
||||
[ "$status" -eq 0 ]
|
||||
[ "${#lines[@]}" -eq 8 ]
|
||||
[ "$output" = "$first_join_output" ]
|
||||
run dolt sql -q "select pk,pk1,pk2 from one_pk join two_pk on one_pk.c1=two_pk.c1 where pk=1"
|
||||
run dolt sql -q "select pk,pk1,pk2 from one_pk join two_pk on one_pk.c1=two_pk.c1 where pk=1 order by pk"
|
||||
[ "$status" -eq 0 ]
|
||||
[ "${#lines[@]}" -eq 5 ]
|
||||
run dolt sql -q "select pk,pk1,pk2,one_pk.c1 as foo,two_pk.c1 as bar from one_pk join two_pk on one_pk.c1=two_pk.c1"
|
||||
run dolt sql -q "select pk,pk1,pk2,one_pk.c1 as foo,two_pk.c1 as bar from one_pk join two_pk on one_pk.c1=two_pk.c1 order by pk"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ foo ]] || false
|
||||
[[ "$output" =~ bar ]] || false
|
||||
[ "${#lines[@]}" -eq 8 ]
|
||||
run dolt sql -q "select pk,pk1,pk2,one_pk.c1 as foo,two_pk.c1 as bar from one_pk join two_pk on one_pk.c1=two_pk.c1 where one_pk.c1=10"
|
||||
run dolt sql -q "select pk,pk1,pk2,one_pk.c1 as foo,two_pk.c1 as bar from one_pk join two_pk on one_pk.c1=two_pk.c1 where one_pk.c1=10 order by pk"
|
||||
[ "$status" -eq 0 ]
|
||||
[ "${#lines[@]}" -eq 5 ]
|
||||
[[ "$output" =~ "10" ]] || false
|
||||
|
||||
Reference in New Issue
Block a user