Show GIDs of two-phase commit commands as constants in pg_stat_statements

This relies on the "location" field added to TransactionStmt in 31de7e6,
now applied to the "gid" field used by 2PC commands.  These commands are
now reported like:
COMMIT PREPARED $1
PREPARE TRANSACTION $1
ROLLBACK PREPARED $1

Applying constants for these commands is a huge advantage for workloads
that rely a lot on 2PC commands with different GIDs.  Some tests are
added to track the new behavior.

Reviewed-by: Julien Rouhaud
Discussion: https://postgr.es/m/ZMhT9kNtJJsHw6jK@paquier.xyz
This commit is contained in:
Michael Paquier 2023-08-12 10:44:15 +09:00
parent 5dc456b7dd
commit 638d42a3c5
5 changed files with 39 additions and 4 deletions

View File

@ -197,6 +197,29 @@ SELECT pg_stat_statements_reset();
(1 row)
-- Two-phase transactions
BEGIN;
PREPARE TRANSACTION 'stat_trans1';
COMMIT PREPARED 'stat_trans1';
BEGIN;
PREPARE TRANSACTION 'stat_trans2';
ROLLBACK PREPARED 'stat_trans2';
SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C";
calls | rows | query
-------+------+-----------------------------------
2 | 0 | BEGIN
1 | 0 | COMMIT PREPARED $1
2 | 0 | PREPARE TRANSACTION $1
1 | 0 | ROLLBACK PREPARED $1
1 | 1 | SELECT pg_stat_statements_reset()
(5 rows)
SELECT pg_stat_statements_reset();
pg_stat_statements_reset
--------------------------
(1 row)
-- Savepoints
BEGIN;
SAVEPOINT sp1;

View File

@ -1 +1,2 @@
shared_preload_libraries = 'pg_stat_statements'
max_prepared_transactions = 5

View File

@ -115,6 +115,16 @@ COMMIT;
SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C";
SELECT pg_stat_statements_reset();
-- Two-phase transactions
BEGIN;
PREPARE TRANSACTION 'stat_trans1';
COMMIT PREPARED 'stat_trans1';
BEGIN;
PREPARE TRANSACTION 'stat_trans2';
ROLLBACK PREPARED 'stat_trans2';
SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C";
SELECT pg_stat_statements_reset();
-- Savepoints
BEGIN;
SAVEPOINT sp1;

View File

@ -10924,7 +10924,7 @@ TransactionStmt:
n->kind = TRANS_STMT_PREPARE;
n->gid = $3;
n->location = -1;
n->location = @3;
$$ = (Node *) n;
}
| COMMIT PREPARED Sconst
@ -10933,7 +10933,7 @@ TransactionStmt:
n->kind = TRANS_STMT_COMMIT_PREPARED;
n->gid = $3;
n->location = -1;
n->location = @3;
$$ = (Node *) n;
}
| ROLLBACK PREPARED Sconst
@ -10942,7 +10942,7 @@ TransactionStmt:
n->kind = TRANS_STMT_ROLLBACK_PREPARED;
n->gid = $3;
n->location = -1;
n->location = @3;
$$ = (Node *) n;
}
;

View File

@ -3540,7 +3540,8 @@ typedef struct TransactionStmt
List *options; /* for BEGIN/START commands */
/* for savepoint commands */
char *savepoint_name pg_node_attr(query_jumble_ignore);
char *gid; /* for two-phase-commit related commands */
/* for two-phase-commit related commands */
char *gid pg_node_attr(query_jumble_ignore);
bool chain; /* AND CHAIN option */
/* token location, or -1 if unknown */
int location pg_node_attr(query_jumble_location);