Skip to content

Commit 5f929d2

Browse files
committed
fix: default wildcard exclusions to EXCEPT
1 parent 0036c75 commit 5f929d2

2 files changed

Lines changed: 60 additions & 4 deletions

File tree

src/main/java/net/sf/jsqlparser/statement/select/AllColumns.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,14 @@
99
*/
1010
package net.sf.jsqlparser.statement.select;
1111

12+
import java.util.ArrayList;
13+
import java.util.List;
1214
import net.sf.jsqlparser.expression.Expression;
1315
import net.sf.jsqlparser.expression.ExpressionVisitor;
1416
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
1517
import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
1618
import net.sf.jsqlparser.schema.Column;
1719

18-
import java.util.ArrayList;
19-
import java.util.List;
20-
2120
public class AllColumns extends ASTNodeAccessImpl implements Expression {
2221
protected ExpressionList<Column> exceptColumns;
2322
protected List<SelectItem<?>> replaceExpressions;
@@ -87,7 +86,8 @@ public AllColumns setExceptKeyword(String exceptKeyword) {
8786
public StringBuilder appendTo(StringBuilder builder) {
8887
builder.append("*");
8988
if (exceptColumns != null && !exceptColumns.isEmpty()) {
90-
builder.append(" ").append(exceptKeyword).append("( ");
89+
builder.append(" ").append(exceptKeyword == null ? "EXCEPT" : exceptKeyword)
90+
.append("( ");
9191
exceptColumns.appendTo(builder);
9292
builder.append(" )");
9393
}

src/test/java/net/sf/jsqlparser/statement/select/AllColumnsTest.java

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,15 @@
99
*/
1010
package net.sf.jsqlparser.statement.select;
1111

12+
import static net.sf.jsqlparser.test.TestUtils.assertDeparse;
13+
import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed;
14+
import static org.junit.jupiter.api.Assertions.assertEquals;
15+
1216
import net.sf.jsqlparser.JSQLParserException;
17+
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
18+
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
19+
import net.sf.jsqlparser.schema.Column;
20+
import net.sf.jsqlparser.schema.Table;
1321
import net.sf.jsqlparser.test.TestUtils;
1422
import org.junit.jupiter.api.Test;
1523

@@ -31,4 +39,52 @@ void testDuckDBQuerySyntax() throws JSQLParserException {
3139
+ "FROM orders";
3240
TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
3341
}
42+
43+
@Test
44+
void addExceptColumnToNewWildcard() throws JSQLParserException {
45+
AllColumns columns = new AllColumns();
46+
columns.addExceptColumn(new Column("hidden"));
47+
PlainSelect select = new PlainSelect().addSelectItem(columns).withFromItem(new Table("t"));
48+
49+
String expected = "SELECT * EXCEPT( hidden ) FROM t";
50+
assertEquals(expected, select.toString());
51+
assertDeparse(select, expected);
52+
assertSqlCanBeParsedAndDeparsed(expected);
53+
}
54+
55+
@Test
56+
void setExceptColumnsOnParsedWildcard() throws JSQLParserException {
57+
PlainSelect select = (PlainSelect) CCJSqlParserUtil.parse("SELECT * FROM t");
58+
AllColumns columns = select.getSelectItem(0).getExpression(AllColumns.class);
59+
columns.setExceptColumns(new ExpressionList<>(new Column("hidden")));
60+
61+
String expected = "SELECT * EXCEPT( hidden ) FROM t";
62+
assertEquals(expected, select.toString());
63+
assertDeparse(select, expected);
64+
assertSqlCanBeParsedAndDeparsed(expected);
65+
}
66+
67+
@Test
68+
void addExceptColumnToParsedTableWildcard() throws JSQLParserException {
69+
PlainSelect select = (PlainSelect) CCJSqlParserUtil.parse("SELECT t.* FROM t");
70+
AllTableColumns columns = select.getSelectItem(0).getExpression(AllTableColumns.class);
71+
columns.addExceptColumn(new Column("hidden"));
72+
73+
String expected = "SELECT t.* EXCEPT( hidden ) FROM t";
74+
assertEquals(expected, select.toString());
75+
assertDeparse(select, expected);
76+
assertSqlCanBeParsedAndDeparsed(expected);
77+
}
78+
79+
@Test
80+
void preserveExplicitExceptKeywordAndEmptyColumns() {
81+
AllColumns columns = new AllColumns().setExceptKeyword("EXCLUDE");
82+
columns.addExceptColumn(new Column("hidden"));
83+
assertEquals("* EXCLUDE( hidden )", columns.toString());
84+
85+
columns.setExceptColumns(new ExpressionList<>());
86+
assertEquals("*", columns.toString());
87+
columns.setExceptColumns(null);
88+
assertEquals("*", columns.toString());
89+
}
3490
}

0 commit comments

Comments
 (0)