Skip to content

Commit a2ed59d

Browse files
authored
allocate fewer sql.Rows (#3146)
1 parent 694b316 commit a2ed59d

File tree

5 files changed

+19
-25
lines changed

5 files changed

+19
-25
lines changed

sql/rowexec/agg.go

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,10 @@ type groupByGroupingIter struct {
117117
pos int
118118
child sql.RowIter
119119
dispose sql.DisposeFunc
120+
121+
// buffers to reduce slice allocations
122+
keyRow sql.Row
123+
keySch sql.Schema
120124
}
121125

122126
func newGroupByGroupingIter(
@@ -128,6 +132,8 @@ func newGroupByGroupingIter(
128132
selectedExprs: selectedExprs,
129133
groupByExprs: groupByExprs,
130134
child: child,
135+
keyRow: make(sql.Row, len(groupByExprs)),
136+
keySch: make(sql.Schema, len(groupByExprs)),
131137
}
132138
}
133139

@@ -167,7 +173,7 @@ func (i *groupByGroupingIter) compute(ctx *sql.Context) error {
167173
return err
168174
}
169175

170-
key, err := groupingKey(ctx, i.groupByExprs, row)
176+
key, err := i.groupingKey(ctx, i.groupByExprs, row)
171177
if err != nil {
172178
return err
173179
}
@@ -237,10 +243,8 @@ func (i *groupByGroupingIter) Dispose() {
237243
}
238244
}
239245

240-
func groupingKey(ctx *sql.Context, exprs []sql.Expression, row sql.Row) (uint64, error) {
241-
var keyRow = make(sql.Row, len(exprs))
242-
var keySch = make(sql.Schema, len(exprs))
243-
for i, expr := range exprs {
246+
func (i *groupByGroupingIter) groupingKey(ctx *sql.Context, exprs []sql.Expression, row sql.Row) (uint64, error) {
247+
for idx, expr := range exprs {
244248
v, err := expr.Eval(ctx, row)
245249
if err != nil {
246250
return 0, err
@@ -256,10 +260,10 @@ func groupingKey(ctx *sql.Context, exprs []sql.Expression, row sql.Row) (uint64,
256260
v = string(val)
257261
}
258262

259-
keyRow[i] = v
260-
keySch[i] = &sql.Column{Type: typ}
263+
i.keyRow[idx] = v
264+
i.keySch[idx] = &sql.Column{Type: typ}
261265
}
262-
return hash.HashOf(ctx, keySch, keyRow)
266+
return hash.HashOf(ctx, i.keySch, i.keyRow)
263267
}
264268

265269
func newAggregationBuffer(expr sql.Expression) (sql.AggregationBuffer, error) {

sql/rowexec/ddl_iters.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ func (l *loadDataIter) Next(ctx *sql.Context) (returnRow sql.Row, returnErr erro
109109
}
110110
}
111111

112-
return sql.NewRow(row...), nil
112+
return row, nil
113113
}
114114

115115
func (l *loadDataIter) Close(ctx *sql.Context) error {

sql/rowexec/rel.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ func (b *BaseBuilder) buildTopN(ctx *sql.Context, n *plan.TopN, row sql.Row) (sq
5555
func (b *BaseBuilder) buildValueDerivedTable(ctx *sql.Context, n *plan.ValueDerivedTable, row sql.Row) (sql.RowIter, error) {
5656
rows := make([]sql.Row, len(n.ExpressionTuples))
5757
for i, et := range n.ExpressionTuples {
58-
vals := make([]interface{}, len(et))
58+
vals := make(sql.Row, len(et))
5959
for j, e := range et {
6060
var err error
6161
p, err := e.Eval(ctx, row)
@@ -72,8 +72,7 @@ func (b *BaseBuilder) buildValueDerivedTable(ctx *sql.Context, n *plan.ValueDeri
7272
vals[j] = vals[j].(decimal.Decimal).Round(int32(t.Scale()))
7373
}
7474
}
75-
76-
rows[i] = sql.NewRow(vals...)
75+
rows[i] = vals
7776
}
7877

7978
return sql.RowsToRowIter(rows...), nil

sql/types/number.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -601,7 +601,7 @@ func (t NumberTypeImpl_) SQL(ctx *sql.Context, dest []byte, v interface{}) (sqlt
601601
case []byte:
602602
dest = str
603603
case string:
604-
dest = []byte(str)
604+
dest = append(dest, str...)
605605
default:
606606
return sqltypes.Value{}, err
607607
}
@@ -931,7 +931,7 @@ func (t NumberTypeImpl_) IsSigned() bool {
931931
return false
932932
}
933933

934-
// DisplayWidth() implements NumberType inteface.
934+
// DisplayWidth implements NumberType interface.
935935
func (t NumberTypeImpl_) DisplayWidth() int {
936936
return t.displayWidth
937937
}

sql/types/strings.go

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
package types
1616

1717
import (
18-
"bytes"
1918
"context"
2019
"fmt"
2120
"reflect"
@@ -480,7 +479,7 @@ func ConvertToBytes(ctx context.Context, v interface{}, t sql.StringType, dest [
480479
val = append(dest, b...)
481480
start = len(dest)
482481
}
483-
val = append(val, bytes.Repeat([]byte{0}, int(st.maxCharLength)-len(val))...)
482+
val = append(val, make([]byte, int(st.maxCharLength)-len(val))...)
484483
}
485484
}
486485
val = val[start:]
@@ -757,7 +756,7 @@ func (t StringType) SQL(ctx *sql.Context, dest []byte, v interface{}) (sqltypes.
757756
valueBytes, err = ConvertToBytes(ctx, v, t, dest)
758757
}
759758
if t.baseType == sqltypes.Binary {
760-
val = append(val, bytes.Repeat([]byte{0}, int(t.maxCharLength)-len(val))...)
759+
val = append(val, make([]byte, int(t.maxCharLength)-len(val))...)
761760
}
762761
// Note: MySQL does not validate charset when returning query results.
763762
// It returns whatever data is stored, allowing users to query and clean up
@@ -777,7 +776,6 @@ func (t StringType) SQL(ctx *sql.Context, dest []byte, v interface{}) (sqltypes.
777776
snippetStr := strings2.ToValidUTF8(string(snippet), string(utf8.RuneError))
778777
return sqltypes.Value{}, sql.ErrCharSetFailedToEncode.New(resultCharset.Name(), utf8.ValidString(snippetStr), snippet)
779778
}
780-
//val = AppendAndSliceBytes(dest, encodedBytes)
781779
val = encodedBytes
782780
}
783781

@@ -893,10 +891,3 @@ func AppendAndSliceString(buffer []byte, addition string) (slice []byte) {
893891
slice = buffer[stop:]
894892
return
895893
}
896-
897-
func AppendAndSliceBytes(buffer, addition []byte) (slice []byte) {
898-
stop := len(buffer)
899-
buffer = append(buffer, addition...)
900-
slice = buffer[stop:]
901-
return
902-
}

0 commit comments

Comments
 (0)