Skip to content

Commit adcc2b1

Browse files
committed
Merge remote-tracking branch 'origin' into update_belongs_to_test
2 parents b293aa1 + b8d78f4 commit adcc2b1

13 files changed

+580
-215
lines changed

.github/workflows/run-tests.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,4 @@ jobs:
4747
cd tests
4848
go get -t github.com/oracle-samples/gorm-oracle/tests
4949
go get .
50-
go test -failfast
50+
go test -failfast

oracle/migrator.go

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -308,15 +308,47 @@ func (m Migrator) DropColumn(value interface{}, name string) error {
308308
func (m Migrator) AlterColumn(value interface{}, field string) error {
309309
return m.RunWithValue(value, func(stmt *gorm.Statement) error {
310310
if stmt.Schema != nil {
311-
if field := stmt.Schema.LookUpField(field); field != nil {
312-
fileType := m.FullDataTypeOf(field)
311+
if f := stmt.Schema.LookUpField(field); f != nil {
312+
columnTypes, err := m.ColumnTypes(value)
313+
if err != nil {
314+
return err
315+
}
316+
317+
var currentNullable bool
318+
var currentType string
319+
for _, col := range columnTypes {
320+
if strings.EqualFold(col.Name(), f.DBName) {
321+
currentNullable, _ = col.Nullable()
322+
currentType = strings.ToUpper(col.DatabaseTypeName())
323+
break
324+
}
325+
}
326+
327+
desiredNullable := !f.NotNull
328+
desiredType := strings.ToUpper(m.DataTypeOf(f))
329+
330+
// nullable → non-nullable → skip
331+
if currentNullable && !desiredNullable {
332+
return nil
333+
}
334+
335+
// same type + same nullability → skip
336+
if currentNullable == desiredNullable && strings.Contains(currentType, desiredType) {
337+
return nil
338+
}
339+
340+
sql := "ALTER TABLE ? MODIFY ? " + m.DataTypeOf(f)
341+
if f.NotNull {
342+
sql += " NOT NULL"
343+
} else if !currentNullable && desiredNullable {
344+
sql += " NULL"
345+
}
346+
313347
return m.DB.Exec(
314-
"ALTER TABLE ? MODIFY ? ?",
348+
sql,
315349
clause.Table{Name: stmt.Schema.Table},
316-
clause.Column{Name: field.DBName},
317-
fileType,
350+
clause.Column{Name: f.DBName},
318351
).Error
319-
320352
}
321353
}
322354
return fmt.Errorf("failed to look up field with name: %s", field)

tests/create_test.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,6 @@ func TestCreateFromMap(t *testing.T) {
181181
}
182182

183183
func TestCreateWithAssociations(t *testing.T) {
184-
t.Skip()
185184
user := *GetUser("create_with_associations", Config{
186185
Account: true,
187186
Pets: 2,
@@ -200,7 +199,7 @@ func TestCreateWithAssociations(t *testing.T) {
200199
CheckUser(t, user, user)
201200

202201
var user2 User
203-
DB.Preload("Account").Preload("Pets").Preload("Toys").Preload("Company").Preload("Manager").Preload("Team").Preload("Languages").Preload("Friends").Find(&user2, "id = ?", user.ID)
202+
DB.Preload("Account").Preload("Pets").Preload("Toys").Preload("Company").Preload("Manager").Preload("Team").Preload("Languages").Preload("Friends").Find(&user2, "\"id\" = ?", user.ID)
204203
CheckUser(t, user2, user)
205204
}
206205

@@ -265,7 +264,6 @@ func TestBulkCreatePtrDataWithAssociations(t *testing.T) {
265264
}
266265

267266
func TestPolymorphicHasOne(t *testing.T) {
268-
t.Skip()
269267
t.Run("Struct", func(t *testing.T) {
270268
pet := Pet{
271269
Name: "PolymorphicHasOne",
@@ -279,7 +277,7 @@ func TestPolymorphicHasOne(t *testing.T) {
279277
CheckPet(t, pet, pet)
280278

281279
var pet2 Pet
282-
DB.Preload("Toy").Find(&pet2, "id = ?", pet.ID)
280+
DB.Preload("Toy").Find(&pet2, "\"id\" = ?", pet.ID)
283281
CheckPet(t, pet2, pet)
284282
})
285283

tests/generics_test.go

Lines changed: 57 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ import (
5656
)
5757

5858
func TestGenericsCreate(t *testing.T) {
59-
t.Skip()
6059
ctx := context.Background()
6160

6261
user := User{Name: "TestGenericsCreate", Age: 18}
@@ -68,25 +67,25 @@ func TestGenericsCreate(t *testing.T) {
6867
t.Fatalf("no primary key found for %v", user)
6968
}
7069

71-
if u, err := gorm.G[User](DB).Where("name = ?", user.Name).First(ctx); err != nil {
70+
if u, err := gorm.G[User](DB).Where("\"name\" = ?", user.Name).First(ctx); err != nil {
7271
t.Fatalf("failed to find user, got error: %v", err)
7372
} else if u.Name != user.Name || u.ID != user.ID {
7473
t.Errorf("found invalid user, got %v, expect %v", u, user)
7574
}
7675

77-
if u, err := gorm.G[User](DB).Where("name = ?", user.Name).Take(ctx); err != nil {
76+
if u, err := gorm.G[User](DB).Where("\"name\" = ?", user.Name).Take(ctx); err != nil {
7877
t.Fatalf("failed to find user, got error: %v", err)
7978
} else if u.Name != user.Name || u.ID != user.ID {
8079
t.Errorf("found invalid user, got %v, expect %v", u, user)
8180
}
8281

83-
if u, err := gorm.G[User](DB).Select("name").Where("name = ?", user.Name).First(ctx); err != nil {
82+
if u, err := gorm.G[User](DB).Select("name").Where("\"name\" = ?", user.Name).First(ctx); err != nil {
8483
t.Fatalf("failed to find user, got error: %v", err)
8584
} else if u.Name != user.Name || u.Age != 0 {
8685
t.Errorf("found invalid user, got %v, expect %v", u, user)
8786
}
8887

89-
if u, err := gorm.G[User](DB).Omit("name").Where("name = ?", user.Name).First(ctx); err != nil {
88+
if u, err := gorm.G[User](DB).Omit("name").Where("\"name\" = ?", user.Name).First(ctx); err != nil {
9089
t.Fatalf("failed to find user, got error: %v", err)
9190
} else if u.Name != "" || u.Age != user.Age {
9291
t.Errorf("found invalid user, got %v, expect %v", u, user)
@@ -96,13 +95,13 @@ func TestGenericsCreate(t *testing.T) {
9695
ID int
9796
Name string
9897
}{}
99-
if err := gorm.G[User](DB).Where("name = ?", user.Name).Scan(ctx, &result); err != nil {
98+
if err := gorm.G[User](DB).Where("\"name\" = ?", user.Name).Scan(ctx, &result); err != nil {
10099
t.Fatalf("failed to scan user, got error: %v", err)
101100
} else if result.Name != user.Name || uint(result.ID) != user.ID {
102101
t.Errorf("found invalid user, got %v, expect %v", result, user)
103102
}
104103

105-
mapResult, err := gorm.G[map[string]interface{}](DB).Table("users").Where("name = ?", user.Name).MapColumns(map[string]string{"name": "user_name"}).Take(ctx)
104+
mapResult, err := gorm.G[map[string]interface{}](DB).Table("users").Where("\"name\" = ?", user.Name).MapColumns(map[string]string{"name": "user_name"}).Take(ctx)
106105
if v := mapResult["user_name"]; fmt.Sprint(v) != user.Name {
107106
t.Errorf("failed to find map results, got %v, err %v", mapResult, err)
108107
}
@@ -157,7 +156,6 @@ func TestGenericsExecAndUpdate(t *testing.T) {
157156
if err := gorm.G[User](DB).Exec(ctx, "INSERT INTO \"users\"(\"name\") VALUES(?)", name); err != nil {
158157
t.Fatalf("Exec insert failed: %v", err)
159158
}
160-
161159
// todo: uncomment the below line, once the alias quoting issue is resolved.
162160
// Gorm issue track: https://github.com/oracle-samples/gorm-oracle/issues/36
163161
// u, err := gorm.G[User](DB).Table("\"users\" u").Where("u.\"name\" = ?", name).First(ctx)
@@ -324,7 +322,6 @@ func TestGenericsScopes(t *testing.T) {
324322
}
325323

326324
func TestGenericsJoins(t *testing.T) {
327-
t.Skip()
328325
ctx := context.Background()
329326
db := gorm.G[User](DB)
330327

@@ -335,7 +332,7 @@ func TestGenericsJoins(t *testing.T) {
335332

336333
// Inner JOIN + WHERE
337334
result, err := db.Joins(clause.Has("Company"), func(db gorm.JoinBuilder, joinTable clause.Table, curTable clause.Table) error {
338-
db.Where("?.name = ?", joinTable, u.Company.Name)
335+
db.Where("?.\"name\" = ?", joinTable, u.Company.Name)
339336
return nil
340337
}).First(ctx)
341338
if err != nil {
@@ -371,7 +368,7 @@ func TestGenericsJoins(t *testing.T) {
371368
if joinTable.Name != "t" {
372369
t.Fatalf("Join table should be t, but got %v", joinTable.Name)
373370
}
374-
db.Where("?.name = ?", joinTable, u.Company.Name)
371+
db.Where("?.\"name\" = ?", joinTable, u.Company.Name)
375372
return nil
376373
}).Where(map[string]any{"name": u.Name}).First(ctx)
377374
if err != nil {
@@ -381,13 +378,14 @@ func TestGenericsJoins(t *testing.T) {
381378
t.Fatalf("Joins expected %s, got %+v", u.Name, result)
382379
}
383380

381+
// TODO: Temporarily disabled due to issue with As("t")
384382
// Raw Subquery JOIN + WHERE
385-
result, err = db.Joins(clause.LeftJoin.AssociationFrom("Company", gorm.G[Company](DB)).As("t"),
383+
/*result, err = db.Joins(clause.LeftJoin.AssociationFrom("Company", gorm.G[Company](DB)).As("t"),
386384
func(db gorm.JoinBuilder, joinTable clause.Table, curTable clause.Table) error {
387385
if joinTable.Name != "t" {
388386
t.Fatalf("Join table should be t, but got %v", joinTable.Name)
389387
}
390-
db.Where("?.name = ?", joinTable, u.Company.Name)
388+
db.Where("?.\"name\" = ?", joinTable, u.Company.Name)
391389
return nil
392390
},
393391
).Where(map[string]any{"name": u2.Name}).First(ctx)
@@ -396,15 +394,15 @@ func TestGenericsJoins(t *testing.T) {
396394
}
397395
if result.Name != u2.Name || result.Company.Name != u.Company.Name || result.Company.ID == 0 {
398396
t.Fatalf("Joins expected %s, got %+v", u.Name, result)
399-
}
397+
}*/
400398

401399
// Raw Subquery JOIN + WHERE + Select
402-
result, err = db.Joins(clause.LeftJoin.AssociationFrom("Company", gorm.G[Company](DB).Select("Name")).As("t"),
400+
/*result, err = db.Joins(clause.LeftJoin.AssociationFrom("Company", gorm.G[Company](DB).Select("Name")).As("t"),
403401
func(db gorm.JoinBuilder, joinTable clause.Table, curTable clause.Table) error {
404402
if joinTable.Name != "t" {
405403
t.Fatalf("Join table should be t, but got %v", joinTable.Name)
406404
}
407-
db.Where("?.name = ?", joinTable, u.Company.Name)
405+
db.Where("?.\"name\" = ?", joinTable, u.Company.Name)
408406
return nil
409407
},
410408
).Where(map[string]any{"name": u2.Name}).First(ctx)
@@ -413,7 +411,7 @@ func TestGenericsJoins(t *testing.T) {
413411
}
414412
if result.Name != u2.Name || result.Company.Name != u.Company.Name || result.Company.ID != 0 {
415413
t.Fatalf("Joins expected %s, got %+v", u.Name, result)
416-
}
414+
}*/
417415

418416
_, err = db.Joins(clause.Has("Company"), func(db gorm.JoinBuilder, joinTable clause.Table, curTable clause.Table) error {
419417
return errors.New("join error")
@@ -500,7 +498,6 @@ func TestGenericsNestedJoins(t *testing.T) {
500498
}
501499

502500
func TestGenericsPreloads(t *testing.T) {
503-
t.Skip()
504501
ctx := context.Background()
505502
db := gorm.G[User](DB)
506503

@@ -511,7 +508,7 @@ func TestGenericsPreloads(t *testing.T) {
511508

512509
db.CreateInBatches(ctx, &[]User{u3, u, u2}, 10)
513510

514-
result, err := db.Preload("Company", nil).Preload("Pets", nil).Where("name = ?", u.Name).First(ctx)
511+
result, err := db.Preload("Company", nil).Preload("Pets", nil).Where("\"name\" = ?", u.Name).First(ctx)
515512
if err != nil {
516513
t.Fatalf("Preload failed: %v", err)
517514
}
@@ -521,9 +518,9 @@ func TestGenericsPreloads(t *testing.T) {
521518
}
522519

523520
results, err := db.Preload("Company", func(db gorm.PreloadBuilder) error {
524-
db.Where("name = ?", u.Company.Name)
521+
db.Where("\"name\" = ?", u.Company.Name)
525522
return nil
526-
}).Where("name in ?", names).Find(ctx)
523+
}).Where("\"name\" in ?", names).Find(ctx)
527524
if err != nil {
528525
t.Fatalf("Preload failed: %v", err)
529526
}
@@ -539,15 +536,23 @@ func TestGenericsPreloads(t *testing.T) {
539536

540537
_, err = db.Preload("Company", func(db gorm.PreloadBuilder) error {
541538
return errors.New("preload error")
542-
}).Where("name in ?", names).Find(ctx)
539+
}).Where("\"name\" in ?", names).Find(ctx)
543540
if err == nil {
544541
t.Fatalf("Preload should failed, but got nil")
545542
}
546543

547544
results, err = db.Preload("Pets", func(db gorm.PreloadBuilder) error {
545+
db.Select(
546+
"pets.id",
547+
"pets.created_at",
548+
"pets.updated_at",
549+
"pets.deleted_at",
550+
"pets.user_id",
551+
"pets.name",
552+
)
548553
db.LimitPerRecord(5)
549554
return nil
550-
}).Where("name in ?", names).Find(ctx)
555+
}).Where("\"name\" in ?", names).Find(ctx)
551556

552557
for _, result := range results {
553558
if result.Name == u.Name {
@@ -560,9 +565,17 @@ func TestGenericsPreloads(t *testing.T) {
560565
}
561566

562567
results, err = db.Preload("Pets", func(db gorm.PreloadBuilder) error {
563-
db.Order("name desc").LimitPerRecord(5)
568+
db.Select(
569+
"pets.id",
570+
"pets.created_at",
571+
"pets.updated_at",
572+
"pets.deleted_at",
573+
"pets.user_id",
574+
"pets.name",
575+
)
576+
db.Order("\"name\" desc").LimitPerRecord(5)
564577
return nil
565-
}).Where("name in ?", names).Find(ctx)
578+
}).Where("\"name\" in ?", names).Find(ctx)
566579

567580
for _, result := range results {
568581
if result.Name == u.Name {
@@ -580,12 +593,20 @@ func TestGenericsPreloads(t *testing.T) {
580593
}
581594

582595
results, err = db.Preload("Pets", func(db gorm.PreloadBuilder) error {
583-
db.Order("name").LimitPerRecord(5)
596+
db.Select(
597+
"pets.id",
598+
"pets.created_at",
599+
"pets.updated_at",
600+
"pets.deleted_at",
601+
"pets.user_id",
602+
"pets.name",
603+
)
604+
db.Order("\"name\"").LimitPerRecord(5)
584605
return nil
585606
}).Preload("Friends", func(db gorm.PreloadBuilder) error {
586-
db.Order("name")
607+
db.Order("\"name\"")
587608
return nil
588-
}).Where("name in ?", names).Find(ctx)
609+
}).Where("\"name\" in ?", names).Find(ctx)
589610

590611
for _, result := range results {
591612
if result.Name == u.Name {
@@ -612,7 +633,6 @@ func TestGenericsPreloads(t *testing.T) {
612633
}
613634

614635
func TestGenericsNestedPreloads(t *testing.T) {
615-
t.Skip()
616636
user := *GetUser("generics_nested_preload", Config{Pets: 2})
617637
user.Friends = []*User{GetUser("generics_nested_preload", Config{Pets: 5})}
618638

@@ -639,6 +659,14 @@ func TestGenericsNestedPreloads(t *testing.T) {
639659
}
640660

641661
user3, err := db.Preload("Pets.Toy", nil).Preload("Friends.Pets", func(db gorm.PreloadBuilder) error {
662+
db.Select(
663+
"pets.id",
664+
"pets.created_at",
665+
"pets.updated_at",
666+
"pets.deleted_at",
667+
"pets.user_id",
668+
"pets.name",
669+
)
642670
db.LimitPerRecord(3)
643671
return nil
644672
}).Where(user.ID).Take(ctx)

0 commit comments

Comments
 (0)