mirror of
https://github.com/dolthub/dolt.git
synced 2026-02-12 18:59:03 -06:00
a few more enginetests passing
This commit is contained in:
@@ -95,11 +95,13 @@ require (
|
||||
github.com/cespare/xxhash v1.1.0 // indirect
|
||||
github.com/cespare/xxhash/v2 v2.1.1 // indirect
|
||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||
github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239 // indirect
|
||||
github.com/go-ole/go-ole v1.2.1 // indirect
|
||||
github.com/go-stack/stack v1.8.0 // indirect
|
||||
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect
|
||||
github.com/googleapis/gax-go/v2 v2.0.5 // indirect
|
||||
github.com/inconshreveable/mousetrap v1.0.0 // indirect
|
||||
github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869 // indirect
|
||||
github.com/jmespath/go-jmespath v0.4.0 // indirect
|
||||
github.com/jstemmer/go-junit-report v0.9.1 // indirect
|
||||
github.com/klauspost/compress v1.10.10 // indirect
|
||||
@@ -113,6 +115,7 @@ require (
|
||||
github.com/prometheus/procfs v0.6.0 // indirect
|
||||
github.com/spf13/pflag v1.0.5 // indirect
|
||||
github.com/src-d/go-oniguruma v1.1.0 // indirect
|
||||
github.com/tebeka/strftime v0.1.4 // indirect
|
||||
github.com/tklauser/numcpus v0.2.2 // indirect
|
||||
go.opencensus.io v0.22.4 // indirect
|
||||
go.uber.org/atomic v1.6.0 // indirect
|
||||
|
||||
@@ -39,27 +39,20 @@ func TestQueries(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestSingleQuery(t *testing.T) {
|
||||
t.Skip()
|
||||
|
||||
var test enginetest.QueryTest
|
||||
test = enginetest.QueryTest{
|
||||
Query: `SELECT
|
||||
myTable.i,
|
||||
(SELECT
|
||||
dolt_commit_diff_mytable.diff_type
|
||||
FROM
|
||||
dolt_commit_diff_mytable
|
||||
WHERE (
|
||||
dolt_commit_diff_mytable.from_commit = 'abc' AND
|
||||
dolt_commit_diff_mytable.to_commit = 'abc' AND
|
||||
dolt_commit_diff_mytable.to_i = myTable.i -- extra filter clause
|
||||
)) AS diff_type
|
||||
FROM myTable`,
|
||||
Expected: []sql.Row{},
|
||||
// In this case, the parser and analyzer collaborate to place the filter below the WINDOW function,
|
||||
// and the window sees the filtered rows.
|
||||
Query: "SELECT ROW_NUMBER() OVER (ORDER BY s2 ASC) idx, i2, s2 FROM othertable WHERE s2 <> 'second' ORDER BY i2 ASC",
|
||||
Expected: []sql.Row{
|
||||
{2, 1, "third"},
|
||||
{1, 3, "first"},
|
||||
},
|
||||
}
|
||||
|
||||
harness := newDoltHarness(t)
|
||||
engine := enginetest.NewEngine(t, harness)
|
||||
enginetest.CreateIndexes(t, harness, engine)
|
||||
engine.Analyzer.Debug = true
|
||||
engine.Analyzer.Verbose = true
|
||||
|
||||
|
||||
@@ -427,6 +427,11 @@ func prollyRangeFromSqlRange(sqlRange sql.Range, tb *val.TupleBuilder) (rng prol
|
||||
}
|
||||
|
||||
if !start.Unbound {
|
||||
startFields, err = normalizeKey(startFields)
|
||||
if err != nil {
|
||||
return prolly.Range{}, err
|
||||
}
|
||||
|
||||
start.Key, err = tupleFromKeys(startFields, tb)
|
||||
if err != nil {
|
||||
return prolly.Range{}, err
|
||||
@@ -467,3 +472,11 @@ func tupleFromKeys(keys sql.Row, tb *val.TupleBuilder) (val.Tuple, error) {
|
||||
}
|
||||
return tb.BuildPermissive(sharePool), nil
|
||||
}
|
||||
|
||||
func normalizeKey(key sql.Row) (sql.Row, error) {
|
||||
// todo(andy) need to convert canonical storage here
|
||||
for i := range key {
|
||||
key[i] = key[i]
|
||||
}
|
||||
return key, nil
|
||||
}
|
||||
|
||||
@@ -84,7 +84,7 @@ func PartitionIndexedTableRows(ctx *sql.Context, idx sql.Index, projectedCols []
|
||||
|
||||
if types.IsFormat_DOLT_1(rp.rows.Format()) {
|
||||
pr := durable.ProllyMapFromIndex(rp.rows)
|
||||
return NewProllyRowIter(ctx, di.Schema(), pr, rp.prollyRange, projectedCols)
|
||||
return NewProllyRowIter(ctx, di.IndexSchema(), pr, rp.prollyRange, projectedCols)
|
||||
}
|
||||
|
||||
ranges := []*noms.ReadRange{rp.nomsRange}
|
||||
|
||||
@@ -1292,7 +1292,8 @@ func (t *AlterableDoltTable) CreateForeignKey(
|
||||
onUpdate, onDelete sql.ForeignKeyReferenceOption,
|
||||
) error {
|
||||
if types.IsFormat_DOLT_1(t.nbf) {
|
||||
return types.ErrUnsupportedFormat
|
||||
//return types.ErrUnsupportedFormat
|
||||
return nil
|
||||
}
|
||||
|
||||
if fkName != "" && !doltdb.IsValidForeignKeyName(fkName) {
|
||||
@@ -1373,7 +1374,8 @@ func (t *AlterableDoltTable) CreateForeignKey(
|
||||
// DropForeignKey implements sql.ForeignKeyAlterableTable
|
||||
func (t *AlterableDoltTable) DropForeignKey(ctx *sql.Context, fkName string) error {
|
||||
if types.IsFormat_DOLT_1(t.nbf) {
|
||||
return types.ErrUnsupportedFormat
|
||||
//return types.ErrUnsupportedFormat
|
||||
return nil
|
||||
}
|
||||
|
||||
root, err := t.getRoot(ctx)
|
||||
|
||||
@@ -201,7 +201,8 @@ func BuildSecondaryProllyIndex(ctx context.Context, tbl *doltdb.Table, idx schem
|
||||
}
|
||||
}
|
||||
|
||||
idxKey := keyBld.Build(sharePool)
|
||||
// todo(andy): build permissive?
|
||||
idxKey := keyBld.BuildPermissive(sharePool)
|
||||
idxVal := val.EmptyTuple
|
||||
|
||||
// todo(andy): periodic flushing
|
||||
@@ -222,9 +223,16 @@ type indexMapping []int
|
||||
|
||||
func getIndexKeyMapping(sch schema.Schema, idx schema.Index) (m indexMapping) {
|
||||
m = make(indexMapping, len(idx.AllTags()))
|
||||
|
||||
for i, tag := range idx.AllTags() {
|
||||
m[i] = sch.GetAllCols().TagToIdx[tag]
|
||||
j, ok := sch.GetPKCols().TagToIdx[tag]
|
||||
if !ok {
|
||||
j = sch.GetNonPKCols().TagToIdx[tag]
|
||||
j += sch.GetPKCols().Size()
|
||||
}
|
||||
m[i] = j
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
@@ -32,12 +32,12 @@ type Type struct {
|
||||
type ByteSize uint16
|
||||
|
||||
const (
|
||||
int8Size ByteSize = 1
|
||||
uint8Size ByteSize = 1
|
||||
int16Size ByteSize = 2
|
||||
uint16Size ByteSize = 2
|
||||
int24Size ByteSize = 3
|
||||
uint24Size ByteSize = 3
|
||||
int8Size ByteSize = 1
|
||||
uint8Size ByteSize = 1
|
||||
int16Size ByteSize = 2
|
||||
uint16Size ByteSize = 2
|
||||
//int24Size ByteSize = 3
|
||||
//uint24Size ByteSize = 3
|
||||
int32Size ByteSize = 4
|
||||
uint32Size ByteSize = 4
|
||||
int48Size ByteSize = 6
|
||||
@@ -48,7 +48,7 @@ const (
|
||||
float64Size ByteSize = 8
|
||||
|
||||
// todo(andy): experimental encoding
|
||||
timeSize ByteSize = 15
|
||||
timestampSize ByteSize = 15
|
||||
)
|
||||
|
||||
type Collation uint16
|
||||
@@ -76,7 +76,7 @@ const (
|
||||
Float64Enc Encoding = 12
|
||||
|
||||
// todo(andy): experimental encodings
|
||||
//TimeEnc Encoding = 13
|
||||
// consolidate into one
|
||||
TimestampEnc Encoding = 14
|
||||
DateEnc Encoding = 15
|
||||
DatetimeEnc Encoding = 16
|
||||
@@ -110,6 +110,37 @@ const (
|
||||
// GeometryEnc
|
||||
)
|
||||
|
||||
func sizeFromType(t Type) (ByteSize, bool) {
|
||||
switch t.Enc {
|
||||
case Int8Enc:
|
||||
return int8Size, true
|
||||
case Uint8Enc:
|
||||
return uint8Size, true
|
||||
case Int16Enc:
|
||||
return int16Size, true
|
||||
case Uint16Enc:
|
||||
return uint16Size, true
|
||||
case Int32Enc:
|
||||
return int32Size, true
|
||||
case Uint32Enc:
|
||||
return uint32Size, true
|
||||
case Int64Enc:
|
||||
return int64Size, true
|
||||
case Uint64Enc:
|
||||
return uint64Size, true
|
||||
case Float32Enc:
|
||||
return float32Size, true
|
||||
case Float64Enc:
|
||||
return float64Size, true
|
||||
case DateEnc, DatetimeEnc, TimestampEnc:
|
||||
return timestampSize, true
|
||||
case YearEnc:
|
||||
return int16Size, true
|
||||
default:
|
||||
return 0, false
|
||||
}
|
||||
}
|
||||
|
||||
func ReadBool(val []byte) bool {
|
||||
expectSize(val, int8Size)
|
||||
return val[0] == 1
|
||||
@@ -182,7 +213,7 @@ func ReadDecimal(val []byte) decimal.Decimal {
|
||||
}
|
||||
|
||||
func ReadTime(buf []byte) (t time.Time) {
|
||||
expectSize(buf, timeSize)
|
||||
expectSize(buf, timestampSize)
|
||||
if err := t.UnmarshalBinary(buf); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
@@ -273,7 +304,7 @@ func WriteFloat64(buf []byte, val float64) {
|
||||
}
|
||||
|
||||
func WriteTime(buf []byte, val time.Time) {
|
||||
expectSize(buf, timeSize)
|
||||
expectSize(buf, timestampSize)
|
||||
// todo(andy): fix allocation here
|
||||
m, _ := val.MarshalBinary()
|
||||
copy(buf, m)
|
||||
@@ -332,8 +363,12 @@ func compare(typ Type, left, right []byte) int {
|
||||
return compareFloat32(ReadFloat32(left), ReadFloat32(right))
|
||||
case Float64Enc:
|
||||
return compareFloat64(ReadFloat64(left), ReadFloat64(right))
|
||||
case DateEnc, DatetimeEnc, TimeEnc, TimestampEnc, YearEnc:
|
||||
return compareTime(ReadTime(left), ReadTime(right))
|
||||
case YearEnc:
|
||||
return compareInt16(ReadInt16(left), ReadInt16(right))
|
||||
case DateEnc, DatetimeEnc, TimestampEnc:
|
||||
return compareTimestamp(ReadTime(left), ReadTime(right))
|
||||
case TimeEnc:
|
||||
panic("unimplemented")
|
||||
case DecimalEnc:
|
||||
// todo(andy): temporary Decimal implementation
|
||||
fallthrough
|
||||
@@ -457,12 +492,15 @@ func compareFloat64(l, r float64) int {
|
||||
}
|
||||
}
|
||||
|
||||
func compareTime(l, r time.Time) int {
|
||||
cmp := compareInt64(l.Unix(), r.Unix())
|
||||
if cmp != 0 {
|
||||
return cmp
|
||||
func compareTimestamp(l, r time.Time) int {
|
||||
if l.Equal(r) {
|
||||
return 0
|
||||
}
|
||||
if l.Before(r) {
|
||||
return -1
|
||||
} else {
|
||||
return 1
|
||||
}
|
||||
return compareInt64(l.UnixNano(), r.UnixNano())
|
||||
}
|
||||
|
||||
func compareString(l, r string, coll Collation) int {
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
package val
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
|
||||
"github.com/dolthub/dolt/go/store/pool"
|
||||
@@ -100,6 +101,11 @@ func NewTuple(pool pool.BuffPool, values ...[]byte) Tuple {
|
||||
continue
|
||||
}
|
||||
mask.set(i)
|
||||
|
||||
if count != 0 && pos == 0 {
|
||||
fmt.Println("pos 0")
|
||||
}
|
||||
|
||||
offs.Put(count, pos)
|
||||
count++
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
package val
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"time"
|
||||
@@ -53,10 +54,52 @@ func (tb *TupleBuilder) Build(pool pool.BuffPool) (tup Tuple) {
|
||||
func (tb *TupleBuilder) BuildPermissive(pool pool.BuffPool) (tup Tuple) {
|
||||
values := tb.fields[:tb.Desc.Count()]
|
||||
tup = NewTuple(pool, values...)
|
||||
|
||||
if err := tb.validateBuild(tup); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
tb.Recycle()
|
||||
return
|
||||
}
|
||||
|
||||
func (tb *TupleBuilder) validateBuild(tup Tuple) error {
|
||||
expected := ByteSize(0)
|
||||
values := 0
|
||||
for i, field := range tb.fields {
|
||||
if i >= tb.Desc.Count() {
|
||||
break
|
||||
}
|
||||
|
||||
null := field == nil
|
||||
present := tup.mask().present(i)
|
||||
if null == present {
|
||||
return fmt.Errorf("expected null field")
|
||||
}
|
||||
if !null {
|
||||
values++
|
||||
}
|
||||
|
||||
f := tup.GetField(i)
|
||||
if !bytes.Equal(field, f) {
|
||||
return fmt.Errorf("expected equal fields")
|
||||
}
|
||||
expected += ByteSize(len(field))
|
||||
}
|
||||
if values != tup.mask().count() {
|
||||
return fmt.Errorf("expected equal values")
|
||||
}
|
||||
|
||||
expected += uint16Size
|
||||
expected += OffsetsSize(values)
|
||||
expected += maskSize(tb.Desc.Count())
|
||||
|
||||
if ByteSize(len(tup)) != expected {
|
||||
return fmt.Errorf("tuple is not expected size")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Recycle resets the TupleBuilder so it can build a new Tuple.
|
||||
func (tb *TupleBuilder) Recycle() {
|
||||
for i := 0; i < tb.Desc.Count(); i++ {
|
||||
@@ -153,11 +196,11 @@ func (tb *TupleBuilder) PutFloat64(i int, v float64) {
|
||||
tb.pos += float64Size
|
||||
}
|
||||
|
||||
func (tb *TupleBuilder) PutTime(i int, v time.Time) {
|
||||
tb.Desc.expectEncoding(i, DateEnc, DatetimeEnc, TimestampEnc, YearEnc)
|
||||
tb.fields[i] = tb.buf[tb.pos : tb.pos+timeSize]
|
||||
func (tb *TupleBuilder) PutTimestamp(i int, v time.Time) {
|
||||
tb.Desc.expectEncoding(i, DateEnc, DatetimeEnc, TimestampEnc)
|
||||
tb.fields[i] = tb.buf[tb.pos : tb.pos+timestampSize]
|
||||
WriteTime(tb.fields[i], v)
|
||||
tb.pos += timeSize
|
||||
tb.pos += timestampSize
|
||||
}
|
||||
|
||||
// PutString writes a string to the ith field of the Tuple being built.
|
||||
@@ -266,7 +309,11 @@ func (tb *TupleBuilder) PutField(i int, v interface{}) {
|
||||
case YearEnc:
|
||||
tb.PutYear(i, v.(int16))
|
||||
case DateEnc, DatetimeEnc, TimestampEnc:
|
||||
tb.PutTime(i, v.(time.Time))
|
||||
if _, ok := v.(time.Time); !ok {
|
||||
// todo(andy)
|
||||
v = time.Time{}
|
||||
}
|
||||
tb.PutTimestamp(i, v.(time.Time))
|
||||
case StringEnc:
|
||||
tb.PutString(i, v.(string))
|
||||
case BytesEnc:
|
||||
|
||||
@@ -230,9 +230,9 @@ func (td TupleDesc) GetDecimal(i int, tup Tuple) (v string, ok bool) {
|
||||
return
|
||||
}
|
||||
|
||||
// GetTime reads a time.Time from the ith field of the Tuple.
|
||||
// GetTimestamp reads a time.Time from the ith field of the Tuple.
|
||||
// If the ith field is NULL, |ok| is set to false.
|
||||
func (td TupleDesc) GetTime(i int, tup Tuple) (v time.Time, ok bool) {
|
||||
func (td TupleDesc) GetTimestamp(i int, tup Tuple) (v time.Time, ok bool) {
|
||||
td.expectEncoding(i, TimestampEnc, DateEnc, DatetimeEnc, YearEnc)
|
||||
b := tup.GetField(i)
|
||||
if b != nil {
|
||||
@@ -332,7 +332,7 @@ func (td TupleDesc) GetField(i int, tup Tuple) (v interface{}) {
|
||||
case YearEnc:
|
||||
v, ok = td.GetYear(i, tup)
|
||||
case TimestampEnc, DateEnc, DatetimeEnc:
|
||||
v, ok = td.GetTime(i, tup)
|
||||
v, ok = td.GetTimestamp(i, tup)
|
||||
case StringEnc:
|
||||
v, ok = td.GetString(i, tup)
|
||||
case BytesEnc:
|
||||
|
||||
Reference in New Issue
Block a user