Skip to content

Commit 28e26ae

Browse files
committed
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: #599
1 parent 966bf24 commit 28e26ae

File tree

3 files changed

+22
-1
lines changed

3 files changed

+22
-1
lines changed

pg_stat_monitor.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1983,7 +1983,7 @@ pgsm_store(pgsmEntry *entry)
19831983

19841984
/* New query, truncate length if necessary. */
19851985
if (query_len > pgsm_query_max_len)
1986-
query_len = pgsm_query_max_len;
1986+
query_len = pg_mbcliplen(query, query_len, pgsm_query_max_len);
19871987

19881988
/* Save the query text in raw dsa area */
19891989
query_dsa_area = get_dsa_area_for_query_text();

t/015_settings_pgsm_query_max_len.pl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,14 @@
4747
ok($cmdret == 0, "Reset PGSM EXTENSION");
4848
PGSM::append_to_file($stdout);
4949

50+
($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT length('åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå');", extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']);
51+
ok($cmdret == 0, "Run truncated multi-byte query string");
52+
PGSM::append_to_file($stdout);
53+
54+
($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']);
55+
ok($cmdret == 0, "Print truncated multi-byte query string");
56+
PGSM::append_to_file($stdout);
57+
5058
($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']);
5159
ok($cmdret == 0, "Print PGSM EXTENSION Settings");
5260
PGSM::append_to_file($stdout);

t/expected/015_settings_pgsm_query_max_len.out

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,19 @@ SELECT pg_stat_monitor_reset();
1717

1818
(1 row)
1919

20+
SELECT length('åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå');
21+
length
22+
--------
23+
512
24+
(1 row)
25+
26+
SELECT length(query), query FROM pg_stat_monitor ORDER BY query;
27+
length | query
28+
--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
29+
519 | SELECT length('åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå
30+
30 | SELECT pg_stat_monitor_reset()
31+
(2 rows)
32+
2033
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';
2134
name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart
2235
------------------------------------+---------+------+------------+---------+--------------------+---------+------------+----------+----------+-----------+-----------------

0 commit comments

Comments
 (0)