@@ -8,12 +8,14 @@ import (
88 "time"
99
1010 "github.com/ydb-platform/ydb-go-genproto/Ydb_Query_V1"
11+ "github.com/ydb-platform/ydb-go-genproto/protos/Ydb"
1112 "github.com/ydb-platform/ydb-go-genproto/protos/Ydb_Issue"
1213 "github.com/ydb-platform/ydb-go-genproto/protos/Ydb_Query"
1314
1415 "github.com/ydb-platform/ydb-go-sdk/v3/internal/query/result"
1516 "github.com/ydb-platform/ydb-go-sdk/v3/internal/stack"
1617 "github.com/ydb-platform/ydb-go-sdk/v3/internal/stats"
18+ "github.com/ydb-platform/ydb-go-sdk/v3/internal/types"
1719 "github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors"
1820 "github.com/ydb-platform/ydb-go-sdk/v3/internal/xiter"
1921 "github.com/ydb-platform/ydb-go-sdk/v3/query"
@@ -433,34 +435,59 @@ func exactlyOneResultSetFromResult(ctx context.Context, r result.Result) (rs res
433435 return MaterializedResultSet (rs .Index (), rs .Columns (), rs .ColumnTypes (), rows ), nil
434436}
435437
436- func resultToMaterializedResult (ctx context.Context , r result.Result ) (result.Result , error ) {
437- var resultSets []result.Set
438+ func resultToMaterializedResult (ctx context.Context , r * streamResult ) (result.Result , error ) {
439+ type resultSet struct {
440+ rows []query.Row
441+ columns []* Ydb.Column
442+ }
443+ resultSetByIndex := make (map [int64 ]resultSet )
438444
439445 for {
440- rs , err := r .NextResultSet (ctx )
446+ if ctx .Err () != nil {
447+ return nil , xerrors .WithStackTrace (ctx .Err ())
448+ }
449+ if r .closer .Err () != nil {
450+ return nil , xerrors .WithStackTrace (r .closer .Err ())
451+ }
452+
453+ rs := resultSetByIndex [r .lastPart .GetResultSetIndex ()]
454+ if len (rs .columns ) == 0 {
455+ rs .columns = r .lastPart .GetResultSet ().GetColumns ()
456+ }
457+
458+ rows := make ([]query.Row , len (r .lastPart .GetResultSet ().GetRows ()))
459+ for i := range r .lastPart .GetResultSet ().GetRows () {
460+ rows [i ] = NewRow (rs .columns , r .lastPart .GetResultSet ().GetRows ()[i ])
461+ }
462+ rs .rows = append (rs .rows , rows ... )
463+
464+ resultSetByIndex [r .lastPart .GetResultSetIndex ()] = rs
465+
466+ var err error
467+ r .lastPart , err = r .nextPart (ctx )
441468 if err != nil {
442469 if xerrors .Is (err , io .EOF ) {
443470 break
444471 }
445472
446473 return nil , xerrors .WithStackTrace (err )
447474 }
475+ if r .lastPart .GetExecStats () != nil && r .statsCallback != nil {
476+ r .statsCallback (stats .FromQueryStats (r .lastPart .GetExecStats ()))
477+ }
478+ }
448479
449- var rows []query.Row
450- for {
451- row , err := rs .NextRow (ctx )
452- if err != nil {
453- if xerrors .Is (err , io .EOF ) {
454- break
455- }
456-
457- return nil , xerrors .WithStackTrace (err )
458- }
480+ resultSets := make ([]result.Set , len (resultSetByIndex ))
481+ for rsIndex , rs := range resultSetByIndex {
482+ columnNames := make ([]string , len (rs .columns ))
483+ columnTypes := make ([]types.Type , len (rs .columns ))
459484
460- rows = append (rows , row )
485+ for i := range rs .columns {
486+ columnNames [i ] = rs .columns [i ].Name
487+ columnTypes [i ] = types .TypeFromYDB (rs .columns [i ].Type )
461488 }
462489
463- resultSets = append ( resultSets , MaterializedResultSet (rs . Index ( ), rs . Columns (), rs . ColumnTypes (), rows ) )
490+ resultSets [ rsIndex ] = MaterializedResultSet (int ( rsIndex ), columnNames , columnTypes , rs . rows )
464491 }
465492
466493 return & materializedResult {
0 commit comments