2011-06-30 17:37:13 +02:00
|
|
|
/*
|
2011-11-21 18:13:14 +01:00
|
|
|
Copyright (c) 2006, 2010, Oracle and/or its affiliates.
|
2006-10-31 12:23:14 +01:00
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
2006-12-27 02:23:51 +01:00
|
|
|
the Free Software Foundation; version 2 of the License.
|
2006-10-31 12:23:14 +01:00
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program; if not, write to the Free Software
|
2011-06-30 17:37:13 +02:00
|
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
*/
|
2006-10-31 12:23:14 +01:00
|
|
|
|
|
|
|
#include "mysql_priv.h"
|
|
|
|
|
2007-04-12 08:58:04 +02:00
|
|
|
#include "rpl_mi.h"
|
2006-10-31 12:23:14 +01:00
|
|
|
#include "rpl_rli.h"
|
|
|
|
#include <my_dir.h> // For MY_STAT
|
|
|
|
#include "sql_repl.h" // For check_binlog_magic
|
2007-02-26 17:44:55 +01:00
|
|
|
#include "rpl_utility.h"
|
2006-10-31 12:23:14 +01:00
|
|
|
|
2007-08-16 07:37:50 +02:00
|
|
|
static int count_relay_log_space(Relay_log_info* rli);
|
2006-10-31 12:23:14 +01:00
|
|
|
|
|
|
|
|
2007-08-16 07:37:50 +02:00
|
|
|
Relay_log_info::Relay_log_info()
|
2007-06-09 07:19:37 +02:00
|
|
|
:Slave_reporting_capability("SQL"),
|
2007-06-09 08:29:51 +02:00
|
|
|
no_storage(FALSE), replicate_same_server_id(::replicate_same_server_id),
|
2007-03-22 08:32:41 +01:00
|
|
|
info_fd(-1), cur_log_fd(-1), save_temporary_tables(0),
|
Added versioning of Maria index
Store max_trid in index file as state.create_trid. This is used to pack all transids in the index pages relative to max possible transid for file.
Enable versioning for transactional tables with index. Tables with an auto-increment key, rtree or fulltext keys are not versioned.
Changed info->lastkey to type MARIA_KEY. Removed info->lastkey_length as this is now part of info->lastkey
Renamed old info->lastkey to info->lastkey_buff
Use exact key lenghts for keys, not USE_WHOLE_KEY
For partial key searches, use SEARCH_PART_KEY
When searching to insert new key on page, use SEARCH_INSERT to mark that key has rowid
Changes done in a lot of files:
- Modified functions to use MARIA_KEY instead of key pointer and key length
- Use keyinfo->root_lock instead of share->key_root_lock[keynr]
- Simplify code by using local variable keyinfo instead if share->keyinfo[i]
- Added #fdef EXTERNAL_LOCKING around removed state elements
- HA_MAX_KEY_BUFF -> MARIA_MAX_KEY_BUFF (to reserve space for transid)
- Changed type of 'nextflag' to uint32 to ensure all SEARCH_xxx flags fits into it
.bzrignore:
Added missing temporary directory
extra/Makefile.am:
comp_err is now deleted on make distclean
include/maria.h:
Added structure MARIA_KEY, which is used for intern key objects in Maria.
Changed functions to take MARIA_KEY as an argument instead of pointer to packed key.
Changed some functions that always return true or false to my_bool.
Added virtual function make_key() to avoid if in _ma_make_key()
Moved rw_lock_t for locking trees from share->key_root_lock to MARIA_KEYDEF. This makes usage of the locks simpler and faster
include/my_base.h:
Added HA_RTREE_INDEX flag to mark rtree index. Used for easier checks in ma_check()
Added SEARCH_INSERT to be used when inserting new keys
Added SEARCH_PART_KEY for partial searches
Added SEARCH_USER_KEY_HAS_TRANSID to be used when key we use for searching in btree has a TRANSID
Added SEARCH_PAGE_KEY_HAS_TRANSID to be used when key we found in btree has a transid
include/my_handler.h:
Make next_flag 32 bit to make sure we can handle all SEARCH_ bits
mysql-test/include/maria_empty_logs.inc:
Read and restore current database; Don't assume we are using mysqltest.
Don't log use databasename to log. Using this include should not cause any result changes.
mysql-test/r/maria-gis-rtree-dynamic.result:
Updated results after adding some check table commands to help pinpoint errors
mysql-test/r/maria-mvcc.result:
New tests
mysql-test/r/maria-purge.result:
New result after adding removal of logs
mysql-test/r/maria-recovery-big.result:
maria_empty_logs doesn't log 'use mysqltest' anymore
mysql-test/r/maria-recovery-bitmap.result:
maria_empty_logs doesn't log 'use mysqltest' anymore
mysql-test/r/maria-recovery-rtree-ft.result:
maria_empty_logs doesn't log 'use mysqltest' anymore
mysql-test/r/maria-recovery.result:
maria_empty_logs doesn't log 'use mysqltest' anymore
mysql-test/r/maria.result:
New tests
mysql-test/r/variables-big.result:
Don't log id as it's not predictable
mysql-test/suite/rpl_ndb/r/rpl_truncate_7ndb_2.result:
Updated results to new binlog results. (Test has not been run in a long time as it requires --big)
mysql-test/suite/rpl_ndb/t/rpl_truncate_7ndb_2-master.opt:
Moved file to ndb replication test directory
mysql-test/suite/rpl_ndb/t/rpl_truncate_7ndb_2.test:
Fixed wrong path to included tests
mysql-test/t/maria-gis-rtree-dynamic.test:
Added some check table commands to help pinpoint errors
mysql-test/t/maria-mvcc.test:
New tests
mysql-test/t/maria-purge.test:
Remove logs to make test results predictable
mysql-test/t/maria.test:
New tests for some possible problems
mysql-test/t/variables-big.test:
Don't log id as it's not predictable
mysys/my_handler.c:
Updated function comment to reflect old code
Changed nextflag to be uint32 to ensure we can have flags > 16 bit
Changed checking if we are in insert with NULL keys as next_flag can now include additional bits that have to be ignored.
Added SEARCH_INSERT flag to be used when inserting new keys in btree. This flag tells us the that the keys includes row position and it's thus safe to remove SEARCH_FIND
Added comparision of transid. This is only done if the keys actually have a transid, which is indicated by nextflag
mysys/my_lock.c:
Fixed wrong test (Found by Guilhem)
scripts/Makefile.am:
Ensure that test programs are deleted by make clean
sql/rpl_rli.cc:
Moved assignment order to fix compiler warning
storage/heap/hp_write.c:
Add SEARCH_INSERT to signal ha_key_cmp that we we should also compare rowid for keys
storage/maria/Makefile.am:
Remove also maria log files when doing make distclean
storage/maria/ha_maria.cc:
Use 'file->start_state' as default state for transactional tables without versioning
At table unlock, set file->state to point to live state. (Needed for information schema to pick up right number of rows)
In ha_maria::implicit_commit() move all locked (ie open) tables to new transaction. This is needed to ensure ha_maria->info doesn't point to a deleted history event.
Disable concurrent inserts for insert ... select and table changes with subqueries if statement based replication as this would cause wrong results on slave
storage/maria/ma_blockrec.c:
Updated comment
storage/maria/ma_check.c:
Compact key pages (removes transid) when doing --zerofill
Check that 'page_flag' on key pages contains KEYPAGE_FLAG_HAS_TRANSID if there is a single key on the page with a transid
Modified functions to use MARIA_KEY instead of key pointer and key length
Use new interface to _ma_rec_pos(), _ma_dpointer(), _ma_ft_del(), ma_update_state_lsn()
Removed not needed argument from get_record_for_key()
Fixed that we check doesn't give errors for RTREE; We now treath these like SPATIAL
Remove some SPATIAL specific code where the virtual functions can handle this in a general manner
Use info->lastkey_buff instead of info->lastkey
_ma_dpos() -> _ma_row_pos_from_key()
_ma_make_key() -> keyinfo->make_key()
_ma_print_key() -> _ma_print_keydata()
_ma_move_key() -> ma_copy_copy()
Add SEARCH_INSERT to signal ha_key_cmp that we we should also compare rowid for keys
Ensure that data on page doesn't overwrite page checksum position
Use DBUG_DUMP_KEY instead of DBUG_DUMP
Use exact key lengths instead of USE_WHOLE_KEY to ha_key_cmp()
Fixed check if rowid points outside of BLOCK_RECORD data file
Use info->lastkey_buff instead of key on stack in some safe places
Added #fdef EXTERNAL_LOCKING around removed state elements
storage/maria/ma_close.c:
Use keyinfo->root_lock instead of share->key_root_lock[keynr]
storage/maria/ma_create.c:
Removed assert that is already checked in maria_init()
Force transactinal tables to be of type BLOCK_RECORD
Fixed wrong usage of HA_PACK_RECORD (should be HA_OPTION_PACK_RECORD)
Mark keys that uses HA_KEY_ALG_RTREE with HA_RTREE_INDEX for easier handling of these in ma_check
Store max_trid in index file as state.create_trid. This is used to pack all transids in the index pages relative to max possible transid for file.
storage/maria/ma_dbug.c:
Changed _ma_print_key() to use MARIA_KEY
storage/maria/ma_delete.c:
Modified functions to use MARIA_KEY instead of key pointer and key length
info->lastkey2-> info->lastkey_buff2
Added SEARCH_INSERT to signal ha_key_cmp that we we should also compare rowid for keys
Use new interface for get_key(), _ma_get_last_key() and others
_ma_dpos() -> ma_row_pos_from_key()
Simplify setting of prev_key in del()
Ensure that KEYPAGE_FLAG_HAS_TRANSID is set in page_flag if key page has transid
Treath key pages that may have a transid as if keys would be of variable length
storage/maria/ma_delete_all.c:
Reset history state if maria_delete_all_rows() are called
Update parameters to _ma_update_state_lsns() call
storage/maria/ma_extra.c:
Store and restore info->lastkey
storage/maria/ma_ft_boolean_search.c:
Modified functions to use MARIA_KEY instead of key pointer and key length
storage/maria/ma_ft_nlq_search.c:
Modified functions to use MARIA_KEY instead of key pointer and key length
Use lastkey_buff2 instead of info->lastkey+info->s->base.max_key_length (same thing)
storage/maria/ma_ft_update.c:
Modified functions to use MARIA_KEY instead of key pointer and key length
storage/maria/ma_ftdefs.h:
Modified functions to use MARIA_KEY instead of key pointer and key length
storage/maria/ma_fulltext.h:
Modified functions to use MARIA_KEY instead of key pointer and key length
storage/maria/ma_init.c:
Check if blocksize is legal
(Moved test here from ma_open())
storage/maria/ma_key.c:
Added functions for storing/reading of transid
Modified functions to use MARIA_KEY instead of key pointer and key length
Moved _ma_sp_make_key() out of _ma_make_key() as we now use keyinfo->make_key to create keys
Add transid to keys if table is versioned
Added _ma_copy_key()
storage/maria/ma_key_recover.c:
Add logging of page_flag (holds information if there are keys with transid on page)
Changed DBUG_PRINT("info" -> DBUG_PRINT("redo" as the redo logging can be quite extensive
Added lots of DBUG_PRINT()
Added support for index page operations: KEY_OP_SET_PAGEFLAG and KEY_OP_COMPACT_PAGE
storage/maria/ma_key_recover.h:
Modified functions to use MARIA_KEY instead of key pointer and key length
storage/maria/ma_locking.c:
Added new arguments to _ma_update_state_lsns_sub()
storage/maria/ma_loghandler.c:
Fixed all logging of LSN to look similar in DBUG log
Changed if (left != 0) to if (left) as the later is used also later in the code
storage/maria/ma_loghandler.h:
Added new index page operations
storage/maria/ma_open.c:
Removed allocated "state_dummy" and instead use share->state.common for transactional tables that are not versioned
This is needed to not get double increments of state.records (one in ma_write.c and on when log is written)
Changed info->lastkey to MARIA_KEY type
Removed resetting of MARIA_HA variables that have 0 as default value (as info is zerofilled)
Enable versioning for transactional tables with index. Tables with an auto-increment key, rtree or fulltext keys are not versioned.
Check on open that state.create_trid is correct
Extend share->base.max_key_length in case of transactional table so that it can hold transid
Removed 4.0 compatible fulltext key mode as this is not relevant for Maria
Removed old and wrong #ifdef ENABLE_WHEN_WE_HAVE_TRANS_ROW_ID code block
Initialize all new virtual function pointers
Removed storing of state->unique, state->process and store state->create_trid instead
storage/maria/ma_page.c:
Added comment to describe key page structure
Added functions to compact key page and log the compact operation
storage/maria/ma_range.c:
Modified functions to use MARIA_KEY instead of key pointer and key length
Use SEARCH_PART_KEY indicator instead of USE_WHOLE_KEY to detect if we are doing a part key search
Added handling of pages with transid
storage/maria/ma_recovery.c:
Don't assert if table we opened are not transactional. This may be a table which has been changed from transactional to not transactinal
Added new arguments to _ma_update_state_lsns()
storage/maria/ma_rename.c:
Added new arguments to _ma_update_state_lsns()
storage/maria/ma_rkey.c:
Modified functions to use MARIA_KEY instead of key pointer and key length
Don't use USE_WHOLE_KEY, use real length of key
Use share->row_is_visible() to test if row is visible
Moved search_flag == HA_READ_KEY_EXACT out of 'read-next-row' loop as this only need to be tested once
Removed test if last_used_keyseg != 0 as this is always true
storage/maria/ma_rnext.c:
Modified functions to use MARIA_KEY instead of key pointer and key length
Simplify code by using local variable keyinfo instead if share->keyinfo[i]
Use share->row_is_visible() to test if row is visible
storage/maria/ma_rnext_same.c:
Modified functions to use MARIA_KEY instead of key pointer and key length
lastkey2 -> lastkey_buff2
storage/maria/ma_rprev.c:
Modified functions to use MARIA_KEY instead of key pointer and key length
Simplify code by using local variable keyinfo instead if share->keyinfo[i]
Use share->row_is_visible() to test if row is visible
storage/maria/ma_rsame.c:
Updated comment
Simplify code by using local variable keyinfo instead if share->keyinfo[i]
Modified functions to use MARIA_KEY instead of key pointer and key length
storage/maria/ma_rsamepos.c:
Modified functions to use MARIA_KEY instead of key pointer and key length
storage/maria/ma_rt_index.c:
Modified functions to use MARIA_KEY instead of key pointer and key length
Use better variable names
Removed not needed casts
_ma_dpos() -> _ma_row_pos_from_key()
Use info->last_rtree_keypos to save position to key instead of info->int_keypos
Simplify err: condition
Changed return type for maria_rtree_insert() to my_bool as we are only intressed in ok/fail from this function
storage/maria/ma_rt_index.h:
Modified functions to use MARIA_KEY instead of key pointer and key length
storage/maria/ma_rt_key.c:
Modified functions to use MARIA_KEY instead of key pointer and key length
Simplify maria_rtree_add_key by combining idenitcal code and removing added_len
storage/maria/ma_rt_key.h:
Modified functions to use MARIA_KEY instead of key pointer and key length
storage/maria/ma_rt_mbr.c:
Changed type of 'nextflag' to uint32
Added 'to' argument to RT_PAGE_MBR_XXX functions to more clearly see which variables changes value
storage/maria/ma_rt_mbr.h:
Changed type of 'nextflag' to uint32
storage/maria/ma_rt_split.c:
Modified functions to use MARIA_KEY instead of key pointer and key length
key_length -> key_data_length to catch possible errors
storage/maria/ma_rt_test.c:
Fixed wrong comment
Reset recinfo to avoid valgrind varnings
Fixed wrong argument to create_record() that caused test to fail
storage/maria/ma_search.c:
Modified functions to use MARIA_KEY instead of key pointer and key length
Added support of keys with optional trid
Test for SEARCH_PART_KEY instead of USE_WHOLE_KEY to detect part key reads
_ma_dpos() -> _ma_row_pos_from_key()
If there may be keys with transid on the page, have _ma_bin_search() call _ma_seq_search()
Add _ma_skip_xxx() functions to quickly step over keys (faster than calling get_key() in most cases as we don't have to copy key data)
Combine similar code at end of _ma_get_binary_pack_key()
Removed not used function _ma_move_key()
In _ma_search_next() don't call _ma_search() if we aren't on a nod page.
Update info->cur_row.trid with trid for found key
Removed some not needed casts
Added _ma_trid_from_key()
Use MARIA_SHARE instead of MARIA_HA as arguments to _ma_rec_pos(), _ma_dpointer() and _ma_xxx_keypos_to_recpos() to make functions faster and smaller
storage/maria/ma_sort.c:
Modified functions to use MARIA_KEY instead of key pointer and key length
storage/maria/ma_sp_defs.h:
_ma_sp_make_key() now fills in and returns (MARIA_KEY *) value
storage/maria/ma_sp_key.c:
_ma_sp_make_key() now fills in and returns (MARIA_KEY *) value
Don't test sizeof(double), test against 8 as we are using float8store()
Use mi_float8store() instead of doing swap of value (same thing but faster)
storage/maria/ma_state.c:
maria_versioning() now only calls _ma_block_get_status() if table supports versioning
Added _ma_row_visible_xxx() functions for different occasions
When emptying history, set info->state to point to the first history event.
storage/maria/ma_state.h:
Added _ma_row_visible_xxx() prototypes
storage/maria/ma_static.c:
Indentation changes
storage/maria/ma_statrec.c:
Fixed arguments to _ma_dpointer() and _ma_rec_pos()
storage/maria/ma_test1.c:
Call init_thr_lock() if we have versioning
storage/maria/ma_test2.c:
Call init_thr_lock() if we have versioning
storage/maria/ma_unique.c:
Modified functions to use MARIA_KEY
storage/maria/ma_update.c:
Modified functions to use MARIA_KEY instead of key pointer and key length
storage/maria/ma_write.c:
Modified functions to use MARIA_KEY instead of key pointer and key length
Simplify code by using local variable keyinfo instead if share->keyinfo[i]
In _ma_enlarge_root(), mark in page_flag if new key has transid
_ma_dpos() -> _ma_row_pos_from_key()
Changed return type of _ma_ck_write_tree() to my_bool as we are only testing if result is true or not
Moved 'reversed' to outside block as area was used later
storage/maria/maria_chk.c:
Added error if trying to sort with HA_BINARY_PACK_KEY
Use new interface to get_key() and _ma_dpointer()
_ma_dpos() -> _ma_row_pos_from_key()
storage/maria/maria_def.h:
Modified functions to use MARIA_KEY instead of key pointer and key length
Added 'common' to MARIA_SHARE->state for storing state for transactional tables without versioning
Added create_trid to MARIA_SHARE
Removed not used state variables 'process' and 'unique'
Added defines for handling TRID's in index pages
Changed to use MARIA_SHARE instead of MARIA_HA for some functions
Added 'have_versioning' flag if table supports versioning
Moved key_root_lock from MARIA_SHARE to MARIA_KEYDEF
Changed last_key to be of type MARIA_KEY. Removed lastkey_length
lastkey -> lastkey_buff, lastkey2 -> lastkey_buff2
Added _ma_get_used_and_nod_with_flag() for faster access to page data when page_flag is read
Added DBUG_DUMP_KEY for easier DBUG_DUMP of a key
Changed 'nextflag' and assocaited variables to uint32
storage/maria/maria_ftdump.c:
lastkey -> lastkey_buff
storage/maria/trnman.c:
Fixed wrong initialization of min_read_from and max_commit_trid
Added trnman_get_min_safe_trid()
storage/maria/unittest/ma_test_all-t:
Added --start-from
storage/myisam/mi_check.c:
Added SEARCH_INSERT, as ha_key_cmp() needs it when doing key comparision for inserting key on page in rowid order
storage/myisam/mi_delete.c:
Added SEARCH_INSERT, as ha_key_cmp() needs it when doing key comparision for inserting key on page in rowid order
storage/myisam/mi_range.c:
Updated comment
storage/myisam/mi_write.c:
Added SEARCH_INSERT, as ha_key_cmp() needs it when doing key comparision for inserting key on page in rowid order
storage/myisam/rt_index.c:
Fixed wrong parameter to rtree_get_req() which could cause crash
2008-06-26 07:18:28 +02:00
|
|
|
cur_log_old_open_count(0), group_relay_log_pos(0), event_relay_log_pos(0),
|
2009-05-06 14:03:24 +02:00
|
|
|
#if HAVE_valgrind
|
2008-02-11 12:04:30 +01:00
|
|
|
is_fake(FALSE),
|
|
|
|
#endif
|
2008-02-18 12:35:44 +01:00
|
|
|
group_master_log_pos(0), log_space_total(0), ignore_log_space_limit(0),
|
|
|
|
last_master_timestamp(0), slave_skip_counter(0),
|
2007-06-09 07:19:37 +02:00
|
|
|
abort_pos_wait(0), slave_run_id(0), sql_thd(0),
|
2006-10-31 12:23:14 +01:00
|
|
|
inited(0), abort_slave(0), slave_running(0), until_condition(UNTIL_NONE),
|
|
|
|
until_log_pos(0), retried_trans(0),
|
|
|
|
tables_to_lock(0), tables_to_lock_count(0),
|
2011-01-10 14:53:09 +01:00
|
|
|
last_event_start_time(0), m_flags(0),
|
|
|
|
m_annotate_event(0)
|
2006-10-31 12:23:14 +01:00
|
|
|
{
|
2007-08-16 07:37:50 +02:00
|
|
|
DBUG_ENTER("Relay_log_info::Relay_log_info");
|
2006-10-31 12:23:14 +01:00
|
|
|
|
|
|
|
group_relay_log_name[0]= event_relay_log_name[0]=
|
|
|
|
group_master_log_name[0]= 0;
|
2007-06-09 07:19:37 +02:00
|
|
|
until_log_name[0]= ign_master_log_name_end[0]= 0;
|
2006-10-31 12:23:14 +01:00
|
|
|
bzero((char*) &info_file, sizeof(info_file));
|
|
|
|
bzero((char*) &cache_buf, sizeof(cache_buf));
|
|
|
|
cached_charset_invalidate();
|
|
|
|
pthread_mutex_init(&run_lock, MY_MUTEX_INIT_FAST);
|
|
|
|
pthread_mutex_init(&data_lock, MY_MUTEX_INIT_FAST);
|
|
|
|
pthread_mutex_init(&log_space_lock, MY_MUTEX_INIT_FAST);
|
|
|
|
pthread_cond_init(&data_cond, NULL);
|
|
|
|
pthread_cond_init(&start_cond, NULL);
|
|
|
|
pthread_cond_init(&stop_cond, NULL);
|
|
|
|
pthread_cond_init(&log_space_cond, NULL);
|
|
|
|
relay_log.init_pthread_objects();
|
|
|
|
DBUG_VOID_RETURN;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-08-16 07:37:50 +02:00
|
|
|
Relay_log_info::~Relay_log_info()
|
2006-10-31 12:23:14 +01:00
|
|
|
{
|
2007-08-16 07:37:50 +02:00
|
|
|
DBUG_ENTER("Relay_log_info::~Relay_log_info");
|
2006-10-31 12:23:14 +01:00
|
|
|
|
|
|
|
pthread_mutex_destroy(&run_lock);
|
|
|
|
pthread_mutex_destroy(&data_lock);
|
|
|
|
pthread_mutex_destroy(&log_space_lock);
|
|
|
|
pthread_cond_destroy(&data_cond);
|
|
|
|
pthread_cond_destroy(&start_cond);
|
|
|
|
pthread_cond_destroy(&stop_cond);
|
|
|
|
pthread_cond_destroy(&log_space_cond);
|
|
|
|
relay_log.cleanup();
|
2011-01-10 14:53:09 +01:00
|
|
|
free_annotate_event();
|
2006-10-31 12:23:14 +01:00
|
|
|
DBUG_VOID_RETURN;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-08-16 07:37:50 +02:00
|
|
|
int init_relay_log_info(Relay_log_info* rli,
|
2006-10-31 12:23:14 +01:00
|
|
|
const char* info_fname)
|
|
|
|
{
|
|
|
|
char fname[FN_REFLEN+128];
|
|
|
|
int info_fd;
|
|
|
|
const char* msg = 0;
|
|
|
|
int error = 0;
|
|
|
|
DBUG_ENTER("init_relay_log_info");
|
|
|
|
DBUG_ASSERT(!rli->no_storage); // Don't init if there is no storage
|
|
|
|
|
|
|
|
if (rli->inited) // Set if this function called
|
|
|
|
DBUG_RETURN(0);
|
|
|
|
fn_format(fname, info_fname, mysql_data_home, "", 4+32);
|
|
|
|
pthread_mutex_lock(&rli->data_lock);
|
|
|
|
info_fd = rli->info_fd;
|
|
|
|
rli->cur_log_fd = -1;
|
|
|
|
rli->slave_skip_counter=0;
|
|
|
|
rli->abort_pos_wait=0;
|
|
|
|
rli->log_space_limit= relay_log_space_limit;
|
|
|
|
rli->log_space_total= 0;
|
|
|
|
rli->tables_to_lock= 0;
|
|
|
|
rli->tables_to_lock_count= 0;
|
|
|
|
|
2009-04-19 03:21:33 +02:00
|
|
|
char pattern[FN_REFLEN];
|
2009-11-28 05:43:16 +01:00
|
|
|
(void) my_realpath(pattern, slave_load_tmpdir, 0);
|
|
|
|
if (fn_format(pattern, PREFIX_SQL_LOAD, pattern, "",
|
2009-04-19 03:21:33 +02:00
|
|
|
MY_SAFE_PATH | MY_RETURN_REAL_PATH) == NullS)
|
|
|
|
{
|
|
|
|
pthread_mutex_unlock(&rli->data_lock);
|
|
|
|
sql_print_error("Unable to use slave's temporary directory %s",
|
|
|
|
slave_load_tmpdir);
|
|
|
|
DBUG_RETURN(1);
|
|
|
|
}
|
|
|
|
unpack_filename(rli->slave_patternload_file, pattern);
|
2009-02-21 10:36:07 +01:00
|
|
|
rli->slave_patternload_file_size= strlen(rli->slave_patternload_file);
|
|
|
|
|
2006-10-31 12:23:14 +01:00
|
|
|
/*
|
|
|
|
The relay log will now be opened, as a SEQ_READ_APPEND IO_CACHE.
|
|
|
|
Note that the I/O thread flushes it to disk after writing every
|
2010-05-24 18:43:27 +02:00
|
|
|
event, in flush_master_info(mi, 1, ?).
|
2006-10-31 12:23:14 +01:00
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
For the maximum log size, we choose max_relay_log_size if it is
|
|
|
|
non-zero, max_binlog_size otherwise. If later the user does SET
|
|
|
|
GLOBAL on one of these variables, fix_max_binlog_size and
|
|
|
|
fix_max_relay_log_size will reconsider the choice (for example
|
|
|
|
if the user changes max_relay_log_size to zero, we have to
|
|
|
|
switch to using max_binlog_size for the relay log) and update
|
|
|
|
rli->relay_log.max_size (and mysql_bin_log.max_size).
|
|
|
|
*/
|
|
|
|
{
|
2009-11-05 07:07:31 +01:00
|
|
|
/* Reports an error and returns, if the --relay-log's path
|
|
|
|
is a directory.*/
|
|
|
|
if (opt_relay_logname &&
|
|
|
|
opt_relay_logname[strlen(opt_relay_logname) - 1] == FN_LIBCHAR)
|
|
|
|
{
|
|
|
|
pthread_mutex_unlock(&rli->data_lock);
|
|
|
|
sql_print_error("Path '%s' is a directory name, please specify \
|
|
|
|
a file name for --relay-log option", opt_relay_logname);
|
|
|
|
DBUG_RETURN(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Reports an error and returns, if the --relay-log-index's path
|
|
|
|
is a directory.*/
|
|
|
|
if (opt_relaylog_index_name &&
|
|
|
|
opt_relaylog_index_name[strlen(opt_relaylog_index_name) - 1]
|
|
|
|
== FN_LIBCHAR)
|
|
|
|
{
|
|
|
|
pthread_mutex_unlock(&rli->data_lock);
|
|
|
|
sql_print_error("Path '%s' is a directory name, please specify \
|
|
|
|
a file name for --relay-log-index option", opt_relaylog_index_name);
|
|
|
|
DBUG_RETURN(1);
|
|
|
|
}
|
|
|
|
|
2006-10-31 12:23:14 +01:00
|
|
|
char buf[FN_REFLEN];
|
|
|
|
const char *ln;
|
|
|
|
static bool name_warning_sent= 0;
|
|
|
|
ln= rli->relay_log.generate_name(opt_relay_logname, "-relay-bin",
|
|
|
|
1, buf);
|
|
|
|
/* We send the warning only at startup, not after every RESET SLAVE */
|
|
|
|
if (!opt_relay_logname && !opt_relaylog_index_name && !name_warning_sent)
|
|
|
|
{
|
|
|
|
/*
|
|
|
|
User didn't give us info to name the relay log index file.
|
|
|
|
Picking `hostname`-relay-bin.index like we do, causes replication to
|
|
|
|
fail if this slave's hostname is changed later. So, we would like to
|
|
|
|
instead require a name. But as we don't want to break many existing
|
|
|
|
setups, we only give warning, not error.
|
|
|
|
*/
|
|
|
|
sql_print_warning("Neither --relay-log nor --relay-log-index were used;"
|
|
|
|
" so replication "
|
|
|
|
"may break when this MySQL server acts as a "
|
|
|
|
"slave and has his hostname changed!! Please "
|
2011-03-28 02:02:24 +02:00
|
|
|
"use '--log-basename=#' or '--relay-log=%s' to avoid "
|
2011-03-23 16:59:41 +01:00
|
|
|
"this problem.", ln);
|
2006-10-31 12:23:14 +01:00
|
|
|
name_warning_sent= 1;
|
|
|
|
}
|
2011-05-03 14:01:11 +02:00
|
|
|
|
|
|
|
rli->relay_log.is_relay_log= TRUE;
|
|
|
|
|
2006-10-31 12:23:14 +01:00
|
|
|
/*
|
|
|
|
note, that if open() fails, we'll still have index file open
|
|
|
|
but a destructor will take care of that
|
|
|
|
*/
|
2009-12-04 15:40:42 +01:00
|
|
|
if (rli->relay_log.open_index_file(opt_relaylog_index_name, ln, TRUE) ||
|
2006-10-31 12:23:14 +01:00
|
|
|
rli->relay_log.open(ln, LOG_BIN, 0, SEQ_READ_APPEND, 0,
|
|
|
|
(max_relay_log_size ? max_relay_log_size :
|
2009-12-04 15:40:42 +01:00
|
|
|
max_binlog_size), 1, TRUE))
|
2006-10-31 12:23:14 +01:00
|
|
|
{
|
|
|
|
pthread_mutex_unlock(&rli->data_lock);
|
|
|
|
sql_print_error("Failed in open_log() called from init_relay_log_info()");
|
|
|
|
DBUG_RETURN(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* if file does not exist */
|
|
|
|
if (access(fname,F_OK))
|
|
|
|
{
|
|
|
|
/*
|
|
|
|
If someone removed the file from underneath our feet, just close
|
|
|
|
the old descriptor and re-create the old file
|
|
|
|
*/
|
|
|
|
if (info_fd >= 0)
|
|
|
|
my_close(info_fd, MYF(MY_WME));
|
|
|
|
if ((info_fd = my_open(fname, O_CREAT|O_RDWR|O_BINARY, MYF(MY_WME))) < 0)
|
|
|
|
{
|
|
|
|
sql_print_error("Failed to create a new relay log info file (\
|
|
|
|
file '%s', errno %d)", fname, my_errno);
|
Bug#12713 "Error in a stored function called from a SELECT doesn't
cause ROLLBACK of statement", part 1. Review fixes.
Do not send OK/EOF packets to the client until we reached the end of
the current statement.
This is a consolidation, to keep the functionality that is shared by all
SQL statements in one place in the server.
Currently this functionality includes:
- close_thread_tables()
- log_slow_statement().
After this patch and the subsequent patch for Bug#12713, it shall also include:
- ha_autocommit_or_rollback()
- net_end_statement()
- query_cache_end_of_result().
In future it may also include:
- mysql_reset_thd_for_next_command().
include/mysql_com.h:
Rename now unused members of NET: no_send_ok, no_send_error, report_error.
These were server-specific variables related to the client/server
protocol. They have been made obsolete by this patch.
Previously the same members of NET were used to store the error message
both on the client and on the server.
The error message was stored in net.last_error (client: mysql->net.last_error,
server: thd->net.last_error).
The error code was stored in net.last_errno (client: mysql->net.last_errno,
server: thd->net.last_errno).
The server error code and message are now stored elsewhere
(in the Diagnostics_area), thus NET members are no longer used by the
server.
Rename last_error to client_last_error, last_errno to client_last_errno
to avoid potential bugs introduced by merges.
include/mysql_h.ic:
Update the ABI file to reflect a rename.
Renames do not break the binary compatibility.
libmysql/libmysql.c:
Rename last_error to client_last_error, last_errno to client_last_errno.
This is necessary to ensure no unnoticed bugs introduced by merged
changesets.
Remove net.report_error, net.no_send_ok, net.no_send_error.
libmysql/manager.c:
Rename net.last_errno to net.client_last_errno.
libmysqld/lib_sql.cc:
Rename net.last_errno to net.client_last_errno.
Update the embedded implementation of the client-server protocol to
reflect the refactoring of protocol.cc.
libmysqld/libmysqld.c:
Rename net.last_errno to net.client_last_errno.
mysql-test/r/events.result:
Update to reflect the change in mysql_rm_db(). Now we drop stored
routines and events for a given database name only if there
is a directory for this database name. ha_drop_database() and
query_cache_invalidate() are called likewise.
Previously we would attempt to drop routines/events even if database
directory was not found (it worked, since routines and events are stored
in tables). This fixes Bug 29958 "Weird message on DROP DATABASE if mysql.proc
does not exist".
The change was done because the previous code used to call send_ok()
twice, which led to an assertion failure when asserts against it were
added by this patch.
mysql-test/r/grant.result:
Fix the patch for Bug 16470, now FLUSH PRIVILEGES produces an error
if mysql.procs_priv is missing.
This fixes the assert that send_ok() must not called after send_error()
(the original patch for Bug 16470 was prone to this).
mysql-test/suite/rpl/r/rpl_row_tabledefs_2myisam.result:
Produce a more detailed error message.
mysql-test/suite/rpl/r/rpl_row_tabledefs_3innodb.result:
Produce a more detailed error message.
mysql-test/t/grant.test:
Update the test, now FLUSH PRIVILEGES returns an error if mysql.procs_priv
is missing.
server-tools/instance-manager/mysql_connection.cc:
Rename net.last_errno to net.client_last_errno.
sql/ha_ndbcluster_binlog.cc:
Add asserts.
Use getters to access statement status information.
Add a comment why run_query() is broken. Reset the diagnostics area
in the end of run_query() to fulfill the invariant that the diagnostics_area
is never assigned twice per statement (see the comment in the code
when this can happen). We still do not clear thd->is_fatal_error and
thd->is_slave_error, which may lead to bugs, I consider the whole affair
as something to be dealt with separately.
sql/ha_partition.cc:
fatal_error() doesn't set an error by itself. Perhaps we should
remove this method altogether and instead add a flag to my_error
to set thd->is_fatal_error property.
Meanwhile, this change is a part of inspection made to the entire source
code with the goal to ensure that fatal_error()
is always accompanied by my_error().
sql/item_func.cc:
There is no net.last_error anymore. Remove the obsolete assignment.
sql/log_event.cc:
Use getters to access statement error status information.
sql/log_event_old.cc:
Use getters to access statement error status information.
sql/mysqld.cc:
Previously, if a continue handler for an error was found, my_message_sql()
would not set an error in THD. Since the current statement
must be aborted in any case, find_handler() had a hack to assign
thd->net.report_error to 1.
Remove this hack. Set an error in my_message_sql() even if the continue
handler is found. The error will be cleared anyway when the handler
is executed. This is one action among many in this patch to ensure the
invariant that whenever thd->is_error() is TRUE, we have a message in
thd->main_da.message().
sql/net_serv.cc:
Use a full-blown my_error() in net_serv.cc to report an error,
instead of just setting net->last_errno. This ensures the invariant that
whenever thd->is_error() returns TRUE, we have a message in
thd->main_da.message().
Remove initialization of removed NET members.
sql/opt_range.cc:
Use my_error() instead of just raising thd->net.report_error.
This ensures the invariant that whenever thd->is_error() returns TRUE,
there is a message in thd->main_da.message().
sql/opt_sum.cc:
Move invocation of fatal_error() right next to the place where
we set the error message. That makes it easier to track that whenever
fatal_error() is called, there is a message in THD.
sql/protocol.cc:
Rename send_ok() and send_eof() to net_send_ok() and net_send_eof()
respectively. These functions write directly to the network and are not
for use anywhere outside the client/server protocol code.
Remove the code that was responsible for cases when either there is
no error code, or no error message, or both.
Instead the calling code ensures that they are always present. Asserts
are added to enforce the invariant.
Instead of a direct access to thd->server_status and thd->total_warn_count
use function parameters, since these from now on don't always come directly
from THD.
Introduce net_end_statement(), the single-entry-point replacement API for
send_ok(), send_eof() and net_send_error().
Implement Protocol::end_partial_result_set to use in select_send::abort()
when there is a continue handler.
sql/protocol.h:
Update declarations.
sql/repl_failsafe.cc:
Use getters to access statement status information in THD.
Rename net.last_error to net.client_last_error.
sql/rpl_record.cc:
Set an error message in prepare_record() if there is no default
value for the field -- later we do print this message to the client.
sql/rpl_rli.cc:
Use getters to access statement status information in THD.
sql/slave.cc:
In create_table_from_dump() (a common function that is used in
LOAD MASTER TABLE SQL statement and COM_LOAD_MASTER_DATA), instead of hacks
with no_send_ok, clear the diagnostics area when mysql_rm_table() succeeded.
Update has_temporary_error() to work correctly when no error is set.
This is the case when Incident_log_event is executed: it always returns
an error but does not set an error message.
Use getters to access error status information.
sql/sp_head.cc:
Instead of hacks with no_send_error, work through the diagnostics area
interface to suppress sending of OK/ERROR packets to the client.
Move query_cache_end_of_result before log_slow_statement(), similarly
to how it's done in dispatch_command().
sql/sp_rcontext.cc:
Remove hacks with assignment of thd->net.report_error, they are not
necessary any more (see the changes in mysqld.cc).
sql/sql_acl.cc:
Use getters to access error status information in THD.
sql/sql_base.cc:
Access thd->main_da.sql_errno() only if there is an error. This fixes
a bug when auto-discovery, that was effectively disabled under pre-locking.
sql/sql_binlog.cc:
Remove hacks with no_send_ok/no_send_error, they are not necessary
anymore: the caller is responsible for network communication.
sql/sql_cache.cc:
Disable sending of OK/ERROR/EOF packet in the end of dispatch_command
if the response has been served from the query cache. This raises the
question whether we should store EOF packet in the query cache at all,
or generate it anew for each statement (we should generate it anew), but
this is to be addressed separately.
sql/sql_class.cc:
Implement class Diagnostics_area. Please see comments in sql_class.h
for details.
Fix a subtle coding mistake in select_send::send_data: when on slave,
an error in Item::send() was ignored.
The problem became visible due to asserts that the diagnostics area is
never double assigned.
Remove initialization of removed NET members.
In select_send::abort() do not call select_send::send_eof(). This is
not inheritance-safe. Even if a stored procedure continue handler is
found, the current statement is aborted, not succeeded.
Instead introduce a Protocol API to send the required response,
Protocol::end_partial_result_set().
This simplifies implementation of select_send::send_eof(). No need
to add more asserts that there is no error, there is an assert inside
Diagnostics_area::set_ok_status() already.
Leave no trace of no_send_* in the code.
sql/sql_class.h:
Declare class Diagnostics_area.
Remove the hack with no_send_ok from
Substatement_state.
Provide inline implementations of send_ok/send_eof.
Add commetns.
sql/sql_connect.cc:
Remove hacks with no_send_error.
Since now an error in THD is always set if net->error, it's not necessary
to check both net->error and thd->is_error() in the do_command loop.
Use thd->main_da.message() instead of net->last_errno.
Remove the hack with is_slave_error in sys_init_connect. Since now we do not
reset the diagnostics area in net_send_error (it's reset at the beginning
of the next statement), we can access it safely even after
execute_init_command.
sql/sql_db.cc:
Update the code to satisfy the invariant that the diagnostics area is never
assigned twice.
Incidentally, this fixes Bug 29958 "Weird message on DROP DATABASE if
mysql.proc does not exist".
sql/sql_delete.cc:
Change multi-delete to abort in abort(), as per select_send protocol.
Fixes the merge error with the test for Bug 29136
sql/sql_derived.cc:
Use getters to access error information.
sql/sql_insert.cc:
Use getters to access error information.
sql-common/client.c:
Rename last_error to client_last_error, last_errno to client_last_errno.
sql/sql_parse.cc:
Remove hacks with no_send_error. Deploy net_end_statement().
The story of COM_SHUTDOWN is interesting. Long story short, the server
would become on its death's door, and only no_send_ok/no_send_error assigned
by send_ok()/net_send_error() would hide its babbling from the client.
First of all, COM_QUIT does not require a response. So, the comment saying
"Let's send a response to possible COM_QUIT" is not only groundless
(even mysqladmin shutdown/mysql_shutdown() doesn't send COM_QUIT after
COM_SHUTDOWN), it's plainly incorrect.
Secondly, besides this additional 'OK' packet to respond to a hypothetical
COM_QUIT, there was the following code in dispatch_command():
if (thd->killed)
thd->send_kill_message();
if (thd->is_error()
net_send_error(thd);
This worked out really funny for the thread through which COM_SHUTDOWN
was delivered: we would get COM_SHUTDOWN, say okay, say okay again,
kill everybody, get the kill signal ourselves, and then attempt to say
"Server shutdown in progress" to the client that is very likely long gone.
This all became visible when asserts were added that the Diagnostics_area
is not assigned twice.
Move query_cache_end_of_result() to the end of dispatch_command(), since
net_send_eof() has been moved there. This is safe, query_cache_end_of_result()
is a no-op if there is no started query in the cache.
Consistently use select_send interface to call abort() or send_eof()
depending on the operation result.
Remove thd->fatal_error() from reset_master(), it was a no-op.
in hacks with no_send_error woudl save us
from complete breakage of the client/server protocol.
Consistently use select_send::abort() whenever there is an error,
and select_send::send_eof() in case of success.
The issue became visible due to added asserts.
sql/sql_partition.cc:
Always set an error in THD whenever there is a call to fatal_error().
sql/sql_prepare.cc:
Deploy class Diagnostics_area.
Remove the unnecessary juggling with the protocol in
Select_fetch_protocol_binary::send_eof(). EOF packet format is
protocol-independent.
sql/sql_select.cc:
Call fatal_error() directly in opt_sum_query.
Call my_error() whenever we call thd->fatal_error().
sql/sql_servers.cc:
Use getters to access error information in THD.
sql/sql_show.cc:
Use getters to access error information in THD.
Add comments.
Call my_error() whenever we call fatal_error().
sql/sql_table.cc:
Replace hacks with no_send_ok with the interface of the diagnostics area.
Clear the error if ENOENT error in ha_delete_table().
sql/sql_update.cc:
Introduce multi_update::abort(), which is the proper way to abort a
multi-update. This fixes the merge conflict between this patch and
the patch for Bug 29136.
sql/table.cc:
Use a getter to access error information in THD.
sql/tztime.cc:
Use a getter to access error information in THD.
2007-12-12 16:21:01 +01:00
|
|
|
msg= current_thd->main_da.message();
|
2006-10-31 12:23:14 +01:00
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
if (init_io_cache(&rli->info_file, info_fd, IO_SIZE*2, READ_CACHE, 0L,0,
|
|
|
|
MYF(MY_WME)))
|
|
|
|
{
|
|
|
|
sql_print_error("Failed to create a cache on relay log info file '%s'",
|
|
|
|
fname);
|
Bug#12713 "Error in a stored function called from a SELECT doesn't
cause ROLLBACK of statement", part 1. Review fixes.
Do not send OK/EOF packets to the client until we reached the end of
the current statement.
This is a consolidation, to keep the functionality that is shared by all
SQL statements in one place in the server.
Currently this functionality includes:
- close_thread_tables()
- log_slow_statement().
After this patch and the subsequent patch for Bug#12713, it shall also include:
- ha_autocommit_or_rollback()
- net_end_statement()
- query_cache_end_of_result().
In future it may also include:
- mysql_reset_thd_for_next_command().
include/mysql_com.h:
Rename now unused members of NET: no_send_ok, no_send_error, report_error.
These were server-specific variables related to the client/server
protocol. They have been made obsolete by this patch.
Previously the same members of NET were used to store the error message
both on the client and on the server.
The error message was stored in net.last_error (client: mysql->net.last_error,
server: thd->net.last_error).
The error code was stored in net.last_errno (client: mysql->net.last_errno,
server: thd->net.last_errno).
The server error code and message are now stored elsewhere
(in the Diagnostics_area), thus NET members are no longer used by the
server.
Rename last_error to client_last_error, last_errno to client_last_errno
to avoid potential bugs introduced by merges.
include/mysql_h.ic:
Update the ABI file to reflect a rename.
Renames do not break the binary compatibility.
libmysql/libmysql.c:
Rename last_error to client_last_error, last_errno to client_last_errno.
This is necessary to ensure no unnoticed bugs introduced by merged
changesets.
Remove net.report_error, net.no_send_ok, net.no_send_error.
libmysql/manager.c:
Rename net.last_errno to net.client_last_errno.
libmysqld/lib_sql.cc:
Rename net.last_errno to net.client_last_errno.
Update the embedded implementation of the client-server protocol to
reflect the refactoring of protocol.cc.
libmysqld/libmysqld.c:
Rename net.last_errno to net.client_last_errno.
mysql-test/r/events.result:
Update to reflect the change in mysql_rm_db(). Now we drop stored
routines and events for a given database name only if there
is a directory for this database name. ha_drop_database() and
query_cache_invalidate() are called likewise.
Previously we would attempt to drop routines/events even if database
directory was not found (it worked, since routines and events are stored
in tables). This fixes Bug 29958 "Weird message on DROP DATABASE if mysql.proc
does not exist".
The change was done because the previous code used to call send_ok()
twice, which led to an assertion failure when asserts against it were
added by this patch.
mysql-test/r/grant.result:
Fix the patch for Bug 16470, now FLUSH PRIVILEGES produces an error
if mysql.procs_priv is missing.
This fixes the assert that send_ok() must not called after send_error()
(the original patch for Bug 16470 was prone to this).
mysql-test/suite/rpl/r/rpl_row_tabledefs_2myisam.result:
Produce a more detailed error message.
mysql-test/suite/rpl/r/rpl_row_tabledefs_3innodb.result:
Produce a more detailed error message.
mysql-test/t/grant.test:
Update the test, now FLUSH PRIVILEGES returns an error if mysql.procs_priv
is missing.
server-tools/instance-manager/mysql_connection.cc:
Rename net.last_errno to net.client_last_errno.
sql/ha_ndbcluster_binlog.cc:
Add asserts.
Use getters to access statement status information.
Add a comment why run_query() is broken. Reset the diagnostics area
in the end of run_query() to fulfill the invariant that the diagnostics_area
is never assigned twice per statement (see the comment in the code
when this can happen). We still do not clear thd->is_fatal_error and
thd->is_slave_error, which may lead to bugs, I consider the whole affair
as something to be dealt with separately.
sql/ha_partition.cc:
fatal_error() doesn't set an error by itself. Perhaps we should
remove this method altogether and instead add a flag to my_error
to set thd->is_fatal_error property.
Meanwhile, this change is a part of inspection made to the entire source
code with the goal to ensure that fatal_error()
is always accompanied by my_error().
sql/item_func.cc:
There is no net.last_error anymore. Remove the obsolete assignment.
sql/log_event.cc:
Use getters to access statement error status information.
sql/log_event_old.cc:
Use getters to access statement error status information.
sql/mysqld.cc:
Previously, if a continue handler for an error was found, my_message_sql()
would not set an error in THD. Since the current statement
must be aborted in any case, find_handler() had a hack to assign
thd->net.report_error to 1.
Remove this hack. Set an error in my_message_sql() even if the continue
handler is found. The error will be cleared anyway when the handler
is executed. This is one action among many in this patch to ensure the
invariant that whenever thd->is_error() is TRUE, we have a message in
thd->main_da.message().
sql/net_serv.cc:
Use a full-blown my_error() in net_serv.cc to report an error,
instead of just setting net->last_errno. This ensures the invariant that
whenever thd->is_error() returns TRUE, we have a message in
thd->main_da.message().
Remove initialization of removed NET members.
sql/opt_range.cc:
Use my_error() instead of just raising thd->net.report_error.
This ensures the invariant that whenever thd->is_error() returns TRUE,
there is a message in thd->main_da.message().
sql/opt_sum.cc:
Move invocation of fatal_error() right next to the place where
we set the error message. That makes it easier to track that whenever
fatal_error() is called, there is a message in THD.
sql/protocol.cc:
Rename send_ok() and send_eof() to net_send_ok() and net_send_eof()
respectively. These functions write directly to the network and are not
for use anywhere outside the client/server protocol code.
Remove the code that was responsible for cases when either there is
no error code, or no error message, or both.
Instead the calling code ensures that they are always present. Asserts
are added to enforce the invariant.
Instead of a direct access to thd->server_status and thd->total_warn_count
use function parameters, since these from now on don't always come directly
from THD.
Introduce net_end_statement(), the single-entry-point replacement API for
send_ok(), send_eof() and net_send_error().
Implement Protocol::end_partial_result_set to use in select_send::abort()
when there is a continue handler.
sql/protocol.h:
Update declarations.
sql/repl_failsafe.cc:
Use getters to access statement status information in THD.
Rename net.last_error to net.client_last_error.
sql/rpl_record.cc:
Set an error message in prepare_record() if there is no default
value for the field -- later we do print this message to the client.
sql/rpl_rli.cc:
Use getters to access statement status information in THD.
sql/slave.cc:
In create_table_from_dump() (a common function that is used in
LOAD MASTER TABLE SQL statement and COM_LOAD_MASTER_DATA), instead of hacks
with no_send_ok, clear the diagnostics area when mysql_rm_table() succeeded.
Update has_temporary_error() to work correctly when no error is set.
This is the case when Incident_log_event is executed: it always returns
an error but does not set an error message.
Use getters to access error status information.
sql/sp_head.cc:
Instead of hacks with no_send_error, work through the diagnostics area
interface to suppress sending of OK/ERROR packets to the client.
Move query_cache_end_of_result before log_slow_statement(), similarly
to how it's done in dispatch_command().
sql/sp_rcontext.cc:
Remove hacks with assignment of thd->net.report_error, they are not
necessary any more (see the changes in mysqld.cc).
sql/sql_acl.cc:
Use getters to access error status information in THD.
sql/sql_base.cc:
Access thd->main_da.sql_errno() only if there is an error. This fixes
a bug when auto-discovery, that was effectively disabled under pre-locking.
sql/sql_binlog.cc:
Remove hacks with no_send_ok/no_send_error, they are not necessary
anymore: the caller is responsible for network communication.
sql/sql_cache.cc:
Disable sending of OK/ERROR/EOF packet in the end of dispatch_command
if the response has been served from the query cache. This raises the
question whether we should store EOF packet in the query cache at all,
or generate it anew for each statement (we should generate it anew), but
this is to be addressed separately.
sql/sql_class.cc:
Implement class Diagnostics_area. Please see comments in sql_class.h
for details.
Fix a subtle coding mistake in select_send::send_data: when on slave,
an error in Item::send() was ignored.
The problem became visible due to asserts that the diagnostics area is
never double assigned.
Remove initialization of removed NET members.
In select_send::abort() do not call select_send::send_eof(). This is
not inheritance-safe. Even if a stored procedure continue handler is
found, the current statement is aborted, not succeeded.
Instead introduce a Protocol API to send the required response,
Protocol::end_partial_result_set().
This simplifies implementation of select_send::send_eof(). No need
to add more asserts that there is no error, there is an assert inside
Diagnostics_area::set_ok_status() already.
Leave no trace of no_send_* in the code.
sql/sql_class.h:
Declare class Diagnostics_area.
Remove the hack with no_send_ok from
Substatement_state.
Provide inline implementations of send_ok/send_eof.
Add commetns.
sql/sql_connect.cc:
Remove hacks with no_send_error.
Since now an error in THD is always set if net->error, it's not necessary
to check both net->error and thd->is_error() in the do_command loop.
Use thd->main_da.message() instead of net->last_errno.
Remove the hack with is_slave_error in sys_init_connect. Since now we do not
reset the diagnostics area in net_send_error (it's reset at the beginning
of the next statement), we can access it safely even after
execute_init_command.
sql/sql_db.cc:
Update the code to satisfy the invariant that the diagnostics area is never
assigned twice.
Incidentally, this fixes Bug 29958 "Weird message on DROP DATABASE if
mysql.proc does not exist".
sql/sql_delete.cc:
Change multi-delete to abort in abort(), as per select_send protocol.
Fixes the merge error with the test for Bug 29136
sql/sql_derived.cc:
Use getters to access error information.
sql/sql_insert.cc:
Use getters to access error information.
sql-common/client.c:
Rename last_error to client_last_error, last_errno to client_last_errno.
sql/sql_parse.cc:
Remove hacks with no_send_error. Deploy net_end_statement().
The story of COM_SHUTDOWN is interesting. Long story short, the server
would become on its death's door, and only no_send_ok/no_send_error assigned
by send_ok()/net_send_error() would hide its babbling from the client.
First of all, COM_QUIT does not require a response. So, the comment saying
"Let's send a response to possible COM_QUIT" is not only groundless
(even mysqladmin shutdown/mysql_shutdown() doesn't send COM_QUIT after
COM_SHUTDOWN), it's plainly incorrect.
Secondly, besides this additional 'OK' packet to respond to a hypothetical
COM_QUIT, there was the following code in dispatch_command():
if (thd->killed)
thd->send_kill_message();
if (thd->is_error()
net_send_error(thd);
This worked out really funny for the thread through which COM_SHUTDOWN
was delivered: we would get COM_SHUTDOWN, say okay, say okay again,
kill everybody, get the kill signal ourselves, and then attempt to say
"Server shutdown in progress" to the client that is very likely long gone.
This all became visible when asserts were added that the Diagnostics_area
is not assigned twice.
Move query_cache_end_of_result() to the end of dispatch_command(), since
net_send_eof() has been moved there. This is safe, query_cache_end_of_result()
is a no-op if there is no started query in the cache.
Consistently use select_send interface to call abort() or send_eof()
depending on the operation result.
Remove thd->fatal_error() from reset_master(), it was a no-op.
in hacks with no_send_error woudl save us
from complete breakage of the client/server protocol.
Consistently use select_send::abort() whenever there is an error,
and select_send::send_eof() in case of success.
The issue became visible due to added asserts.
sql/sql_partition.cc:
Always set an error in THD whenever there is a call to fatal_error().
sql/sql_prepare.cc:
Deploy class Diagnostics_area.
Remove the unnecessary juggling with the protocol in
Select_fetch_protocol_binary::send_eof(). EOF packet format is
protocol-independent.
sql/sql_select.cc:
Call fatal_error() directly in opt_sum_query.
Call my_error() whenever we call thd->fatal_error().
sql/sql_servers.cc:
Use getters to access error information in THD.
sql/sql_show.cc:
Use getters to access error information in THD.
Add comments.
Call my_error() whenever we call fatal_error().
sql/sql_table.cc:
Replace hacks with no_send_ok with the interface of the diagnostics area.
Clear the error if ENOENT error in ha_delete_table().
sql/sql_update.cc:
Introduce multi_update::abort(), which is the proper way to abort a
multi-update. This fixes the merge conflict between this patch and
the patch for Bug 29136.
sql/table.cc:
Use a getter to access error information in THD.
sql/tztime.cc:
Use a getter to access error information in THD.
2007-12-12 16:21:01 +01:00
|
|
|
msg= current_thd->main_da.message();
|
2006-10-31 12:23:14 +01:00
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Init relay log with first entry in the relay index file */
|
|
|
|
if (init_relay_log_pos(rli,NullS,BIN_LOG_HEADER_SIZE,0 /* no data lock */,
|
|
|
|
&msg, 0))
|
|
|
|
{
|
|
|
|
sql_print_error("Failed to open the relay log 'FIRST' (relay_log_pos 4)");
|
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
rli->group_master_log_name[0]= 0;
|
|
|
|
rli->group_master_log_pos= 0;
|
|
|
|
rli->info_fd= info_fd;
|
|
|
|
}
|
|
|
|
else // file exists
|
|
|
|
{
|
|
|
|
if (info_fd >= 0)
|
|
|
|
reinit_io_cache(&rli->info_file, READ_CACHE, 0L,0,0);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
int error=0;
|
|
|
|
if ((info_fd = my_open(fname, O_RDWR|O_BINARY, MYF(MY_WME))) < 0)
|
|
|
|
{
|
|
|
|
sql_print_error("\
|
|
|
|
Failed to open the existing relay log info file '%s' (errno %d)",
|
|
|
|
fname, my_errno);
|
|
|
|
error= 1;
|
|
|
|
}
|
|
|
|
else if (init_io_cache(&rli->info_file, info_fd,
|
|
|
|
IO_SIZE*2, READ_CACHE, 0L, 0, MYF(MY_WME)))
|
|
|
|
{
|
|
|
|
sql_print_error("Failed to create a cache on relay log info file '%s'",
|
|
|
|
fname);
|
|
|
|
error= 1;
|
|
|
|
}
|
|
|
|
if (error)
|
|
|
|
{
|
|
|
|
if (info_fd >= 0)
|
|
|
|
my_close(info_fd, MYF(0));
|
|
|
|
rli->info_fd= -1;
|
|
|
|
rli->relay_log.close(LOG_CLOSE_INDEX | LOG_CLOSE_STOP_EVENT);
|
|
|
|
pthread_mutex_unlock(&rli->data_lock);
|
|
|
|
DBUG_RETURN(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
rli->info_fd = info_fd;
|
|
|
|
int relay_log_pos, master_log_pos;
|
|
|
|
if (init_strvar_from_file(rli->group_relay_log_name,
|
|
|
|
sizeof(rli->group_relay_log_name),
|
|
|
|
&rli->info_file, "") ||
|
|
|
|
init_intvar_from_file(&relay_log_pos,
|
|
|
|
&rli->info_file, BIN_LOG_HEADER_SIZE) ||
|
|
|
|
init_strvar_from_file(rli->group_master_log_name,
|
|
|
|
sizeof(rli->group_master_log_name),
|
|
|
|
&rli->info_file, "") ||
|
|
|
|
init_intvar_from_file(&master_log_pos, &rli->info_file, 0))
|
|
|
|
{
|
|
|
|
msg="Error reading slave log configuration";
|
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
strmake(rli->event_relay_log_name,rli->group_relay_log_name,
|
|
|
|
sizeof(rli->event_relay_log_name)-1);
|
|
|
|
rli->group_relay_log_pos= rli->event_relay_log_pos= relay_log_pos;
|
|
|
|
rli->group_master_log_pos= master_log_pos;
|
|
|
|
|
|
|
|
if (init_relay_log_pos(rli,
|
|
|
|
rli->group_relay_log_name,
|
|
|
|
rli->group_relay_log_pos,
|
|
|
|
0 /* no data lock*/,
|
|
|
|
&msg, 0))
|
|
|
|
{
|
|
|
|
char llbuf[22];
|
|
|
|
sql_print_error("Failed to open the relay log '%s' (relay_log_pos %s)",
|
|
|
|
rli->group_relay_log_name,
|
|
|
|
llstr(rli->group_relay_log_pos, llbuf));
|
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifndef DBUG_OFF
|
|
|
|
{
|
|
|
|
char llbuf1[22], llbuf2[22];
|
|
|
|
DBUG_PRINT("info", ("my_b_tell(rli->cur_log)=%s rli->event_relay_log_pos=%s",
|
|
|
|
llstr(my_b_tell(rli->cur_log),llbuf1),
|
|
|
|
llstr(rli->event_relay_log_pos,llbuf2)));
|
|
|
|
DBUG_ASSERT(rli->event_relay_log_pos >= BIN_LOG_HEADER_SIZE);
|
|
|
|
DBUG_ASSERT(my_b_tell(rli->cur_log) == rli->event_relay_log_pos);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
|
|
Now change the cache from READ to WRITE - must do this
|
|
|
|
before flush_relay_log_info
|
|
|
|
*/
|
|
|
|
reinit_io_cache(&rli->info_file, WRITE_CACHE,0L,0,1);
|
|
|
|
if ((error= flush_relay_log_info(rli)))
|
|
|
|
sql_print_error("Failed to flush relay log info file");
|
|
|
|
if (count_relay_log_space(rli))
|
|
|
|
{
|
|
|
|
msg="Error counting relay log space";
|
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
rli->inited= 1;
|
|
|
|
pthread_mutex_unlock(&rli->data_lock);
|
|
|
|
DBUG_RETURN(error);
|
|
|
|
|
|
|
|
err:
|
2009-10-26 12:35:42 +01:00
|
|
|
sql_print_error("%s", msg);
|
2006-10-31 12:23:14 +01:00
|
|
|
end_io_cache(&rli->info_file);
|
|
|
|
if (info_fd >= 0)
|
|
|
|
my_close(info_fd, MYF(0));
|
|
|
|
rli->info_fd= -1;
|
|
|
|
rli->relay_log.close(LOG_CLOSE_INDEX | LOG_CLOSE_STOP_EVENT);
|
|
|
|
pthread_mutex_unlock(&rli->data_lock);
|
|
|
|
DBUG_RETURN(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-08-16 07:37:50 +02:00
|
|
|
static inline int add_relay_log(Relay_log_info* rli,LOG_INFO* linfo)
|
2006-10-31 12:23:14 +01:00
|
|
|
{
|
|
|
|
MY_STAT s;
|
|
|
|
DBUG_ENTER("add_relay_log");
|
|
|
|
if (!my_stat(linfo->log_file_name,&s,MYF(0)))
|
|
|
|
{
|
|
|
|
sql_print_error("log %s listed in the index, but failed to stat",
|
|
|
|
linfo->log_file_name);
|
|
|
|
DBUG_RETURN(1);
|
|
|
|
}
|
|
|
|
rli->log_space_total += s.st_size;
|
|
|
|
#ifndef DBUG_OFF
|
|
|
|
char buf[22];
|
|
|
|
DBUG_PRINT("info",("log_space_total: %s", llstr(rli->log_space_total,buf)));
|
|
|
|
#endif
|
|
|
|
DBUG_RETURN(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-08-16 07:37:50 +02:00
|
|
|
static int count_relay_log_space(Relay_log_info* rli)
|
2006-10-31 12:23:14 +01:00
|
|
|
{
|
|
|
|
LOG_INFO linfo;
|
|
|
|
DBUG_ENTER("count_relay_log_space");
|
|
|
|
rli->log_space_total= 0;
|
|
|
|
if (rli->relay_log.find_log_pos(&linfo, NullS, 1))
|
|
|
|
{
|
|
|
|
sql_print_error("Could not find first log while counting relay log space");
|
|
|
|
DBUG_RETURN(1);
|
|
|
|
}
|
|
|
|
do
|
|
|
|
{
|
|
|
|
if (add_relay_log(rli,&linfo))
|
|
|
|
DBUG_RETURN(1);
|
|
|
|
} while (!rli->relay_log.find_next_log(&linfo, 1));
|
|
|
|
/*
|
|
|
|
As we have counted everything, including what may have written in a
|
|
|
|
preceding write, we must reset bytes_written, or we may count some space
|
|
|
|
twice.
|
|
|
|
*/
|
|
|
|
rli->relay_log.reset_bytes_written();
|
|
|
|
DBUG_RETURN(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
2007-08-16 07:37:50 +02:00
|
|
|
Reset UNTIL condition for Relay_log_info
|
2006-10-31 12:23:14 +01:00
|
|
|
|
|
|
|
SYNOPSYS
|
|
|
|
clear_until_condition()
|
2007-08-16 07:37:50 +02:00
|
|
|
rli - Relay_log_info structure where UNTIL condition should be reset
|
2006-10-31 12:23:14 +01:00
|
|
|
*/
|
|
|
|
|
2007-08-16 07:37:50 +02:00
|
|
|
void Relay_log_info::clear_until_condition()
|
2006-10-31 12:23:14 +01:00
|
|
|
{
|
|
|
|
DBUG_ENTER("clear_until_condition");
|
|
|
|
|
2007-08-16 07:37:50 +02:00
|
|
|
until_condition= Relay_log_info::UNTIL_NONE;
|
2006-10-31 12:23:14 +01:00
|
|
|
until_log_name[0]= 0;
|
|
|
|
until_log_pos= 0;
|
|
|
|
DBUG_VOID_RETURN;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
Open the given relay log
|
|
|
|
|
|
|
|
SYNOPSIS
|
|
|
|
init_relay_log_pos()
|
|
|
|
rli Relay information (will be initialized)
|
|
|
|
log Name of relay log file to read from. NULL = First log
|
|
|
|
pos Position in relay log file
|
|
|
|
need_data_lock Set to 1 if this functions should do mutex locks
|
|
|
|
errmsg Store pointer to error message here
|
|
|
|
look_for_description_event
|
|
|
|
1 if we should look for such an event. We only need
|
|
|
|
this when the SQL thread starts and opens an existing
|
|
|
|
relay log and has to execute it (possibly from an
|
|
|
|
offset >4); then we need to read the first event of
|
|
|
|
the relay log to be able to parse the events we have
|
|
|
|
to execute.
|
|
|
|
|
|
|
|
DESCRIPTION
|
|
|
|
- Close old open relay log files.
|
|
|
|
- If we are using the same relay log as the running IO-thread, then set
|
|
|
|
rli->cur_log to point to the same IO_CACHE entry.
|
|
|
|
- If not, open the 'log' binary file.
|
|
|
|
|
|
|
|
TODO
|
|
|
|
- check proper initialization of group_master_log_name/group_master_log_pos
|
|
|
|
|
|
|
|
RETURN VALUES
|
|
|
|
0 ok
|
|
|
|
1 error. errmsg is set to point to the error message
|
|
|
|
*/
|
|
|
|
|
2007-08-16 07:37:50 +02:00
|
|
|
int init_relay_log_pos(Relay_log_info* rli,const char* log,
|
2006-10-31 12:23:14 +01:00
|
|
|
ulonglong pos, bool need_data_lock,
|
|
|
|
const char** errmsg,
|
|
|
|
bool look_for_description_event)
|
|
|
|
{
|
|
|
|
DBUG_ENTER("init_relay_log_pos");
|
2006-11-27 00:47:38 +01:00
|
|
|
DBUG_PRINT("info", ("pos: %lu", (ulong) pos));
|
2006-10-31 12:23:14 +01:00
|
|
|
|
|
|
|
*errmsg=0;
|
|
|
|
pthread_mutex_t *log_lock=rli->relay_log.get_log_lock();
|
|
|
|
|
|
|
|
if (need_data_lock)
|
|
|
|
pthread_mutex_lock(&rli->data_lock);
|
|
|
|
|
|
|
|
/*
|
|
|
|
Slave threads are not the only users of init_relay_log_pos(). CHANGE MASTER
|
|
|
|
is, too, and init_slave() too; these 2 functions allocate a description
|
|
|
|
event in init_relay_log_pos, which is not freed by the terminating SQL slave
|
|
|
|
thread as that thread is not started by these functions. So we have to free
|
|
|
|
the description_event here, in case, so that there is no memory leak in
|
|
|
|
running, say, CHANGE MASTER.
|
|
|
|
*/
|
|
|
|
delete rli->relay_log.description_event_for_exec;
|
|
|
|
/*
|
|
|
|
By default the relay log is in binlog format 3 (4.0).
|
|
|
|
Even if format is 4, this will work enough to read the first event
|
|
|
|
(Format_desc) (remember that format 4 is just lenghtened compared to format
|
|
|
|
3; format 3 is a prefix of format 4).
|
|
|
|
*/
|
|
|
|
rli->relay_log.description_event_for_exec= new
|
|
|
|
Format_description_log_event(3);
|
|
|
|
|
|
|
|
pthread_mutex_lock(log_lock);
|
|
|
|
|
|
|
|
/* Close log file and free buffers if it's already open */
|
|
|
|
if (rli->cur_log_fd >= 0)
|
|
|
|
{
|
|
|
|
end_io_cache(&rli->cache_buf);
|
|
|
|
my_close(rli->cur_log_fd, MYF(MY_WME));
|
|
|
|
rli->cur_log_fd = -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
rli->group_relay_log_pos = rli->event_relay_log_pos = pos;
|
|
|
|
|
|
|
|
/*
|
|
|
|
Test to see if the previous run was with the skip of purging
|
|
|
|
If yes, we do not purge when we restart
|
|
|
|
*/
|
|
|
|
if (rli->relay_log.find_log_pos(&rli->linfo, NullS, 1))
|
|
|
|
{
|
|
|
|
*errmsg="Could not find first log during relay log initialization";
|
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (log && rli->relay_log.find_log_pos(&rli->linfo, log, 1))
|
|
|
|
{
|
|
|
|
*errmsg="Could not find target log during relay log initialization";
|
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
strmake(rli->group_relay_log_name,rli->linfo.log_file_name,
|
|
|
|
sizeof(rli->group_relay_log_name)-1);
|
|
|
|
strmake(rli->event_relay_log_name,rli->linfo.log_file_name,
|
|
|
|
sizeof(rli->event_relay_log_name)-1);
|
|
|
|
if (rli->relay_log.is_active(rli->linfo.log_file_name))
|
|
|
|
{
|
|
|
|
/*
|
|
|
|
The IO thread is using this log file.
|
|
|
|
In this case, we will use the same IO_CACHE pointer to
|
|
|
|
read data as the IO thread is using to write data.
|
|
|
|
*/
|
|
|
|
my_b_seek((rli->cur_log=rli->relay_log.get_log_file()), (off_t)0);
|
|
|
|
if (check_binlog_magic(rli->cur_log,errmsg))
|
|
|
|
goto err;
|
|
|
|
rli->cur_log_old_open_count=rli->relay_log.get_open_count();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/*
|
|
|
|
Open the relay log and set rli->cur_log to point at this one
|
|
|
|
*/
|
|
|
|
if ((rli->cur_log_fd=open_binlog(&rli->cache_buf,
|
|
|
|
rli->linfo.log_file_name,errmsg)) < 0)
|
|
|
|
goto err;
|
|
|
|
rli->cur_log = &rli->cache_buf;
|
|
|
|
}
|
|
|
|
/*
|
|
|
|
In all cases, check_binlog_magic() has been called so we're at offset 4 for
|
|
|
|
sure.
|
|
|
|
*/
|
|
|
|
if (pos > BIN_LOG_HEADER_SIZE) /* If pos<=4, we stay at 4 */
|
|
|
|
{
|
|
|
|
Log_event* ev;
|
|
|
|
while (look_for_description_event)
|
|
|
|
{
|
|
|
|
/*
|
|
|
|
Read the possible Format_description_log_event; if position
|
|
|
|
was 4, no need, it will be read naturally.
|
|
|
|
*/
|
|
|
|
DBUG_PRINT("info",("looking for a Format_description_log_event"));
|
|
|
|
|
|
|
|
if (my_b_tell(rli->cur_log) >= pos)
|
|
|
|
break;
|
|
|
|
|
|
|
|
/*
|
|
|
|
Because of we have rli->data_lock and log_lock, we can safely read an
|
|
|
|
event
|
|
|
|
*/
|
2011-05-03 14:01:11 +02:00
|
|
|
if (!(ev= Log_event::read_log_event(rli->cur_log, 0,
|
|
|
|
rli->relay_log.description_event_for_exec,
|
|
|
|
opt_slave_sql_verify_checksum)))
|
2006-10-31 12:23:14 +01:00
|
|
|
{
|
|
|
|
DBUG_PRINT("info",("could not read event, rli->cur_log->error=%d",
|
|
|
|
rli->cur_log->error));
|
|
|
|
if (rli->cur_log->error) /* not EOF */
|
|
|
|
{
|
|
|
|
*errmsg= "I/O error reading event at position 4";
|
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
else if (ev->get_type_code() == FORMAT_DESCRIPTION_EVENT)
|
|
|
|
{
|
|
|
|
DBUG_PRINT("info",("found Format_description_log_event"));
|
|
|
|
delete rli->relay_log.description_event_for_exec;
|
|
|
|
rli->relay_log.description_event_for_exec= (Format_description_log_event*) ev;
|
|
|
|
/*
|
|
|
|
As ev was returned by read_log_event, it has passed is_valid(), so
|
|
|
|
my_malloc() in ctor worked, no need to check again.
|
|
|
|
*/
|
|
|
|
/*
|
|
|
|
Ok, we found a Format_description event. But it is not sure that this
|
|
|
|
describes the whole relay log; indeed, one can have this sequence
|
|
|
|
(starting from position 4):
|
|
|
|
Format_desc (of slave)
|
|
|
|
Rotate (of master)
|
|
|
|
Format_desc (of master)
|
|
|
|
So the Format_desc which really describes the rest of the relay log
|
|
|
|
is the 3rd event (it can't be further than that, because we rotate
|
|
|
|
the relay log when we queue a Rotate event from the master).
|
|
|
|
But what describes the Rotate is the first Format_desc.
|
|
|
|
So what we do is:
|
|
|
|
go on searching for Format_description events, until you exceed the
|
|
|
|
position (argument 'pos') or until you find another event than Rotate
|
|
|
|
or Format_desc.
|
|
|
|
*/
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
DBUG_PRINT("info",("found event of another type=%d",
|
|
|
|
ev->get_type_code()));
|
|
|
|
look_for_description_event= (ev->get_type_code() == ROTATE_EVENT);
|
|
|
|
delete ev;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
my_b_seek(rli->cur_log,(off_t)pos);
|
|
|
|
#ifndef DBUG_OFF
|
|
|
|
{
|
|
|
|
char llbuf1[22], llbuf2[22];
|
|
|
|
DBUG_PRINT("info", ("my_b_tell(rli->cur_log)=%s rli->event_relay_log_pos=%s",
|
|
|
|
llstr(my_b_tell(rli->cur_log),llbuf1),
|
|
|
|
llstr(rli->event_relay_log_pos,llbuf2)));
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
err:
|
|
|
|
/*
|
|
|
|
If we don't purge, we can't honour relay_log_space_limit ;
|
|
|
|
silently discard it
|
|
|
|
*/
|
|
|
|
if (!relay_log_purge)
|
|
|
|
rli->log_space_limit= 0;
|
|
|
|
pthread_cond_broadcast(&rli->data_cond);
|
|
|
|
|
|
|
|
pthread_mutex_unlock(log_lock);
|
|
|
|
|
|
|
|
if (need_data_lock)
|
|
|
|
pthread_mutex_unlock(&rli->data_lock);
|
|
|
|
if (!rli->relay_log.description_event_for_exec->is_valid() && !*errmsg)
|
|
|
|
*errmsg= "Invalid Format_description log event; could be out of memory";
|
|
|
|
|
|
|
|
DBUG_RETURN ((*errmsg) ? 1 : 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
Waits until the SQL thread reaches (has executed up to) the
|
|
|
|
log/position or timed out.
|
|
|
|
|
|
|
|
SYNOPSIS
|
|
|
|
wait_for_pos()
|
|
|
|
thd client thread that sent SELECT MASTER_POS_WAIT
|
|
|
|
log_name log name to wait for
|
|
|
|
log_pos position to wait for
|
|
|
|
timeout timeout in seconds before giving up waiting
|
|
|
|
|
|
|
|
NOTES
|
|
|
|
timeout is longlong whereas it should be ulong ; but this is
|
|
|
|
to catch if the user submitted a negative timeout.
|
|
|
|
|
|
|
|
RETURN VALUES
|
|
|
|
-2 improper arguments (log_pos<0)
|
|
|
|
or slave not running, or master info changed
|
|
|
|
during the function's execution,
|
|
|
|
or client thread killed. -2 is translated to NULL by caller
|
|
|
|
-1 timed out
|
|
|
|
>=0 number of log events the function had to wait
|
|
|
|
before reaching the desired log/position
|
|
|
|
*/
|
|
|
|
|
2007-08-16 07:37:50 +02:00
|
|
|
int Relay_log_info::wait_for_pos(THD* thd, String* log_name,
|
2006-10-31 12:23:14 +01:00
|
|
|
longlong log_pos,
|
|
|
|
longlong timeout)
|
|
|
|
{
|
|
|
|
int event_count = 0;
|
|
|
|
ulong init_abort_pos_wait;
|
|
|
|
int error=0;
|
|
|
|
struct timespec abstime; // for timeout checking
|
|
|
|
const char *msg;
|
2007-08-16 07:37:50 +02:00
|
|
|
DBUG_ENTER("Relay_log_info::wait_for_pos");
|
2006-10-31 12:23:14 +01:00
|
|
|
|
|
|
|
if (!inited)
|
2008-03-14 17:52:57 +01:00
|
|
|
DBUG_RETURN(-2);
|
2006-10-31 12:23:14 +01:00
|
|
|
|
|
|
|
DBUG_PRINT("enter",("log_name: '%s' log_pos: %lu timeout: %lu",
|
|
|
|
log_name->c_ptr(), (ulong) log_pos, (ulong) timeout));
|
|
|
|
|
|
|
|
set_timespec(abstime,timeout);
|
|
|
|
pthread_mutex_lock(&data_lock);
|
|
|
|
msg= thd->enter_cond(&data_cond, &data_lock,
|
|
|
|
"Waiting for the slave SQL thread to "
|
|
|
|
"advance position");
|
|
|
|
/*
|
|
|
|
This function will abort when it notices that some CHANGE MASTER or
|
|
|
|
RESET MASTER has changed the master info.
|
|
|
|
To catch this, these commands modify abort_pos_wait ; We just monitor
|
|
|
|
abort_pos_wait and see if it has changed.
|
|
|
|
Why do we have this mechanism instead of simply monitoring slave_running
|
|
|
|
in the loop (we do this too), as CHANGE MASTER/RESET SLAVE require that
|
|
|
|
the SQL thread be stopped?
|
|
|
|
This is becasue if someones does:
|
|
|
|
STOP SLAVE;CHANGE MASTER/RESET SLAVE; START SLAVE;
|
|
|
|
the change may happen very quickly and we may not notice that
|
|
|
|
slave_running briefly switches between 1/0/1.
|
|
|
|
*/
|
|
|
|
init_abort_pos_wait= abort_pos_wait;
|
|
|
|
|
|
|
|
/*
|
|
|
|
We'll need to
|
|
|
|
handle all possible log names comparisons (e.g. 999 vs 1000).
|
|
|
|
We use ulong for string->number conversion ; this is no
|
|
|
|
stronger limitation than in find_uniq_filename in sql/log.cc
|
|
|
|
*/
|
|
|
|
ulong log_name_extension;
|
|
|
|
char log_name_tmp[FN_REFLEN]; //make a char[] from String
|
|
|
|
|
|
|
|
strmake(log_name_tmp, log_name->ptr(), min(log_name->length(), FN_REFLEN-1));
|
|
|
|
|
|
|
|
char *p= fn_ext(log_name_tmp);
|
|
|
|
char *p_end;
|
|
|
|
if (!*p || log_pos<0)
|
|
|
|
{
|
|
|
|
error= -2; //means improper arguments
|
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
// Convert 0-3 to 4
|
|
|
|
log_pos= max(log_pos, BIN_LOG_HEADER_SIZE);
|
|
|
|
/* p points to '.' */
|
|
|
|
log_name_extension= strtoul(++p, &p_end, 10);
|
|
|
|
/*
|
|
|
|
p_end points to the first invalid character.
|
|
|
|
If it equals to p, no digits were found, error.
|
|
|
|
If it contains '\0' it means conversion went ok.
|
|
|
|
*/
|
|
|
|
if (p_end==p || *p_end)
|
|
|
|
{
|
|
|
|
error= -2;
|
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* The "compare and wait" main loop */
|
|
|
|
while (!thd->killed &&
|
|
|
|
init_abort_pos_wait == abort_pos_wait &&
|
|
|
|
slave_running)
|
|
|
|
{
|
|
|
|
bool pos_reached;
|
|
|
|
int cmp_result= 0;
|
|
|
|
|
|
|
|
DBUG_PRINT("info",
|
|
|
|
("init_abort_pos_wait: %ld abort_pos_wait: %ld",
|
|
|
|
init_abort_pos_wait, abort_pos_wait));
|
|
|
|
DBUG_PRINT("info",("group_master_log_name: '%s' pos: %lu",
|
|
|
|
group_master_log_name, (ulong) group_master_log_pos));
|
|
|
|
|
|
|
|
/*
|
|
|
|
group_master_log_name can be "", if we are just after a fresh
|
|
|
|
replication start or after a CHANGE MASTER TO MASTER_HOST/PORT
|
|
|
|
(before we have executed one Rotate event from the master) or
|
|
|
|
(rare) if the user is doing a weird slave setup (see next
|
|
|
|
paragraph). If group_master_log_name is "", we assume we don't
|
|
|
|
have enough info to do the comparison yet, so we just wait until
|
|
|
|
more data. In this case master_log_pos is always 0 except if
|
|
|
|
somebody (wrongly) sets this slave to be a slave of itself
|
|
|
|
without using --replicate-same-server-id (an unsupported
|
|
|
|
configuration which does nothing), then group_master_log_pos
|
|
|
|
will grow and group_master_log_name will stay "".
|
|
|
|
*/
|
|
|
|
if (*group_master_log_name)
|
|
|
|
{
|
|
|
|
char *basename= (group_master_log_name +
|
|
|
|
dirname_length(group_master_log_name));
|
|
|
|
/*
|
|
|
|
First compare the parts before the extension.
|
|
|
|
Find the dot in the master's log basename,
|
|
|
|
and protect against user's input error :
|
|
|
|
if the names do not match up to '.' included, return error
|
|
|
|
*/
|
|
|
|
char *q= (char*)(fn_ext(basename)+1);
|
|
|
|
if (strncmp(basename, log_name_tmp, (int)(q-basename)))
|
|
|
|
{
|
|
|
|
error= -2;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
// Now compare extensions.
|
|
|
|
char *q_end;
|
|
|
|
ulong group_master_log_name_extension= strtoul(q, &q_end, 10);
|
|
|
|
if (group_master_log_name_extension < log_name_extension)
|
|
|
|
cmp_result= -1 ;
|
|
|
|
else
|
|
|
|
cmp_result= (group_master_log_name_extension > log_name_extension) ? 1 : 0 ;
|
|
|
|
|
|
|
|
pos_reached= ((!cmp_result && group_master_log_pos >= (ulonglong)log_pos) ||
|
|
|
|
cmp_result > 0);
|
|
|
|
if (pos_reached || thd->killed)
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
//wait for master update, with optional timeout.
|
|
|
|
|
|
|
|
DBUG_PRINT("info",("Waiting for master update"));
|
|
|
|
/*
|
|
|
|
We are going to pthread_cond_(timed)wait(); if the SQL thread stops it
|
|
|
|
will wake us up.
|
|
|
|
*/
|
|
|
|
if (timeout > 0)
|
|
|
|
{
|
|
|
|
/*
|
|
|
|
Note that pthread_cond_timedwait checks for the timeout
|
|
|
|
before for the condition ; i.e. it returns ETIMEDOUT
|
|
|
|
if the system time equals or exceeds the time specified by abstime
|
|
|
|
before the condition variable is signaled or broadcast, _or_ if
|
|
|
|
the absolute time specified by abstime has already passed at the time
|
|
|
|
of the call.
|
|
|
|
For that reason, pthread_cond_timedwait will do the "timeoutting" job
|
|
|
|
even if its condition is always immediately signaled (case of a loaded
|
|
|
|
master).
|
|
|
|
*/
|
|
|
|
error=pthread_cond_timedwait(&data_cond, &data_lock, &abstime);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
pthread_cond_wait(&data_cond, &data_lock);
|
|
|
|
DBUG_PRINT("info",("Got signal of master update or timed out"));
|
|
|
|
if (error == ETIMEDOUT || error == ETIME)
|
|
|
|
{
|
|
|
|
error= -1;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
error=0;
|
|
|
|
event_count++;
|
|
|
|
DBUG_PRINT("info",("Testing if killed or SQL thread not running"));
|
|
|
|
}
|
|
|
|
|
|
|
|
err:
|
|
|
|
thd->exit_cond(msg);
|
|
|
|
DBUG_PRINT("exit",("killed: %d abort: %d slave_running: %d \
|
|
|
|
improper_arguments: %d timed_out: %d",
|
|
|
|
thd->killed_errno(),
|
|
|
|
(int) (init_abort_pos_wait != abort_pos_wait),
|
|
|
|
(int) slave_running,
|
|
|
|
(int) (error == -2),
|
|
|
|
(int) (error == -1)));
|
|
|
|
if (thd->killed || init_abort_pos_wait != abort_pos_wait ||
|
|
|
|
!slave_running)
|
|
|
|
{
|
|
|
|
error= -2;
|
|
|
|
}
|
|
|
|
DBUG_RETURN( error ? error : event_count );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-08-16 07:37:50 +02:00
|
|
|
void Relay_log_info::inc_group_relay_log_pos(ulonglong log_pos,
|
2006-10-31 12:23:14 +01:00
|
|
|
bool skip_lock)
|
|
|
|
{
|
2007-08-16 07:37:50 +02:00
|
|
|
DBUG_ENTER("Relay_log_info::inc_group_relay_log_pos");
|
2006-10-31 12:23:14 +01:00
|
|
|
|
|
|
|
if (!skip_lock)
|
|
|
|
pthread_mutex_lock(&data_lock);
|
|
|
|
inc_event_relay_log_pos();
|
|
|
|
group_relay_log_pos= event_relay_log_pos;
|
|
|
|
strmake(group_relay_log_name,event_relay_log_name,
|
|
|
|
sizeof(group_relay_log_name)-1);
|
|
|
|
|
|
|
|
notify_group_relay_log_name_update();
|
|
|
|
|
|
|
|
/*
|
|
|
|
If the slave does not support transactions and replicates a transaction,
|
|
|
|
users should not trust group_master_log_pos (which they can display with
|
|
|
|
SHOW SLAVE STATUS or read from relay-log.info), because to compute
|
|
|
|
group_master_log_pos the slave relies on log_pos stored in the master's
|
|
|
|
binlog, but if we are in a master's transaction these positions are always
|
|
|
|
the BEGIN's one (excepted for the COMMIT), so group_master_log_pos does
|
|
|
|
not advance as it should on the non-transactional slave (it advances by
|
|
|
|
big leaps, whereas it should advance by small leaps).
|
|
|
|
*/
|
|
|
|
/*
|
|
|
|
In 4.x we used the event's len to compute the positions here. This is
|
|
|
|
wrong if the event was 3.23/4.0 and has been converted to 5.0, because
|
|
|
|
then the event's len is not what is was in the master's binlog, so this
|
|
|
|
will make a wrong group_master_log_pos (yes it's a bug in 3.23->4.0
|
|
|
|
replication: Exec_master_log_pos is wrong). Only way to solve this is to
|
|
|
|
have the original offset of the end of the event the relay log. This is
|
|
|
|
what we do in 5.0: log_pos has become "end_log_pos" (because the real use
|
|
|
|
of log_pos in 4.0 was to compute the end_log_pos; so better to store
|
|
|
|
end_log_pos instead of begin_log_pos.
|
|
|
|
If we had not done this fix here, the problem would also have appeared
|
|
|
|
when the slave and master are 5.0 but with different event length (for
|
|
|
|
example the slave is more recent than the master and features the event
|
|
|
|
UID). It would give false MASTER_POS_WAIT, false Exec_master_log_pos in
|
|
|
|
SHOW SLAVE STATUS, and so the user would do some CHANGE MASTER using this
|
|
|
|
value which would lead to badly broken replication.
|
|
|
|
Even the relay_log_pos will be corrupted in this case, because the len is
|
|
|
|
the relay log is not "val".
|
|
|
|
With the end_log_pos solution, we avoid computations involving lengthes.
|
|
|
|
*/
|
|
|
|
DBUG_PRINT("info", ("log_pos: %lu group_master_log_pos: %lu",
|
|
|
|
(long) log_pos, (long) group_master_log_pos));
|
|
|
|
if (log_pos) // 3.23 binlogs don't have log_posx
|
|
|
|
{
|
|
|
|
group_master_log_pos= log_pos;
|
|
|
|
}
|
|
|
|
pthread_cond_broadcast(&data_cond);
|
|
|
|
if (!skip_lock)
|
|
|
|
pthread_mutex_unlock(&data_lock);
|
|
|
|
DBUG_VOID_RETURN;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-08-16 07:37:50 +02:00
|
|
|
void Relay_log_info::close_temporary_tables()
|
2006-10-31 12:23:14 +01:00
|
|
|
{
|
|
|
|
TABLE *table,*next;
|
2007-08-16 07:37:50 +02:00
|
|
|
DBUG_ENTER("Relay_log_info::close_temporary_tables");
|
2006-10-31 12:23:14 +01:00
|
|
|
|
|
|
|
for (table=save_temporary_tables ; table ; table=next)
|
|
|
|
{
|
|
|
|
next=table->next;
|
|
|
|
/*
|
|
|
|
Don't ask for disk deletion. For now, anyway they will be deleted when
|
|
|
|
slave restarts, but it is a better intention to not delete them.
|
|
|
|
*/
|
2006-11-27 00:47:38 +01:00
|
|
|
DBUG_PRINT("info", ("table: 0x%lx", (long) table));
|
2006-10-31 12:23:14 +01:00
|
|
|
close_temporary(table, 1, 0);
|
|
|
|
}
|
|
|
|
save_temporary_tables= 0;
|
|
|
|
slave_open_temp_tables= 0;
|
|
|
|
DBUG_VOID_RETURN;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
purge_relay_logs()
|
|
|
|
|
|
|
|
NOTES
|
|
|
|
Assumes to have a run lock on rli and that no slave thread are running.
|
|
|
|
*/
|
|
|
|
|
2007-08-16 07:37:50 +02:00
|
|
|
int purge_relay_logs(Relay_log_info* rli, THD *thd, bool just_reset,
|
2006-10-31 12:23:14 +01:00
|
|
|
const char** errmsg)
|
|
|
|
{
|
|
|
|
int error=0;
|
|
|
|
DBUG_ENTER("purge_relay_logs");
|
|
|
|
|
|
|
|
/*
|
|
|
|
Even if rli->inited==0, we still try to empty rli->master_log_* variables.
|
|
|
|
Indeed, rli->inited==0 does not imply that they already are empty.
|
|
|
|
It could be that slave's info initialization partly succeeded :
|
|
|
|
for example if relay-log.info existed but *relay-bin*.*
|
|
|
|
have been manually removed, init_relay_log_info reads the old
|
|
|
|
relay-log.info and fills rli->master_log_*, then init_relay_log_info
|
|
|
|
checks for the existence of the relay log, this fails and
|
|
|
|
init_relay_log_info leaves rli->inited to 0.
|
|
|
|
In that pathological case, rli->master_log_pos* will be properly reinited
|
|
|
|
at the next START SLAVE (as RESET SLAVE or CHANGE
|
|
|
|
MASTER, the callers of purge_relay_logs, will delete bogus *.info files
|
|
|
|
or replace them with correct files), however if the user does SHOW SLAVE
|
|
|
|
STATUS before START SLAVE, he will see old, confusing rli->master_log_*.
|
|
|
|
In other words, we reinit rli->master_log_* for SHOW SLAVE STATUS
|
|
|
|
to display fine in any case.
|
|
|
|
*/
|
|
|
|
|
|
|
|
rli->group_master_log_name[0]= 0;
|
|
|
|
rli->group_master_log_pos= 0;
|
|
|
|
|
|
|
|
if (!rli->inited)
|
|
|
|
{
|
|
|
|
DBUG_PRINT("info", ("rli->inited == 0"));
|
|
|
|
DBUG_RETURN(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
DBUG_ASSERT(rli->slave_running == 0);
|
|
|
|
DBUG_ASSERT(rli->mi->slave_running == 0);
|
|
|
|
|
|
|
|
rli->slave_skip_counter=0;
|
|
|
|
pthread_mutex_lock(&rli->data_lock);
|
|
|
|
|
|
|
|
/*
|
|
|
|
we close the relay log fd possibly left open by the slave SQL thread,
|
|
|
|
to be able to delete it; the relay log fd possibly left open by the slave
|
|
|
|
I/O thread will be closed naturally in reset_logs() by the
|
|
|
|
close(LOG_CLOSE_TO_BE_OPENED) call
|
|
|
|
*/
|
|
|
|
if (rli->cur_log_fd >= 0)
|
|
|
|
{
|
|
|
|
end_io_cache(&rli->cache_buf);
|
|
|
|
my_close(rli->cur_log_fd, MYF(MY_WME));
|
|
|
|
rli->cur_log_fd= -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (rli->relay_log.reset_logs(thd))
|
|
|
|
{
|
|
|
|
*errmsg = "Failed during log reset";
|
|
|
|
error=1;
|
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
/* Save name of used relay log file */
|
|
|
|
strmake(rli->group_relay_log_name, rli->relay_log.get_log_fname(),
|
|
|
|
sizeof(rli->group_relay_log_name)-1);
|
|
|
|
strmake(rli->event_relay_log_name, rli->relay_log.get_log_fname(),
|
|
|
|
sizeof(rli->event_relay_log_name)-1);
|
|
|
|
rli->group_relay_log_pos= rli->event_relay_log_pos= BIN_LOG_HEADER_SIZE;
|
|
|
|
if (count_relay_log_space(rli))
|
|
|
|
{
|
|
|
|
*errmsg= "Error counting relay log space";
|
2009-07-09 09:28:38 +02:00
|
|
|
error=1;
|
2006-10-31 12:23:14 +01:00
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
if (!just_reset)
|
|
|
|
error= init_relay_log_pos(rli, rli->group_relay_log_name,
|
|
|
|
rli->group_relay_log_pos,
|
|
|
|
0 /* do not need data lock */, errmsg, 0);
|
|
|
|
|
|
|
|
err:
|
|
|
|
#ifndef DBUG_OFF
|
|
|
|
char buf[22];
|
|
|
|
#endif
|
|
|
|
DBUG_PRINT("info",("log_space_total: %s",llstr(rli->log_space_total,buf)));
|
|
|
|
pthread_mutex_unlock(&rli->data_lock);
|
|
|
|
DBUG_RETURN(error);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
Check if condition stated in UNTIL clause of START SLAVE is reached.
|
|
|
|
SYNOPSYS
|
2007-08-16 07:37:50 +02:00
|
|
|
Relay_log_info::is_until_satisfied()
|
2008-02-27 18:46:06 +01:00
|
|
|
master_beg_pos position of the beginning of to be executed event
|
|
|
|
(not log_pos member of the event that points to the
|
|
|
|
beginning of the following event)
|
|
|
|
|
|
|
|
|
2006-10-31 12:23:14 +01:00
|
|
|
DESCRIPTION
|
|
|
|
Checks if UNTIL condition is reached. Uses caching result of last
|
|
|
|
comparison of current log file name and target log file name. So cached
|
|
|
|
value should be invalidated if current log file name changes
|
2007-08-16 07:37:50 +02:00
|
|
|
(see Relay_log_info::notify_... functions).
|
2006-10-31 12:23:14 +01:00
|
|
|
|
|
|
|
This caching is needed to avoid of expensive string comparisons and
|
|
|
|
strtol() conversions needed for log names comparison. We don't need to
|
|
|
|
compare them each time this function is called, we only need to do this
|
|
|
|
when current log name changes. If we have UNTIL_MASTER_POS condition we
|
2007-03-30 15:29:30 +02:00
|
|
|
need to do this only after Rotate_log_event::do_apply_event() (which is
|
2006-10-31 12:23:14 +01:00
|
|
|
rare, so caching gives real benifit), and if we have UNTIL_RELAY_POS
|
|
|
|
condition then we should invalidate cached comarison value after
|
|
|
|
inc_group_relay_log_pos() which called for each group of events (so we
|
|
|
|
have some benefit if we have something like queries that use
|
|
|
|
autoincrement or if we have transactions).
|
|
|
|
|
|
|
|
Should be called ONLY if until_condition != UNTIL_NONE !
|
|
|
|
RETURN VALUE
|
|
|
|
true - condition met or error happened (condition seems to have
|
|
|
|
bad log file name)
|
|
|
|
false - condition not met
|
|
|
|
*/
|
|
|
|
|
2009-12-14 17:32:22 +01:00
|
|
|
bool Relay_log_info::is_until_satisfied(THD *thd, Log_event *ev)
|
2006-10-31 12:23:14 +01:00
|
|
|
{
|
|
|
|
const char *log_name;
|
|
|
|
ulonglong log_pos;
|
2007-08-16 07:37:50 +02:00
|
|
|
DBUG_ENTER("Relay_log_info::is_until_satisfied");
|
2006-10-31 12:23:14 +01:00
|
|
|
|
|
|
|
DBUG_ASSERT(until_condition != UNTIL_NONE);
|
|
|
|
|
|
|
|
if (until_condition == UNTIL_MASTER_POS)
|
|
|
|
{
|
2009-12-14 17:32:22 +01:00
|
|
|
if (ev && ev->server_id == (uint32) ::server_id && !replicate_same_server_id)
|
2009-12-14 17:50:22 +01:00
|
|
|
DBUG_RETURN(FALSE);
|
2006-10-31 12:23:14 +01:00
|
|
|
log_name= group_master_log_name;
|
2009-12-14 17:32:22 +01:00
|
|
|
log_pos= (!ev)? group_master_log_pos :
|
|
|
|
((thd->options & OPTION_BEGIN || !ev->log_pos) ?
|
|
|
|
group_master_log_pos : ev->log_pos - ev->data_written);
|
2006-10-31 12:23:14 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{ /* until_condition == UNTIL_RELAY_POS */
|
|
|
|
log_name= group_relay_log_name;
|
|
|
|
log_pos= group_relay_log_pos;
|
|
|
|
}
|
|
|
|
|
2007-01-17 15:06:37 +01:00
|
|
|
#ifndef DBUG_OFF
|
|
|
|
{
|
|
|
|
char buf[32];
|
|
|
|
DBUG_PRINT("info", ("group_master_log_name='%s', group_master_log_pos=%s",
|
|
|
|
group_master_log_name, llstr(group_master_log_pos, buf)));
|
|
|
|
DBUG_PRINT("info", ("group_relay_log_name='%s', group_relay_log_pos=%s",
|
|
|
|
group_relay_log_name, llstr(group_relay_log_pos, buf)));
|
|
|
|
DBUG_PRINT("info", ("(%s) log_name='%s', log_pos=%s",
|
|
|
|
until_condition == UNTIL_MASTER_POS ? "master" : "relay",
|
|
|
|
log_name, llstr(log_pos, buf)));
|
|
|
|
DBUG_PRINT("info", ("(%s) until_log_name='%s', until_log_pos=%s",
|
|
|
|
until_condition == UNTIL_MASTER_POS ? "master" : "relay",
|
|
|
|
until_log_name, llstr(until_log_pos, buf)));
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2006-10-31 12:23:14 +01:00
|
|
|
if (until_log_names_cmp_result == UNTIL_LOG_NAMES_CMP_UNKNOWN)
|
|
|
|
{
|
|
|
|
/*
|
|
|
|
We have no cached comparison results so we should compare log names
|
|
|
|
and cache result.
|
|
|
|
If we are after RESET SLAVE, and the SQL slave thread has not processed
|
|
|
|
any event yet, it could be that group_master_log_name is "". In that case,
|
|
|
|
just wait for more events (as there is no sensible comparison to do).
|
|
|
|
*/
|
|
|
|
|
|
|
|
if (*log_name)
|
|
|
|
{
|
|
|
|
const char *basename= log_name + dirname_length(log_name);
|
|
|
|
|
|
|
|
const char *q= (const char*)(fn_ext(basename)+1);
|
|
|
|
if (strncmp(basename, until_log_name, (int)(q-basename)) == 0)
|
|
|
|
{
|
|
|
|
/* Now compare extensions. */
|
|
|
|
char *q_end;
|
|
|
|
ulong log_name_extension= strtoul(q, &q_end, 10);
|
|
|
|
if (log_name_extension < until_log_name_extension)
|
|
|
|
until_log_names_cmp_result= UNTIL_LOG_NAMES_CMP_LESS;
|
|
|
|
else
|
|
|
|
until_log_names_cmp_result=
|
|
|
|
(log_name_extension > until_log_name_extension) ?
|
|
|
|
UNTIL_LOG_NAMES_CMP_GREATER : UNTIL_LOG_NAMES_CMP_EQUAL ;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* Probably error so we aborting */
|
|
|
|
sql_print_error("Slave SQL thread is stopped because UNTIL "
|
|
|
|
"condition is bad.");
|
|
|
|
DBUG_RETURN(TRUE);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
DBUG_RETURN(until_log_pos == 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
DBUG_RETURN(((until_log_names_cmp_result == UNTIL_LOG_NAMES_CMP_EQUAL &&
|
|
|
|
log_pos >= until_log_pos) ||
|
|
|
|
until_log_names_cmp_result == UNTIL_LOG_NAMES_CMP_GREATER));
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-08-16 07:37:50 +02:00
|
|
|
void Relay_log_info::cached_charset_invalidate()
|
2006-10-31 12:23:14 +01:00
|
|
|
{
|
2007-08-16 07:37:50 +02:00
|
|
|
DBUG_ENTER("Relay_log_info::cached_charset_invalidate");
|
2006-10-31 12:23:14 +01:00
|
|
|
|
|
|
|
/* Full of zeroes means uninitialized. */
|
|
|
|
bzero(cached_charset, sizeof(cached_charset));
|
|
|
|
DBUG_VOID_RETURN;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-08-16 07:37:50 +02:00
|
|
|
bool Relay_log_info::cached_charset_compare(char *charset) const
|
2006-10-31 12:23:14 +01:00
|
|
|
{
|
2007-08-16 07:37:50 +02:00
|
|
|
DBUG_ENTER("Relay_log_info::cached_charset_compare");
|
2006-10-31 12:23:14 +01:00
|
|
|
|
Bug#53445: Build with -Wall and fix warnings that it generates
Apart strict-aliasing warnings, fix the remaining warnings
generated by GCC 4.4.4 -Wall and -Wextra flags.
One major source of warnings was the in-house function my_bcmp
which (unconventionally) took pointers to unsigned characters
as the byte sequences to be compared. Since my_bcmp and bcmp
are deprecated functions whose only difference with memcmp is
the return value, every use of the function is replaced with
memcmp as the special return value wasn't actually being used
by any caller.
There were also various other warnings, mostly due to type
mismatches, missing return values, missing prototypes, dead
code (unreachable) and ignored return values.
BUILD/SETUP.sh:
Remove flags that are implied by -Wall and -Wextra.
Do not warn about unused parameters in C++.
BUILD/check-cpu:
Print only the compiler version instead of verbose banner.
Although the option is gcc specific, the check was only
being used for GCC specific checks anyway.
client/mysql.cc:
bcmp is no longer defined.
client/mysqltest.cc:
Pass a string to function expecting a format string.
Replace use of bcmp with memcmp.
cmd-line-utils/readline/Makefile.am:
Always define _GNU_SOURCE when compiling GNU readline.
Required to make certain prototypes visible.
cmd-line-utils/readline/input.c:
Condition for the code to be meaningful.
configure.in:
Remove check for bcmp.
extra/comp_err.c:
Use appropriate type.
extra/replace.c:
Replace use of bcmp with memcmp.
extra/yassl/src/crypto_wrapper.cpp:
Do not ignore the return value of fgets. Retrieve the file
position if fgets succeed -- if it fails, the function will
bail out and return a error.
extra/yassl/taocrypt/include/blowfish.hpp:
Use a single array instead of accessing positions of the sbox_
through a subscript to pbox_.
extra/yassl/taocrypt/include/runtime.hpp:
One definition of such functions is enough.
extra/yassl/taocrypt/src/aes.cpp:
Avoid potentially ambiguous conditions.
extra/yassl/taocrypt/src/algebra.cpp:
Rename arguments to avoid shadowing related warnings.
extra/yassl/taocrypt/src/blowfish.cpp:
Avoid potentially ambiguous conditions.
extra/yassl/taocrypt/src/integer.cpp:
Do not define type within a anonymous union.
Use a variable to return a value instead of
leaving the result in a register -- compiler
does not know the logic inside the asm.
extra/yassl/taocrypt/src/misc.cpp:
Define handler for pure virtual functions.
Remove unused code.
extra/yassl/taocrypt/src/twofish.cpp:
Avoid potentially ambiguous conditions.
extra/yassl/testsuite/test.hpp:
Function must have C language linkage.
include/m_string.h:
Remove check which relied on bcmp being defined -- they weren't
being used as bcmp is only visible when _BSD_SOURCE is defined.
include/my_bitmap.h:
Remove bogus helpers which were used only in a few files and
were causing warnings about dead code.
include/my_global.h:
Due to G++ bug, always silence false-positive uninitialized
variables warnings when compiling C++ code with G++.
Remove bogus helper.
libmysql/Makefile.shared:
Remove built-in implementation of bcmp.
mysql-test/lib/My/SafeProcess/safe_process.cc:
Cast pid to largest possible type for a process identifier.
mysys/mf_loadpath.c:
Leave space of the ending nul.
mysys/mf_pack.c:
Replace bcmp with memcmp.
mysys/my_bitmap.c:
Dead code removal.
mysys/my_gethwaddr.c:
Remove unused variable.
mysys/my_getopt.c:
Silence bogus uninitialized variable warning.
Do not cast away the constant qualifier.
mysys/safemalloc.c:
Cast to expected type.
mysys/thr_lock.c:
Silence bogus uninitialized variable warning.
sql/field.cc:
Replace bogus helper with a more appropriate logic which is
used throughout the code.
sql/item.cc:
Remove bogus logical condition which always evaluates to TRUE.
sql/item_create.cc:
Simplify code to avoid signedness related warnings.
sql/log_event.cc:
Replace use of bcmp with memcmp.
No need to use helpers for simple bit operations.
sql/log_event_old.cc:
Replace bmove_align with memcpy.
sql/mysqld.cc:
Move use declaration of variable to the ifdef block where it
is used. Remove now-unnecessary casts and arguments.
sql/set_var.cc:
Replace bogus helpers with simple and classic bit operations.
sql/slave.cc:
Cast to expected type and silence bogus warning.
sql/sql_class.h:
Don't use enum values as bit flags, the supposed type safety is
bogus as the combined bit flags are not a value in the enumeration.
sql/udf_example.c:
Only declare variable when necessary.
sql/unireg.h:
Replace use of bmove_align with memcpy.
storage/innobase/os/os0file.c:
Silence bogus warning.
storage/myisam/mi_open.c:
Remove bogus cast, DBUG_DUMP expects a pointer to unsigned
char.
storage/myisam/mi_page.c:
Remove bogus cast, DBUG_DUMP expects a pointer to unsigned
char.
strings/bcmp.c:
Remove built-in bcmp.
strings/ctype-ucs2.c:
Silence bogus warning.
tests/mysql_client_test.c:
Use a appropriate type as expected by simple_command().
2010-07-02 20:30:47 +02:00
|
|
|
if (memcmp(cached_charset, charset, sizeof(cached_charset)))
|
2006-10-31 12:23:14 +01:00
|
|
|
{
|
2006-11-10 15:10:41 +01:00
|
|
|
memcpy(const_cast<char*>(cached_charset), charset, sizeof(cached_charset));
|
2006-10-31 12:23:14 +01:00
|
|
|
DBUG_RETURN(1);
|
|
|
|
}
|
|
|
|
DBUG_RETURN(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-08-16 07:37:50 +02:00
|
|
|
void Relay_log_info::stmt_done(my_off_t event_master_log_pos,
|
2007-04-13 19:19:10 +02:00
|
|
|
time_t event_creation_time)
|
2007-04-12 08:58:04 +02:00
|
|
|
{
|
2007-10-13 22:12:50 +02:00
|
|
|
#ifndef DBUG_OFF
|
|
|
|
extern uint debug_not_change_ts_if_art_event;
|
|
|
|
#endif
|
2007-04-12 08:58:04 +02:00
|
|
|
clear_flag(IN_STMT);
|
|
|
|
|
|
|
|
/*
|
|
|
|
If in a transaction, and if the slave supports transactions, just
|
|
|
|
inc_event_relay_log_pos(). We only have to check for OPTION_BEGIN
|
|
|
|
(not OPTION_NOT_AUTOCOMMIT) as transactions are logged with
|
|
|
|
BEGIN/COMMIT, not with SET AUTOCOMMIT= .
|
|
|
|
|
|
|
|
CAUTION: opt_using_transactions means innodb || bdb ; suppose the
|
|
|
|
master supports InnoDB and BDB, but the slave supports only BDB,
|
|
|
|
problems will arise: - suppose an InnoDB table is created on the
|
|
|
|
master, - then it will be MyISAM on the slave - but as
|
|
|
|
opt_using_transactions is true, the slave will believe he is
|
|
|
|
transactional with the MyISAM table. And problems will come when
|
|
|
|
one does START SLAVE; STOP SLAVE; START SLAVE; (the slave will
|
|
|
|
resume at BEGIN whereas there has not been any rollback). This is
|
|
|
|
the problem of using opt_using_transactions instead of a finer
|
|
|
|
"does the slave support _transactional handler used on the
|
|
|
|
master_".
|
|
|
|
|
|
|
|
More generally, we'll have problems when a query mixes a
|
|
|
|
transactional handler and MyISAM and STOP SLAVE is issued in the
|
|
|
|
middle of the "transaction". START SLAVE will resume at BEGIN
|
|
|
|
while the MyISAM table has already been updated.
|
|
|
|
*/
|
|
|
|
if ((sql_thd->options & OPTION_BEGIN) && opt_using_transactions)
|
|
|
|
inc_event_relay_log_pos();
|
|
|
|
else
|
|
|
|
{
|
|
|
|
inc_group_relay_log_pos(event_master_log_pos);
|
|
|
|
flush_relay_log_info(this);
|
|
|
|
/*
|
|
|
|
Note that Rotate_log_event::do_apply_event() does not call this
|
|
|
|
function, so there is no chance that a fake rotate event resets
|
|
|
|
last_master_timestamp. Note that we update without mutex
|
|
|
|
(probably ok - except in some very rare cases, only consequence
|
|
|
|
is that value may take some time to display in
|
|
|
|
Seconds_Behind_Master - not critical).
|
|
|
|
*/
|
wl#173 - temporal types with sub-second resolution
and collateral changes.
* introduce my_hrtime_t, my_timediff_t, and conversion macros
* inroduce TIME_RESULT, but it can only be returned from Item::cmp_type(),
never from Item::result_type()
* pack_time/unpack_time function for "packed" representation of
MYSQL_TIME in a longlong that can be compared
* ADDTIME()/SUBTIME()/+- INTERVAL now work with TIME values
* numbers aren't quoted in EXPLAIN EXTENDED
* new column I_S.COLUMNS.DATETIME_PRECISION
* date/time values are compares to anything as date/time, not as strings or numbers.
* old timestamp(X) is no longer supported
* MYSQL_TIME to string conversion functions take precision as an argument
* unified the warnings from Field_timestamp/datetime/time/date/newdate store methods
* Field_timestamp_hires, Field_datetime_hires, Field_time_hires
* Field_temporal
* Lazy_string class to pass a value (string, number, time) polymorphically down the stack
* make_truncated_value_warning and Field::set_datetime_warning use Lazy_string as an argument, removed char*/int/double variants
* removed Field::can_be_compared_as_longlong(). Use Field::cmp_type() == INT_RESULT instead
* introduced Item::cmp_result() instead of Item::is_datetime() and Item::result_as_longlong()
* in many cases date/time types are treated like other types, not as special cases
* greatly simplified Arg_comparator (regarding date/time/year code)
* SEC_TO_TIME is real function, not integer.
* microsecond precision in NOW, CURTIME, etc
* Item_temporal. All items derived from it only provide get_date, but no val* methods
* replication of NOW(6)
* Protocol::store(time) now takes the precision as an argument
* @@TIMESTAMP is a double
client/mysqlbinlog.cc:
remove unneded casts
include/my_sys.h:
introduce my_hrtime_t, my_timediff_t, and conversion macros
include/my_time.h:
pack_time/unpack_time, etc.
convenience functions to work with MYSQL_TIME::second_part
libmysql/libmysql.c:
str_to_time() is gone. str_to_datetime() does it now.
my_TIME_to_str() takes the precision as an argument
mysql-test/include/ps_conv.inc:
time is not equal to datetime anymore
mysql-test/r/distinct.result:
a test for an old MySQL bug
mysql-test/r/explain.result:
numbers aren't quoted in EXPLAIN EXTENDED
mysql-test/r/func_default.result:
numbers aren't quoted in EXPLAIN EXTENDED
mysql-test/r/func_sapdb.result:
when decimals=NOT_FIXED_DEC it means "not fixed" indeed
mysql-test/r/func_test.result:
numbers aren't quoted in EXPLAIN EXTENDED
mysql-test/r/func_time.result:
ADDTIME()/SUBTIME()/+- INTERVAL now work with TIME values
mysql-test/r/having.result:
numbers aren't quoted in EXPLAIN EXTENDED
mysql-test/r/information_schema.result:
new column I_S.COLUMNS.DATETIME_PRECISION
mysql-test/r/join_outer.result:
numbers aren't quoted in EXPLAIN EXTENDED
mysql-test/r/metadata.result:
TIMESTAMP no longer has zerofill flag
mysql-test/r/range.result:
invalid datetime is not compared with as a string
mysql-test/r/select.result:
NO_ZERO_IN_DATE, etc only affect storage - according to the manual
numbers aren't quoted in EXPLAIN EXTENDED
mysql-test/r/subselect.result:
numbers aren't quoted in EXPLAIN EXTENDED
mysql-test/r/sysdate_is_now.result:
when decimals=NOT_FIXED_DEC it means "not fixed" indeed
mysql-test/r/type_blob.result:
TIMESTAMP(N) is not deprecated
mysql-test/r/type_timestamp.result:
old TIMESTAMP(X) semantics is not supported anymore
mysql-test/r/union.result:
numbers aren't quoted in EXPLAIN EXTENDED
mysql-test/r/varbinary.result:
numbers aren't quoted in EXPLAIN EXTENDED
mysql-test/t/distinct.test:
test for an old MySQL bug
mysql-test/t/func_time.test:
+- INTERVAL now works with TIME values
mysql-test/t/select.test:
typo
mysql-test/t/subselect.test:
only one error per statement, please
mysql-test/t/system_mysql_db_fix40123.test:
old timestamp(X) is no longer supported
mysql-test/t/system_mysql_db_fix50030.test:
old timestamp(X) is no longer supported
mysql-test/t/system_mysql_db_fix50117.test:
old timestamp(X) is no longer supported
mysql-test/t/type_blob.test:
old timestamp(X) is no longer supported
mysql-test/t/type_timestamp.test:
old timestamp(X) is no longer supported
mysys/my_getsystime.c:
functions to get the time with microsecond precision
mysys/my_init.c:
move the my_getsystime.c initialization code to my_getsystime.c
mysys/my_static.c:
no need to make these variables extern
mysys/my_static.h:
no need to make these variables extern
scripts/mysql_system_tables.sql:
old timestamp(X) is no longer supported
scripts/mysql_system_tables_fix.sql:
old timestamp(X) is no longer supported
scripts/mysqlhotcopy.sh:
old timestamp(X) is no longer supported
sql-common/my_time.c:
* call str_to_time from str_to_datetime, as appropriate
* date/time to string conversions take precision as an argument
* number_to_time()
* TIME_to_double()
* pack_time() and unpack_time()
sql/event_data_objects.cc:
cast is not needed
my_datetime_to_str() takes precision as an argument
sql/event_db_repository.cc:
avoid dangerous downcast (because the pointer is
not always Field_timestamp, see events_1.test)
sql/event_queue.cc:
avoid silly double-work for cond_wait
(having an endpoint of wait, subtract the current time to get the timeout,
and use set_timespec() macro to fill in struct timespec, by adding the current
time to the timeout)
sql/field.cc:
* remove virtual Field::get_time(), everyone should use only Field::get_date()
* remove lots of #ifdef WORDS_BIGENDIAN
* unified the warnings from Field_timestamp/datetime/time/date/newdate store methods
* Field_timestamp_hires, Field_datetime_hires, Field_time_hires
* Field_temporal
* make_truncated_value_warning and Field::set_datetime_warning use Lazy_string as an argument, removed char*/int/double variants
sql/field.h:
* remove virtual Field::get_time(), everyone should use only Field::get_date()
* remove lots of #ifdef WORDS_BIGENDIAN
* unified the warnings from Field_timestamp/datetime/time/date/newdate store methods
* Field_timestamp_hires, Field_datetime_hires, Field_time_hires
* Field_temporal
* make_truncated_value_warning and Field::set_datetime_warning use Lazy_string as an argument, removed char*/int/double variants
* removed Field::can_be_compared_as_longlong(). Use Field::cmp_type() == INT_RESULT instead
sql/filesort.cc:
TIME_RESULT, cmp_time()
sql/item.cc:
* numbers aren't quoted in EXPLAIN EXTENDED
* Item::cmp_result() instead of Item::is_datetime() and Item::result_as_longlong()
* virtual Item::get_time() is gone
* Item_param::field_type() is set correctly
* Item_datetime, for a datetime constant
* time to anything is compared as a time
* Item_cache::print() prints the value is available
* bug fixed in Item_cache_int::val_str()
sql/item.h:
* Item::print_value(), to be used from Item_xxx::print() when needed
* Item::cmp_result() instead of Item::is_datetime() and Item::result_as_longlong()
* virtual Item::get_time() is gone
* Item_datetime, for a datetime constant
* better default for cast_to_int_type()
* Item_cache objects now *always* have the field_type() set
sql/item_cmpfunc.cc:
* get_year_value, get_time_value are gone. get_datetime_value does it all
* get_value_a_func, get_value_b_func are gone
* can_compare_as_dates() is gone too, TIME_RESULT is used instead
* cmp_type() instead or result_type() when doing a comparison
* compare_datetime and compate_e_datetime in the comparator_matrix, is_nulls_eq is gone
* Item::cmp_result() instead of Item::is_datetime() and Item::result_as_longlong()
sql/item_cmpfunc.h:
greatly simplified Arg_comparator
sql/item_create.cc:
* fix a bug in error messages in CAST
sql/item_func.cc:
Item::cmp_result() instead of Item::is_datetime() and Item::result_as_longlong()
mention all possibitiles in switch over Item_result values, or use default:
sql/item_row.h:
overwrite the default cmp_type() for Item_row,
as no MYSQL_TYPE_xxx value corresponds to ROW_RESULT
sql/item_timefunc.cc:
rewrite make_datetime to support precision argument
SEC_TO_TIME is real function, not integer.
many functions that returned temporal values had duplicate code in val_* methods,
some of them did not have get_date() which resulted in unnecessary date->str->date conversions.
Now they all are derived from Item_temporal_func and *only* provide get_date, not val* methods.
many fixes to set decimals (datetime precision) correctly.
sql/item_timefunc.h:
SEC_TO_TIME is real function, not integer.
many functions that returned temporal values had duplicate code in val_* methods,
some of them did not have get_date() which resulted in unnecessary date->str->date conversions.
Now they all are derived from Item_temporal_func and *only* provide get_date, not val* methods.
many fixes to set decimals (datetime precision) correctly.
sql/log_event.cc:
replication of NOW(6)
sql/log_event.h:
replication of NOW(6)
sql/mysql_priv.h:
Lazy_string class to pass a value (string, number, time) polymorphically down the stack.
make_truncated_value_warning() that uses it.
sql/mysqld.cc:
datetime in Arg_comparator::comparator_matrix
sql/opt_range.cc:
cleanup: don't disable warnings before calling save_in_field_no_warnings()
sql/protocol.cc:
Protocol::store(time) now takes the precision as an argument
sql/protocol.h:
Protocol::store(time) now takes the precision as an argument
sql/rpl_rli.cc:
small cleanup
sql/set_var.cc:
SET TIMESTAMP=double
sql/set_var.h:
@@TIMESTAMP is a double
sql/share/errmsg.txt:
precision and scale are unsigned
sql/slave.cc:
replication of NOW(6)
sql/sp_head.cc:
cleanup
sql/sql_class.cc:
support for NOW(6)
sql/sql_class.h:
support for NOW(6)
sql/sql_insert.cc:
support for NOW(6)
sql/sql_select.cc:
use item->cmp_type().
move a comment where it belongs
sql/sql_show.cc:
new column I_S.COLUMNS.DATETIME_PRECISION
sql/sql_yacc.yy:
TIME(X), DATETIME(X), cast, NOW(X), CURTIME(X), etc
sql/time.cc:
fix date_add_interval() to support MYSQL_TIMESTAMP_TIME argument
storage/myisam/ha_myisam.cc:
TIMESTAMP no longer carries ZEROFIELD flag, still we keep MYI file compatible.
strings/my_vsnprintf.c:
warnings
tests/mysql_client_test.c:
old timestamp(X) does not work anymore
datetime is no longer equal to time
2011-03-01 13:24:36 +01:00
|
|
|
if (!(event_creation_time == 0 IF_DBUG(&& debug_not_change_ts_if_art_event > 0)))
|
2007-10-13 22:12:50 +02:00
|
|
|
last_master_timestamp= event_creation_time;
|
2007-04-12 08:58:04 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-10-31 12:23:14 +01:00
|
|
|
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
|
2007-08-16 07:37:50 +02:00
|
|
|
void Relay_log_info::cleanup_context(THD *thd, bool error)
|
2006-10-31 12:23:14 +01:00
|
|
|
{
|
2007-08-16 07:37:50 +02:00
|
|
|
DBUG_ENTER("Relay_log_info::cleanup_context");
|
2006-10-31 12:23:14 +01:00
|
|
|
|
|
|
|
DBUG_ASSERT(sql_thd == thd);
|
|
|
|
/*
|
2007-03-30 15:29:30 +02:00
|
|
|
1) Instances of Table_map_log_event, if ::do_apply_event() was called on them,
|
2006-10-31 12:23:14 +01:00
|
|
|
may have opened tables, which we cannot be sure have been closed (because
|
|
|
|
maybe the Rows_log_event have not been found or will not be, because slave
|
|
|
|
SQL thread is stopping, or relay log has a missing tail etc). So we close
|
|
|
|
all thread's tables. And so the table mappings have to be cancelled.
|
2007-03-30 15:29:30 +02:00
|
|
|
2) Rows_log_event::do_apply_event() may even have started statements or
|
2006-10-31 12:23:14 +01:00
|
|
|
transactions on them, which we need to rollback in case of error.
|
|
|
|
3) If finding a Format_description_log_event after a BEGIN, we also need
|
|
|
|
to rollback before continuing with the next events.
|
|
|
|
4) so we need this "context cleanup" function.
|
|
|
|
*/
|
|
|
|
if (error)
|
|
|
|
{
|
|
|
|
ha_autocommit_or_rollback(thd, 1); // if a "statement transaction"
|
|
|
|
end_trans(thd, ROLLBACK); // if a "real transaction"
|
|
|
|
}
|
|
|
|
m_table_map.clear_tables();
|
|
|
|
close_thread_tables(thd);
|
|
|
|
clear_tables_to_lock();
|
2007-04-12 08:58:04 +02:00
|
|
|
clear_flag(IN_STMT);
|
2007-12-12 11:14:59 +01:00
|
|
|
/*
|
|
|
|
Cleanup for the flags that have been set at do_apply_event.
|
|
|
|
*/
|
|
|
|
thd->options&= ~OPTION_NO_FOREIGN_KEY_CHECKS;
|
|
|
|
thd->options&= ~OPTION_RELAXED_UNIQUE_CHECKS;
|
2007-01-17 15:06:37 +01:00
|
|
|
last_event_start_time= 0;
|
2006-10-31 12:23:14 +01:00
|
|
|
DBUG_VOID_RETURN;
|
|
|
|
}
|
2007-02-26 17:44:55 +01:00
|
|
|
|
2007-08-16 07:37:50 +02:00
|
|
|
void Relay_log_info::clear_tables_to_lock()
|
2007-02-26 17:44:55 +01:00
|
|
|
{
|
|
|
|
while (tables_to_lock)
|
|
|
|
{
|
WL#3817: Simplify string / memory area types and make things more consistent (first part)
The following type conversions was done:
- Changed byte to uchar
- Changed gptr to uchar*
- Change my_string to char *
- Change my_size_t to size_t
- Change size_s to size_t
Removed declaration of byte, gptr, my_string, my_size_t and size_s.
Following function parameter changes was done:
- All string functions in mysys/strings was changed to use size_t
instead of uint for string lengths.
- All read()/write() functions changed to use size_t (including vio).
- All protocoll functions changed to use size_t instead of uint
- Functions that used a pointer to a string length was changed to use size_t*
- Changed malloc(), free() and related functions from using gptr to use void *
as this requires fewer casts in the code and is more in line with how the
standard functions work.
- Added extra length argument to dirname_part() to return the length of the
created string.
- Changed (at least) following functions to take uchar* as argument:
- db_dump()
- my_net_write()
- net_write_command()
- net_store_data()
- DBUG_DUMP()
- decimal2bin() & bin2decimal()
- Changed my_compress() and my_uncompress() to use size_t. Changed one
argument to my_uncompress() from a pointer to a value as we only return
one value (makes function easier to use).
- Changed type of 'pack_data' argument to packfrm() to avoid casts.
- Changed in readfrm() and writefrom(), ha_discover and handler::discover()
the type for argument 'frmdata' to uchar** to avoid casts.
- Changed most Field functions to use uchar* instead of char* (reduced a lot of
casts).
- Changed field->val_xxx(xxx, new_ptr) to take const pointers.
Other changes:
- Removed a lot of not needed casts
- Added a few new cast required by other changes
- Added some cast to my_multi_malloc() arguments for safety (as string lengths
needs to be uint, not size_t).
- Fixed all calls to hash-get-key functions to use size_t*. (Needed to be done
explicitely as this conflict was often hided by casting the function to
hash_get_key).
- Changed some buffers to memory regions to uchar* to avoid casts.
- Changed some string lengths from uint to size_t.
- Changed field->ptr to be uchar* instead of char*. This allowed us to
get rid of a lot of casts.
- Some changes from true -> TRUE, false -> FALSE, unsigned char -> uchar
- Include zlib.h in some files as we needed declaration of crc32()
- Changed MY_FILE_ERROR to be (size_t) -1.
- Changed many variables to hold the result of my_read() / my_write() to be
size_t. This was needed to properly detect errors (which are
returned as (size_t) -1).
- Removed some very old VMS code
- Changed packfrm()/unpackfrm() to not be depending on uint size
(portability fix)
- Removed windows specific code to restore cursor position as this
causes slowdown on windows and we should not mix read() and pread()
calls anyway as this is not thread safe. Updated function comment to
reflect this. Changed function that depended on original behavior of
my_pwrite() to itself restore the cursor position (one such case).
- Added some missing checking of return value of malloc().
- Changed definition of MOD_PAD_CHAR_TO_FULL_LENGTH to avoid 'long' overflow.
- Changed type of table_def::m_size from my_size_t to ulong to reflect that
m_size is the number of elements in the array, not a string/memory
length.
- Moved THD::max_row_length() to table.cc (as it's not depending on THD).
Inlined max_row_length_blob() into this function.
- More function comments
- Fixed some compiler warnings when compiled without partitions.
- Removed setting of LEX_STRING() arguments in declaration (portability fix).
- Some trivial indentation/variable name changes.
- Some trivial code simplifications:
- Replaced some calls to alloc_root + memcpy to use
strmake_root()/strdup_root().
- Changed some calls from memdup() to strmake() (Safety fix)
- Simpler loops in client-simple.c
BitKeeper/etc/ignore:
added libmysqld/ha_ndbcluster_cond.cc
---
added debian/defs.mk debian/control
client/completion_hash.cc:
Remove not needed casts
client/my_readline.h:
Remove some old types
client/mysql.cc:
Simplify types
client/mysql_upgrade.c:
Remove some old types
Update call to dirname_part
client/mysqladmin.cc:
Remove some old types
client/mysqlbinlog.cc:
Remove some old types
Change some buffers to be uchar to avoid casts
client/mysqlcheck.c:
Remove some old types
client/mysqldump.c:
Remove some old types
Remove some not needed casts
Change some string lengths to size_t
client/mysqlimport.c:
Remove some old types
client/mysqlshow.c:
Remove some old types
client/mysqlslap.c:
Remove some old types
Remove some not needed casts
client/mysqltest.c:
Removed some old types
Removed some not needed casts
Updated hash-get-key function arguments
Updated parameters to dirname_part()
client/readline.cc:
Removed some old types
Removed some not needed casts
Changed some string lengths to use size_t
client/sql_string.cc:
Removed some old types
dbug/dbug.c:
Removed some old types
Changed some string lengths to use size_t
Changed some prototypes to avoid casts
extra/comp_err.c:
Removed some old types
extra/innochecksum.c:
Removed some old types
extra/my_print_defaults.c:
Removed some old types
extra/mysql_waitpid.c:
Removed some old types
extra/perror.c:
Removed some old types
extra/replace.c:
Removed some old types
Updated parameters to dirname_part()
extra/resolve_stack_dump.c:
Removed some old types
extra/resolveip.c:
Removed some old types
include/config-win.h:
Removed some old types
include/decimal.h:
Changed binary strings to be uchar* instead of char*
include/ft_global.h:
Removed some old types
include/hash.h:
Removed some old types
include/heap.h:
Removed some old types
Changed records_under_level to be 'ulong' instead of 'uint' to clarify usage of variable
include/keycache.h:
Removed some old types
include/m_ctype.h:
Removed some old types
Changed some string lengths to use size_t
Changed character length functions to return uint
unsigned char -> uchar
include/m_string.h:
Removed some old types
Changed some string lengths to use size_t
include/my_alloc.h:
Changed some string lengths to use size_t
include/my_base.h:
Removed some old types
include/my_dbug.h:
Removed some old types
Changed some string lengths to use size_t
Changed db_dump() to take uchar * as argument for memory to reduce number of casts in usage
include/my_getopt.h:
Removed some old types
include/my_global.h:
Removed old types:
my_size_t -> size_t
byte -> uchar
gptr -> uchar *
include/my_list.h:
Removed some old types
include/my_nosys.h:
Removed some old types
include/my_pthread.h:
Removed some old types
include/my_sys.h:
Removed some old types
Changed MY_FILE_ERROR to be in line with new definitions of my_write()/my_read()
Changed some string lengths to use size_t
my_malloc() / my_free() now uses void *
Updated parameters to dirname_part() & my_uncompress()
include/my_tree.h:
Removed some old types
include/my_trie.h:
Removed some old types
include/my_user.h:
Changed some string lengths to use size_t
include/my_vle.h:
Removed some old types
include/my_xml.h:
Removed some old types
Changed some string lengths to use size_t
include/myisam.h:
Removed some old types
include/myisammrg.h:
Removed some old types
include/mysql.h:
Removed some old types
Changed byte streams to use uchar* instead of char*
include/mysql_com.h:
Removed some old types
Changed some string lengths to use size_t
Changed some buffers to be uchar* to avoid casts
include/queues.h:
Removed some old types
include/sql_common.h:
Removed some old types
include/sslopt-longopts.h:
Removed some old types
include/violite.h:
Removed some old types
Changed some string lengths to use size_t
libmysql/client_settings.h:
Removed some old types
libmysql/libmysql.c:
Removed some old types
libmysql/manager.c:
Removed some old types
libmysqld/emb_qcache.cc:
Removed some old types
libmysqld/emb_qcache.h:
Removed some old types
libmysqld/lib_sql.cc:
Removed some old types
Removed some not needed casts
Changed some buffers to be uchar* to avoid casts
true -> TRUE, false -> FALSE
mysys/array.c:
Removed some old types
mysys/charset.c:
Changed some string lengths to use size_t
mysys/checksum.c:
Include zlib to get definition for crc32
Removed some old types
mysys/default.c:
Removed some old types
Changed some string lengths to use size_t
mysys/default_modify.c:
Changed some string lengths to use size_t
Removed some not needed casts
mysys/hash.c:
Removed some old types
Changed some string lengths to use size_t
Note: Prototype of hash_key() has changed which may cause problems if client uses hash_init() with a cast for the hash-get-key function.
hash_element now takes 'ulong' as the index type (cleanup)
mysys/list.c:
Removed some old types
mysys/mf_cache.c:
Changed some string lengths to use size_t
mysys/mf_dirname.c:
Removed some old types
Changed some string lengths to use size_t
Added argument to dirname_part() to avoid calculation of length for 'to'
mysys/mf_fn_ext.c:
Removed some old types
Updated parameters to dirname_part()
mysys/mf_format.c:
Removed some old types
Changed some string lengths to use size_t
mysys/mf_getdate.c:
Removed some old types
mysys/mf_iocache.c:
Removed some old types
Changed some string lengths to use size_t
Changed calculation of 'max_length' to be done the same way in all functions
mysys/mf_iocache2.c:
Removed some old types
Changed some string lengths to use size_t
Clean up comments
Removed not needed indentation
mysys/mf_keycache.c:
Removed some old types
mysys/mf_keycaches.c:
Removed some old types
mysys/mf_loadpath.c:
Removed some old types
mysys/mf_pack.c:
Removed some old types
Changed some string lengths to use size_t
Removed some not needed casts
Removed very old VMS code
Updated parameters to dirname_part()
Use result of dirnam_part() to remove call to strcat()
mysys/mf_path.c:
Removed some old types
mysys/mf_radix.c:
Removed some old types
mysys/mf_same.c:
Removed some old types
mysys/mf_sort.c:
Removed some old types
mysys/mf_soundex.c:
Removed some old types
mysys/mf_strip.c:
Removed some old types
mysys/mf_tempdir.c:
Removed some old types
mysys/mf_unixpath.c:
Removed some old types
mysys/mf_wfile.c:
Removed some old types
mysys/mulalloc.c:
Removed some old types
mysys/my_alloc.c:
Removed some old types
Changed some string lengths to use size_t
Use void* as type for allocated memory area
Removed some not needed casts
Changed argument 'Size' to 'length' according coding guidelines
mysys/my_chsize.c:
Changed some buffers to be uchar* to avoid casts
mysys/my_compress.c:
More comments
Removed some old types
Changed string lengths to use size_t
Changed arguments to my_uncompress() to make them easier to understand
Changed packfrm()/unpackfrm() to not be depending on uint size (portability fix)
Changed type of 'pack_data' argument to packfrm() to avoid casts.
mysys/my_conio.c:
Changed some string lengths to use size_t
mysys/my_create.c:
Removed some old types
mysys/my_div.c:
Removed some old types
mysys/my_error.c:
Removed some old types
mysys/my_fopen.c:
Removed some old types
mysys/my_fstream.c:
Removed some old types
Changed some string lengths to use size_t
writen -> written
mysys/my_getopt.c:
Removed some old types
mysys/my_getwd.c:
Removed some old types
More comments
mysys/my_init.c:
Removed some old types
mysys/my_largepage.c:
Removed some old types
Changed some string lengths to use size_t
mysys/my_lib.c:
Removed some old types
mysys/my_lockmem.c:
Removed some old types
mysys/my_malloc.c:
Removed some old types
Changed malloc(), free() and related functions to use void *
Changed all functions to use size_t
mysys/my_memmem.c:
Indentation cleanup
mysys/my_once.c:
Removed some old types
Changed malloc(), free() and related functions to use void *
mysys/my_open.c:
Removed some old types
mysys/my_pread.c:
Removed some old types
Changed all functions to use size_t
Added comment for how my_pread() / my_pwrite() are supposed to work.
Removed windows specific code to restore cursor position as this causes slowdown on windows and we should not mix read() and pread() calls anyway as this is not thread safe.
(If we ever would really need this, it should be enabled only with a flag argument)
mysys/my_quick.c:
Removed some old types
Changed all functions to use size_t
mysys/my_read.c:
Removed some old types
Changed all functions to use size_t
mysys/my_realloc.c:
Removed some old types
Use void* as type for allocated memory area
Changed all functions to use size_t
mysys/my_static.c:
Removed some old types
mysys/my_static.h:
Removed some old types
mysys/my_vle.c:
Removed some old types
mysys/my_wincond.c:
Removed some old types
mysys/my_windac.c:
Removed some old types
mysys/my_write.c:
Removed some old types
Changed all functions to use size_t
mysys/ptr_cmp.c:
Removed some old types
Changed all functions to use size_t
mysys/queues.c:
Removed some old types
mysys/safemalloc.c:
Removed some old types
Changed malloc(), free() and related functions to use void *
Changed all functions to use size_t
mysys/string.c:
Removed some old types
Changed all functions to use size_t
mysys/testhash.c:
Removed some old types
mysys/thr_alarm.c:
Removed some old types
mysys/thr_lock.c:
Removed some old types
mysys/tree.c:
Removed some old types
mysys/trie.c:
Removed some old types
mysys/typelib.c:
Removed some old types
plugin/daemon_example/daemon_example.cc:
Removed some old types
regex/reginit.c:
Removed some old types
server-tools/instance-manager/buffer.cc:
Changed some string lengths to use size_t
Changed buffer to be of type uchar*
server-tools/instance-manager/buffer.h:
Changed some string lengths to use size_t
Changed buffer to be of type uchar*
server-tools/instance-manager/commands.cc:
Removed some old types
Changed some string lengths to use size_t
Changed buffer to be of type uchar*
server-tools/instance-manager/instance_map.cc:
Removed some old types
Changed some string lengths to use size_t
Changed buffer to be of type uchar*
server-tools/instance-manager/instance_options.cc:
Changed buffer to be of type uchar*
Replaced alloc_root + strcpy() with strdup_root()
server-tools/instance-manager/mysql_connection.cc:
Changed buffer to be of type uchar*
server-tools/instance-manager/options.cc:
Removed some old types
server-tools/instance-manager/parse.cc:
Changed some string lengths to use size_t
server-tools/instance-manager/parse.h:
Removed some old types
Changed some string lengths to use size_t
server-tools/instance-manager/protocol.cc:
Changed some buffers to be uchar* to avoid casts
Changed some string lengths to use size_t
server-tools/instance-manager/protocol.h:
Changed some string lengths to use size_t
server-tools/instance-manager/user_map.cc:
Removed some old types
Changed some string lengths to use size_t
sql/derror.cc:
Removed some old types
Changed some buffers to be uchar* to avoid casts
Changed some string lengths to use size_t
sql/discover.cc:
Changed in readfrm() and writefrom() the type for argument 'frmdata' to uchar** to avoid casts
Changed some string lengths to use size_t
Changed some buffers to be uchar* to avoid casts
sql/event_data_objects.cc:
Removed some old types
Added missing casts for alloc() and sprintf()
sql/event_db_repository.cc:
Changed some buffers to be uchar* to avoid casts
Added missing casts for sprintf()
sql/event_queue.cc:
Removed some old types
sql/field.cc:
Removed some old types
Changed memory buffers to be uchar*
Changed some string lengths to use size_t
Removed a lot of casts
Safety fix in Field_blob::val_decimal() to not access zero pointer
sql/field.h:
Removed some old types
Changed memory buffers to be uchar* (except of store() as this would have caused too many other changes).
Changed some string lengths to use size_t
Removed some not needed casts
Changed val_xxx(xxx, new_ptr) to take const pointers
sql/field_conv.cc:
Removed some old types
Added casts required because memory area pointers are now uchar*
sql/filesort.cc:
Initalize variable that was used unitialized in error conditions
sql/gen_lex_hash.cc:
Removed some old types
Changed memory buffers to be uchar*
Changed some string lengths to use size_t
Removed a lot of casts
Safety fix in Field_blob::val_decimal() to not access zero pointer
sql/gstream.h:
Added required cast
sql/ha_ndbcluster.cc:
Removed some old types
Updated hash-get-key function arguments
Changed some buffers to be uchar* to avoid casts
Added required casts
Removed some not needed casts
sql/ha_ndbcluster.h:
Removed some old types
sql/ha_ndbcluster_binlog.cc:
Removed some old types
Changed some buffers to be uchar* to avoid casts
Replaced sql_alloc() + memcpy() + set end 0 with sql_strmake()
Changed some string lengths to use size_t
Added missing casts for alloc() and sprintf()
sql/ha_ndbcluster_binlog.h:
Removed some old types
sql/ha_ndbcluster_cond.cc:
Removed some old types
Removed some not needed casts
sql/ha_ndbcluster_cond.h:
Removed some old types
sql/ha_partition.cc:
Removed some old types
Changed prototype for change_partition() to avoid casts
sql/ha_partition.h:
Removed some old types
sql/handler.cc:
Removed some old types
Changed some string lengths to use size_t
sql/handler.h:
Removed some old types
Changed some string lengths to use size_t
Changed type for 'frmblob' parameter for discover() and ha_discover() to get fewer casts
sql/hash_filo.h:
Removed some old types
Changed all functions to use size_t
sql/hostname.cc:
Removed some old types
sql/item.cc:
Removed some old types
Changed some string lengths to use size_t
Use strmake() instead of memdup() to create a null terminated string.
Updated calls to new Field()
sql/item.h:
Removed some old types
Changed malloc(), free() and related functions to use void *
Changed some buffers to be uchar* to avoid casts
sql/item_cmpfunc.cc:
Removed some old types
Changed some buffers to be uchar* to avoid casts
sql/item_cmpfunc.h:
Removed some old types
sql/item_create.cc:
Removed some old types
sql/item_func.cc:
Removed some old types
Changed some buffers to be uchar* to avoid casts
Removed some not needed casts
Added test for failing alloc() in init_result_field()
Remove old confusing comment
Fixed compiler warning
sql/item_func.h:
Removed some old types
sql/item_row.cc:
Removed some old types
sql/item_row.h:
Removed some old types
sql/item_strfunc.cc:
Include zlib (needed becasue we call crc32)
Removed some old types
sql/item_strfunc.h:
Removed some old types
Changed some types to match new function prototypes
sql/item_subselect.cc:
Removed some old types
sql/item_subselect.h:
Removed some old types
sql/item_sum.cc:
Removed some old types
Changed some buffers to be uchar* to avoid casts
Removed some not needed casts
sql/item_sum.h:
Removed some old types
sql/item_timefunc.cc:
Removed some old types
Changed some string lengths to use size_t
sql/item_timefunc.h:
Removed some old types
sql/item_xmlfunc.cc:
Changed some string lengths to use size_t
sql/item_xmlfunc.h:
Removed some old types
sql/key.cc:
Removed some old types
Removed some not needed casts
sql/lock.cc:
Removed some old types
Added some cast to my_multi_malloc() arguments for safety
sql/log.cc:
Removed some old types
Changed some string lengths to use size_t
Changed some buffers to be uchar* to avoid casts
Changed usage of pwrite() to not assume it holds the cursor position for the file
Made usage of my_read() safer
sql/log_event.cc:
Removed some old types
Added checking of return value of malloc() in pack_info()
Changed some buffers to be uchar* to avoid casts
Removed some 'const' to avoid casts
Added missing casts for alloc() and sprintf()
Added required casts
Removed some not needed casts
Added some cast to my_multi_malloc() arguments for safety
sql/log_event.h:
Removed some old types
Changed some buffers to be uchar* to avoid casts
sql/log_event_old.cc:
Changed some buffers to be uchar* to avoid casts
Removed some not needed casts
sql/log_event_old.h:
Changed some buffers to be uchar* to avoid casts
sql/mf_iocache.cc:
Removed some old types
sql/my_decimal.cc:
Changed memory area to use uchar*
sql/my_decimal.h:
Changed memory area to use uchar*
sql/mysql_priv.h:
Removed some old types
Changed malloc(), free() and related functions to use void *
Changed some string lengths to use size_t
Changed definition of MOD_PAD_CHAR_TO_FULL_LENGTH to avoid long overflow
Changed some buffers to be uchar* to avoid casts
sql/mysqld.cc:
Removed some old types
sql/net_serv.cc:
Removed some old types
Changed some string lengths to use size_t
Changed some buffers to be uchar* to avoid casts
Ensure that vio_read()/vio_write() return values are stored in a size_t variable
Removed some not needed casts
sql/opt_range.cc:
Removed some old types
Changed some buffers to be uchar* to avoid casts
Removed some not needed casts
sql/opt_range.h:
Removed some old types
Changed some buffers to be uchar* to avoid casts
sql/opt_sum.cc:
Removed some old types
Removed some not needed casts
sql/parse_file.cc:
Removed some old types
Changed some string lengths to use size_t
Changed alloc_root + memcpy + set end 0 -> strmake_root()
sql/parse_file.h:
Removed some old types
sql/partition_info.cc:
Removed some old types
Added missing casts for alloc()
Changed some buffers to be uchar* to avoid casts
sql/partition_info.h:
Changed some buffers to be uchar* to avoid casts
sql/protocol.cc:
Removed some old types
Changed some buffers to be uchar* to avoid casts
Removed some not needed casts
sql/protocol.h:
Removed some old types
Changed some buffers to be uchar* to avoid casts
Changed some string lengths to use size_t
sql/records.cc:
Removed some old types
sql/repl_failsafe.cc:
Removed some old types
Changed some string lengths to use size_t
Added required casts
sql/rpl_filter.cc:
Removed some old types
Updated hash-get-key function arguments
Changed some string lengths to use size_t
sql/rpl_filter.h:
Changed some string lengths to use size_t
sql/rpl_injector.h:
Removed some old types
sql/rpl_record.cc:
Removed some old types
Removed some not needed casts
Changed some buffers to be uchar* to avoid casts
sql/rpl_record.h:
Removed some old types
Changed some buffers to be uchar* to avoid casts
sql/rpl_record_old.cc:
Removed some old types
Changed some buffers to be uchar* to avoid casts
Removed some not needed casts
sql/rpl_record_old.h:
Removed some old types
Changed some buffers to be uchar* to avoid cast
sql/rpl_rli.cc:
Removed some old types
sql/rpl_tblmap.cc:
Removed some old types
sql/rpl_tblmap.h:
Removed some old types
sql/rpl_utility.cc:
Removed some old types
sql/rpl_utility.h:
Removed some old types
Changed type of m_size from my_size_t to ulong to reflect that m_size is the number of elements in the array, not a string/memory length
sql/set_var.cc:
Removed some old types
Updated parameters to dirname_part()
sql/set_var.h:
Removed some old types
sql/slave.cc:
Removed some old types
Changed some string lengths to use size_t
sql/slave.h:
Removed some old types
sql/sp.cc:
Removed some old types
Added missing casts for printf()
sql/sp.h:
Removed some old types
Updated hash-get-key function arguments
sql/sp_cache.cc:
Removed some old types
Added missing casts for printf()
Updated hash-get-key function arguments
sql/sp_head.cc:
Removed some old types
Added missing casts for alloc() and printf()
Added required casts
Updated hash-get-key function arguments
sql/sp_head.h:
Removed some old types
sql/sp_pcontext.cc:
Removed some old types
sql/sp_pcontext.h:
Removed some old types
sql/sql_acl.cc:
Removed some old types
Changed some string lengths to use size_t
Changed some buffers to be uchar* to avoid casts
Removed some not needed casts
Added required casts
sql/sql_analyse.cc:
Changed some buffers to be uchar* to avoid casts
sql/sql_analyse.h:
Changed some buffers to be uchar* to avoid casts
sql/sql_array.h:
Removed some old types
sql/sql_base.cc:
Removed some old types
Updated hash-get-key function arguments
sql/sql_binlog.cc:
Removed some old types
Added missing casts for printf()
sql/sql_cache.cc:
Removed some old types
Updated hash-get-key function arguments
Removed some not needed casts
Changed some string lengths to use size_t
sql/sql_cache.h:
Removed some old types
Removed reference to not existing function cache_key()
Updated hash-get-key function arguments
sql/sql_class.cc:
Removed some old types
Updated hash-get-key function arguments
Added missing casts for alloc()
Updated hash-get-key function arguments
Moved THD::max_row_length() to table.cc (as it's not depending on THD)
Removed some not needed casts
sql/sql_class.h:
Removed some old types
Changed malloc(), free() and related functions to use void *
Removed some not needed casts
Changed some string lengths to use size_t
Moved max_row_length and max_row_length_blob() to table.cc, as they are not depending on THD
sql/sql_connect.cc:
Removed some old types
Added required casts
sql/sql_db.cc:
Removed some old types
Removed some not needed casts
Added some cast to my_multi_malloc() arguments for safety
Added missing casts for alloc()
sql/sql_delete.cc:
Removed some old types
sql/sql_handler.cc:
Removed some old types
Updated hash-get-key function arguments
Added some cast to my_multi_malloc() arguments for safety
sql/sql_help.cc:
Removed some old types
Changed some buffers to be uchar* to avoid casts
Removed some not needed casts
sql/sql_insert.cc:
Removed some old types
Added missing casts for alloc() and printf()
sql/sql_lex.cc:
Removed some old types
sql/sql_lex.h:
Removed some old types
Removed some not needed casts
sql/sql_list.h:
Removed some old types
Removed some not needed casts
sql/sql_load.cc:
Removed some old types
Removed compiler warning
sql/sql_manager.cc:
Removed some old types
sql/sql_map.cc:
Removed some old types
sql/sql_map.h:
Removed some old types
sql/sql_olap.cc:
Removed some old types
sql/sql_parse.cc:
Removed some old types
Trivial move of code lines to make things more readable
Changed some string lengths to use size_t
Added missing casts for alloc()
sql/sql_partition.cc:
Removed some old types
Removed compiler warnings about not used functions
Changed some buffers to be uchar* to avoid casts
Removed some not needed casts
sql/sql_partition.h:
Removed some old types
Changed some buffers to be uchar* to avoid casts
sql/sql_plugin.cc:
Removed some old types
Added missing casts for alloc()
Updated hash-get-key function arguments
sql/sql_prepare.cc:
Removed some old types
Changed some buffers to be uchar* to avoid casts
Added missing casts for alloc() and printf()
sql-common/client.c:
Removed some old types
Changed some memory areas to use uchar*
sql-common/my_user.c:
Changed some string lengths to use size_t
sql-common/pack.c:
Changed some buffers to be uchar* to avoid casts
sql/sql_repl.cc:
Added required casts
Changed some buffers to be uchar* to avoid casts
Changed some string lengths to use size_t
sql/sql_select.cc:
Removed some old types
Changed some buffers to be uchar* to avoid casts
Removed some old types
sql/sql_select.h:
Removed some old types
Changed some buffers to be uchar* to avoid casts
sql/sql_servers.cc:
Removed some old types
Updated hash-get-key function arguments
sql/sql_show.cc:
Removed some old types
Added missing casts for alloc()
Removed some not needed casts
sql/sql_string.cc:
Removed some old types
Added required casts
sql/sql_table.cc:
Removed some old types
Removed compiler warning about not used variable
Changed some buffers to be uchar* to avoid casts
Removed some not needed casts
sql/sql_test.cc:
Removed some old types
sql/sql_trigger.cc:
Removed some old types
Added missing casts for alloc()
sql/sql_udf.cc:
Removed some old types
Updated hash-get-key function arguments
sql/sql_union.cc:
Removed some old types
sql/sql_update.cc:
Removed some old types
Removed some not needed casts
sql/sql_view.cc:
Removed some old types
sql/sql_yacc.yy:
Removed some old types
Changed some string lengths to use size_t
Added missing casts for alloc()
sql/stacktrace.c:
Removed some old types
sql/stacktrace.h:
Removed some old types
sql/structs.h:
Removed some old types
sql/table.cc:
Removed some old types
Updated hash-get-key function arguments
Changed some buffers to be uchar* to avoid casts
Removed setting of LEX_STRING() arguments in declaration
Added required casts
More function comments
Moved max_row_length() here from sql_class.cc/sql_class.h
sql/table.h:
Removed some old types
Changed some string lengths to use size_t
sql/thr_malloc.cc:
Use void* as type for allocated memory area
Changed all functions to use size_t
sql/tzfile.h:
Changed some buffers to be uchar* to avoid casts
sql/tztime.cc:
Changed some buffers to be uchar* to avoid casts
Updated hash-get-key function arguments
Added missing casts for alloc()
Removed some not needed casts
sql/uniques.cc:
Removed some old types
Removed some not needed casts
sql/unireg.cc:
Removed some old types
Changed some buffers to be uchar* to avoid casts
Removed some not needed casts
Added missing casts for alloc()
storage/archive/archive_reader.c:
Removed some old types
storage/archive/azio.c:
Removed some old types
Removed some not needed casts
storage/archive/ha_archive.cc:
Removed some old types
Changed type for 'frmblob' in archive_discover() to match handler
Updated hash-get-key function arguments
Removed some not needed casts
storage/archive/ha_archive.h:
Removed some old types
storage/blackhole/ha_blackhole.cc:
Removed some old types
storage/blackhole/ha_blackhole.h:
Removed some old types
storage/csv/ha_tina.cc:
Removed some old types
Updated hash-get-key function arguments
Changed some buffers to be uchar* to avoid casts
storage/csv/ha_tina.h:
Removed some old types
Removed some not needed casts
storage/csv/transparent_file.cc:
Removed some old types
Changed type of 'bytes_read' to be able to detect read errors
Fixed indentation
storage/csv/transparent_file.h:
Removed some old types
storage/example/ha_example.cc:
Removed some old types
Updated hash-get-key function arguments
storage/example/ha_example.h:
Removed some old types
storage/federated/ha_federated.cc:
Removed some old types
Updated hash-get-key function arguments
Removed some not needed casts
storage/federated/ha_federated.h:
Removed some old types
storage/heap/_check.c:
Changed some buffers to be uchar* to avoid casts
storage/heap/_rectest.c:
Removed some old types
storage/heap/ha_heap.cc:
Removed some old types
storage/heap/ha_heap.h:
Removed some old types
storage/heap/heapdef.h:
Removed some old types
storage/heap/hp_block.c:
Removed some old types
Changed some string lengths to use size_t
storage/heap/hp_clear.c:
Removed some old types
storage/heap/hp_close.c:
Removed some old types
storage/heap/hp_create.c:
Removed some old types
storage/heap/hp_delete.c:
Removed some old types
storage/heap/hp_hash.c:
Removed some old types
storage/heap/hp_info.c:
Removed some old types
storage/heap/hp_open.c:
Removed some old types
storage/heap/hp_rfirst.c:
Removed some old types
storage/heap/hp_rkey.c:
Removed some old types
storage/heap/hp_rlast.c:
Removed some old types
storage/heap/hp_rnext.c:
Removed some old types
storage/heap/hp_rprev.c:
Removed some old types
storage/heap/hp_rrnd.c:
Removed some old types
storage/heap/hp_rsame.c:
Removed some old types
storage/heap/hp_scan.c:
Removed some old types
storage/heap/hp_test1.c:
Removed some old types
storage/heap/hp_test2.c:
Removed some old types
storage/heap/hp_update.c:
Removed some old types
storage/heap/hp_write.c:
Removed some old types
Changed some string lengths to use size_t
storage/innobase/handler/ha_innodb.cc:
Removed some old types
Updated hash-get-key function arguments
Added missing casts for alloc() and printf()
Removed some not needed casts
storage/innobase/handler/ha_innodb.h:
Removed some old types
storage/myisam/ft_boolean_search.c:
Removed some old types
storage/myisam/ft_nlq_search.c:
Removed some old types
storage/myisam/ft_parser.c:
Removed some old types
Changed some buffers to be uchar* to avoid casts
storage/myisam/ft_static.c:
Removed some old types
storage/myisam/ft_stopwords.c:
Removed some old types
storage/myisam/ft_update.c:
Removed some old types
Changed some buffers to be uchar* to avoid casts
storage/myisam/ftdefs.h:
Removed some old types
Changed some buffers to be uchar* to avoid casts
storage/myisam/fulltext.h:
Removed some old types
storage/myisam/ha_myisam.cc:
Removed some old types
storage/myisam/ha_myisam.h:
Removed some old types
storage/myisam/mi_cache.c:
Removed some old types
Changed some buffers to be uchar* to avoid casts
storage/myisam/mi_check.c:
Removed some old types
storage/myisam/mi_checksum.c:
Removed some old types
storage/myisam/mi_close.c:
Removed some old types
storage/myisam/mi_create.c:
Removed some old types
storage/myisam/mi_delete.c:
Removed some old types
storage/myisam/mi_delete_all.c:
Removed some old types
storage/myisam/mi_dynrec.c:
Removed some old types
storage/myisam/mi_extra.c:
Removed some old types
storage/myisam/mi_key.c:
Removed some old types
storage/myisam/mi_locking.c:
Removed some old types
storage/myisam/mi_log.c:
Removed some old types
storage/myisam/mi_open.c:
Removed some old types
Removed some not needed casts
Check argument of my_write()/my_pwrite() in functions returning int
Added casting of string lengths to size_t
storage/myisam/mi_packrec.c:
Removed some old types
Changed some buffers to be uchar* to avoid casts
storage/myisam/mi_page.c:
Removed some old types
storage/myisam/mi_preload.c:
Removed some old types
storage/myisam/mi_range.c:
Removed some old types
storage/myisam/mi_rfirst.c:
Removed some old types
storage/myisam/mi_rkey.c:
Removed some old types
storage/myisam/mi_rlast.c:
Removed some old types
storage/myisam/mi_rnext.c:
Removed some old types
storage/myisam/mi_rnext_same.c:
Removed some old types
storage/myisam/mi_rprev.c:
Removed some old types
storage/myisam/mi_rrnd.c:
Removed some old types
storage/myisam/mi_rsame.c:
Removed some old types
storage/myisam/mi_rsamepos.c:
Removed some old types
storage/myisam/mi_scan.c:
Removed some old types
storage/myisam/mi_search.c:
Removed some old types
storage/myisam/mi_static.c:
Removed some old types
storage/myisam/mi_statrec.c:
Removed some old types
storage/myisam/mi_test1.c:
Removed some old types
storage/myisam/mi_test2.c:
Removed some old types
storage/myisam/mi_test3.c:
Removed some old types
storage/myisam/mi_unique.c:
Removed some old types
storage/myisam/mi_update.c:
Removed some old types
storage/myisam/mi_write.c:
Removed some old types
storage/myisam/myisam_ftdump.c:
Removed some old types
storage/myisam/myisamchk.c:
Removed some old types
storage/myisam/myisamdef.h:
Removed some old types
storage/myisam/myisamlog.c:
Removed some old types
Indentation fix
storage/myisam/myisampack.c:
Removed some old types
storage/myisam/rt_index.c:
Removed some old types
storage/myisam/rt_split.c:
Removed some old types
storage/myisam/sort.c:
Removed some old types
storage/myisam/sp_defs.h:
Removed some old types
storage/myisam/sp_key.c:
Removed some old types
storage/myisammrg/ha_myisammrg.cc:
Removed some old types
storage/myisammrg/ha_myisammrg.h:
Removed some old types
storage/myisammrg/myrg_close.c:
Removed some old types
storage/myisammrg/myrg_def.h:
Removed some old types
storage/myisammrg/myrg_delete.c:
Removed some old types
storage/myisammrg/myrg_open.c:
Removed some old types
Updated parameters to dirname_part()
storage/myisammrg/myrg_queue.c:
Removed some old types
storage/myisammrg/myrg_rfirst.c:
Removed some old types
storage/myisammrg/myrg_rkey.c:
Removed some old types
storage/myisammrg/myrg_rlast.c:
Removed some old types
storage/myisammrg/myrg_rnext.c:
Removed some old types
storage/myisammrg/myrg_rnext_same.c:
Removed some old types
storage/myisammrg/myrg_rprev.c:
Removed some old types
storage/myisammrg/myrg_rrnd.c:
Removed some old types
storage/myisammrg/myrg_rsame.c:
Removed some old types
storage/myisammrg/myrg_update.c:
Removed some old types
storage/myisammrg/myrg_write.c:
Removed some old types
storage/ndb/include/util/ndb_opts.h:
Removed some old types
storage/ndb/src/cw/cpcd/main.cpp:
Removed some old types
storage/ndb/src/kernel/vm/Configuration.cpp:
Removed some old types
storage/ndb/src/mgmclient/main.cpp:
Removed some old types
storage/ndb/src/mgmsrv/InitConfigFileParser.cpp:
Removed some old types
Removed old disabled code
storage/ndb/src/mgmsrv/main.cpp:
Removed some old types
storage/ndb/src/ndbapi/NdbBlob.cpp:
Removed some old types
storage/ndb/src/ndbapi/NdbOperationDefine.cpp:
Removed not used variable
storage/ndb/src/ndbapi/NdbOperationInt.cpp:
Added required casts
storage/ndb/src/ndbapi/NdbScanOperation.cpp:
Added required casts
storage/ndb/tools/delete_all.cpp:
Removed some old types
storage/ndb/tools/desc.cpp:
Removed some old types
storage/ndb/tools/drop_index.cpp:
Removed some old types
storage/ndb/tools/drop_tab.cpp:
Removed some old types
storage/ndb/tools/listTables.cpp:
Removed some old types
storage/ndb/tools/ndb_config.cpp:
Removed some old types
storage/ndb/tools/restore/consumer_restore.cpp:
Changed some buffers to be uchar* to avoid casts with new defintion of packfrm()
storage/ndb/tools/restore/restore_main.cpp:
Removed some old types
storage/ndb/tools/select_all.cpp:
Removed some old types
storage/ndb/tools/select_count.cpp:
Removed some old types
storage/ndb/tools/waiter.cpp:
Removed some old types
strings/bchange.c:
Changed function to use uchar * and size_t
strings/bcmp.c:
Changed function to use uchar * and size_t
strings/bmove512.c:
Changed function to use uchar * and size_t
strings/bmove_upp.c:
Changed function to use uchar * and size_t
strings/ctype-big5.c:
Changed functions to use size_t
Changed character length functions to return uint
strings/ctype-bin.c:
Changed functions to use size_t
strings/ctype-cp932.c:
Changed functions to use size_t
Changed character length functions to return uint
strings/ctype-czech.c:
Fixed indentation
Changed functions to use size_t
strings/ctype-euc_kr.c:
Changed functions to use size_t
Changed character length functions to return uint
strings/ctype-eucjpms.c:
Changed functions to use size_t
Changed character length functions to return uint
unsigned char -> uchar
strings/ctype-gb2312.c:
Changed functions to use size_t
Changed character length functions to return uint
strings/ctype-gbk.c:
Changed functions to use size_t
Changed character length functions to return uint
strings/ctype-latin1.c:
Changed functions to use size_t
Changed character length functions to return uint
unsigned char -> uchar
strings/ctype-mb.c:
Changed functions to use size_t
Changed character length functions to return uint
strings/ctype-simple.c:
Changed functions to use size_t
Simpler loops for caseup/casedown
unsigned int -> uint
unsigned char -> uchar
strings/ctype-sjis.c:
Changed functions to use size_t
Changed character length functions to return uint
strings/ctype-tis620.c:
Changed functions to use size_t
Changed character length functions to return uint
unsigned char -> uchar
strings/ctype-uca.c:
Changed functions to use size_t
unsigned char -> uchar
strings/ctype-ucs2.c:
Moved inclusion of stdarg.h to other includes
usigned char -> uchar
Changed functions to use size_t
Changed character length functions to return uint
strings/ctype-ujis.c:
Changed functions to use size_t
Changed character length functions to return uint
unsigned char -> uchar
strings/ctype-utf8.c:
Changed functions to use size_t
unsigned char -> uchar
Indentation fixes
strings/ctype-win1250ch.c:
Indentation fixes
Changed functions to use size_t
strings/ctype.c:
Changed functions to use size_t
strings/decimal.c:
Changed type for memory argument to uchar *
strings/do_ctype.c:
Indentation fixes
strings/my_strtoll10.c:
unsigned char -> uchar
strings/my_vsnprintf.c:
Changed functions to use size_t
strings/r_strinstr.c:
Removed some old types
Changed functions to use size_t
strings/str_test.c:
Removed some old types
strings/strappend.c:
Changed functions to use size_t
strings/strcont.c:
Removed some old types
strings/strfill.c:
Removed some old types
strings/strinstr.c:
Changed functions to use size_t
strings/strlen.c:
Changed functions to use size_t
strings/strmake.c:
Changed functions to use size_t
strings/strnlen.c:
Changed functions to use size_t
strings/strnmov.c:
Changed functions to use size_t
strings/strto.c:
unsigned char -> uchar
strings/strtod.c:
Changed functions to use size_t
strings/strxnmov.c:
Changed functions to use size_t
strings/xml.c:
Changed functions to use size_t
Indentation fixes
tests/mysql_client_test.c:
Removed some old types
tests/thread_test.c:
Removed some old types
vio/test-ssl.c:
Removed some old types
vio/test-sslclient.c:
Removed some old types
vio/test-sslserver.c:
Removed some old types
vio/vio.c:
Removed some old types
vio/vio_priv.h:
Removed some old types
Changed vio_read()/vio_write() to work with size_t
vio/viosocket.c:
Changed vio_read()/vio_write() to work with size_t
Indentation fixes
vio/viossl.c:
Changed vio_read()/vio_write() to work with size_t
Indentation fixes
vio/viosslfactories.c:
Removed some old types
vio/viotest-ssl.c:
Removed some old types
win/README:
More explanations
2007-05-10 11:59:39 +02:00
|
|
|
uchar* to_free= reinterpret_cast<uchar*>(tables_to_lock);
|
2007-02-26 17:44:55 +01:00
|
|
|
if (tables_to_lock->m_tabledef_valid)
|
|
|
|
{
|
|
|
|
tables_to_lock->m_tabledef.table_def::~table_def();
|
|
|
|
tables_to_lock->m_tabledef_valid= FALSE;
|
|
|
|
}
|
|
|
|
tables_to_lock=
|
|
|
|
static_cast<RPL_TABLE_LIST*>(tables_to_lock->next_global);
|
|
|
|
tables_to_lock_count--;
|
|
|
|
my_free(to_free, MYF(MY_WME));
|
|
|
|
}
|
|
|
|
DBUG_ASSERT(tables_to_lock == NULL && tables_to_lock_count == 0);
|
|
|
|
}
|
|
|
|
|
2006-10-31 12:23:14 +01:00
|
|
|
#endif
|