#!/usr/bin/env bash set -euo pipefail if ! command -v docker >/dev/null || ! docker ps --format '{{.Names}}' | grep -qx 'wygj-mysql'; then echo "SKIP: AIHR release collation migration test requires wygj-mysql" exit 0 fi ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" MYSQL_CONTAINER="wygj-mysql" DB="wygj_aihr_collation_test_$$" mysql() { docker exec -i "$MYSQL_CONTAINER" mysql -uroot -proot --default-character-set=utf8mb4 "$@" } cleanup() { mysql -e "DROP DATABASE IF EXISTS \`$DB\`;" >/dev/null 2>&1 || true } trap cleanup EXIT mysql -e "CREATE DATABASE \`$DB\` CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;" mysql "$DB" <<'SQL' CREATE TABLE aihr_knowledge_info (tenant_id varchar(20) COLLATE utf8mb4_general_ci) ENGINE=InnoDB; CREATE TABLE aihr_knowledge_fragment (tenant_id varchar(20) COLLATE utf8mb4_general_ci, content text COLLATE utf8mb4_general_ci) ENGINE=InnoDB; CREATE TABLE aihr_data_asset (tenant_id varchar(20) COLLATE utf8mb4_0900_ai_ci, source_name varchar(100) COLLATE utf8mb4_0900_ai_ci) ENGINE=InnoDB; CREATE TABLE aihr_chunk_revision (tenant_id varchar(20) COLLATE utf8mb4_0900_ai_ci, content text COLLATE utf8mb4_0900_ai_ci) ENGINE=InnoDB; CREATE TABLE aihr_knowledge_space_grant (tenant_id varchar(20), label varchar(20)) ENGINE=InnoDB; CREATE TABLE aihr_knowledge_app (tenant_id varchar(20), label varchar(20)) ENGINE=InnoDB; CREATE TABLE aihr_knowledge_app_space (tenant_id varchar(20), label varchar(20)) ENGINE=InnoDB; CREATE TABLE aihr_knowledge_query_log (tenant_id varchar(20), label varchar(20)) ENGINE=InnoDB; CREATE TABLE aihr_knowledge_admin_audit (tenant_id varchar(20), label varchar(20)) ENGINE=InnoDB; CREATE TABLE aihr_knowledge_conversation (tenant_id varchar(20), label varchar(20)) ENGINE=InnoDB; CREATE TABLE aihr_learning_question (tenant_id varchar(20), label varchar(20)) ENGINE=InnoDB; CREATE TABLE aihr_practice_question_feedback (tenant_id varchar(20), label varchar(20)) ENGINE=InnoDB; CREATE TABLE aihr_onboard_exam (tenant_id varchar(20), label varchar(20)) ENGINE=InnoDB; CREATE TABLE aihr_onboard_exam_target (tenant_id varchar(20), label varchar(20)) ENGINE=InnoDB; CREATE TABLE aihr_onboard_exam_question (tenant_id varchar(20), label varchar(20)) ENGINE=InnoDB; CREATE TABLE aihr_onboard_exam_attempt (tenant_id varchar(20), label varchar(20)) ENGINE=InnoDB; CREATE TABLE aihr_onboard_exam_answer (tenant_id varchar(20), label varchar(20)) ENGINE=InnoDB; CREATE TABLE aihr_web_search_provider (tenant_id varchar(20), label varchar(20)) ENGINE=InnoDB; CREATE TABLE aihr_web_ai_query_audit (tenant_id varchar(20), label varchar(20)) ENGINE=InnoDB; CREATE TABLE aihr_community_question (tenant_id varchar(20), label varchar(20)) ENGINE=InnoDB; CREATE TABLE aihr_community_answer (tenant_id varchar(20), label varchar(20)) ENGINE=InnoDB; CREATE TABLE aihr_incentive_rule (tenant_id varchar(20), label varchar(20)) ENGINE=InnoDB; CREATE TABLE aihr_points_ledger (tenant_id varchar(20), label varchar(20)) ENGINE=InnoDB; SQL mysql "$DB" < "$ROOT_DIR/backend/script/sql/update/aihr_20260718_release_collation_compat_mysql8.sql" mysql "$DB" < "$ROOT_DIR/backend/script/sql/update/aihr_20260718_release_collation_compat_mysql8.sql" aligned_columns="$(mysql "$DB" -N -B -e " SELECT COUNT(*) FROM information_schema.columns WHERE table_schema='$DB' AND table_name <> 'aihr_knowledge_info' AND column_name IN ('tenant_id', 'label') AND collation_name='utf8mb4_general_ci'; ")" test "$aligned_columns" = '38' mysql "$DB" < "$ROOT_DIR/backend/script/sql/update/aihr_20260804_unify_all_collations_mysql8.sql" mysql "$DB" < "$ROOT_DIR/backend/script/sql/update/aihr_20260804_unify_all_collations_mysql8.sql" noncanonical_columns="$(mysql "$DB" -N -B -e " SELECT COUNT(*) FROM information_schema.columns WHERE table_schema='$DB' AND table_name LIKE 'aihr\\_%' ESCAPE '\\\\' AND character_set_name IS NOT NULL AND (character_set_name <> 'utf8mb4' OR collation_name <> 'utf8mb4_0900_ai_ci'); ")" test "$noncanonical_columns" = '0' mysql "$DB" <<'SQL' INSERT INTO aihr_knowledge_info VALUES ('000000'); INSERT INTO aihr_knowledge_fragment VALUES ('000000', '片段'); INSERT INTO aihr_data_asset VALUES ('000000', '制度'); INSERT INTO aihr_chunk_revision VALUES ('000000', '片段'); SQL join_count="$(mysql "$DB" -N -B -e " SELECT COUNT(*) FROM aihr_data_asset a JOIN aihr_chunk_revision c ON c.tenant_id = a.tenant_id JOIN aihr_knowledge_fragment f ON f.tenant_id = c.tenant_id; " "$DB")" test "$join_count" = '1' echo "PASS: AIHR release tables inherit the target database collation and all-AIHR normalization is idempotent"