diff options
author | unknown <monty@mysql.com> | 2004-09-09 06:59:26 +0300 |
---|---|---|
committer | unknown <monty@mysql.com> | 2004-09-09 06:59:26 +0300 |
commit | 33efc9677d6f6a68d3dba69f4c036856ac4af5fe (patch) | |
tree | 705389bcc2173e115a186211d2a5890721c9f5c7 /client/mysqlbinlog.cc | |
parent | 4ad51359c1b7b5ed854f1af8df06fd6912068d28 (diff) | |
download | mariadb-git-33efc9677d6f6a68d3dba69f4c036856ac4af5fe.tar.gz |
After merge fixes of merge with 4.1 that included the new arena code.
Fixed (together with Guilhem) bugs in mysqlbinlog regarding --offset
Prefix addresses with 0x for easier comparisons of debug logs
Fixed problem where MySQL choosed index-read even if there would be a much better range on the same index
This fix changed some 'index' queries to 'range' queries in the test suite
Don't create 'dummy' WHERE clause for trivial WHERE clauses where we can remove the WHERE clause.
This fix removed of a lot of 'Using where' notes in the test suite.
Give NOTE instead of WARNING if table/function doesn't exists when using DROP IF EXISTS
Give NOTE instead of WARNING for safe field-type conversions
Makefile.am:
Don't automaticly update files from bk
client/mysqlbinlog.cc:
Merge with 4.1 (+ apply bug fixes for --offset and --start-position)
include/my_sys.h:
Faster clear_alloc_root()
mysql-test/r/bdb.result:
Updated results after merge
mysql-test/r/create.result:
Updated results after merge
mysql-test/r/func_group.result:
Updated results after merge
mysql-test/r/func_if.result:
Updated results after merge
mysql-test/r/heap_btree.result:
Updated results after merge
mysql-test/r/index_merge.result:
Updated results after merge
mysql-test/r/index_merge_ror.result:
Updated results after merge
mysql-test/r/innodb.result:
Updated results after merge
mysql-test/r/join_outer.result:
Updated results after merge
mysql-test/r/mysqlbinlog2.result:
Updated results after merge
mysql-test/r/negation_elimination.result:
Updated results after merge
mysql-test/r/null.result:
Updated results after merge
Added more tests
mysql-test/r/null_key.result:
Updated results after merge
Added more tests
mysql-test/r/order_by.result:
Updated results after merge
mysql-test/r/range.result:
Updated results after merge
Added more tests
mysql-test/r/rpl_charset.result:
Updated results after merge
mysql-test/r/sp-error.result:
Updated results after merge
mysql-test/r/sp.result:
Updated results after merge
Added delete of some stored procedures in an attempt to be able to re-run test even if it aborts in the middle
mysql-test/r/type_blob.result:
Updated results after merge
(Some warnings are now notes)
mysql-test/r/user_var.result:
Updated results after merge
Added more tests
mysql-test/r/variables.result:
Updated results after merge
mysql-test/r/view.result:
Updated results after merge
mysql-test/t/mysqlbinlog2.test:
Updated tests to use new positions
mysql-test/t/null.test:
More tests
mysql-test/t/null_key.test:
More tests
mysql-test/t/range.test:
More tests
mysql-test/t/rpl_charset.test:
Avoid big diffs in the future if tests changes
mysql-test/t/sp-error.test:
Updated error numbers
mysql-test/t/sp-security.test:
Updated error numbers
mysql-test/t/sp.test:
Updated results after merge
Added delete of some stored procedures in an attempt to be able to re-run test even if it aborts in the middle
mysql-test/t/user_var.test:
More tests
mysql-test/t/view.test:
Updated error numbers
mysys/my_alloc.c:
Write into debug log the address of the allocated area
sql/ha_isam.cc:
Prefix addresses with 0x for easier comparisons of debug logs
sql/ha_myisam.cc:
Prefix addresses with 0x for easier comparisons of debug logs
sql/ha_ndbcluster.cc:
Add missing enum to switch
sql/handler.cc:
remove compiler warning
sql/item.cc:
More debugging
Simple cleanup
sql/item.h:
Move Item::cleanup() to item.cc
sql/item_cmpfunc.cc:
Fix arena code
sql/item_subselect.cc:
After merge fixes
sql/item_subselect.h:
After merge fixes
sql/item_sum.cc:
Updated comment
sql/log_event.cc:
Remove wrong test
sql/mysql_priv.h:
Indentation fixes
sql/mysqld.cc:
After merge fixes
Added 0x to pointers in debug log
sql/opt_range.cc:
Fixed problem where MySQL choosed index-read even if there would be a much better range on the same index
This fix changed some 'index' queries to 'range' queries in the test suite
sql/set_var.cc:
Indentation fixes
sql/sp_head.cc:
Set state to INITIALIZED to make SP work with new arena code
sql/sql_base.cc:
After merge fixes
sql/sql_class.cc:
More debugging
Use clear_alloc_root() instead of init_alloc_root() as the former is faster
sql/sql_class.h:
New method 'only_prepare()'
sql/sql_lex.cc:
After merge fixes
sql/sql_lex.h:
After merge fixes
sql/sql_parse.cc:
Fix for timezone tables. (The old way to add timezone tables to global list in 'create_total_list' doesn't work anymore)
Give NOTE instead of WARNING if table/function doesn't exists when using DROP IF EXISTS
sql/sql_prepare.cc:
After merge fixes
sql/sql_select.cc:
Don't create 'dummy' WHERE clause for trivial WHERE clauses where we can remove the WHERE clause.
This fix removed of a lot of 'Using where' notes in the test suite
sql/sql_table.cc:
Give NOTE instead of WARNING if table/function doesn't exists when using DROP IF EXISTS
sql/sql_union.cc:
After merge fix
sql/sql_view.cc:
After merge fix
sql/table.cc:
After merge fix
sql/tztime.cc:
Update timezone table handling to use new table lists structure
sql/tztime.h:
Update timezone table handling to use new table lists structure
sql/unireg.cc:
Use 0x before pointers
Diffstat (limited to 'client/mysqlbinlog.cc')
-rw-r--r-- | client/mysqlbinlog.cc | 96 |
1 files changed, 55 insertions, 41 deletions
diff --git a/client/mysqlbinlog.cc b/client/mysqlbinlog.cc index 538ec4982c1..31588d5b013 100644 --- a/client/mysqlbinlog.cc +++ b/client/mysqlbinlog.cc @@ -22,7 +22,8 @@ can read files produced by 3.23, 4.x, 5.0 servers. Can read binlogs from 3.23/4.x/5.0 and relay logs from 4.x/5.0. - Should be able to read any file of these categories, even with --position. + Should be able to read any file of these categories, even with + --start-position. An important fact: the Format_desc event of the log is at most the 3rd event of the log; if it is the 3rd then there is this combination: Format_desc_of_slave, Rotate_of_master, Format_desc_of_master. @@ -323,8 +324,8 @@ int Load_log_processor::process(Append_block_log_event *ae) /* There is no Create_file event (a bad binlog or a big - --position). Assuming it's a big --position, we just do nothing and - print a warning. + --start-position). Assuming it's a big --start-position, we just do + nothing and print a warning. */ fprintf(stderr,"Warning: ignoring Append_block as there is no \ Create_file event for file_id: %u\n",ae->file_id); @@ -356,18 +357,27 @@ int process_event(LAST_EVENT_INFO *last_event_info, Log_event *ev, my_off_t pos) { char ll_buff[21]; + Log_event_type ev_type= ev->get_type_code(); DBUG_ENTER("process_event"); + /* + Format events are not concerned by --offset and such, we always need to + read them to be able to process the wanted events. + */ if ((rec_count >= offset) && - ((my_time_t)(ev->when) >= start_datetime)) + ((my_time_t)(ev->when) >= start_datetime) || + (ev_type == FORMAT_DESCRIPTION_EVENT)) { - /* - We have found an event after start_datetime, from now on print - everything (in case the binlog has timestamps increasing and decreasing, - we do this to avoid cutting the middle). - */ - start_datetime= 0; - offset= 0; // print everything and protect against cycling rec_count + if (ev_type != FORMAT_DESCRIPTION_EVENT) + { + /* + We have found an event after start_datetime, from now on print + everything (in case the binlog has timestamps increasing and + decreasing, we do this to avoid cutting the middle). + */ + start_datetime= 0; + offset= 0; // print everything and protect against cycling rec_count + } if (((my_time_t)(ev->when) >= stop_datetime) || (pos >= stop_position_mot)) { @@ -377,7 +387,7 @@ int process_event(LAST_EVENT_INFO *last_event_info, Log_event *ev, if (!short_form) fprintf(result_file, "# at %s\n",llstr(pos,ll_buff)); - switch (ev->get_type_code()) { + switch (ev_type) { case QUERY_EVENT: if (one_database) { @@ -431,7 +441,7 @@ int process_event(LAST_EVENT_INFO *last_event_info, Log_event *ev, Create_file_log_event *ce= load_processor.grab_event(exv->file_id); /* if ce is 0, it probably means that we have not seen the Create_file - event (a bad binlog, or most probably --position is after the + event (a bad binlog, or most probably --start-position is after the Create_file event). Print a warning comment. */ if (ce) @@ -853,6 +863,8 @@ could be out of memory"); for (;;) { const char *error_msg; + Log_event *ev; + len = net_safe_read(mysql); if (len == packet_error) { @@ -865,10 +877,9 @@ could be out of memory"); break; // end of data DBUG_PRINT("info",( "len= %u, net->read_pos[5] = %d\n", len, net->read_pos[5])); - Log_event *ev = Log_event::read_log_event((const char*) net->read_pos + 1 , - len - 1, &error, - description_event); - if (!ev) + if (!(ev= Log_event::read_log_event((const char*) net->read_pos + 1 , + len - 1, &error_msg, + description_event))) { fprintf(stderr, "Could not construct log event object\n"); error= 1; @@ -970,10 +981,10 @@ static void check_header(IO_CACHE* file, { byte header[BIN_LOG_HEADER_SIZE]; byte buf[PROBE_HEADER_LEN]; + my_off_t tmp_pos, pos; *description_event= new Format_description_log_event(3); - my_off_t tmp_pos; - my_off_t pos = my_b_tell(file); + pos= my_b_tell(file); my_b_seek(file, (my_off_t)0); if (my_b_read(file, header, sizeof(header))) die("Failed reading header; Probably an empty file"); @@ -981,16 +992,17 @@ static void check_header(IO_CACHE* file, die("File is not a binary log file"); /* - Imagine we are running with --position=1000. We still need to know the - binlog format's. So we still need to find, if there is one, the Format_desc - event, or to know if this is a 3.23 binlog. So we need to first read the - first events of the log, those around offset 4. - Even if we are reading a 3.23 binlog from the start (no --position): we need - to know the header length (which is 13 in 3.23, 19 in 4.x) to be able to - successfully print the first event (Start_log_event_v3). So even in this - case, we need to "probe" the first bytes of the log *before* we do a real - read_log_event(). Because read_log_event() needs to know the header's length - to work fine. + Imagine we are running with --start-position=1000. We still need + to know the binlog format's. So we still need to find, if there is + one, the Format_desc event, or to know if this is a 3.23 + binlog. So we need to first read the first events of the log, + those around offset 4. Even if we are reading a 3.23 binlog from + the start (no --start-position): we need to know the header length + (which is 13 in 3.23, 19 in 4.x) to be able to successfully print + the first event (Start_log_event_v3). So even in this case, we + need to "probe" the first bytes of the log *before* we do a real + read_log_event(). Because read_log_event() needs to know the + header's length to work fine. */ for(;;) { @@ -1002,23 +1014,25 @@ static void check_header(IO_CACHE* file, Could not read entry at offset %lu : Error in log format or read error", tmp_pos); /* - Otherwise this is just EOF : this log currently contains 0-2 events. - Maybe it's going to be filled in the next milliseconds; then we are - going to have a problem if this a 3.23 log (imagine we are locally - reading a 3.23 binlog which is being written presently): we won't know - it in read_log_event() and will fail(). - Similar problems could happen with hot relay logs if --position is used - (but a --position which is posterior to the current size of the log). - These are rare problems anyway (reading a hot log + when we read the - first events there are not all there yet + when we read a bit later - there are more events + using a strange --position). + Otherwise this is just EOF : this log currently contains 0-2 + events. Maybe it's going to be filled in the next + milliseconds; then we are going to have a problem if this a + 3.23 log (imagine we are locally reading a 3.23 binlog which + is being written presently): we won't know it in + read_log_event() and will fail(). Similar problems could + happen with hot relay logs if --start-position is used (but a + --start-position which is posterior to the current size of the log). + These are rare problems anyway (reading a hot log + when we + read the first events there are not all there yet + when we + read a bit later there are more events + using a strange + --start-position). */ break; } else { DBUG_PRINT("info",("buf[4]=%d", buf[4])); - /* always test for a Start_v3, even if no --position */ + /* always test for a Start_v3, even if no --start-position */ if (buf[4] == START_EVENT_V3) /* This is 3.23 or 4.x */ { if (uint4korr(buf + EVENT_LEN_OFFSET) < @@ -1030,7 +1044,7 @@ Could not read entry at offset %lu : Error in log format or read error", } break; } - else if (tmp_pos>=position) + else if (tmp_pos >= start_position) break; else if (buf[4] == FORMAT_DESCRIPTION_EVENT) /* This is 5.0 */ { |