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

feat: complete after error syntax

Open liuxy0551 opened this issue 1 year ago • 2 comments

在错误语法的 SQL 后进行自动补全

现状举例

  1. 前方 SQL 语法错误导致光标所在位置无法准确的提示 INSERT 等关键字:
SELECT FROM tb1;
I|

image

  1. 错误语法后的 SELECT * FROM 被解析为多个 statement,无法进行准确的自动补全:
SELECT FROM tb1;
SELECT * FROM |

image

预期举例

  1. 有分号分隔时,以分号后一位作为左边界,右边界不变,将区间内的内容给到 antlr4-c3 进行解析。此时期望能够提示 INSERT 等关键字
SELECT  FROM tb1;
I|
  1. 没有分号分隔时,无法感知第一行的 sql 语句已经结束。此时无法准确的自动补全
SELECT FROM tb1
I|

改动思路

提到的左边界和右边界可以参考 dt-sql-parser #231 的描述。

通过分隔符进行切分(通常是 ;),这里依旧保留现状寻找最小合适范围的策略,并在此策略上继续优化,借助两种方式进一步缩小解析范围。

  1. 在已经获取到的合适范围中以光标为起点,向左查找 ; 的 tokenIndex,并以此为左边界;
  2. 在已经获取到的合适范围中以光标为起点,向右查找 ; 的 tokenIndex,并以此为右边界;

通常在写 SQL 时,一般不会先写当前语句的 ;,所以右边界一般不会再次改变。如果左右没有查找到 ; 则不修改左右边界。

实现效果

2024-09-27 15 40 13

liuxy0551 avatar Jul 25 '24 10:07 liuxy0551