Skip to content

Commit

Permalink
feat: AllColumns, DuckDB uses EXCLUDE instead of EXCEPT
Browse files Browse the repository at this point in the history
Signed-off-by: Andreas Reichel <andreas@manticore-projects.com>
  • Loading branch information
manticore-projects committed Jun 10, 2024
1 parent f4b40e4 commit 1ad4234
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 4 deletions.
20 changes: 19 additions & 1 deletion src/main/java/net/sf/jsqlparser/statement/select/AllColumns.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,20 @@
public class AllColumns extends ASTNodeAccessImpl implements Expression {
protected ExpressionList<Column> exceptColumns;
protected List<SelectItem<Column>> replaceExpressions;
private String exceptKeyword;

public AllColumns(ExpressionList<Column> exceptColumns,
List<SelectItem<Column>> replaceExpressions) {
this.exceptColumns = exceptColumns;
this.replaceExpressions = replaceExpressions;
this.exceptKeyword = exceptColumns !=null ? "Except" : null;
}

public AllColumns(ExpressionList<Column> exceptColumns,
List<SelectItem<Column>> replaceExpressions, String exceptKeyword) {
this.exceptColumns = exceptColumns;
this.replaceExpressions = replaceExpressions;
this.exceptKeyword = exceptKeyword;
}

public AllColumns() {
Expand Down Expand Up @@ -66,10 +75,19 @@ public AllColumns setReplaceExpressions(List<SelectItem<Column>> replaceExpressi
return this;
}

public String getExceptKeyword() {
return exceptKeyword;
}

public AllColumns setExceptKeyword(String exceptKeyword) {
this.exceptKeyword = exceptKeyword;
return this;
}

public StringBuilder appendTo(StringBuilder builder) {
builder.append("*");
if (exceptColumns != null && !exceptColumns.isEmpty()) {
builder.append(" Except( ");
builder.append(" ").append(exceptKeyword).append("( ");
exceptColumns.appendTo(builder);
builder.append(" )");
}
Expand Down
6 changes: 4 additions & 2 deletions src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt
Original file line number Diff line number Diff line change
Expand Up @@ -2632,14 +2632,16 @@ AllColumns AllColumns():
{
ParenthesedExpressionList<Column> exceptColumns = null;
List<SelectItem<Column>> replaceExpressions = null;
String exceptKeyword=null;
Token tk;
}
{
"*"
[ LOOKAHEAD(2) <K_EXCEPT> exceptColumns = ParenthesedColumnList() ]
[ LOOKAHEAD(2) ( tk=<K_EXCEPT> | tk=<K_EXCLUDE> ) exceptColumns = ParenthesedColumnList() { exceptKeyword=tk.image; } ]
[ LOOKAHEAD(2) <K_REPLACE> "(" replaceExpressions = ColumnSelectItemsList() ")" ]

{
return new AllColumns(exceptColumns, replaceExpressions);
return new AllColumns(exceptColumns, replaceExpressions, exceptKeyword);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,15 @@ class AllColumnsTest {
@Test
void testBigQuerySyntax() throws JSQLParserException {
String sqlStr =
"SELECT * EXCEPT (order_id) REPLACE (\"widget\" AS item_name), \"more\" as more_fields\n"
"SELECT * EXCEPT(order_id) REPLACE(\"widget\" AS item_name), \"more\" as more_fields\n"
+ "FROM orders";
TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
}

@Test
void testDuckDBQuerySyntax() throws JSQLParserException {
String sqlStr =
"SELECT * EXCLUDE(order_id) REPLACE(\"widget\" AS item_name), \"more\" as more_fields\n"
+ "FROM orders";
TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
}
Expand Down

0 comments on commit 1ad4234

Please sign in to comment.