Skip to content

Commit f6aa7c0

Browse files
committed
feat: optionally support unquoted identifiers
1 parent baadd6e commit f6aa7c0

File tree

8 files changed

+111
-47
lines changed

8 files changed

+111
-47
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
.vscode

oracle/common.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -448,19 +448,19 @@ func writeQuotedIdentifier(builder *strings.Builder, identifier string) {
448448
// - plsqlBuilder: The builder to write the PL/SQL code into.
449449
// - dbNames: The slice containing the column names.
450450
// - table: The table name
451-
func writeTableRecordCollectionDecl(plsqlBuilder *strings.Builder, dbNames []string, table string) {
451+
func writeTableRecordCollectionDecl(db *gorm.DB, plsqlBuilder *strings.Builder, dbNames []string, table string) {
452452
// Declare a record where each element has the same structure as a row from the given table
453453
plsqlBuilder.WriteString(" TYPE t_record IS RECORD (\n")
454454
for i, field := range dbNames {
455455
if i > 0 {
456456
plsqlBuilder.WriteString(",\n")
457457
}
458458
plsqlBuilder.WriteString(" ")
459-
writeQuotedIdentifier(plsqlBuilder, field)
459+
db.QuoteTo(plsqlBuilder, field)
460460
plsqlBuilder.WriteString(" ")
461-
writeQuotedIdentifier(plsqlBuilder, table)
461+
db.QuoteTo(plsqlBuilder, table)
462462
plsqlBuilder.WriteString(".")
463-
writeQuotedIdentifier(plsqlBuilder, field)
463+
db.QuoteTo(plsqlBuilder, field)
464464
plsqlBuilder.WriteString("%TYPE")
465465
}
466466
plsqlBuilder.WriteString("\n")

oracle/create.go

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ func buildBulkMergePLSQL(db *gorm.DB, createValues clause.Values, onConflictClau
287287

288288
// Start PL/SQL block
289289
plsqlBuilder.WriteString("DECLARE\n")
290-
writeTableRecordCollectionDecl(&plsqlBuilder, stmt.Schema.DBNames, stmt.Table)
290+
writeTableRecordCollectionDecl(db, &plsqlBuilder, stmt.Schema.DBNames, stmt.Table)
291291
plsqlBuilder.WriteString(" l_affected_records t_records;\n")
292292

293293
// Create array types and variables for each column
@@ -321,7 +321,7 @@ func buildBulkMergePLSQL(db *gorm.DB, createValues clause.Values, onConflictClau
321321
// FORALL with MERGE and RETURNING BULK COLLECT INTO
322322
plsqlBuilder.WriteString(fmt.Sprintf(" FORALL i IN 1..%d\n", len(createValues.Values)))
323323
plsqlBuilder.WriteString(" MERGE INTO ")
324-
writeQuotedIdentifier(&plsqlBuilder, stmt.Table)
324+
db.QuoteTo(&plsqlBuilder, stmt.Table)
325325
plsqlBuilder.WriteString(" t\n")
326326
// Build USING clause
327327
plsqlBuilder.WriteString(" USING (SELECT ")
@@ -330,7 +330,7 @@ func buildBulkMergePLSQL(db *gorm.DB, createValues clause.Values, onConflictClau
330330
plsqlBuilder.WriteString(", ")
331331
}
332332
plsqlBuilder.WriteString(fmt.Sprintf("l_col_%d_array(i) AS ", idx))
333-
writeQuotedIdentifier(&plsqlBuilder, column.Name)
333+
db.QuoteTo(&plsqlBuilder, column.Name)
334334
}
335335
plsqlBuilder.WriteString(" FROM DUAL) s\n")
336336

@@ -341,9 +341,9 @@ func buildBulkMergePLSQL(db *gorm.DB, createValues clause.Values, onConflictClau
341341
plsqlBuilder.WriteString(" AND ")
342342
}
343343
plsqlBuilder.WriteString("t.")
344-
writeQuotedIdentifier(&plsqlBuilder, conflictCol.Name)
344+
db.QuoteTo(&plsqlBuilder, conflictCol.Name)
345345
plsqlBuilder.WriteString(" = s.")
346-
writeQuotedIdentifier(&plsqlBuilder, conflictCol.Name)
346+
db.QuoteTo(&plsqlBuilder, conflictCol.Name)
347347
}
348348
plsqlBuilder.WriteString(")\n")
349349

@@ -368,9 +368,9 @@ func buildBulkMergePLSQL(db *gorm.DB, createValues clause.Values, onConflictClau
368368
plsqlBuilder.WriteString(", ")
369369
}
370370
plsqlBuilder.WriteString("t.")
371-
writeQuotedIdentifier(&plsqlBuilder, column.Name)
371+
db.QuoteTo(&plsqlBuilder, column.Name)
372372
plsqlBuilder.WriteString(" = s.")
373-
writeQuotedIdentifier(&plsqlBuilder, column.Name)
373+
db.QuoteTo(&plsqlBuilder, column.Name)
374374
updateCount++
375375
}
376376
}
@@ -402,9 +402,9 @@ func buildBulkMergePLSQL(db *gorm.DB, createValues clause.Values, onConflictClau
402402
plsqlBuilder.WriteString(", ")
403403
}
404404
plsqlBuilder.WriteString("t.")
405-
writeQuotedIdentifier(&plsqlBuilder, column.Name)
405+
db.QuoteTo(&plsqlBuilder, column.Name)
406406
plsqlBuilder.WriteString(" = s.")
407-
writeQuotedIdentifier(&plsqlBuilder, column.Name)
407+
db.QuoteTo(&plsqlBuilder, column.Name)
408408
updateCount++
409409
}
410410
}
@@ -424,9 +424,9 @@ func buildBulkMergePLSQL(db *gorm.DB, createValues clause.Values, onConflictClau
424424
}
425425
}
426426
plsqlBuilder.WriteString(" WHEN MATCHED THEN UPDATE SET t.")
427-
writeQuotedIdentifier(&plsqlBuilder, noopCol)
427+
db.QuoteTo(&plsqlBuilder, noopCol)
428428
plsqlBuilder.WriteString(" = t.")
429-
writeQuotedIdentifier(&plsqlBuilder, noopCol)
429+
db.QuoteTo(&plsqlBuilder, noopCol)
430430
plsqlBuilder.WriteString("\n")
431431
}
432432

@@ -441,7 +441,7 @@ func buildBulkMergePLSQL(db *gorm.DB, createValues clause.Values, onConflictClau
441441
if insertCount > 0 {
442442
plsqlBuilder.WriteString(", ")
443443
}
444-
writeQuotedIdentifier(&plsqlBuilder, column.Name)
444+
db.QuoteTo(&plsqlBuilder, column.Name)
445445
insertCount++
446446
}
447447
}
@@ -456,7 +456,7 @@ func buildBulkMergePLSQL(db *gorm.DB, createValues clause.Values, onConflictClau
456456
plsqlBuilder.WriteString(", ")
457457
}
458458
plsqlBuilder.WriteString("s.")
459-
writeQuotedIdentifier(&plsqlBuilder, column.Name)
459+
db.QuoteTo(&plsqlBuilder, column.Name)
460460
insertCount++
461461
}
462462
}
@@ -472,7 +472,7 @@ func buildBulkMergePLSQL(db *gorm.DB, createValues clause.Values, onConflictClau
472472
if insertCount > 0 {
473473
plsqlBuilder.WriteString(", ")
474474
}
475-
writeQuotedIdentifier(&plsqlBuilder, column.Name)
475+
db.QuoteTo(&plsqlBuilder, column.Name)
476476
insertCount++
477477
}
478478
}
@@ -486,7 +486,7 @@ func buildBulkMergePLSQL(db *gorm.DB, createValues clause.Values, onConflictClau
486486
plsqlBuilder.WriteString(", ")
487487
}
488488
plsqlBuilder.WriteString("s.")
489-
writeQuotedIdentifier(&plsqlBuilder, column.Name)
489+
db.QuoteTo(&plsqlBuilder, column.Name)
490490
insertCount++
491491
}
492492
}
@@ -500,7 +500,7 @@ func buildBulkMergePLSQL(db *gorm.DB, createValues clause.Values, onConflictClau
500500
if i > 0 {
501501
plsqlBuilder.WriteString(", ")
502502
}
503-
writeQuotedIdentifier(&plsqlBuilder, column)
503+
db.QuoteTo(&plsqlBuilder, column)
504504
}
505505
plsqlBuilder.WriteString("\n BULK COLLECT INTO l_affected_records;\n")
506506

@@ -511,7 +511,7 @@ func buildBulkMergePLSQL(db *gorm.DB, createValues clause.Values, onConflictClau
511511
if field := findFieldByDBName(schema, column); field != nil {
512512
stmt.Vars = append(stmt.Vars, sql.Out{Dest: createTypedDestination(field)})
513513
plsqlBuilder.WriteString(fmt.Sprintf(" IF l_affected_records.COUNT > %d THEN :%d := l_affected_records(%d).", rowIdx, outParamIndex+1, rowIdx+1))
514-
writeQuotedIdentifier(&plsqlBuilder, column)
514+
db.QuoteTo(&plsqlBuilder, column)
515515
plsqlBuilder.WriteString("; END IF;\n")
516516
outParamIndex++
517517
}
@@ -545,7 +545,7 @@ func buildBulkInsertOnlyPLSQL(db *gorm.DB, createValues clause.Values) {
545545

546546
// Start PL/SQL block
547547
plsqlBuilder.WriteString("DECLARE\n")
548-
writeTableRecordCollectionDecl(&plsqlBuilder, stmt.Schema.DBNames, stmt.Table)
548+
writeTableRecordCollectionDecl(db, &plsqlBuilder, stmt.Schema.DBNames, stmt.Table)
549549
plsqlBuilder.WriteString(" l_inserted_records t_records;\n")
550550

551551
// Create array types and variables for each column
@@ -579,14 +579,14 @@ func buildBulkInsertOnlyPLSQL(db *gorm.DB, createValues clause.Values) {
579579
// FORALL with RETURNING BULK COLLECT INTO
580580
plsqlBuilder.WriteString(fmt.Sprintf(" FORALL i IN 1..%d\n", len(createValues.Values)))
581581
plsqlBuilder.WriteString(" INSERT INTO ")
582-
writeQuotedIdentifier(&plsqlBuilder, stmt.Table)
582+
db.QuoteTo(&plsqlBuilder, stmt.Table)
583583
plsqlBuilder.WriteString(" (")
584584
// Add column names
585585
for i, column := range createValues.Columns {
586586
if i > 0 {
587587
plsqlBuilder.WriteString(", ")
588588
}
589-
writeQuotedIdentifier(&plsqlBuilder, column.Name)
589+
db.QuoteTo(&plsqlBuilder, column.Name)
590590
}
591591
plsqlBuilder.WriteString(") VALUES (")
592592

@@ -606,7 +606,7 @@ func buildBulkInsertOnlyPLSQL(db *gorm.DB, createValues clause.Values) {
606606
if i > 0 {
607607
plsqlBuilder.WriteString(", ")
608608
}
609-
writeQuotedIdentifier(&plsqlBuilder, column)
609+
db.QuoteTo(&plsqlBuilder, column)
610610
}
611611
plsqlBuilder.WriteString("\n BULK COLLECT INTO l_inserted_records;\n")
612612

@@ -615,7 +615,7 @@ func buildBulkInsertOnlyPLSQL(db *gorm.DB, createValues clause.Values) {
615615
for rowIdx := 0; rowIdx < len(createValues.Values); rowIdx++ {
616616
for _, column := range allColumns {
617617
var columnBuilder strings.Builder
618-
writeQuotedIdentifier(&columnBuilder, column)
618+
db.QuoteTo(&columnBuilder, column)
619619
quotedColumn := columnBuilder.String()
620620

621621
if field := findFieldByDBName(schema, column); field != nil {

oracle/delete.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -255,13 +255,13 @@ func buildBulkDeletePLSQL(db *gorm.DB) {
255255

256256
// Start PL/SQL block
257257
plsqlBuilder.WriteString("DECLARE\n")
258-
writeTableRecordCollectionDecl(&plsqlBuilder, stmt.Schema.DBNames, stmt.Table)
258+
writeTableRecordCollectionDecl(db, &plsqlBuilder, stmt.Schema.DBNames, stmt.Table)
259259
plsqlBuilder.WriteString(" l_deleted_records t_records;\n")
260260
plsqlBuilder.WriteString("BEGIN\n")
261261

262262
// Build DELETE statement
263263
plsqlBuilder.WriteString(" DELETE FROM ")
264-
writeQuotedIdentifier(&plsqlBuilder, stmt.Table)
264+
db.QuoteTo(&plsqlBuilder, stmt.Table)
265265

266266
// Add WHERE clause if it exists
267267
if whereClause, hasWhere := stmt.Clauses["WHERE"]; hasWhere {
@@ -278,7 +278,7 @@ func buildBulkDeletePLSQL(db *gorm.DB) {
278278
if i > 0 {
279279
plsqlBuilder.WriteString(", ")
280280
}
281-
writeQuotedIdentifier(&plsqlBuilder, column)
281+
db.QuoteTo(&plsqlBuilder, column)
282282

283283
}
284284
plsqlBuilder.WriteString("\n BULK COLLECT INTO l_deleted_records;\n")
@@ -297,7 +297,7 @@ func buildBulkDeletePLSQL(db *gorm.DB) {
297297

298298
plsqlBuilder.WriteString(fmt.Sprintf(" IF l_deleted_records.COUNT > %d THEN\n", rowIdx))
299299
plsqlBuilder.WriteString(fmt.Sprintf(" :%d := l_deleted_records(%d).", outParamIndex+1, rowIdx+1))
300-
writeQuotedIdentifier(&plsqlBuilder, column)
300+
db.QuoteTo(&plsqlBuilder, column)
301301
plsqlBuilder.WriteString(";\n")
302302
plsqlBuilder.WriteString(" END IF;\n")
303303
outParamIndex++
@@ -324,9 +324,9 @@ func buildWhereClause(db *gorm.DB, plsqlBuilder *strings.Builder, expressions []
324324
case clause.Eq:
325325
// Write the column name
326326
if columnName, ok := e.Column.(string); ok {
327-
writeQuotedIdentifier(plsqlBuilder, columnName)
327+
db.QuoteTo(plsqlBuilder, columnName)
328328
} else if columnExpr, ok := e.Column.(clause.Column); ok {
329-
writeQuotedIdentifier(plsqlBuilder, columnExpr.Name)
329+
db.QuoteTo(plsqlBuilder, columnExpr.Name)
330330
} else {
331331
plsqlBuilder.WriteString(fmt.Sprintf("%v", e.Column))
332332
}
@@ -342,9 +342,9 @@ func buildWhereClause(db *gorm.DB, plsqlBuilder *strings.Builder, expressions []
342342

343343
case clause.IN:
344344
if columnName, ok := e.Column.(string); ok {
345-
writeQuotedIdentifier(plsqlBuilder, columnName)
345+
db.QuoteTo(plsqlBuilder, columnName)
346346
} else if columnExpr, ok := e.Column.(clause.Column); ok {
347-
writeQuotedIdentifier(plsqlBuilder, columnExpr.Name)
347+
db.QuoteTo(plsqlBuilder, columnExpr.Name)
348348
} else {
349349
plsqlBuilder.WriteString(fmt.Sprintf("%v", e.Column))
350350
}

oracle/oracle.go

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,11 @@ import (
6262
)
6363

6464
type Config struct {
65-
DriverName string
66-
DataSourceName string
67-
Conn *sql.DB
68-
DefaultStringSize uint
65+
DriverName string
66+
DataSourceName string
67+
Conn *sql.DB
68+
DefaultStringSize uint
69+
SkipQuoteIdentifiers bool
6970
}
7071

7172
type Dialector struct {
@@ -237,9 +238,13 @@ func (d Dialector) BindVarTo(writer clause.Writer, stmt *gorm.Statement, v inter
237238

238239
// Manages quoting of identifiers
239240
func (d Dialector) QuoteTo(writer clause.Writer, str string) {
240-
var builder strings.Builder
241-
writeQuotedIdentifier(&builder, str)
242-
writer.WriteString(builder.String())
241+
out := str
242+
if !d.SkipQuoteIdentifiers {
243+
var builder strings.Builder
244+
writeQuotedIdentifier(&builder, str)
245+
out = builder.String()
246+
}
247+
_, _ = writer.WriteString(out)
243248
}
244249

245250
var numericPlaceholder = regexp.MustCompile(`:(\d+)`)

oracle/update.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -476,21 +476,21 @@ func buildUpdatePLSQL(db *gorm.DB) {
476476

477477
// Start PL/SQL block
478478
plsqlBuilder.WriteString("DECLARE\n")
479-
writeTableRecordCollectionDecl(&plsqlBuilder, stmt.Schema.DBNames, stmt.Table)
479+
writeTableRecordCollectionDecl(db, &plsqlBuilder, stmt.Schema.DBNames, stmt.Table)
480480
plsqlBuilder.WriteString(" l_updated_records t_records;\n")
481481
plsqlBuilder.WriteString("BEGIN\n")
482482

483483
// Build UPDATE statement
484484
plsqlBuilder.WriteString(" UPDATE ")
485-
writeQuotedIdentifier(&plsqlBuilder, stmt.Table)
485+
db.QuoteTo(&plsqlBuilder, stmt.Table)
486486
plsqlBuilder.WriteString(" SET ")
487487

488488
// Add SET assignments - handle both regular values and expressions
489489
for i, assignment := range set {
490490
if i > 0 {
491491
plsqlBuilder.WriteString(", ")
492492
}
493-
writeQuotedIdentifier(&plsqlBuilder, assignment.Column.Name)
493+
db.QuoteTo(&plsqlBuilder, assignment.Column.Name)
494494
plsqlBuilder.WriteString(" = ")
495495

496496
// Check if the value is a clause.Expr (like gorm.Expr)
@@ -528,7 +528,7 @@ func buildUpdatePLSQL(db *gorm.DB) {
528528
if i > 0 {
529529
plsqlBuilder.WriteString(", ")
530530
}
531-
writeQuotedIdentifier(&plsqlBuilder, column)
531+
db.QuoteTo(&plsqlBuilder, column)
532532
}
533533
plsqlBuilder.WriteString("\n BULK COLLECT INTO l_updated_records;\n")
534534

@@ -559,7 +559,7 @@ func buildUpdatePLSQL(db *gorm.DB) {
559559
// Add the assignment to PL/SQL with correct parameter reference
560560
plsqlBuilder.WriteString(fmt.Sprintf(" IF l_updated_records.COUNT > %d THEN\n", rowIdx))
561561
plsqlBuilder.WriteString(fmt.Sprintf(" :%d := l_updated_records(%d).", paramIndex, rowIdx+1))
562-
writeQuotedIdentifier(&plsqlBuilder, column)
562+
db.QuoteTo(&plsqlBuilder, column)
563563
plsqlBuilder.WriteString(";\n")
564564
plsqlBuilder.WriteString(" END IF;\n")
565565
}

tests/.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
go.sum
1+
passed-tests.txt.new

tests/go.sum

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
github.com/UNO-SOFT/zlog v0.8.1 h1:TEFkGJHtUfTRgMkLZiAjLSHALjwSBdw6/zByMC5GJt4=
2+
github.com/UNO-SOFT/zlog v0.8.1/go.mod h1:yqFOjn3OhvJ4j7ArJqQNA+9V+u6t9zSAyIZdWdMweWc=
3+
github.com/VictoriaMetrics/easyproto v0.1.4 h1:r8cNvo8o6sR4QShBXQd1bKw/VVLSQma/V2KhTBPf+Sc=
4+
github.com/VictoriaMetrics/easyproto v0.1.4/go.mod h1:QlGlzaJnDfFd8Lk6Ci/fuLxfTo3/GThPs2KH23mv710=
5+
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
6+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
7+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
8+
github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4=
9+
github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
10+
github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=
11+
github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
12+
github.com/godror/godror v0.49.0 h1:oXAzPOm7bAGdFGkTaePCRXv3dfyr6Agni++4XhaRcC8=
13+
github.com/godror/godror v0.49.0/go.mod h1:D4gKled+sJVcagT1HWibkBsO9PcLn2Nu96FCr1RtnzI=
14+
github.com/godror/knownpb v0.3.0 h1:+caUdy8hTtl7X05aPl3tdL540TvCcaQA6woZQroLZMw=
15+
github.com/godror/knownpb v0.3.0/go.mod h1:PpTyfJwiOEAzQl7NtVCM8kdPCnp3uhxsZYIzZ5PV4zU=
16+
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
17+
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
18+
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
19+
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
20+
github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
21+
github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
22+
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
23+
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
24+
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
25+
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
26+
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
27+
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
28+
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
29+
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
30+
github.com/oklog/ulid/v2 v2.0.2 h1:r4fFzBm+bv0wNKNh5eXTwU7i85y5x+uwkxCUTNVQqLc=
31+
github.com/oklog/ulid/v2 v2.0.2/go.mod h1:mtBL0Qe/0HAx6/a4Z30qxVIAL1eQDweXq5lxOEiwQ68=
32+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
33+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
34+
github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k=
35+
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
36+
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
37+
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
38+
golang.org/x/exp v0.0.0-20250531010427-b6e5de432a8b h1:QoALfVG9rhQ/M7vYDScfPdWjGL9dlsVVM5VGh7aKoAA=
39+
golang.org/x/exp v0.0.0-20250531010427-b6e5de432a8b/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=
40+
golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=
41+
golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
42+
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
43+
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
44+
golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q=
45+
golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
46+
golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4=
47+
golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA=
48+
google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
49+
google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
50+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
51+
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
52+
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
53+
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
54+
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
55+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
56+
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
57+
gorm.io/gorm v1.30.0 h1:qbT5aPv1UH8gI99OsRlvDToLxW5zR7FzS9acZDOZcgs=
58+
gorm.io/gorm v1.30.0/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE=

0 commit comments

Comments
 (0)