Skip to content

Commit 5fd4a67

Browse files
committed
fix bugs
1 parent 68d431c commit 5fd4a67

File tree

3 files changed

+37
-19
lines changed

3 files changed

+37
-19
lines changed

enginetest/enginetests.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5743,6 +5743,7 @@ func TestTypesOverWire(t *testing.T, harness ClientHarness, sessionBuilder serve
57435743
require.NoError(t, err)
57445744
expectedRowSet := script.Results[queryIdx]
57455745
expectedRowIdx := 0
5746+
buf := sql.NewByteBuffer(1000)
57465747
var engineRow sql.Row
57475748
for engineRow, err = engineIter.Next(ctx); err == nil; engineRow, err = engineIter.Next(ctx) {
57485749
if !assert.True(t, r.Next()) {
@@ -5760,7 +5761,7 @@ func TestTypesOverWire(t *testing.T, harness ClientHarness, sessionBuilder serve
57605761
break
57615762
}
57625763
expectedEngineRow := make([]*string, len(engineRow))
5763-
row, err := server.RowToSQL(ctx, sch, engineRow, nil, nil)
5764+
row, err := server.RowToSQL(ctx, sch, engineRow, nil, buf)
57645765
if !assert.NoError(t, err) {
57655766
break
57665767
}

server/handler.go

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -442,9 +442,10 @@ func (h *Handler) doQuery(
442442
var r *sqltypes.Result
443443
var processedAtLeastOneBatch bool
444444

445-
buf := sql.SingletonBuf
445+
buf := sql.ByteBufPool.Get().(*sql.ByteBuffer)
446446
defer func() {
447-
sql.SingletonBuf.Reset()
447+
buf.Reset()
448+
sql.ByteBufPool.Put(buf)
448449
}()
449450

450451
// zero/single return schema use spooling shortcut
@@ -930,28 +931,35 @@ func updateMaxUsedConnectionsStatusVariable() {
930931
}()
931932
}
932933

934+
func toSqlHelper(ctx *sql.Context, typ sql.Type, buf *sql.ByteBuffer, val interface{}) (sqltypes.Value, error) {
935+
if buf == nil {
936+
return typ.SQL(ctx, buf.Get(), val)
937+
}
938+
spare := buf.Spare()
939+
ret, err := typ.SQL(ctx, buf.Get(), val)
940+
if ret.Len() > spare {
941+
buf.Double()
942+
} else {
943+
buf.Advance(ret.Len())
944+
}
945+
return ret, err
946+
}
947+
933948
func RowToSQL(ctx *sql.Context, sch sql.Schema, row sql.Row, projs []sql.Expression, buf *sql.ByteBuffer) ([]sqltypes.Value, error) {
934949
// need to make sure the schema is not null as some plan schema is defined as null (e.g. IfElseBlock)
935950
if len(sch) == 0 {
936951
return []sqltypes.Value{}, nil
937952
}
938953

939954
outVals := make([]sqltypes.Value, len(sch))
955+
var err error
940956
if len(projs) == 0 {
941957
for i, col := range sch {
942958
if row[i] == nil {
943959
outVals[i] = sqltypes.NULL
944960
continue
945961
}
946-
var err error
947-
spare := buf.Spare()
948-
outVals[i], err = col.Type.SQL(ctx, buf.Get(), row[i])
949-
if outVals[i].Len() > spare {
950-
buf.Double()
951-
} else {
952-
buf.Advance(outVals[i].Len())
953-
}
954-
962+
outVals[i], err = toSqlHelper(ctx, col.Type, buf, row[i])
955963
if err != nil {
956964
return nil, err
957965
}
@@ -968,13 +976,7 @@ func RowToSQL(ctx *sql.Context, sch sql.Schema, row sql.Row, projs []sql.Express
968976
outVals[i] = sqltypes.NULL
969977
continue
970978
}
971-
spare := buf.Spare()
972-
outVals[i], err = col.Type.SQL(ctx, buf.Get(), field)
973-
if outVals[i].Len() > spare {
974-
buf.Double()
975-
} else {
976-
buf.Advance(outVals[i].Len())
977-
}
979+
outVals[i], err = toSqlHelper(ctx, col.Type, buf, field)
978980
if err != nil {
979981
return nil, err
980982
}

sql/byte_buffer.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,22 @@
11
package sql
22

3+
import (
4+
"sync"
5+
)
6+
37
var SingletonBuf = NewByteBuffer(16000)
48

9+
var defaultByteBuffCap = 1000
10+
11+
var ByteBufPool = sync.Pool{
12+
New: func() any {
13+
// The Pool's New function should generally only return pointer
14+
// types, since a pointer can be put into the return interface
15+
// value without an allocation:
16+
return NewByteBuffer(defaultByteBuffCap)
17+
},
18+
}
19+
520
type ByteBuffer struct {
621
buf []byte
722
i int

0 commit comments

Comments
 (0)