59 lines
2.4 KiB
Python
59 lines
2.4 KiB
Python
"""源级 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
|