Я хочу, чтобы любой запрос SQL анализировался иерархически, как это делает CCJSqlParserUtil.parseAST
. Но если я не ошибаюсь, эта функция поддерживает только несколько видов SQL-запросов, таких как запрос на выборку. Когда я применил его для запросов на обновление, это не сработало.
Я думаю, что другие способы анализа в JSqlparser не могут помочь, потому что мне также нужно знать позиции всех токенов.
Это фрагмент, который может показать, что я хочу сделать с этим синтаксическим анализатором:
String sql ="UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing'\n"
+ "WHERE LastName = 'Wilson';"; // even nicer if multiple queries can be parsed without being splitted
final StringBuilder b = new StringBuilder(sql);
SimpleNode node = (SimpleNode) CCJSqlParserUtil.parseAST(sql);
node.dump("*");
node.jjtAccept(
new CCJSqlParserDefaultVisitor() {
@Override
public Object visit(SimpleNode node, Object data) {
logger.info(
node.jjtGetValue()
+ ","
+ node.jjtGetFirstToken().beginLine
+ ","
+ (node.jjtGetFirstToken().beginColumn - 1));
logger.info(
node.jjtGetValue()
+ ","
+ node.jjtGetLastToken().endLine
+ ","
+ (node.jjtGetLastToken().endColumn - 1));
return super.visit(node, data);
}
},
null);
Просто задайте вопрос на github, какой токен также требует подключения AST. Мы обсудим это улучшение там.