Skip to content

Commit 9799559

Browse files
committed
* Fixed returning io.EOF on rows.Next and rows.NextResultSet
* Added wrapping of errors from unary and stream results * Added error throw on `database/sql.Conn.BeginTx()`, `*sql.Tx.ExecContext` and `*sql.Tx.QueryContext` if query mode is not `ydb.DataQueryMode` * Added test for `database/sql` scan-query
1 parent be56972 commit 9799559

File tree

5 files changed

+29
-5
lines changed

5 files changed

+29
-5
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
* Refactored of applying grpc dial options with defaults
66
* Added `trace.Driver.{OnBalancerDialEntrypoint,OnBalancerClusterDiscoveryAttempt}` trace events
77
* Fixed compilation of package `internal/xresolver` with `google.golang.org/[email protected]`
8+
* Fixed returning `io.EOF` on `rows.Next` and `rows.NextResultSet`
89
* Added wrapping of errors from unary and stream results
10+
* Added error throw on `database/sql.Conn.BeginTx()`, `*sql.Tx.ExecContext` and `*sql.Tx.QueryContext` if query mode is not `ydb.DataQueryMode`
911
* Added test for `database/sql` scan-query
1012

1113
## v3.42.8

internal/xsql/badconn/badconn_go1.18.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ package badconn
55

66
import (
77
"database/sql/driver"
8-
"io"
98

109
"github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors"
1110
)
@@ -43,8 +42,6 @@ func Map(err error) error {
4342
switch {
4443
case err == nil:
4544
return nil
46-
case xerrors.Is(err, io.EOF):
47-
return io.EOF
4845
case xerrors.Is(err, driver.ErrBadConn):
4946
return err
5047
case xerrors.MustDeleteSession(err):

internal/xsql/conn.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,10 @@ func (c *conn) BeginTx(ctx context.Context, txOptions driver.TxOptions) (_ drive
342342
defer func() {
343343
onDone(transaction, err)
344344
}()
345+
m := queryModeFromContext(ctx, c.defaultQueryMode)
346+
if m != DataQueryMode {
347+
return nil, badconn.Map(xerrors.WithStackTrace(fmt.Errorf("wrong query mode: %s", m.String())))
348+
}
345349
if !c.isReady() {
346350
return nil, badconn.Map(xerrors.WithStackTrace(errNotReadyConn))
347351
}

internal/xsql/rows.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,15 @@ func (r *rows) ColumnTypeDatabaseTypeName(index int) string {
6767
return yqlTypes[index]
6868
}
6969

70-
func (r *rows) NextResultSet() error {
70+
func (r *rows) NextResultSet() (err error) {
71+
defer func() {
72+
if err != nil && xerrors.Is(err, io.EOF) {
73+
// database/sql checks io.EOF with "==", not errors.Is(err, io.EOF)
74+
err = io.EOF
75+
}
76+
}()
7177
r.nextSet.Do(func() {})
72-
err := r.result.NextResultSetErr(context.Background())
78+
err = r.result.NextResultSetErr(context.Background())
7379
if err != nil {
7480
return badconn.Map(xerrors.WithStackTrace(err))
7581
}
@@ -81,6 +87,12 @@ func (r *rows) HasNextResultSet() bool {
8187
}
8288

8389
func (r *rows) Next(dst []driver.Value) (err error) {
90+
defer func() {
91+
if err != nil && xerrors.Is(err, io.EOF) {
92+
// database/sql checks io.EOF with "==", not errors.Is(err, io.EOF)
93+
err = io.EOF
94+
}
95+
}()
8496
r.nextSet.Do(func() {
8597
err = r.result.NextResultSetErr(context.Background())
8698
})

internal/xsql/tx.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package xsql
33
import (
44
"context"
55
"database/sql/driver"
6+
"fmt"
67

78
"github.com/ydb-platform/ydb-go-sdk/v3/internal/xcontext"
89
"github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors"
@@ -70,6 +71,10 @@ func (tx *tx) QueryContext(ctx context.Context, query string, args []driver.Name
7071
defer func() {
7172
onDone(err)
7273
}()
74+
m := queryModeFromContext(ctx, tx.conn.defaultQueryMode)
75+
if m != DataQueryMode {
76+
return nil, badconn.Map(xerrors.WithStackTrace(fmt.Errorf("wrong query mode: %s", m.String())))
77+
}
7378
var res result.Result
7479
res, err = tx.tx.Execute(ctx,
7580
query,
@@ -93,6 +98,10 @@ func (tx *tx) ExecContext(ctx context.Context, query string, args []driver.Named
9398
defer func() {
9499
onDone(err)
95100
}()
101+
m := queryModeFromContext(ctx, tx.conn.defaultQueryMode)
102+
if m != DataQueryMode {
103+
return nil, badconn.Map(xerrors.WithStackTrace(fmt.Errorf("wrong query mode: %s", m.String())))
104+
}
96105
_, err = tx.tx.Execute(ctx,
97106
query,
98107
toQueryParams(args),

0 commit comments

Comments
 (0)