Skip to content

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

@BugsGuru

Description

@BugsGuru

版本信息(Version)

4.2508.0

问题描述(Describe)

来源:https://support.actionsky.com/service_desk/browse/SHAI-15023

创建工单,上传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. 缺:

最终方案

proto变更:

service Driver {
  // ...
  rpc Tx(TxRequest) returns (TxResponse);
  // ...
}

message TxResponse {
  repeated ExecResult results = 1;
++  ExecErr execErr = 2;
}

++message ExecErr {
++  uint32 errSqlIndex = 1;
++  string sqlExecErrMsg = 2;
++}

tx中某个SQL执行失败时插件将该错误放在TxResponse中作为业务结果。

外部插件支持

变更影响面

受影响的模块或功能

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

版本兼容性

⚠️变更后的插件,业务逻辑不兼容(可运行,但执行失败可能不会体现)此版本前的sqle
务必使用与sqle版本匹配的插件

测试建议

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