Обсуждение: Stack not being popped correctly (was: Re: [HACKERS] plpgsql lacks generic identifier for record in triggers...)
> [snip] Err... wait, this is a classic case of send first then
> finishing to pondering the gripe.
And sending a reply to ones self without actually testing my suggestion.
>> db=# CREATE FUNCTION schma.tbl_inval() RETURNS TRIGGER AS 'BEGIN
>> EXECUTE public.mc_init();
>> EXECUTE public.mc_delete(''mc_key'');
>> RETURN NULL;
>> END;' LANGUAGE 'plpgsql';
>> db=# CREATE TRIGGER tbl_inval_trg AFTER INSERT OR UPDATE OR DELETE ON
>> schma.tbl FOR EACH STATEMENT EXECUTE PROCEDURE schma.tbl_inval();
Which, doesn't work as expected as it seems as though there's something
left behind on the stack that shouldn't be. Here's the case to
reproduce (doesn't involve pgmemcache):
test=# CREATE TABLE t5 (i int);
Time: 35.294 ms
test=# CREATE FUNCTION t5_func() RETURNS TRIGGER AS 'BEGIN EXECUTE
TRUE; RETURN NULL; END;' LANGUAGE 'plpgsql';
Time: 101.701 ms
test=# CREATE TRIGGER t5_func_trg AFTER INSERT ON t5 FOR EACH STATEMENT
EXECUTE PROCEDURE t5_func();
Time: 62.345 ms
test=# INSERT INTO t5 VALUES (1);
ERROR: syntax error at or near "t" at character 1
QUERY: t
CONTEXT: PL/pgSQL function "t5_func" line 1 at execute statement
LINE 1: t
^
Doh! Can someone with plpgsql foo look into this? -sc
--
Sean Chittenden
Sean Chittenden <sean@chittenden.org> writes:
> Which, doesn't work as expected as it seems as though there's something
> left behind on the stack that shouldn't be. Here's the case to
> reproduce (doesn't involve pgmemcache):
> test=# CREATE FUNCTION t5_func() RETURNS TRIGGER AS 'BEGIN EXECUTE
> TRUE; RETURN NULL; END;' LANGUAGE 'plpgsql';
What are you expecting "execute true" to do? The argument of EXECUTE
is a string, not a boolean, and it's supposed to be a string that looks
like a SQL command. The result
> ERROR: syntax error at or near "t" at character 1
> QUERY: t
> CONTEXT: PL/pgSQL function "t5_func" line 1 at execute statement
> LINE 1: t
> ^
is pretty much what I'd expect considering that plpgsql will do whatever
it takes to coerce the expression result to text.
regards, tom lane
>> Which, doesn't work as expected as it seems as though there's >> something >> left behind on the stack that shouldn't be. Here's the case to >> reproduce (doesn't involve pgmemcache): > >> test=# CREATE FUNCTION t5_func() RETURNS TRIGGER AS 'BEGIN EXECUTE >> TRUE; RETURN NULL; END;' LANGUAGE 'plpgsql'; > > What are you expecting "execute true" to do? Behave the same as PERFORM? Ugh, how humiliating. When writing my pgmemcache presentation, I erroneously wrote EXECUTE instead of PERFORM. When sending off that little flurry of emails, I was updating my pgmemcache presentation and subconsciously propagated the error w/o even thinking about it. :-/ Thanks, I'll take that pumpkin pie on my face. -sc -- Sean Chittenden