TDengine算术查询使用非数字操作数触发coredump问题咨询
非数值操作数参与算术运算的标准处理说明
- 无论是SQL标准还是主流数据库的实现逻辑,都不允许算术运算场景下直接触发进程崩溃的情况,你遇到的coredump属于TDengine的代码缺陷,不属于合理的标准处理方式。
- 常规的兼容处理逻辑通常为以下两种:
- 抛出明确的类型错误提示:比如PostgreSQL遇到字符串和数字做加法会直接返回类型不匹配的明确报错,不会终止客户端或服务端进程
- 兼容隐式转换逻辑:比如MySQL会尝试将字符串转为数值类型参与运算,无法转换的字符串默认按0计算,全程不会出现崩溃
本次coredump原因说明
这是TDengine客户端SQL解析模块的边界处理遗漏,从报错栈可以看出在functionCompatibleCheck函数中校验运算表达式合法性时,没有覆盖操作数全为非数值类型的分支,触发了开发阶段的断言校验,直接终止了客户端进程,该问题属于可修复的代码缺陷,而非预期设计行为。
问题复现示例
-- 数值运算正常执行 taos> select 2 + 3.0 from tb; 2 + 3.0 | ============================ 5.000000000 | 5.000000000 | Query OK, 2 row(s) in set (0.014870s) -- 字符串相加触发coredump taos> select 'a' + 'b' from tb; taos: /root/wz_test/TDengine/src/client/src/tscSQLParser.c:3506: functionCompatibleCheck: Assertion `numOfExpr > 0' failed. Aborted (core dumped) -- 字符串减数字触发coredump taos> select "a" - 1 from db.tb; taos: /root/wz_test/TDengine/src/client/src/tscSQLParser.c:3506: functionCompatibleCheck: Assertion `numOfExpr > 0' failed. Aborted (core dumped)
内容的提问来源于stack exchange,提问作者GeorgeWill93
相关产品推荐
相关产品推荐

