Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
feat: Introduce allowUnparenthesizedSubSelects feature
  • Loading branch information
Stefan Steinhauser committed Jul 24, 2024
commit 345ec1be05b58d75e9a54ae1e18c2f96e4c6ec08
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,14 @@ public P withBackslashEscapeCharacter(boolean allowBackslashEscapeCharacter) {
return withFeature(Feature.allowBackslashEscapeCharacter, allowBackslashEscapeCharacter);
}

public P withUnparenthesizedSubSelects() {
return withFeature(Feature.allowUnparenthesizedSubSelects, true);
}

public P withUnparenthesizedSubSelects(boolean allowUnparenthesizedSubSelects) {
return withFeature(Feature.allowUnparenthesizedSubSelects, allowUnparenthesizedSubSelects);
}

public P withFeature(Feature f, boolean enabled) {
getConfiguration().setValue(f, enabled);
return me();
Expand Down
6 changes: 6 additions & 0 deletions src/main/java/net/sf/jsqlparser/parser/feature/Feature.java
Original file line number Diff line number Diff line change
Expand Up @@ -787,6 +787,12 @@ public enum Feature {
* allows Backslash '\' as Escape Character
*/
allowBackslashEscapeCharacter(false),

/**
* allows sub selects without parentheses, e.g.
* `select * from dual where 1 = select 1`
*/
allowUnparenthesizedSubSelects(false),
;

private final Object value;
Expand Down
6 changes: 3 additions & 3 deletions src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt
Original file line number Diff line number Diff line change
Expand Up @@ -4527,9 +4527,9 @@ Expression PrimaryExpression() #PrimaryExpression:

| "{ts" token=<S_CHAR_LITERAL> "}" { retval = new TimestampValue(token.image); }

| LOOKAHEAD( ParenthesedSelect() , {!interrupted} ) retval=ParenthesedSelect()
| LOOKAHEAD( Select() , { getAsBoolean(Feature.allowUnparenthesizedSubSelects) && !interrupted } ) retval=Select()

| LOOKAHEAD( Select() , {!interrupted} ) retval=Select()
| LOOKAHEAD( ParenthesedSelect() , { !getAsBoolean(Feature.allowUnparenthesizedSubSelects) && !interrupted } ) retval=ParenthesedSelect()

|
(
Expand Down Expand Up @@ -5619,7 +5619,7 @@ Function InternalFunction(boolean escaped):
(
LOOKAHEAD(3) expressionList=ExpressionList() [ orderByList = OrderByElements() { retval.setOrderByElements(orderByList); } ]
|
expr = Select() { expressionList = new ExpressionList(expr); }
LOOKAHEAD({ !getAsBoolean(Feature.allowUnparenthesizedSubSelects) }) expr = Select() { expressionList = new ExpressionList(expr); }
)
]

Expand Down
3 changes: 2 additions & 1 deletion src/test/java/net/sf/jsqlparser/expression/FunctionTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ void testSubSelectArrayWithoutKeywordParameter() throws JSQLParserException {
@Test
void testSubSelectParameterWithoutParentheses() throws JSQLParserException {
String sqlStr = "SELECT COALESCE(SELECT mycolumn FROM mytable, 0)";
TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true,
parser -> parser.withUnparenthesizedSubSelects(true));
}
}
11 changes: 11 additions & 0 deletions src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -5842,4 +5842,15 @@ void testGroupByWithHaving() throws JSQLParserException {
Statement stmt = assertSqlCanBeParsedAndDeparsed(sqlStr);
Assertions.assertInstanceOf(Select.class, stmt);
}

@ParameterizedTest
@ValueSource(strings = {
"SELECT SELECT 1",
"SELECT 1 WHERE 1 = SELECT 1",
"SELECT 1 WHERE 1 IN SELECT 1"
})
public void testUnparenthesizedSubSelect(String sqlStr) throws JSQLParserException {
TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true,
parser -> parser.withUnparenthesizedSubSelects(true));
}
}