Skip to content

Commit ba7f29a

Browse files
author
Christopher Powers
committed
Bug#20519832 TRUNCATED SQL_TEXT VALUES ARE NOT SUFFIXED WITH ...
Suffix truncated sql text with '...', ensure mb strings are well-formed before display.
1 parent 2bf54a8 commit ba7f29a

9 files changed

Lines changed: 78 additions & 8 deletions

File tree

include/mysql/psi/psi.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1009,6 +1009,8 @@ struct PSI_statement_locker_state_v1
10091009
char m_schema_name[PSI_SCHEMA_NAME_LEN];
10101010
/** Length in bytes of @c m_schema_name. */
10111011
uint m_schema_name_length;
1012+
/** Statement character set number. */
1013+
uint m_cs_number;
10121014
};
10131015

10141016
/**

include/mysql/psi/psi_abi_v1.h.pp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,7 @@
269269
const struct sql_digest_storage *m_digest;
270270
char m_schema_name[(64 * 3)];
271271
uint m_schema_name_length;
272+
uint m_cs_number;
272273
};
273274
struct PSI_socket_locker_state_v1
274275
{

mysql-test/suite/perfschema/r/misc.result

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,3 +107,16 @@ select mysql_errno, returned_sqlstate, message_text, errors, warnings from
107107
performance_schema.events_statements_history_long where errors > 0;
108108
mysql_errno returned_sqlstate message_text errors warnings
109109
1146 42S02 Table 'test.t1' doesn't exist 1 0
110+
use performance_schema;
111+
truncate performance_schema.events_statements_history;
112+
select 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' AS A;
113+
A
114+
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
115+
set names utf8mb4;
116+
select _utf8mb4 'васÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑ' as B;
117+
B
118+
васÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑ
119+
select sql_text from events_statements_history where sql_text like "%...";
120+
sql_text
121+
select 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...
122+
select _utf8mb4 'васÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвÐ...

mysql-test/suite/perfschema/t/misc.test

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,3 +188,20 @@ select mysql_errno, returned_sqlstate, message_text, errors, warnings
188188
--echo
189189
select mysql_errno, returned_sqlstate, message_text, errors, warnings from
190190
performance_schema.events_statements_history_long where errors > 0;
191+
192+
#
193+
# Bug#20519832 - TRUNCATED SQL_TEXT values are not suffixed with '...'
194+
#
195+
# Verify that truncated SQL statements are suffixed with '...'
196+
197+
use performance_schema;
198+
truncate performance_schema.events_statements_history;
199+
200+
# Should truncate at 1024 bytes (1024 characters)
201+
select 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' AS A;
202+
203+
# Should truncate at 1024 bytes (487 characters)
204+
set names utf8mb4;
205+
select _utf8mb4 'васÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑ' as B;
206+
207+
select sql_text from events_statements_history where sql_text like "%...";

storage/perfschema/pfs.cc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4388,6 +4388,8 @@ get_thread_statement_locker_v1(PSI_statement_locker_state *state,
43884388
const void *charset)
43894389
{
43904390
DBUG_ASSERT(state != NULL);
4391+
DBUG_ASSERT(charset != NULL);
4392+
43914393
if (! flag_global_instrumentation)
43924394
return NULL;
43934395
PFS_statement_class *klass= find_statement_class(key);
@@ -4432,6 +4434,8 @@ get_thread_statement_locker_v1(PSI_statement_locker_state *state,
44324434
pfs->m_lock_time= 0;
44334435
pfs->m_current_schema_name_length= 0;
44344436
pfs->m_sqltext_length= 0;
4437+
pfs->m_sqltext_truncated= false;
4438+
pfs->m_sqltext_cs_number= system_charset_info->number; /* default */
44354439

44364440
pfs->m_message_text[0]= '\0';
44374441
pfs->m_sql_errno= 0;
@@ -4511,6 +4515,7 @@ get_thread_statement_locker_v1(PSI_statement_locker_state *state,
45114515
state->m_digest= NULL;
45124516

45134517
state->m_schema_name_length= 0;
4518+
state->m_cs_number= ((CHARSET_INFO *)charset)->number;
45144519

45154520
return reinterpret_cast<PSI_statement_locker*> (state);
45164521
}
@@ -4616,10 +4621,14 @@ static void set_statement_text_v1(PSI_statement_locker *locker,
46164621
PFS_events_statements *pfs= reinterpret_cast<PFS_events_statements*> (state->m_statement);
46174622
DBUG_ASSERT(pfs != NULL);
46184623
if (text_len > sizeof (pfs->m_sqltext))
4624+
{
46194625
text_len= sizeof(pfs->m_sqltext);
4626+
pfs->m_sqltext_truncated= true;
4627+
}
46204628
if (text_len)
46214629
memcpy(pfs->m_sqltext, text, text_len);
46224630
pfs->m_sqltext_length= text_len;
4631+
pfs->m_sqltext_cs_number= state->m_cs_number;
46234632
}
46244633

46254634
return;

storage/perfschema/pfs_events_statements.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,12 @@ struct PFS_events_statements : public PFS_events
8888
ulonglong m_no_index_used;
8989
/** Optimizer metric, number of 'no good index used'. */
9090
ulonglong m_no_good_index_used;
91+
92+
/** True if sqltext was truncated. */
93+
bool m_sqltext_truncated;
94+
/** Statement character set number. */
95+
uint m_sqltext_cs_number;
96+
9197
/**
9298
Statement digest.
9399
This underlying token array storage pointer is immutable,

storage/perfschema/table_events_statements.cc

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -337,9 +337,32 @@ void table_events_statements_common::make_row_part_1(PFS_events_statements *stat
337337
m_row.m_name= klass->m_name;
338338
m_row.m_name_length= klass->m_name_length;
339339

340-
m_row.m_sqltext_length= statement->m_sqltext_length;
341-
if (m_row.m_sqltext_length > 0)
342-
memcpy(m_row.m_sqltext, statement->m_sqltext, m_row.m_sqltext_length);
340+
CHARSET_INFO *cs= get_charset(statement->m_sqltext_cs_number, MYF(0));
341+
size_t valid_length= statement->m_sqltext_length;
342+
343+
if (cs->mbmaxlen > 1)
344+
{
345+
int well_formed_error;
346+
valid_length= cs->cset->well_formed_len(cs, statement->m_sqltext, statement->m_sqltext + valid_length,
347+
valid_length, &well_formed_error);
348+
}
349+
350+
m_row.m_sqltext.set_charset(cs);
351+
m_row.m_sqltext.length(0);
352+
m_row.m_sqltext.append(statement->m_sqltext, (uint32)valid_length, cs);
353+
354+
/* Indicate that sqltext is truncated or not well-formed. */
355+
if (statement->m_sqltext_truncated || valid_length < statement->m_sqltext_length)
356+
{
357+
size_t chars= m_row.m_sqltext.numchars();
358+
if (chars > 3)
359+
{
360+
chars-= 3;
361+
size_t bytes_offset= m_row.m_sqltext.charpos(chars, 0);
362+
m_row.m_sqltext.length(bytes_offset);
363+
m_row.m_sqltext.append("...", 3);
364+
}
365+
}
343366

344367
m_row.m_current_schema_name_length= statement->m_current_schema_name_length;
345368
if (m_row.m_current_schema_name_length > 0)
@@ -482,8 +505,8 @@ int table_events_statements_common::read_row_values(TABLE *table,
482505
f->set_null();
483506
break;
484507
case 9: /* SQL_TEXT */
485-
if (m_row.m_sqltext_length)
486-
set_field_longtext_utf8(f, m_row.m_sqltext, m_row.m_sqltext_length);
508+
if (m_row.m_sqltext.length())
509+
set_field_longtext_utf8(f, m_row.m_sqltext.ptr(), m_row.m_sqltext.length());
487510
else
488511
f->set_null();
489512
break;

storage/perfschema/table_events_statements.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,9 @@ struct row_events_statements
6363
/** Length in bytes of @c m_source. */
6464
uint m_source_length;
6565
/** Column SQL_TEXT. */
66-
char m_sqltext[COL_INFO_SIZE];
66+
String m_sqltext;
6767
/** Column DIGEST and DIGEST_TEXT. */
6868
PFS_digest_row m_digest;
69-
/** Length in bytes of @c m_info. */
70-
uint m_sqltext_length;
7169
/** Column CURRENT_SCHEMA. */
7270
char m_current_schema_name[NAME_LEN];
7371
/** Length in bytes of @c m_current_schema_name. */

storage/perfschema/unittest/pfs_server_stubs.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ volatile bool ready_to_exit= false;
2828

2929
uint lower_case_table_names= 0;
3030
CHARSET_INFO *files_charset_info= NULL;
31+
CHARSET_INFO *system_charset_info= NULL;
3132

3233
void compute_digest_md5(const sql_digest_storage *, unsigned char *)
3334
{

0 commit comments

Comments
 (0)