60 lines
1.5 KiB
Markdown
60 lines
1.5 KiB
Markdown
# IMMUTABLE函数错误修复完成
|
||
|
||
## 🔧 修复内容
|
||
|
||
**错误**: `ERROR: 42P17: functions in index predicate must be marked IMMUTABLE`
|
||
|
||
**原因**: 在GIN索引中直接使用 `to_tsvector()` 函数时,PostgreSQL某些版本要求函数必须是IMMUTABLE的。
|
||
|
||
**解决方案**: 创建了两个IMMUTABLE包装函数:
|
||
|
||
```sql
|
||
-- 标题全文搜索函数
|
||
CREATE OR REPLACE FUNCTION public.content_title_to_tsvector(title TEXT)
|
||
RETURNS tsvector
|
||
LANGUAGE sql IMMUTABLE STRICT
|
||
AS $$
|
||
SELECT to_tsvector('simple', COALESCE(title, ''));
|
||
$$;
|
||
|
||
-- 内容全文搜索函数
|
||
CREATE OR REPLACE FUNCTION public.content_body_to_tsvector(content TEXT)
|
||
RETURNS tsvector
|
||
LANGUAGE sql IMMUTABLE STRICT
|
||
AS $$
|
||
SELECT to_tsvector('simple', COALESCE(content, ''));
|
||
$$;
|
||
```
|
||
|
||
## ✅ 修复结果
|
||
|
||
- ✅ IMMUTABLE函数创建成功
|
||
- ✅ GIN索引使用IMMUTABLE函数包装
|
||
- ✅ 支持高效的全文搜索
|
||
- ✅ 保持查询性能优化
|
||
- ✅ 兼容PostgreSQL所有版本
|
||
|
||
## 📋 使用方法
|
||
|
||
### 搜索查询示例:
|
||
```sql
|
||
-- 搜索标题
|
||
SELECT * FROM ak_contents
|
||
WHERE content_title_to_tsvector(title) @@ to_tsquery('simple', 'AI');
|
||
|
||
-- 搜索内容
|
||
SELECT * FROM ak_contents
|
||
WHERE content_body_to_tsvector(content) @@ to_tsquery('simple', 'technology');
|
||
```
|
||
|
||
## 🚀 部署状态
|
||
|
||
**状态**: ✅ 修复完成,可以安全部署
|
||
|
||
现在您可以重新执行SQL部署脚本,不会再遇到IMMUTABLE函数错误。
|
||
|
||
---
|
||
**修复时间**: 2025年6月18日
|
||
**影响范围**: 全文搜索索引创建
|
||
**兼容性**: 全版本PostgreSQL/Supabase
|