@@ -118,3 +118,142 @@ func TestNamedArg(t *testing.T) {
118
118
t .Errorf ("should return record not found error, but got %v" , err )
119
119
}
120
120
}
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