|
1 | 1 | /*
|
2 |
| - * Copyright 2002-2023 the original author or authors. |
| 2 | + * Copyright 2002-2024 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.
|
|
21 | 21 | import java.util.Map;
|
22 | 22 |
|
23 | 23 | import org.junit.jupiter.api.Test;
|
| 24 | +import org.junit.jupiter.params.ParameterizedTest; |
| 25 | +import org.junit.jupiter.params.provider.ValueSource; |
24 | 26 |
|
25 | 27 | import org.springframework.dao.InvalidDataAccessApiUsageException;
|
26 | 28 | import org.springframework.jdbc.core.SqlParameterValue;
|
@@ -285,25 +287,14 @@ public void variableAssignmentOperator() {
|
285 | 287 | assertThat(newSql).isEqualTo(expectedSql);
|
286 | 288 | }
|
287 | 289 |
|
288 |
| - @Test // SPR-8280 |
289 |
| - public void parseSqlStatementWithQuotedSingleQuote() { |
290 |
| - String sql = "SELECT ':foo'':doo', :xxx FROM DUAL"; |
291 |
| - ParsedSql parsedSql = NamedParameterUtils.parseSqlStatement(sql); |
292 |
| - assertThat(parsedSql.getTotalParameterCount()).isEqualTo(1); |
293 |
| - assertThat(parsedSql.getParameterNames()).containsExactly("xxx"); |
294 |
| - } |
295 |
| - |
296 |
| - @Test |
297 |
| - void parseSqlStatementWithQuotesAndCommentBefore() { |
298 |
| - String sql = "SELECT /*:doo*/':foo', :xxx FROM DUAL"; |
299 |
| - ParsedSql parsedSql = NamedParameterUtils.parseSqlStatement(sql); |
300 |
| - assertThat(parsedSql.getTotalParameterCount()).isEqualTo(1); |
301 |
| - assertThat(parsedSql.getParameterNames()).containsExactly("xxx"); |
302 |
| - } |
303 |
| - |
304 |
| - @Test |
305 |
| - void parseSqlStatementWithQuotesAndCommentAfter() { |
306 |
| - String sql = "SELECT ':foo'/*:doo*/, :xxx FROM DUAL"; |
| 290 | + @ParameterizedTest // SPR-8280 and others |
| 291 | + @ValueSource(strings = { |
| 292 | + "SELECT ':foo'':doo', :xxx FROM DUAL", |
| 293 | + "SELECT /*:doo*/':foo', :xxx FROM DUAL", |
| 294 | + "SELECT ':foo'/*:doo*/, :xxx FROM DUAL", |
| 295 | + "SELECT \":foo\"\":doo\", :xxx FROM DUAL", |
| 296 | + "SELECT `:foo``:doo`, :xxx FROM DUAL",}) |
| 297 | + void parseSqlStatementWithParametersInsideQuote(String sql) { |
307 | 298 | ParsedSql parsedSql = NamedParameterUtils.parseSqlStatement(sql);
|
308 | 299 | assertThat(parsedSql.getTotalParameterCount()).isEqualTo(1);
|
309 | 300 | assertThat(parsedSql.getParameterNames()).containsExactly("xxx");
|
@@ -361,6 +352,14 @@ public Map<String, Object> getHeaders() {
|
361 | 352 | assertThat(sqlToUse).isEqualTo("insert into foos (id) values (?)");
|
362 | 353 | }
|
363 | 354 |
|
| 355 | + @Test // gh-31944 |
| 356 | + void parseSqlStatementWithBackticks() { |
| 357 | + String sql = "select * from `tb&user` where id = :id"; |
| 358 | + ParsedSql parsedSql = NamedParameterUtils.parseSqlStatement(sql); |
| 359 | + assertThat(parsedSql.getParameterNames()).containsExactly("id"); |
| 360 | + assertThat(substituteNamedParameters(parsedSql)).isEqualTo("select * from `tb&user` where id = ?"); |
| 361 | + } |
| 362 | + |
364 | 363 | private static String substituteNamedParameters(ParsedSql parsedSql) {
|
365 | 364 | return NamedParameterUtils.substituteNamedParameters(parsedSql, null);
|
366 | 365 | }
|
|
0 commit comments