@@ -1087,6 +1087,241 @@ func TestClient(t *testing.T) {
10871087 require .Nil (t , r3 )
10881088 }
10891089 })
1090+ t .Run ("ConcurrentResultSets" , func (t * testing.T ) {
1091+ ctrl := gomock .NewController (t )
1092+ r , err := clientQuery (ctx , testPool (ctx , func (ctx context.Context ) (* Session , error ) {
1093+ stream := NewMockQueryService_ExecuteQueryClient (ctrl )
1094+ stream .EXPECT ().Recv ().Return (& Ydb_Query.ExecuteQueryResponsePart {
1095+ Status : Ydb .StatusIds_SUCCESS ,
1096+ TxMeta : & Ydb_Query.TransactionMeta {
1097+ Id : "456" ,
1098+ },
1099+ ResultSetIndex : 0 ,
1100+ ResultSet : & Ydb.ResultSet {
1101+ Columns : []* Ydb.Column {
1102+ {
1103+ Name : "a" ,
1104+ Type : & Ydb.Type {
1105+ Type : & Ydb.Type_TypeId {
1106+ TypeId : Ydb .Type_UINT64 ,
1107+ },
1108+ },
1109+ },
1110+ {
1111+ Name : "b" ,
1112+ Type : & Ydb.Type {
1113+ Type : & Ydb.Type_TypeId {
1114+ TypeId : Ydb .Type_UTF8 ,
1115+ },
1116+ },
1117+ },
1118+ },
1119+ Rows : []* Ydb.Value {
1120+ {
1121+ Items : []* Ydb.Value {{
1122+ Value : & Ydb.Value_Uint64Value {
1123+ Uint64Value : 1 ,
1124+ },
1125+ }, {
1126+ Value : & Ydb.Value_TextValue {
1127+ TextValue : "1" ,
1128+ },
1129+ }},
1130+ },
1131+ {
1132+ Items : []* Ydb.Value {{
1133+ Value : & Ydb.Value_Uint64Value {
1134+ Uint64Value : 2 ,
1135+ },
1136+ }, {
1137+ Value : & Ydb.Value_TextValue {
1138+ TextValue : "2" ,
1139+ },
1140+ }},
1141+ },
1142+ {
1143+ Items : []* Ydb.Value {{
1144+ Value : & Ydb.Value_Uint64Value {
1145+ Uint64Value : 3 ,
1146+ },
1147+ }, {
1148+ Value : & Ydb.Value_TextValue {
1149+ TextValue : "3" ,
1150+ },
1151+ }},
1152+ },
1153+ },
1154+ },
1155+ }, nil )
1156+ stream .EXPECT ().Recv ().Return (& Ydb_Query.ExecuteQueryResponsePart {
1157+ Status : Ydb .StatusIds_SUCCESS ,
1158+ ResultSetIndex : 1 ,
1159+ ResultSet : & Ydb.ResultSet {
1160+ Columns : []* Ydb.Column {
1161+ {
1162+ Name : "c" ,
1163+ Type : & Ydb.Type {
1164+ Type : & Ydb.Type_TypeId {
1165+ TypeId : Ydb .Type_UINT64 ,
1166+ },
1167+ },
1168+ },
1169+ {
1170+ Name : "d" ,
1171+ Type : & Ydb.Type {
1172+ Type : & Ydb.Type_TypeId {
1173+ TypeId : Ydb .Type_UTF8 ,
1174+ },
1175+ },
1176+ },
1177+ {
1178+ Name : "e" ,
1179+ Type : & Ydb.Type {
1180+ Type : & Ydb.Type_TypeId {
1181+ TypeId : Ydb .Type_BOOL ,
1182+ },
1183+ },
1184+ },
1185+ },
1186+ Rows : []* Ydb.Value {
1187+ {
1188+ Items : []* Ydb.Value {{
1189+ Value : & Ydb.Value_Uint64Value {
1190+ Uint64Value : 1 ,
1191+ },
1192+ }, {
1193+ Value : & Ydb.Value_TextValue {
1194+ TextValue : "1" ,
1195+ },
1196+ }, {
1197+ Value : & Ydb.Value_BoolValue {
1198+ BoolValue : true ,
1199+ },
1200+ }},
1201+ },
1202+ {
1203+ Items : []* Ydb.Value {{
1204+ Value : & Ydb.Value_Uint64Value {
1205+ Uint64Value : 2 ,
1206+ },
1207+ }, {
1208+ Value : & Ydb.Value_TextValue {
1209+ TextValue : "2" ,
1210+ },
1211+ }, {
1212+ Value : & Ydb.Value_BoolValue {
1213+ BoolValue : false ,
1214+ },
1215+ }},
1216+ },
1217+ },
1218+ },
1219+ }, nil )
1220+ stream .EXPECT ().Recv ().Return (& Ydb_Query.ExecuteQueryResponsePart {
1221+ Status : Ydb .StatusIds_SUCCESS ,
1222+ ResultSetIndex : 0 ,
1223+ ResultSet : & Ydb.ResultSet {
1224+ Rows : []* Ydb.Value {
1225+ {
1226+ Items : []* Ydb.Value {{
1227+ Value : & Ydb.Value_Uint64Value {
1228+ Uint64Value : 4 ,
1229+ },
1230+ }, {
1231+ Value : & Ydb.Value_TextValue {
1232+ TextValue : "4" ,
1233+ },
1234+ }},
1235+ },
1236+ {
1237+ Items : []* Ydb.Value {{
1238+ Value : & Ydb.Value_Uint64Value {
1239+ Uint64Value : 5 ,
1240+ },
1241+ }, {
1242+ Value : & Ydb.Value_TextValue {
1243+ TextValue : "5" ,
1244+ },
1245+ }},
1246+ },
1247+ },
1248+ },
1249+ }, nil )
1250+ stream .EXPECT ().Recv ().Return (nil , io .EOF )
1251+ client := NewMockQueryServiceClient (ctrl )
1252+ client .EXPECT ().ExecuteQuery (gomock .Any (), gomock .Any ()).Return (stream , nil )
1253+
1254+ return newTestSessionWithClient ("123" , client , true ), nil
1255+ }), "" , query .WithConcurrentResultSets (true ))
1256+ require .NoError (t , err )
1257+ {
1258+ rs , err := r .NextResultSet (ctx )
1259+ require .NoError (t , err )
1260+ r1 , err := rs .NextRow (ctx )
1261+ require .NoError (t , err )
1262+ var (
1263+ a uint64
1264+ b string
1265+ )
1266+ err = r1 .Scan (& a , & b )
1267+ require .NoError (t , err )
1268+ require .EqualValues (t , 1 , a )
1269+ require .EqualValues (t , "1" , b )
1270+ r2 , err := rs .NextRow (ctx )
1271+ require .NoError (t , err )
1272+ err = r2 .Scan (& a , & b )
1273+ require .NoError (t , err )
1274+ require .EqualValues (t , 2 , a )
1275+ require .EqualValues (t , "2" , b )
1276+ r3 , err := rs .NextRow (ctx )
1277+ require .NoError (t , err )
1278+ err = r3 .Scan (& a , & b )
1279+ require .NoError (t , err )
1280+ require .EqualValues (t , 3 , a )
1281+ require .EqualValues (t , "3" , b )
1282+ r4 , err := rs .NextRow (ctx )
1283+ require .NoError (t , err )
1284+ err = r4 .Scan (& a , & b )
1285+ require .NoError (t , err )
1286+ require .EqualValues (t , 4 , a )
1287+ require .EqualValues (t , "4" , b )
1288+ r5 , err := rs .NextRow (ctx )
1289+ require .NoError (t , err )
1290+ err = r5 .Scan (& a , & b )
1291+ require .NoError (t , err )
1292+ require .EqualValues (t , 5 , a )
1293+ require .EqualValues (t , "5" , b )
1294+ r6 , err := rs .NextRow (ctx )
1295+ require .ErrorIs (t , err , io .EOF )
1296+ require .Nil (t , r6 )
1297+ }
1298+ {
1299+ rs , err := r .NextResultSet (ctx )
1300+ require .NoError (t , err )
1301+ r1 , err := rs .NextRow (ctx )
1302+ require .NoError (t , err )
1303+ var (
1304+ a uint64
1305+ b string
1306+ c bool
1307+ )
1308+ err = r1 .Scan (& a , & b , & c )
1309+ require .NoError (t , err )
1310+ require .EqualValues (t , 1 , a )
1311+ require .EqualValues (t , "1" , b )
1312+ require .EqualValues (t , true , c )
1313+ r2 , err := rs .NextRow (ctx )
1314+ require .NoError (t , err )
1315+ err = r2 .Scan (& a , & b , & c )
1316+ require .NoError (t , err )
1317+ require .EqualValues (t , 2 , a )
1318+ require .EqualValues (t , "2" , b )
1319+ require .EqualValues (t , false , c )
1320+ r3 , err := rs .NextRow (ctx )
1321+ require .ErrorIs (t , err , io .EOF )
1322+ require .Nil (t , r3 )
1323+ }
1324+ })
10901325 t .Run ("AllowImplicitSessions" , func (t * testing.T ) {
10911326 _ , err := mockClientForImplicitSessionTest (ctx , t ).
10921327 Query (ctx , "SELECT 1" )
0 commit comments