@@ -496,7 +496,7 @@ func (h *Handler) doQuery(
496496 } else if analyzer .FlagIsSet (qFlags , sql .QFlagMax1Row ) {
497497 r , err = resultForMax1RowIter (sqlCtx , schema , rowIter , resultFields , buf )
498498 } else if ri2 , ok := rowIter .(sql.RowIter2 ); ok && ri2 .IsRowIter2 (sqlCtx ) {
499- r , processedAtLeastOneBatch , err = h .resultForDefaultIter2 (sqlCtx , c , ri2 , resultFields , callback , more )
499+ r , processedAtLeastOneBatch , err = h .resultForDefaultIter2 (sqlCtx , c , schema , ri2 , resultFields , buf , callback , more )
500500 } else {
501501 r , processedAtLeastOneBatch , err = h .resultForDefaultIter (sqlCtx , c , schema , rowIter , callback , resultFields , more , buf )
502502 }
@@ -770,14 +770,13 @@ func (h *Handler) resultForDefaultIter(ctx *sql.Context, c *mysql.Conn, schema s
770770 return r , processedAtLeastOneBatch , nil
771771}
772772
773- func (h * Handler ) resultForDefaultIter2 (ctx * sql.Context , c * mysql.Conn , iter sql.RowIter2 , resultFields []* querypb.Field , callback func (* sqltypes.Result , bool ) error , more bool ) (* sqltypes.Result , bool , error ) {
773+ func (h * Handler ) resultForDefaultIter2 (ctx * sql.Context , c * mysql.Conn , schema sql. Schema , iter sql.RowIter2 , resultFields []* querypb.Field , buf * sql. ByteBuffer , callback func (* sqltypes.Result , bool ) error , more bool ) (* sqltypes.Result , bool , error ) {
774774 defer trace .StartRegion (ctx , "Handler.resultForDefaultIter2" ).End ()
775775
776776 eg , ctx := ctx .NewErrgroup ()
777777 pan2err := func (err * error ) {
778778 if recoveredPanic := recover (); recoveredPanic != nil {
779- stack := debug .Stack ()
780- wrappedErr := fmt .Errorf ("handler caught panic: %v\n %s" , recoveredPanic , stack )
779+ wrappedErr := fmt .Errorf ("handler caught panic: %v\n %s" , recoveredPanic , debug .Stack ())
781780 * err = goerrors .Join (* err , wrappedErr )
782781 }
783782 }
@@ -868,24 +867,9 @@ func (h *Handler) resultForDefaultIter2(ctx *sql.Context, c *mysql.Conn, iter sq
868867 if ! ok {
869868 return nil
870869 }
871- resRow := make ([]sqltypes.Value , len (row ))
872- for i , v := range row {
873- if v .Val != nil || v .WrappedVal == nil {
874- resRow [i ] = sqltypes .MakeTrusted (v .Typ , v .Val )
875- continue
876- }
877- dVal , err := v .WrappedVal .UnwrapAny (ctx )
878- if err != nil {
879- return err
880- }
881- switch dVal := dVal .(type ) {
882- case []byte :
883- resRow [i ] = sqltypes .MakeTrusted (v .Typ , dVal )
884- case string :
885- resRow [i ] = sqltypes .MakeTrusted (v .Typ , []byte (dVal ))
886- default :
887- panic (fmt .Sprintf ("unexpected type %T" , dVal ))
888- }
870+ resRow , err := RowValueToSQLValues (ctx , schema , row , buf )
871+ if err != nil {
872+ return err
889873 }
890874 ctx .GetLogger ().Tracef ("spooling result row %s" , resRow )
891875 res .Rows = append (res .Rows , resRow )
@@ -1187,6 +1171,35 @@ func RowToSQL(ctx *sql.Context, sch sql.Schema, row sql.Row, projs []sql.Express
11871171 return outVals , nil
11881172}
11891173
1174+ func RowValueToSQLValues (ctx * sql.Context , sch sql.Schema , row sql.ValueRow , buf * sql.ByteBuffer ) ([]sqltypes.Value , error ) {
1175+ if len (sch ) == 0 {
1176+ return []sqltypes.Value {}, nil
1177+ }
1178+ var err error
1179+ outVals := make ([]sqltypes.Value , len (sch ))
1180+ for i , col := range sch {
1181+ // TODO: remove this check once all Types implement this
1182+ valType , ok := col .Type .(sql.Type2 )
1183+ if ! ok {
1184+ outVals [i ] = sqltypes .MakeTrusted (row [i ].Typ , row [i ].Val )
1185+ continue
1186+ }
1187+ if buf == nil {
1188+ outVals [i ], err = valType .ToSQLValue (ctx , row [i ], nil )
1189+ if err != nil {
1190+ return nil , err
1191+ }
1192+ continue
1193+ }
1194+ outVals [i ], err = valType .ToSQLValue (ctx , row [i ], buf .Get ())
1195+ if err != nil {
1196+ return nil , err
1197+ }
1198+ buf .Grow (outVals [i ].Len ())
1199+ }
1200+ return outVals , nil
1201+ }
1202+
11901203func schemaToFields (ctx * sql.Context , s sql.Schema ) []* querypb.Field {
11911204 charSetResults := ctx .GetCharacterSetResults ()
11921205 fields := make ([]* querypb.Field , len (s ))
0 commit comments