|
43 | 43 | import net.sf.jsqlparser.expression.IntervalExpression; |
44 | 44 | import net.sf.jsqlparser.expression.JdbcNamedParameter; |
45 | 45 | import net.sf.jsqlparser.expression.JdbcParameter; |
| 46 | +import net.sf.jsqlparser.expression.JsonExpression; |
46 | 47 | import net.sf.jsqlparser.expression.LongValue; |
47 | 48 | import net.sf.jsqlparser.expression.NotExpression; |
48 | 49 | import net.sf.jsqlparser.expression.NullValue; |
|
60 | 61 | import net.sf.jsqlparser.expression.operators.relational.GreaterThan; |
61 | 62 | import net.sf.jsqlparser.expression.operators.relational.InExpression; |
62 | 63 | import net.sf.jsqlparser.expression.operators.relational.LikeExpression; |
| 64 | +import net.sf.jsqlparser.expression.operators.relational.ParenthesedExpressionList; |
63 | 65 | import net.sf.jsqlparser.parser.AbstractJSqlParser.Dialect; |
64 | 66 | import net.sf.jsqlparser.parser.CCJSqlParserManager; |
65 | 67 | import net.sf.jsqlparser.parser.CCJSqlParserUtil; |
@@ -1375,6 +1377,47 @@ public void testGroupBy() throws JSQLParserException { |
1375 | 1377 | assertStatementCanBeDeparsedAs(select, statement); |
1376 | 1378 | } |
1377 | 1379 |
|
| 1380 | + @Test |
| 1381 | + public void testIssue2485OracleParenthesizedFullyQualifiedGroupByColumn() |
| 1382 | + throws JSQLParserException { |
| 1383 | + String sql = "SELECT sys.dual.dummy, count(*)\n" |
| 1384 | + + "FROM sys.dual\n" |
| 1385 | + + "GROUP BY (sys.dual.dummy), (sys.dual.dummy)"; |
| 1386 | + |
| 1387 | + Statement statement = TestUtils.assertSqlCanBeParsedAndDeparsed(sql, true); |
| 1388 | + Select select = assertInstanceOf(Select.class, statement); |
| 1389 | + PlainSelect plainSelect = select.getPlainSelect(); |
| 1390 | + assertNotNull(plainSelect.getGroupBy()); |
| 1391 | + |
| 1392 | + ExpressionList<Expression> groupByExpressions = plainSelect.getGroupBy() |
| 1393 | + .getGroupByExpressionList(); |
| 1394 | + assertEquals(2, groupByExpressions.size()); |
| 1395 | + for (Expression groupByExpression : groupByExpressions) { |
| 1396 | + ParenthesedExpressionList<?> parenthesedExpression = assertInstanceOf( |
| 1397 | + ParenthesedExpressionList.class, groupByExpression); |
| 1398 | + Column column = assertInstanceOf(Column.class, parenthesedExpression.get(0)); |
| 1399 | + assertEquals("sys.dual.dummy", column.getFullyQualifiedName()); |
| 1400 | + } |
| 1401 | + } |
| 1402 | + |
| 1403 | + @Test |
| 1404 | + public void testIssue2485OracleParenthesizedFourPartGroupByColumn() |
| 1405 | + throws JSQLParserException { |
| 1406 | + String sql = "SELECT 1\n" |
| 1407 | + + "FROM sys.dual\n" |
| 1408 | + + "GROUP BY sys.dual.dummy, (catalog.sys.dual.dummy)"; |
| 1409 | + |
| 1410 | + Statement statement = TestUtils.assertSqlCanBeParsedAndDeparsed(sql, true); |
| 1411 | + Select select = assertInstanceOf(Select.class, statement); |
| 1412 | + ExpressionList<Expression> groupByExpressions = select.getPlainSelect().getGroupBy() |
| 1413 | + .getGroupByExpressionList(); |
| 1414 | + assertEquals(2, groupByExpressions.size()); |
| 1415 | + ParenthesedExpressionList<?> parenthesedExpression = assertInstanceOf( |
| 1416 | + ParenthesedExpressionList.class, groupByExpressions.get(1)); |
| 1417 | + Column column = assertInstanceOf(Column.class, parenthesedExpression.get(0)); |
| 1418 | + assertEquals("catalog.sys.dual.dummy", column.getFullyQualifiedName()); |
| 1419 | + } |
| 1420 | + |
1378 | 1421 | @Test |
1379 | 1422 | public void testHaving() throws JSQLParserException { |
1380 | 1423 | String statement = |
@@ -3205,6 +3248,13 @@ public void testJsonExpression() throws JSQLParserException { |
3205 | 3248 | assertSqlCanBeParsedAndDeparsed( |
3206 | 3249 | "SELECT json_typeof(sale->'items'), json_typeof(sale->'items'->'quantity') FROM sales"); |
3207 | 3250 |
|
| 3251 | + Select jsonSelect = (Select) CCJSqlParserUtil.parse("SELECT data->'images' FROM instagram"); |
| 3252 | + assertInstanceOf(JsonExpression.class, |
| 3253 | + jsonSelect.getPlainSelect().getSelectItem(0).getExpression()); |
| 3254 | + jsonSelect = (Select) CCJSqlParserUtil.parse("SELECT data->>'images' FROM instagram"); |
| 3255 | + assertInstanceOf(JsonExpression.class, |
| 3256 | + jsonSelect.getPlainSelect().getSelectItem(0).getExpression()); |
| 3257 | + |
3208 | 3258 | // The following staments can be parsed but not deparsed |
3209 | 3259 | for (String statement : new String[] { |
3210 | 3260 | "SELECT doc->'site_name' FROM websites WHERE doc @> '{\"tags\":[{\"term\":\"paris\"}, {\"term\":\"food\"}]}'", |
|
0 commit comments