-- Tests with extended query protocol SET pg_stat_statements.track_utility = FALSE; -- This test checks that an execute message sets a query ID. SELECT query_id IS NOT NULL AS query_id_set FROM pg_stat_activity WHERE pid = pg_backend_pid() \bind \g query_id_set -------------- t (1 row) SELECT pg_stat_statements_reset() IS NOT NULL AS t; t --- t (1 row) SELECT $1 \parse stmt1 SELECT $1, $2 \parse stmt2 SELECT $1, $2, $3 \parse stmt3 SELECT $1 \bind 'unnamed_val1' \g ?column? -------------- unnamed_val1 (1 row) \bind_named stmt1 'stmt1_val1' \g ?column? ------------ stmt1_val1 (1 row) \bind_named stmt2 'stmt2_val1' 'stmt2_val2' \g ?column? | ?column? ------------+------------ stmt2_val1 | stmt2_val2 (1 row) \bind_named stmt3 'stmt3_val1' 'stmt3_val2' 'stmt3_val3' \g ?column? | ?column? | ?column? ------------+------------+------------ stmt3_val1 | stmt3_val2 | stmt3_val3 (1 row) \bind_named stmt3 'stmt3_val4' 'stmt3_val5' 'stmt3_val6' \g ?column? | ?column? | ?column? ------------+------------+------------ stmt3_val4 | stmt3_val5 | stmt3_val6 (1 row) \bind_named stmt2 'stmt2_val3' 'stmt2_val4' \g ?column? | ?column? ------------+------------ stmt2_val3 | stmt2_val4 (1 row) \bind_named stmt1 'stmt1_val1' \g ?column? ------------ stmt1_val1 (1 row) SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; calls | rows | query -------+------+---------------------------------------------------- 3 | 3 | SELECT $1 2 | 2 | SELECT $1, $2 2 | 2 | SELECT $1, $2, $3 1 | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t (4 rows) -- Various parameter numbering patterns -- Unique query IDs with parameter numbers switched. SELECT pg_stat_statements_reset() IS NOT NULL AS t; t --- t (1 row) SELECT WHERE ($1::int, 7) IN ((8, $2::int), ($3::int, 9)) \bind '1' '2' '3' \g -- (0 rows) SELECT WHERE ($2::int, 10) IN ((11, $3::int), ($1::int, 12)) \bind '1' '2' '3' \g -- (0 rows) SELECT WHERE $1::int IN ($2::int, $3::int) \bind '1' '2' '3' \g -- (0 rows) SELECT WHERE $2::int IN ($3::int, $1::int) \bind '1' '2' '3' \g -- (0 rows) SELECT WHERE $3::int IN ($1::int, $2::int) \bind '1' '2' '3' \g -- (0 rows) SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C"; query | calls --------------------------------------------------------------+------- SELECT WHERE $1::int IN ($2 /*, ... */) | 1 SELECT WHERE $1::int IN ($2 /*, ... */) | 1 SELECT WHERE $1::int IN ($2 /*, ... */) | 1 SELECT WHERE ($1::int, $4) IN (($5, $2::int), ($3::int, $6)) | 1 SELECT WHERE ($2::int, $4) IN (($5, $3::int), ($1::int, $6)) | 1 SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 (6 rows) -- Two groups of two queries with the same query ID. SELECT pg_stat_statements_reset() IS NOT NULL AS t; t --- t (1 row) SELECT WHERE '1'::int IN ($1::int, '2'::int) \bind '1' \g -- (1 row) SELECT WHERE '4'::int IN ($1::int, '5'::int) \bind '2' \g -- (0 rows) SELECT WHERE $2::int IN ($1::int, '1'::int) \bind '1' '2' \g -- (0 rows) SELECT WHERE $2::int IN ($1::int, '2'::int) \bind '3' '4' \g -- (0 rows) SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C"; query | calls ----------------------------------------------------+------- SELECT WHERE $1::int IN ($2 /*, ... */) | 2 SELECT WHERE $1::int IN ($2 /*, ... */) | 2 SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 (3 rows) SELECT pg_stat_statements_reset() IS NOT NULL AS t; t --- t (1 row) -- no squashable list, the parameters id's are kept as-is SELECT WHERE $3 = $1 AND $2 = $4 \bind 1 2 1 2 \g -- (1 row) -- squashable list, so the parameter IDs will be re-assigned SELECT WHERE 1 IN (1, 2, 3) AND $3 = $1 AND $2 = $4 \bind 1 2 1 2 \g -- (1 row) SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C"; query | calls ------------------------------------------------------------+------- SELECT WHERE $1 IN ($2 /*, ... */) AND $3 = $4 AND $5 = $6 | 1 SELECT WHERE $3 = $1 AND $2 = $4 | 1 SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 (3 rows)