Skip to content

Commit d45eff7

Browse files
author
James Cor
committed
directly return rows
1 parent 541435e commit d45eff7

File tree

12 files changed

+145
-261
lines changed

12 files changed

+145
-261
lines changed

server/handler.go

Lines changed: 11 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -803,34 +803,7 @@ func (h *Handler) resultForDefaultIter2(ctx *sql.Context, c *mysql.Conn, iter sq
803803
defer timer.Stop()
804804

805805
wg := sync.WaitGroup{}
806-
wg.Add(2)
807-
808-
// TODO: this should be merged below go func
809-
var rowChan = make(chan sql.Row2, 512)
810-
eg.Go(func() (err error) {
811-
defer pan2err(&err)
812-
defer wg.Done()
813-
defer close(rowChan)
814-
for {
815-
select {
816-
case <-ctx.Done():
817-
return context.Cause(ctx)
818-
default:
819-
row, err := iter.Next2(ctx)
820-
if err == io.EOF {
821-
return nil
822-
}
823-
if err != nil {
824-
return err
825-
}
826-
select {
827-
case rowChan <- row:
828-
case <-ctx.Done():
829-
return nil
830-
}
831-
}
832-
}
833-
})
806+
wg.Add(1)
834807

835808
var res *sqltypes.Result
836809
var processedAtLeastOneBatch bool
@@ -864,18 +837,20 @@ func (h *Handler) resultForDefaultIter2(ctx *sql.Context, c *mysql.Conn, iter sq
864837
ctx.GetLogger().Tracef("connection timeout")
865838
return ErrRowTimeout.New()
866839
}
867-
case row, ok := <-rowChan:
868-
if !ok {
840+
default:
841+
row, err := iter.Next2(ctx)
842+
if err == io.EOF {
869843
return nil
870844
}
871-
// TODO: we can avoid deep copy here by redefining sql.Row2
872-
ctx.GetLogger().Tracef("spooling result row %s", row)
873-
outRow := make([]sqltypes.Value, len(row))
874-
for i := range row {
875-
outRow[i] = sqltypes.MakeTrusted(row[i].Typ, row[i].Val)
845+
if err != nil {
846+
return err
876847
}
877-
res.Rows = append(res.Rows, outRow)
848+
ctx.GetLogger().Tracef("spooling result row %s", row)
849+
res.Rows = append(res.Rows, row)
878850
res.RowsAffected++
851+
if !timer.Stop() {
852+
<-timer.C
853+
}
879854
}
880855
timer.Reset(waitTime)
881856
}

sql/convert_value.go

Lines changed: 20 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -3,98 +3,46 @@ package sql
33
import (
44
"fmt"
55

6-
"github.com/dolthub/vitess/go/vt/proto/query"
7-
86
"github.com/dolthub/go-mysql-server/sql/values"
7+
8+
"github.com/dolthub/vitess/go/sqltypes"
9+
"github.com/dolthub/vitess/go/vt/proto/query"
910
)
1011

1112
// ConvertToValue converts the interface to a sql value.
12-
func ConvertToValue(v interface{}) (Value, error) {
13+
func ConvertToValue(v interface{}) (sqltypes.Value, error) {
1314
switch v := v.(type) {
1415
case nil:
15-
return Value{
16-
Typ: query.Type_NULL_TYPE,
17-
Val: nil,
18-
}, nil
16+
return sqltypes.MakeTrusted(query.Type_NULL_TYPE, nil), nil
1917
case int:
20-
return Value{
21-
Typ: query.Type_INT64,
22-
Val: values.WriteInt64(make([]byte, values.Int64Size), int64(v)),
23-
}, nil
18+
return sqltypes.MakeTrusted(query.Type_INT64, values.WriteInt64(make([]byte, values.Int64Size), int64(v))), nil
2419
case int8:
25-
return Value{
26-
Typ: query.Type_INT8,
27-
Val: values.WriteInt8(make([]byte, values.Int8Size), v),
28-
}, nil
20+
return sqltypes.MakeTrusted(query.Type_INT8, values.WriteInt8(make([]byte, values.Int8Size), v)), nil
2921
case int16:
30-
return Value{
31-
Typ: query.Type_INT16,
32-
Val: values.WriteInt16(make([]byte, values.Int16Size), v),
33-
}, nil
22+
return sqltypes.MakeTrusted(query.Type_INT16, values.WriteInt16(make([]byte, values.Int16Size), v)), nil
3423
case int32:
35-
return Value{
36-
Typ: query.Type_INT32,
37-
Val: values.WriteInt32(make([]byte, values.Int32Size), v),
38-
}, nil
24+
return sqltypes.MakeTrusted(query.Type_INT32, values.WriteInt32(make([]byte, values.Int32Size), v)), nil
3925
case int64:
40-
return Value{
41-
Typ: query.Type_INT64,
42-
Val: values.WriteInt64(make([]byte, values.Int64Size), v),
43-
}, nil
26+
return sqltypes.MakeTrusted(query.Type_INT64, values.WriteInt64(make([]byte, values.Int64Size), v)), nil
4427
case uint:
45-
return Value{
46-
Typ: query.Type_UINT64,
47-
Val: values.WriteUint64(make([]byte, values.Uint64Size), uint64(v)),
48-
}, nil
28+
return sqltypes.MakeTrusted(query.Type_UINT64, values.WriteUint64(make([]byte, values.Uint64Size), uint64(v))), nil
4929
case uint8:
50-
return Value{
51-
Typ: query.Type_UINT8,
52-
Val: values.WriteUint8(make([]byte, values.Uint8Size), v),
53-
}, nil
30+
return sqltypes.MakeTrusted(query.Type_UINT8, values.WriteUint8(make([]byte, values.Uint8Size), v)), nil
5431
case uint16:
55-
return Value{
56-
Typ: query.Type_UINT16,
57-
Val: values.WriteUint16(make([]byte, values.Uint16Size), v),
58-
}, nil
32+
return sqltypes.MakeTrusted(query.Type_UINT16, values.WriteUint16(make([]byte, values.Uint16Size), v)), nil
5933
case uint32:
60-
return Value{
61-
Typ: query.Type_UINT32,
62-
Val: values.WriteUint32(make([]byte, values.Uint32Size), v),
63-
}, nil
34+
return sqltypes.MakeTrusted(query.Type_UINT32, values.WriteUint32(make([]byte, values.Uint32Size), v)), nil
6435
case uint64:
65-
return Value{
66-
Typ: query.Type_UINT64,
67-
Val: values.WriteUint64(make([]byte, values.Uint64Size), v),
68-
}, nil
36+
return sqltypes.MakeTrusted(query.Type_UINT64, values.WriteUint64(make([]byte, values.Uint64Size), v)), nil
6937
case float32:
70-
return Value{
71-
Typ: query.Type_FLOAT32,
72-
Val: values.WriteFloat32(make([]byte, values.Float32Size), v),
73-
}, nil
38+
return sqltypes.MakeTrusted(query.Type_FLOAT32, values.WriteFloat32(make([]byte, values.Float32Size), v)), nil
7439
case float64:
75-
return Value{
76-
Typ: query.Type_FLOAT64,
77-
Val: values.WriteFloat64(make([]byte, values.Float64Size), v),
78-
}, nil
40+
return sqltypes.MakeTrusted(query.Type_FLOAT64, values.WriteFloat64(make([]byte, values.Float64Size), v)), nil
7941
case string:
80-
return Value{
81-
Typ: query.Type_VARCHAR,
82-
Val: values.WriteString(make([]byte, len(v)), v, values.ByteOrderCollation),
83-
}, nil
42+
return sqltypes.MakeTrusted(query.Type_VARCHAR, values.WriteString(make([]byte, len(v)), v, values.ByteOrderCollation)), nil
8443
case []byte:
85-
return Value{
86-
Typ: query.Type_BLOB,
87-
Val: values.WriteBytes(make([]byte, len(v)), v, values.ByteOrderCollation),
88-
}, nil
44+
return sqltypes.MakeTrusted(query.Type_BLOB, values.WriteBytes(make([]byte, len(v)), v, values.ByteOrderCollation)), nil
8945
default:
90-
return Value{}, fmt.Errorf("type %T not implemented", v)
91-
}
92-
}
93-
94-
func MustConvertToValue(v interface{}) Value {
95-
ret, err := ConvertToValue(v)
96-
if err != nil {
97-
panic(err)
46+
return sqltypes.Value{}, fmt.Errorf("type %T not implemented", v)
9847
}
99-
return ret
10048
}

sql/core.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
"gopkg.in/src-d/go-errors.v1"
3131

3232
"github.com/dolthub/go-mysql-server/sql/values"
33+
"github.com/dolthub/vitess/go/sqltypes"
3334
)
3435

3536
// Expression is a combination of one or more SQL expressions.
@@ -464,7 +465,7 @@ func DebugString(nodeOrExpression interface{}) string {
464465
type Expression2 interface {
465466
Expression
466467
// Eval2 evaluates the given row frame and returns a result.
467-
Eval2(ctx *Context, row Row2) (Value, error)
468+
Eval2(ctx *Context, row Row2) (sqltypes.Value, error)
468469
// Type2 returns the expression type.
469470
Type2() Type2
470471
IsExpr2() bool

sql/expression/comparison.go

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515
package expression
1616

1717
import (
18-
"bytes"
1918
"fmt"
19+
"github.com/dolthub/vitess/go/sqltypes"
2020

2121
querypb "github.com/dolthub/vitess/go/vt/proto/query"
2222
errors "gopkg.in/src-d/go-errors.v1"
@@ -494,6 +494,7 @@ type GreaterThan struct {
494494
}
495495

496496
var _ sql.Expression = (*GreaterThan)(nil)
497+
var _ sql.Expression2 = (*GreaterThan)(nil)
497498
var _ sql.CollationCoercible = (*GreaterThan)(nil)
498499

499500
// NewGreaterThan creates a new GreaterThan expression.
@@ -520,7 +521,7 @@ func (gt *GreaterThan) Eval(ctx *sql.Context, row sql.Row) (interface{}, error)
520521
return result == 1, nil
521522
}
522523

523-
func (gt *GreaterThan) Eval2(ctx *sql.Context, row sql.Row2) (sql.Value, error) {
524+
func (gt *GreaterThan) Eval2(ctx *sql.Context, row sql.Row2) (sqltypes.Value, error) {
524525
l, ok := gt.Left().(sql.Expression2)
525526
if !ok {
526527
panic(fmt.Sprintf("%T does not implement sql.Expression2", gt.Left()))
@@ -532,23 +533,28 @@ func (gt *GreaterThan) Eval2(ctx *sql.Context, row sql.Row2) (sql.Value, error)
532533

533534
lv, err := l.Eval2(ctx, row)
534535
if err != nil {
535-
return sql.Value{}, nil
536+
return sqltypes.Value{}, err
536537
}
537538
rv, err := r.Eval2(ctx, row)
538539
if err != nil {
539-
return sql.Value{}, nil
540+
return sqltypes.Value{}, err
540541
}
541542

542-
// TODO: better implementation
543-
res := bytes.Compare(lv.Val, rv.Val) // TODO: this is probably wrong
543+
// TODO: just assume they are int64
544+
l64, err := types.ConvertValueToInt64(types.NumberTypeImpl_{}, lv)
545+
if err != nil {
546+
return sqltypes.Value{}, err
547+
}
548+
r64, err := types.ConvertValueToInt64(types.NumberTypeImpl_{}, rv)
549+
if err != nil {
550+
return sqltypes.Value{}, err
551+
}
544552
var rb byte
545-
if res == 1 {
553+
if l64 > r64 {
546554
rb = 1
547555
}
548-
ret := sql.Value{
549-
Val: sql.ValueBytes{rb},
550-
Typ: querypb.Type_INT8,
551-
}
556+
557+
ret := sqltypes.MakeTrusted(querypb.Type_INT8, []byte{rb})
552558
return ret, nil
553559
}
554560

sql/expression/get_field.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ package expression
1616

1717
import (
1818
"fmt"
19+
"github.com/dolthub/vitess/go/sqltypes"
1920
"strings"
2021

2122
errors "gopkg.in/src-d/go-errors.v1"
@@ -149,12 +150,11 @@ func (p *GetField) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) {
149150
return row[p.fieldIndex], nil
150151
}
151152

152-
func (p *GetField) Eval2(ctx *sql.Context, row sql.Row2) (sql.Value, error) {
153+
func (p *GetField) Eval2(ctx *sql.Context, row sql.Row2) (sqltypes.Value, error) {
153154
if p.fieldIndex < 0 || p.fieldIndex >= row.Len() {
154-
return sql.Value{}, ErrIndexOutOfBounds.New(p.fieldIndex, row.Len())
155+
return sqltypes.Value{}, ErrIndexOutOfBounds.New(p.fieldIndex, row.Len())
155156
}
156-
157-
return row.GetField(p.fieldIndex), nil
157+
return row[p.fieldIndex], nil
158158
}
159159

160160
func (p *GetField) IsExpr2() bool {

sql/expression/literal.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ package expression
1616

1717
import (
1818
"fmt"
19+
"github.com/dolthub/vitess/go/sqltypes"
1920
"strings"
2021

2122
"github.com/dolthub/vitess/go/vt/proto/query"
@@ -30,7 +31,7 @@ import (
3031
type Literal struct {
3132
Val interface{}
3233
Typ sql.Type
33-
val2 sql.Value
34+
val2 sqltypes.Value
3435
}
3536

3637
var _ sql.Expression = &Literal{}
@@ -136,7 +137,7 @@ func (*Literal) Children() []sql.Expression {
136137
return nil
137138
}
138139

139-
func (lit *Literal) Eval2(ctx *sql.Context, row sql.Row2) (sql.Value, error) {
140+
func (lit *Literal) Eval2(ctx *sql.Context, row sql.Row2) (sqltypes.Value, error) {
140141
return lit.val2, nil
141142
}
142143

sql/expression/unresolved.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ package expression
1616

1717
import (
1818
"fmt"
19+
"github.com/dolthub/vitess/go/sqltypes"
1920
"strings"
2021

2122
"gopkg.in/src-d/go-errors.v1"
@@ -71,7 +72,7 @@ func (*UnresolvedColumn) CollationCoercibility(ctx *sql.Context) (collation sql.
7172
return sql.Collation_binary, 7
7273
}
7374

74-
func (uc *UnresolvedColumn) Eval2(ctx *sql.Context, row sql.Row2) (sql.Value, error) {
75+
func (uc *UnresolvedColumn) Eval2(ctx *sql.Context, row sql.Row2) (sqltypes.Value, error) {
7576
panic("unresolved column is a placeholder node, but Eval2 was called")
7677
}
7778

sql/plan/filter.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,9 @@ type FilterIter struct {
109109
childIter2 sql.RowIter2
110110
}
111111

112+
var _ sql.RowIter = (*FilterIter)(nil)
113+
var _ sql.RowIter2 = (*FilterIter)(nil)
114+
112115
// NewFilterIter creates a new FilterIter.
113116
func NewFilterIter(
114117
cond sql.Expression,
@@ -146,7 +149,7 @@ func (i *FilterIter) Next2(ctx *sql.Context) (sql.Row2, error) {
146149
if err != nil {
147150
return nil, err
148151
}
149-
if res.Val[0] == 1 {
152+
if res.Raw()[0] == 1 {
150153
return row, nil
151154
}
152155
}

sql/row_frame.go

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package sql
1717
import (
1818
"sync"
1919

20+
"github.com/dolthub/vitess/go/sqltypes"
2021
querypb "github.com/dolthub/vitess/go/vt/proto/query"
2122
)
2223

@@ -26,10 +27,10 @@ const (
2627
)
2728

2829
// Row2 is a slice of values
29-
type Row2 []Value
30+
type Row2 []sqltypes.Value
3031

3132
// GetField returns the Value for the ith field in this row.
32-
func (r Row2) GetField(i int) Value {
33+
func (r Row2) GetField(i int) sqltypes.Value {
3334
return r[i]
3435
}
3536

@@ -97,10 +98,7 @@ func (f *RowFrame) Row2() Row2 {
9798

9899
rs := make(Row2, len(f.Values))
99100
for i := range f.Values {
100-
rs[i] = Value{
101-
Typ: f.Types[i],
102-
Val: f.Values[i],
103-
}
101+
rs[i] = sqltypes.MakeTrusted(f.Types[i], f.Values[i])
104102
}
105103
return rs
106104
}
@@ -113,10 +111,7 @@ func (f *RowFrame) Row2Copy() Row2 {
113111
for i := range f.Values {
114112
v := make(ValueBytes, len(f.Values[i]))
115113
copy(v, f.Values[i])
116-
rs[i] = Value{
117-
Typ: f.Types[i],
118-
Val: v,
119-
}
114+
rs[i] = sqltypes.MakeTrusted(f.Types[i], v)
120115
}
121116
return rs
122117
}

0 commit comments

Comments
 (0)