🐛 fix(query-results): 修复 SQLite 与 SQL Server 查询结果空页

- SQLite 只读查询优先普通 Query,并安全降级不支持的多结果集接口
- SQL Server 在结果集边界前恢复未扫描数据,保持 data/affectedRows 顺序
- 普通与事务查询过滤状态空壳,修正结果展示与审计返回行数
- 更新 SQL Server driver-agent revision 并补充 SQLite、MSSQL 回归测试
This commit is contained in:
Syngnat
2026-07-16 20:24:39 +08:00
parent 193d68398b
commit d3dee295d6
7 changed files with 473 additions and 11 deletions

View File

@@ -40,10 +40,33 @@ func scanSQLServerRowsWithMessages(ctx context.Context, rows *sql.Rows, retmsg *
}
var (
resultSets []connection.ResultSetData
messages []string
allMessages []string
resultSets []connection.ResultSetData
messages []string
allMessages []string
currentResultScanned bool
currentResultStart int
)
// go-mssqldb can emit a result-set boundary without MsgNext. Recover the
// unread rows before advancing and keep them before any affectedRows status.
scanCurrentResultIfNeeded := func() error {
if currentResultScanned {
return nil
}
result, err := scanSQLServerFallbackResultSet(rows)
if err != nil {
return err
}
currentResultScanned = true
if len(result.Columns) == 0 && len(result.Rows) == 0 {
return nil
}
result.Messages = append([]string(nil), messages...)
resultSets = append(resultSets, connection.ResultSetData{})
copy(resultSets[currentResultStart+1:], resultSets[currentResultStart:])
resultSets[currentResultStart] = result
messages = nil
return nil
}
active := true
for active {
raw := retmsg.Message(ctx)
@@ -70,6 +93,7 @@ func scanSQLServerRowsWithMessages(ctx context.Context, rows *sql.Rows, retmsg *
Columns: cols,
Messages: append([]string(nil), messages...),
})
currentResultScanned = true
messages = nil
case sqlexp.MsgRowsAffected:
resultSets = append(resultSets, connection.ResultSetData{
@@ -79,13 +103,23 @@ func scanSQLServerRowsWithMessages(ctx context.Context, rows *sql.Rows, retmsg *
})
messages = nil
case sqlexp.MsgNextResultSet:
if err := scanCurrentResultIfNeeded(); err != nil {
return resultSets, messages, err
}
active = rows.NextResultSet()
if active {
currentResultScanned = false
currentResultStart = len(resultSets)
}
case sqlexp.MsgError:
return resultSets, messages, msg.Error
default:
active = false
}
}
if err := scanCurrentResultIfNeeded(); err != nil {
return resultSets, messages, err
}
if len(messages) > 0 {
resultSets = append(resultSets, connection.ResultSetData{
@@ -95,11 +129,7 @@ func scanSQLServerRowsWithMessages(ctx context.Context, rows *sql.Rows, retmsg *
})
}
if len(resultSets) == 0 {
fallbackResult, err := scanSQLServerFallbackResultSet(rows)
if err != nil {
return resultSets, allMessages, err
}
resultSets = []connection.ResultSetData{fallbackResult}
resultSets = []connection.ResultSetData{emptySQLServerRowsResultSet()}
}
if err := rows.Err(); err != nil {
return resultSets, allMessages, err