@@ -118,3 +118,142 @@ func TestNamedArg(t *testing.T) {
118118 t .Errorf ("should return record not found error, but got %v" , err )
119119 }
120120}
121+
122+ func TestNamedArgMultipleSameParamRefs (t * testing.T ) {
123+ type NamedUser struct {
124+ gorm.Model
125+ Name1 string
126+ }
127+ DB .Migrator ().DropTable (& NamedUser {})
128+ DB .AutoMigrate (& NamedUser {})
129+
130+ user := NamedUser {Name1 : "multi-ref" }
131+ DB .Create (& user )
132+
133+ var result NamedUser
134+ if err := DB .Raw (`SELECT * FROM "named_users" WHERE @name = @name AND "name1" = @name` ,
135+ sql .Named ("name" , "multi-ref" )).Scan (& result ).Error ; err != nil {
136+ t .Errorf ("failed with multiple same param refs: %v" , err )
137+ }
138+ tests .AssertEqual (t , result , user )
139+ }
140+
141+ func TestNamedArgNullValues (t * testing.T ) {
142+ type NamedUser struct {
143+ gorm.Model
144+ Name1 * string
145+ }
146+ DB .Migrator ().DropTable (& NamedUser {})
147+ DB .AutoMigrate (& NamedUser {})
148+
149+ DB .Create (& NamedUser {Name1 : nil })
150+
151+ var count int64
152+ if err := DB .Raw (`SELECT count(*) FROM "named_users" WHERE (:name IS NULL AND "name1" IS NULL)` ,
153+ sql .Named ("name" , nil )).Scan (& count ).Error ; err != nil {
154+ t .Errorf ("failed null param test: %v" , err )
155+ }
156+ if count != 1 {
157+ t .Errorf ("expected 1 null record, got %d" , count )
158+ }
159+ }
160+
161+ func TestNamedArgMixedNamedAndMapParams (t * testing.T ) {
162+ type NamedUser struct {
163+ gorm.Model
164+ Name1 string
165+ Name2 string
166+ }
167+ DB .Migrator ().DropTable (& NamedUser {})
168+ DB .AutoMigrate (& NamedUser {})
169+
170+ user := NamedUser {Name1 : "n1" , Name2 : "n2" }
171+ DB .Create (& user )
172+
173+ var result NamedUser
174+ if err := DB .Raw (`SELECT * FROM "named_users" WHERE "name1" = @name1 AND "name2" = @name2` ,
175+ sql .Named ("name1" , "n1" ), map [string ]interface {}{"name2" : "n2" }).Scan (& result ).Error ; err != nil {
176+ t .Errorf ("failed mixed param test: %v" , err )
177+ }
178+ tests .AssertEqual (t , result , user )
179+ }
180+
181+ func TestNamedArgUnusedParameter (t * testing.T ) {
182+ type NamedUser struct {
183+ gorm.Model
184+ Name1 string
185+ }
186+ DB .Migrator ().DropTable (& NamedUser {})
187+ DB .AutoMigrate (& NamedUser {})
188+
189+ user := NamedUser {Name1 : "unused" }
190+ DB .Create (& user )
191+
192+ var result NamedUser
193+ if err := DB .Raw (`SELECT * FROM "named_users" WHERE "name1" = @name1` ,
194+ sql .Named ("name1" , "unused" ), sql .Named ("extra" , "notused" )).Scan (& result ).Error ; err != nil {
195+ t .Errorf ("failed unused param test: %v" , err )
196+ }
197+ tests .AssertEqual (t , result , user )
198+ }
199+
200+ func TestNamedArgCaseSensitivity (t * testing.T ) {
201+ type NamedUser struct {
202+ gorm.Model
203+ Name1 string
204+ }
205+ DB .Migrator ().DropTable (& NamedUser {})
206+ DB .AutoMigrate (& NamedUser {})
207+
208+ user := NamedUser {Name1 : "CaseTest" }
209+ DB .Create (& user )
210+
211+ var result NamedUser
212+ if err := DB .Raw (`SELECT * FROM "named_users" WHERE "name1" = @Name` ,
213+ sql .Named ("Name" , "CaseTest" )).Scan (& result ).Error ; err != nil {
214+ t .Errorf ("failed case sensitivity test: %v" , err )
215+ }
216+ tests .AssertEqual (t , result , user )
217+ }
218+
219+ func TestNamedArgInClause (t * testing.T ) {
220+ type NamedUser struct {
221+ gorm.Model
222+ Name1 string
223+ }
224+ DB .Migrator ().DropTable (& NamedUser {})
225+ DB .AutoMigrate (& NamedUser {})
226+
227+ user1 := NamedUser {Name1 : "in1" }
228+ user2 := NamedUser {Name1 : "in2" }
229+ DB .Create (& user1 )
230+ DB .Create (& user2 )
231+
232+ var results []NamedUser
233+ if err := DB .Raw (`SELECT * FROM "named_users" WHERE "name1" IN (@n1, @n2)` ,
234+ sql .Named ("n1" , "in1" ), sql .Named ("n2" , "in2" )).Scan (& results ).Error ; err != nil {
235+ t .Errorf ("failed IN clause test: %v" , err )
236+ }
237+ if len (results ) != 2 {
238+ t .Errorf ("expected 2 results, got %d" , len (results ))
239+ }
240+ }
241+
242+ func TestNamedArgReservedWordParam (t * testing.T ) {
243+ type NamedUser struct {
244+ gorm.Model
245+ Name1 string
246+ }
247+ DB .Migrator ().DropTable (& NamedUser {})
248+ DB .AutoMigrate (& NamedUser {})
249+
250+ user := NamedUser {Name1 : "reserved" }
251+ DB .Create (& user )
252+
253+ var result NamedUser
254+ if err := DB .Raw (`SELECT * FROM "named_users" WHERE "name1" = @order` ,
255+ sql .Named ("order" , "reserved" )).Scan (& result ).Error ; err != nil {
256+ t .Errorf ("failed reserved word param test: %v" , err )
257+ }
258+ tests .AssertEqual (t , result , user )
259+ }
0 commit comments