Files
AgentLab/scripts/dialect-it.sh
T
ThearchyHelios ed72ee68d6 W3-a 关联覆盖率下降、清理目录跨表、扩容器集成测试到对象索引和取值观察
- 剖析核对关联关系时,覆盖率从够有确证的线(95%)掉到线以下的记一条 coverage_drop(取值变化,warning):剖析本身照旧
  按规则降回推断(人工确认的只补上新的覆盖率),这里只把「覆盖率下降」留进变化记录。人点的剖析也记(变化记录全站一份)。
  关系的发现里多带 previous_coverage。
- 处理动作「清理目录」逐表清:这张表上说到被删的列的项,加上别的表指向它的关联关系(表删了时尤其如此);记这张表的
  目录版本,别的表也动了的另记 catalog_versions。
- 剖析任务的逐表进度多一类 observe(取值观察的四类合成一组),前端「取值观察 N/M」用它。
- 定时维护补一条测试:AGENTLAB_SCHEDULER 关着时调度循环不起,到点的维护不触发、不建任务。
- scripts/dialect-it.sh / dialect_it.py 扩到第 2 波的对象索引字典查询(走字典查询不退回 Inspector、类型、表注释、行数
  估算、Oracle 小写名的 quote)和这一波的取值观察(经剖析引擎只观察:行数、小表码值整表、大表 PG / Oracle 块采样、MySQL
  前 N 行、最新业务日期排除无效日期,max_date_sql 直接跑)。夹具的订单表加了表注释。本机跑了一次四种库的容器
  (postgres:16、mysql:8.4、mariadb:11、gvenzl/oracle-free:23-slim):121 项全过、0 项不通过,跑完容器已删、镜像留着。

验证:后端全量 14046 通过(11 跳过、8 预期失败)。
2026-10-16 17:28:07 +08:00

63 lines
2.7 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
# 方言的容器集成测试(下一轮 03 细案 C2):本机 docker 起 PostgreSQL 16、MySQL 8.4、MariaDB 11、Oracle Free 23 四个容器,
# 建虚构的夹具(保留字列、Oracle 小写带引号的表、CHAR 码值、MySQL ENUM、零日期 / 无穷大 / 占位日期、做旧的统计信息、
# 超过整表统计上限的大表、带索引的日期列),用 AgentLab 自己的探查和剖析代码跑全部剖析查询、对象索引的字典查询
# (第 2 波)和取值观察的四类检查(第 3 波),断言零报错、结论和手算的一致。
#
# 为什么不进 CI:要拉几 GB 的镜像、Oracle 起一次要一两分钟。要用户同意才在本机跑。跑完删容器、留镜像。
#
# 用法:scripts/dialect-it.sh 四种库都跑
# DIALECT_IT_ONLY=pg,mysql scripts/dialect-it.sh 只跑其中几种(pg、mysql、mariadb、oracle)
# PYTHON=/path/to/python scripts/dialect-it.sh 指定装着后端依赖的 Python(缺省 python3)
#
# 夹具全是虚构的通用名字(stores、orders、events、visits),不连任何业务库。
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
PY="${PYTHON:-python3}"
ONLY="${DIALECT_IT_ONLY:-pg,mysql,mariadb,oracle}"
PREFIX="agentlab-dialect-it"
PASS="itpass"
started=()
cleanup() {
for name in "${started[@]}"; do
docker rm -f "$name" >/dev/null 2>&1 || true
done
}
trap cleanup EXIT
want() { [[ ",$ONLY," == *",$1,"* ]]; }
run() {
local name="$PREFIX-$1"; shift
docker rm -f "$name" >/dev/null 2>&1 || true
docker run -d --name "$name" "$@" >/dev/null
started+=("$name")
}
host_port() { docker port "$PREFIX-$1" "$2" | head -1 | sed 's/.*://'; }
if want pg; then
run pg -e POSTGRES_PASSWORD="$PASS" -e POSTGRES_DB=it -p 127.0.0.1::5432 postgres:16
fi
if want mysql; then
run mysql -e MYSQL_ROOT_PASSWORD="$PASS" -e MYSQL_DATABASE=it -p 127.0.0.1::3306 mysql:8.4
fi
if want mariadb; then
run mariadb -e MARIADB_ROOT_PASSWORD="$PASS" -e MARIADB_DATABASE=it -p 127.0.0.1::3306 mariadb:11
fi
if want oracle; then
run oracle -e ORACLE_PASSWORD="$PASS" -e APP_USER=it -e APP_USER_PASSWORD="$PASS" -p 127.0.0.1::1521 \
gvenzl/oracle-free:23-slim
fi
export DIALECT_IT_PASSWORD="$PASS" DIALECT_IT_ONLY="$ONLY"
want pg && export DIALECT_IT_PG_PORT="$(host_port pg 5432/tcp)"
want mysql && export DIALECT_IT_MYSQL_PORT="$(host_port mysql 3306/tcp)"
want mariadb && export DIALECT_IT_MARIADB_PORT="$(host_port mariadb 3306/tcp)"
want oracle && export DIALECT_IT_ORACLE_PORT="$(host_port oracle 1521/tcp)"
# 等库起来由 Python 那边按连接重试(Oracle 最慢,最多等 6 分钟)
PYTHONPATH="$ROOT/backend" "$PY" "$ROOT/scripts/dialect_it.py"