@@ -7,14 +7,20 @@ import (
77 "bytes"
88 "context"
99 "database/sql"
10+ "errors"
1011 "fmt"
12+ "math/rand"
1113 "os"
1214 "path"
1315 "testing"
1416 "text/template"
1517 "time"
1618
19+ "github.com/ydb-platform/ydb-go-genproto/protos/Ydb"
20+
1721 "github.com/ydb-platform/ydb-go-sdk/v3"
22+ "github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors"
23+ "github.com/ydb-platform/ydb-go-sdk/v3/internal/xsql/badconn"
1824 "github.com/ydb-platform/ydb-go-sdk/v3/retry"
1925 "github.com/ydb-platform/ydb-go-sdk/v3/sugar"
2026 "github.com/ydb-platform/ydb-go-sdk/v3/table/types"
@@ -555,3 +561,56 @@ func render(t *template.Template, data interface{}) string {
555561 }
556562 return buf .String ()
557563}
564+
565+ func TestRegressionCloud109307 (t * testing.T ) {
566+ db , err := sql .Open ("ydb" , os .Getenv ("YDB_CONNECTION_STRING" ))
567+ if err != nil {
568+ t .Fatal (err )
569+ }
570+
571+ ctx , cancel := context .WithTimeout (context .Background (), 42 * time .Second )
572+ defer cancel ()
573+
574+ for i := int64 (1 ); ; i ++ {
575+ if ctx .Err () != nil {
576+ break
577+ }
578+
579+ if err = retry .DoTx (ctx , db , func (ctx context.Context , tx * sql.Tx ) error {
580+ //nolint:gosec
581+ if rand .Int31n (3 ) == 0 {
582+ return badconn .Map (xerrors .Operation (xerrors .WithStatusCode (Ydb .StatusIds_BAD_SESSION )))
583+ }
584+ var rows * sql.Rows
585+ rows , err = tx .QueryContext (ctx , `
586+ DECLARE $i AS Int64;
587+
588+ SELECT $i;
589+ ` , sql .Named ("i" , i ))
590+ if err != nil {
591+ return err
592+ }
593+ defer rows .Close ()
594+ if ! rows .Next () {
595+ return errors .New ("no rows" )
596+ }
597+ var result interface {}
598+ if err = rows .Scan (& result ); err != nil {
599+ return err
600+ }
601+ if result .(int64 )% 100 == 0 {
602+ t .Logf ("result: %+v\n " , result )
603+ }
604+ return rows .Err ()
605+ }, retry .WithTxOptions (& sql.TxOptions {
606+ Isolation : sql .LevelSnapshot ,
607+ ReadOnly : true ,
608+ }), retry .WithDoTxRetryOptions (
609+ retry .WithIdempotent (true ),
610+ )); err != nil {
611+ if ctx .Err () == nil {
612+ t .Fatalf ("error: %+v\n " , err )
613+ }
614+ }
615+ }
616+ }
0 commit comments