sqle icon indicating copy to clipboard operation
sqle copied to clipboard

编码格式设置为utf8mb3会导致无法解析sql

Open HuangWeiCen opened this issue 2 years ago • 3 comments

问题描述

  1. 执行下方建表语句会报出无法解析的错误
CREATE TABLE `tb01` (
  `ID` int unsigned NOT NULL AUTO_INCREMENT COMMENT '自增 ID',
  `NAME` varchar(20) NOT NULL DEFAULT '' COMMENT '名字',
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COMMENT='测试表'
  1. 如果表是utf8mb3编码, 改表语句将无法正常工作 H{JUR8P_)QS8KCHDAOLE@ZG

HuangWeiCen avatar Apr 29 '22 02:04 HuangWeiCen

修复方案

将所有解析器抛出的错误记录到审核结果中, 而非弹窗报错

修复方式

增加一个新的错误代码, 将所有解析器的错误包装为此错误, 然后在调用处判断错误类型, 如果为此错误则记录到审核结果中, 如果不是则保持原流程

影响功能

image

影响原因

上述功能均涉及使用GetCreateTableStmt()方法, 此方法内部的ParseOneSql()解析sql失败会抛出此错误

HuangWeiCen avatar May 06 '22 05:05 HuangWeiCen

相关代码改动说明

  1. ParseSql() 改动错误类型无影响, 因为此函数内部的p.PerfectParse() 错误总是为空, 改动仅为了和ParseOneSql()错误类型保持一致, 即解析器抛出的错误统一
  2. 更新无效检查的错误信息, 防止被误认为是预检查的错误
  3. 统一在无效检查时记录解析器错误, 其他位置(回滚, 检查项, 索引优化等) 此错误将不再抛出, 在无效检查时记录是因为此处第一个执行, 其他功能均在无效检查之后

HuangWeiCen avatar May 06 '22 06:05 HuangWeiCen

因为影响面太大, 暂时停止处理, 研究一下有没有更好的方案, 当前改动放在issue_488分支中, 相关链接: https://github.com/actiontech/sqle/tree/issue_488

HuangWeiCen avatar May 06 '22 08:05 HuangWeiCen

参考 #1630 提到的方案

ColdWaterLW avatar Jul 11 '23 07:07 ColdWaterLW

验证版本: UI Version: main 0d3caf7 Server Version: main-ee 32288994f7 验证结果: image

quexiuping avatar Nov 01 '23 07:11 quexiuping