Skip to content

Commit 79a35e0

Browse files
authored
Merge pull request #1365 from ydb-platform/fix-query-tx-commit-flag
Fixed respect to query.WithCommit() flag for tx.Execute in query service
2 parents e0f6968 + 2900099 commit 79a35e0

File tree

5 files changed

+84
-22
lines changed

5 files changed

+84
-22
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
* Fixed `query.WithCommit()` flag behaviour for `tx.Execute` in query service
12
* OAuth 2.0 token exchange: allowed multiple resource parameters in according to https://www.rfc-editor.org/rfc/rfc8693
23

34
## v3.76.0

internal/query/options/execute.go

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,14 +167,28 @@ func (s *commonExecuteSettings) Params() *params.Parameters {
167167

168168
func TxExecuteSettings(id string, opts ...TxExecuteOption) (settings *txExecuteSettings) {
169169
settings = &txExecuteSettings{
170-
ExecuteSettings: ExecuteSettings(WithTxControl(tx.NewControl(tx.WithTxID(id)))),
170+
ExecuteSettings: ExecuteSettings(),
171171
}
172172
for _, opt := range opts {
173173
if opt != nil {
174174
opt.applyTxExecuteOption(settings)
175175
}
176176
}
177177

178+
var txControlOptions []tx.ControlOption
179+
if settings.commitTx {
180+
txControlOptions = []tx.ControlOption{
181+
tx.WithTxID(id),
182+
tx.CommitTx(),
183+
}
184+
} else {
185+
txControlOptions = []tx.ControlOption{
186+
tx.WithTxID(id),
187+
}
188+
}
189+
190+
settings.ExecuteSettings.SetTxControl(tx.NewControl(txControlOptions...))
191+
178192
return settings
179193
}
180194

internal/query/transaction_test.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,19 @@ func TestTxExecuteSettings(t *testing.T) {
218218
params: params.Builder{}.Param("$a").Text("A").Build(),
219219
},
220220
},
221+
{
222+
name: "WithCommitTx",
223+
txOpts: []options.TxExecuteOption{
224+
options.WithCommit(),
225+
},
226+
settings: testExecuteSettings{
227+
execMode: options.ExecModeExecute,
228+
statsMode: options.StatsModeNone,
229+
txControl: query.TxControl(query.WithTxID(""), query.CommitTx()),
230+
syntax: options.SyntaxYQL,
231+
params: nil,
232+
},
233+
},
221234
} {
222235
t.Run(tt.name, func(t *testing.T) {
223236
a := allocator.New()

tests/integration/helpers_test.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,20 @@ func (scope *scopeT) Driver(opts ...ydb.Option) *ydb.Driver {
8686
return scope.driverNamed("default", opts...)
8787
}
8888

89+
func (scope *scopeT) DriverWithLogs(opts ...ydb.Option) *ydb.Driver {
90+
return scope.driverNamed("logged",
91+
ydb.WithTraceQuery(
92+
log.Query(
93+
log.Default(os.Stdout,
94+
log.WithLogQuery(),
95+
log.WithMinLevel(log.INFO),
96+
),
97+
trace.QueryEvents,
98+
),
99+
),
100+
)
101+
}
102+
89103
func (scope *scopeT) DriverWithGRPCLogging() *ydb.Driver {
90104
return scope.driverNamed("grpc-logged", ydb.With(config.WithGrpcOptions(
91105
grpc.WithChainUnaryInterceptor(xtest.NewGrpcLogger(scope.t).UnaryClientInterceptor),

tests/integration/query_tx_execute_test.go

Lines changed: 41 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,46 +5,28 @@ package integration
55

66
import (
77
"context"
8+
"fmt"
89
"os"
910
"testing"
1011

1112
"github.com/stretchr/testify/require"
1213

13-
"github.com/ydb-platform/ydb-go-sdk/v3"
1414
"github.com/ydb-platform/ydb-go-sdk/v3/internal/version"
15-
"github.com/ydb-platform/ydb-go-sdk/v3/log"
1615
"github.com/ydb-platform/ydb-go-sdk/v3/query"
17-
"github.com/ydb-platform/ydb-go-sdk/v3/trace"
1816
)
1917

2018
func TestQueryTxExecute(t *testing.T) {
2119
if version.Lt(os.Getenv("YDB_VERSION"), "24.1") {
2220
t.Skip("query service not allowed in YDB version '" + os.Getenv("YDB_VERSION") + "'")
2321
}
2422

25-
ctx, cancel := context.WithCancel(context.Background())
26-
defer cancel()
23+
scope := newScope(t)
2724

28-
db, err := ydb.Open(ctx,
29-
os.Getenv("YDB_CONNECTION_STRING"),
30-
ydb.WithAccessTokenCredentials(os.Getenv("YDB_ACCESS_TOKEN_CREDENTIALS")),
31-
ydb.WithTraceQuery(
32-
log.Query(
33-
log.Default(os.Stdout,
34-
log.WithLogQuery(),
35-
log.WithColoring(),
36-
log.WithMinLevel(log.INFO),
37-
),
38-
trace.QueryEvents,
39-
),
40-
),
41-
)
42-
require.NoError(t, err)
4325
var (
4426
columnNames []string
4527
columnTypes []string
4628
)
47-
err = db.Query().DoTx(ctx, func(ctx context.Context, tx query.TxActor) (err error) {
29+
err := scope.DriverWithLogs().Query().DoTx(scope.Ctx, func(ctx context.Context, tx query.TxActor) (err error) {
4830
res, err := tx.Execute(ctx, "SELECT 1 AS col1")
4931
if err != nil {
5032
return err
@@ -72,3 +54,41 @@ func TestQueryTxExecute(t *testing.T) {
7254
require.Equal(t, []string{"col1"}, columnNames)
7355
require.Equal(t, []string{"Int32"}, columnTypes)
7456
}
57+
58+
func TestQueryWithCommitTxFlag(t *testing.T) {
59+
if version.Lt(os.Getenv("YDB_VERSION"), "24.1") {
60+
t.Skip("query service not allowed in YDB version '" + os.Getenv("YDB_VERSION") + "'")
61+
}
62+
63+
scope := newScope(t)
64+
var count uint64
65+
err := scope.DriverWithLogs().Query().Do(scope.Ctx, func(ctx context.Context, s query.Session) error {
66+
tableName := scope.TablePath()
67+
tx, err := s.Begin(ctx, query.TxSettings(query.WithDefaultTxMode()))
68+
if err != nil {
69+
return fmt.Errorf("failed start transaction: %w", err)
70+
}
71+
q := fmt.Sprintf("UPSERT INTO `%v` (id, val) VALUES(1, \"2\")", tableName)
72+
res, err := tx.Execute(ctx, q, query.WithCommit())
73+
if err != nil {
74+
return fmt.Errorf("failed execute insert: %w", err)
75+
}
76+
if err = res.Close(ctx); err != nil {
77+
return err
78+
}
79+
80+
// read row within other (implicit) transaction
81+
q2 := fmt.Sprintf("SELECT COUNT(*) FROM `%v`", tableName)
82+
row, err := s.ReadRow(ctx, q2)
83+
if err != nil {
84+
return fmt.Errorf("failed read row: %w", err)
85+
}
86+
87+
if err = row.Scan(&count); err != nil {
88+
return fmt.Errorf("failed scan row: %w", err)
89+
}
90+
return nil
91+
})
92+
require.NoError(t, err)
93+
require.Equal(t, uint64(1), count)
94+
}

0 commit comments

Comments
 (0)