diff -U3 /tmp/cirrus-ci-build/src/pl/plpython/expected/plpython_populate.out /tmp/cirrus-ci-build/build-32/testrun/plpython/regress/results/plpython_populate.out --- /tmp/cirrus-ci-build/src/pl/plpython/expected/plpython_populate.out 2024-03-19 15:41:10.840280546 +0000 +++ /tmp/cirrus-ci-build/build-32/testrun/plpython/regress/results/plpython_populate.out 2024-03-19 15:48:10.731949963 +0000 @@ -8,15 +8,7 @@ INSERT INTO taxonomy (name) VALUES ('HIV II') ; INSERT INTO taxonomy (name) VALUES ('HCV') ; INSERT INTO entry (accession, txid) VALUES ('A00001', '1') ; -INSERT INTO entry (accession, txid) VALUES ('A00002', '1') ; -INSERT INTO entry (accession, txid) VALUES ('A00003', '1') ; -INSERT INTO entry (accession, txid) VALUES ('A00004', '2') ; -INSERT INTO entry (accession, txid) VALUES ('A00005', '2') ; -INSERT INTO entry (accession, txid) VALUES ('A00006', '3') ; -INSERT INTO sequences (sequence, eid, product, multipart) VALUES ('ABCDEF', 1, 'env', 'true') ; -INSERT INTO xsequences (sequence, pid) VALUES ('GHIJKL', 1) ; -INSERT INTO sequences (sequence, eid, product) VALUES ('ABCDEF', 2, 'env') ; -INSERT INTO sequences (sequence, eid, product) VALUES ('ABCDEF', 3, 'env') ; -INSERT INTO sequences (sequence, eid, product) VALUES ('ABCDEF', 4, 'gag') ; -INSERT INTO sequences (sequence, eid, product) VALUES ('ABCDEF', 5, 'env') ; -INSERT INTO sequences (sequence, eid, product) VALUES ('ABCDEF', 6, 'ns1') ; +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +connection to server was lost diff -U3 /tmp/cirrus-ci-build/src/pl/plpython/expected/plpython_spi.out /tmp/cirrus-ci-build/build-32/testrun/plpython/regress/results/plpython_spi.out --- /tmp/cirrus-ci-build/src/pl/plpython/expected/plpython_spi.out 2024-03-19 15:41:10.840280546 +0000 +++ /tmp/cirrus-ci-build/build-32/testrun/plpython/regress/results/plpython_spi.out 2024-03-19 15:48:10.971949753 +0000 @@ -108,25 +108,13 @@ SELECT join_sequences(sequences) FROM sequences; join_sequences ---------------- - ABCDEFGHIJKL - ABCDEF - ABCDEF - ABCDEF - ABCDEF - ABCDEF -(6 rows) +(0 rows) SELECT join_sequences(sequences) FROM sequences WHERE join_sequences(sequences) ~* '^A'; join_sequences ---------------- - ABCDEFGHIJKL - ABCDEF - ABCDEF - ABCDEF - ABCDEF - ABCDEF -(6 rows) +(0 rows) SELECT join_sequences(sequences) FROM sequences WHERE join_sequences(sequences) ~* '^B'; diff -U3 /tmp/cirrus-ci-build/src/pl/plpython/expected/plpython_trigger.out /tmp/cirrus-ci-build/build-32/testrun/plpython/regress/results/plpython_trigger.out --- /tmp/cirrus-ci-build/src/pl/plpython/expected/plpython_trigger.out 2024-03-19 15:41:10.840280546 +0000 +++ /tmp/cirrus-ci-build/build-32/testrun/plpython/regress/results/plpython_trigger.out 2024-03-19 15:48:11.531949265 +0000 @@ -121,500 +121,7 @@ NOTICE: TD[table_name] => trigger_test NOTICE: TD[table_schema] => public NOTICE: TD[when] => BEFORE -NOTICE: TD[args] => ['23', 'skidoo'] -NOTICE: TD[event] => INSERT -NOTICE: TD[level] => ROW -NOTICE: TD[name] => show_trigger_data_trig_after -NOTICE: TD[new] => {'i': 1, 'v': 'insert'} -NOTICE: TD[old] => None -NOTICE: TD[relid] => bogus:12345 -NOTICE: TD[table_name] => trigger_test -NOTICE: TD[table_schema] => public -NOTICE: TD[when] => AFTER -update trigger_test set v = 'update' where i = 1; -NOTICE: TD[args] => ['23', 'skidoo'] -NOTICE: TD[event] => UPDATE -NOTICE: TD[level] => STATEMENT -NOTICE: TD[name] => show_trigger_data_trig_stmt -NOTICE: TD[new] => None -NOTICE: TD[old] => None -NOTICE: TD[relid] => bogus:12345 -NOTICE: TD[table_name] => trigger_test -NOTICE: TD[table_schema] => public -NOTICE: TD[when] => BEFORE -NOTICE: TD[args] => ['23', 'skidoo'] -NOTICE: TD[event] => UPDATE -NOTICE: TD[level] => ROW -NOTICE: TD[name] => show_trigger_data_trig_before -NOTICE: TD[new] => {'i': 1, 'v': 'update'} -NOTICE: TD[old] => {'i': 1, 'v': 'insert'} -NOTICE: TD[relid] => bogus:12345 -NOTICE: TD[table_name] => trigger_test -NOTICE: TD[table_schema] => public -NOTICE: TD[when] => BEFORE -NOTICE: TD[args] => ['23', 'skidoo'] -NOTICE: TD[event] => UPDATE -NOTICE: TD[level] => ROW -NOTICE: TD[name] => show_trigger_data_trig_after -NOTICE: TD[new] => {'i': 1, 'v': 'update'} -NOTICE: TD[old] => {'i': 1, 'v': 'insert'} -NOTICE: TD[relid] => bogus:12345 -NOTICE: TD[table_name] => trigger_test -NOTICE: TD[table_schema] => public -NOTICE: TD[when] => AFTER -delete from trigger_test; -NOTICE: TD[args] => ['23', 'skidoo'] -NOTICE: TD[event] => DELETE -NOTICE: TD[level] => STATEMENT -NOTICE: TD[name] => show_trigger_data_trig_stmt -NOTICE: TD[new] => None -NOTICE: TD[old] => None -NOTICE: TD[relid] => bogus:12345 -NOTICE: TD[table_name] => trigger_test -NOTICE: TD[table_schema] => public -NOTICE: TD[when] => BEFORE -NOTICE: TD[args] => ['23', 'skidoo'] -NOTICE: TD[event] => DELETE -NOTICE: TD[level] => ROW -NOTICE: TD[name] => show_trigger_data_trig_before -NOTICE: TD[new] => None -NOTICE: TD[old] => {'i': 1, 'v': 'update'} -NOTICE: TD[relid] => bogus:12345 -NOTICE: TD[table_name] => trigger_test -NOTICE: TD[table_schema] => public -NOTICE: TD[when] => BEFORE -NOTICE: TD[args] => ['23', 'skidoo'] -NOTICE: TD[event] => DELETE -NOTICE: TD[level] => ROW -NOTICE: TD[name] => show_trigger_data_trig_after -NOTICE: TD[new] => None -NOTICE: TD[old] => {'i': 1, 'v': 'update'} -NOTICE: TD[relid] => bogus:12345 -NOTICE: TD[table_name] => trigger_test -NOTICE: TD[table_schema] => public -NOTICE: TD[when] => AFTER -truncate table trigger_test; -NOTICE: TD[args] => ['23', 'skidoo'] -NOTICE: TD[event] => TRUNCATE -NOTICE: TD[level] => STATEMENT -NOTICE: TD[name] => show_trigger_data_trig_stmt -NOTICE: TD[new] => None -NOTICE: TD[old] => None -NOTICE: TD[relid] => bogus:12345 -NOTICE: TD[table_name] => trigger_test -NOTICE: TD[table_schema] => public -NOTICE: TD[when] => BEFORE -DROP TRIGGER show_trigger_data_trig_stmt on trigger_test; -DROP TRIGGER show_trigger_data_trig_before on trigger_test; -DROP TRIGGER show_trigger_data_trig_after on trigger_test; -CREATE TRIGGER show_trigger_data_trig_before -BEFORE INSERT OR UPDATE OR DELETE ON trigger_test_generated -FOR EACH ROW EXECUTE PROCEDURE trigger_data(); -CREATE TRIGGER show_trigger_data_trig_after -AFTER INSERT OR UPDATE OR DELETE ON trigger_test_generated -FOR EACH ROW EXECUTE PROCEDURE trigger_data(); -insert into trigger_test_generated (i) values (1); -NOTICE: TD[args] => None -NOTICE: TD[event] => INSERT -NOTICE: TD[level] => ROW -NOTICE: TD[name] => show_trigger_data_trig_before -NOTICE: TD[new] => {'i': 1} -NOTICE: TD[old] => None -NOTICE: TD[relid] => bogus:12345 -NOTICE: TD[table_name] => trigger_test_generated -NOTICE: TD[table_schema] => public -NOTICE: TD[when] => BEFORE -NOTICE: TD[args] => None -NOTICE: TD[event] => INSERT -NOTICE: TD[level] => ROW -NOTICE: TD[name] => show_trigger_data_trig_after -NOTICE: TD[new] => {'i': 1, 'j': 2} -NOTICE: TD[old] => None -NOTICE: TD[relid] => bogus:12345 -NOTICE: TD[table_name] => trigger_test_generated -NOTICE: TD[table_schema] => public -NOTICE: TD[when] => AFTER -update trigger_test_generated set i = 11 where i = 1; -NOTICE: TD[args] => None -NOTICE: TD[event] => UPDATE -NOTICE: TD[level] => ROW -NOTICE: TD[name] => show_trigger_data_trig_before -NOTICE: TD[new] => {'i': 11} -NOTICE: TD[old] => {'i': 1, 'j': 2} -NOTICE: TD[relid] => bogus:12345 -NOTICE: TD[table_name] => trigger_test_generated -NOTICE: TD[table_schema] => public -NOTICE: TD[when] => BEFORE -NOTICE: TD[args] => None -NOTICE: TD[event] => UPDATE -NOTICE: TD[level] => ROW -NOTICE: TD[name] => show_trigger_data_trig_after -NOTICE: TD[new] => {'i': 11, 'j': 22} -NOTICE: TD[old] => {'i': 1, 'j': 2} -NOTICE: TD[relid] => bogus:12345 -NOTICE: TD[table_name] => trigger_test_generated -NOTICE: TD[table_schema] => public -NOTICE: TD[when] => AFTER -delete from trigger_test_generated; -NOTICE: TD[args] => None -NOTICE: TD[event] => DELETE -NOTICE: TD[level] => ROW -NOTICE: TD[name] => show_trigger_data_trig_before -NOTICE: TD[new] => None -NOTICE: TD[old] => {'i': 11, 'j': 22} -NOTICE: TD[relid] => bogus:12345 -NOTICE: TD[table_name] => trigger_test_generated -NOTICE: TD[table_schema] => public -NOTICE: TD[when] => BEFORE -NOTICE: TD[args] => None -NOTICE: TD[event] => DELETE -NOTICE: TD[level] => ROW -NOTICE: TD[name] => show_trigger_data_trig_after -NOTICE: TD[new] => None -NOTICE: TD[old] => {'i': 11, 'j': 22} -NOTICE: TD[relid] => bogus:12345 -NOTICE: TD[table_name] => trigger_test_generated -NOTICE: TD[table_schema] => public -NOTICE: TD[when] => AFTER -DROP TRIGGER show_trigger_data_trig_before ON trigger_test_generated; -DROP TRIGGER show_trigger_data_trig_after ON trigger_test_generated; -insert into trigger_test values(1,'insert'); -CREATE VIEW trigger_test_view AS SELECT * FROM trigger_test; -CREATE TRIGGER show_trigger_data_trig -INSTEAD OF INSERT OR UPDATE OR DELETE ON trigger_test_view -FOR EACH ROW EXECUTE PROCEDURE trigger_data(24,'skidoo view'); -insert into trigger_test_view values(2,'insert'); -NOTICE: TD[args] => ['24', 'skidoo view'] -NOTICE: TD[event] => INSERT -NOTICE: TD[level] => ROW -NOTICE: TD[name] => show_trigger_data_trig -NOTICE: TD[new] => {'i': 2, 'v': 'insert'} -NOTICE: TD[old] => None -NOTICE: TD[relid] => bogus:12345 -NOTICE: TD[table_name] => trigger_test_view -NOTICE: TD[table_schema] => public -NOTICE: TD[when] => INSTEAD OF -update trigger_test_view set v = 'update' where i = 1; -NOTICE: TD[args] => ['24', 'skidoo view'] -NOTICE: TD[event] => UPDATE -NOTICE: TD[level] => ROW -NOTICE: TD[name] => show_trigger_data_trig -NOTICE: TD[new] => {'i': 1, 'v': 'update'} -NOTICE: TD[old] => {'i': 1, 'v': 'insert'} -NOTICE: TD[relid] => bogus:12345 -NOTICE: TD[table_name] => trigger_test_view -NOTICE: TD[table_schema] => public -NOTICE: TD[when] => INSTEAD OF -delete from trigger_test_view; -NOTICE: TD[args] => ['24', 'skidoo view'] -NOTICE: TD[event] => DELETE -NOTICE: TD[level] => ROW -NOTICE: TD[name] => show_trigger_data_trig -NOTICE: TD[new] => None -NOTICE: TD[old] => {'i': 1, 'v': 'insert'} -NOTICE: TD[relid] => bogus:12345 -NOTICE: TD[table_name] => trigger_test_view -NOTICE: TD[table_schema] => public -NOTICE: TD[when] => INSTEAD OF -DROP FUNCTION trigger_data() CASCADE; -NOTICE: drop cascades to trigger show_trigger_data_trig on view trigger_test_view -DROP VIEW trigger_test_view; -delete from trigger_test; --- --- trigger error handling --- -INSERT INTO trigger_test VALUES (0, 'zero'); --- returning non-string from trigger function -CREATE FUNCTION stupid1() RETURNS trigger -AS $$ - return 37 -$$ LANGUAGE plpython3u; -CREATE TRIGGER stupid_trigger1 -BEFORE INSERT ON trigger_test -FOR EACH ROW EXECUTE PROCEDURE stupid1(); -INSERT INTO trigger_test VALUES (1, 'one'); -ERROR: unexpected return value from trigger procedure -DETAIL: Expected None or a string. -CONTEXT: PL/Python function "stupid1" -DROP TRIGGER stupid_trigger1 ON trigger_test; --- returning MODIFY from DELETE trigger -CREATE FUNCTION stupid2() RETURNS trigger -AS $$ - return "MODIFY" -$$ LANGUAGE plpython3u; -CREATE TRIGGER stupid_trigger2 -BEFORE DELETE ON trigger_test -FOR EACH ROW EXECUTE PROCEDURE stupid2(); -DELETE FROM trigger_test WHERE i = 0; -WARNING: PL/Python trigger function returned "MODIFY" in a DELETE trigger -- ignored -DROP TRIGGER stupid_trigger2 ON trigger_test; -INSERT INTO trigger_test VALUES (0, 'zero'); --- returning unrecognized string from trigger function -CREATE FUNCTION stupid3() RETURNS trigger -AS $$ - return "foo" -$$ LANGUAGE plpython3u; -CREATE TRIGGER stupid_trigger3 -BEFORE UPDATE ON trigger_test -FOR EACH ROW EXECUTE PROCEDURE stupid3(); -UPDATE trigger_test SET v = 'null' WHERE i = 0; -ERROR: unexpected return value from trigger procedure -DETAIL: Expected None, "OK", "SKIP", or "MODIFY". -CONTEXT: PL/Python function "stupid3" -DROP TRIGGER stupid_trigger3 ON trigger_test; --- Unicode variant -CREATE FUNCTION stupid3u() RETURNS trigger -AS $$ - return "foo" -$$ LANGUAGE plpython3u; -CREATE TRIGGER stupid_trigger3 -BEFORE UPDATE ON trigger_test -FOR EACH ROW EXECUTE PROCEDURE stupid3u(); -UPDATE trigger_test SET v = 'null' WHERE i = 0; -ERROR: unexpected return value from trigger procedure -DETAIL: Expected None, "OK", "SKIP", or "MODIFY". -CONTEXT: PL/Python function "stupid3u" -DROP TRIGGER stupid_trigger3 ON trigger_test; --- deleting the TD dictionary -CREATE FUNCTION stupid4() RETURNS trigger -AS $$ - del TD["new"] - return "MODIFY"; -$$ LANGUAGE plpython3u; -CREATE TRIGGER stupid_trigger4 -BEFORE UPDATE ON trigger_test -FOR EACH ROW EXECUTE PROCEDURE stupid4(); -UPDATE trigger_test SET v = 'null' WHERE i = 0; -ERROR: TD["new"] deleted, cannot modify row -CONTEXT: while modifying trigger row -PL/Python function "stupid4" -DROP TRIGGER stupid_trigger4 ON trigger_test; --- TD not a dictionary -CREATE FUNCTION stupid5() RETURNS trigger -AS $$ - TD["new"] = ['foo', 'bar'] - return "MODIFY"; -$$ LANGUAGE plpython3u; -CREATE TRIGGER stupid_trigger5 -BEFORE UPDATE ON trigger_test -FOR EACH ROW EXECUTE PROCEDURE stupid5(); -UPDATE trigger_test SET v = 'null' WHERE i = 0; -ERROR: TD["new"] is not a dictionary -CONTEXT: while modifying trigger row -PL/Python function "stupid5" -DROP TRIGGER stupid_trigger5 ON trigger_test; --- TD not having string keys -CREATE FUNCTION stupid6() RETURNS trigger -AS $$ - TD["new"] = {1: 'foo', 2: 'bar'} - return "MODIFY"; -$$ LANGUAGE plpython3u; -CREATE TRIGGER stupid_trigger6 -BEFORE UPDATE ON trigger_test -FOR EACH ROW EXECUTE PROCEDURE stupid6(); -UPDATE trigger_test SET v = 'null' WHERE i = 0; -ERROR: TD["new"] dictionary key at ordinal position 0 is not a string -CONTEXT: while modifying trigger row -PL/Python function "stupid6" -DROP TRIGGER stupid_trigger6 ON trigger_test; --- TD keys not corresponding to row columns -CREATE FUNCTION stupid7() RETURNS trigger -AS $$ - TD["new"] = {'v': 'foo', 'a': 'bar'} - return "MODIFY"; -$$ LANGUAGE plpython3u; -CREATE TRIGGER stupid_trigger7 -BEFORE UPDATE ON trigger_test -FOR EACH ROW EXECUTE PROCEDURE stupid7(); -UPDATE trigger_test SET v = 'null' WHERE i = 0; -ERROR: key "a" found in TD["new"] does not exist as a column in the triggering row -CONTEXT: while modifying trigger row -PL/Python function "stupid7" -DROP TRIGGER stupid_trigger7 ON trigger_test; --- Unicode variant -CREATE FUNCTION stupid7u() RETURNS trigger -AS $$ - TD["new"] = {'v': 'foo', 'a': 'bar'} - return "MODIFY" -$$ LANGUAGE plpython3u; -CREATE TRIGGER stupid_trigger7 -BEFORE UPDATE ON trigger_test -FOR EACH ROW EXECUTE PROCEDURE stupid7u(); -UPDATE trigger_test SET v = 'null' WHERE i = 0; -ERROR: key "a" found in TD["new"] does not exist as a column in the triggering row -CONTEXT: while modifying trigger row -PL/Python function "stupid7u" -DROP TRIGGER stupid_trigger7 ON trigger_test; --- calling a trigger function directly -SELECT stupid7(); -ERROR: trigger functions can only be called as triggers --- --- Null values --- -SELECT * FROM trigger_test; - i | v ----+------ - 0 | zero -(1 row) - -CREATE FUNCTION test_null() RETURNS trigger -AS $$ - TD["new"]['v'] = None - return "MODIFY" -$$ LANGUAGE plpython3u; -CREATE TRIGGER test_null_trigger -BEFORE UPDATE ON trigger_test -FOR EACH ROW EXECUTE PROCEDURE test_null(); -UPDATE trigger_test SET v = 'null' WHERE i = 0; -DROP TRIGGER test_null_trigger ON trigger_test; -SELECT * FROM trigger_test; - i | v ----+--- - 0 | -(1 row) - --- --- Test that triggers honor typmod when assigning to tuple fields, --- as per an early 9.0 bug report --- -SET DateStyle = 'ISO'; -CREATE FUNCTION set_modif_time() RETURNS trigger AS $$ - TD['new']['modif_time'] = '2010-10-13 21:57:28.930486' - return 'MODIFY' -$$ LANGUAGE plpython3u; -CREATE TABLE pb (a TEXT, modif_time TIMESTAMP(0) WITHOUT TIME ZONE); -CREATE TRIGGER set_modif_time BEFORE UPDATE ON pb - FOR EACH ROW EXECUTE PROCEDURE set_modif_time(); -INSERT INTO pb VALUES ('a', '2010-10-09 21:57:33.930486'); -SELECT * FROM pb; - a | modif_time ----+--------------------- - a | 2010-10-09 21:57:34 -(1 row) - -UPDATE pb SET a = 'b'; -SELECT * FROM pb; - a | modif_time ----+--------------------- - b | 2010-10-13 21:57:29 -(1 row) - --- triggers for tables with composite types -CREATE TABLE comp1 (i integer, j boolean); -CREATE TYPE comp2 AS (k integer, l boolean); -CREATE TABLE composite_trigger_test (f1 comp1, f2 comp2); -CREATE FUNCTION composite_trigger_f() RETURNS trigger AS $$ - TD['new']['f1'] = (3, False) - TD['new']['f2'] = {'k': 7, 'l': 'yes', 'ignored': 10} - return 'MODIFY' -$$ LANGUAGE plpython3u; -CREATE TRIGGER composite_trigger BEFORE INSERT ON composite_trigger_test - FOR EACH ROW EXECUTE PROCEDURE composite_trigger_f(); -INSERT INTO composite_trigger_test VALUES (NULL, NULL); -SELECT * FROM composite_trigger_test; - f1 | f2 --------+------- - (3,f) | (7,t) -(1 row) - --- triggers with composite type columns (bug #6559) -CREATE TABLE composite_trigger_noop_test (f1 comp1, f2 comp2); -CREATE FUNCTION composite_trigger_noop_f() RETURNS trigger AS $$ - return 'MODIFY' -$$ LANGUAGE plpython3u; -CREATE TRIGGER composite_trigger_noop BEFORE INSERT ON composite_trigger_noop_test - FOR EACH ROW EXECUTE PROCEDURE composite_trigger_noop_f(); -INSERT INTO composite_trigger_noop_test VALUES (NULL, NULL); -INSERT INTO composite_trigger_noop_test VALUES (ROW(1, 'f'), NULL); -INSERT INTO composite_trigger_noop_test VALUES (ROW(NULL, 't'), ROW(1, 'f')); -SELECT * FROM composite_trigger_noop_test; - f1 | f2 --------+------- - | - (1,f) | - (,t) | (1,f) -(3 rows) - --- nested composite types -CREATE TYPE comp3 AS (c1 comp1, c2 comp2, m integer); -CREATE TABLE composite_trigger_nested_test(c comp3); -CREATE FUNCTION composite_trigger_nested_f() RETURNS trigger AS $$ - return 'MODIFY' -$$ LANGUAGE plpython3u; -CREATE TRIGGER composite_trigger_nested BEFORE INSERT ON composite_trigger_nested_test - FOR EACH ROW EXECUTE PROCEDURE composite_trigger_nested_f(); -INSERT INTO composite_trigger_nested_test VALUES (NULL); -INSERT INTO composite_trigger_nested_test VALUES (ROW(ROW(1, 'f'), NULL, 3)); -INSERT INTO composite_trigger_nested_test VALUES (ROW(ROW(NULL, 't'), ROW(1, 'f'), NULL)); -SELECT * FROM composite_trigger_nested_test; - c -------------------- - - ("(1,f)",,3) - ("(,t)","(1,f)",) -(3 rows) - --- check that using a function as a trigger over two tables works correctly -CREATE FUNCTION trig1234() RETURNS trigger LANGUAGE plpython3u AS $$ - TD["new"]["data"] = '1234' - return 'MODIFY' -$$; -CREATE TABLE a(data text); -CREATE TABLE b(data int); -- different type conversion -CREATE TRIGGER a_t BEFORE INSERT ON a FOR EACH ROW EXECUTE PROCEDURE trig1234(); -CREATE TRIGGER b_t BEFORE INSERT ON b FOR EACH ROW EXECUTE PROCEDURE trig1234(); -INSERT INTO a DEFAULT VALUES; -SELECT * FROM a; - data ------- - 1234 -(1 row) - -DROP TABLE a; -INSERT INTO b DEFAULT VALUES; -SELECT * FROM b; - data ------- - 1234 -(1 row) - --- check that SQL run in trigger code can see transition tables -CREATE TABLE transition_table_test (id int, name text); -INSERT INTO transition_table_test VALUES (1, 'a'); -CREATE FUNCTION transition_table_test_f() RETURNS trigger LANGUAGE plpython3u AS -$$ - rv = plpy.execute("SELECT * FROM old_table") - assert(rv.nrows() == 1) - plpy.info("old: " + str(rv[0]["id"]) + " -> " + rv[0]["name"]) - rv = plpy.execute("SELECT * FROM new_table") - assert(rv.nrows() == 1) - plpy.info("new: " + str(rv[0]["id"]) + " -> " + rv[0]["name"]) - return None -$$; -CREATE TRIGGER a_t AFTER UPDATE ON transition_table_test - REFERENCING OLD TABLE AS old_table NEW TABLE AS new_table - FOR EACH STATEMENT EXECUTE PROCEDURE transition_table_test_f(); -UPDATE transition_table_test SET name = 'b'; -INFO: old: 1 -> a -INFO: new: 1 -> b -DROP TABLE transition_table_test; -DROP FUNCTION transition_table_test_f(); --- dealing with generated columns -CREATE FUNCTION generated_test_func1() RETURNS trigger -LANGUAGE plpython3u -AS $$ -TD['new']['j'] = 5 # not allowed -return 'MODIFY' -$$; -CREATE TRIGGER generated_test_trigger1 BEFORE INSERT ON trigger_test_generated -FOR EACH ROW EXECUTE PROCEDURE generated_test_func1(); -TRUNCATE trigger_test_generated; -INSERT INTO trigger_test_generated (i) VALUES (1); -ERROR: cannot set generated column "j" -CONTEXT: while modifying trigger row -PL/Python function "generated_test_func1" -SELECT * FROM trigger_test_generated; - i | j ----+--- -(0 rows) - +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +connection to server was lost diff -U3 /tmp/cirrus-ci-build/src/pl/plpython/expected/plpython_transaction.out /tmp/cirrus-ci-build/build-32/testrun/plpython/regress/results/plpython_transaction.out --- /tmp/cirrus-ci-build/src/pl/plpython/expected/plpython_transaction.out 2024-03-19 15:41:10.840280546 +0000 +++ /tmp/cirrus-ci-build/build-32/testrun/plpython/regress/results/plpython_transaction.out 2024-03-19 15:48:12.299948593 +0000 @@ -206,45 +206,7 @@ plpy.commit() plpy.warning('should not get here') $$; -ERROR: spiexceptions.ForeignKeyViolation: insert or update on table "testfk" violates foreign key constraint "testfk_f1_fkey" -DETAIL: Key (f1)=(0) is not present in table "testpk". -CONTEXT: Traceback (most recent call last): - PL/Python anonymous code block, line 4, in - plpy.commit() -PL/Python anonymous code block -SELECT * FROM testpk; - id ----- -(0 rows) - -SELECT * FROM testfk; - f1 ----- -(0 rows) - -DO LANGUAGE plpython3u $$ -# this insert will fail during commit: -plpy.execute("INSERT INTO testfk VALUES (0)") -try: - plpy.commit() -except Exception as e: - plpy.info('sqlstate: %s' % (e.sqlstate)) -# these inserts should work: -plpy.execute("INSERT INTO testpk VALUES (1)") -plpy.execute("INSERT INTO testfk VALUES (1)") -$$; -INFO: sqlstate: 23503 -SELECT * FROM testpk; - id ----- - 1 -(1 row) - -SELECT * FROM testfk; - f1 ----- - 1 -(1 row) - -DROP TABLE test1; -DROP TABLE test2; +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +connection to server was lost diff -U3 /tmp/cirrus-ci-build/src/pl/plpython/expected/plpython_drop.out /tmp/cirrus-ci-build/build-32/testrun/plpython/regress/results/plpython_drop.out --- /tmp/cirrus-ci-build/src/pl/plpython/expected/plpython_drop.out 2024-03-19 15:41:10.836280550 +0000 +++ /tmp/cirrus-ci-build/build-32/testrun/plpython/regress/results/plpython_drop.out 2024-03-19 15:48:13.947947154 +0000 @@ -3,3 +3,10 @@ -- SET client_min_messages = WARNING; DROP EXTENSION plpython3u CASCADE; +WARNING: terminating connection because of crash of another server process +DETAIL: The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory. +HINT: In a moment you should be able to reconnect to the database and repeat your command. +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +connection to server was lost