Skip to content

Commit b5525e0

Browse files
committed
add collate parsing and tests for order by
1 parent 6b35e37 commit b5525e0

File tree

2 files changed

+58
-0
lines changed

2 files changed

+58
-0
lines changed

src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5152,9 +5152,11 @@ OrderByElement OrderByElement():
51525152
{
51535153
OrderByElement orderByElement = new OrderByElement();
51545154
Expression columnReference = null;
5155+
Token collateToken = null;
51555156
}
51565157
{
51575158
columnReference = Expression()
5159+
[ LOOKAHEAD(<K_COLLATE>) <K_COLLATE> (collateToken=<S_CHAR_LITERAL> | collateToken=<S_QUOTED_IDENTIFIER>) { columnReference = new CollateExpression(columnReference, collateToken.image); } ]
51585160
[ LOOKAHEAD(2) ( <K_ASC> | (<K_DESC> { orderByElement.setAsc(false); } )) { orderByElement.setAscDescPresent(true); } ]
51595161
[ LOOKAHEAD(2) <K_NULLS>
51605162
[ LOOKAHEAD(2) (
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package net.sf.jsqlparser.statement.select;
2+
3+
import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed;
4+
import static org.junit.jupiter.api.Assertions.assertEquals;
5+
import static org.junit.jupiter.api.Assertions.assertNotNull;
6+
7+
import net.sf.jsqlparser.JSQLParserException;
8+
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
9+
import net.sf.jsqlparser.expression.CollateExpression;
10+
import org.junit.jupiter.api.Test;
11+
12+
public class OrderByCollateTest {
13+
14+
@Test
15+
public void testOrderByWithCollate() throws JSQLParserException {
16+
String sql = "SELECT * FROM a ORDER BY CAST(a.xyz AS TEXT) COLLATE \"und-x-icu\" ASC NULLS FIRST";
17+
assertSqlCanBeParsedAndDeparsed(sql);
18+
}
19+
20+
@Test
21+
public void testOrderByWithCollateSimple() throws JSQLParserException {
22+
String sql = "SELECT * FROM a ORDER BY col COLLATE \"C\" ASC";
23+
assertSqlCanBeParsedAndDeparsed(sql);
24+
}
25+
26+
@Test
27+
public void testOrderByWithCollateMultiple() throws JSQLParserException {
28+
String sql = "SELECT * FROM a ORDER BY col1 COLLATE \"C\" ASC, col2 COLLATE \"POSIX\" DESC";
29+
assertSqlCanBeParsedAndDeparsed(sql);
30+
}
31+
32+
@Test
33+
public void testOrderByWithCollateAndNulls() throws JSQLParserException {
34+
String sql = "SELECT * FROM a ORDER BY col COLLATE \"C\" DESC NULLS LAST";
35+
assertSqlCanBeParsedAndDeparsed(sql);
36+
}
37+
38+
@Test
39+
public void testOrderByCollateStructure() throws JSQLParserException {
40+
String sql = "SELECT * FROM a ORDER BY col COLLATE \"C\" ASC";
41+
Select select = (Select) CCJSqlParserUtil.parse(sql);
42+
PlainSelect plainSelect = (PlainSelect) select;
43+
44+
assertNotNull(plainSelect.getOrderByElements());
45+
assertEquals(1, plainSelect.getOrderByElements().size());
46+
47+
OrderByElement orderByElement = plainSelect.getOrderByElements().get(0);
48+
assertNotNull(orderByElement.getExpression());
49+
50+
// The expression should be a CollateExpression
51+
if (orderByElement.getExpression() instanceof CollateExpression) {
52+
CollateExpression collateExpr = (CollateExpression) orderByElement.getExpression();
53+
assertEquals("\"C\"", collateExpr.getCollate());
54+
}
55+
}
56+
}

0 commit comments

Comments
 (0)