8000 Show savepoint names as constants in pg_stat_statements · postgrespro/postgres@31de7e6 · GitHub
[go: up one dir, main page]

Skip to content
  • Commit 31de7e6

    Browse files
    committed
    Show savepoint names as constants in pg_stat_statements
    In pg_stat_statements, savepoint names now show up as constants with a parameter symbol, using as base query string the one added as a new entry to the PGSS hash table, leading to: RELEASE $1 ROLLBACK TO $1 SAVEPOINT $1 Applying constants to these query parts is a huge advantage for workloads that generate randomly savepoint points, like ORMs (Django is at the origin of this patch). The ODBC driver is a second layer that likes a lot savepoints, though it does not use a random naming pattern. A "location" field is added to TransactionStmt, now set only for savepoints. The savepoint name is ignored by the query jumbling. The location can be extended to other query patterns, if required, like 2PC commands. Some tests are added to pg_stat_statements for all the query patterns supported by the parser. ROLLBACK, ROLLBACK TO SAVEPOINT and ROLLBACK TRANSACTION TO SAVEPOINT have the same Node representation, so all these are equivalents. The same happens for RELEASE and RELEASE SAVEPOINT. Author: Greg Sabino Mullane Discussion: https://postgr.es/m/CAKAnmm+2s9PA4OaumwMJReWHk8qvJ_-g1WqxDRDAN1BSUfxyTw@mail.gmail.com
    1 parent 19c590f commit 31de7e6

    File tree

    4 files changed

    +66
    -1
    lines changed

    4 files changed

    +66
    -1
    lines changed

    contrib/pg_stat_statements/expected/utility.out

    Lines changed: 31 additions & 0 deletions
    Original file line numberDiff line numberDiff line change
    @@ -197,6 +197,37 @@ SELECT pg_stat_statements_reset();
    197197

    198198
    (1 row)
    199199

    200+
    -- Savepoints
    201+
    BEGIN;
    202+
    SAVEPOINT sp1;
    203+
    SAVEPOINT sp2;
    204+
    SAVEPOINT sp3;
    205+
    SAVEPOINT sp4;
    206+
    ROLLBACK TO sp4;
    207+
    ROLLBACK TO SAVEPOINT sp4;
    208+
    ROLLBACK TRANSACTION TO SAVEPOINT sp3;
    209+
    RELEASE sp3;
    210+
    RELEASE SAVEPOINT sp2;
    211+
    ROLLBACK TO sp1;
    212+
    RELEASE SAVEPOINT sp1;
    213+
    COMMIT;
    214+
    SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C";
    215+
    calls | rows | query
    216+
    -------+------+-----------------------------------
    217+
    1 | 0 | BEGIN
    218+
    1 | 0 | COMMIT
    219+
    3 | 0 | RELEASE $1
    220+
    4 | 0 | ROLLBACK TO $1
    221+
    4 | 0 | SAVEPOINT $1
    222+
    1 | 1 | SELECT pg_stat_statements_reset()
    223+
    (6 rows)
    224+
    225+
    SELECT pg_stat_statements_reset();
    226+
    pg_stat_statements_reset
    227+
    --------------------------
    228+
    229+
    (1 row)
    230+
    200231
    -- EXPLAIN statements
    201232
    -- A Query is used, normalized by the query jumbling.
    202233
    EXPLAIN (costs off) SELECT 1;

    contrib/pg_stat_statements/sql/utility.sql

    Lines changed: 17 additions & 0 deletions
    Original file line numberDiff line numberDiff line change
    @@ -115,6 +115,23 @@ COMMIT;
    115115
    SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C";
    116116
    SELECT pg_stat_statements_reset();
    117117

    118+
    -- Savepoints
    119+
    BEGIN;
    120+
    SAVEPOINT sp1;
    121+
    SAVEPOINT sp2;
    122+
    SAVEPOINT sp3;
    123+
    SAVEPOINT sp4;
    124+
    ROLLBACK TO sp4;
    125+
    ROLLBACK TO SAVEPOINT sp4;
    126+
    ROLLBACK TRANSACTION TO SAVEPOINT sp3;
    127+
    RELEASE sp3;
    128+
    RELEASE SAVEPOINT sp2;
    129+
    ROLLBACK TO sp1;
    130+
    RELEASE SAVEPOINT sp1;
    131+
    COMMIT;
    132+
    SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C";
    133+
    SELECT pg_stat_statements_reset();
    134+
    118135
    -- EXPLAIN statements
    119136
    -- A Query is used, normalized by the query jumbling.
    120137
    EXPLAIN (costs off) SELECT 1;

    src/backend/parser/gram.y

    Lines changed: 14 additions & 0 deletions
    Original file line numberDiff line numberDiff line change
    @@ -10841,6 +10841,7 @@ TransactionStmt:
    1084110841
    n->kind = TRANS_STMT_ROLLBACK;
    1084210842
    n->options = NIL;
    1084310843
    n->chain = $3;
    10844+
    n->location = -1;
    1084410845
    $$ = (Node *) n;
    1084510846
    }
    1084610847
    | START TRANSACTION transaction_mode_list_or_empty
    @@ -10849,6 +10850,7 @@ TransactionStmt:
    1084910850

    1085010851
    n->kind = TRANS_STMT_START;
    1085110852
    n->options = $3;
    10853+
    n->location = -1;
    1085210854
    $$ = (Node *) n;
    1085310855
    }
    1085410856
    | COMMIT opt_transaction opt_transaction_chain
    @@ -10858,6 +10860,7 @@ TransactionStmt:
    1085810860
    n->kind = TRANS_STMT_COMMIT;
    1085910861
    n->options = NIL;
    1086010862
    n->chain = $3;
    10863+
    n->location = -1;
    1086110864
    $$ = (Node *) n;
    1086210865
    }
    1086310866
    | ROLLBACK opt_transaction opt_transaction_chain
    @@ -10867,6 +10870,7 @@ TransactionStmt:
    1086710870
    n->kind = TRANS_STMT_ROLLBACK;
    1086810871
    n->options = NIL;
    1086910872
    n->chain = $3;
    10873+
    n->location = -1;
    1087010874
    $$ = (Node *) n;
    1087110875
    }
    1087210876
    | SAVEPOINT ColId
    @@ -10875,6 +10879,7 @@ TransactionStmt:
    1087510879

    1087610880
    n->kind = TRANS_STMT_SAVEPOINT;
    1087710881
    n->savepoint_name = $2;
    10882+
    n->location = @2;
    1087810883
    $$ = (Node *) n;
    1087910884
    }
    1088010885
    | RELEASE SAVEPOINT ColId
    @@ -10883,6 +10888,7 @@ TransactionStmt:
    1088310888

    1088410889
    n->kind = TRANS_STMT_RELEASE;
    1088510890
    n->savepoint_name = $3;
    10891+
    n->location = @3;
    1088610892
    $$ = (Node *) n;
    1088710893
    }
    1088810894
    | RELEASE ColId
    @@ -10891,6 +10897,7 @@ TransactionStmt:
    1089110897

    1089210898
    n->kind = TRANS_STMT_RELEASE;
    1089310899
    n->savepoint_name = $2;
    10900+
    n->location = @2;
    1089410901
    $$ = (Node *) n;
    1089510902
    }
    1089610903
    | ROLLBACK opt_transaction TO SAVEPOINT ColId
    @@ -10899,6 +10906,7 @@ TransactionStmt:
    1089910906

    1090010907
    n->kind = TRANS_STMT_ROLLBACK_TO;
    1090110908
    n->savepoint_name = $5;
    10909+
    n->location = @5;
    1090210910
    $$ = (Node *) n;
    1090310911
    }
    1090410912
    | ROLLBACK opt_transaction TO ColId
    @@ -10907,6 +10915,7 @@ TransactionStmt:
    1090710915

    1090810916
    n->kind = TRANS_STMT_ROLLBACK_TO;
    1090910917
    n->savepoint_name = $4;
    10918+
    n->location = @4;
    1091010919
    $$ = (Node *) n;
    1091110920
    }
    1091210921
    | PREPARE TRANSACTION Sconst
    @@ -10915,6 +10924,7 @@ TransactionStmt:
    1091510924

    1091610925
    n->kind = TRANS_STMT_PREPARE;
    1091710926
    n->gid = $3;
    10927+
    n->location = -1;
    1091810928
    $$ = (Node *) n;
    1091910929
    }
    1092010930
    | COMMIT PREPARED Sconst
    @@ -10923,6 +10933,7 @@ TransactionStmt:
    1092310933

    1092410934
    n->kind = TRANS_STMT_COMMIT_PREPARED;
    1092510935
    n->gid = $3;
    10936+
    n->location = -1;
    1092610937
    $$ = (Node *) n;
    1092710938
    }
    1092810939
    | ROLLBACK PREPARED Sconst
    @@ -10931,6 +10942,7 @@ TransactionStmt:
    1093110942

    1093210943
    n->kind = TRANS_STMT_ROLLBACK_PREPARED;
    1093310944
    n->gid = $3;
    10945+
    n->location = -1;
    1093410946
    $$ = (Node *) n;
    1093510947
    }
    1093610948
    ;
    @@ -10942,6 +10954,7 @@ TransactionStmtLegacy:
    1094210954

    1094310955
    n->kind = TRANS_STMT_BEGIN;
    1094410956
    n->options = $3;
    10957+
    n->location = -1;
    1094510958
    $$ = (Node *) n;
    1094610959
    }
    1094710960
    | END_P opt_transaction opt_transaction_chain
    @@ -10951,6 +10964,7 @@ TransactionStmtLegacy:
    1095110964
    n->kind = TRANS_STMT_COMMIT;
    1095210965
    n->options = NIL;
    1095310966
    n->chain = $3;
    10967+
    n->location = -1;
    1095410968
    $$ = (Node *) n;
    1095510969
    }
    1095610970
    ;

    src/include/nodes/parsenodes.h

    Lines changed: 4 additions & 1 deletion
    Original file line numberDiff line numberDiff line change
    @@ -3538,9 +3538,12 @@ typedef struct TransactionStmt
    35383538
    NodeTag type;
    35393539
    TransactionStmtKind kind; /* see above */
    35403540
    List *options; /* for BEGIN/START commands */
    3541-
    char *savepoint_name; /* for savepoint commands */
    3541+
    /* for savepoint commands */
    3542+
    char *savepoint_name pg_node_attr(query_jumble_ignore);
    35423543
    char *gid; /* for two-phase-commit related commands */
    35433544
    bool chain; /* AND CHAIN option */
    3545+
    /* token location, or -1 if unknown */
    3546+
    int location pg_node_attr(query_jumble_location);
    35443547
    } TransactionStmt;
    35453548

    35463549
    /* ----------------------

    0 commit comments

    Comments
     (0)
    0