Skip to content

Commit f47bd60

Browse files
authored
Merge branch 'master' into fix_sql_driver_Valuer
2 parents f80c9fa + be04ec8 commit f47bd60

File tree

137 files changed

+4732
-2192
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

137 files changed

+4732
-2192
lines changed

.github/workflows/examples.yml

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ jobs:
1515
strategy:
1616
fail-fast: false
1717
matrix:
18-
ydb-version: [ 23.3, 24.1 ]
19-
application: [ native/table, native/query, database_sql, gorm, xorm ]
18+
ydb-version: [ 24.1, 24.2, 24.3 ]
19+
application: [ native/table, native/query ]
2020
services:
2121
ydb:
2222
image: ydbplatform/local-ydb:${{ matrix.ydb-version }}
@@ -47,6 +47,48 @@ jobs:
4747
- name: Run basic example ${{ matrix.application }}
4848
working-directory: ./examples/basic/${{ matrix.application }}
4949
run: go run .
50+
basic-ydb-database-sql:
51+
concurrency:
52+
group: basic-ydb-${{ github.ref }}-${{ matrix.ydb-version }}-${{ matrix.application }}-${{ matrix.query_service }}
53+
cancel-in-progress: true
54+
runs-on: ubuntu-latest
55+
strategy:
56+
fail-fast: false
57+
matrix:
58+
ydb-version: [ 24.1, 24.2, 24.3 ]
59+
application: [ database/sql, gorm, xorm ]
60+
query_service: [ true, false ]
61+
services:
62+
ydb:
63+
image: ydbplatform/local-ydb:${{ matrix.ydb-version }}
64+
ports:
65+
- 2135:2135
66+
- 2136:2136
67+
- 8765:8765
68+
volumes:
69+
- /tmp/ydb_certs:/ydb_certs
70+
env:
71+
YDB_LOCAL_SURVIVE_RESTART: true
72+
YDB_USE_IN_MEMORY_PDISKS: true
73+
YDB_TABLE_ENABLE_PREPARED_DDL: true
74+
options: '-h localhost'
75+
env:
76+
OS: ubuntu-latest
77+
GO: 1.23.x
78+
YDB_CONNECTION_STRING: grpc://localhost:2136/local
79+
YDB_ANONYMOUS_CREDENTIALS: 1
80+
YDB_VERSION: ${{ matrix.ydb-version }}
81+
YDB_DATABASE_SQL_OVER_QUERY_SERVICE: ${{ matrix.query_service }}
82+
steps:
83+
- name: Checkout code
84+
uses: actions/checkout@v4
85+
- name: Install Go
86+
uses: actions/setup-go@v5
87+
with:
88+
cache: true
89+
- name: Run basic example ${{ matrix.application }}
90+
working-directory: ./examples/basic/${{ matrix.application }}
91+
run: go run .
5092
basic-postgres:
5193
concurrency:
5294
group: basic-postgres-${{ matrix.application }}-${{ github.ref }}

.github/workflows/slo.yml

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,14 @@ jobs:
3232
strategy:
3333
matrix:
3434
sdk:
35-
- id: database_sql
36-
name: database-sql
37-
path: ./database/sql
38-
label: database/sql
35+
- id: database_sql_legacy
36+
name: database-sql-legacy
37+
path: ./database/sql/legacy
38+
label: database/sql/legacy
39+
- id: database_sql_propose
40+
name: database-sql-propose
41+
path: ./database/sql/propose
42+
label: database/sql/propose
3943
- id: native_query
4044
name: native-query
4145
path: ./native/query
@@ -44,14 +48,22 @@ jobs:
4448
name: native-table
4549
path: ./native/table
4650
label: native/table
47-
- id: gorm
48-
name: gorm
49-
path: ./gorm
50-
label: gorm
51-
- id: xorm
52-
name: xorm
53-
path: ./xorm
54-
label: xorm
51+
- id: gorm_legacy
52+
name: gorm-legacy
53+
path: ./gorm/legacy
54+
label: gorm/legacy
55+
- id: gorm_propose
56+
name: gorm-propose
57+
path: ./gorm/propose
58+
label: gorm/propose
59+
- id: xorm_legacy
60+
name: xorm-legacy
61+
path: ./xorm/legacy
62+
label: xorm/legacy
63+
- id: xorm_propose
64+
name: xorm-propose
65+
path: ./xorm/propose
66+
label: xorm/propose
5567

5668
concurrency:
5769
group: slo-${{ github.ref }}-${{ matrix.sdk.name }}

.github/workflows/tests.yml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ jobs:
1919
strategy:
2020
fail-fast: false
2121
matrix:
22-
go-version: [1.21.x, 1.22.x, 1.23.x]
22+
go-version: [1.22.x, 1.23.x]
2323
os: [ubuntu, windows, macOS]
2424
env:
2525
OS: ${{ matrix.os }}-latest
@@ -52,8 +52,8 @@ jobs:
5252
strategy:
5353
fail-fast: false
5454
matrix:
55-
go-version: [1.21.x, 1.22.x, 1.23.x]
56-
ydb-version: [23.3, 24.1, 24.2]
55+
go-version: [1.22.x, 1.23.x]
56+
ydb-version: [24.1, 24.2, 24.3]
5757
os: [ubuntu]
5858
services:
5959
ydb:
@@ -133,6 +133,7 @@ jobs:
133133
YDB_CONNECTION_STRING_SECURE: grpcs://localhost:2135/local
134134
YDB_SSL_ROOT_CERTIFICATES_FILE: /tmp/ydb_certs/ca.pem
135135
YDB_SESSIONS_SHUTDOWN_URLS: http://localhost:8765/actors/kqp_proxy?force_shutdown=all
136+
YDB_DATABASE_SQL_OVER_QUERY_SERVICE: 1
136137
HIDE_APPLICATION_OUTPUT: 1
137138
steps:
138139
- name: Checkout code

CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,16 @@
11
* Fix - returned support of sql/driver.Valuer interfaces for params which passed to query using sql driver
22

3+
## v3.95.2
4+
* Fixed panic on multiple closing driver
5+
6+
## v3.95.1
7+
* Added alias from `ydb.WithFakeTx(ydb.ScriptingQueryMode)` to `ydb.WithFakeTx(ydb.QueryExecuteQueryMode)` for compatibility with legacy code
8+
9+
## v3.95.0
10+
* Added implementation of `database/sql` driver over query service client
11+
* Added `ydb.WithQueryService(bool)` option to explicitly enable `database/sql` driver over query service client
12+
* Added environment parameter `YDB_DATABASE_SQL_OVER_QUERY_SERVICE` to enable `database/sql` driver over query service client without code rewriting
13+
314
## v3.94.0
415
* Refactored golang types mapping into ydb types using `ydb.ParamsFromMap` and `database/sql` query arguments
516
* Small breaking change: type mapping for `ydb.ParamsFromMap` and `database/sql` type `uuid.UUID` changed from ydb type `Text` to ydb type `UUID`

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@ err := db.Query().Do( // Do retry operation on errors with best effort
6262
return err
6363
}
6464
type myStruct struct {
65-
id uint64 `sql:"id"`
66-
str string `sql:"myStr"`
65+
Id int32 `sql:"id"`
66+
Str string `sql:"myStr"`
6767
}
6868
var s myStruct
6969
if err = row.ScanStruct(&s); err != nil {

SQL.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -651,4 +651,4 @@ db := sql.OpenDB(connector)
651651
652652
## Example of usage <a name="example"></a>
653653
654-
[Basic example](https://github.com/ydb-platform/ydb-go-examples/tree/master/basic) about series written with `database/sql` driver for `YDB` placed in [examples repository](https://github.com/ydb-platform/ydb-go-examples/tree/master/database_sql)
654+
[Basic example](https://github.com/ydb-platform/ydb-go-sdk/tree/master/examples/basic/native/query) about series written with `database/sql` driver for `YDB` placed in [examples repository](https://github.com/ydb-platform/ydb-go-sdk/tree/master/examples/database/sql)

driver.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"fmt"
77
"os"
88
"sync"
9+
"sync/atomic"
910

1011
"google.golang.org/grpc"
1112

@@ -14,7 +15,6 @@ import (
1415
"github.com/ydb-platform/ydb-go-sdk/v3/discovery"
1516
"github.com/ydb-platform/ydb-go-sdk/v3/internal/balancer"
1617
"github.com/ydb-platform/ydb-go-sdk/v3/internal/conn"
17-
"github.com/ydb-platform/ydb-go-sdk/v3/internal/connector"
1818
internalCoordination "github.com/ydb-platform/ydb-go-sdk/v3/internal/coordination"
1919
coordinationConfig "github.com/ydb-platform/ydb-go-sdk/v3/internal/coordination/config"
2020
"github.com/ydb-platform/ydb-go-sdk/v3/internal/credentials"
@@ -37,6 +37,7 @@ import (
3737
"github.com/ydb-platform/ydb-go-sdk/v3/internal/topic/topicclientinternal"
3838
"github.com/ydb-platform/ydb-go-sdk/v3/internal/xcontext"
3939
"github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors"
40+
"github.com/ydb-platform/ydb-go-sdk/v3/internal/xsql"
4041
"github.com/ydb-platform/ydb-go-sdk/v3/internal/xsync"
4142
"github.com/ydb-platform/ydb-go-sdk/v3/log"
4243
"github.com/ydb-platform/ydb-go-sdk/v3/operation"
@@ -93,7 +94,7 @@ type (
9394
topic *xsync.Once[*topicclientinternal.Client]
9495
topicOptions []topicoptions.TopicOption
9596

96-
databaseSQLOptions []connector.Option
97+
databaseSQLOptions []xsql.Option
9798

9899
pool *conn.Pool
99100

@@ -103,6 +104,7 @@ type (
103104
children map[uint64]*Driver
104105
childrenMtx xsync.Mutex
105106
onClose []func(c *Driver)
107+
closed atomic.Bool
106108

107109
panicCallback func(e interface{})
108110
}
@@ -149,6 +151,11 @@ func (d *Driver) Close(ctx context.Context) (finalErr error) {
149151
defer func() {
150152
onDone(finalErr)
151153
}()
154+
155+
if !d.closed.CompareAndSwap(false, true) {
156+
return nil
157+
}
158+
152159
d.ctxCancel()
153160

154161
d.mtx.Lock()

dsn.go

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,9 @@ import (
99
"github.com/ydb-platform/ydb-go-sdk/v3/balancers"
1010
"github.com/ydb-platform/ydb-go-sdk/v3/credentials"
1111
"github.com/ydb-platform/ydb-go-sdk/v3/internal/bind"
12-
"github.com/ydb-platform/ydb-go-sdk/v3/internal/connector"
1312
"github.com/ydb-platform/ydb-go-sdk/v3/internal/dsn"
14-
tableSql "github.com/ydb-platform/ydb-go-sdk/v3/internal/table/conn"
1513
"github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors"
14+
"github.com/ydb-platform/ydb-go-sdk/v3/internal/xsql"
1615
)
1716

1817
const tablePathPrefixTransformer = "table_path_prefix"
@@ -44,6 +43,22 @@ func UnregisterDsnParser(registrationID int) {
4443
dsnParsers[registrationID] = nil
4544
}
4645

46+
var stringToType = map[string]QueryMode{
47+
"data": DataQueryMode,
48+
"scan": ScanQueryMode,
49+
"scheme": SchemeQueryMode,
50+
"scripting": ScriptingQueryMode,
51+
"query": QueryExecuteQueryMode,
52+
}
53+
54+
func queryModeFromString(s string) QueryMode {
55+
if t, ok := stringToType[s]; ok {
56+
return t
57+
}
58+
59+
return unknownQueryMode
60+
}
61+
4762
//nolint:funlen
4863
func parseConnectionString(dataSourceName string) (opts []Option, _ error) {
4964
info, err := dsn.Parse(dataSourceName)
@@ -60,45 +75,52 @@ func parseConnectionString(dataSourceName string) (opts []Option, _ error) {
6075
opts = append(opts, WithBalancer(balancers.FromConfig(balancer)))
6176
}
6277
if queryMode := info.Params.Get("go_query_mode"); queryMode != "" {
63-
mode := tableSql.QueryModeFromString(queryMode)
64-
if mode == tableSql.UnknownQueryMode {
78+
switch mode := queryModeFromString(queryMode); mode {
79+
case QueryExecuteQueryMode:
80+
opts = append(opts, withConnectorOptions(xsql.WithQueryService(true)))
81+
case unknownQueryMode:
6582
return nil, xerrors.WithStackTrace(fmt.Errorf("unknown query mode: %s", queryMode))
83+
default:
84+
opts = append(opts, withConnectorOptions(xsql.WithDefaultQueryMode(modeToMode(mode))))
6685
}
67-
opts = append(opts, withConnectorOptions(connector.WithDefaultQueryMode(mode)))
6886
} else if queryMode := info.Params.Get("query_mode"); queryMode != "" {
69-
mode := tableSql.QueryModeFromString(queryMode)
70-
if mode == tableSql.UnknownQueryMode {
87+
switch mode := queryModeFromString(queryMode); mode {
88+
case QueryExecuteQueryMode:
89+
opts = append(opts, withConnectorOptions(xsql.WithQueryService(true)))
90+
case unknownQueryMode:
7191
return nil, xerrors.WithStackTrace(fmt.Errorf("unknown query mode: %s", queryMode))
92+
default:
93+
opts = append(opts, withConnectorOptions(xsql.WithDefaultQueryMode(modeToMode(mode))))
7294
}
73-
opts = append(opts, withConnectorOptions(connector.WithDefaultQueryMode(mode)))
7495
}
7596
if fakeTx := info.Params.Get("go_fake_tx"); fakeTx != "" {
7697
for _, queryMode := range strings.Split(fakeTx, ",") {
77-
mode := tableSql.QueryModeFromString(queryMode)
78-
if mode == tableSql.UnknownQueryMode {
98+
switch mode := queryModeFromString(queryMode); mode {
99+
case unknownQueryMode:
79100
return nil, xerrors.WithStackTrace(fmt.Errorf("unknown query mode: %s", queryMode))
101+
default:
102+
opts = append(opts, withConnectorOptions(WithFakeTx(mode)))
80103
}
81-
opts = append(opts, withConnectorOptions(connector.WithFakeTx(mode)))
82104
}
83105
}
84106
if info.Params.Has("go_query_bind") {
85-
var binders []connector.Option
107+
var binders []xsql.Option
86108
queryTransformers := strings.Split(info.Params.Get("go_query_bind"), ",")
87109
for _, transformer := range queryTransformers {
88110
switch transformer {
89111
case "declare":
90-
binders = append(binders, connector.WithQueryBind(bind.AutoDeclare{}))
112+
binders = append(binders, xsql.WithQueryBind(bind.AutoDeclare{}))
91113
case "positional":
92-
binders = append(binders, connector.WithQueryBind(bind.PositionalArgs{}))
114+
binders = append(binders, xsql.WithQueryBind(bind.PositionalArgs{}))
93115
case "numeric":
94-
binders = append(binders, connector.WithQueryBind(bind.NumericArgs{}))
116+
binders = append(binders, xsql.WithQueryBind(bind.NumericArgs{}))
95117
default:
96118
if strings.HasPrefix(transformer, tablePathPrefixTransformer) {
97119
prefix, err := extractTablePathPrefixFromBinderName(transformer)
98120
if err != nil {
99121
return nil, xerrors.WithStackTrace(err)
100122
}
101-
binders = append(binders, connector.WithQueryBind(bind.TablePathPrefix(prefix)))
123+
binders = append(binders, xsql.WithQueryBind(bind.TablePathPrefix(prefix)))
102124
} else {
103125
return nil, xerrors.WithStackTrace(
104126
fmt.Errorf("unknown query rewriter: %s", transformer),

0 commit comments

Comments
 (0)