Skip to content

Commit b8c0ed5

Browse files
fix: increase Max. Nesting Depth to 16 (from 10)
- fixes #2257 Signed-off-by: Andreas Reichel <[email protected]>
1 parent 6e91c3e commit b8c0ed5

File tree

4 files changed

+140
-7
lines changed

4 files changed

+140
-7
lines changed

src/main/java/net/sf/jsqlparser/parser/CCJSqlParserUtil.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
@SuppressWarnings("PMD.CyclomaticComplexity")
4141
public final class CCJSqlParserUtil {
4242
public final static Logger LOGGER = Logger.getLogger(CCJSqlParserUtil.class.getName());
43-
public final static int ALLOWED_NESTING_DEPTH = 10;
43+
public final static int ALLOWED_NESTING_DEPTH = 16;
4444

4545
static {
4646
LOGGER.setLevel(Level.OFF);

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5128,8 +5128,9 @@ ExpressionList ComplexExpressionList():
51285128
(
51295129
LOOKAHEAD(2) expr=OracleNamedFunctionParameter()
51305130
|
5131-
LOOKAHEAD( 6 ) expr=LambdaExpression()
5132-
| expr=Expression()
5131+
LOOKAHEAD(6) expr=LambdaExpression()
5132+
|
5133+
expr=Expression()
51335134
) { expressions.add(expr); }
51345135
)*
51355136

src/test/java/net/sf/jsqlparser/benchmark/JSQLParserBenchmark.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,7 @@ public void parseSQLStatements(Blackhole blackhole) throws Exception {
7777
final Statements statements = runner.parseStatements(
7878
sqlContent,
7979
executorService,
80-
(Consumer<CCJSqlParser>) parser -> {
81-
// No-op consumer (or you can log/validate each parser if desired)
82-
});
80+
(Consumer<CCJSqlParser>) parser -> parser.withAllowComplexParsing(false));
8381
blackhole.consume(statements);
8482
}
8583

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

Lines changed: 135 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6221,8 +6221,142 @@ void testIssue2242SubSelectLookAhead() throws JSQLParserException {
62216221
+ " ON CONFLICT (id) DO UPDATE\n"
62226222
+ " SET col4 = ?, col5 = ?, col6 = ?";
62236223
Statement statement = CCJSqlParserUtil.parse(sqlStr);
6224-
System.out.println(statement.toString());
62256224
Insert insert = (Insert) statement;
62266225
Assertions.assertEquals("foo", insert.getTable().toString());
62276226
}
6227+
6228+
@Test
6229+
void testIssue2255() throws JSQLParserException {
6230+
String sqlStr = "select\n"
6231+
+ " sum(if(log.\"output\" = 'SUCCESS', 1, 0)) success_req_num\n"
6232+
+ "from mysql_kt_plan.daily_cvmapi_runinstance_log log";
6233+
CCJSqlParserUtil.parse(sqlStr);
6234+
}
6235+
6236+
@Test
6237+
void testIssue2257() throws JSQLParserException {
6238+
String sqlStr = "SELECT sum(iif(diff = 7, lc_lv, 0)) AS lc_7\n"
6239+
+ "FROM ( SELECT a.day\n"
6240+
+ " , a.channel_type\n"
6241+
+ " , a.username\n"
6242+
+ " , a.diff\n"
6243+
+ " , a.cnt\n"
6244+
+ " , lc\n"
6245+
+ " , Cast( lc / cnt AS DECIMAL (38, 4) ) AS lc_lv\n"
6246+
+ " FROM ( SELECT a.day\n"
6247+
+ " , a.channel_type\n"
6248+
+ " , a.username\n"
6249+
+ " , Datediff( b.day, a.day )\n"
6250+
+ " + 1 AS diff\n"
6251+
+ " , cnt\n"
6252+
+ " , Count( DISTINCT b.user_id ) AS lc\n"
6253+
+ " FROM ( SELECT a.day\n"
6254+
+ " , a.user_id\n"
6255+
+ " , channel_id channel_type\n"
6256+
+ " , adtrace_adgroup_id AS username\n"
6257+
+ " FROM ( SELECT day\n"
6258+
+ " , a.user_id\n"
6259+
+ " , last_login_channel_id AS channel_id\n"
6260+
+ " , last_adtrace_adgroup_id AS adtrace_adgroup_id\n"
6261+
+ " FROM ( SELECT day\n"
6262+
+ " , user_id\n"
6263+
+ " , yidevice\n"
6264+
+ " FROM ( SELECT day\n"
6265+
+ " , user_id\n"
6266+
+ " , yidevice\n"
6267+
+ " , Row_Number( )\n"
6268+
+ " OVER (PARTITION BY day, user_id ORDER BY event_time) AS rk\n"
6269+
+ " FROM dwd_table.event_pj\n"
6270+
+ " WHERE day BETWEEN '2025-05-30'\n"
6271+
+ " AND '2025-06-06'\n"
6272+
+ " AND event_id = 'device_login'\n"
6273+
+ " AND yidevice IS NOT NULL\n"
6274+
+ " AND yidevice != '' ) a\n"
6275+
+ " WHERE rk = 1 ) a\n"
6276+
+ " LEFT JOIN ( SELECT DISTINCT\n"
6277+
+ " From_Unixtime( Cast( ( Cast( last_adtrace_time AS BIGINT ) + 28800000 ) / 1000 AS BIGINT ), 'yyyy-MM-dd' ) AS last_adtrace_dt\n"
6278+
+ " , yidevice\n"
6279+
+ " , last_login_channel_id\n"
6280+
+ " , last_adtrace_adgroup_id\n"
6281+
+ " , last_adtrace_creative_id\n"
6282+
+ " FROM dwd_user.yidevice_pj\n"
6283+
+ " WHERE Cast( adtrace_reattributed_times AS INT ) > 0\n"
6284+
+ " AND Datediff( From_Unixtime( Cast( ( Cast( last_adtrace_time AS BIGINT ) + 28800000 ) / 1000 AS BIGINT ), 'yyyy-MM-dd' ), create_date ) >= 30\n"
6285+
+ " AND From_Unixtime( Cast( ( Cast( last_adtrace_time AS BIGINT ) + 28800000 ) / 1000 AS BIGINT ), 'yyyy-MM-dd' ) BETWEEN '2025-05-30'\n"
6286+
+ " AND '2025-06-06' ) b\n"
6287+
+ " ON a.day = b.last_adtrace_dt\n"
6288+
+ " AND a.yidevice = b.yidevice ) a ) a\n"
6289+
+ " LEFT JOIN ( SELECT day\n"
6290+
+ " , user_id\n"
6291+
+ " FROM dwd_table.event_pj\n"
6292+
+ " WHERE day BETWEEN '2025-05-30'\n"
6293+
+ " AND '2025-06-06'\n"
6294+
+ " AND event_id = 'login'\n"
6295+
+ " GROUP BY day\n"
6296+
+ " , user_id ) b\n"
6297+
+ " ON a.user_id = b.user_id\n"
6298+
+ " LEFT JOIN ( SELECT a.day\n"
6299+
+ " , channel_type\n"
6300+
+ " , username\n"
6301+
+ " , Count( DISTINCT a.user_id ) AS cnt\n"
6302+
+ " FROM ( SELECT a.day\n"
6303+
+ " , a.user_id\n"
6304+
+ " , channel_id AS channel_type\n"
6305+
+ " , adtrace_adgroup_id username\n"
6306+
+ " FROM ( SELECT day\n"
6307+
+ " , a.user_id\n"
6308+
+ " , last_login_channel_id AS channel_id\n"
6309+
+ " , last_adtrace_adgroup_id AS adtrace_adgroup_id\n"
6310+
+ " FROM ( SELECT day\n"
6311+
+ " , user_id\n"
6312+
+ " , yidevice\n"
6313+
+ " FROM ( SELECT day\n"
6314+
+ " , user_id\n"
6315+
+ " , yidevice\n"
6316+
+ " , Row_Number( )\n"
6317+
+ " OVER (PARTITION BY day, user_id ORDER BY event_time) AS rk\n"
6318+
+ " FROM dwd_table.event_pj\n"
6319+
+ " WHERE day BETWEEN '2025-05-30'\n"
6320+
+ " AND '2025-06-06'\n"
6321+
+ " AND event_id = 'device_login'\n"
6322+
+ " AND yidevice IS NOT NULL\n"
6323+
+ " AND yidevice != '' ) a\n"
6324+
+ " WHERE rk = 1 ) a\n"
6325+
+ " LEFT JOIN ( SELECT DISTINCT\n"
6326+
+ " From_Unixtime( Cast( ( Cast( last_adtrace_time AS BIGINT ) + 28800000 ) / 1000 AS BIGINT ), 'yyyy-MM-dd' ) AS last_adtrace_dt\n"
6327+
+ " , yidevice\n"
6328+
+ " , last_login_channel_id\n"
6329+
+ " , last_adtrace_adgroup_id\n"
6330+
+ " , last_adtrace_creative_id\n"
6331+
+ " FROM dwd_user.yidevice_pj\n"
6332+
+ " WHERE Cast( adtrace_reattributed_times AS INT ) > 0\n"
6333+
+ " AND Datediff( From_Unixtime( Cast( ( Cast( last_adtrace_time AS BIGINT ) + 28800000 ) / 1000 AS BIGINT ), 'yyyy-MM-dd' ), create_date ) >= 30\n"
6334+
+ " AND From_Unixtime( Cast( ( Cast( last_adtrace_time AS BIGINT ) + 28800000 ) / 1000 AS BIGINT ), 'yyyy-MM-dd' ) BETWEEN '2025-05-30'\n"
6335+
+ " AND '2025-06-06' ) b\n"
6336+
+ " ON a.day = b.last_adtrace_dt\n"
6337+
+ " AND a.yidevice = b.yidevice ) a ) a\n"
6338+
+ " GROUP BY a.day\n"
6339+
+ " , channel_type\n"
6340+
+ " , username ) c\n"
6341+
+ " ON a.day = c.day\n"
6342+
+ " AND a.channel_type = c.channel_type\n"
6343+
+ " AND a.username = c.username\n"
6344+
+ " GROUP BY a.day\n"
6345+
+ " , a.channel_type\n"
6346+
+ " , a.username\n"
6347+
+ " , diff\n"
6348+
+ " , cnt ) a\n"
6349+
+ " WHERE diff > 1\n"
6350+
+ " AND diff <= 7 ) a\n"
6351+
+ "GROUP BY username\n"
6352+
+ " , channel_type\n"
6353+
+ " , day\n"
6354+
+ " , cnt\n"
6355+
+ "ORDER BY username DESC\n"
6356+
+ " , channel_type\n"
6357+
+ " , day DESC\n"
6358+
+ ";";
6359+
TestUtils.assertSqlCanBeParsedAndDeparsed(
6360+
sqlStr, true, parser -> parser.withAllowComplexParsing(true));
6361+
}
62286362
}

0 commit comments

Comments
 (0)