dt-sql-parser icon indicating copy to clipboard operation
dt-sql-parser copied to clipboard

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

Open wanglufei561 opened this issue 1 year ago • 7 comments

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

wanglufei561 avatar Feb 23 '24 07:02 wanglufei561

  • https://www.npmjs.com/package/util

  • https://www.npmjs.com/package/assert

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

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

HaydenOrz avatar Feb 23 '24 07:02 HaydenOrz

十分感谢🙏已成功运行

在使用语法校验功能时,有些疑问,报错信息中只有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 ”并不准确

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

wanglufei561 avatar Feb 23 '24 09:02 wanglufei561

在使用语法校验功能时,有些疑问,报错信息中只有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仓库,让我可以复现并解决此问题。

HaydenOrz avatar Feb 23 '24 09:02 HaydenOrz

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

image

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

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

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

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

wanglufei561 avatar Feb 27 '24 09:02 wanglufei561

@wanglufei561 首先,感谢你的 demo。

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

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

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

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

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

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

HaydenOrz avatar Feb 29 '24 12:02 HaydenOrz

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

wanglufei561 avatar Mar 06 '24 09:03 wanglufei561

@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 avatar Mar 06 '24 09:03 HaydenOrz

#272

HaydenOrz avatar Apr 01 '24 12:04 HaydenOrz