"""源级 CURRENT TIMESTAMP → CURRENT_TIMESTAMP 归一化测试(T4)。 gixpp 把长 SQL 折行,可能把 DB2 的 `CURRENT TIMESTAMP` 拆成 `CURRENT TIMES` / `TAMP` 跨两行,导致 pp 级同行正则漏掉 → 生成的 UPDATE 保留空格版, SQLite 报 `near "TIMESTAMP": syntax error`,UPDATE 成功分支(SQLCODE=0)不可达。 修复:在 gixpp 之前对源里的 EXEC SQL 块做归一化,使生成的 SQL 字面量拼接后 为 SQLite 合法的 CURRENT_TIMESTAMP。仅作用于 EXEC SQL 块,不影响其它文本。 """ import sys, os sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))) from runners.gixsql_runner import _normalize_current_timestamp def test_normalize_inside_exec_sql_block(): src = (" EXEC SQL\n" " UPDATE SALARY-RESULTS SET\n" " UPDATED-AT = CURRENT TIMESTAMP\n" " END-EXEC.") out = _normalize_current_timestamp(src) assert "CURRENT_TIMESTAMP" in out assert "CURRENT TIMESTAMP" not in out def test_normalize_multiple_exec_sql_blocks(): src = (" EXEC SQL\n" " INSERT INTO T1 (UPDATED-AT) VALUES (CURRENT TIMESTAMP)\n" " END-EXEC.\n" " EXEC SQL\n" " UPDATE T2 SET UPDATED-AT = CURRENT TIMESTAMP\n" " END-EXEC.") out = _normalize_current_timestamp(src) assert out.count("CURRENT_TIMESTAMP") == 2 assert "CURRENT TIMESTAMP" not in out def test_normalize_case_insensitive(): src = " EXEC SQL\n SELECT CURRENT timestamp FROM T\n END-EXEC." out = _normalize_current_timestamp(src) assert "CURRENT_TIMESTAMP" in out def test_normalize_idempotent_on_already_underscore(): src = " EXEC SQL\n UPDATE T SET UPDATED-AT = CURRENT_TIMESTAMP\n END-EXEC." out = _normalize_current_timestamp(src) assert out == src def test_normalize_does_not_touch_outside_exec_sql(): src = (" MOVE 'CURRENT TIMESTAMP' TO WS-LIT\n" " EXEC SQL\n" " UPDATE T SET UPDATED-AT = CURRENT TIMESTAMP\n" " END-EXEC.") out = _normalize_current_timestamp(src) # 块内被替换,块外(数据字符串)保持不变 assert out.startswith(" MOVE 'CURRENT TIMESTAMP' TO WS-LIT\n") assert "CURRENT_TIMESTAMP" in out