#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""打印 trg_gov_raw_ins / trg_gov_raw_fts_ins 全文，并复现它内部那条 FTS 插入的失败。"""
import sqlite3

c = sqlite3.connect("/root/search.db", timeout=60)
cur = c.cursor()
for n in ("trg_gov_raw_ins", "trg_gov_raw_fts_ins"):
    row = cur.execute("SELECT sql FROM sqlite_master WHERE name=?", (n,)).fetchone()
    print("=== %s ===" % n)
    print(row[0] if row else "（不存在）")
    print()

print("=== gov_search 的建表语句 ===")
row = cur.execute("SELECT sql FROM sqlite_master WHERE name='gov_search'").fetchone()
print(row[0] if row else "（不存在）")
print()

print("=== gov_search 现有 rowid 分布（是否含孤立行）===")
n_fst = cur.execute("SELECT COUNT(*) FROM gov_search").fetchone()[0]
n_raw = cur.execute("SELECT COUNT(*) FROM gov_raw").fetchone()[0]
print("  gov_search %d 行 / gov_raw %d 行 / 差 %d" % (n_fst, n_raw, n_fst - n_raw))
orphan = cur.execute("""SELECT COUNT(*) FROM gov_search g
                        WHERE NOT EXISTS (SELECT 1 FROM gov_raw r WHERE r.id = g.rowid)""").fetchone()[0]
print("  gov_search 中 gov_raw 已无对应行的孤立 rowid: %d" % orphan)
mx = cur.execute("SELECT MAX(rowid) FROM gov_search").fetchone()[0]
mxr = cur.execute("SELECT MAX(id) FROM gov_raw").fetchone()[0]
print("  MAX(gov_search.rowid)=%s  MAX(gov_raw.id)=%s  相等=%s" % (mx, mxr, mx == mxr))
print()

print("=== 复现 trg_gov_raw_fts_ins 内部那条 FTS 插入 ===")
cur.execute("SAVEPOINT sp")
try:
    # 模拟新插入后 new.id = max+1，触发器会拿这个 id 去写 FTS
    newid = mxr + 1
    cur.execute("INSERT INTO gov_search(rowid, title, site_name, summary) VALUES (?,?,?,?)",
                (newid, "x", "x", "x"))
    print("  ✅ 用 id=%d 写 FTS 成功（说明 rowid 本身没问题）" % newid)
except Exception as e:
    print("  ❌ 用 id=%d 写 FTS 失败: %s: %s" % (mxr + 1, type(e).__name__, e))
finally:
    cur.execute("ROLLBACK TO sp"); cur.execute("RELEASE sp")

# 再试：触发器可能用的是 old/new 里某个不存在的列表达式
print()
print("=== 检查 gov_search 是否为 external content 表 ===")
row = cur.execute("SELECT sql FROM sqlite_master WHERE name='gov_search'").fetchone()
s = (row[0] or "").lower()
print("  含 content= :", "content=" in s)
print("  含 content_rowid :", "content_rowid" in s)
c.close()
