--------------------------------------------------------------- --- REPRO STEPS --------------------------------------------------------------- drop table if exists t1 ; create table t1 ( id int ); CREATE OR REPLACE FUNCTION test_prep2() RETURNS void AS $$ DECLARE lid int; BEGIN SELECT * FROM t1 INTO lid; END; $$ LANGUAGE plpgsql; select test_prep(); select test_prep2(); select test_prep2(); select test_prep2(); drop table if exists t1 ; create table t1 ( id int ); select test_prep2(); ------------------ --- RESULTS ------------------ The first time "select query, query_id from pg_stat_activity ;" is ran, we see the correct query_id of the top-level "select test_prep2();" postgres=# select query, query_id from pg_stat_activity ; query | query_id ------------------------------------------------+---------------------- select query, query_id from pg_stat_activity ; | 4920466282180912204 select test_prep2(); | -8872343059522300094 | | | | | (7 rows) postgres=# explain verbose select test_prep2(); QUERY PLAN ------------------------------------------ Result (cost=0.00..0.26 rows=1 width=4) Output: test_prep2() Query Identifier: -8872343059522300094 (3 rows) but after the table is dropped and recreated, the advertised query_id is wrong for the query text. It is the query_id of "select * from t1;" postgres=# select query, query_id from pg_stat_activity ; query | query_id ------------------------------------------------+---------------------- select query, query_id from pg_stat_activity ; | 4920466282180912204 select test_prep2(); | -6535803560158626277 | | | | | (7 rows) postgres=# explain verbose select * from t1; QUERY PLAN ------------------------------------------------------------- Seq Scan on public.t1 (cost=0.00..35.50 rows=2550 width=4) Output: id Query Identifier: -6535803560158626277 (3 rows)