test: cover between/hostvar/gcov-merge, class conditions, schema drop-tables, gixsql fixes
This commit is contained in:
@@ -0,0 +1,99 @@
|
||||
"""EXEC SQL 内 DB2 schema 限定表名(SCHEMA.TABLE)剥离测试。
|
||||
|
||||
gixsql 会把 `FROM SALARYDB.EMP-MASTER` 原样归一化为 `FROM SALARYDB.EMP_MASTER`
|
||||
注入 GIXSQL SQL 字符串;SQLite 无 schema 对象,OPEN CURSOR 报
|
||||
'no such table: SALARYDB.EMP_MASTER' → SQLCODE≠0 → EMP-OPEN 错误分支 → ABEND,
|
||||
主循环 2000MAJSOR 永不执行(SHA02MNC 覆盖率 66.7% 根因)。
|
||||
|
||||
修复:gixpp 前把 EXEC SQL 块内 FROM/INTO/UPDATE/JOIN 后的 SCHEMA.TABLE
|
||||
剥掉限定符(通用规则,处理任意 schema 名,无程序硬编码)。
|
||||
"""
|
||||
|
||||
import sys, os
|
||||
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")))
|
||||
from runners.gixsql_runner import (
|
||||
_strip_schema_qualifiers,
|
||||
_normalize_schema_qualifiers,
|
||||
)
|
||||
|
||||
|
||||
def test_from_schema_table_stripped():
|
||||
src = (
|
||||
" EXEC SQL\n"
|
||||
" DECLARE C2 CURSOR FOR\n"
|
||||
" SELECT EMP-ID, EMP-NAME\n"
|
||||
" FROM SALARYDB.EMP-MASTER\n"
|
||||
" ORDER BY EMP-ID\n"
|
||||
" END-EXEC.\n"
|
||||
)
|
||||
out = _strip_schema_qualifiers(src)
|
||||
assert "FROM SALARYDB.EMP-MASTER" not in out
|
||||
assert "FROM EMP-MASTER" in out
|
||||
|
||||
|
||||
def test_from_three_part_qualified_stripped():
|
||||
src = "EXEC SQL SELECT A FROM DB2INST1.PAYROLL.TIMESHEET END-EXEC."
|
||||
out = _strip_schema_qualifiers(src)
|
||||
assert "FROM TIMESHEET" in out
|
||||
assert "DB2INST1.PAYROLL" not in out
|
||||
|
||||
|
||||
def test_update_schema_table_stripped():
|
||||
src = "EXEC SQL UPDATE SALARYDB.EMP-MASTER SET DEPT-CODE = '01' WHERE EMP-ID = :X END-EXEC."
|
||||
out = _strip_schema_qualifiers(src)
|
||||
assert "UPDATE EMP-MASTER" in out
|
||||
|
||||
|
||||
def test_into_schema_table_stripped():
|
||||
src = "EXEC SQL INSERT INTO SALARYDB.EMP-MASTER (EMP-ID) VALUES (:X) END-EXEC."
|
||||
out = _strip_schema_qualifiers(src)
|
||||
assert "INSERT INTO EMP-MASTER" in out
|
||||
|
||||
|
||||
def test_join_schema_table_stripped():
|
||||
src = ("EXEC SQL SELECT A.ID FROM A "
|
||||
"JOIN SALARYDB.EMP-MASTER B ON A.ID = B.EMP-ID END-EXEC.")
|
||||
out = _strip_schema_qualifiers(src)
|
||||
assert "JOIN EMP-MASTER B" in out
|
||||
|
||||
|
||||
def test_column_alias_qualifier_untouched():
|
||||
"""列限定(E.EMP-ID / B.DEPT-CODE,非表名位置)不得剥离。"""
|
||||
src = ("EXEC SQL SELECT E.EMP-ID FROM EMP-MASTER E "
|
||||
"WHERE E.DEPT-CODE = '01' END-EXEC.")
|
||||
out = _strip_schema_qualifiers(src)
|
||||
assert "SELECT E.EMP-ID" in out
|
||||
assert "E.DEPT-CODE" in out
|
||||
assert "FROM EMP-MASTER E" in out
|
||||
|
||||
|
||||
def test_hostvar_into_untouched():
|
||||
"""SELECT ... INTO :DBV-X(宿主变量,非 SCHEMA.TABLE)不得剥离。"""
|
||||
src = "EXEC SQL SELECT EMP-NAME INTO :DBV-EMP-NAME FROM EMP-MASTER END-EXEC."
|
||||
out = _strip_schema_qualifiers(src)
|
||||
assert "INTO :DBV-EMP-NAME" in out
|
||||
|
||||
|
||||
def test_unqualified_table_untouched():
|
||||
src = "EXEC SQL SELECT EMP-ID FROM EMP-MASTER ORDER BY EMP-ID END-EXEC."
|
||||
assert _strip_schema_qualifiers(src) == src
|
||||
|
||||
|
||||
def test_wrapper_only_touches_exec_sql_blocks():
|
||||
text = " MOVE 'FROM A.B' TO WS-X.\n"
|
||||
assert _normalize_schema_qualifiers(text) == text
|
||||
|
||||
|
||||
def test_wrapper_strips_inside_exec_sql_only():
|
||||
text = (
|
||||
" MOVE 'X' TO WS-A.\n"
|
||||
" EXEC SQL\n"
|
||||
" SELECT EMP-ID\n"
|
||||
" FROM SALARYDB.EMP-MASTER\n"
|
||||
" END-EXEC.\n"
|
||||
" MOVE 'FROM C.D' TO WS-B.\n"
|
||||
)
|
||||
out = _normalize_schema_qualifiers(text)
|
||||
assert "FROM SALARYDB.EMP-MASTER" not in out
|
||||
assert "FROM EMP-MASTER" in out
|
||||
assert "MOVE 'FROM C.D' TO WS-B" in out
|
||||
Reference in New Issue
Block a user