Below is the list of changes that have just been committed into a local
5.1 repository of cps. When cps does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet
1.2145 06/03/06 21:03:17 petr@stripped +5 -0
Fix Bug#17600: Invalid data logged into mysql.slow_log
Recommit with post-review fixes.
mysql-test/t/log_tables-master.opt
1.1 06/03/06 21:03:09 petr@stripped +1 -0
New BitKeeper file ``mysql-test/t/log_tables-master.opt''
storage/csv/ha_tina.cc
1.36 06/03/06 21:03:09 petr@stripped +14 -3
Explicitly check fo NULLs, when writing a row.
We should not hope, that the null field was
cleaned up.
Though usually we do call Field::reset() or
restore_row(), before calling Field::set_null(),
this depency is neither documented nor enforced
by other means.
sql/log.cc
1.194 06/03/06 21:03:09 petr@stripped +36 -15
Fix NULL handling in log tables
mysql-test/t/log_tables.test
1.6 06/03/06 21:03:09 petr@stripped +10 -0
add a test
mysql-test/t/log_tables-master.opt
1.0 06/03/06 21:03:09 petr@stripped +0 -0
BitKeeper file /home/cps/mysql/trees/mysql-5.1-virgin/mysql-test/t/log_tables-master.opt
mysql-test/r/log_tables.result
1.3 06/03/06 21:03:09 petr@stripped +8 -0
update result
# This is a BitKeeper patch. What follows are the unified diffs for the
# set of deltas contained in the patch. The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User: petr
# Host: owlet.
# Root: /home/cps/mysql/trees/mysql-5.1-virgin
--- 1.193/sql/log.cc 2006-02-26 00:20:52 +03:00
+++ 1.194/sql/log.cc 2006-03-06 21:03:09 +03:00
@@ -288,7 +288,7 @@
Log command to the general log table
SYNOPSIS
- log_general_to_csv()
+ log_general()
event_time command start timestamp
user_host the pointer to the string with user@host info
@@ -322,18 +322,32 @@
if (unlikely(!logger.is_log_tables_initialized))
return FALSE;
+ /*
+ NOTE: we do not call restore_record() here, as all fields are
+ filled by the Logger (=> no need to load default ones).
+ */
+
/* log table entries are not replicated at the moment */
tmp_disable_binlog(current_thd);
+ /* Set current time. Required for CURRENT_TIMESTAMP to work */
general_log_thd->start_time= event_time;
- /* set default value (which is CURRENT_TIMESTAMP) */
- table->field[0]->set_null();
+
+ /*
+ We do not set a value for table->field[0], as it will use
+ default value (which is CURRENT_TIMESTAMP).
+ */
table->field[1]->store(user_host, user_host_len, client_cs);
+ table->field[1]->set_notnull();
table->field[2]->store((longlong) thread_id);
+ table->field[2]->set_notnull();
table->field[3]->store((longlong) server_id);
+ table->field[3]->set_notnull();
table->field[4]->store(command_type, command_type_len, client_cs);
+ table->field[4]->set_notnull();
table->field[5]->store(sql_text, sql_text_len, client_cs);
+ table->field[5]->set_notnull();
table->file->ha_write_row(table->record[0]);
reenable_binlog(current_thd);
@@ -346,7 +360,7 @@
Log a query to the slow log table
SYNOPSIS
- log_slow_to_csv()
+ log_slow()
thd THD of the query
current_time current timestamp
query_start_arg command start timestamp
@@ -381,7 +395,7 @@
TABLE *table= slow_log.table;
CHARSET_INFO *client_cs= thd->variables.character_set_client;
- DBUG_ENTER("log_slow_to_csv");
+ DBUG_ENTER("log_slow");
/* below should never happen */
if (unlikely(!logger.is_log_tables_initialized))
@@ -392,12 +406,15 @@
/*
Set start time for CURRENT_TIMESTAMP to the start of the query.
- This will be default value for the field
+ This will be default value for the field[0]
*/
slow_log_thd->start_time= query_start_arg;
+ restore_record(table, s->default_values); // Get empty record
- /* set default value (which is CURRENT_TIMESTAMP) */
- table->field[0]->set_null();
+ /*
+ We do not set a value for table->field[0], as it will use
+ default value.
+ */
/* store the value */
table->field[1]->store(user_host, user_host_len, client_cs);
@@ -421,24 +438,28 @@
table->field[5]->set_null();
}
+ /* fill database field */
if (thd->db)
- /* fill database field */
+ {
table->field[6]->store(thd->db, thd->db_length, client_cs);
- else
- table->field[6]->set_null();
+ table->field[6]->set_notnull();
+ }
if (thd->last_insert_id_used)
+ {
table->field[7]->store((longlong) thd->current_insert_id);
- else
- table->field[7]->set_null();
+ table->field[7]->set_notnull();
+ }
/* set value if we do an insert on autoincrement column */
if (thd->insert_id_used)
+ {
table->field[8]->store((longlong) thd->last_insert_id);
- else
- table->field[8]->set_null();
+ table->field[8]->set_notnull();
+ }
table->field[9]->store((longlong) server_id);
+ table->field[9]->set_notnull();
/* sql_text */
table->field[10]->store(sql_text,sql_text_len, client_cs);
--- 1.35/storage/csv/ha_tina.cc 2006-02-14 12:51:20 +03:00
+++ 1.36/storage/csv/ha_tina.cc 2006-03-06 21:03:09 +03:00
@@ -351,9 +351,20 @@
const char *ptr;
const char *end_ptr;
- (*field)->val_str(&attribute,&attribute);
- ptr= attribute.ptr();
- end_ptr= attribute.length() + ptr;
+ /*
+ Write an empty string to the buffer in case of a NULL value.
+ Basically this is a safety check, as no one ensures that the
+ field content is cleaned up every time we use Field::set_null()
+ in the code.
+ */
+ if ((*field)->is_null())
+ ptr= end_ptr= 0;
+ else
+ {
+ (*field)->val_str(&attribute,&attribute);
+ ptr= attribute.ptr();
+ end_ptr= attribute.length() + ptr;
+ }
buffer.append('"');
--- 1.2/mysql-test/r/log_tables.result 2006-02-03 13:05:10 +03:00
+++ 1.3/mysql-test/r/log_tables.result 2006-03-06 21:03:09 +03:00
@@ -64,3 +64,11 @@
TIMESTAMP root[root] @ localhost [] 2 1 Query insert into bug16905 values ('новое')
TIMESTAMP root[root] @ localhost [] 2 1 Query select * from mysql.general_log
drop table bug16905;
+truncate table mysql.slow_log;
+set session long_query_time=1;
+select sleep(2);
+sleep(2)
+0
+select * from mysql.slow_log;
+start_time user_host query_time lock_time rows_sent rows_examined db last_insert_id insert_id server_id sql_text
+TIMESTAMP, root[root] @ localhost [] USER_HOST, QUERY_TIME 1 0 test 0 0 1 select sleep(2)
--- 1.5/mysql-test/t/log_tables.test 2006-02-12 14:47:55 +03:00
+++ 1.6/mysql-test/t/log_tables.test 2006-03-06 21:03:09 +03:00
@@ -160,6 +160,16 @@
select * from mysql.general_log;
drop table bug16905;
+#
+# Bug #17600: Invalid data logged into mysql.slow_log
+#
+
+truncate table mysql.slow_log;
+set session long_query_time=1;
+select sleep(2);
+--replace_column 1 TIMESTAMP, 3 USER_HOST, 4 QUERY_TIME
+select * from mysql.slow_log;
+
# kill all connections
disconnect con1;
disconnect con2;
--- New file ---
+++ mysql-test/t/log_tables-master.opt 06/03/06 21:03:09
--log-slow-queries
| Thread |
|---|
| • bk commit into 5.1 tree (petr:1.2145) BUG#17600 | Petr Chardin | 6 Mar |