@@ -138,14 +138,57 @@ public void testMultiMatchQuery() {
138138 assertThat (mmqp .optionMap (), hasEntry ("fuzzy_rewrite" , "scoring_boolean" ));
139139 }
140140
141- public void testLimitToPreventStackOverflowFromLargeBooleanExpression () {
142- // 1000 elements is ok
143- new SqlParser ().createExpression (Joiner .on (" OR " ).join (nCopies (1000 , "a = b" )));
141+ public void testLimitToPreventStackOverflowFromLargeUnaryBooleanExpression () {
142+ // 100 elements is ok
143+ new SqlParser ().createExpression (
144+ Joiner .on ("NOT(" ).join (nCopies (100 , "true" )).concat (Joiner .on ("" ).join (nCopies (99 , ")" ))));
144145
145- // 1001 elements parser's "circuit breaker" is triggered
146+ // 500 elements parser's "circuit breaker" is triggered
147+ ParsingException e = expectThrows (ParsingException .class , () -> new SqlParser ().createExpression (
148+ Joiner .on ("NOT(" ).join (nCopies (101 , "true" )).concat (Joiner .on ("" ).join (nCopies (100 , ")" )))));
149+ assertEquals ("expression is too large to parse, (tree's depth exceeds 100)" , e .getErrorMessage ());
150+ }
151+
152+ public void testLimitToPreventStackOverflowFromLargeBinaryBooleanExpression () {
153+ // 100 elements is ok
154+ new SqlParser ().createExpression (Joiner .on (" OR " ).join (nCopies (100 , "true" )));
155+
156+ // 101 elements parser's "circuit breaker" is triggered
146157 ParsingException e = expectThrows (ParsingException .class , () ->
147- new SqlParser ().createExpression (Joiner .on (" OR " ).join (nCopies (1001 , "a = b" ))));
148- assertEquals ("boolean expression is too large to parse, (exceeds 1000 elements)" , e .getErrorMessage ());
158+ new SqlParser ().createExpression (Joiner .on (" OR " ).join (nCopies (101 , "a = b" ))));
159+ assertEquals ("expression is too large to parse, (tree's depth exceeds 100)" , e .getErrorMessage ());
160+ }
161+
162+ public void testLimitToPreventStackOverflowFromLargeUnaryArithmeticExpression () {
163+ // 100 elements is ok
164+ new SqlParser ().createExpression (
165+ Joiner .on ("abs(" ).join (nCopies (100 , "i" )).concat (Joiner .on ("" ).join (nCopies (99 , ")" ))));
166+
167+ // 101 elements parser's "circuit breaker" is triggered
168+ ParsingException e = expectThrows (ParsingException .class , () -> new SqlParser ().createExpression (
169+ Joiner .on ("abs(" ).join (nCopies (101 , "i" )).concat (Joiner .on ("" ).join (nCopies (100 , ")" )))));
170+ assertEquals ("expression is too large to parse, (tree's depth exceeds 100)" , e .getErrorMessage ());
171+ }
172+
173+ public void testLimitToPreventStackOverflowFromLargeBinaryArithmeticExpression () {
174+ // 100 elements is ok
175+ new SqlParser ().createExpression (Joiner .on (" + " ).join (nCopies (100 , "a" )));
176+
177+ // 101 elements parser's "circuit breaker" is triggered
178+ ParsingException e = expectThrows (ParsingException .class , () ->
179+ new SqlParser ().createExpression (Joiner .on (" + " ).join (nCopies (101 , "a" ))));
180+ assertEquals ("expression is too large to parse, (tree's depth exceeds 100)" , e .getErrorMessage ());
181+ }
182+
183+ public void testLimitToPreventStackOverflowFromLargeSubselectTree () {
184+ // 100 elements is ok
185+ new SqlParser ().createStatement (
186+ Joiner .on (" (" ).join (nCopies (100 , "SELECT * FROM" )).concat ("t" ).concat (Joiner .on ("" ).join (nCopies (99 , ")" ))));
187+
188+ // 101 elements parser's "circuit breaker" is triggered
189+ ParsingException e = expectThrows (ParsingException .class , () -> new SqlParser ().createStatement (
190+ Joiner .on (" (" ).join (nCopies (101 , "SELECT * FROM" )).concat ("t" ).concat (Joiner .on ("" ).join (nCopies (100 , ")" )))));
191+ assertEquals ("expression is too large to parse, (tree's depth exceeds 100)" , e .getErrorMessage ());
149192 }
150193
151194 private LogicalPlan parseStatement (String sql ) {
0 commit comments