Skip to content

Commit 5b209f5

Browse files
feat: SELECT piper operator to support ALL | DISTINCT
- fixes starlake-ai/jsqltranspiler#71 Signed-off-by: Andreas Reichel <andreas@manticore-projects.com>
1 parent 9b92cdf commit 5b209f5

File tree

7 files changed

+31
-10
lines changed

7 files changed

+31
-10
lines changed

src/main/java/net/sf/jsqlparser/statement/piped/ExtendPipeOperator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@
44

55
public class ExtendPipeOperator extends SelectPipeOperator {
66
public ExtendPipeOperator(SelectItem<?> selectItem) {
7-
super("EXTEND", selectItem);
7+
super("EXTEND", selectItem, null);
88
}
99
}

src/main/java/net/sf/jsqlparser/statement/piped/RenamePipeOperator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@
44

55
public class RenamePipeOperator extends SelectPipeOperator {
66
public RenamePipeOperator(SelectItem<?> selectItem) {
7-
super("RENAME", selectItem);
7+
super("RENAME", selectItem, null);
88
}
99
}

src/main/java/net/sf/jsqlparser/statement/piped/SelectPipeOperator.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,24 @@
66

77
public class SelectPipeOperator extends PipeOperator {
88
private final String operatorName;
9+
private final String modifier;
910

1011
private final ArrayList<SelectItem<?>> selectItems = new ArrayList<>();
1112

12-
public SelectPipeOperator(String operatorName, SelectItem<?> selectItem) {
13+
public SelectPipeOperator(String operatorName, SelectItem<?> selectItem, String modifier) {
1314
this.operatorName = operatorName;
15+
this.modifier = modifier;
1416
selectItems.add(selectItem);
1517
}
1618

17-
public SelectPipeOperator(SelectItem<?> selectItem) {
18-
this("SELECT", selectItem);
19-
}
20-
2119
public String getOperatorName() {
2220
return operatorName;
2321
}
2422

23+
public String getModifier() {
24+
return modifier;
25+
}
26+
2527
public ArrayList<SelectItem<?>> getSelectItems() {
2628
return selectItems;
2729
}
@@ -43,6 +45,10 @@ public <T, S> T accept(PipeOperatorVisitor<T, S> visitor, S context) {
4345
@Override
4446
public StringBuilder appendTo(StringBuilder builder) {
4547
builder.append("|> ").append(operatorName);
48+
if (modifier != null && !modifier.isEmpty()) {
49+
builder.append(" ").append(modifier);
50+
}
51+
4652
int i = 0;
4753
for (SelectItem<?> selectItem : selectItems) {
4854
builder.append(i++ > 0 ? ", " : " ").append(selectItem);

src/main/java/net/sf/jsqlparser/statement/piped/WindowPipeOperator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@
44

55
public class WindowPipeOperator extends SelectPipeOperator {
66
public WindowPipeOperator(SelectItem<?> selectItem) {
7-
super("WINDOW", selectItem);
7+
super("WINDOW", selectItem, null);
88
}
99
}

src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -980,6 +980,10 @@ public StringBuilder visit(RenamePipeOperator rename, Void context) {
980980
@Override
981981
public StringBuilder visit(SelectPipeOperator select, Void context) {
982982
builder.append("|> ").append(select.getOperatorName());
983+
if (select.getModifier() != null && !select.getModifier().isEmpty()) {
984+
builder.append(" ").append(select.getModifier());
985+
}
986+
983987
int i = 0;
984988
for (SelectItem<?> selectItem : select.getSelectItems()) {
985989
builder.append(i++ > 0 ? ", " : " ").append(selectItem);

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2424,12 +2424,13 @@ PipeOperator PipeOperator() #PipeOperator:
24242424
SelectPipeOperator SelectPipeOperator():
24252425
{
24262426
Token operatorKeyToken;
2427+
Token modifierToken = null;
24272428
SelectPipeOperator selectPipeOperator;
24282429
SelectItem<?> selectItem;
24292430
}
24302431
{
24312432
(
2432-
operatorKeyToken = <K_SELECT>
2433+
( operatorKeyToken = <K_SELECT> [ modifierToken=<K_DISTINCT> | modifierToken=<K_ALL> ] )
24332434
|
24342435
operatorKeyToken = <K_EXTEND>
24352436
|
@@ -2438,7 +2439,7 @@ SelectPipeOperator SelectPipeOperator():
24382439
operatorKeyToken = <K_RENAME>
24392440
)
24402441
selectItem = SelectItem()
2441-
{ selectPipeOperator = new SelectPipeOperator(operatorKeyToken.image, selectItem); }
2442+
{ selectPipeOperator = new SelectPipeOperator(operatorKeyToken.image, selectItem, modifierToken !=null ? modifierToken.image : null); }
24422443

24432444
( LOOKAHEAD(2) "," selectItem = SelectItem() { selectPipeOperator.add(selectItem); } )*
24442445

src/test/java/net/sf/jsqlparser/statement/piped/SelectPipeOperatorTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,14 @@ void testRename() throws JSQLParserException {
1414
+ "|> SELECT *, t.y AS t_y;";
1515
TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
1616
}
17+
18+
@Test
19+
void testDistinct() throws JSQLParserException {
20+
String sqlStr = "FROM orders\n" +
21+
"|> WHERE order_date >= '2024-01-01'\n" +
22+
"|> SELECT DISTINCT customer_id \n" +
23+
"|> INNER JOIN customers USING(customer_id)\n" +
24+
"|> SELECT *;";
25+
TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
26+
}
1727
}

0 commit comments

Comments
 (0)