test: cover between/hostvar/gcov-merge, class conditions, schema drop-tables, gixsql fixes

This commit is contained in:
hangshuo652
2026-08-09 17:43:16 +08:00
parent 273a3f8211
commit ff51bda962
22 changed files with 2559 additions and 0 deletions
@@ -0,0 +1,58 @@
"""源级 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