github.com/ydb-platform/ydb-go-sdk/v3@v3.89.2/tests/integration/query_range_test.go (about) 1 //go:build integration && go1.23 2 // +build integration,go1.23 3 4 package integration 5 6 import ( 7 "context" 8 "fmt" 9 "os" 10 "strconv" 11 "testing" 12 "time" 13 14 "github.com/stretchr/testify/require" 15 16 "github.com/ydb-platform/ydb-go-sdk/v3" 17 "github.com/ydb-platform/ydb-go-sdk/v3/internal/value" 18 "github.com/ydb-platform/ydb-go-sdk/v3/internal/version" 19 "github.com/ydb-platform/ydb-go-sdk/v3/internal/xtest" 20 "github.com/ydb-platform/ydb-go-sdk/v3/query" 21 ) 22 23 func TestQueryRange(t *testing.T) { 24 if version.Lt(os.Getenv("YDB_VERSION"), "24.1") { 25 t.Skip("query service not allowed in YDB version '" + os.Getenv("YDB_VERSION") + "'") 26 } 27 28 ctx, cancel := context.WithCancel(xtest.Context(t)) 29 defer cancel() 30 31 db, err := ydb.Open(ctx, 32 os.Getenv("YDB_CONNECTION_STRING"), 33 ydb.WithAccessTokenCredentials(os.Getenv("YDB_ACCESS_TOKEN_CREDENTIALS")), 34 ) 35 require.NoError(t, err) 36 t.Run("Execute", func(t *testing.T) { 37 listItems := make([]value.Value, 1000) 38 for i := range make([]struct{}, 1000) { 39 listItems[i] = value.StructValue( 40 value.StructValueField{ 41 Name: "p1", 42 V: value.TextValue(strconv.Itoa(i)), 43 }, 44 value.StructValueField{ 45 Name: "p2", 46 V: value.Uint64Value(uint64(i)), 47 }, 48 value.StructValueField{ 49 Name: "p3", 50 V: value.IntervalValueFromDuration(time.Duration(i * 1000)), 51 }, 52 ) 53 } 54 r, err := db.Query().Query(ctx, ` 55 DECLARE $values AS List<Struct<p1:Text,p2:Uint64,p3:Interval>>; 56 SELECT p1, p2, p3 FROM AS_TABLE($values);`, 57 query.WithParameters( 58 ydb.ParamsBuilder().Param("$values").BeginList().AddItems(listItems...).EndList().Build(), 59 ), 60 query.WithIdempotent(), 61 ) 62 require.NoError(t, err) 63 count := 0 64 for rs, err := range r.ResultSets(ctx) { 65 require.NoError(t, err) 66 for row, err := range rs.Rows(ctx) { 67 require.NoError(t, err) 68 69 var ( 70 p1 string 71 p2 uint64 72 p3 time.Duration 73 ) 74 75 err = row.Scan(&p1, &p2, &p3) 76 require.NoError(t, err) 77 78 require.EqualValues(t, strconv.Itoa(count), p1) 79 require.EqualValues(t, count, p2) 80 require.EqualValues(t, time.Duration(count*1000), p3) 81 82 count++ 83 } 84 } 85 require.EqualValues(t, 1000, count) 86 }) 87 t.Run("Do", func(t *testing.T) { 88 var ( 89 p1 string 90 p2 uint64 91 p3 time.Duration 92 ) 93 err := db.Query().Do(ctx, func(ctx context.Context, s query.Session) error { 94 r, err := s.Query(ctx, ` 95 DECLARE $p1 AS Text; 96 DECLARE $p2 AS Uint64; 97 DECLARE $p3 AS Interval; 98 SELECT $p1, $p2, $p3; 99 `, 100 query.WithParameters( 101 ydb.ParamsBuilder(). 102 Param("$p1").Text("test"). 103 Param("$p2").Uint64(100500000000). 104 Param("$p3").Interval(time.Duration(100500000000)). 105 Build(), 106 ), 107 query.WithSyntax(query.SyntaxYQL), 108 ) 109 if err != nil { 110 return err 111 } 112 for rs, err := range r.ResultSets(ctx) { 113 if err != nil { 114 return err 115 } 116 for row, err := range rs.Rows(ctx) { 117 if err != nil { 118 return err 119 } 120 err = row.Scan(&p1, &p2, &p3) 121 if err != nil { 122 return err 123 } 124 125 if p1 != "test" { 126 return fmt.Errorf("unexpected p1 value: %v", p1) 127 } 128 if p2 != 100500000000 { 129 return fmt.Errorf("unexpected p2 value: %v", p2) 130 } 131 if p3 != time.Duration(100500000000) { 132 return fmt.Errorf("unexpected p3 value: %v", p3) 133 } 134 } 135 } 136 return nil 137 }, query.WithIdempotent()) 138 require.NoError(t, err) 139 }) 140 t.Run("DoTx", func(t *testing.T) { 141 var ( 142 p1 string 143 p2 uint64 144 p3 time.Duration 145 ) 146 err := db.Query().DoTx(ctx, func(ctx context.Context, tx query.TxActor) error { 147 r, err := tx.Query(ctx, ` 148 DECLARE $p1 AS Text; 149 DECLARE $p2 AS Uint64; 150 DECLARE $p3 AS Interval; 151 SELECT $p1, $p2, $p3; 152 `, 153 query.WithParameters( 154 ydb.ParamsBuilder(). 155 Param("$p1").Text("test"). 156 Param("$p2").Uint64(100500000000). 157 Param("$p3").Interval(time.Duration(100500000000)). 158 Build(), 159 ), 160 query.WithSyntax(query.SyntaxYQL), 161 ) 162 if err != nil { 163 return err 164 } 165 for rs, err := range r.ResultSets(ctx) { 166 if err != nil { 167 return err 168 } 169 for row, err := range rs.Rows(ctx) { 170 if err != nil { 171 return err 172 } 173 err = row.Scan(&p1, &p2, &p3) 174 if err != nil { 175 return err 176 } 177 178 if p1 != "test" { 179 return fmt.Errorf("unexpected p1 value: %v", p1) 180 } 181 if p2 != 100500000000 { 182 return fmt.Errorf("unexpected p2 value: %v", p2) 183 } 184 if p3 != time.Duration(100500000000) { 185 return fmt.Errorf("unexpected p3 value: %v", p3) 186 } 187 } 188 } 189 return nil 190 }, query.WithIdempotent()) 191 require.NoError(t, err) 192 }) 193 }