> >> I think the testing discussion should be moved to a different thread.
> >> What do you think?
> > See v4.
> >
> > 0001 deals with reporting queryId in exec_execute_message and
> > exec_bind_message.
> > 0002 deals with reporting queryId after a cache invalidation.
> >
> > There are no tests as this requires more discussion in a separate thread(?)
> At first, these patches look good.
> But I have a feeling of some mess here:
> queryId should be initialised at the top-level query. At the same time,
> the RevalidateCachedQuery routine can change this value in the case of
> the query tree re-validation.
> You can say that this routine can't be called from a non-top-level query
> right now, except SPI. Yes, but what about extensions or future usage?
This is a valid point. RevalidatePlanCache is forcing a
new queryId to be advertised ( 'true' as the second argument to
pgstat_report_query_id) . This means,
v4-0002-Report-new-queryId-after-plancache-re-validation.patch
will result in a non top-level queryId being advertised.
See the attached test case.
I need to think about this a bit.
--
Sami
---------------------------------------------------------------
--- 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)