Skip to content

Commit 3647485

Browse files
authored
Merge pull request #1695 from ydb-platform/wide-types
* Added binding `ydb.WithWideTimeTypes()` which interprets `time.Time` and `time.Duration` as `Timestamp64` and `Interval64` YDB types
2 parents 41a3b5f + 469939d commit 3647485

21 files changed

+415
-177
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
* Added binding `ydb.WithWideTimeTypes()` which interprets `time.Time` and `time.Duration` as `Timestamp64` and `Interval64` YDB types
2+
13
## v3.103.0
24
* Supported wide `Interval64` type
35

dsn.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,8 @@ func parseConnectionString(dataSourceName string) (opts []Option, _ error) {
114114
binders = append(binders, xsql.WithQueryBind(bind.PositionalArgs{}))
115115
case "numeric":
116116
binders = append(binders, xsql.WithQueryBind(bind.NumericArgs{}))
117+
case "wide_time_types":
118+
binders = append(binders, xsql.WithQueryBind(bind.WideTimeTypes{}))
117119
default:
118120
if strings.HasPrefix(transformer, tablePathPrefixTransformer) {
119121
prefix, err := extractTablePathPrefixFromBinderName(transformer)

dsn_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,21 @@ func TestParse(t *testing.T) {
171171
},
172172
err: nil,
173173
},
174+
{
175+
dsn: "grpc://localhost:2135/local?query_mode=scripting&go_query_bind=positional,declare,wide_time_types", //nolint:lll
176+
opts: []config.Option{
177+
config.WithSecure(false),
178+
config.WithEndpoint("localhost:2135"),
179+
config.WithDatabase("/local"),
180+
},
181+
connectorOpts: []xsql.Option{
182+
xsql.WithDefaultQueryMode(xtable.ScriptingQueryMode),
183+
xsql.WithQueryBind(bind.PositionalArgs{}),
184+
xsql.WithQueryBind(bind.AutoDeclare{}),
185+
xsql.WithQueryBind(bind.WideTimeTypes{}),
186+
},
187+
err: nil,
188+
},
174189
} {
175190
t.Run("", func(t *testing.T) {
176191
opts, err := parseConnectionString(tt.dsn)

internal/bind/auto_declare.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ func (m AutoDeclare) blockID() blockID {
1313
return blockDeclare
1414
}
1515

16-
func (m AutoDeclare) ToYdb(sql string, args ...interface{}) (
17-
yql string, newArgs []interface{}, err error,
16+
func (m AutoDeclare) ToYdb(sql string, args ...any) (
17+
yql string, newArgs []any, err error,
1818
) {
1919
params, err := Params(args...)
2020
if err != nil {

internal/bind/bind.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,22 +11,24 @@ import (
1111
type blockID int
1212

1313
const (
14-
blockPragma = blockID(iota)
14+
blockDefault = blockID(iota)
15+
blockPragma
1516
blockDeclare
1617
blockYQL
18+
blockCastArgs
1719
)
1820

1921
type Bind interface {
20-
ToYdb(sql string, args ...interface{}) (
21-
yql string, newArgs []interface{}, _ error,
22+
ToYdb(sql string, args ...any) (
23+
yql string, newArgs []any, _ error,
2224
)
2325

2426
blockID() blockID
2527
}
2628

2729
type Bindings []Bind
2830

29-
func (bindings Bindings) ToYdb(sql string, args ...interface{}) (
31+
func (bindings Bindings) ToYdb(sql string, args ...any) (
3032
yql string, params params.Params, err error,
3133
) {
3234
if len(bindings) == 0 {

internal/bind/noop.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package bind
2+
3+
type noopBind struct{}
4+
5+
func (m noopBind) ToYdb(sql string, args ...any) (yql string, newArgs []any, _ error) {
6+
return sql, args, nil
7+
}
8+
9+
func (m noopBind) blockID() blockID {
10+
return blockCastArgs
11+
}

internal/bind/numeric_args.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ func (m NumericArgs) blockID() blockID {
1717
return blockYQL
1818
}
1919

20-
func (m NumericArgs) ToYdb(sql string, args ...interface{}) (yql string, newArgs []interface{}, err error) {
20+
func (m NumericArgs) ToYdb(sql string, args ...any) (yql string, newArgs []any, err error) {
2121
l := &sqlLexer{
2222
src: sql,
2323
stateFn: numericArgsStateFn,
@@ -36,7 +36,7 @@ func (m NumericArgs) ToYdb(sql string, args ...interface{}) (yql string, newArgs
3636
if err != nil {
3737
return "", nil, err
3838
}
39-
newArgs = make([]interface{}, len(parameters))
39+
newArgs = make([]any, len(parameters))
4040
for i, param := range parameters {
4141
newArgs[i] = param
4242
}
@@ -119,7 +119,7 @@ func numericArgsStateFn(l *sqlLexer) stateFn {
119119
}
120120
}
121121

122-
func parsePositionalParameters(args []interface{}) ([]*params.Parameter, error) {
122+
func parsePositionalParameters(args []any) ([]*params.Parameter, error) {
123123
newArgs := make([]*params.Parameter, len(args))
124124
for i, arg := range args {
125125
paramName := fmt.Sprintf("$p%d", i)

0 commit comments

Comments
 (0)