首批通过分布式安全可靠测评,为关键业务系统打造
TableAPI queryAndAppend 操作执行结果不符合预期并且客户端执行前缀查询的时候报错
更新时间:2026-07-31 09:11
问题现象
queryAndAppend 对 int 类型数据执行 append,服务端不支持报错(只支持 varchar/varbinary 类型),但是客户端返回 success,并且 affected rows 为 1。
TableAPI 客户端执行查询的时候只指定前缀,返回 -4016。
关键诊断信息
触发条件
queryAndAppend 对 int 类型数据执行 append 或 table api 客户端执行查询的时候只指定前缀。
问题原因
服务端执行失败会重置错误码为 OB_SUCCESS,并且 affected_rows 设置的是 queryAndAppend 中 query 的结果行数。
服务端校验 rowkey 个数和 scan range 中 obj 个数不一致,直接返回了 -4016。
问题的风险及影响
queryAndxxx 操作执行失败的时候返回的结果不符合预期。
无法使用主键或者索引的前缀进行查询。
影响租户
影响 OceanBase 数据库中的 Oracle 租户和 MySQL 租户,对于 SYS 租户无影响。
影响的版本
OceanBase 数据库 V2.2.77 GA(oceanbase-2.2.77-20210508211731)及之后版本、V3.1.2 GA(oceanbase-3.1.2-20210618150922)及之后版本、V3.2.3 GA(oceanbase-3.2.3.0-20220418212020)及之后版本、V3.2.4 GA(oceanbase-3.2.4.0-100000072022102819)及之后版本。
解决方法及规避方式
修改服务端使用 atomic 的方式执行 queryAndAppend 中的 append 操作,从而返回错误码,同时修正 affected_rows 为 queryAndAppend 中 append 操作影响的行数,而不是 query 的结果集行数。
在客户端传递 scan_range_column 的时候,基于 scan_range_column 补齐 key_range 中缺少的 obj。