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

[Bug]: sql语句的from后面第一个应该是databse或者table #284

Closed
ouzhou opened this issue Apr 3, 2024 · 4 comments
Closed

[Bug]: sql语句的from后面第一个应该是databse或者table #284

ouzhou opened this issue Apr 3, 2024 · 4 comments

Comments

@ouzhou
Copy link

ouzhou commented Apr 3, 2024

Version

all

Which SQL?

Hive

SQL content

SELECT column1, column2, ...
FROM databaseName.tableName;

JavaScript/TypeScript code

import { FlinkSQL } from 'dt-sql-parser';

const flink = new FlinkSQL();
const sql = 'SELECT * FROM tb';
const pos = { lineNumber: 1, column: 16 }; // tb 的后面
const syntaxSuggestions = flink.getSuggestionAtCaretPosition(sql, pos)?.syntax;

console.log(syntaxSuggestions);

What happened?

按官方案例来说,syntaxSuggestions应该返回 database table view
然后如果接下来有database.table 才是 table view

Relevant log output

No response

@HaydenOrz
Copy link
Collaborator

HaydenOrz commented Apr 3, 2024

@ouzhou 这是一个不好解决,也是一个见仁见智的问题,在这里已经有过类似的讨论 #189 (comment)

如果按你提到的这种情况下,返回 database 和 table,这在 hive 中没有任何问题。

但是在 Trino / Flink 中有三层结构(catalog -> database -> table), 并且sql文本为 SELECT * FROM a.b<插入位置>,相应的应该返回 database 和 table,因为无法确定 a.b 是 catalog.database 还是 database.table 。这样的返回实际上显得有些奇怪,因为即使这样返回了,你仍然需要通过附带的 wordRanges 和 引擎真实的元数据信息结合来做一些判断。

目前dt-sql-parser 在处理这个问题时,不再考虑是否应该返回 database 或者 catalog,统一返回 table,开发者可以通过附带的 wordRanges 自行判断。这实际上也与许多文档中对语法的描述相对应,比如 hive 的 query 文档
image

另外,在hive 这种只有两层结构的sql语言中仍然保持只返回 table 的原因是,我们希望所有的 SQL 语言parser 的 API 的表现保持一致。

@ouzhou
Copy link
Author

ouzhou commented Apr 3, 2024

看了一下#189,目前是只支持拿本地上下文内craete的table进行补全吗?
如果是要做提前判断用户接下来要输入一个表名,使用从接口来的表名列表补全,应该如何实现?

@LuckyFBB
Copy link
Collaborator

LuckyFBB commented Apr 3, 2024

看了一下#189,目前是只支持拿本地上下文内craete的table进行补全吗? 如果是要做提前判断用户接下来要输入一个表名,使用从接口来的表名列表补全,应该如何实现?

目前支持使用接口来进行表名补全,你可以参考 monaco-sql-languages的实现

1

@ouzhou
Copy link
Author

ouzhou commented Apr 8, 2024

image

WHERE语句后面似乎不支持

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants