Skip to content

Commit 296cca7

Browse files
1NepuNep1Viktor Pentyukhov
andauthored
Made new params building logic & got rid off .Query handle (#11)
* Made new params building logic & got rid off .Query handle (replaced it with QueryResultSet) * Cosmetics * Bug fixes --------- Co-authored-by: Viktor Pentyukhov <nepunep@172.28.98.114-red.dhcp.yndx.net>
1 parent f2d7aea commit 296cca7

File tree

6 files changed

+167
-50
lines changed

6 files changed

+167
-50
lines changed

examples/authors/ydb/query.sql.go

Lines changed: 29 additions & 22 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/codegen/golang/query.go

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"strings"
66

77
"github.com/sqlc-dev/sqlc/internal/codegen/golang/opts"
8+
"github.com/sqlc-dev/sqlc/internal/codegen/sdk"
89
"github.com/sqlc-dev/sqlc/internal/metadata"
910
"github.com/sqlc-dev/sqlc/internal/plugin"
1011
)
@@ -294,6 +295,106 @@ func (v QueryValue) YDBParamMapEntries() string {
294295
return "\n" + strings.Join(parts, ",\n")
295296
}
296297

298+
// ydbBuilderMethodForColumnType maps a YDB column data type to a ParamsBuilder method name.
299+
func ydbBuilderMethodForColumnType(dbType string) string {
300+
switch strings.ToLower(dbType) {
301+
case "bool":
302+
return "Bool"
303+
case "uint64":
304+
return "Uint64"
305+
case "int64":
306+
return "Int64"
307+
case "uint32":
308+
return "Uint32"
309+
case "int32":
310+
return "Int32"
311+
case "uint16":
312+
return "Uint16"
313+
case "int16":
314+
return "Int16"
315+
case "uint8":
316+
return "Uint8"
317+
case "int8":
318+
return "Int8"
319+
case "float":
320+
return "Float"
321+
case "double":
322+
return "Double"
323+
case "json":
324+
return "JSON"
325+
case "jsondocument":
326+
return "JSONDocument"
327+
case "utf8", "text", "string":
328+
return "Text"
329+
case "date":
330+
return "Date"
331+
case "date32":
332+
return "Date32"
333+
case "datetime":
334+
return "Datetime"
335+
case "timestamp":
336+
return "Timestamp"
337+
case "tzdate":
338+
return "TzDate"
339+
case "tzdatetime":
340+
return "TzDatetime"
341+
case "tztimestamp":
342+
return "TzTimestamp"
343+
344+
//TODO: support other types
345+
default:
346+
return ""
347+
}
348+
}
349+
350+
// YDBParamsBuilder emits Go code that constructs YDB params using ParamsBuilder.
351+
func (v QueryValue) YDBParamsBuilder() string {
352+
if v.isEmpty() {
353+
return ""
354+
}
355+
356+
var lines []string
357+
358+
for _, field := range v.getParameterFields() {
359+
if field.Column != nil && field.Column.IsNamedParam {
360+
name := field.Column.GetName()
361+
if name == "" {
362+
continue
363+
}
364+
paramName := fmt.Sprintf("%q", addDollarPrefix(name))
365+
variable := escape(v.VariableForField(field))
366+
367+
var method string
368+
if field.Column != nil && field.Column.Type != nil {
369+
method = ydbBuilderMethodForColumnType(sdk.DataType(field.Column.Type))
370+
}
371+
372+
goType := field.Type
373+
isPtr := strings.HasPrefix(goType, "*")
374+
if isPtr {
375+
goType = strings.TrimPrefix(goType, "*")
376+
}
377+
378+
if method == "" {
379+
panic(fmt.Sprintf("unknown YDB column type for param %s (goType=%s)", name, goType))
380+
}
381+
382+
if isPtr {
383+
lines = append(lines, fmt.Sprintf("\t\t\tParam(%s).BeginOptional().%s(%s).EndOptional().", paramName, method, variable))
384+
} else {
385+
lines = append(lines, fmt.Sprintf("\t\t\tParam(%s).%s(%s).", paramName, method, variable))
386+
}
387+
}
388+
}
389+
390+
if len(lines) == 0 {
391+
return ""
392+
}
393+
394+
params := strings.Join(lines, "\n")
395+
return fmt.Sprintf("\nquery.WithParameters(\n\t\tydb.ParamsBuilder().\n%s\n\t\t\tBuild(),\n\t\t),\n", params)
396+
}
397+
297398
func (v QueryValue) getParameterFields() []Field {
298399
if v.Struct == nil {
299400
return []Field{

internal/codegen/golang/templates/ydb-go-sdk/queryCode.tmpl

Lines changed: 17 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ func (q *Queries) {{.MethodName}}(ctx context.Context, {{if $.EmitMethodsWithDBA
2727
{{- if .Arg.IsEmpty }}
2828
row, err := {{$dbArg}}.QueryRow(ctx, {{.ConstantName}}, opts...)
2929
{{- else }}
30-
row, err := {{$dbArg}}.QueryRow(ctx, {{.ConstantName}},
31-
append(opts, query.WithParameters(ydb.ParamsFromMap(map[string]any{ {{.Arg.YDBParamMapEntries}} })))...,
30+
row, err := {{$dbArg}}.QueryRow(ctx, {{.ConstantName}},
31+
append(opts, {{.Arg.YDBParamsBuilder}})...,
3232
)
3333
{{- end }}
3434
{{- if or (ne .Arg.Pair .Ret.Pair) (ne .Arg.DefineType .Ret.DefineType) }}
@@ -61,10 +61,10 @@ func (q *Queries) {{.MethodName}}(ctx context.Context, {{if $.EmitMethodsWithDBA
6161
func (q *Queries) {{.MethodName}}(ctx context.Context, {{if $.EmitMethodsWithDBArgument}}db DBTX, {{end}}{{if not .Arg.IsEmpty}}{{.Arg.Pair}}, {{end}}opts ...query.ExecuteOption) ([]{{.Ret.DefineType}}, error) {
6262
{{- $dbArg := "q.db" }}{{- if $.EmitMethodsWithDBArgument }}{{- $dbArg = "db" }}{{- end -}}
6363
{{- if .Arg.IsEmpty }}
64-
result, err := {{$dbArg}}.Query(ctx, {{.ConstantName}}, opts...)
64+
result, err := {{$dbArg}}.QueryResultSet(ctx, {{.ConstantName}}, opts...)
6565
{{- else }}
66-
result, err := {{$dbArg}}.Query(ctx, {{.ConstantName}},
67-
append(opts, query.WithParameters(ydb.ParamsFromMap(map[string]any{ {{.Arg.YDBParamMapEntries}} })))...,
66+
result, err := {{$dbArg}}.QueryResultSet(ctx, {{.ConstantName}},
67+
append(opts, {{.Arg.YDBParamsBuilder}})...,
6868
)
6969
{{- end }}
7070
if err != nil {
@@ -79,32 +79,23 @@ func (q *Queries) {{.MethodName}}(ctx context.Context, {{if $.EmitMethodsWithDBA
7979
{{else}}
8080
var items []{{.Ret.DefineType}}
8181
{{end -}}
82-
for set, err := range result.ResultSets(ctx) {
82+
for row, err := range result.Rows(ctx) {
8383
if err != nil {
8484
{{- if $.WrapErrors}}
8585
return nil, xerrors.WithStackTrace(fmt.Errorf("query {{.MethodName}}: %w", err))
8686
{{- else }}
8787
return nil, xerrors.WithStackTrace(err)
8888
{{- end }}
8989
}
90-
for row, err := range set.Rows(ctx) {
91-
if err != nil {
92-
{{- if $.WrapErrors}}
93-
return nil, xerrors.WithStackTrace(fmt.Errorf("query {{.MethodName}}: %w", err))
94-
{{- else }}
95-
return nil, xerrors.WithStackTrace(err)
96-
{{- end }}
97-
}
98-
var {{.Ret.Name}} {{.Ret.Type}}
99-
if err := row.Scan({{.Ret.Scan}}); err != nil {
100-
{{- if $.WrapErrors}}
101-
return nil, xerrors.WithStackTrace(fmt.Errorf("query {{.MethodName}}: %w", err))
102-
{{- else }}
103-
return nil, xerrors.WithStackTrace(err)
104-
{{- end }}
105-
}
106-
items = append(items, {{.Ret.ReturnName}})
107-
}
90+
var {{.Ret.Name}} {{.Ret.Type}}
91+
if err := row.Scan({{.Ret.Scan}}); err != nil {
92+
{{- if $.WrapErrors}}
93+
return nil, xerrors.WithStackTrace(fmt.Errorf("query {{.MethodName}}: %w", err))
94+
{{- else }}
95+
return nil, xerrors.WithStackTrace(err)
96+
{{- end }}
97+
}
98+
items = append(items, {{.Ret.ReturnName}})
10899
}
109100
if err := result.Close(ctx); err != nil {
110101
{{- if $.WrapErrors}}
@@ -125,8 +116,8 @@ func (q *Queries) {{.MethodName}}(ctx context.Context, {{if $.EmitMethodsWithDBA
125116
{{- if .Arg.IsEmpty }}
126117
err := {{$dbArg}}.Exec(ctx, {{.ConstantName}}, opts...)
127118
{{- else }}
128-
err := {{$dbArg}}.Exec(ctx, {{.ConstantName}},
129-
append(opts, query.WithParameters(ydb.ParamsFromMap(map[string]any{ {{.Arg.YDBParamMapEntries}} })))...,
119+
err := {{$dbArg}}.Exec(ctx, {{.ConstantName}},
120+
append(opts, {{.Arg.YDBParamsBuilder}})...,
130121
)
131122
{{- end }}
132123
if err != nil {

internal/codegen/golang/ydb_type.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,24 @@ func YDBType(req *plugin.GenerateRequest, options *opts.Options, col *plugin.Col
151151
// return "sql.NullInt64"
152152
return "*int64"
153153

154+
case "json", "jsondocument":
155+
if notNull {
156+
return "string"
157+
}
158+
if emitPointersForNull {
159+
return "*string"
160+
}
161+
return "*string"
162+
163+
case "date", "date32", "datetime", "timestamp", "tzdate", "tztimestamp", "tzdatetime":
164+
if notNull {
165+
return "time.Time"
166+
}
167+
if emitPointersForNull {
168+
return "*time.Time"
169+
}
170+
return "*time.Time"
171+
154172
case "null":
155173
// return "sql.Null"
156174
return "interface{}"

internal/engine/ydb/catalog_tests/create_table_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ func TestCreateTable(t *testing.T) {
106106
{
107107
Name: "amount",
108108
Type: ast.TypeName{
109-
Name: "Decimal",
109+
Name: "decimal",
110110
Names: &ast.List{
111111
Items: []ast.Node{
112112
&ast.Integer{Ival: 22},

internal/engine/ydb/convert.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1582,7 +1582,7 @@ func (c *cc) convertTypeName(n parser.IType_nameContext) *ast.TypeName {
15821582
if decimal := n.Type_name_decimal(); decimal != nil {
15831583
if integerOrBinds := decimal.AllInteger_or_bind(); len(integerOrBinds) >= 2 {
15841584
return &ast.TypeName{
1585-
Name: "Decimal",
1585+
Name: "decimal",
15861586
TypeOid: 0,
15871587
Names: &ast.List{
15881588
Items: []ast.Node{

0 commit comments

Comments
 (0)