"Thomas H." wrote: > i'm trying to write a custom tsearch2 trigger that checks on update if the > column value is changed. here's what i did so far: > > CREATE OR REPLACE FUNCTION "forum"."tsearch2_trigger_posts" () RETURNS > trigger AS > $body$ > BEGIN > IF (TG_OP = 'UPDATE') THEN > IF (NEW.p_msg_clean != OLD.p_msg_clean) THEN > EXECUTE public.tsearch2(NEW.idxfti, NEW.p_msg_clean); > END IF; > RETURN NEW; > ELSIF (TG_OP = 'INSERT') THEN > EXECUTE public.tsearch2(NEW.idxfti, NEW.p_msg_clean); > RETURN NEW; > END IF; > RETURN NULL; -- result is ignored since this is an AFTER trigger > END; > $body$ > LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER; > > > CREATE TRIGGER "posts_ts_update" BEFORE INSERT OR UPDATE > ON "forum"."posts" FOR EACH ROW > EXECUTE PROCEDURE "forum"."tsearch2_trigger_posts"(idxfti, p_msg_clean); > > > unfortunately, the "EXECUTE public.tsearch2" part does not work: > Error while executing the query; ERROR: function public.tsearch2(tsvector, > text) does not exist at character 9 HINT: No function matches the given name > and argument types. You may need to add explicit type casts. QUERY: SELECT > public.tsearch2( $1 , $2 ) CONTEXT: PL/pgSQL function > "tsearch2_trigger_posts" line 4 at execute statement UPDATE forum.posts SET > p_msg_clean" = 'test' WHERE p_t_id = 4468 actually, there is no such function as tsearch2(tsvector, text) - so postgres is right :) t1=> \df++ tsearch2 List of functions -[ RECORD 1 ]-------+---------- Schema | public Name | tsearch2 Result data type | "trigger" Argument data types | Owner | pgdba Language | c Source code | tsearch2 Description | and AFAIK you cannot call trigger functions directly neither from SQL nor pl/pgsql > > when using the public.tsearch2 function directly as a trigger, it works > fine: > > CREATE TRIGGER "posts_ts_update" BEFORE INSERT OR UPDATE > ON "forum"."posts" FOR EACH ROW > EXECUTE PROCEDURE "public"."tsearch2"(idxfti, p_msg_clean); > i would stick with this - it does exactly the same as your non-working code above, and is faster > > when i'm trying to use EXECUTE PROCEDURE instead of EXECUTE within the > function, it won't compile: > ERROR: syntax error at or near "tsearch2" at character 19 > QUERY: SELECT PROCEDURE public.tsearch2( $1 , $2 ) > CONTEXT: SQL statement in PL/PgSQL function "tsearch2_trigger_news" near > line 4 EXECUTE is not what you want, see http://www.postgresql.org/docs/current/static/sql-execute.html