DTStack / dt-sql-parser

SQL Parsers for BigData, built with antlr4.
https://dtstack.github.io/monaco-sql-languages/
MIT License
293 stars 93 forks source link

Spark SQL 的解析错误提示,和现在的Spark错误提示不相同 #123

Closed ScalaFirst closed 1 year ago

ScalaFirst commented 1 year ago

The Type of SQL 复现SQL : select t1.a,func( from fundx_ods.ods_test t1

Your Code parser.validate(sql)

Problem 使用当前的 parser 解析报错:
{ startLine: 1, endLine: 1, startCol: 44, endCol: 49, message: "mismatched input '' expecting {'MAP', 'REDUCE', 'SELECT'}" }

使用真实的Spark运行报错: mismatched input 'fundx_ods' expecting {')', ',', '-'}(line 1, pos 23)

可能与grammar规则更新有关,现在的Spark g4文件是 https://github.com/apache/spark/blob/master/sql/catalyst/src/main/antlr4/org/apache/spark/sql/catalyst/parser/SqlBaseParser.g4

请问我该如何更新相应的parser

wewoor commented 1 year ago

@ScalaFirst 欢迎 提 PR

ScalaFirst commented 1 year ago

@ScalaFirst 欢迎 提 PR

  • grammar 源码:

https://github.com/DTStack/dt-sql-parser/tree/main/src/grammar/spark

jest test/parser/spark
  • 运行测试
yarn test 

我试了编译,结果发现编译出来的 Parser里,缺少了 ProgramContext 这个关键的context,我直接放弃了。 顺便请教一下,basic-parser-types 中的 CaretPosition 这个类 : export interface CaretPosition { /* start at 1 / lineNumber: number; /* start at 1 / column: number; } column 这个变量的含义是什么? 为什么我在传入这个值进行解析后,返回给我的tokenIndex是上一个表达式的? 例如: const sql = "select \n" + "substr(a,1) as c1 \n" + "from aaa t1 \n" + "left join bbb t2 \n" + "on t1.a" let tmp = parser.getSuggestionAtCaretPosition(sql,{ column:6, lineNumber:5 })

在 processCandidates 这个函数中, 我以为获取到的 caretTokenIndex 对应的文本是 "." ,结果对应的却是 "t1"。这让我很费解

HaydenOrz commented 1 year ago

@ScalaFirst 抱歉我回复的太晚了,不知道你对此是否对这个问题还有疑惑

caretPosition 中的 column 是指列,line 是指行,针对于上述sql中的 on t1.a片段,column的位置如下图所示,虚线可以理解为编辑器光标位置

image

这里的思路是,当光标在t1 的后面时,光标仍属于前一个token

HaydenOrz commented 1 year ago

我试了编译,结果发现编译出来的 Parser里,缺少了 ProgramContext 这个关键的context,我直接放弃了。

@ScalaFirst 非常感谢你能尝试着贡献源码,这里缺少 ProgramContext 大概的原因可能是因为你修改了 grammar 源文件,在本仓库中所有的grammar文件的第一条规则都是 program 这个是不能修改或者删除的 比如sparksql grammar 文件

image

不知道你是否还有兴趣继续尝试PR