Files
cobol-java-v3/tests/runners/test_gixsql_current_timestamp.py
T

59 lines
2.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""源级 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