1
1
/*
2
- * Copyright 2002-2020 the original author or authors.
2
+ * Copyright 2002-2022 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.
@@ -43,6 +43,7 @@ public class NamedParameterUtilsUnitTests {
43
43
44
44
private final BindMarkersFactory BIND_MARKERS = BindMarkersFactory .indexed ("$" , 1 );
45
45
46
+
46
47
@ Test
47
48
public void shouldParseSql () {
48
49
String sql = "xxx :a yyyy :b :c :a zzzzz" ;
@@ -145,7 +146,6 @@ public void parseSqlStatementWithPostgresContainedOperator() {
145
146
String sql = "select 'first name' from artists where info->'stat'->'albums' = ?? :album and '[\" 1\" ,\" 2\" ,\" 3\" ]'::jsonb ?? '4'" ;
146
147
147
148
ParsedSql parsedSql = NamedParameterUtils .parseSqlStatement (sql );
148
-
149
149
assertThat (parsedSql .getTotalParameterCount ()).isEqualTo (1 );
150
150
assertThat (expand (parsedSql )).isEqualTo (expectedSql );
151
151
}
@@ -156,7 +156,6 @@ public void parseSqlStatementWithPostgresAnyArrayStringsExistsOperator() {
156
156
String sql = "select '[\" 3\" , \" 11\" ]'::jsonb ?| '{1,3,11,12,17}'::text[]" ;
157
157
158
158
ParsedSql parsedSql = NamedParameterUtils .parseSqlStatement (sql );
159
-
160
159
assertThat (parsedSql .getTotalParameterCount ()).isEqualTo (0 );
161
160
assertThat (expand (parsedSql )).isEqualTo (expectedSql );
162
161
}
@@ -177,7 +176,6 @@ public void parseSqlStatementWithEscapedColon() {
177
176
String sql = "select '0\\ :0' as a, foo from bar where baz < DATE(:p1 23\\ :59\\ :59) and baz = :p2" ;
178
177
179
178
ParsedSql parsedSql = NamedParameterUtils .parseSqlStatement (sql );
180
-
181
179
assertThat (parsedSql .getParameterNames ()).containsExactly ("p1" , "p2" );
182
180
assertThat (expand (parsedSql )).isEqualTo (expectedSql );
183
181
}
@@ -198,7 +196,6 @@ public void parseSqlStatementWithEmptyBracketsOrBracketsInQuotes() {
198
196
String sql = "select foo from bar where baz = b:{}z" ;
199
197
200
198
ParsedSql parsedSql = NamedParameterUtils .parseSqlStatement (sql );
201
-
202
199
assertThat (parsedSql .getParameterNames ()).isEmpty ();
203
200
assertThat (expand (parsedSql )).isEqualTo (expectedSql );
204
201
@@ -225,13 +222,11 @@ public void parseSqlStatementWithLogicalAnd() {
225
222
String expectedSql = "xxx & yyyy" ;
226
223
227
224
ParsedSql parsedSql = NamedParameterUtils .parseSqlStatement (expectedSql );
228
-
229
225
assertThat (expand (parsedSql )).isEqualTo (expectedSql );
230
226
}
231
227
232
228
@ Test
233
229
public void substituteNamedParametersWithLogicalAnd () {
234
-
235
230
String expectedSql = "xxx & yyyy" ;
236
231
237
232
assertThat (expand (expectedSql )).isEqualTo (expectedSql );
@@ -249,7 +244,6 @@ public void parseSqlStatementWithQuotedSingleQuote() {
249
244
String sql = "SELECT ':foo'':doo', :xxx FROM DUAL" ;
250
245
251
246
ParsedSql psql = NamedParameterUtils .parseSqlStatement (sql );
252
-
253
247
assertThat (psql .getTotalParameterCount ()).isEqualTo (1 );
254
248
assertThat (psql .getParameterNames ()).containsExactly ("xxx" );
255
249
}
@@ -259,7 +253,6 @@ public void parseSqlStatementWithQuotesAndCommentBefore() {
259
253
String sql = "SELECT /*:doo*/':foo', :xxx FROM DUAL" ;
260
254
261
255
ParsedSql psql = NamedParameterUtils .parseSqlStatement (sql );
262
-
263
256
assertThat (psql .getTotalParameterCount ()).isEqualTo (1 );
264
257
assertThat (psql .getParameterNames ()).containsExactly ("xxx" );
265
258
}
@@ -269,18 +262,23 @@ public void parseSqlStatementWithQuotesAndCommentAfter() {
269
262
String sql2 = "SELECT ':foo'/*:doo*/, :xxx FROM DUAL" ;
270
263
271
264
ParsedSql psql2 = NamedParameterUtils .parseSqlStatement (sql2 );
272
-
273
265
assertThat (psql2 .getTotalParameterCount ()).isEqualTo (1 );
274
266
assertThat (psql2 .getParameterNames ()).containsExactly ("xxx" );
275
267
}
276
268
269
+ @ Test // gh-27925
270
+ void namedParamMapReference () {
271
+ String sql = "insert into foos (id) values (:headers[id])" ;
272
+ ParsedSql psql = NamedParameterUtils .parseSqlStatement (sql );
273
+ assertThat (psql .getNamedParameterCount ()).isEqualTo (1 );
274
+ assertThat (psql .getParameterNames ()).containsExactly ("headers[id]" );
275
+ }
276
+
277
277
@ Test
278
278
public void shouldAllowParsingMultipleUseOfParameter () {
279
-
280
279
String sql = "SELECT * FROM person where name = :id or lastname = :id" ;
281
280
282
281
ParsedSql parsed = NamedParameterUtils .parseSqlStatement (sql );
283
-
284
282
assertThat (parsed .getTotalParameterCount ()).isEqualTo (2 );
285
283
assertThat (parsed .getNamedParameterCount ()).isEqualTo (1 );
286
284
assertThat (parsed .getParameterNames ()).containsExactly ("id" , "id" );
@@ -300,23 +298,19 @@ sql, factory, new MapBindParameterSource(
300
298
"SELECT * FROM person where name = $0 or lastname = $0" );
301
299
302
300
operation .bindTo (new BindTarget () {
303
-
304
301
@ Override
305
302
public void bind (String identifier , Object value ) {
306
303
throw new UnsupportedOperationException ();
307
304
}
308
-
309
305
@ Override
310
306
public void bind (int index , Object value ) {
311
307
assertThat (index ).isEqualTo (0 );
312
308
assertThat (value ).isEqualTo ("foo" );
313
309
}
314
-
315
310
@ Override
316
311
public void bindNull (String identifier , Class <?> type ) {
317
312
throw new UnsupportedOperationException ();
318
313
}
319
-
320
314
@ Override
321
315
public void bindNull (int index , Class <?> type ) {
322
316
throw new UnsupportedOperationException ();
@@ -340,25 +334,20 @@ sql, factory, new MapBindParameterSource(Collections.singletonMap("ids",
340
334
"SELECT * FROM person where name IN ($0, $1, $2) or lastname IN ($0, $1, $2)" );
341
335
342
336
operation .bindTo (new BindTarget () {
343
-
344
337
@ Override
345
338
public void bind (String identifier , Object value ) {
346
339
throw new UnsupportedOperationException ();
347
340
}
348
-
349
341
@ Override
350
342
public void bind (int index , Object value ) {
351
343
assertThat (index ).isIn (0 , 1 , 2 );
352
344
assertThat (value ).isIn ("foo" , "bar" , "baz" );
353
-
354
345
bindings .add (index , value );
355
346
}
356
-
357
347
@ Override
358
348
public void bindNull (String identifier , Class <?> type ) {
359
349
throw new UnsupportedOperationException ();
360
350
}
361
-
362
351
@ Override
363
352
public void bindNull (int index , Class <?> type ) {
364
353
throw new UnsupportedOperationException ();
@@ -386,22 +375,18 @@ sql, factory, new MapBindParameterSource(
386
375
Map <Integer , Object > bindValues = new LinkedHashMap <>();
387
376
388
377
operation .bindTo (new BindTarget () {
389
-
390
378
@ Override
391
379
public void bind (String identifier , Object value ) {
392
380
throw new UnsupportedOperationException ();
393
381
}
394
-
395
382
@ Override
396
383
public void bind (int index , Object value ) {
397
384
bindValues .put (index , value );
398
385
}
399
-
400
386
@ Override
401
387
public void bindNull (String identifier , Class <?> type ) {
402
388
throw new UnsupportedOperationException ();
403
389
}
404
-
405
390
@ Override
406
391
public void bindNull (int index , Class <?> type ) {
407
392
throw new UnsupportedOperationException ();
@@ -425,22 +410,18 @@ sql, factory, new MapBindParameterSource(
425
410
"SELECT * FROM person where name = $0 or lastname = $0" );
426
411
427
412
operation .bindTo (new BindTarget () {
428
-
429
413
@ Override
430
414
public void bind (String identifier , Object value ) {
431
415
throw new UnsupportedOperationException ();
432
416
}
433
-
434
417
@ Override
435
418
public void bind (int index , Object value ) {
436
419
throw new UnsupportedOperationException ();
437
420
}
438
-
439
421
@ Override
440
422
public void bindNull (String identifier , Class <?> type ) {
441
423
throw new UnsupportedOperationException ();
442
424
}
443
-
444
425
@ Override
445
426
public void bindNull (int index , Class <?> type ) {
446
427
assertThat (index ).isEqualTo (0 );
@@ -449,6 +430,7 @@ public void bindNull(int index, Class<?> type) {
449
430
});
450
431
}
451
432
433
+
452
434
private String expand (ParsedSql sql ) {
453
435
return NamedParameterUtils .substituteNamedParameters (sql , BIND_MARKERS ,
454
436
new MapBindParameterSource ()).toQuery ();
0 commit comments