diff options
author | unknown <lars@mysql.com> | 2005-12-22 06:39:02 +0100 |
---|---|---|
committer | unknown <lars@mysql.com> | 2005-12-22 06:39:02 +0100 |
commit | 09346e6e2de57fadc94f70beb29eabe5186dbe62 (patch) | |
tree | 192a6c65973c50f6a436a8c6e6bb19efa2ed2419 /sql/handler.cc | |
parent | 65c560e9b836953bba66307268430f0faf50ca3c (diff) | |
download | mariadb-git-09346e6e2de57fadc94f70beb29eabe5186dbe62.tar.gz |
WL#1012: All changes as one single changeset.
This includes both code and test cases.
BitKeeper/deleted/.del-ctype_ucs_binlog.result~280d136b1a0bcf17:
Delete: mysql-test/r/ctype_ucs_binlog.result
BitKeeper/deleted/.del-rpl_delete_all.result~7c050d592614b3f:
Delete: mysql-test/r/rpl_delete_all.result
BitKeeper/deleted/.del-rpl000013-slave.opt~18266ad8a2403e8d:
Delete: mysql-test/t/rpl000013-slave.opt
BitKeeper/deleted/.del-rpl_delete_all.test~700a1490277780e0:
Delete: mysql-test/t/rpl_delete_all.test
mysql-test/extra/binlog_tests/binlog.test:
Import patch wl1012.patch
mysql-test/extra/binlog_tests/blackhole.test:
Import patch wl1012.patch
mysql-test/extra/binlog_tests/ctype_cp932.test:
Import patch wl1012.patch
mysql-test/extra/binlog_tests/ctype_cp932_binlog.test:
Import patch wl1012.patch
mysql-test/extra/binlog_tests/ctype_ucs_binlog.test:
Import patch wl1012.patch
mysql-test/extra/binlog_tests/drop_temp_table.test:
Import patch wl1012.patch
mysql-test/extra/binlog_tests/insert_select-binlog.test:
Import patch wl1012.patch
mysql-test/extra/binlog_tests/mix_innodb_myisam_binlog.test:
Import patch wl1012.patch
mysql-test/extra/rpl_tests/rpl_ddl.test:
Import patch wl1012.patch
mysql-test/extra/rpl_tests/rpl_deadlock.test:
Import patch wl1012.patch
mysql-test/extra/rpl_tests/rpl_err_ignoredtable.test:
Import patch wl1012.patch
mysql-test/extra/rpl_tests/rpl_flsh_tbls.test:
Import patch wl1012.patch
mysql-test/extra/rpl_tests/rpl_loaddata_m.test:
Import patch wl1012.patch
mysql-test/extra/rpl_tests/rpl_log.test:
Import patch wl1012.patch
mysql-test/extra/rpl_tests/rpl_max_relay_size.test:
Import patch wl1012.patch
mysql-test/extra/rpl_tests/rpl_multi_query.test:
Import patch wl1012.patch
mysql-test/extra/rpl_tests/rpl_reset_slave.test:
Import patch wl1012.patch
mysql-test/extra/rpl_tests/rpl_stm_000001.test:
Import patch wl1012.patch
mysql-test/extra/rpl_tests/rpl_stm_EE_err.test:
Import patch wl1012.patch
mysql-test/extra/rpl_tests/rpl_stm_charset.test:
Import patch wl1012.patch
mysql-test/extra/rpl_tests/rpl_user_variables.test:
Import patch wl1012.patch
mysql-test/r/binlog_stm_binlog.result:
Import patch wl1012.patch
mysql-test/r/binlog_stm_blackhole.result:
Import patch wl1012.patch
mysql-test/r/binlog_stm_ctype_cp932.result:
Import patch wl1012.patch
mysql-test/r/binlog_stm_ctype_ucs.result:
Import patch wl1012.patch
mysql-test/r/binlog_stm_drop_tmp_tbl.result:
Import patch wl1012.patch
mysql-test/r/binlog_stm_insert_select.result:
Import patch wl1012.patch
mysql-test/r/binlog_stm_mix_innodb_myisam.result:
Import patch wl1012.patch
mysql-test/r/rpl_000012.result:
Import patch wl1012.patch
mysql-test/r/rpl_000015.result:
Import patch wl1012.patch
mysql-test/r/rpl_deadlock_innodb.result:
Import patch wl1012.patch
mysql-test/r/rpl_flushlog_loop.result:
Import patch wl1012.patch
mysql-test/r/rpl_loaddata_s.result:
Import patch wl1012.patch
mysql-test/r/rpl_stm_000001.result:
Import patch wl1012.patch
mysql-test/r/rpl_stm_EE_err.result:
Import patch wl1012.patch
mysql-test/r/rpl_stm_charset.result:
Import patch wl1012.patch
mysql-test/r/rpl_stm_ddl.result:
Import patch wl1012.patch
mysql-test/r/rpl_stm_err_ignoredtable.result:
Import patch wl1012.patch
mysql-test/r/rpl_stm_flsh_tbls.result:
Import patch wl1012.patch
mysql-test/r/rpl_stm_loaddata_m.result:
Import patch wl1012.patch
mysql-test/r/rpl_stm_log.result:
Import patch wl1012.patch
mysql-test/r/rpl_stm_max_relay_size.result:
Import patch wl1012.patch
mysql-test/r/rpl_stm_multi_query.result:
Import patch wl1012.patch
mysql-test/r/rpl_stm_mystery22.result:
Import patch wl1012.patch
mysql-test/r/rpl_stm_reset_slave.result:
Import patch wl1012.patch
mysql-test/r/rpl_stm_rewrt_db.result:
Import patch wl1012.patch
mysql-test/r/rpl_stm_sp.result:
Import patch wl1012.patch
mysql-test/r/rpl_stm_timezone.result:
Import patch wl1012.patch
mysql-test/r/rpl_stm_until.result:
Import patch wl1012.patch
mysql-test/r/rpl_stm_user_variables.result:
Import patch wl1012.patch
mysql-test/r/rpl_stm_view.result:
Import patch wl1012.patch
mysql-test/t/binlog_row_binlog-master.opt:
Import patch wl1012.patch
mysql-test/t/rpl_000012.test:
Import patch wl1012.patch
mysql-test/t/rpl_000015-slave.sh:
Import patch wl1012.patch
mysql-test/t/rpl_000015.slave-mi:
Import patch wl1012.patch
mysql-test/t/rpl_000015.test:
Import patch wl1012.patch
mysql-test/t/rpl_deadlock_innodb-slave.opt:
Import patch wl1012.patch
mysql-test/t/rpl_flushlog_loop-master.opt:
Import patch wl1012.patch
mysql-test/t/rpl_flushlog_loop-master.sh:
Import patch wl1012.patch
mysql-test/t/rpl_flushlog_loop-slave.opt:
Import patch wl1012.patch
mysql-test/t/rpl_flushlog_loop-slave.sh:
Import patch wl1012.patch
mysql-test/t/rpl_flushlog_loop.test:
Import patch wl1012.patch
mysql-test/t/rpl_loaddata_s-slave.opt:
Import patch wl1012.patch
mysql-test/t/rpl_loaddata_s.test:
Import patch wl1012.patch
mysql-test/t/rpl_stm_000001-slave.opt:
Import patch wl1012.patch
mysql-test/t/rpl_stm_err_ignoredtable-slave.opt:
Import patch wl1012.patch
mysql-test/t/rpl_stm_loaddata_m-master.opt:
Import patch wl1012.patch
mysql-test/t/rpl_stm_log-master.opt:
Import patch wl1012.patch
mysql-test/t/rpl_stm_log-slave.opt:
Import patch wl1012.patch
mysql-test/t/rpl_stm_mystery22.test:
Import patch wl1012.patch
mysql-test/t/rpl_stm_rewrt_db-slave.opt:
Import patch wl1012.patch
mysql-test/t/rpl_stm_rewrt_db.test:
Import patch wl1012.patch
mysql-test/t/rpl_stm_sp-master.opt:
Import patch wl1012.patch
mysql-test/t/rpl_stm_sp-slave.opt:
Import patch wl1012.patch
mysql-test/t/rpl_stm_sp.test:
Import patch wl1012.patch
mysql-test/t/rpl_stm_timezone-master.opt:
Import patch wl1012.patch
mysql-test/t/rpl_stm_timezone-slave.opt:
Import patch wl1012.patch
BUILD/SETUP.sh:
Import patch wl1012.patch
Makefile.am:
Import patch wl1012.patch
mysql-test/t/rpl_stm_timezone.test:
Import patch wl1012.patch
mysql-test/t/rpl_stm_until.test:
Import patch wl1012.patch
mysql-test/t/rpl_stm_view.test:
Import patch wl1012.patch
client/Makefile.am:
Import patch wl1012.patch
client/client_priv.h:
Import patch wl1012.patch
client/mysqlbinlog.cc:
Import patch wl1012.patch
configure.in:
Import patch wl1012.patch
include/Makefile.am:
Import patch wl1012.patch
include/base64.h:
Import patch wl1012.patch
include/config-win.h:
Import patch wl1012.patch
include/my_base.h:
Import patch wl1012.patch
include/my_global.h:
Import patch wl1012.patch
mysql-test/Makefile.am:
Import patch wl1012.patch
mysql-test/mysql-test-run.pl:
Import patch wl1012.patch
mysql-test/mysql-test-run.sh:
Import patch wl1012.patch
mysql-test/r/date_formats.result:
Import patch wl1012.patch
mysql-test/r/flush_block_commit.result:
Import patch wl1012.patch
mysql-test/r/innodb.result:
Import patch wl1012.patch
mysql-test/r/rpl000017.result:
Import patch wl1012.patch
mysql-test/r/rpl_change_master.result:
Import patch wl1012.patch
mysql-test/r/rpl_commit_after_flush.result:
Import patch wl1012.patch
mysql-test/r/rpl_create_database.result:
Import patch wl1012.patch
mysql-test/r/rpl_do_grant.result:
Import patch wl1012.patch
mysql-test/r/rpl_loaddata.result:
Import patch wl1012.patch
mysql-test/r/rpl_log_pos.result:
Import patch wl1012.patch
mysql-test/r/rpl_multi_delete.result:
Import patch wl1012.patch
mysql-test/r/rpl_multi_update.result:
Import patch wl1012.patch
mysql-test/r/rpl_openssl.result:
Import patch wl1012.patch
mysql-test/r/rpl_replicate_do.result:
Import patch wl1012.patch
mysql-test/r/rpl_rotate_logs.result:
Import patch wl1012.patch
mysql-test/r/rpl_server_id1.result:
Import patch wl1012.patch
mysql-test/r/rpl_server_id2.result:
Import patch wl1012.patch
mysql-test/r/rpl_temporary.result:
Import patch wl1012.patch
mysql-test/r/user_var-binlog.result:
Import patch wl1012.patch
mysql-test/t/create_select_tmp.test:
Import patch wl1012.patch
mysql-test/t/date_formats.test:
Import patch wl1012.patch
mysql-test/t/disabled.def:
Import patch wl1012.patch
mysql-test/t/innodb.test:
Import patch wl1012.patch
mysql-test/t/mysqlbinlog.test:
Import patch wl1012.patch
mysql-test/t/mysqlbinlog2.test:
Import patch wl1012.patch
mysql-test/t/rpl000002.test:
Import patch wl1012.patch
mysql-test/t/rpl000006.test:
Import patch wl1012.patch
mysql-test/t/rpl000013.test:
Import patch wl1012.patch
mysql-test/t/rpl000017.test:
Import patch wl1012.patch
mysql-test/t/rpl_auto_increment.test:
Import patch wl1012.patch
mysql-test/t/rpl_change_master.test:
Import patch wl1012.patch
mysql-test/t/rpl_commit_after_flush.test:
Import patch wl1012.patch
mysql-test/t/rpl_create_database.test:
Import patch wl1012.patch
mysql-test/t/rpl_do_grant.test:
Import patch wl1012.patch
mysql-test/t/rpl_drop.test:
Import patch wl1012.patch
mysql-test/t/rpl_empty_master_crash.test:
Import patch wl1012.patch
mysql-test/t/rpl_failed_optimize.test:
Import patch wl1012.patch
mysql-test/t/rpl_heap.test:
Import patch wl1012.patch
mysql-test/t/rpl_insert_id.test:
Import patch wl1012.patch
mysql-test/t/rpl_insert_ignore.test:
Import patch wl1012.patch
mysql-test/t/rpl_loaddata.test:
Import patch wl1012.patch
mysql-test/t/rpl_log_pos.test:
Import patch wl1012.patch
mysql-test/t/rpl_multi_delete.test:
Import patch wl1012.patch
mysql-test/t/rpl_multi_update.test:
Import patch wl1012.patch
mysql-test/t/rpl_multi_update2.test:
Import patch wl1012.patch
mysql-test/t/rpl_multi_update3.test:
Import patch wl1012.patch
mysql-test/t/rpl_openssl.test:
Import patch wl1012.patch
mysql-test/t/rpl_redirect.test:
Import patch wl1012.patch
mysql-test/t/rpl_relayrotate.test:
Import patch wl1012.patch
mysql-test/t/rpl_replicate_do.test:
Import patch wl1012.patch
mysql-test/t/rpl_rotate_logs.test:
Import patch wl1012.patch
mysql-test/t/rpl_server_id1.test:
Import patch wl1012.patch
mysql-test/t/rpl_sp_effects.test:
Import patch wl1012.patch
mysql-test/t/rpl_temporary.test:
Import patch wl1012.patch
mysql-test/t/rpl_trigger.test:
Import patch wl1012.patch
mysql-test/t/sp.test:
Import patch wl1012.patch
mysql-test/t/user_var-binlog.test:
Import patch wl1012.patch
mysys/Makefile.am:
Import patch wl1012.patch
mysys/base64.c:
Import patch wl1012.patch
sql/Makefile.am:
Import patch wl1012.patch
sql/ha_innodb.cc:
Import patch wl1012.patch
sql/ha_innodb.h:
Import patch wl1012.patch
sql/ha_partition.cc:
Import patch wl1012.patch
sql/handler.cc:
Import patch wl1012.patch
sql/handler.h:
Import patch wl1012.patch
sql/item_sum.cc:
Import patch wl1012.patch
sql/log.cc:
Import patch wl1012.patch
sql/log_event.cc:
Import patch wl1012.patch
sql/log_event.h:
Import patch wl1012.patch
sql/mysql_priv.h:
Import patch wl1012.patch
sql/mysqld.cc:
Import patch wl1012.patch
sql/rpl_filter.h:
Import patch wl1012.patch
sql/set_var.cc:
Import patch wl1012.patch
sql/share/errmsg.txt:
Import patch wl1012.patch
sql/slave.cc:
Import patch wl1012.patch
sql/slave.h:
Import patch wl1012.patch
sql/sp.cc:
Import patch wl1012.patch
sql/sp_head.cc:
Import patch wl1012.patch
sql/sql_acl.cc:
Import patch wl1012.patch
sql/sql_base.cc:
Import patch wl1012.patch
sql/sql_class.cc:
Import patch wl1012.patch
sql/sql_class.h:
Import patch wl1012.patch
sql/sql_delete.cc:
Import patch wl1012.patch
sql/sql_insert.cc:
Import patch wl1012.patch
sql/sql_lex.h:
Import patch wl1012.patch
sql/sql_list.h:
Import patch wl1012.patch
sql/sql_load.cc:
Import patch wl1012.patch
sql/sql_parse.cc:
Import patch wl1012.patch
sql/sql_plugin.cc:
Import patch wl1012.patch
sql/sql_rename.cc:
Import patch wl1012.patch
sql/sql_repl.h:
Import patch wl1012.patch
sql/sql_select.cc:
Import patch wl1012.patch
sql/sql_show.cc:
Import patch wl1012.patch
sql/sql_table.cc:
Import patch wl1012.patch
sql/sql_udf.cc:
Import patch wl1012.patch
sql/sql_union.cc:
Import patch wl1012.patch
sql/sql_update.cc:
Import patch wl1012.patch
sql/sql_yacc.yy:
Import patch wl1012.patch
sql/table.cc:
Import patch wl1012.patch
sql/table.h:
Import patch wl1012.patch
storage/innobase/include/lock0lock.h:
Import patch wl1012.patch
storage/innobase/include/row0mysql.h:
Import patch wl1012.patch
storage/innobase/include/row0vers.h:
Import patch wl1012.patch
storage/innobase/lock/lock0lock.c:
Import patch wl1012.patch
storage/innobase/row/row0mysql.c:
Import patch wl1012.patch
storage/innobase/row/row0sel.c:
Import patch wl1012.patch
storage/innobase/row/row0vers.c:
Import patch wl1012.patch
Diffstat (limited to 'sql/handler.cc')
-rw-r--r-- | sql/handler.cc | 110 |
1 files changed, 109 insertions, 1 deletions
diff --git a/sql/handler.cc b/sql/handler.cc index bcccdf2e2b0..59445a1b2f1 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -22,6 +22,7 @@ #endif #include "mysql_priv.h" +#include "rpl_filter.h" #include "ha_heap.h" #include "ha_myisam.h" #include "ha_myisammrg.h" @@ -29,7 +30,7 @@ #include <myisampack.h> #include <errno.h> - + #ifdef WITH_NDBCLUSTER_STORAGE_ENGINE #define NDB_MAX_ATTRIBUTES_IN_TABLE 128 #include "ha_ndbcluster.h" @@ -37,12 +38,15 @@ #ifdef WITH_PARTITION_STORAGE_ENGINE #include "ha_partition.h" #endif + #ifdef WITH_INNOBASE_STORAGE_ENGINE #include "ha_innodb.h" #endif extern handlerton *sys_table_types[]; +#define BITMAP_STACKBUF_SIZE (128/8) + /* static functions defined in this file */ static handler *create_default(TABLE_SHARE *table); @@ -1937,6 +1941,9 @@ void handler::print_error(int error, myf errflag) my_error(ER_NO_SUCH_TABLE, MYF(0), table_share->db.str, table_share->table_name.str); break; + case HA_ERR_RBR_LOGGING_FAILED: + textno= ER_BINLOG_ROW_LOGGING_FAILED; + break; default: { /* The error was "unknown" to this function. @@ -2721,6 +2728,7 @@ TYPELIB *ha_known_exts(void) return &known_extensions; } + static bool stat_print(THD *thd, const char *type, uint type_len, const char *file, uint file_len, const char *status, uint status_len) @@ -2781,6 +2789,106 @@ bool ha_show_status(THD *thd, handlerton *db_type, enum ha_stat_type stat) return result; } +/* + Function to check if the conditions for row-based binlogging is + correct for the table. + + A row in the given table should be replicated if: + - Row-based replication is on + - It is not a temporary table + - The binlog is enabled + - The table shall be binlogged (binlog_*_db rules) [Seems disabled /Matz] +*/ + +#ifdef HAVE_ROW_BASED_REPLICATION +static bool check_table_binlog_row_based(THD *thd, TABLE *table) +{ + return + binlog_row_based && + thd && (thd->options & OPTION_BIN_LOG) && + (table->s->tmp_table == NO_TMP_TABLE); +} + +template<class RowsEventT> int binlog_log_row(TABLE* table, + const byte *before_record, + const byte *after_record) +{ + bool error= 0; + THD *const thd= current_thd; + + if (check_table_binlog_row_based(thd, table)) + { + MY_BITMAP cols; + /* Potential buffer on the stack for the bitmap */ + uint32 bitbuf[BITMAP_STACKBUF_SIZE/sizeof(uint32)]; + uint n_fields= table->s->fields; + my_bool use_bitbuf= n_fields <= sizeof(bitbuf)*8; + if (likely(!(error= bitmap_init(&cols, + use_bitbuf ? bitbuf : NULL, + (n_fields + 7) & ~7UL, + false)))) + { + bitmap_set_all(&cols); + error= + RowsEventT::binlog_row_logging_function(thd, table, + table->file->has_transactions(), + &cols, table->s->fields, + before_record, after_record); + if (!use_bitbuf) + bitmap_free(&cols); + } + } + return error ? HA_ERR_RBR_LOGGING_FAILED : 0; +} + + +/* + Instantiate the versions we need for the above template function, because we + have -fno-implicit-template as compiling option. +*/ + +template int binlog_log_row<Write_rows_log_event>(TABLE *, const byte *, const byte *); +template int binlog_log_row<Delete_rows_log_event>(TABLE *, const byte *, const byte *); +template int binlog_log_row<Update_rows_log_event>(TABLE *, const byte *, const byte *); + +#endif /* HAVE_ROW_BASED_REPLICATION */ + +int handler::ha_write_row(byte *buf) +{ + int error; + if (likely(!(error= write_row(buf)))) + { +#ifdef HAVE_ROW_BASED_REPLICATION + error= binlog_log_row<Write_rows_log_event>(table, 0, buf); +#endif + } + return error; +} + +int handler::ha_update_row(const byte *old_data, byte *new_data) +{ + int error; + if (likely(!(error= update_row(old_data, new_data)))) + { +#ifdef HAVE_ROW_BASED_REPLICATION + error= binlog_log_row<Update_rows_log_event>(table, old_data, new_data); +#endif + } + return error; +} + +int handler::ha_delete_row(const byte *buf) +{ + int error; + if (likely(!(error= delete_row(buf)))) + { +#ifdef HAVE_ROW_BASED_REPLICATION + error= binlog_log_row<Delete_rows_log_event>(table, buf, 0); +#endif + } + return error; +} + #ifdef HAVE_REPLICATION /* |