2222import org .antlr .v4 .runtime .dfa .DFA ;
2323import org .antlr .v4 .runtime .misc .Pair ;
2424import org .antlr .v4 .runtime .tree .TerminalNode ;
25+ import org .apache .logging .log4j .LogManager ;
2526import org .apache .logging .log4j .Logger ;
26- import org .elasticsearch .common .logging .Loggers ;
2727import org .elasticsearch .xpack .sql .expression .Expression ;
2828import org .elasticsearch .xpack .sql .plan .logical .LogicalPlan ;
2929import org .elasticsearch .xpack .sql .proto .SqlTypedParamValue ;
4141import static java .lang .String .format ;
4242
4343public class SqlParser {
44- private static final Logger log = Loggers .getLogger (SqlParser .class );
44+
45+ private static final Logger log = LogManager .getLogger ();
4546
4647 private final boolean DEBUG = false ;
4748
@@ -62,7 +63,7 @@ public LogicalPlan createStatement(String sql, List<SqlTypedParamValue> params)
6263 if (log .isDebugEnabled ()) {
6364 log .debug ("Parsing as statement: {}" , sql );
6465 }
65- return invokeParser (sql , params , SqlBaseParser ::singleStatement , AstBuilder ::plan );
66+ return invokeParser ("statement" , sql , params , SqlBaseParser ::singleStatement , AstBuilder ::plan );
6667 }
6768
6869 /**
@@ -80,10 +81,13 @@ public Expression createExpression(String expression, List<SqlTypedParamValue> p
8081 log .debug ("Parsing as expression: {}" , expression );
8182 }
8283
83- return invokeParser (expression , params , SqlBaseParser ::singleExpression , AstBuilder ::expression );
84+ return invokeParser ("expression" , expression , params , SqlBaseParser ::singleExpression , AstBuilder ::expression );
8485 }
8586
86- private <T > T invokeParser (String sql , List <SqlTypedParamValue > params , Function <SqlBaseParser , ParserRuleContext > parseFunction ,
87+ private <T > T invokeParser (String name ,
88+ String sql ,
89+ List <SqlTypedParamValue > params , Function <SqlBaseParser ,
90+ ParserRuleContext > parseFunction ,
8791 BiFunction <AstBuilder , ParserRuleContext , T > visitor ) {
8892 SqlBaseLexer lexer = new SqlBaseLexer (new CaseInsensitiveStream (sql ));
8993
@@ -122,10 +126,14 @@ private <T> T invokeParser(String sql, List<SqlTypedParamValue> params, Function
122126 log .info ("Parse tree {} " + tree .toStringTree ());
123127 }
124128
125- return visitor .apply (new AstBuilder (paramTokens ), tree );
129+ try {
130+ return visitor .apply (new AstBuilder (paramTokens ), tree );
131+ } catch (StackOverflowError e ) {
132+ throw new ParsingException ("{} is too large to parse (causes stack overflow)" , name );
133+ }
126134 }
127135
128- private void debug (SqlBaseParser parser ) {
136+ private static void debug (SqlBaseParser parser ) {
129137
130138 // when debugging, use the exact prediction mode (needed for diagnostics as well)
131139 parser .getInterpreter ().setPredictionMode (PredictionMode .LL_EXACT_AMBIG_DETECTION );
0 commit comments