| /*------------------------------------------------------------------------- |
| * |
| * 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; |
| |
| /* Values for the compute_query_id GUC */ |
| enum ComputeQueryIdType |
| { |
| COMPUTE_QUERY_ID_OFF, |
| COMPUTE_QUERY_ID_ON, |
| COMPUTE_QUERY_ID_AUTO, |
| COMPUTE_QUERY_ID_REGRESS |
| }; |
| |
| /* GUC parameters */ |
| extern int compute_query_id; |
| |
| |
| extern const char *CleanQuerytext(const char *query, int *location, int *len); |
| extern JumbleState *JumbleQuery(Query *query, const char *querytext); |
| extern JumbleState *JumbleQueryDirect(Query *query, const char *querytext); |
| extern void EnableQueryId(void); |
| |
| extern bool query_id_enabled; |
| |
| /* |
| * Returns whether query identifier computation has been enabled, either |
| * directly in the GUC or by a module when the setting is 'auto'. |
| */ |
| static inline bool |
| IsQueryIdEnabled(void) |
| { |
| if (compute_query_id == COMPUTE_QUERY_ID_OFF) |
| return false; |
| if (compute_query_id == COMPUTE_QUERY_ID_ON) |
| return true; |
| return query_id_enabled; |
| } |
| |
| #endif /* QUERYJUMBLE_H */ |