gpt4 book ai didi

java - 使用 JSqlParser 查找 SQL 查询中标记的位置

转载 作者:行者123 更新时间:2023-11-30 06:29:13 28 4
gpt4 key购买 nike

我正在尝试使用 JSqlParser 在 SQL 查询中查找 SQL 对象( token ?)的位置(行就足够了)。

例如,在查询中:

SELECT a
FROM table
WHERE a = 1 AND
b = 2 AND
c = 3

当查看表达式 b = 2 时,我希望能够知道它位于第 4 行。或者,当查看 SelectItem“a”时,我希望知道它位于第 1 行。

在文档或对象本身中没有看到任何有关其位置的内容。如果目前不可能,您能否建议我自己添加此功能的好方法(就性能而言最简单、最快)。

最佳答案

如果没有 JSqlParser 的修补版本,您就不能这样做。目前,JSqlParser V1.2-SNAPSHOT 确实为您提供了 AST - 某些特定解析 token 的节点信息,但不是全部。使用以下代码进行截图:

public static void main(String[] args) throws JSQLParserException {
String sql = "SELECT a\n"
+ "FROM table\n"
+ "WHERE a = 1 AND\n"
+ " b = 2 AND\n"
+ " c = 3";

SimpleNode node = (SimpleNode) CCJSqlParserUtil.parseAST(sql);

node.jjtAccept(new CCJSqlParserDefaultVisitor() {
@Override
public Object visit(SimpleNode node, Object data) {
System.out.println(node.toString() + " firstToken=" + node.jjtGetFirstToken().image
+ " line=" + node.jjtGetFirstToken().beginLine);
return super.visit(node, data);
}
}, null);
}

您可以获得所有已保存 AST 节点的信息。探索 SimpleNode 的界面,您还可以了解源 sql 字符串中 token 的绝对位置和范围。

这种“限制”来自 JSqlParsers 功能驱动的开发以及对生成所有 AST 节点的巨大性能影响。此外,一些 AST 节点与 JSQlParsers 解析对象(如 ColumnTable 等)链接,这不是使用 JavaCC 自动完成的,而是必须在语法定义内完成。

首先我提到了一个修补过的 JSqlParser。这确实很容易通过修改 pom.xml 和设置

来完成
<nodeDefaultVoid>true</nodeDefaultVoid>

。然后为所有产品生成 AST 节点。但你会看到,即使对于你简单的语句,它也会生成一棵巨大的树。

如果您需要某些特定产品(例如 EqualTo 对象)的此信息,可以通过 JSqlParser (github) 的功能请求进行集成。

为什么是这两种树?

JSqlParser 中的解析树和抽象语法树是有区别的。对于从 ASTNodeAccessImpl 扩展的对象,两者之间存在链接。提供的解析树对象是解析 sql 部分的更实用的方法。例如,您可以将 Table 对象设置为 Column 对象以引用该表中的列。使用 AST 方法,这将导致构造更多节点来构造点、标识符等。

AST 节点包含您需要的信息,即原始 sql 文本中标记的确切位置。如果您查看 Function 对象,则可以使用方法 getASTNode 获取相应的 AST - 节点,以获取 sql 中的确切位置。但正如我所写,这仅针对一些解析树对象实现。如果您需要特定的节点来获取此信息,我会很乐意为其扩展 JSqlParser,但请记住,获取所有这些节点会对性能和内存产生巨大影响。

关于java - 使用 JSqlParser 查找 SQL 查询中标记的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46477757/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com