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 }