From 0ce9ae2c6a4b9a779e4a70b6d3d2c6efb3d0d4a3 Mon Sep 17 00:00:00 2001 From: liutianqi Date: Wed, 27 Dec 2023 18:20:15 +0800 Subject: [PATCH] test: ExplainSQL using consecutive pairs of escaper in SQL string represents an escaper --- main_test.go | 41 ++++++++++++++++++++++++++++++++++++++++- models.go | 4 ++-- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/main_test.go b/main_test.go index 60a388f7..83ad4582 100644 --- a/main_test.go +++ b/main_test.go @@ -1,6 +1,7 @@ package main import ( + "reflect" "testing" ) @@ -9,8 +10,10 @@ import ( // TEST_DRIVERS: sqlite, mysql, postgres, sqlserver func TestGORM(t *testing.T) { - user := User{Name: "jinzhu"} + user := User{Name: `"jin'zhu"`} // string values contain single or double quotes + // INSERT INTO `users` (`created_at`,`updated_at`,`deleted_at`,`name`,`age`,`birthday`,`company_id`,`manager_id`,`active`) + // VALUES ("2023-12-27 17:58:17.329","2023-12-27 17:58:17.329",NULL,"""jin'zhu""",0,NULL,NULL,NULL,false) RETURNING `id` DB.Create(&user) var result User @@ -18,3 +21,39 @@ func TestGORM(t *testing.T) { t.Errorf("Failed, got error: %v", err) } } + +func TestExplain(t *testing.T) { + type args struct { + prepareSql string + values []interface{} + } + tests := []struct { + name string + args args + wantSQL string + }{ + {"mysql", args{"SELECT ? AS QUOTES_STR", []interface{}{"'"}}, `SELECT '''' AS QUOTES_STR`}, + {"postgres", args{"SELECT $1 AS QUOTES_STR", []interface{}{"'"}}, `SELECT '''' AS QUOTES_STR`}, + {"sqlserver", args{"SELECT @p1 AS QUOTES_STR", []interface{}{"'"}}, `SELECT '''' AS QUOTES_STR`}, + {"sqlite", args{"SELECT ? AS QUOTES_STR", []interface{}{`"`}}, `SELECT """" AS QUOTES_STR`}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if name := DB.Dialector.Name(); name != tt.name { + t.Logf("%s skip %s...", name, tt.name) + return + } + gotSQL := DB.Dialector.Explain(tt.args.prepareSql, tt.args.values...) + if reflect.DeepEqual(gotSQL, tt.wantSQL) { + var result string + if err := DB.Raw(gotSQL).Row().Scan(&result); err == nil { + t.Logf("result = `%s`", result) + } else { + t.Errorf("exec `%s` got error: %v", gotSQL, err) + } + } else { + t.Errorf("Explain gotDb = %v, want %v", gotSQL, tt.wantSQL) + } + }) + } +} diff --git a/models.go b/models.go index 692a6842..7a2e7c5d 100644 --- a/models.go +++ b/models.go @@ -13,8 +13,8 @@ import ( // His pet also has one Toy (has one - polymorphic) type User struct { gorm.Model - Name string - Age uint + Name string `gorm:"comment:double quotation marks \"\" are included in the comment!"` + Age uint `gorm:"comment:single quotation marks '' are included in the comment"` Birthday *time.Time Account Account Pets []*Pet