1
1
/*
2
- * Copyright 2002-2020 the original author or authors.
2
+ * Copyright 2002-2021 the original author or authors.
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
@@ -44,6 +44,7 @@ public class NamedParameterUtilsUnitTests {
44
44
45
45
private final BindMarkersFactory BIND_MARKERS = BindMarkersFactory .indexed ("$" , 1 );
46
46
47
+
47
48
@ Test
48
49
public void shouldParseSql () {
49
50
String sql = "xxx :a yyyy :b :c :a zzzzz" ;
@@ -146,7 +147,6 @@ public void parseSqlStatementWithPostgresContainedOperator() {
146
147
String sql = "select 'first name' from artists where info->'stat'->'albums' = ?? :album and '[\" 1\" ,\" 2\" ,\" 3\" ]'::jsonb ?? '4'" ;
147
148
148
149
ParsedSql parsedSql = NamedParameterUtils .parseSqlStatement (sql );
149
-
150
150
assertThat (parsedSql .getTotalParameterCount ()).isEqualTo (1 );
151
151
assertThat (expand (parsedSql )).isEqualTo (expectedSql );
152
152
}
@@ -157,7 +157,6 @@ public void parseSqlStatementWithPostgresAnyArrayStringsExistsOperator() {
157
157
String sql = "select '[\" 3\" , \" 11\" ]'::jsonb ?| '{1,3,11,12,17}'::text[]" ;
158
158
159
159
ParsedSql parsedSql = NamedParameterUtils .parseSqlStatement (sql );
160
-
161
160
assertThat (parsedSql .getTotalParameterCount ()).isEqualTo (0 );
162
161
assertThat (expand (parsedSql )).isEqualTo (expectedSql );
163
162
}
@@ -178,7 +177,6 @@ public void parseSqlStatementWithEscapedColon() {
178
177
String sql = "select '0\\ :0' as a, foo from bar where baz < DATE(:p1 23\\ :59\\ :59) and baz = :p2" ;
179
178
180
179
ParsedSql parsedSql = NamedParameterUtils .parseSqlStatement (sql );
181
-
182
180
assertThat (parsedSql .getParameterNames ()).containsExactly ("p1" , "p2" );
183
181
assertThat (expand (parsedSql )).isEqualTo (expectedSql );
184
182
}
@@ -199,7 +197,6 @@ public void parseSqlStatementWithEmptyBracketsOrBracketsInQuotes() {
199
197
String sql = "select foo from bar where baz = b:{}z" ;
200
198
201
199
ParsedSql parsedSql = NamedParameterUtils .parseSqlStatement (sql );
202
-
203
200
assertThat (parsedSql .getParameterNames ()).isEmpty ();
204
201
assertThat (expand (parsedSql )).isEqualTo (expectedSql );
205
202
@@ -226,13 +223,11 @@ public void parseSqlStatementWithLogicalAnd() {
226
223
String expectedSql = "xxx & yyyy" ;
227
224
228
225
ParsedSql parsedSql = NamedParameterUtils .parseSqlStatement (expectedSql );
229
-
230
226
assertThat (expand (parsedSql )).isEqualTo (expectedSql );
231
227
}
232
228
233
229
@ Test
234
230
public void substituteNamedParametersWithLogicalAnd () {
235
-
236
231
String expectedSql = "xxx & yyyy" ;
237
232
238
233
assertThat (expand (expectedSql )).isEqualTo (expectedSql );
@@ -250,7 +245,6 @@ public void parseSqlStatementWithQuotedSingleQuote() {
250
245
String sql = "SELECT ':foo'':doo', :xxx FROM DUAL" ;
251
246
252
247
ParsedSql psql = NamedParameterUtils .parseSqlStatement (sql );
253
-
254
248
assertThat (psql .getTotalParameterCount ()).isEqualTo (1 );
255
249
assertThat (psql .getParameterNames ()).containsExactly ("xxx" );
256
250
}
@@ -260,7 +254,6 @@ public void parseSqlStatementWithQuotesAndCommentBefore() {
260
254
String sql = "SELECT /*:doo*/':foo', :xxx FROM DUAL" ;
261
255
262
256
ParsedSql psql = NamedParameterUtils .parseSqlStatement (sql );
263
-
264
257
assertThat (psql .getTotalParameterCount ()).isEqualTo (1 );
265
258
assertThat (psql .getParameterNames ()).containsExactly ("xxx" );
266
259
}
@@ -270,30 +263,24 @@ public void parseSqlStatementWithQuotesAndCommentAfter() {
270
263
String sql2 = "SELECT ':foo'/*:doo*/, :xxx FROM DUAL" ;
271
264
272
265
ParsedSql psql2 = NamedParameterUtils .parseSqlStatement (sql2 );
273
-
274
266
assertThat (psql2 .getTotalParameterCount ()).isEqualTo (1 );
275
267
assertThat (psql2 .getParameterNames ()).containsExactly ("xxx" );
276
268
}
277
269
278
- @ Test public void parseSqlStatementWithSquareBracket () {
279
- // given
270
+ @ Test // gh-27716
271
+ public void parseSqlStatementWithSquareBracket () {
280
272
String sql = "SELECT ARRAY[:ext]" ;
281
273
282
- // when
283
274
ParsedSql psql = NamedParameterUtils .parseSqlStatement (sql );
284
-
285
- //then
286
275
assertThat (psql .getNamedParameterCount ()).isEqualTo (1 );
287
276
assertThat (psql .getParameterNames ()).containsExactly ("ext" );
288
277
}
289
278
290
279
@ Test
291
280
public void shouldAllowParsingMultipleUseOfParameter () {
292
-
293
281
String sql = "SELECT * FROM person where name = :id or lastname = :id" ;
294
282
295
283
ParsedSql parsed = NamedParameterUtils .parseSqlStatement (sql );
296
-
297
284
assertThat (parsed .getTotalParameterCount ()).isEqualTo (2 );
298
285
assertThat (parsed .getNamedParameterCount ()).isEqualTo (1 );
299
286
assertThat (parsed .getParameterNames ()).containsExactly ("id" , "id" );
@@ -313,23 +300,19 @@ sql, factory, new MapBindParameterSource(
313
300
"SELECT * FROM person where name = $0 or lastname = $0" );
314
301
315
302
operation .bindTo (new BindTarget () {
316
-
317
303
@ Override
318
304
public void bind (String identifier , Object value ) {
319
305
throw new UnsupportedOperationException ();
320
306
}
321
-
322
307
@ Override
323
308
public void bind (int index , Object value ) {
324
309
assertThat (index ).isEqualTo (0 );
325
310
assertThat (value ).isEqualTo ("foo" );
326
311
}
327
-
328
312
@ Override
329
313
public void bindNull (String identifier , Class <?> type ) {
330
314
throw new UnsupportedOperationException ();
331
315
}
332
-
333
316
@ Override
334
317
public void bindNull (int index , Class <?> type ) {
335
318
throw new UnsupportedOperationException ();
@@ -353,25 +336,20 @@ sql, factory, new MapBindParameterSource(Collections.singletonMap("ids",
353
336
"SELECT * FROM person where name IN ($0, $1, $2) or lastname IN ($0, $1, $2)" );
354
337
355
338
operation .bindTo (new BindTarget () {
356
-
357
339
@ Override
358
340
public void bind (String identifier , Object value ) {
359
341
throw new UnsupportedOperationException ();
360
342
}
361
-
362
343
@ Override
363
344
public void bind (int index , Object value ) {
364
345
assertThat (index ).isIn (0 , 1 , 2 );
365
346
assertThat (value ).isIn ("foo" , "bar" , "baz" );
366
-
367
347
bindings .add (index , value );
368
348
}
369
-
370
349
@ Override
371
350
public void bindNull (String identifier , Class <?> type ) {
372
351
throw new UnsupportedOperationException ();
373
352
}
374
-
375
353
@ Override
376
354
public void bindNull (int index , Class <?> type ) {
377
355
throw new UnsupportedOperationException ();
@@ -399,22 +377,18 @@ sql, factory, new MapBindParameterSource(
399
377
Map <Integer , Object > bindValues = new LinkedHashMap <>();
400
378
401
379
operation .bindTo (new BindTarget () {
402
-
403
380
@ Override
404
381
public void bind (String identifier , Object value ) {
405
382
throw new UnsupportedOperationException ();
406
383
}
407
-
408
384
@ Override
409
385
public void bind (int index , Object value ) {
410
386
bindValues .put (index , value );
411
387
}
412
-
413
388
@ Override
414
389
public void bindNull (String identifier , Class <?> type ) {
415
390
throw new UnsupportedOperationException ();
416
391
}
417
-
418
392
@ Override
419
393
public void bindNull (int index , Class <?> type ) {
420
394
throw new UnsupportedOperationException ();
@@ -438,22 +412,18 @@ sql, factory, new MapBindParameterSource(
438
412
"SELECT * FROM person where name = $0 or lastname = $0" );
439
413
440
414
operation .bindTo (new BindTarget () {
441
-
442
415
@ Override
443
416
public void bind (String identifier , Object value ) {
444
417
throw new UnsupportedOperationException ();
445
418
}
446
-
447
419
@ Override
448
420
public void bind (int index , Object value ) {
449
421
throw new UnsupportedOperationException ();
450
422
}
451
-
452
423
@ Override
453
424
public void bindNull (String identifier , Class <?> type ) {
454
425
throw new UnsupportedOperationException ();
455
426
}
456
-
457
427
@ Override
458
428
public void bindNull (int index , Class <?> type ) {
459
429
assertThat (index ).isEqualTo (0 );
@@ -462,6 +432,7 @@ public void bindNull(int index, Class<?> type) {
462
432
});
463
433
}
464
434
435
+
465
436
private String expand (ParsedSql sql ) {
466
437
return NamedParameterUtils .substituteNamedParameters (sql , BIND_MARKERS ,
467
438
new MapBindParameterSource ()).toQuery ();
0 commit comments