Files
akmon/doc_news/test_immutable_functions.sql
2026-01-20 08:04:15 +08:00

115 lines
3.8 KiB
SQL

-- 测试IMMUTABLE函数修复
-- 运行此脚本检查函数是否正确创建为IMMUTABLE
-- ===================================================================
-- 1. 检查函数是否存在并且是IMMUTABLE
-- ===================================================================
SELECT 'Checking IMMUTABLE functions...' as status;
-- 检查函数存在性和IMMUTABLE属性
SELECT
proname as function_name,
provolatile as volatility_code,
CASE provolatile
WHEN 'i' THEN 'IMMUTABLE ✓'
WHEN 's' THEN 'STABLE ❌'
WHEN 'v' THEN 'VOLATILE ❌'
END as volatility_status,
prosrc as function_body
FROM pg_proc
WHERE proname IN ('content_title_to_tsvector', 'content_body_to_tsvector')
AND pronamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'public');
-- ===================================================================
-- 2. 测试函数功能
-- ===================================================================
SELECT 'Testing function functionality...' as status;
-- 测试函数是否能正常工作
SELECT
'Title function test' as test_name,
content_title_to_tsvector('AI Technology News')::text as result;
SELECT
'Content function test' as test_name,
content_body_to_tsvector('Artificial Intelligence is transforming the world')::text as result;
-- ===================================================================
-- 3. 检查索引状态
-- ===================================================================
SELECT 'Checking index status...' as status;
-- 检查索引是否存在
SELECT
schemaname,
tablename,
indexname,
indexdef
FROM pg_indexes
WHERE schemaname = 'public'
AND indexname IN ('idx_contents_fts_title', 'idx_contents_fts_content');
-- ===================================================================
-- 4. 手动创建索引 (如果自动创建失败)
-- ===================================================================
SELECT 'Manual index creation (if needed)...' as status;
-- 如果索引不存在,手动创建
DO $$
BEGIN
-- 检查并创建标题索引
IF NOT EXISTS (
SELECT 1 FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relname = 'idx_contents_fts_title' AND n.nspname = 'public'
) THEN
RAISE NOTICE '创建标题全文搜索索引...';
EXECUTE 'CREATE INDEX idx_contents_fts_title ON public.ak_contents USING gin(content_title_to_tsvector(title))';
RAISE NOTICE '标题索引创建成功';
ELSE
RAISE NOTICE '标题索引已存在';
END IF;
-- 检查并创建内容索引
IF NOT EXISTS (
SELECT 1 FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relname = 'idx_contents_fts_content' AND n.nspname = 'public'
) THEN
RAISE NOTICE '创建内容全文搜索索引...';
EXECUTE 'CREATE INDEX idx_contents_fts_content ON public.ak_contents USING gin(content_body_to_tsvector(content))';
RAISE NOTICE '内容索引创建成功';
ELSE
RAISE NOTICE '内容索引已存在';
END IF;
EXCEPTION
WHEN OTHERS THEN
RAISE NOTICE '索引创建时发生错误: %', SQLERRM;
RAISE NOTICE '错误代码: %', SQLSTATE;
END
$$;
-- ===================================================================
-- 5. 最终验证
-- ===================================================================
SELECT 'Final verification...' as status;
-- 再次检查索引
SELECT
COUNT(*) as index_count,
CASE
WHEN COUNT(*) = 2 THEN '✓ 所有索引创建成功'
ELSE '❌ 索引创建不完整'
END as status
FROM pg_indexes
WHERE schemaname = 'public'
AND indexname IN ('idx_contents_fts_title', 'idx_contents_fts_content');
SELECT '✅ IMMUTABLE函数测试完成' as final_status;