diff options
| author | Bruce Momjian | 2021-04-07 17:06:47 +0000 |
|---|---|---|
| committer | Bruce Momjian | 2021-04-07 17:06:56 +0000 |
| commit | 5fd9dfa5f50e4906c35133a414ebec5b6d518493 (patch) | |
| tree | 4bf0c6c9088eb8b053b029b9be787939d48d2e3b /src/include/utils | |
| parent | a282ee68a070a8adc6e6d45e8e643769c587ecc3 (diff) | |
Move pg_stat_statements query jumbling to core.
Add compute_query_id GUC to control whether a query identifier should be
computed by the core (off by default). It's thefore now possible to
disable core queryid computation and use pg_stat_statements with a
different algorithm to compute the query identifier by using a
third-party module.
To ensure that a single source of query identifier can be used and is
well defined, modules that calculate a query identifier should throw an
error if compute_query_id specified to compute a query id and if a query
idenfitier was already calculated.
Discussion: https://postgr.es/m/20210407125726.tkvjdbw76hxnpwfi@nol
Author: Julien Rouhaud
Reviewed-by: Alvaro Herrera, Nitin Jadhav, Zhihong Yu
Diffstat (limited to 'src/include/utils')
| -rw-r--r-- | src/include/utils/guc.h | 1 | ||||
| -rw-r--r-- | src/include/utils/queryjumble.h | 58 |
2 files changed, 59 insertions, 0 deletions
diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h index 5004ee41779..9b6552b25b2 100644 --- a/src/include/utils/guc.h +++ b/src/include/utils/guc.h @@ -248,6 +248,7 @@ extern bool log_btree_build_stats; extern PGDLLIMPORT bool check_function_bodies; extern bool session_auth_is_superuser; +extern bool compute_query_id; extern bool log_duration; extern int log_parameter_max_length; extern int log_parameter_max_length_on_error; diff --git a/src/include/utils/queryjumble.h b/src/include/utils/queryjumble.h new file mode 100644 index 00000000000..83ba7339fae --- /dev/null +++ b/src/include/utils/queryjumble.h @@ -0,0 +1,58 @@ +/*------------------------------------------------------------------------- + * + * queryjumble.h + * Query normalization and fingerprinting. + * + * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * IDENTIFICATION + * src/include/utils/queryjumble.h + * + *------------------------------------------------------------------------- + */ +#ifndef QUERYJUBLE_H +#define QUERYJUBLE_H + +#include "nodes/parsenodes.h" + +#define JUMBLE_SIZE 1024 /* query serialization buffer size */ + +/* + * Struct for tracking locations/lengths of constants during normalization + */ +typedef struct LocationLen +{ + int location; /* start offset in query text */ + int length; /* length in bytes, or -1 to ignore */ +} LocationLen; + +/* + * Working state for computing a query jumble and producing a normalized + * query string + */ +typedef struct JumbleState +{ + /* Jumble of current query tree */ + unsigned char *jumble; + + /* Number of bytes used in jumble[] */ + Size jumble_len; + + /* Array of locations of constants that should be removed */ + LocationLen *clocations; + + /* Allocated length of clocations array */ + int clocations_buf_size; + + /* Current number of valid entries in clocations array */ + int clocations_count; + + /* highest Param id we've seen, in order to start normalization correctly */ + int highest_extern_param_id; +} JumbleState; + +const char *CleanQuerytext(const char *query, int *location, int *len); +JumbleState *JumbleQuery(Query *query, const char *querytext); + +#endif /* QUERYJUMBLE_H */ |
