"""限制 T+ 源查询语法;真实 2008 R2 的驱动/引擎实测仍是最终验收条件。""" import re from pathlib import Path import pytest QUERY_ROOT = Path(__file__).resolve().parents[3] / "db" / "queries" / "tplus" @pytest.mark.parametrize("path", sorted(QUERY_ROOT.glob("*.sql")), ids=lambda p: p.stem) def test_源查询只使用旧版本分页并保持只读(path): sql = re.sub(r"--[^\n]*", "", path.read_text(encoding="utf-8")) assert not re.search( r"\b(OFFSET|FETCH|OPENJSON|JSON_VALUE|STRING_AGG|TRY_CONVERT|TRY_CAST|" r"INSERT|UPDATE|DELETE|MERGE|CREATE|ALTER|DROP|TRUNCATE)\b", sql, re.I, ) assert "TOP (:batch_size)" in sql assert ":after_id" in sql assert not re.search(r"SELECT\s+\*", sql, re.I) def test_收付款主表没有更新时间时不虚构水位(): sql = (QUERY_ROOT / "receipts.sql").read_text(encoding="utf-8") assert "CAST(NULL AS datetime) AS source_updated_at" in sql assert not re.search(r"h\.updated\b", sql, re.I) def test_关联核验保持只读且不使用新版函数(): sql = re.sub(r"--[^\n]*", "", (QUERY_ROOT / "audit/queries.sql").read_text(encoding="utf-8")) assert not re.search( r"\b(OFFSET|FETCH|OPENJSON|JSON_VALUE|STRING_AGG|TRY_CONVERT|TRY_CAST|" r"INSERT|UPDATE|DELETE|MERGE|CREATE|ALTER|DROP|TRUNCATE)\b", sql, re.I, ) assert not re.search(r"SELECT\s+\*", sql, re.I) assert ":sale_delivery_type_id" in sql and ":receive_flag" in sql