|
15 | 15 | import static org.junit.jupiter.api.Assertions.assertTimeoutPreemptively; |
16 | 16 |
|
17 | 17 | import java.time.Duration; |
| 18 | +import java.util.Arrays; |
| 19 | +import java.util.HashSet; |
18 | 20 | import net.sf.jsqlparser.JSQLParserException; |
| 21 | +import net.sf.jsqlparser.expression.operators.arithmetic.Concat; |
19 | 22 | import net.sf.jsqlparser.parser.AbstractJSqlParser.Dialect; |
20 | 23 | import net.sf.jsqlparser.parser.CCJSqlParserUtil; |
21 | 24 | import net.sf.jsqlparser.statement.Statement; |
|
24 | 27 | import net.sf.jsqlparser.statement.create.table.ColumnOption; |
25 | 28 | import net.sf.jsqlparser.statement.select.PlainSelect; |
26 | 29 | import net.sf.jsqlparser.test.TestUtils; |
| 30 | +import net.sf.jsqlparser.util.TablesNamesFinder; |
27 | 31 | import net.sf.jsqlparser.util.deparser.ExpressionDeParser; |
28 | 32 | import org.junit.jupiter.api.Assertions; |
29 | 33 | import org.junit.jupiter.api.Test; |
| 34 | +import org.junit.jupiter.params.ParameterizedTest; |
| 35 | +import org.junit.jupiter.params.provider.CsvSource; |
| 36 | +import org.junit.jupiter.params.provider.ValueSource; |
30 | 37 |
|
31 | 38 | /** |
32 | 39 | * |
@@ -369,6 +376,51 @@ public void testOracleAlternativeQuoting() throws JSQLParserException { |
369 | 376 | TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true); |
370 | 377 | } |
371 | 378 |
|
| 379 | + @ParameterizedTest |
| 380 | + @ValueSource(strings = {"q'{a}'", "q'(a)'", "q'[a]'", "q''a''", "Q'[a]'"}) |
| 381 | + void testOracleAlternativeQuotingEndsAtFirstDelimiter(String literal) |
| 382 | + throws JSQLParserException { |
| 383 | + String sqlStr = |
| 384 | + "SELECT " + literal + " FROM t WHERE id IN (SELECT id FROM secrets) AND x = " |
| 385 | + + literal; |
| 386 | + |
| 387 | + Statement statement = TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true); |
| 388 | + |
| 389 | + assertEquals(new HashSet<>(Arrays.asList("t", "secrets")), |
| 390 | + new TablesNamesFinder<Void>().getTables(statement)); |
| 391 | + assertEquals(3, CCJSqlParserUtil.parseStatements( |
| 392 | + "SELECT " + literal + " FROM t; DELETE FROM u; SELECT " + literal + " FROM t") |
| 393 | + .size()); |
| 394 | + } |
| 395 | + |
| 396 | + @Test |
| 397 | + void testOracleAlternativeQuotingKeepsOneLiteralPerQuote() throws JSQLParserException { |
| 398 | + PlainSelect select = (PlainSelect) TestUtils |
| 399 | + .assertSqlCanBeParsedAndDeparsed("SELECT q'[a]' || q'[b]' FROM dual", true); |
| 400 | + |
| 401 | + Concat concat = (Concat) select.getSelectItem(0).getExpression(); |
| 402 | + assertEquals("[a]", ((StringValue) concat.getLeftExpression()).getValue()); |
| 403 | + assertEquals("[b]", ((StringValue) concat.getRightExpression()).getValue()); |
| 404 | + } |
| 405 | + |
| 406 | + @ParameterizedTest |
| 407 | + @CsvSource(delimiter = '|', quoteCharacter = '"', value = { |
| 408 | + "q'[a]b]'|[a]b]", |
| 409 | + "q'[a]]'|[a]]", |
| 410 | + "q'[]'|[]", |
| 411 | + "q'[]]'|[]]", |
| 412 | + "q'[it's]'|[it's]", |
| 413 | + "q'(a)b)'|(a)b)", |
| 414 | + "q'{a}}'|{a}}", |
| 415 | + "q''a'b''|'a'b'"}) |
| 416 | + void testOracleAlternativeQuotingBody(String literal, String value) |
| 417 | + throws JSQLParserException { |
| 418 | + PlainSelect select = (PlainSelect) TestUtils |
| 419 | + .assertSqlCanBeParsedAndDeparsed("SELECT " + literal + " FROM dual", true); |
| 420 | + |
| 421 | + assertEquals(value, ((StringValue) select.getSelectItem(0).getExpression()).getValue()); |
| 422 | + } |
| 423 | + |
372 | 424 | @Test |
373 | 425 | public void testParseInput_BYTEA() throws Exception { |
374 | 426 | String sqlStr = "VALUES (X'', X'01FF', X'01 bc 2a', X'01' '02')"; |
|
0 commit comments