Skip to content

工单SQL模式执行结果不符合预期 #3134

@BugsGuru

Description

@BugsGuru

版本信息(Version)

2408

问题描述(Describe)

创建工单,上传SQL文件选择“SQL模式”后,进行审核上线,其中某条SQL执行失败的报错会体现在每个SQL的执行结果中。

截图或日志(Log)

Image

如何复现(To Reproduce)

构建SQL文件,满足:

  1. 前面几条SQL可以执行成功
  2. 后续存在某SQL执行会失败

SQL模式审核上线该文件
查看执行结果

问题原因

SQL模式上线的工单SQLs会以事务去执行,当数据源插件执行到某SQL失败时,直接用该SQL执行失败的原因作为事务执行失败的报错,sqle将该报错添加到了事务中的每个SQL的执行结果里。

sqle/sqle/server/sqled.go

Lines 715 to 719 in fde9c04

results, txErr := a.plugin.Tx(context.TODO(), qs...)
for idx, executeSQL := range executeSQLs {
if txErr != nil {
executeSQL.ExecStatus = model.SQLExecuteStatusFailed
executeSQL.ExecResult = txErr.Error()

解决方案

方案的目标都是使得:

type Plugin interface {
	// ...
	Tx(ctx context.Context, queries ...string) ([]driver.Result, error)
	// ...
}

插件的Tx方法,在执行失败时,能够区分是哪条SQL失败。

  1. 执行某SQL失败时,之前执行成功的结果在第一个返回参数[]driver.Result中返回
    1. 优:部分前向兼容(接口兼容,业务逻辑不兼容)、效果良好
    2. 缺:隐性约定
  2. 在第二个返回参数error中表明哪个SQL失败的
    1. 优:前向兼容
    2. 缺:代码丑陋|实现效果不好
  3. 修改Tx方法签名,使其能够很好的区分哪条SQL执行失败
    1. 优:代码优雅
    2. 缺:前向不兼容
  4. 修改driver.Result,使其能够表示执行失败的错误
    1. 优:前向兼容、代码优雅、效果良好
    2. 缺:

变更影响面

受影响的模块或功能

外部引用的潜在问题或风险

版本兼容性

测试建议

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions