Skip to content

Commit 56349ad

Browse files
getting rowsAffected from YDB QueryStats (#1887)
Co-authored-by: Aleksey Myasnikov <[email protected]>
1 parent 56a574c commit 56349ad

File tree

10 files changed

+550
-27
lines changed

10 files changed

+550
-27
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
* Added support for `Result.RowsAffected()` for YDB `database/sql` driver
2+
* Upgraded minimal version of Go to 1.23.9
13
* Fixed race in `readerReconnector`
24

35
## v3.117.1

examples/go.mod

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
module examples
22

3-
go 1.23.0
4-
5-
toolchain go1.23.6
3+
go 1.23.9
64

75
require (
86
github.com/apache/arrow/go/arrow v0.0.0-20211112161151-bc219186db40

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module github.com/ydb-platform/ydb-go-sdk/v3
22

3-
go 1.22.5
3+
go 1.23.9
44

55
require (
66
github.com/golang-jwt/jwt/v4 v4.5.2

internal/query/result.go

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -159,10 +159,6 @@ func newResult(
159159

160160
r.lastPart = part
161161

162-
if part.GetExecStats() != nil && r.statsCallback != nil {
163-
r.statsCallback(stats.FromQueryStats(part.GetExecStats()))
164-
}
165-
166162
return &r, nil
167163
}
168164
}
@@ -211,6 +207,10 @@ func (r *streamResult) nextPart(ctx context.Context) (
211207
}
212208
}
213209

210+
if part.GetExecStats() != nil && r.statsCallback != nil {
211+
r.statsCallback(stats.FromQueryStats(part.GetExecStats()))
212+
}
213+
214214
return part, nil
215215
}
216216
}
@@ -286,9 +286,6 @@ func (r *streamResult) nextResultSet(ctx context.Context) (_ *resultSet, err err
286286
if err != nil {
287287
return nil, xerrors.WithStackTrace(err)
288288
}
289-
if part.GetExecStats() != nil && r.statsCallback != nil {
290-
r.statsCallback(stats.FromQueryStats(part.GetExecStats()))
291-
}
292289
if part.GetResultSetIndex() < r.resultSetIndex {
293290
r.closer.Close(nil)
294291

@@ -326,9 +323,6 @@ func (r *streamResult) nextPartFunc(
326323
return nil, xerrors.WithStackTrace(err)
327324
}
328325
r.lastPart = part
329-
if part.GetExecStats() != nil && r.statsCallback != nil {
330-
r.statsCallback(stats.FromQueryStats(part.GetExecStats()))
331-
}
332326
if part.GetResultSetIndex() > nextResultSetIndex {
333327
return nil, xerrors.WithStackTrace(fmt.Errorf(
334328
"result set (index=%d) receive part (index=%d) for next result set: %w (%w)",

internal/xsql/xquery/conn.go

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,6 @@ import (
1515
"github.com/ydb-platform/ydb-go-sdk/v3/internal/xsql/common"
1616
)
1717

18-
type resultNoRows struct{}
19-
20-
func (resultNoRows) LastInsertId() (int64, error) { return 0, ErrUnsupported }
21-
func (resultNoRows) RowsAffected() (int64, error) { return 0, ErrUnsupported }
22-
23-
var _ driver.Result = resultNoRows{}
24-
2518
type Parent interface {
2619
Query() *query.Client
2720
}
@@ -39,7 +32,7 @@ func (c *Conn) NodeID() uint32 {
3932
}
4033

4134
func (c *Conn) Exec(ctx context.Context, sql string, params *params.Params) (
42-
result driver.Result, finalErr error,
35+
driver.Result, error,
4336
) {
4437
if !c.IsValid() {
4538
return nil, xerrors.WithStackTrace(xerrors.Retryable(errNotReadyConn,
@@ -63,12 +56,15 @@ func (c *Conn) Exec(ctx context.Context, sql string, params *params.Params) (
6356
opts = append(opts, options.WithTxControl(txControl))
6457
}
6558

59+
r := &resultWithStats{}
60+
opts = append(opts, options.WithStatsMode(options.StatsModeBasic, r.onQueryStats))
61+
6662
err := c.session.Exec(ctx, sql, opts...)
6763
if err != nil {
6864
return nil, xerrors.WithStackTrace(err)
6965
}
7066

71-
return resultNoRows{}, nil
67+
return r, nil
7268
}
7369

7470
func (c *Conn) Query(ctx context.Context, sql string, params *params.Params) (
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package xquery
2+
3+
import (
4+
"database/sql/driver"
5+
6+
"github.com/ydb-platform/ydb-go-sdk/v3/query"
7+
)
8+
9+
type (
10+
resultWithStats struct {
11+
rowsAffected *uint64
12+
}
13+
)
14+
15+
var _ driver.Result = &resultWithStats{}
16+
17+
func (r *resultWithStats) onQueryStats(qs query.Stats) {
18+
var rowsAffected uint64
19+
for queryPhase := range qs.QueryPhases() {
20+
for tableAccess := range queryPhase.TableAccess() {
21+
rowsAffected += tableAccess.Deletes.Rows + tableAccess.Updates.Rows
22+
}
23+
}
24+
// last stats always contains the full stats of query
25+
r.rowsAffected = &rowsAffected
26+
}
27+
28+
func (r *resultWithStats) RowsAffected() (int64, error) {
29+
if r.rowsAffected == nil {
30+
return 0, ErrUnsupported
31+
}
32+
33+
return int64(*r.rowsAffected), nil
34+
}
35+
36+
func (r *resultWithStats) LastInsertId() (int64, error) { return 0, ErrUnsupported }

0 commit comments

Comments
 (0)