Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

如何在浏览器环境中直接使用? #264

Closed
wanglufei561 opened this issue Feb 23, 2024 · 8 comments
Closed

如何在浏览器环境中直接使用? #264

wanglufei561 opened this issue Feb 23, 2024 · 8 comments
Labels
help wanted Extra attention is needed improvement Improve existing feature

Comments

@wanglufei561
Copy link

image
这里的assert 和 util指的是什么

@HaydenOrz
Copy link
Collaborator

实际上在浏览器中使用 dt-sql-parser 需要这两个 polyfills 是因为 dt-sql-parser 依赖的 antlr4 运行时 antlr4ts 使用了这些 NodeJS API, 目前我们正在计划从 antlr4ts 切换到 antr4ng, 切换后,则不再需要这些冗余的 polyfills 了,但这还需要一些时间,相关进展可以在这里看到 #260https://github.com/DTStack/dt-sql-parser/issues/261。

目前关于 antlr4ng 的迁移已经初步完成,并发布了 4.0.0-ng.1 版本,你可以安装此版本来忽略你所提到的提示。

@HaydenOrz HaydenOrz added the help wanted Extra attention is needed label Feb 23, 2024
@wanglufei561
Copy link
Author

十分感谢🙏已成功运行

在使用语法校验功能时,有些疑问,报错信息中只有column和line信息,并没有index信息
image
当sql语句只有一行时,并不能定位到错误位置

下面是我的代码
const parser = new MySQL();
const sql = "SELECT CustomerID, CASE WHEN Country = 'China' THEN 'Domestic' WHEN Country != 'China' THEN 'International' ELSE 'Unknown' END ASs CustomerType FROM Customers;"
const errors = parser.validate(sql);
console.log(errors);

其中'ASs'是错误的,我想准确定位到是'ASs'的索引位置,因为报错信息中“mismatched input 'CASE' expecting ”并不准确

请问是否有其他方式可以准确定位到错误位置?

@HaydenOrz
Copy link
Collaborator

在使用语法校验功能时,有些疑问,报错信息中只有column和line信息,并没有index信息

此前,关于报错位置,我们一般用于在编辑器中添加对应的错误标记,对于编辑器(如 monaco editor) 一般只需要行列号就够了,所以并没有加上错误位置的索引信息(即 index),如果你确实有需要,可以考虑新增 index 信息。

其中'ASs'是错误的,我想准确定位到是'ASs'的索引位置,因为报错信息中“mismatched input 'CASE' expecting ”并不准确

我在 monaco-sql-langauges在线预览网站上看到的报错信息和位置,与你所提供的报错信息并不一致:
image

图中显示的报错信息相对更加准确。

另外,我在 dt-sql-parser 的单元测试中测试的结果与 moanco-sql-languages 的在线预览网站的结果相同:

image

你可以检查一下你的代码是否存在其他问题,如果仍然无法解决,请提供最小的能复现此问题的demo仓库,让我可以复现并解决此问题。

@wanglufei561
Copy link
Author

抱歉,我之前的截图是不准确的

image

我写一个demo
我的问题是关于【错误位置】的
image

monaco-sql-langauges在线预览网站上看到的报错位置是
image

这里的括号丢失的问题,按照直觉,会认为【错误位置】应当出现在"("处

所以关于validate功能提供的【错误位置】信息是否准确,或者这里我需要对报错信息进行二次处理?

@HaydenOrz
Copy link
Collaborator

HaydenOrz commented Feb 29, 2024

@wanglufei561 首先,感谢你的 demo。

这里的括号丢失的问题,按照直觉,会认为【错误位置】应当出现在"("处

这很难做到,即使是在vscode 中编写 javascript/typescipt 代码时,如果括号不成对,那么飘红位置也在结尾位置,如下图所示:
image

这主要是因为语法解析器的策略导致的,在遇到错误时,它只能告诉我们它遇到了错误,并且提供信息表明它认为后面期望得到一个什么。并且有的时候,它提供的期望信息也可能不准(不符合开发者的期望)。

所以关于validate功能提供的【错误位置】信息是否准确,或者这里我需要对报错信息进行二次处理?

dt-sql-parser 中收集报错信息,实际上是依赖于 antlr4 的 errorListener, dt-sql-parser 队 errorListener 接收到的异常错了一些简单的处理。目前看起来这个错误处理部分过于粗糙了,以你提供的demo为例,我认为 endColumn 的值不太准确。

除此之外,message 部分也可以进行优化,根据不同的异常类型,生成不同的 message。

@HaydenOrz HaydenOrz added the improvement Improve existing feature label Feb 29, 2024
@wanglufei561
Copy link
Author

@HaydenOrz 谢谢你的答疑,所以dt-sql-parser后续会针对【错误信息】进行优化是吗?请问大概哪个版本会加入这部分的优化

@HaydenOrz
Copy link
Collaborator

@HaydenOrz 谢谢你的答疑,所以dt-sql-parser后续会针对【错误信息】进行优化是吗?请问大概哪个版本会加入这部分的优化

错误信息优化已经在我们的计划中了,目前该优化优先级并不是最高,错误信息优化完成并发布后我将会在这个 issue 下面通知你。

关于此项优化,我们准备参照
https://github.com/mike-lischke/antlr4ng/blob/master/tests/benchmarks/support/MySQLErrorListener.ts

目前你也可以参照此文件创建 ErrorListener 来自定义错误信息。

const mysql = new MySQL();
const parser = mysql.createParser(sql); // 创建 antlr4 mysql parser

 parser.removeErrorListeners(); // 移除内置的 ErrorListener
 parser.addErrorListener(new CustomErrorListener()); // 添加自定义 ErrorListener
 
 parser.program();  // 开始解析
 

@HaydenOrz
Copy link
Collaborator

#272

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
help wanted Extra attention is needed improvement Improve existing feature
Projects
None yet
Development

No branches or pull requests

2 participants