--> Trigger tests
CREATE TABLE trigt (
	last varchar(64),
	data bigint
) WITHOUT OIDS;
INSERT INTO trigt VALUES ('existing', -321);
INSERT INTO trigt VALUES ('existing', 34883924);
INSERT INTO trigt VALUES ('existing', 8498382);
INSERT INTO trigt VALUES ('existing', -328138238382);
INSERT INTO trigt VALUES ('existing', 328138238382);
SELECT * FROM trigt;
   last   |     data      
----------+---------------
 existing |          -321
 existing |      34883924
 existing |       8498382
 existing | -328138238382
 existing |  328138238382
(5 rows)

--> Delete it test
CREATE OR REPLACE FUNCTION deleter()
RETURNS TRIGGER LANGUAGE plpy
AS 'return kw["TUPLE"]';
CREATE TRIGGER deleter
 BEFORE DELETE ON trigt
 FOR EACH ROW
  EXECUTE PROCEDURE deleter();
DELETE FROM trigt WHERE data < 0;
SELECT * FROM trigt;
   last   |     data     
----------+--------------
 existing |     34883924
 existing |      8498382
 existing | 328138238382
(3 rows)

DROP TRIGGER deleter ON trigt;
--> Don't delete it test
CREATE OR REPLACE FUNCTION dont_delete_it()
RETURNS TRIGGER LANGUAGE plpy
AS 'pass';
CREATE TRIGGER deleter
 BEFORE DELETE ON trigt
 FOR EACH ROW
  EXECUTE PROCEDURE dont_delete_it();
DELETE FROM trigt;
SELECT * FROM trigt;
   last   |     data     
----------+--------------
 existing |     34883924
 existing |      8498382
 existing | 328138238382
(3 rows)

DROP TRIGGER deleter ON trigt;
--> Show the got a return value in an AFTER trigger warning
CREATE OR REPLACE FUNCTION warner ()
RETURNS TRIGGER LANGUAGE plpy
AS 'return kw["TD"]("fake", 0)';
CREATE TRIGGER warner
 AFTER INSERT ON trigt
 FOR EACH ROW
  EXECUTE PROCEDURE warner();
INSERT INTO trigt VALUES ('warning check', 123);
WARNING:  ignoring return from trigger function fired after
DETAIL:  function executed by trigger 'warner' on 'trigt'
HINT:  return None in the function to quiet this
DROP TRIGGER warner ON trigt;
--> Raise exception in trigger
CREATE OR REPLACE FUNCTION trig_exc ()
RETURNS TRIGGER LANGUAGE plpy
AS 'raise SyntaxError';
CREATE TRIGGER exc
 BEFORE INSERT ON trigt
 FOR EACH ROW
  EXECUTE PROCEDURE trig_exc();
INSERT INTO trigt VALUES ('exception check', 123);
ERROR:  function raised exception
DETAIL:  (most recent call last):
  File "Postgres", line 2, in trig_exc

exceptions.SyntaxError 
DROP TRIGGER exc ON trigt;
--> Insert a different tuple instead of the given one
CREATE OR REPLACE FUNCTION insert_instead ()
RETURNS TRIGGER LANGUAGE plpy
AS 'return ("inserted", 55)';
CREATE TRIGGER insert_instead
 BEFORE INSERT ON trigt
 FOR EACH ROW
  EXECUTE PROCEDURE insert_instead();
INSERT INTO trigt VALUES ('should never exist', 123);
ERROR:  erroneous return object
DETAIL:  expecting a Postgres.Tuple or a sequence, got tuple
CONTEXT:  trigger procedure
INSERT INTO trigt VALUES ('should never exist', 321);
ERROR:  erroneous return object
DETAIL:  expecting a Postgres.Tuple or a sequence, got tuple
CONTEXT:  trigger procedure
SELECT * FROM trigt;
     last      |     data     
---------------+--------------
 existing      |     34883924
 existing      |      8498382
 existing      | 328138238382
 warning check |          123
(4 rows)

DROP TRIGGER insert_instead ON trigt;
--> Show last state and drop table for retesting
SELECT * FROM trigt;
     last      |     data     
---------------+--------------
 existing      |     34883924
 existing      |      8498382
 existing      | 328138238382
 warning check |          123
(4 rows)

DROP TABLE trigt;
/* vim: set filetype=sql: */
