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  }