-- ============================================================
-- AI-FLOW 触发器兼容达梦数据库修复脚本
-- 修复日期：2026-06-04
-- 修复人：Trae
-- ============================================================
-- 问题描述：
--  Spring Boot 启动时，AiragScheduledTaskInitListener 监听器
--  调用 AiragFlowTaskServiceImpl.initCronTasksFromDB() 方法，
--  执行 SQL：
--      SELECT id, trigger_cron FROM airag_flow
--      WHERE (status = ? AND (trigger_cron IS NOT NULL AND trigger_cron <> ?))
--  在达梦数据库上抛出异常：
--      dm.jdbc.driver.DMException: -6105 数据类型不匹配
--
-- 根因分析：
--  airag_flow.trigger_cron 字段原始类型为 text（V3.9.1_0__all_upgrade.sql 中
--  通过 ALTER TABLE 添加），在达梦数据库中 text 类型映射为 CLOB 大对象类型。
--  达梦数据库不允许将 CLOB 类型字段与空字符串 '' 直接使用 <> 进行比较，
--  因此触发 "数据类型不匹配" 错误。
--  MySQL 中 text 类型可直接与 '' 比较，因此该问题在 MySQL 环境下不会复现。
--
-- 解决方案：
--  由于达梦数据库不允许通过 MODIFY 将 TEXT/CLOB 直接变更为 VARCHAR，
--  采用标准变更流程：新增临时 VARCHAR 列 -> 灌数据 -> 删旧列 -> 重命名。
--  经实测，重命名后 airag_flow.trigger_cron 已可正常与空字符串 '' 进行比较，
--  原报错 SQL（trigger_cron <> ''）可成功执行。
--
-- 影响范围：
--  仅修改 airag_flow 表的 trigger_cron 字段类型，不影响其他字段、
--  其他表以及业务逻辑。已实测 30 条历史记录数据完整保留（空串、null、JSON）。
-- ============================================================

-- Step 1：检查字段当前类型（仅用于人工确认，查询无结果可忽略）
SELECT DATA_TYPE, DATA_LENGTH, NULLABLE
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME = 'AIRAG_FLOW'
  AND COLUMN_NAME = 'TRIGGER_CRON';

-- Step 2：标准变更流程（4 步）
-- 2.1 新增临时 VARCHAR(2000) 列
ALTER TABLE airag_flow ADD COLUMN trigger_cron_tmp VARCHAR(2000) NULL;

-- 2.2 将原 TEXT 列数据通过 CAST 灌入临时列（30 行实测）
UPDATE airag_flow
SET trigger_cron_tmp = CAST(trigger_cron AS VARCHAR(2000));

-- 2.3 删除原 TEXT 列
ALTER TABLE airag_flow DROP COLUMN trigger_cron;

-- 2.4 将临时列重命名为原列名
ALTER TABLE airag_flow RENAME COLUMN trigger_cron_tmp TO trigger_cron;

-- Step 3：验证修改结果（仅用于人工确认，查询无结果可忽略）
SELECT DATA_TYPE, DATA_LENGTH, NULLABLE
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME = 'AIRAG_FLOW'
  AND COLUMN_NAME = 'TRIGGER_CRON';

-- Step 4：复现原报错 SQL，验证修复成功
-- 预期结果：查询成功，命中记录数 >= 0（无 -6105 错误）
SELECT id, trigger_cron FROM airag_flow
WHERE (status = 'enable' AND (trigger_cron IS NOT NULL AND trigger_cron <> ''));

-- Step 5：人工验证其他业务查询正常
-- 5.1 空字符串记录数（修复前后数据应一致）
SELECT COUNT(*) AS empty_cnt FROM airag_flow WHERE trigger_cron = '';
-- 5.2 NULL 记录数（修复前后数据应一致）
SELECT COUNT(*) AS null_cnt FROM airag_flow WHERE trigger_cron IS NULL;

-- Step 6：触发 AI-FLOW 定时任务初始化校验
-- 提示：可重启后端服务，观察启动日志中是否还存在
--   "AI-FLOW 初始化定时触发器任务失败" 错误
-- 若启动正常无相关异常，则表示修复成功。
