Skip to content

Commit 107e3e5

Browse files
Merge branch 'main' into json-support
2 parents 49eaeb0 + 2797081 commit 107e3e5

File tree

10 files changed

+200
-47
lines changed

10 files changed

+200
-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
@@ -478,19 +478,19 @@ func QuoteIdentifier(identifier string) string {
478478
// - plsqlBuilder: The builder to write the PL/SQL code into.
479479
// - dbNames: The slice containing the column names.
480480
// - table: The table name
481-
func writeTableRecordCollectionDecl(plsqlBuilder *strings.Builder, dbNames []string, table string) {
481+
func writeTableRecordCollectionDecl(db *gorm.DB, plsqlBuilder *strings.Builder, dbNames []string, table string) {
482482
// Declare a record where each element has the same structure as a row from the given table
483483
plsqlBuilder.WriteString(" TYPE t_record IS RECORD (\n")
484484
for i, field := range dbNames {
485485
if i > 0 {
486486
plsqlBuilder.WriteString(",\n")
487487
}
488488
plsqlBuilder.WriteString(" ")
489-
writeQuotedIdentifier(plsqlBuilder, field)
489+
db.QuoteTo(plsqlBuilder, field)
490490
plsqlBuilder.WriteString(" ")
491-
writeQuotedIdentifier(plsqlBuilder, table)
491+
db.QuoteTo(plsqlBuilder, table)
492492
plsqlBuilder.WriteString(".")
493-
writeQuotedIdentifier(plsqlBuilder, field)
493+
db.QuoteTo(plsqlBuilder, field)
494494
plsqlBuilder.WriteString("%TYPE")
495495
}
496496
plsqlBuilder.WriteString("\n")

oracle/create.go

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

290290
// Start PL/SQL block
291291
plsqlBuilder.WriteString("DECLARE\n")
292-
writeTableRecordCollectionDecl(&plsqlBuilder, stmt.Schema.DBNames, stmt.Table)
292+
writeTableRecordCollectionDecl(db, &plsqlBuilder, stmt.Schema.DBNames, stmt.Table)
293293
plsqlBuilder.WriteString(" l_affected_records t_records;\n")
294294

295295
// Create array types and variables for each column
@@ -323,7 +323,7 @@ func buildBulkMergePLSQL(db *gorm.DB, createValues clause.Values, onConflictClau
323323
// FORALL with MERGE and RETURNING BULK COLLECT INTO
324324
plsqlBuilder.WriteString(fmt.Sprintf(" FORALL i IN 1..%d\n", len(createValues.Values)))
325325
plsqlBuilder.WriteString(" MERGE INTO ")
326-
writeQuotedIdentifier(&plsqlBuilder, stmt.Table)
326+
db.QuoteTo(&plsqlBuilder, stmt.Table)
327327
plsqlBuilder.WriteString(" t\n")
328328
// Build USING clause
329329
plsqlBuilder.WriteString(" USING (SELECT ")
@@ -332,7 +332,7 @@ func buildBulkMergePLSQL(db *gorm.DB, createValues clause.Values, onConflictClau
332332
plsqlBuilder.WriteString(", ")
333333
}
334334
plsqlBuilder.WriteString(fmt.Sprintf("l_col_%d_array(i) AS ", idx))
335-
writeQuotedIdentifier(&plsqlBuilder, column.Name)
335+
db.QuoteTo(&plsqlBuilder, column.Name)
336336
}
337337
plsqlBuilder.WriteString(" FROM DUAL) s\n")
338338

@@ -344,9 +344,9 @@ func buildBulkMergePLSQL(db *gorm.DB, createValues clause.Values, onConflictClau
344344
plsqlBuilder.WriteString(" AND ")
345345
}
346346
plsqlBuilder.WriteString("t.")
347-
writeQuotedIdentifier(&plsqlBuilder, conflictCol.Name)
347+
db.QuoteTo(&plsqlBuilder, conflictCol.Name)
348348
plsqlBuilder.WriteString(" = s.")
349-
writeQuotedIdentifier(&plsqlBuilder, conflictCol.Name)
349+
db.QuoteTo(&plsqlBuilder, conflictCol.Name)
350350
}
351351
plsqlBuilder.WriteString(")\n")
352352

@@ -371,9 +371,9 @@ func buildBulkMergePLSQL(db *gorm.DB, createValues clause.Values, onConflictClau
371371
plsqlBuilder.WriteString(", ")
372372
}
373373
plsqlBuilder.WriteString("t.")
374-
writeQuotedIdentifier(&plsqlBuilder, column.Name)
374+
db.QuoteTo(&plsqlBuilder, column.Name)
375375
plsqlBuilder.WriteString(" = s.")
376-
writeQuotedIdentifier(&plsqlBuilder, column.Name)
376+
db.QuoteTo(&plsqlBuilder, column.Name)
377377
updateCount++
378378
}
379379
}
@@ -405,9 +405,9 @@ func buildBulkMergePLSQL(db *gorm.DB, createValues clause.Values, onConflictClau
405405
plsqlBuilder.WriteString(", ")
406406
}
407407
plsqlBuilder.WriteString("t.")
408-
writeQuotedIdentifier(&plsqlBuilder, column.Name)
408+
db.QuoteTo(&plsqlBuilder, column.Name)
409409
plsqlBuilder.WriteString(" = s.")
410-
writeQuotedIdentifier(&plsqlBuilder, column.Name)
410+
db.QuoteTo(&plsqlBuilder, column.Name)
411411
updateCount++
412412
}
413413
}
@@ -427,9 +427,9 @@ func buildBulkMergePLSQL(db *gorm.DB, createValues clause.Values, onConflictClau
427427
}
428428
}
429429
plsqlBuilder.WriteString(" WHEN MATCHED THEN UPDATE SET t.")
430-
writeQuotedIdentifier(&plsqlBuilder, noopCol)
431-
plsqlBuilder.WriteString(" = s.")
432-
writeQuotedIdentifier(&plsqlBuilder, noopCol)
430+
db.QuoteTo(&plsqlBuilder, noopCol)
431+
plsqlBuilder.WriteString(" = t.")
432+
db.QuoteTo(&plsqlBuilder, noopCol)
433433
plsqlBuilder.WriteString("\n")
434434
}
435435

@@ -444,7 +444,7 @@ func buildBulkMergePLSQL(db *gorm.DB, createValues clause.Values, onConflictClau
444444
if insertCount > 0 {
445445
plsqlBuilder.WriteString(", ")
446446
}
447-
writeQuotedIdentifier(&plsqlBuilder, column.Name)
447+
db.QuoteTo(&plsqlBuilder, column.Name)
448448
insertCount++
449449
}
450450
}
@@ -459,7 +459,7 @@ func buildBulkMergePLSQL(db *gorm.DB, createValues clause.Values, onConflictClau
459459
plsqlBuilder.WriteString(", ")
460460
}
461461
plsqlBuilder.WriteString("s.")
462-
writeQuotedIdentifier(&plsqlBuilder, column.Name)
462+
db.QuoteTo(&plsqlBuilder, column.Name)
463463
insertCount++
464464
}
465465
}
@@ -475,7 +475,7 @@ func buildBulkMergePLSQL(db *gorm.DB, createValues clause.Values, onConflictClau
475475
if insertCount > 0 {
476476
plsqlBuilder.WriteString(", ")
477477
}
478-
writeQuotedIdentifier(&plsqlBuilder, column.Name)
478+
db.QuoteTo(&plsqlBuilder, column.Name)
479479
insertCount++
480480
}
481481
}
@@ -489,7 +489,7 @@ func buildBulkMergePLSQL(db *gorm.DB, createValues clause.Values, onConflictClau
489489
plsqlBuilder.WriteString(", ")
490490
}
491491
plsqlBuilder.WriteString("s.")
492-
writeQuotedIdentifier(&plsqlBuilder, column.Name)
492+
db.QuoteTo(&plsqlBuilder, column.Name)
493493
insertCount++
494494
}
495495
}
@@ -503,7 +503,7 @@ func buildBulkMergePLSQL(db *gorm.DB, createValues clause.Values, onConflictClau
503503
if i > 0 {
504504
plsqlBuilder.WriteString(", ")
505505
}
506-
writeQuotedIdentifier(&plsqlBuilder, column)
506+
db.QuoteTo(&plsqlBuilder, column)
507507
}
508508
plsqlBuilder.WriteString("\n BULK COLLECT INTO l_affected_records;\n")
509509

@@ -556,7 +556,7 @@ func buildBulkInsertOnlyPLSQL(db *gorm.DB, createValues clause.Values) {
556556

557557
// Start PL/SQL block
558558
plsqlBuilder.WriteString("DECLARE\n")
559-
writeTableRecordCollectionDecl(&plsqlBuilder, stmt.Schema.DBNames, stmt.Table)
559+
writeTableRecordCollectionDecl(db, &plsqlBuilder, stmt.Schema.DBNames, stmt.Table)
560560
plsqlBuilder.WriteString(" l_inserted_records t_records;\n")
561561

562562
// Create array types and variables for each column
@@ -590,14 +590,14 @@ func buildBulkInsertOnlyPLSQL(db *gorm.DB, createValues clause.Values) {
590590
// FORALL with RETURNING BULK COLLECT INTO
591591
plsqlBuilder.WriteString(fmt.Sprintf(" FORALL i IN 1..%d\n", len(createValues.Values)))
592592
plsqlBuilder.WriteString(" INSERT INTO ")
593-
writeQuotedIdentifier(&plsqlBuilder, stmt.Table)
593+
db.QuoteTo(&plsqlBuilder, stmt.Table)
594594
plsqlBuilder.WriteString(" (")
595595
// Add column names
596596
for i, column := range createValues.Columns {
597597
if i > 0 {
598598
plsqlBuilder.WriteString(", ")
599599
}
600-
writeQuotedIdentifier(&plsqlBuilder, column.Name)
600+
db.QuoteTo(&plsqlBuilder, column.Name)
601601
}
602602
plsqlBuilder.WriteString(") VALUES (")
603603

@@ -617,7 +617,7 @@ func buildBulkInsertOnlyPLSQL(db *gorm.DB, createValues clause.Values) {
617617
if i > 0 {
618618
plsqlBuilder.WriteString(", ")
619619
}
620-
writeQuotedIdentifier(&plsqlBuilder, column)
620+
db.QuoteTo(&plsqlBuilder, column)
621621
}
622622
plsqlBuilder.WriteString("\n BULK COLLECT INTO l_inserted_records;\n")
623623

@@ -626,7 +626,7 @@ func buildBulkInsertOnlyPLSQL(db *gorm.DB, createValues clause.Values) {
626626
for rowIdx := 0; rowIdx < len(createValues.Values); rowIdx++ {
627627
for _, column := range allColumns {
628628
var columnBuilder strings.Builder
629-
writeQuotedIdentifier(&columnBuilder, column)
629+
db.QuoteTo(&columnBuilder, column)
630630
quotedColumn := columnBuilder.String()
631631

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

oracle/delete.go

Lines changed: 7 additions & 7 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")
@@ -334,9 +334,9 @@ func buildWhereClause(db *gorm.DB, plsqlBuilder *strings.Builder, expressions []
334334
case clause.Eq:
335335
// Write the column name
336336
if columnName, ok := e.Column.(string); ok {
337-
writeQuotedIdentifier(plsqlBuilder, columnName)
337+
db.QuoteTo(plsqlBuilder, columnName)
338338
} else if columnExpr, ok := e.Column.(clause.Column); ok {
339-
writeQuotedIdentifier(plsqlBuilder, columnExpr.Name)
339+
db.QuoteTo(plsqlBuilder, columnExpr.Name)
340340
} else {
341341
plsqlBuilder.WriteString(fmt.Sprintf("%v", e.Column))
342342
}
@@ -352,9 +352,9 @@ func buildWhereClause(db *gorm.DB, plsqlBuilder *strings.Builder, expressions []
352352

353353
case clause.IN:
354354
if columnName, ok := e.Column.(string); ok {
355-
writeQuotedIdentifier(plsqlBuilder, columnName)
355+
db.QuoteTo(plsqlBuilder, columnName)
356356
} else if columnExpr, ok := e.Column.(clause.Column); ok {
357-
writeQuotedIdentifier(plsqlBuilder, columnExpr.Name)
357+
db.QuoteTo(plsqlBuilder, columnExpr.Name)
358358
} else {
359359
plsqlBuilder.WriteString(fmt.Sprintf("%v", e.Column))
360360
}

oracle/oracle.go

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,14 @@ import (
6161
_ "github.com/godror/godror"
6262
)
6363

64+
const DefaultDriverName string = "godror"
65+
6466
type Config struct {
65-
DriverName string
66-
DataSourceName string
67-
Conn *sql.DB
68-
DefaultStringSize uint
67+
DriverName string
68+
DataSourceName string
69+
Conn *sql.DB
70+
DefaultStringSize uint
71+
SkipQuoteIdentifiers bool
6972
}
7073

7174
type Dialector struct {
@@ -79,7 +82,7 @@ func (d Dialector) Name() string {
7982

8083
// Open creates a new godror Dialector with the given DSN
8184
func Open(dsn string) gorm.Dialector {
82-
return &Dialector{Config: &Config{DriverName: "godror", DataSourceName: dsn}}
85+
return &Dialector{Config: &Config{DataSourceName: dsn}}
8386
}
8487

8588
// New creates a new Dialector with the given config
@@ -89,6 +92,10 @@ func New(config Config) gorm.Dialector {
8992

9093
// Initializes the database connection
9194
func (d Dialector) Initialize(db *gorm.DB) (err error) {
95+
if d.DriverName == "" {
96+
d.DriverName = DefaultDriverName
97+
}
98+
9299
d.DefaultStringSize = 4000
93100

94101
config := &callbacks.Config{
@@ -237,9 +244,13 @@ func (d Dialector) BindVarTo(writer clause.Writer, stmt *gorm.Statement, v inter
237244

238245
// Manages quoting of identifiers
239246
func (d Dialector) QuoteTo(writer clause.Writer, str string) {
240-
var builder strings.Builder
241-
writeQuotedIdentifier(&builder, str)
242-
writer.WriteString(builder.String())
247+
out := str
248+
if !d.SkipQuoteIdentifiers {
249+
var builder strings.Builder
250+
writeQuotedIdentifier(&builder, str)
251+
out = builder.String()
252+
}
253+
_, _ = writer.WriteString(out)
243254
}
244255

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

oracle/update.go

Lines changed: 4 additions & 4 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

tests/.gitignore

Lines changed: 0 additions & 1 deletion
This file was deleted.

0 commit comments

Comments
 (0)