mirror of
https://github.com/percona/pg_stat_monitor.git
synced 2026-02-04 05:56:21 +00:00
PG-2116 Truncate query strings at multi-byte character boundaries
Make sure we never create broken encodings in query strings by making the truncation of query strings multi-byte aware. An alternative would be to change the rule for truncation to be based on number of characters, as the documentation claims it is, but I do not think that would be significantly better. Either works just fine so we just pick one. Based on bug report from Ivan Vyazmitinov: https://github.com/percona/pg_stat_monitor/issues/599
This commit is contained in:
committed by
Andreas Karlsson
parent
fef78a8f6f
commit
5526e413c1
@@ -1983,7 +1983,7 @@ pgsm_store(pgsmEntry *entry)
|
|||||||
|
|
||||||
/* New query, truncate length if necessary. */
|
/* New query, truncate length if necessary. */
|
||||||
if (query_len > pgsm_query_max_len)
|
if (query_len > pgsm_query_max_len)
|
||||||
query_len = pgsm_query_max_len;
|
query_len = pg_mbcliplen(query, query_len, pgsm_query_max_len);
|
||||||
|
|
||||||
/* Save the query text in raw dsa area */
|
/* Save the query text in raw dsa area */
|
||||||
query_dsa_area = get_dsa_area_for_query_text();
|
query_dsa_area = get_dsa_area_for_query_text();
|
||||||
|
|||||||
@@ -47,6 +47,14 @@ $node->restart();
|
|||||||
ok($cmdret == 0, "Reset PGSM EXTENSION");
|
ok($cmdret == 0, "Reset PGSM EXTENSION");
|
||||||
PGSM::append_to_file($stdout);
|
PGSM::append_to_file($stdout);
|
||||||
|
|
||||||
|
($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT length('åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå');", extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']);
|
||||||
|
ok($cmdret == 0, "Run truncated multi-byte query string");
|
||||||
|
PGSM::append_to_file($stdout);
|
||||||
|
|
||||||
|
($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT length(query), query FROM pg_stat_monitor ORDER BY query;", extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']);
|
||||||
|
ok($cmdret == 0, "Print truncated multi-byte query string");
|
||||||
|
PGSM::append_to_file($stdout);
|
||||||
|
|
||||||
($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_query_max_len';", extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']);
|
($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_query_max_len';", extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']);
|
||||||
ok($cmdret == 0, "Print PGSM EXTENSION Settings");
|
ok($cmdret == 0, "Print PGSM EXTENSION Settings");
|
||||||
PGSM::append_to_file($stdout);
|
PGSM::append_to_file($stdout);
|
||||||
|
|||||||
@@ -17,6 +17,19 @@ SELECT pg_stat_monitor_reset();
|
|||||||
|
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
|
SELECT length('åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå');
|
||||||
|
length
|
||||||
|
--------
|
||||||
|
512
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT length(query), query FROM pg_stat_monitor ORDER BY query;
|
||||||
|
length | query
|
||||||
|
--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
519 | SELECT length('åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå
|
||||||
|
30 | SELECT pg_stat_monitor_reset()
|
||||||
|
(2 rows)
|
||||||
|
|
||||||
SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_query_max_len';
|
SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_query_max_len';
|
||||||
name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart
|
name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart
|
||||||
------------------------------------+---------+------+------------+---------+--------------------+---------+------------+----------+----------+-----------+-----------------
|
------------------------------------+---------+------+------------+---------+--------------------+---------+------------+----------+----------+-----------+-----------------
|
||||||
|
|||||||
Reference in New Issue
Block a user