【标题】(请简要描述下实现的内容)
修复B库cast(expr as unsigned/signed)函数返回结果与mysql不一致
【实现内容】:
1.修复B库cast(expr as signed)函数溢出结果截断为int64的最大值,为和mysql保持兼容性,修改为cast(expr as signed)函数溢出结果在非严格模式下,当int64_max<expr<=uin64_max,截断结果为对应的负值;expr>uin64_max, numeric截断结果为int64_max,bit/float4/float8/varchar/text/bpchar等其他类型截断为-1,并报warning;expr<in64_min, 截断结果为int64_min,并报warning;严格模式下报错。以上结果通过参数b_compatibility_mode控制。
2.修复B库cast(expr as unsigned)函数表达式为如'-1'这样的unknown类型时,对负值返回结果0而不是对应溢出的大整数。
【根因分析】:
1.cast(expr as signed):原本在find_coercion_pathway中调用的显式转换函数以及int8in函数对于超过int64表示范围的数,在严格模式下报错,在非严格模式下报warning并截断为int64的最值,与mysql的表现不一致。
2.cast(expr as unsigned):表达式为unknown类型时,类型转换没有通过find_coercion_pathway查找转换规则,而是通过uint8in转换。
【实现方案】:
1.为signed即int8的显式转换单独写一套规则,并通过dolphin.b_compatibility_mode参数控制,当设置参数为on时应用规则。在parse_corece.cpp文件里,增加castSignedFunction作为规则函数数组,在findSignedExplictCastFunction里根据转换到signed的源数据类型查找对应的规则,然后在find_coercion_pathway里调用,判断当b_compatibility_mode参数打开且为显式转换时,直接替换规则。
2.当表达式为unknown类型,使其对应text类型与unsigned的转换规则,并通过find_coercion_pathway查找转换函数。
【关联需求或issue】:
#I7NPYV:MySQL兼容性--cast(expr as signed)函数溢出结果截断为int64的最大值
#I7OCNB:MySQL兼容性--cast(expr as unsigned) 表达式为unknown时返回结果与mysql不一致
【开发自验报告】:

  1. 请附上自验结果(内容或者截图)
  2. 是否可以添加fastcheck测试用例,如是,请补充fastcheck用例
    补充signed_cast和uint_cast用例
  3. 是否涉及资料修改,如是,在docs仓库补充资料
  4. 是否考虑支撑升级和在线扩容等扩展场景
  5. 是否考虑异常场景/并发场景/前向兼容/性能场景
  6. 是否对其他模块产生影响

【其他说明】: