test: cover between/hostvar/gcov-merge, class conditions, schema drop-tables, gixsql fixes
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user