diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 35238b44e..970bb4fca 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -5152,9 +5152,11 @@ OrderByElement OrderByElement(): { OrderByElement orderByElement = new OrderByElement(); Expression columnReference = null; + Token collateToken = null; } { columnReference = Expression() + [ LOOKAHEAD() (collateToken= | collateToken=) { columnReference = new CollateExpression(columnReference, collateToken.image); } ] [ LOOKAHEAD(2) ( | ( { orderByElement.setAsc(false); } )) { orderByElement.setAscDescPresent(true); } ] [ LOOKAHEAD(2) [ LOOKAHEAD(2) ( diff --git a/src/test/java/net/sf/jsqlparser/statement/select/OrderByCollateTest.java b/src/test/java/net/sf/jsqlparser/statement/select/OrderByCollateTest.java new file mode 100644 index 000000000..6615ce5cc --- /dev/null +++ b/src/test/java/net/sf/jsqlparser/statement/select/OrderByCollateTest.java @@ -0,0 +1,33 @@ +package net.sf.jsqlparser.statement.select; + +import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed; + +import net.sf.jsqlparser.JSQLParserException; +import org.junit.jupiter.api.Test; + +public class OrderByCollateTest { + + @Test + public void testOrderByWithCollate() throws JSQLParserException { + String sql = "SELECT * FROM a ORDER BY CAST(a.xyz AS TEXT) COLLATE \"und-x-icu\" ASC NULLS FIRST"; + assertSqlCanBeParsedAndDeparsed(sql); + } + + @Test + public void testOrderByWithCollateSimple() throws JSQLParserException { + String sql = "SELECT * FROM a ORDER BY col COLLATE \"C\" ASC"; + assertSqlCanBeParsedAndDeparsed(sql); + } + + @Test + public void testOrderByWithCollateMultiple() throws JSQLParserException { + String sql = "SELECT * FROM a ORDER BY col1 COLLATE \"C\" ASC, col2 COLLATE \"POSIX\" DESC"; + assertSqlCanBeParsedAndDeparsed(sql); + } + + @Test + public void testOrderByWithCollateAndNulls() throws JSQLParserException { + String sql = "SELECT * FROM a ORDER BY col COLLATE \"C\" DESC NULLS LAST"; + assertSqlCanBeParsedAndDeparsed(sql); + } +} \ No newline at end of file