optimize keyless read row (#2094)

This commit is contained in:
Brian Hendriks
2021-09-23 10:57:31 -07:00
committed by GitHub
parent b3c1b82b99
commit 5cc0852692
11 changed files with 141 additions and 80 deletions

View File

@@ -24,7 +24,8 @@ import (
)
func init() {
sqle.MinRowsPerPartition = 2
sqle.MinRowsPerPartition = 8
sqle.MaxRowsPerPartition = 1024
}
func TestQueries(t *testing.T) {

View File

@@ -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.

View File

@@ -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}
}

View File

@@ -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

View File

@@ -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"

View File

@@ -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 |' ]

View File

@@ -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
}

View File

@@ -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

View File

@@ -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
)

View File

@@ -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"
}

View File

@@ -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