@@ -495,6 +495,8 @@ func (h *Handler) doQuery(
495495 r , err = resultForEmptyIter (sqlCtx , rowIter , resultFields )
496496 } else if analyzer .FlagIsSet (qFlags , sql .QFlagMax1Row ) {
497497 r , err = resultForMax1RowIter (sqlCtx , schema , rowIter , resultFields , buf )
498+ } else if ri2 , ok := rowIter .(sql.RowIter2 ); ok && ri2 .IsRowIter2 (sqlCtx ) {
499+ r , err = h .resultForDefaultIter2 (sqlCtx , ri2 , resultFields , callback , more )
498500 } else {
499501 r , processedAtLeastOneBatch , err = h .resultForDefaultIter (sqlCtx , c , schema , rowIter , callback , resultFields , more , buf )
500502 }
@@ -768,6 +770,32 @@ func (h *Handler) resultForDefaultIter(ctx *sql.Context, c *mysql.Conn, schema s
768770 return r , processedAtLeastOneBatch , nil
769771}
770772
773+ func (h * Handler ) resultForDefaultIter2 (ctx * sql.Context , iter sql.RowIter2 , resultFields []* querypb.Field , callback func (* sqltypes.Result , bool ) error , more bool ) (* sqltypes.Result , error ) {
774+ res := & sqltypes.Result {Fields : resultFields }
775+ for {
776+ if res .RowsAffected == rowsBatch {
777+ if err := callback (res , more ); err != nil {
778+ return nil , err
779+ }
780+ res = nil
781+ }
782+ row , err := iter .Next2 (ctx )
783+ if err == io .EOF {
784+ return res , nil
785+ }
786+ if err != nil {
787+ return nil , err
788+ }
789+
790+ outRow := make ([]sqltypes.Value , len (res .Rows ))
791+ for i := range row {
792+ outRow [i ] = sqltypes .MakeTrusted (row [i ].Typ , row [i ].Val )
793+ }
794+ res .Rows = append (res .Rows , outRow )
795+ res .RowsAffected ++
796+ }
797+ }
798+
771799// See https://dev.mysql.com/doc/internals/en/status-flags.html
772800func setConnStatusFlags (ctx * sql.Context , c * mysql.Conn ) error {
773801 ok , err := isSessionAutocommit (ctx )
0 commit comments