Skip to content

Commit 8810c01

Browse files
authored
feat(parser): allow COLLATE in ORDER BY clauses (issue #2245) (#2277)
* add collate parsing and tests for order by * rm unnecessary test * add quoted identifier for "und-x-icu"
1 parent 468aefa commit 8810c01

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5204,9 +5204,11 @@ OrderByElement OrderByElement():
52045204
{
52055205
OrderByElement orderByElement = new OrderByElement();
52065206
Expression columnReference = null;
5207+
Token collateToken = null;
52075208
}
52085209
{
52095210
columnReference = Expression()
5211+
[ LOOKAHEAD(<K_COLLATE>) <K_COLLATE> (collateToken=<S_CHAR_LITERAL> | collateToken=<S_QUOTED_IDENTIFIER>) { columnReference = new CollateExpression(columnReference, collateToken.image); } ]
52105212
[ LOOKAHEAD(2) ( <K_ASC> | (<K_DESC> { orderByElement.setAsc(false); } )) { orderByElement.setAscDescPresent(true); } ]
52115213
[ LOOKAHEAD(2) <K_NULLS>
52125214
[ LOOKAHEAD(2) (
@@ -6503,7 +6505,7 @@ Expression PrimaryExpression() #PrimaryExpression:
65036505
)
65046506

65056507
[
6506-
LOOKAHEAD(2) <K_COLLATE> token=<S_IDENTIFIER> { retval = new CollateExpression(retval, token.image); }
6508+
LOOKAHEAD(2) <K_COLLATE> (token=<S_CHAR_LITERAL> | token=<S_QUOTED_IDENTIFIER> | token=<S_IDENTIFIER>) { retval = new CollateExpression(retval, token.image); }
65076509
]
65086510

65096511
[
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package net.sf.jsqlparser.statement.select;
2+
3+
import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed;
4+
5+
import net.sf.jsqlparser.JSQLParserException;
6+
import org.junit.jupiter.api.Test;
7+
8+
public class OrderByCollateTest {
9+
10+
@Test
11+
public void testOrderByWithCollate() throws JSQLParserException {
12+
String sql = "SELECT * FROM a ORDER BY CAST(a.xyz AS TEXT) COLLATE \"und-x-icu\" ASC NULLS FIRST";
13+
assertSqlCanBeParsedAndDeparsed(sql);
14+
}
15+
16+
@Test
17+
public void testOrderByWithCollateSimple() throws JSQLParserException {
18+
String sql = "SELECT * FROM a ORDER BY col COLLATE \"C\" ASC";
19+
assertSqlCanBeParsedAndDeparsed(sql);
20+
}
21+
22+
@Test
23+
public void testOrderByWithCollateMultiple() throws JSQLParserException {
24+
String sql = "SELECT * FROM a ORDER BY col1 COLLATE \"C\" ASC, col2 COLLATE \"POSIX\" DESC";
25+
assertSqlCanBeParsedAndDeparsed(sql);
26+
}
27+
28+
@Test
29+
public void testOrderByWithCollateAndNulls() throws JSQLParserException {
30+
String sql = "SELECT * FROM a ORDER BY col COLLATE \"C\" DESC NULLS LAST";
31+
assertSqlCanBeParsedAndDeparsed(sql);
32+
}
33+
}

0 commit comments

Comments
 (0)