github.com/ydb-platform/ydb-go-sdk/v3@v3.89.2/tests/integration/scripting_test.go (about)

     1  //go:build integration
     2  // +build integration
     3  
     4  package integration
     5  
     6  import (
     7  	"context"
     8  	"crypto/tls"
     9  	"fmt"
    10  	"os"
    11  	"testing"
    12  	"time"
    13  
    14  	"github.com/ydb-platform/ydb-go-sdk/v3"
    15  	"github.com/ydb-platform/ydb-go-sdk/v3/balancers"
    16  	"github.com/ydb-platform/ydb-go-sdk/v3/config"
    17  	"github.com/ydb-platform/ydb-go-sdk/v3/internal/xtest"
    18  	"github.com/ydb-platform/ydb-go-sdk/v3/retry"
    19  	"github.com/ydb-platform/ydb-go-sdk/v3/scripting"
    20  	"github.com/ydb-platform/ydb-go-sdk/v3/table"
    21  	"github.com/ydb-platform/ydb-go-sdk/v3/trace"
    22  )
    23  
    24  func TestScripting(sourceTest *testing.T) {
    25  	t := xtest.MakeSyncedTest(sourceTest)
    26  	ctx := xtest.Context(t)
    27  
    28  	db, err := ydb.Open(ctx,
    29  		os.Getenv("YDB_CONNECTION_STRING"),
    30  		ydb.WithAccessTokenCredentials(
    31  			os.Getenv("YDB_ACCESS_TOKEN_CREDENTIALS"),
    32  		),
    33  		ydb.With(
    34  			config.WithOperationTimeout(time.Second*2),
    35  			config.WithOperationCancelAfter(time.Second*2),
    36  		),
    37  		ydb.WithBalancer(balancers.SingleConn()),
    38  		ydb.WithConnectionTTL(time.Millisecond*10000),
    39  		ydb.WithMinTLSVersion(tls.VersionTLS10),
    40  		ydb.WithLogger(
    41  			newLogger(t),
    42  			trace.MatchDetails(`ydb\.(driver|discovery|retry|scheme).*`),
    43  		),
    44  		ydb.WithApplicationName("scripting"),
    45  	)
    46  	if err != nil {
    47  		t.Fatal(err)
    48  	}
    49  	defer func() {
    50  		// cleanup connection
    51  		if e := db.Close(ctx); e != nil {
    52  			t.Fatalf("db close failed: %+v", e)
    53  		}
    54  	}()
    55  	// Execute
    56  	if err = retry.Retry(ctx, func(ctx context.Context) (err error) {
    57  		res, err := db.Scripting().Execute(
    58  			ctx,
    59  			"SELECT 1+1",
    60  			table.NewQueryParameters(),
    61  		)
    62  		if err != nil {
    63  			return err
    64  		}
    65  		defer func() {
    66  			_ = res.Close()
    67  		}()
    68  		if !res.NextResultSet(ctx) {
    69  			return retry.RetryableError(
    70  				fmt.Errorf("no result sets"),
    71  				retry.WithBackoff(retry.TypeNoBackoff),
    72  			)
    73  		}
    74  		if !res.NextRow() {
    75  			return retry.RetryableError(
    76  				fmt.Errorf("no rows"),
    77  				retry.WithBackoff(retry.TypeSlowBackoff),
    78  			)
    79  		}
    80  		var sum int32
    81  		if err = res.Scan(&sum); err != nil {
    82  			return fmt.Errorf("scan failed: %w", err)
    83  		}
    84  		if sum != 2 {
    85  			return fmt.Errorf("unexpected sum: %v", sum)
    86  		}
    87  		return res.Err()
    88  	}, retry.WithIdempotent(true)); err != nil {
    89  		t.Fatalf("Execute failed: %v", err)
    90  	}
    91  	// StreamExecute
    92  	if err = retry.Retry(ctx, func(ctx context.Context) (err error) {
    93  		res, err := db.Scripting().StreamExecute(
    94  			ctx,
    95  			"SELECT 1+1",
    96  			table.NewQueryParameters(),
    97  		)
    98  		if err != nil {
    99  			return err
   100  		}
   101  		defer func() {
   102  			_ = res.Close()
   103  		}()
   104  		if !res.NextResultSet(ctx) {
   105  			return retry.RetryableError(
   106  				fmt.Errorf("no result sets"),
   107  				retry.WithBackoff(retry.TypeNoBackoff),
   108  				retry.WithDeleteSession(),
   109  			)
   110  		}
   111  		if !res.NextRow() {
   112  			return retry.RetryableError(
   113  				fmt.Errorf("no rows"),
   114  				retry.WithBackoff(retry.TypeFastBackoff),
   115  			)
   116  		}
   117  		var sum int32
   118  		if err = res.Scan(&sum); err != nil {
   119  			return fmt.Errorf("scan failed: %w", err)
   120  		}
   121  		if sum != 2 {
   122  			return fmt.Errorf("unexpected sum: %v", sum)
   123  		}
   124  		return res.Err()
   125  	}, retry.WithIdempotent(true)); err != nil {
   126  		t.Fatalf("StreamExecute failed: %v", err)
   127  	}
   128  	// ExplainPlan
   129  	if err = retry.Retry(ctx, func(ctx context.Context) (err error) {
   130  		res, err := db.Scripting().Explain(
   131  			ctx,
   132  			"SELECT 1+1",
   133  			scripting.ExplainModePlan,
   134  		)
   135  		if err != nil {
   136  			return err
   137  		}
   138  		if res.Plan == "" {
   139  			return fmt.Errorf("empty plan")
   140  		}
   141  		return nil
   142  	}, retry.WithIdempotent(true)); err != nil {
   143  		t.Fatalf("Explain failed: %v", err)
   144  	}
   145  	// ExplainValidate
   146  	if err = retry.Retry(ctx, func(ctx context.Context) (err error) {
   147  		res, err := db.Scripting().Explain(
   148  			ctx,
   149  			"SELECT 1+1",
   150  			scripting.ExplainModeValidate,
   151  		)
   152  		if err != nil {
   153  			return err
   154  		}
   155  		if len(res.ParameterTypes) > 0 {
   156  			return fmt.Errorf("unexpected parameter types")
   157  		}
   158  		return nil
   159  	}, retry.WithIdempotent(true)); err != nil {
   160  		t.Fatalf("Explain failed: %v", err)
   161  	}
   162  }