From 6e2cee629498fd7cdd5ff36d3a6251efea106769 Mon Sep 17 00:00:00 2001 From: Jack Christensen Date: Sat, 30 Apr 2016 12:54:16 -0500 Subject: [PATCH] Prevent every row scan from causing a malloc --- query.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/query.go b/query.go index f0540dd6..aa5ae741 100644 --- a/query.go +++ b/query.go @@ -301,7 +301,12 @@ func (rows *Rows) Scan(dest ...interface{}) (err error) { rows.Fatal(scanArgError{col: i, err: err}) } } else if vr.Type().DataType == JsonOid || vr.Type().DataType == JsonbOid { - decodeJSON(vr, &d) + // Because the argument passed to decodeJSON will escape the heap. + // This allows d to be stack allocated and only copied to the heap when + // we actually are decoding JSON. This saves one memory allocation per + // row. + d2 := d + decodeJSON(vr, &d2) } else { if err := Decode(vr, d); err != nil { rows.Fatal(scanArgError{col: i, err: err})