goInception icon indicating copy to clipboard operation
goInception copied to clipboard

goInception 是否能支持MySQL 8.0 中的 with 语法呢

Open callmedba opened this issue 1 year ago • 27 comments

描述您想要的功能:

MySQL8中支持了with语法,tidb最新版本中也支持了该语法。

goInception 目前是否能支持 with 语法审核呢 ? 谢谢

示例sql:

with x as (select * from movies) select id,movie from x;

可参考文档,资料,引用等:

使用 goInception v1.3.0-90-gb3de05e2e7 对该示例sql进行测试,错误日志为:

level=error msg="con:21 解析失败! line 1 column 4 near \"with x as (select * from movies) select id,movie from x\" " file=session_inception.go func=executeInc line=220

callmedba avatar May 29 '24 01:05 callmedba

得等主分支修复了,可以看下我fork的分支,https://gitee.com/zhoujin826/goInception

zmix999 avatar May 29 '24 02:05 zmix999

得等主分支修复了,可以看下我fork的分支,https://gitee.com/zhoujin826/goInception

大佬 ,我从gitee上下载了最新版本 v1.3.0-159-gd625352

验证示例sql:

with x as (select * from movies) select id,movie from x;

结果是:

error_level返回 2
error_message 返回 " Table 'pms.x' doesn't exist.Column 'id' not existed.Column 'movie' not existed. "

日志如下:

ime="2024/05/29 16:07:27.823" level=info msg="con:6 new connection 127.0.0.1:36078" file=server.go func=onConn line=319
time="2024/05/29 16:07:27.824" level=info msg="[GENERAL_LOG] con:6 user:[email protected] sql:SET AUTOCOMMIT = 0" file=session.go func=logQuery line=1613
time="2024/05/29 16:07:27.932" level=info msg="s.innodbLargePrefix: false " file=session_inception.go func=mysqlServerVersion line=1920
time="2024/05/29 16:07:28.044" level=info msg="[GENERAL_LOG] con:6 user:[email protected] sql:/*--user=xxx;--password=xxx;--host=xxx;--check=1;--port=3306;*/ inception_magic_start; use pms; select * from movies; with x as (select * from movies) select id,movie from x; inception_magic_commit;" file=session.go func=logQuery line=1613
time="2024/05/29 16:07:28.045" level=info msg="con:6 close connection" file=server.go func=func1 line=321

请问这个goInception如果要使用MySQL CET语法,是需要打开哪个配置项吗 ? 谢谢

callmedba avatar May 29 '24 08:05 callmedba

提示的不是很明显了,查询的表有这些列吗

zmix999 avatar May 29 '24 09:05 zmix999

image

zmix999 avatar May 30 '24 01:05 zmix999

image

id和movie列在表里是有的 ,有点奇怪

callmedba avatar May 30 '24 03:05 callmedba

./goInception -V
Release Version: v1.3.0-159-gd625352
Git Commit Hash: d625352d2ca160cba45a4b4128757ccfc57071bf
Git Branch: master
UTC Build Time: 2024-05-28 13:38:05
GoVersion: go version go1.22.2 linux/amd64

配置文件和社区一致的, v1.3.0-159-gd625352 这个版本是对的吗 ? 谢谢

callmedba avatar May 30 '24 03:05 callmedba

image

请问下这个截图里是使用的哪个goInception小版本,我试试看

callmedba avatar May 30 '24 03:05 callmedba

image image image 检查自己的配置吧,错误提示很明显

zmix999 avatar May 30 '24 05:05 zmix999

我使用goInception-linux-v1.3.0-164-g16a8b6f.tar.gz 这个版本,还是无法使用with语法?请问这个支持了么

woshiyanghai avatar Jun 21 '24 05:06 woshiyanghai

我使用goInception-linux-v1.3.0-164-g16a8b6f.tar.gz 这个版本,还是无法使用with语法?请问这个支持了么 报什么错

zmix999 avatar Jun 21 '24 09:06 zmix999

GoInception 在解析sql的时候,会把with后的名字当一个表名处理,这是不太好的,这并不是一个真正的表名

woshiyanghai avatar Nov 13 '24 02:11 woshiyanghai

我也用的v1.3.0-164-g16a8b6f这个版本,也不行

报错的sql

with xx as (select * from t1) select * from xx;

报错信息: Table 'test1.xx' doesn't exist.

Asa6 avatar Nov 15 '24 04:11 Asa6

会把with 的表名作为一个表名输出,这会导致依赖这个解析信息判断表权限时,不通过

woshiyanghai avatar Nov 15 '24 04:11 woshiyanghai

请将 的表名作为一个表名输出,这会导致依赖该解析信息判断表权限时,不通过

是不是和er_table_not_existed_error这个审核规则冲突了,er_table_not_existed_error设置为2的时候,会提示表不存在(Table 'xx' doesn't exist.),按理说with后面的表本来就是临时的,不应该校验不通过的

Asa6 avatar Dec 06 '24 08:12 Asa6

image https://gitee.com/zhoujin826/goInception 最新版可以在试下

zmix999 avatar Dec 30 '24 09:12 zmix999

image https://gitee.com/zhoujin826/goInception 最新版可以在试下

with语法是没问题的,关键是goinception 不能把with后面这个临时表名字作为一个存在的表名字输出,这样就会导致其他程序在使用goinception 输出的table name 来校验权限时,校验的一个不存在的表名,这肯定是校验不通过的。

woshiyanghai avatar Dec 31 '24 02:12 woshiyanghai

已经调整

zmix999 avatar Dec 31 '24 05:12 zmix999

比如我的查询语句是 WITH RECURSIVE yhtest as ( select * from test ) select * from yhtest;
我goinception 在解析语法树的时候,yhtest不应该作为一个实体表输出。 这个语句解析出来应该test是实体表,yhtest 作为一个虚拟表名字输出,这样,再校验权限时,可以只判断test权限,如果还要判断yhtest 权限,那肯定是不通过的。

woshiyanghai avatar Jan 03 '25 01:01 woshiyanghai

我说了啊,主分支不支持,我fork的分支已经支持 image https://gitee.com/zhoujin826/goInception

zmix999 avatar Jan 03 '25 07:01 zmix999

我使用的是183。看样子我要用184?

woshiyanghai avatar Jan 03 '25 07:01 woshiyanghai

183也可以,184只是加了几个统计信息的表字段,发下你的版本,报错截图 image

zmix999 avatar Jan 03 '25 08:01 zmix999

并没有什么报错,就是goinception 解析出来,WITH RECURSIVE yhtest as ( select * from test ) select * from yhtest; 这个yhtest 被当作一个实体表了。

woshiyanghai avatar Jan 03 '25 08:01 woshiyanghai

image 自己要判断语句类似啊,是否是WITH语句

zmix999 avatar Jan 03 '25 23:01 zmix999

你的意思是如果是with语句的话,第一个表名跳过?

woshiyanghai avatar Jan 06 '25 05:01 woshiyanghai

就取with语句块里的表名

zmix999 avatar Jan 06 '25 07:01 zmix999

MySQL版本的Archery+goInception已经支持with as 语法,有需要的童鞋请+QQ327092839

duguwo avatar Jun 12 '25 01:06 duguwo

MySQL版本的Archery+goInception已经支持with as 语法,有需要的童鞋请+QQ327092839 提示你的qq添加异常,为什么要添加qq呢?

woshiyanghai avatar Jun 12 '25 01:06 woshiyanghai