Commit 3c2ac416 authored by Data Governance Dev's avatar Data Governance Dev

fix(backend): sql_builder 数值比较符强制 float 避免达梦隐式转换坑

- 现象:自定义规则 GRJCJS > 5000 命中 38 行全是 0.0
- 根因:value 是字符串 '5000',达梦 SQL WHERE GRJCJS > ? 收到字符串 '5000' 后做字符串 vs
  DECIMAL 比较,部分达梦版本把 '5000' 解析为 0.0(字符串解析失败回退),变成 WHERE GRJCJS > 0.0
- 修复:编译 gt/lt/eq 时 bind.params.append(float(val)) 强制数值化;非法值返回空字符串
  让上层跳过
- 日期:date_before / date_after 保持 str(val)(达梦 / Oracle DATE 比较认字符串 YYYY-MM-DD)
parent e68c46a8
...@@ -101,7 +101,17 @@ def build_where( ...@@ -101,7 +101,17 @@ def build_where(
# 未知 comparator → 跳过(不报错,让上层兜底报「规则无可执行子条件」) # 未知 comparator → 跳过(不报错,让上层兜底报「规则无可执行子条件」)
return "" return ""
bind.params.append(val) # 数值 / 日期比较符:value 强制转 float 数值化
# 避免字符串 '5000' 与 DECIMAL 字段比较时达梦隐式解析为 0.0(命中所有 0.0 行)
# 日期则用 str() 强转回 string(达梦 / Oracle DATE 比较认字符串 YYYY-MM-DD)
if cmp in ("gt", "lt", "eq"):
try:
bind_val: Any = float(val)
except (TypeError, ValueError):
return "" # 非法数值 → 跳过此叶子
else:
bind_val = str(val) if val is not None else ""
bind.params.append(bind_val)
return f"{column_quoted} {sql_op} {_placeholder(db_type)}" return f"{column_quoted} {sql_op} {_placeholder(db_type)}"
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment