@@ -8,11 +8,12 @@ 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_Query"
12-
1313 "github.com/ydb-platform/ydb-go-sdk/v3/internal/query/result"
1414 "github.com/ydb-platform/ydb-go-sdk/v3/internal/stack"
1515 "github.com/ydb-platform/ydb-go-sdk/v3/internal/stats"
16+ "github.com/ydb-platform/ydb-go-sdk/v3/internal/types"
1617 "github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors"
1718 "github.com/ydb-platform/ydb-go-sdk/v3/internal/xiter"
1819 "github.com/ydb-platform/ydb-go-sdk/v3/query"
@@ -459,3 +460,60 @@ func resultToMaterializedResult(ctx context.Context, r result.Result) (result.Re
459460 resultSets : resultSets ,
460461 }, nil
461462}
463+
464+ func streamToMaterializedResult (ctx context.Context , stream Ydb_Query_V1.QueryService_ExecuteQueryClient ) (result.Result , error ) {
465+ type resultSet struct {
466+ rows []query.Row
467+ rawColumns []* Ydb.Column
468+ columnNames []string
469+ columnTypes []types.Type
470+ }
471+ resultSetByIndex := make (map [int64 ]resultSet )
472+
473+ for {
474+ if ctx .Err () != nil {
475+ return nil , xerrors .WithStackTrace (ctx .Err ())
476+ }
477+
478+ part , err := stream .Recv ()
479+ if err != nil {
480+ if xerrors .Is (err , io .EOF ) {
481+ break
482+ }
483+ return nil , xerrors .WithStackTrace (err )
484+ }
485+
486+ if part .GetResultSetIndex () < 0 {
487+ break
488+ }
489+
490+ rs := resultSetByIndex [part .GetResultSetIndex ()]
491+ if len (rs .columnNames ) == 0 {
492+ rs .rawColumns = part .GetResultSet ().GetColumns ()
493+ rs .columnNames = make ([]string , 0 , len (rs .rawColumns ))
494+ rs .columnTypes = make ([]types.Type , 0 , len (rs .rawColumns ))
495+
496+ for _ , column := range rs .rawColumns {
497+ rs .columnNames = append (rs .columnNames , column .GetName ())
498+ rs .columnTypes = append (rs .columnTypes , types .TypeFromYDB (column .GetType ()))
499+ }
500+ }
501+
502+ rows := make ([]query.Row , 0 , len (part .GetResultSet ().GetRows ()))
503+ for _ , row := range part .GetResultSet ().GetRows () {
504+ rows = append (rows , NewRow (rs .rawColumns , row ))
505+ }
506+ rs .rows = append (rs .rows , rows ... )
507+
508+ resultSetByIndex [part .GetResultSetIndex ()] = rs
509+ }
510+
511+ resultSets := make ([]result.Set , len (resultSetByIndex ))
512+ for rsIndex , rs := range resultSetByIndex {
513+ resultSets [rsIndex ] = MaterializedResultSet (int (rsIndex ), rs .columnNames , rs .columnTypes , rs .rows )
514+ }
515+
516+ return & materializedResult {
517+ resultSets : resultSets ,
518+ }, nil
519+ }
0 commit comments