Skip to content

Commit b9ed5d3

Browse files
Make prepared statement abstractions respect {mysql,pgsql}-query_digests_keep_comment when computing digests.
Fixes an issue where the cache would blow up in size upon prepared statements with query annotations. See #5384 for details.
1 parent 10ff132 commit b9ed5d3

File tree

2 files changed

+56
-9
lines changed

2 files changed

+56
-9
lines changed

lib/MySQL_PreparedStatement.cpp

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,10 @@ extern MySQL_STMT_Manager_v14 *GloMyStmt;
1818

1919
const int PS_GLOBAL_STATUS_FIELD_NUM = 9;
2020

21-
static uint64_t stmt_compute_hash(char *user,
22-
char *schema, char *query,
23-
unsigned int query_length) {
21+
static uint64_t stmt_compute_hash_opts(char *user,
22+
char *schema, char *query,
23+
unsigned int query_length,
24+
bool strip_query_comments) {
2425
int l = 0;
2526
l += strlen(user);
2627
l += strlen(schema);
@@ -50,14 +51,33 @@ static uint64_t stmt_compute_hash(char *user,
5051
l += strlen(_COMPUTE_HASH_DEL2_);
5152

5253
// write query
54+
char *nquery = NULL;
55+
if (strip_query_comments) {
56+
char *nquery = mysql_query_strip_comments((char *)query, query_length, false);
57+
if (nquery != NULL) {
58+
query = nquery;
59+
query_length = strlen(nquery);
60+
}
61+
}
5362
memcpy(buf + l, query, query_length);
5463
l += query_length;
64+
if (nquery != NULL) {
65+
free(nquery);
66+
}
5567

5668
uint64_t hash = SpookyHash::Hash64(buf, l, 0);
5769
free(buf);
5870
return hash;
5971
}
6072

73+
inline static uint64_t stmt_compute_hash(char *user,
74+
char *schema, char *query,
75+
unsigned int query_length) {
76+
return stmt_compute_hash_opts(
77+
user, schema, query, query_length,
78+
!mysql_thread___query_digests_keep_comment);
79+
}
80+
6181
void MySQL_STMT_Global_info::compute_hash() {
6282
hash = stmt_compute_hash(username, schemaname, query,
6383
query_length);

lib/PgSQL_PreparedStatement.cpp

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,19 @@ extern PgSQL_STMT_Manager *GloPgStmt;
1313

1414
const int PS_GLOBAL_STATUS_FIELD_NUM = 8;
1515

16-
static uint64_t stmt_compute_hash(const char *user,
17-
const char *database, const char *query, unsigned int query_length, const Parse_Param_Types& param_types) {
16+
static uint64_t stmt_compute_hash_opts(const char *user,
17+
const char *database, const char *query, unsigned int query_length,
18+
const Parse_Param_Types& param_types,
19+
bool strip_query_comments
20+
) {
1821
// two random seperators
1922
static const char DELIM1[] = "-ZiODNjvcNHTFaARXoqqSPDqQe-";
2023
static const char DELIM2[] = "-aSfpWDoswfuRsJXqZKfcelzCL-";
2124
static const char DELIM3[] = "-rQkhRVXdvgVYsmiqZCMikjKmP-";
2225

23-
// NOSONAR: strlen is safe here
26+
// NOSONAR: strlen is safe here
2427
size_t user_length = strlen(user); // NOSONAR
25-
// NOSONAR: strlen is safe here
28+
// NOSONAR: strlen is safe here
2629
size_t database_length = strlen(database); // NOSONAR
2730
size_t delim1_length = sizeof(DELIM1) - 1;
2831
size_t delim2_length = sizeof(DELIM2) - 1;
@@ -47,7 +50,22 @@ static uint64_t stmt_compute_hash(const char *user,
4750
memcpy(buf + l, DELIM1, delim1_length); l += delim1_length; // write delimiter1
4851
memcpy(buf + l, database, database_length); l += database_length; // write database
4952
memcpy(buf + l, DELIM2, delim2_length); l += delim2_length; // write delimiter2
50-
memcpy(buf + l, query, query_length); l += query_length; // write query
53+
54+
// write query
55+
char *nquery = NULL;
56+
if (strip_query_comments) {
57+
char *nquery = mysql_query_strip_comments((char *)query, query_length, false);
58+
if (nquery != NULL) {
59+
query = nquery;
60+
query_length = strlen(nquery);
61+
}
62+
}
63+
memcpy(buf + l, query, query_length);
64+
l += query_length;
65+
if (nquery != NULL) {
66+
free(nquery);
67+
}
68+
5169
if (!param_types.empty()) {
5270
uint16_t size = param_types.size();
5371
memcpy(buf + l, DELIM3, delim3_length); l += delim3_length; // write delimiter3
@@ -58,6 +76,15 @@ static uint64_t stmt_compute_hash(const char *user,
5876
return hash;
5977
}
6078

79+
inline static uint64_t stmt_compute_hash(const char *user,
80+
const char *database, const char *query, unsigned int query_length,
81+
const Parse_Param_Types& param_types
82+
) {
83+
return stmt_compute_hash_opts(
84+
user, database, query, query_length, param_types,
85+
!pgsql_thread___query_digests_keep_comment);
86+
}
87+
6188
void PgSQL_STMT_Global_info::compute_hash() {
6289
hash = stmt_compute_hash(username, dbname, query,
6390
query_length, parse_param_types);
@@ -80,7 +107,7 @@ PgSQL_STMT_Global_info::PgSQL_STMT_Global_info(uint64_t id, const char *_user, c
80107
first_comment = _first_comment ? strdup(_first_comment) : nullptr;
81108
parse_param_types = std::move(_ppt);
82109
PgQueryCmd = PGSQL_QUERY__UNINITIALIZED;
83-
110+
84111
if (_h) {
85112
hash = _h;
86113
} else {

0 commit comments

Comments
 (0)