From: Ole John Aske Date: November 15 2010 10:27am Subject: bzr push into mysql-5.1-telco-7.0-spj-scan-vs-scan branch (ole.john.aske:3363 to 3364) List-Archive: http://lists.mysql.com/commits/123873 Message-Id: <20101115102747.F1970222@fimafeng09.norway.sun.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 3364 Ole John Aske 2010-11-15 [merge] Merge from telco-70 added: storage/ndb/cmake/ndb_require_variable.cmake renamed: mysql-test/std_data/ndb_apply_status.frm => mysql-test/suite/rpl_ndb/t/ndb_apply_status.frm modified: mysql-test/suite/ndb/r/ndb_condition_pushdown.result mysql-test/suite/ndb/r/ndb_index_unique.result mysql-test/suite/ndb/r/ndb_native_default_support.result mysql-test/suite/ndb/t/ndb_condition_pushdown.test mysql-test/suite/ndb/t/ndb_index_unique.test mysql-test/suite/ndb/t/ndb_native_default_support.test mysql-test/suite/rpl_ndb/t/rpl_ndb_apply_status.test sql/ha_ndbcluster.cc sql/ha_ndbcluster.h sql/ha_ndbcluster_binlog.cc sql/ha_ndbcluster_binlog.h sql/ha_ndbcluster_cond.cc sql/ha_ndbcluster_cond.h sql/ha_ndbcluster_glue.h sql/ha_ndbinfo.cc sql/mysqld.cc storage/ndb/CMakeLists.txt storage/ndb/include/kernel/signaldata/TcKeyReq.hpp storage/ndb/include/ndb_global.h storage/ndb/include/portlib/ndb_prefetch.h storage/ndb/ndb_configure.cmake storage/ndb/src/common/debugger/CMakeLists.txt storage/ndb/src/common/logger/CMakeLists.txt storage/ndb/src/common/util/CMakeLists.txt storage/ndb/src/common/util/SparseBitmask.cpp storage/ndb/src/kernel/CMakeLists.txt storage/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp storage/ndb/src/kernel/vm/SimulatedBlock.cpp storage/ndb/src/kernel/vm/SimulatedBlock.hpp storage/ndb/src/mgmapi/CMakeLists.txt storage/ndb/src/mgmapi/Makefile.am storage/ndb/src/mgmclient/CMakeLists.txt storage/ndb/src/mgmclient/CommandInterpreter.cpp storage/ndb/src/mgmsrv/CMakeLists.txt storage/ndb/src/mgmsrv/Makefile.am storage/ndb/src/mgmsrv/testConfig.cpp storage/ndb/src/ndbapi/NdbTransaction.cpp storage/ndb/test/ndbapi/testDict.cpp storage/ndb/test/ndbapi/testNdbApi.cpp storage/ndb/tools/CMakeLists.txt storage/ndb/tools/Makefile.am 3363 Ole John Aske 2010-11-15 spj-scan-scan: cherry picked proposed fix for bug#58163 into SPJ branch. Required as this was a showstopper for further RQG subquery testing modified: mysql-test/suite/ndb/r/ndb_subquery.result mysql-test/suite/ndb/t/ndb_subquery.test sql/ha_ndbcluster.cc === modified file 'mysql-test/suite/ndb/r/ndb_condition_pushdown.result' --- a/mysql-test/suite/ndb/r/ndb_condition_pushdown.result 2010-11-10 10:05:24 +0000 +++ b/mysql-test/suite/ndb/r/ndb_condition_pushdown.result 2010-11-15 10:26:48 +0000 @@ -2169,5 +2169,28 @@ pk x 4 4 5 5 drop table t; +set engine_condition_pushdown = on; +create table t (x enum ('yes','yep','no')) engine = ndb; +insert into t values ('yes'),('yep'),('no'); +explain select * from t where x like 'yes' order by x; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t ALL NULL NULL NULL NULL # Using where; Using filesort +select * from t where x like 'yes' order by x; +x +yes +explain select * from t where x like 'ye%' order by x; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t ALL NULL NULL NULL NULL # Using where; Using filesort +select * from t where x like 'ye%' order by x; +x +yes +yep +explain select * from t where x not like 'ye%' order by x; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t ALL NULL NULL NULL NULL # Using where; Using filesort +select * from t where x not like 'ye%' order by x; +x +no +drop table t; set engine_condition_pushdown = @old_ecpd; DROP TABLE t1,t2,t3,t4,t5; === modified file 'mysql-test/suite/ndb/r/ndb_index_unique.result' --- a/mysql-test/suite/ndb/r/ndb_index_unique.result 2010-11-01 13:15:22 +0000 +++ b/mysql-test/suite/ndb/r/ndb_index_unique.result 2010-11-14 14:16:10 +0000 @@ -737,3 +737,155 @@ drop table t1; alter tablespace ts1 drop datafile 'datafile.dat' engine=ndb; drop tablespace ts1 engine=ndb; drop logfile group lg1 engine=ndb; +# bug#57032 +create table t1 ( +a int not null, +b int, +primary key using hash (a), +unique key using hash (b) +) +engine ndb; +Warnings: +Warning 1121 Ndb does not support unique index on NULL valued attributes, index access with NULL value will become full table scan +insert into t1 values +(0,0),(1,1),(2,2),(3,3),(4,4), +(5,null),(6,null),(7,null),(8,null),(9,null); +set @old_ecpd = @@session.engine_condition_pushdown; +set engine_condition_pushdown = 0; +select a from t1 where b is not null order by a; +a +0 +1 +2 +3 +4 +select a from t1 where b is null order by a; +a +5 +6 +7 +8 +9 +set engine_condition_pushdown = 1; +select a from t1 where b is not null order by a; +a +0 +1 +2 +3 +4 +select a from t1 where b is null order by a; +a +5 +6 +7 +8 +9 +set engine_condition_pushdown = @old_ecpd; +drop table t1; +create table t1 ( +a int not null, +b int, +c int, +primary key using hash (a), +unique key using hash (b,c) +) +engine ndb; +Warnings: +Warning 1121 Ndb does not support unique index on NULL valued attributes, index access with NULL value will become full table scan +insert into t1 values +(0,0,0),(1,1,1),(2,2,1),(3,3,1),(4,4,2), +(5,null,0),(6,null,1),(7,null,1),(8,null,1),(9,null,2), +(10,0,null),(11,1,null),(12,1,null),(13,1,null),(14,2,null), +(15,null,null),(16,null,null),(17,null,null),(18,null,null),(19,null,null); +set @old_ecpd = @@session.engine_condition_pushdown; +set engine_condition_pushdown = 0; +select a from t1 where b is not null and c = 1 order by a; +a +1 +2 +3 +select a from t1 where b is null and c = 1 order by a; +a +6 +7 +8 +select a from t1 where b = 1 and c is null order by a; +a +11 +12 +13 +select a from t1 where b is null and c is null order by a; +a +15 +16 +17 +18 +19 +select a from t1 where b is not null and c is null order by a; +a +10 +11 +12 +13 +14 +select a from t1 where b is null and c is not null order by a; +a +5 +6 +7 +8 +9 +select a from t1 where b is not null and c is not null order by a; +a +0 +1 +2 +3 +4 +set engine_condition_pushdown = 1; +select a from t1 where b is not null and c = 1 order by a; +a +1 +2 +3 +select a from t1 where b is null and c = 1 order by a; +a +6 +7 +8 +select a from t1 where b = 1 and c is null order by a; +a +11 +12 +13 +select a from t1 where b is null and c is null order by a; +a +15 +16 +17 +18 +19 +select a from t1 where b is not null and c is null order by a; +a +10 +11 +12 +13 +14 +select a from t1 where b is null and c is not null order by a; +a +5 +6 +7 +8 +9 +select a from t1 where b is not null and c is not null order by a; +a +0 +1 +2 +3 +4 +set engine_condition_pushdown = @old_ecpd; +drop table t1; === modified file 'mysql-test/suite/ndb/r/ndb_native_default_support.result' --- a/mysql-test/suite/ndb/r/ndb_native_default_support.result 2010-08-19 13:35:45 +0000 +++ b/mysql-test/suite/ndb/r/ndb_native_default_support.result 2010-11-10 13:39:11 +0000 @@ -1412,6 +1412,17 @@ i j f d d2 ch HEX(b) HEX(vb) HEX(blob1) drop table t1; Bug#55121 error 839 'Illegal null attribute' from NDB for fields with default value Ensure that Ndb handler doesn't expect native defaults for Blobs. +set @save_sql_mode = @@session.sql_mode; +set sql_mode=STRICT_TRANS_TABLES; +CREATE TABLE t1 ( +fid smallint(6) unsigned NOT NULL DEFAULT '0', +f01 text NOT NULL, +f02 varchar(255) NOT NULL DEFAULT '', +f03 text NOT NULL DEFAULT '', +PRIMARY KEY (fid) +) engine=ndb; +ERROR 42000: BLOB/TEXT column 'f03' can't have a default value +set sql_mode=@save_sql_mode; CREATE TABLE t1 ( fid smallint(6) unsigned NOT NULL DEFAULT '0', f01 text NOT NULL, @@ -1419,11 +1430,6 @@ f02 varchar(255) NOT NULL DEFAULT '', f03 text NOT NULL DEFAULT '', PRIMARY KEY (fid) ) engine=ndb; -Warnings: -Warning 1101 BLOB/TEXT column 'f03' can't have a default value -show warnings; -Level Code Message -Warning 1101 BLOB/TEXT column 'f03' can't have a default value show create table t1; Table Create Table t1 CREATE TABLE `t1` ( === modified file 'mysql-test/suite/ndb/t/ndb_condition_pushdown.test' --- a/mysql-test/suite/ndb/t/ndb_condition_pushdown.test 2010-11-09 13:54:36 +0000 +++ b/mysql-test/suite/ndb/t/ndb_condition_pushdown.test 2010-11-11 08:21:34 +0000 @@ -2269,6 +2269,21 @@ explain select * from t where 3 between select * from t where 3 between -1 and x order by pk; drop table t; +# Bug#53360 No result for requests using LIKE condition on ENUM fields +set engine_condition_pushdown = on; +create table t (x enum ('yes','yep','no')) engine = ndb; +insert into t values ('yes'),('yep'),('no'); +--replace_column 9 # +explain select * from t where x like 'yes' order by x; +select * from t where x like 'yes' order by x; +--replace_column 9 # +explain select * from t where x like 'ye%' order by x; +select * from t where x like 'ye%' order by x; +--replace_column 9 # +explain select * from t where x not like 'ye%' order by x; +select * from t where x not like 'ye%' order by x; +drop table t; + set engine_condition_pushdown = @old_ecpd; DROP TABLE t1,t2,t3,t4,t5; === modified file 'mysql-test/suite/ndb/t/ndb_index_unique.test' --- a/mysql-test/suite/ndb/t/ndb_index_unique.test 2010-11-01 13:15:22 +0000 +++ b/mysql-test/suite/ndb/t/ndb_index_unique.test 2010-11-14 14:16:10 +0000 @@ -433,4 +433,85 @@ alter tablespace ts1 drop datafile 'data drop tablespace ts1 engine=ndb; drop logfile group lg1 engine=ndb; -# end of tests \ No newline at end of file +# bug#57032 'NOT NULL' evaluation is incorrect when using an 'unique index + +--echo # bug#57032 + +create table t1 ( + a int not null, + b int, + primary key using hash (a), + unique key using hash (b) +) +engine ndb; + +insert into t1 values + (0,0),(1,1),(2,2),(3,3),(4,4), + (5,null),(6,null),(7,null),(8,null),(9,null); + +set @old_ecpd = @@session.engine_condition_pushdown; + +set engine_condition_pushdown = 0; +# failed, empty result +select a from t1 where b is not null order by a; +# worked +select a from t1 where b is null order by a; + +set engine_condition_pushdown = 1; +# failed, empty result +select a from t1 where b is not null order by a; +# worked +select a from t1 where b is null order by a; + +set engine_condition_pushdown = @old_ecpd; + +drop table t1; + +create table t1 ( + a int not null, + b int, + c int, + primary key using hash (a), + unique key using hash (b,c) +) +engine ndb; + +insert into t1 values + (0,0,0),(1,1,1),(2,2,1),(3,3,1),(4,4,2), + (5,null,0),(6,null,1),(7,null,1),(8,null,1),(9,null,2), + (10,0,null),(11,1,null),(12,1,null),(13,1,null),(14,2,null), + (15,null,null),(16,null,null),(17,null,null),(18,null,null),(19,null,null); + +set @old_ecpd = @@session.engine_condition_pushdown; + +set engine_condition_pushdown = 0; +# worked +select a from t1 where b is not null and c = 1 order by a; +# failed, empty result +select a from t1 where b is null and c = 1 order by a; +# failed, empty result +select a from t1 where b = 1 and c is null order by a; +# worked +select a from t1 where b is null and c is null order by a; +select a from t1 where b is not null and c is null order by a; +select a from t1 where b is null and c is not null order by a; +select a from t1 where b is not null and c is not null order by a; + +set engine_condition_pushdown = 1; +# worked +select a from t1 where b is not null and c = 1 order by a; +# failed, empty result +select a from t1 where b is null and c = 1 order by a; +# failed, empty result +select a from t1 where b = 1 and c is null order by a; +# worked +select a from t1 where b is null and c is null order by a; +select a from t1 where b is not null and c is null order by a; +select a from t1 where b is null and c is not null order by a; +select a from t1 where b is not null and c is not null order by a; + +set engine_condition_pushdown = @old_ecpd; + +drop table t1; + +# end of tests === modified file 'mysql-test/suite/ndb/t/ndb_native_default_support.test' --- a/mysql-test/suite/ndb/t/ndb_native_default_support.test 2010-10-25 09:15:03 +0000 +++ b/mysql-test/suite/ndb/t/ndb_native_default_support.test 2010-11-10 13:39:11 +0000 @@ -636,6 +636,9 @@ drop table t1; --echo Bug#55121 error 839 'Illegal null attribute' from NDB for fields with default value --echo Ensure that Ndb handler doesn't expect native defaults for Blobs. +set @save_sql_mode = @@session.sql_mode; +set sql_mode=STRICT_TRANS_TABLES; +--error ER_BLOB_CANT_HAVE_DEFAULT CREATE TABLE t1 ( fid smallint(6) unsigned NOT NULL DEFAULT '0', f01 text NOT NULL, @@ -643,8 +646,17 @@ CREATE TABLE t1 ( f03 text NOT NULL DEFAULT '', PRIMARY KEY (fid) ) engine=ndb; +set sql_mode=@save_sql_mode; -show warnings; +--disable_warnings +CREATE TABLE t1 ( + fid smallint(6) unsigned NOT NULL DEFAULT '0', + f01 text NOT NULL, + f02 varchar(255) NOT NULL DEFAULT '', + f03 text NOT NULL DEFAULT '', + PRIMARY KEY (fid) +) engine=ndb; +--enable_warnings show create table t1; === renamed file 'mysql-test/std_data/ndb_apply_status.frm' => 'mysql-test/suite/rpl_ndb/t/ndb_apply_status.frm' === modified file 'mysql-test/suite/rpl_ndb/t/rpl_ndb_apply_status.test' --- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_apply_status.test 2010-10-22 15:16:26 +0000 +++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_apply_status.test 2010-10-28 06:47:47 +0000 @@ -7,7 +7,7 @@ # The table might already have been created by mysqld -> ignore error --error 0,1 -copy_file $MYSQL_TEST_DIR/std_data/ndb_apply_status.frm $MYSQLTEST_VARDIR/master-data/mysql/ndb_apply_status.frm; +copy_file $MYSQL_TEST_DIR/suite/rpl_ndb/t/ndb_apply_status.frm $MYSQLTEST_VARDIR/master-data/mysql/ndb_apply_status.frm; --disable_result_log --disable_abort_on_error select * from mysql.ndb_apply_status; === modified file 'sql/ha_ndbcluster.cc' --- a/sql/ha_ndbcluster.cc 2010-11-15 09:21:34 +0000 +++ b/sql/ha_ndbcluster.cc 2010-11-15 10:26:48 +0000 @@ -65,7 +65,7 @@ static const ulong ONE_YEAR_IN_SECONDS= ulong opt_ndb_extra_logging; static ulong opt_ndb_wait_connected; -extern ulong opt_ndb_wait_setup; +ulong opt_ndb_wait_setup; static ulong opt_ndb_cache_check_time; static uint opt_ndb_cluster_connection_pool; static char* opt_ndb_connectstring; @@ -5578,8 +5578,8 @@ guess_scan_flags(NdbOperation::LockMode */ int ha_ndbcluster::full_table_scan(const KEY* key_info, - const uchar *key, - uint key_len, + const key_range *start_key, + const key_range *end_key, uchar *buf) { int error; @@ -5685,7 +5685,7 @@ int ha_ndbcluster::full_table_scan(const my_errno= HA_ERR_OUT_OF_MEM; DBUG_RETURN(my_errno); } - if (m_cond->generate_scan_filter_from_key(&code, &options, key_info, key, key_len, buf)) + if (m_cond->generate_scan_filter_from_key(&code, &options, key_info, start_key, end_key, buf)) ERR_RETURN(code.getNdbError()); } @@ -7656,8 +7656,8 @@ int ha_ndbcluster::read_range_first_to_b } else if (type == UNIQUE_INDEX) DBUG_RETURN(full_table_scan(key_info, - start_key->key, - start_key->length, + start_key, + end_key, buf)); break; default: @@ -7778,7 +7778,7 @@ int ha_ndbcluster::rnd_next(uchar *buf) else if (m_active_query) error= next_result(buf); else - error= full_table_scan(NULL, NULL, 0, buf); + error= full_table_scan(NULL, NULL, NULL, buf); table->status= error ? STATUS_NOT_FOUND: 0; DBUG_RETURN(error); @@ -12358,6 +12358,7 @@ static int connect_callback() return 0; } +#ifndef NDB_NO_WAIT_SETUP static int ndb_wait_setup_func_impl(ulong max_wait) { DBUG_ENTER("ndb_wait_setup_func_impl"); @@ -12395,8 +12396,8 @@ static int ndb_wait_setup_func_impl(ulon DBUG_RETURN((ndb_setup_complete == 1)? 0 : 1); } -extern int(*ndb_wait_setup_func)(ulong); - +int(*ndb_wait_setup_func)(ulong) = 0; +#endif extern int ndb_dictionary_is_mysqld; static int ndbcluster_init(void *p) @@ -12508,7 +12509,9 @@ static int ndbcluster_init(void *p) goto ndbcluster_init_error; } +#ifndef NDB_NO_WAIT_SETUP ndb_wait_setup_func= ndb_wait_setup_func_impl; +#endif ndbcluster_inited= 1; DBUG_RETURN(FALSE); @@ -16985,18 +16988,31 @@ static MYSQL_SYSVAR_BOOL( 1 /* default */ ); +#ifndef NDB_NO_LOG_EMPTY_EPOCHS +#define LOG_EMPTY_EPOCHS_OPTS PLUGIN_VAR_OPCMDARG +#define LOG_EMPTY_EPOCHS_DEFAULT 0 +#else +#define LOG_EMPTY_EPOCHS_OPTS PLUGIN_VAR_OPCMDARG | PLUGIN_VAR_READONLY +#define LOG_EMPTY_EPOCHS_DEFAULT 1 +#endif -my_bool opt_ndb_log_empty_epochs; +static my_bool opt_ndb_log_empty_epochs; static MYSQL_SYSVAR_BOOL( log_empty_epochs, /* name */ opt_ndb_log_empty_epochs, /* var */ - PLUGIN_VAR_OPCMDARG, + LOG_EMPTY_EPOCHS_OPTS, "", NULL, /* check func. */ NULL, /* update func. */ - 0 /* default */ + LOG_EMPTY_EPOCHS_DEFAULT /* default */ ); +bool ndb_log_empty_epochs(void) +{ + return opt_ndb_log_empty_epochs; +} + + my_bool opt_ndb_log_apply_status; static MYSQL_SYSVAR_BOOL( log_apply_status, /* name */ === modified file 'sql/ha_ndbcluster.h' --- a/sql/ha_ndbcluster.h 2010-11-10 08:01:00 +0000 +++ b/sql/ha_ndbcluster.h 2010-11-15 10:26:48 +0000 @@ -727,8 +727,8 @@ private: int unique_index_read(const uchar *key, uint key_len, uchar *buf); int full_table_scan(const KEY* key_info, - const uchar *key, - uint key_len, + const key_range *start_key, + const key_range *end_key, uchar *buf); int flush_bulk_insert(bool allow_batch= FALSE); int ndb_write_row(uchar *record, bool primary_key_update, === modified file 'sql/ha_ndbcluster_binlog.cc' --- a/sql/ha_ndbcluster_binlog.cc 2010-11-09 12:12:59 +0000 +++ b/sql/ha_ndbcluster_binlog.cc 2010-11-10 10:31:20 +0000 @@ -38,7 +38,6 @@ extern my_bool opt_ndb_log_orig; extern my_bool opt_ndb_log_bin; -extern my_bool opt_ndb_log_empty_epochs; extern my_bool opt_ndb_log_update_as_write; extern my_bool opt_ndb_log_updated_only; extern my_bool opt_ndb_log_binlog_index; @@ -46,6 +45,8 @@ extern my_bool opt_ndb_log_apply_status; extern ulong opt_ndb_extra_logging; extern ulong opt_server_id_mask; +bool ndb_log_empty_epochs(void); + /* defines for cluster replication table names */ @@ -867,14 +868,18 @@ static bool ndbcluster_flush_logs(handle /* Global schema lock across mysql servers */ -int ndbcluster_has_global_schema_lock(Thd_ndb *thd_ndb) +bool ndbcluster_has_global_schema_lock(Thd_ndb *thd_ndb) { +#ifndef NDB_NO_GLOBAL_SCHEMA_LOCK if (thd_ndb->global_schema_lock_trans) { thd_ndb->global_schema_lock_trans->refresh(); - return 1; + return true; } - return 0; + return false; +#else + return true; // OK +#endif } int ndbcluster_no_global_schema_lock_abort(THD *thd, const char *msg) @@ -888,6 +893,7 @@ int ndbcluster_no_global_schema_lock_abo return -1; } +#ifndef NDB_NO_GLOBAL_SCHEMA_LOCK #include "ha_ndbcluster_lock_ext.h" /* @@ -897,18 +903,26 @@ int ndbcluster_no_global_schema_lock_abo static int ndbcluster_global_schema_lock_is_locked_or_queued= 0; static int ndbcluster_global_schema_lock_no_locking_allowed= 0; static pthread_mutex_t ndbcluster_global_schema_lock_mutex; +#endif void ndbcluster_global_schema_lock_init() { +#ifndef NDB_NO_GLOBAL_SCHEMA_LOCK pthread_mutex_init(&ndbcluster_global_schema_lock_mutex, MY_MUTEX_INIT_FAST); +#endif } void ndbcluster_global_schema_lock_deinit() { +#ifndef NDB_NO_GLOBAL_SCHEMA_LOCK pthread_mutex_destroy(&ndbcluster_global_schema_lock_mutex); +#endif } static int ndbcluster_global_schema_lock(THD *thd, int no_lock_queue, int report_cluster_disconnected) { +#ifdef NDB_NO_GLOBAL_SCHEMA_LOCK + return 0; +#else Ndb *ndb= check_ndb_in_thd(thd); Thd_ndb *thd_ndb= get_thd_ndb(thd); NdbError ndb_error; @@ -1012,9 +1026,13 @@ static int ndbcluster_global_schema_lock } thd_ndb->global_schema_lock_error= ndb_error.code ? ndb_error.code : -1; DBUG_RETURN(-1); +#endif } static int ndbcluster_global_schema_unlock(THD *thd) { +#ifdef NDB_NO_GLOBAL_SCHEMA_LOCK + return 0; +#else Thd_ndb *thd_ndb= get_thd_ndb(thd); DBUG_ASSERT(thd_ndb != 0); if (thd_ndb == 0 || (thd_ndb->options & TNO_NO_LOCK_SCHEMA_OP)) @@ -1063,6 +1081,7 @@ static int ndbcluster_global_schema_unlo } } DBUG_RETURN(0); +#endif } static int ndbcluster_binlog_func(handlerton *hton, THD *thd, @@ -1088,12 +1107,14 @@ static int ndbcluster_binlog_func(handle case BFN_BINLOG_PURGE_FILE: res= ndbcluster_binlog_index_purge_file(thd, (const char *)arg); break; +#ifndef NDB_NO_GLOBAL_SCHEMA_LOCK case BFN_GLOBAL_SCHEMA_LOCK: res= ndbcluster_global_schema_lock(thd, *(int*)arg, 1); break; case BFN_GLOBAL_SCHEMA_UNLOCK: res= ndbcluster_global_schema_unlock(thd); break; +#endif } DBUG_RETURN(res); } @@ -6366,7 +6387,7 @@ restart_cluster_failure: } } else if (res > 0 || - (opt_ndb_log_empty_epochs && + (ndb_log_empty_epochs() && gci > ndb_latest_handled_binlog_epoch)) { DBUG_PRINT("info", ("pollEvents res: %d", res)); @@ -6419,7 +6440,7 @@ restart_cluster_failure: { /* Must be an empty epoch since the condition - (opt_ndb_log_empty_epochs && + (ndb_log_empty_epochs() && gci > ndb_latest_handled_binlog_epoch) must be true we write empty epoch into ndb_binlog_index @@ -6653,7 +6674,7 @@ restart_cluster_failure: while (trans.good()) { - if (!opt_ndb_log_empty_epochs) + if (!ndb_log_empty_epochs()) { /* If @@ -6671,6 +6692,7 @@ restart_cluster_failure: (! (opt_ndb_log_apply_status && trans_slave_row_count) )) { +#ifndef NDB_NO_LOG_EMPTY_EPOCHS /* nothing to commit, rollback instead */ if (int r= trans.rollback()) { @@ -6680,6 +6702,9 @@ restart_cluster_failure: /* TODO: Further handling? */ } break; +#else + abort(); // Should not come here, log-empty-epochs is always on +#endif } } commit_to_binlog: === modified file 'sql/ha_ndbcluster_binlog.h' --- a/sql/ha_ndbcluster_binlog.h 2010-07-02 11:01:48 +0000 +++ b/sql/ha_ndbcluster_binlog.h 2010-11-10 10:09:55 +0000 @@ -329,7 +329,7 @@ set_thd_ndb(THD *thd, Thd_ndb *thd_ndb) Ndb* check_ndb_in_thd(THD* thd, bool validate_ndb= false); -int ndbcluster_has_global_schema_lock(Thd_ndb *thd_ndb); +bool ndbcluster_has_global_schema_lock(Thd_ndb *thd_ndb); int ndbcluster_no_global_schema_lock_abort(THD *thd, const char *msg); class Ndbcluster_global_schema_lock_guard === modified file 'sql/ha_ndbcluster_cond.cc' --- a/sql/ha_ndbcluster_cond.cc 2010-11-10 08:01:00 +0000 +++ b/sql/ha_ndbcluster_cond.cc 2010-11-15 10:26:48 +0000 @@ -258,7 +258,7 @@ void ndb_serialize_cond(const Item *item { Item_field *field_item= (Item_field *) item; Field *field= field_item->field; - enum_field_types type= field->type(); + enum_field_types type= field->real_type(); /* Check that the field is part of the table of the handler instance and that we expect a field with of this result type. @@ -270,18 +270,19 @@ void ndb_serialize_cond(const Item *item DBUG_PRINT("info", ("table %s", tab->getName())); DBUG_PRINT("info", ("column %s", field->field_name)); DBUG_PRINT("info", ("column length %u", field->field_length)); - DBUG_PRINT("info", ("type %d", field->type())); + DBUG_PRINT("info", ("type %d", field->real_type())); DBUG_PRINT("info", ("result type %d", field->result_type())); // Check that we are expecting a field and with the correct // result type and of length that can store the item value if (context->expecting(Item::FIELD_ITEM) && - context->expecting_field_type(field->type()) && + context->expecting_field_type(field->real_type()) && context->expecting_max_length(field->field_length) && (context->expecting_field_result(field->result_type()) || // Date and year can be written as string or int ((type == MYSQL_TYPE_TIME || type == MYSQL_TYPE_DATE || + type == MYSQL_TYPE_NEWDATE || type == MYSQL_TYPE_YEAR || type == MYSQL_TYPE_DATETIME) ? (context->expecting_field_result(STRING_RESULT) || @@ -305,6 +306,7 @@ void ndb_serialize_cond(const Item *item // We have not seen second argument yet if (type == MYSQL_TYPE_TIME || type == MYSQL_TYPE_DATE || + type == MYSQL_TYPE_NEWDATE || type == MYSQL_TYPE_YEAR || type == MYSQL_TYPE_DATETIME) { @@ -348,6 +350,7 @@ void ndb_serialize_cond(const Item *item !context->expecting_collation(item->collation.collation) && type != MYSQL_TYPE_TIME && type != MYSQL_TYPE_DATE + && type != MYSQL_TYPE_NEWDATE && type != MYSQL_TYPE_YEAR && type != MYSQL_TYPE_DATETIME) { @@ -1449,44 +1452,163 @@ ha_ndbcluster_cond::generate_scan_filter } +/* + Optimizer sometimes does hash index lookup of a key where some + key parts are null. The set of cases where this happens makes + no sense but cannot be ignored since optimizer may expect the result + to be filtered accordingly. The scan is actually on the table and + the index bounds are pushed down. +*/ int ha_ndbcluster_cond::generate_scan_filter_from_key(NdbInterpretedCode* code, NdbScanOperation::ScanOptions* options, const KEY* key_info, - const uchar *key, - uint key_len, + const key_range *start_key, + const key_range *end_key, uchar *buf) { - KEY_PART_INFO* key_part= key_info->key_part; - KEY_PART_INFO* end= key_part+key_info->key_parts; - NdbScanFilter filter(code); - int res; DBUG_ENTER("generate_scan_filter_from_key"); +#ifndef DBUG_OFF + { + DBUG_PRINT("info", ("key parts:%u length:%u", + key_info->key_parts, key_info->key_length)); + const key_range* keylist[2]={ start_key, end_key }; + for (uint j=0; j <= 1; j++) + { + char buf[8192]; + const key_range* key=keylist[j]; + if (key == 0) + { + sprintf(buf, "key range %u: none", j); + } + else + { + sprintf(buf, "key range %u: flag:%u part", j, key->flag); + const KEY_PART_INFO* key_part=key_info->key_part; + const uchar* ptr=key->key; + for (uint i=0; i < key_info->key_parts; i++) + { + sprintf(buf+strlen(buf), " %u:", i); + for (uint k=0; k < key_part->store_length; k++) + { + sprintf(buf+strlen(buf), " %02x", ptr[k]); + } + ptr+=key_part->store_length; + if (ptr - key->key >= key->length) + { + /* + key_range has no count of parts so must test byte length. + But this is not the place for following assert. + */ + // DBUG_ASSERT(ptr - key->key == key->length); + break; + } + key_part++; + } + } + DBUG_PRINT("info", ("%s", buf)); + } + } +#endif + + NdbScanFilter filter(code); + int res; filter.begin(NdbScanFilter::AND); - for (; key_part != end; key_part++) + do { - Field* field= key_part->field; - uint32 pack_len= field->pack_length(); - const uchar* ptr= key; - DBUG_PRINT("info", ("Filtering value for %s", field->field_name)); - DBUG_DUMP("key", ptr, pack_len); - if (key_part->null_bit) + /* + Case "x is not null". + Seen with index(x) where it becomes range "null < x". + Not seen with index(x,y) for any combination of bounds + which include "is not null". + */ + if (start_key != 0 && + start_key->flag == HA_READ_AFTER_KEY && + end_key == 0 && + key_info->key_parts == 1) { - DBUG_PRINT("info", ("Generating ISNULL filter")); - if (filter.isnull(key_part->fieldnr-1) == -1) - DBUG_RETURN(1); + const KEY_PART_INFO* key_part=key_info->key_part; + if (key_part->null_bit != 0) // nullable (must be) + { + const Field* field=key_part->field; + const uchar* ptr= start_key->key; + if (ptr[0] != 0) // null (in "null < x") + { + DBUG_PRINT("info", ("Generating ISNOTNULL filter for nullable %s", + field->field_name)); + if (filter.isnotnull(key_part->fieldnr-1) == -1) + DBUG_RETURN(1); + break; + } + } } - else + + /* + Case "x is null" in an EQ range. + Seen with index(x) for "x is null". + Seen with index(x,y) for "x is null and y = 1". + Not seen with index(x,y) for "x is null and y is null". + Seen only when all key parts are present (but there is + no reason to limit the code to this case). + */ + if (start_key != 0 && + start_key->flag == HA_READ_KEY_EXACT && + end_key != 0 && + end_key->flag == HA_READ_AFTER_KEY && + start_key->length == end_key->length && + memcmp(start_key->key, end_key->key, start_key->length) == 0) { - DBUG_PRINT("info", ("Generating EQ filter")); - if (filter.cmp(NdbScanFilter::COND_EQ, - key_part->fieldnr-1, - ptr, - pack_len) == -1) - DBUG_RETURN(1); + const KEY_PART_INFO* key_part=key_info->key_part; + const uchar* ptr=start_key->key; + for (uint i=0; i < key_info->key_parts; i++) + { + const Field* field=key_part->field; + if (key_part->null_bit) // nullable + { + if (ptr[0] != 0) // null + { + DBUG_PRINT("info", ("Generating ISNULL filter for nullable %s", + field->field_name)); + if (filter.isnull(key_part->fieldnr-1) == -1) + DBUG_RETURN(1); + } + else + { + DBUG_PRINT("info", ("Generating EQ filter for nullable %s", + field->field_name)); + if (filter.cmp(NdbScanFilter::COND_EQ, + key_part->fieldnr-1, + ptr + 1, // skip null-indicator byte + field->pack_length()) == -1) + DBUG_RETURN(1); + } + } + else + { + DBUG_PRINT("info", ("Generating EQ filter for non-nullable %s", + field->field_name)); + if (filter.cmp(NdbScanFilter::COND_EQ, + key_part->fieldnr-1, + ptr, + field->pack_length()) == -1) + DBUG_RETURN(1); + } + ptr+=key_part->store_length; + if (ptr - start_key->key >= start_key->length) + { + break; + } + key_part++; + } + break; } - key += key_part->store_length; - } + + DBUG_PRINT("info", ("Unknown hash index scan")); + // enable to catch new cases when optimizer changes + // DBUG_ASSERT(false); + } + while (0); + // Add any pushed condition if (m_cond_stack && (res= generate_scan_filter_from_cond(filter))) === modified file 'sql/ha_ndbcluster_cond.h' --- a/sql/ha_ndbcluster_cond.h 2010-11-09 09:29:29 +0000 +++ b/sql/ha_ndbcluster_cond.h 2010-11-15 09:23:10 +0000 @@ -143,7 +143,7 @@ public: Ndb_item(Field *field, int column_no) : type(NDB_FIELD) { NDB_ITEM_FIELD_VALUE *field_value= new NDB_ITEM_FIELD_VALUE(); - qualification.field_type= field->type(); + qualification.field_type= field->real_type(); field_value->field= field; field_value->column_no= column_no; value.field_value= field_value; @@ -661,8 +661,8 @@ public: int generate_scan_filter_from_key(NdbInterpretedCode* code, NdbScanOperation::ScanOptions* options, const KEY* key_info, - const uchar *key, - uint key_len, + const key_range *start_key, + const key_range *end_key, uchar *buf); private: bool serialize_cond(const COND *cond, Ndb_cond_stack *ndb_cond, === modified file 'sql/ha_ndbcluster_glue.h' --- a/sql/ha_ndbcluster_glue.h 2010-11-09 13:59:52 +0000 +++ b/sql/ha_ndbcluster_glue.h 2010-11-10 11:37:55 +0000 @@ -97,8 +97,16 @@ enum column_format_type { /* thd->binlog_query has new parameter "direct" */ #define NDB_THD_BINLOG_QUERY_HAS_DIRECT -#endif +/* Global schema lock not available */ +#define NDB_NO_GLOBAL_SCHEMA_LOCK + +/* Missing functionality in injector -> no --ndb-log-empty-epochs */ +#define NDB_NO_LOG_EMPTY_EPOCHS +/* No support for --ndb-wait_setup */ +#define NDB_NO_WAIT_SETUP + +#endif /* extract the bitmask of options from THD */ static inline === modified file 'sql/ha_ndbinfo.cc' --- a/sql/ha_ndbinfo.cc 2010-04-15 12:55:31 +0000 +++ b/sql/ha_ndbinfo.cc 2010-11-10 14:17:13 +0000 @@ -16,7 +16,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "mysql_priv.h" +#include "ha_ndbcluster_glue.h" + #ifdef WITH_NDBCLUSTER_STORAGE_ENGINE #include "ha_ndbinfo.h" #include "../storage/ndb/src/ndbapi/NdbInfo.hpp" === modified file 'sql/mysqld.cc' --- a/sql/mysqld.cc 2010-10-29 20:45:08 +0000 +++ b/sql/mysqld.cc 2010-11-15 10:26:48 +0000 @@ -489,8 +489,8 @@ handlerton *myisam_hton; handlerton *partition_hton; #ifdef WITH_NDBCLUSTER_STORAGE_ENGINE -ulong opt_ndb_wait_setup; -int(*ndb_wait_setup_func)(ulong)= 0; +extern ulong opt_ndb_wait_setup; +extern int(*ndb_wait_setup_func)(ulong); #endif #ifndef MCP_BUG52305 uint opt_server_id_bits= 0; === modified file 'storage/ndb/CMakeLists.txt' --- a/storage/ndb/CMakeLists.txt 2010-11-10 08:01:00 +0000 +++ b/storage/ndb/CMakeLists.txt 2010-11-15 10:26:48 +0000 @@ -25,13 +25,6 @@ IF(SOURCE_SUBLIBS) ELSE() INCLUDE(${CMAKE_CURRENT_SOURCE_DIR}/ndb_configure.cmake) - IF(NOT DEFINED WITH_ZLIB) - # Hardcode use of the bundled zlib - MESSAGE(STATUS "using bundled zlib (hardcoded)") - SET(ZLIB_LIBRARY zlib) - SET(ZLIB_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/zlib) - ENDIF() - INCLUDE_DIRECTORIES( # MySQL Server includes ${CMAKE_SOURCE_DIR}/include @@ -50,7 +43,8 @@ ELSE() ${CMAKE_CURRENT_BINARY_DIR}/include # Util library includes - ${ZLIB_INCLUDE_DIR}) + ${ZLIB_INCLUDE_DIR} + ${READLINE_INCLUDE_DIR}) # The root of storage/ndb/ SET(NDB_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) @@ -132,5 +126,5 @@ IF(EXISTS ${CMAKE_SOURCE_DIR}/storage/my ELSE() # New plugin support, cross-platform MYSQL_ADD_PLUGIN(ndbcluster ${NDBCLUSTER_SOURCES} STORAGE_ENGINE - DEFAULT MODULE_OUTPUT_NAME ha_ndb) + DEFAULT MODULE_OUTPUT_NAME ha_ndb LINK_LIBRARIES ndbclient) ENDIF() === added file 'storage/ndb/cmake/ndb_require_variable.cmake' --- a/storage/ndb/cmake/ndb_require_variable.cmake 1970-01-01 00:00:00 +0000 +++ b/storage/ndb/cmake/ndb_require_variable.cmake 2010-11-10 09:42:49 +0000 @@ -0,0 +1,27 @@ +# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. +# +# 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 +# the Free Software Foundation; version 2 of the License. +# +# 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 +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +# NDB_REQUIRE_VARIABLE +# +# Check that the variable with given name is defined +# +MACRO(NDB_REQUIRE_VARIABLE variable_name) + MESSAGE(STATUS "Checking variable ${variable_name} required by NDB") + IF(NOT DEFINED "${variable_name}") + MESSAGE(FATAL_ERROR "The variable ${variable_name} is required " + "to build NDB") + ENDIF() +ENDMACRO() \ No newline at end of file === modified file 'storage/ndb/include/kernel/signaldata/TcKeyReq.hpp' --- a/storage/ndb/include/kernel/signaldata/TcKeyReq.hpp 2010-02-03 15:14:07 +0000 +++ b/storage/ndb/include/kernel/signaldata/TcKeyReq.hpp 2010-11-15 10:26:48 +0000 @@ -20,6 +20,7 @@ #define TC_KEY_REQ_H #include "SignalData.hpp" +#include /** * @class TcKeyReq @@ -75,7 +76,8 @@ public: STATIC_CONST( SignalLength = 25 ); STATIC_CONST( MaxKeyInfo = 8 ); STATIC_CONST( MaxAttrInfo = 5 ); - STATIC_CONST( MaxTotalAttrInfo = 0xFFFF ); + STATIC_CONST( MaxTotalAttrInfo = ((MAX_SEND_MESSAGE_BYTESIZE / 4) - + SignalLength )); /** * Long signal variant of TCKEYREQ === modified file 'storage/ndb/include/ndb_global.h' --- a/storage/ndb/include/ndb_global.h 2010-10-28 07:45:21 +0000 +++ b/storage/ndb/include/ndb_global.h 2010-11-11 13:19:26 +0000 @@ -46,7 +46,6 @@ #define NDB_WIN 1 #define PATH_MAX 256 #define DIR_SEPARATOR "\\" -#define MYSQLCLUSTERDIR "c:\\mysql\\mysql-cluster" #define HAVE_STRCASECMP #pragma warning(disable: 4503 4786) #else === modified file 'storage/ndb/include/portlib/ndb_prefetch.h' --- a/storage/ndb/include/portlib/ndb_prefetch.h 2010-11-09 10:45:29 +0000 +++ b/storage/ndb/include/portlib/ndb_prefetch.h 2010-11-11 15:03:47 +0000 @@ -20,6 +20,14 @@ #ifdef HAVE_SUN_PREFETCH_H #include +#if (defined(__SUNPRO_C) && __SUNPRO_C >= 0x590) \ + || (defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x590) +/* Universal sun_prefetch* macros available with Sun Studio 5.9 */ +#define USE_SUN_PREFETCH +#elif defined(__sparc) +/* Use sparc_prefetch* macros with older Sun Studio on sparc */ +#define USE_SPARC_PREFETCH +#endif #endif #ifdef HAVE_SUN_PREFETCH_H @@ -31,7 +39,9 @@ void NDB_PREFETCH_READ(void* addr) { #if (__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR > 10) __builtin_prefetch(addr, 0, 3); -#elif defined(HAVE_SUN_PREFETCH_H) +#elif defined(USE_SUN_PREFETCH) + sun_prefetch_read_once(addr); +#elif defined(USE_SPARC_PREFETCH) sparc_prefetch_read_once(addr); #else (void)addr; @@ -43,8 +53,10 @@ void NDB_PREFETCH_WRITE(void* addr) { #if (__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR > 10) __builtin_prefetch(addr, 1, 3); -#elif defined(HAVE_SUN_PREFETCH_H) - sparc_prefetch_write_once(addr); +#elif defined(USE_SUN_PREFETCH) + sun_prefetch_write_once(addr); +#elif defined(USE_SPARC_PREFETCH) + sun_prefetch_write_once(addr); #else (void)addr; #endif === modified file 'storage/ndb/ndb_configure.cmake' --- a/storage/ndb/ndb_configure.cmake 2010-11-09 10:45:29 +0000 +++ b/storage/ndb/ndb_configure.cmake 2010-11-10 09:42:49 +0000 @@ -22,6 +22,7 @@ INCLUDE(CheckFunctionExists) INCLUDE(CheckIncludeFiles) INCLUDE(CheckCSourceCompiles) INCLUDE(CheckCXXSourceRuns) +INCLUDE(ndb_require_variable) CHECK_FUNCTION_EXISTS(posix_memalign HAVE_POSIX_MEMALIGN) CHECK_FUNCTION_EXISTS(clock_gettime HAVE_CLOCK_GETTIME) @@ -136,3 +137,13 @@ CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DI # generated ndb_config.h ADD_DEFINITIONS(-DHAVE_NDB_CONFIG_H) +# check zlib +IF(NOT DEFINED WITH_ZLIB) + # Hardcode use of the bundled zlib if not set by MySQL + MESSAGE(STATUS "Using bundled zlib (hardcoded)") + SET(ZLIB_LIBRARY zlib) + SET(ZLIB_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/zlib) +ENDIF() +NDB_REQUIRE_VARIABLE(ZLIB_LIBRARY) +NDB_REQUIRE_VARIABLE(ZLIB_INCLUDE_DIR) + === modified file 'storage/ndb/src/common/debugger/CMakeLists.txt' --- a/storage/ndb/src/common/debugger/CMakeLists.txt 2009-06-03 15:38:04 +0000 +++ b/storage/ndb/src/common/debugger/CMakeLists.txt 2010-11-11 15:08:52 +0000 @@ -24,4 +24,4 @@ ADD_LIBRARY(ndbtrace STATIC BlockNames.cpp EventLogger.cpp) -TARGET_LINK_LIBRARIES(ndbtrace ndbgeneral) +TARGET_LINK_LIBRARIES(ndbtrace ndblogger ndberror ndbgeneral) === modified file 'storage/ndb/src/common/logger/CMakeLists.txt' --- a/storage/ndb/src/common/logger/CMakeLists.txt 2010-10-19 15:03:27 +0000 +++ b/storage/ndb/src/common/logger/CMakeLists.txt 2010-11-11 15:08:52 +0000 @@ -24,3 +24,4 @@ ADD_LIBRARY(ndblogger STATIC SysLogHandler.cpp EventLogHandler.cpp FileLogHandler.cpp) +TARGET_LINK_LIBRARIES(ndblogger ndbgeneral) === modified file 'storage/ndb/src/common/util/CMakeLists.txt' --- a/storage/ndb/src/common/util/CMakeLists.txt 2010-10-29 08:40:49 +0000 +++ b/storage/ndb/src/common/util/CMakeLists.txt 2010-11-11 15:08:52 +0000 @@ -55,7 +55,7 @@ ADD_LIBRARY(ndbgeneral STATIC SparseBitmask.cpp require.c ) -TARGET_LINK_LIBRARIES(ndbgeneral ${ZLIB_LIBRARY} mysys) +TARGET_LINK_LIBRARIES(ndbgeneral ndbtrace ${ZLIB_LIBRARY} mysys) ADD_EXECUTABLE(BaseString-t BaseString.cpp) SET_TARGET_PROPERTIES(BaseString-t === modified file 'storage/ndb/src/common/util/SparseBitmask.cpp' --- a/storage/ndb/src/common/util/SparseBitmask.cpp 2010-08-28 09:37:09 +0000 +++ b/storage/ndb/src/common/util/SparseBitmask.cpp 2010-11-11 09:46:05 +0000 @@ -90,6 +90,7 @@ TAPTEST(SparseBitmask) return 1; // OK } +#endif + template class Vector; -#endif === modified file 'storage/ndb/src/kernel/CMakeLists.txt' --- a/storage/ndb/src/kernel/CMakeLists.txt 2010-11-10 08:01:00 +0000 +++ b/storage/ndb/src/kernel/CMakeLists.txt 2010-11-15 10:26:48 +0000 @@ -55,12 +55,12 @@ ENDIF() ADD_EXECUTABLE(ndbd main.cpp ndbd.cpp angel.cpp SimBlockList.cpp ${NDBD_EXTRA_SRC}) -TARGET_LINK_LIBRARIES(ndbd ${NDBD_LIBS} ndbsched) +TARGET_LINK_LIBRARIES(ndbd ${NDBD_LIBS} ndbsched ${LIBDL}) INSTALL(TARGETS ndbd DESTINATION libexec) IF(NDB_BUILD_NDBMTD) ADD_EXECUTABLE(ndbmtd main.cpp ndbd.cpp angel.cpp SimBlockList.cpp ${NDBD_EXTRA_SRC}) - TARGET_LINK_LIBRARIES(ndbmtd ${NDBD_LIBS} ndbsched_mt) + TARGET_LINK_LIBRARIES(ndbmtd ${NDBD_LIBS} ndbsched_mt ${LIBDL}) INSTALL(TARGETS ndbmtd DESTINATION libexec) ENDIF() === modified file 'storage/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp' --- a/storage/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp 2010-10-15 14:42:00 +0000 +++ b/storage/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp 2010-11-15 10:26:48 +0000 @@ -1246,16 +1246,10 @@ void Cmvmi::execTAMPER_ORD(Signal* signa { jam(); signal->theData[0] = 0; - sendSignal(QMGR_REF, GSN_NDB_TAMPER, signal, 1, JBB); - sendSignal(NDBCNTR_REF, GSN_NDB_TAMPER, signal, 1, JBB); - sendSignal(NDBFS_REF, GSN_NDB_TAMPER, signal, 1, JBB); - sendSignal(DBACC_REF, GSN_NDB_TAMPER, signal, 1, JBB); - sendSignal(DBTUP_REF, GSN_NDB_TAMPER, signal, 1, JBB); - sendSignal(DBLQH_REF, GSN_NDB_TAMPER, signal, 1, JBB); - sendSignal(DBDICT_REF, GSN_NDB_TAMPER, signal, 1, JBB); - sendSignal(DBDIH_REF, GSN_NDB_TAMPER, signal, 1, JBB); - sendSignal(DBTC_REF, GSN_NDB_TAMPER, signal, 1, JBB); - sendSignal(CMVMI_REF, GSN_NDB_TAMPER, signal, 1, JBB); + for (Uint32 i = 0; blocks[i] != 0; i++) + { + sendSignal(blocks[i], GSN_NDB_TAMPER, signal, 1, JBB); + } return; } === modified file 'storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp' --- a/storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp 2010-10-29 20:51:26 +0000 +++ b/storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp 2010-11-15 10:26:48 +0000 @@ -9815,8 +9815,7 @@ bool Dbtc::testFragmentDrop(Signal* sign signal->header.theLength = newLen + 3; signal->header.m_noOfSections = 0; - EXECUTE_DIRECT(DBTC, GSN_SIGNAL_DROPPED_REP, signal, - newLen + 3); + executeFunction(GSN_SIGNAL_DROPPED_REP, signal); return true; } return false; === modified file 'storage/ndb/src/kernel/vm/SimulatedBlock.cpp' --- a/storage/ndb/src/kernel/vm/SimulatedBlock.cpp 2010-11-04 09:41:08 +0000 +++ b/storage/ndb/src/kernel/vm/SimulatedBlock.cpp 2010-11-15 10:26:48 +0000 @@ -2322,9 +2322,12 @@ SimulatedBlock::assembleFragments(Signal signal->header.m_fragmentInfo = 3; + /** + * NOTE: Don't use EXECUTE_DIRECT as it + * sets sendersBlockRef to reference() + */ /* Perform dropped signal handling, in this thread, now */ - EXECUTE_DIRECT(theNumber, GSN_SIGNAL_DROPPED_REP, - signal, signal->header.theLength); + executeFunction(GSN_SIGNAL_DROPPED_REP, signal); /* return false to caller - they should not process the signal */ return false; === modified file 'storage/ndb/src/kernel/vm/SimulatedBlock.hpp' --- a/storage/ndb/src/kernel/vm/SimulatedBlock.hpp 2010-11-10 08:01:00 +0000 +++ b/storage/ndb/src/kernel/vm/SimulatedBlock.hpp 2010-11-15 10:26:48 +0000 @@ -1276,17 +1276,6 @@ SimulatedBlock::EXECUTE_DIRECT(Uint32 bl m_currentGsn = tGsn; subTime(tGsn, diff); #endif -#ifdef VM_TRACE - if(globalData.testOn){ - signal->header.theVerId_signalNumber = gsn; - signal->header.theReceiversBlockNumber = numberToBlock(block, instanceNo); - signal->header.theSendersBlockRef = reference(); - globalSignalLoggers.executeDirect(signal->header, - 1, // out - &signal->theData[0], - globalData.ownId); - } -#endif } /** === modified file 'storage/ndb/src/mgmapi/CMakeLists.txt' --- a/storage/ndb/src/mgmapi/CMakeLists.txt 2010-10-19 12:19:31 +0000 +++ b/storage/ndb/src/mgmapi/CMakeLists.txt 2010-11-11 15:08:52 +0000 @@ -27,4 +27,4 @@ ADD_LIBRARY(ndbmgmapi STATIC mgmapi_configuration.cpp LocalConfig.cpp ${CMAKE_SOURCE_DIR}/storage/ndb/src/kernel/error/ndbd_exit_codes.c) -TARGET_LINK_LIBRARIES(ndbmgmapi ndbconf) +TARGET_LINK_LIBRARIES(ndbmgmapi ndbconf ndbportlib) === modified file 'storage/ndb/src/mgmapi/Makefile.am' --- a/storage/ndb/src/mgmapi/Makefile.am 2010-08-06 08:19:19 +0000 +++ b/storage/ndb/src/mgmapi/Makefile.am 2010-11-11 13:19:26 +0000 @@ -14,8 +14,6 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -MYSQLCLUSTERdir= . - EXTRA_DIST = CMakeLists.txt noinst_LTLIBRARIES = libmgmapi.la @@ -25,8 +23,7 @@ libmgmapi_la_SOURCES = mgmapi.cpp ndb_lo INCLUDES_LOC = -I$(top_srcdir)/storage/ndb/include/mgmapi -DEFS_LOC = -DNDB_MGMAPI -DMYSQLCLUSTERDIR="\"$(MYSQLCLUSTERdir)\"" \ - -DNO_DEBUG_MESSAGES +DEFS_LOC = -DNDB_MGMAPI include $(top_srcdir)/storage/ndb/config/common.mk.am include $(top_srcdir)/storage/ndb/config/type_util.mk.am === modified file 'storage/ndb/src/mgmclient/CMakeLists.txt' --- a/storage/ndb/src/mgmclient/CMakeLists.txt 2010-11-09 16:03:56 +0000 +++ b/storage/ndb/src/mgmclient/CMakeLists.txt 2010-11-10 09:42:49 +0000 @@ -13,8 +13,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -INCLUDE_DIRECTORIES(${NDB_SOURCE_DIR}/src/common/mgmcommon - ${READLINE_INCLUDE_DIR}) +INCLUDE_DIRECTORIES(${NDB_SOURCE_DIR}/src/common/mgmcommon) ADD_LIBRARY(ndbmgmclient STATIC CommandInterpreter.cpp) === modified file 'storage/ndb/src/mgmclient/CommandInterpreter.cpp' --- a/storage/ndb/src/mgmclient/CommandInterpreter.cpp 2010-10-13 17:17:01 +0000 +++ b/storage/ndb/src/mgmclient/CommandInterpreter.cpp 2010-11-11 09:46:05 +0000 @@ -3183,3 +3183,4 @@ err: } template class Vector; +template class Vector; === modified file 'storage/ndb/src/mgmsrv/CMakeLists.txt' --- a/storage/ndb/src/mgmsrv/CMakeLists.txt 2010-11-09 16:17:44 +0000 +++ b/storage/ndb/src/mgmsrv/CMakeLists.txt 2010-11-11 15:08:52 +0000 @@ -16,14 +16,30 @@ INCLUDE_DIRECTORIES( ${NDB_SOURCE_DIR}/src/mgmapi ${NDB_SOURCE_DIR}/src/ndbapi - ${NDB_SOURCE_DIR}/src/mgmclient - ${READLINE_INCLUDE_DIR}) + ${NDB_SOURCE_DIR}/src/mgmclient) ADD_LIBRARY(ndbconf Config.cpp ConfigInfo.cpp InitConfigFileParser.cpp ) +TARGET_LINK_LIBRARIES(ndbconf ndbmgmapi) + +# Define MYSQLCLUSTERDIR, the default location +# of ndb_mgmd config files +IF(NOT DEFINED DEFAULT_MYSQL_HOME) + # MySQL does not define DEFAULT_MYSQL_HOME in pre 5.5 version, fall + # back to our old defaults and be backwards compatible + IF(WIN32) + SET(DEFAULT_MYSQL_HOME "C:/mysql" ) + ELSE() + SET(DEFAULT_MYSQL_HOME ${CMAKE_INSTALL_PREFIX}) + ENDIF() +ENDIF() +SET(clusterdir ${DEFAULT_MYSQL_HOME}/mysql-cluster) +ADD_DEFINITIONS(-DMYSQLCLUSTERDIR=\"${clusterdir}\") +MESSAGE(STATUS "Using MYSQLCLUSTERDIR: '${clusterdir}'") + IF(WIN32) # Add the rseource files for logging to event log === modified file 'storage/ndb/src/mgmsrv/Makefile.am' --- a/storage/ndb/src/mgmsrv/Makefile.am 2010-08-06 08:19:19 +0000 +++ b/storage/ndb/src/mgmsrv/Makefile.am 2010-11-11 13:19:26 +0000 @@ -16,11 +16,6 @@ EXTRA_DIST = CMakeLists.txt -MYSQLDATAdir = $(localstatedir) -MYSQLSHAREdir = $(pkgdatadir) -MYSQLBASEdir= $(prefix) -MYSQLCLUSTERdir= $(prefix)/mysql-cluster - ndbbin_PROGRAMS = ndb_mgmd ndb_mgmd_SOURCES = \ @@ -55,10 +50,9 @@ LDADD_LOC = $(top_builddir)/storage/ndb/ @NDB_SCI_LIBS@ \ @TERMCAP_LIB@ -DEFS_LOC = -DDEFAULT_MYSQL_HOME="\"$(MYSQLBASEdir)\"" \ - -DMYSQL_DATADIR="\"$(MYSQLDATAdir)\"" \ - -DSHAREDIR="\"$(MYSQLSHAREdir)\"" \ - -DMYSQLCLUSTERDIR="\"$(MYSQLCLUSTERdir)\"" +# Define MYSQLCLUSTERDIR, the default location +# of ndb_mgmd config files +DEFS_LOC = -DMYSQLCLUSTERDIR="\"$(prefix)/mysql-cluster\"" include $(top_srcdir)/storage/ndb/config/common.mk.am include $(top_srcdir)/storage/ndb/config/type_ndbapi.mk.am === modified file 'storage/ndb/src/mgmsrv/testConfig.cpp' --- a/storage/ndb/src/mgmsrv/testConfig.cpp 2010-08-27 12:12:51 +0000 +++ b/storage/ndb/src/mgmsrv/testConfig.cpp 2010-11-11 09:46:05 +0000 @@ -471,3 +471,6 @@ TAPTEST(MgmConfig) ndb_end(0); return 1; // OK } + +template class Vector; + === modified file 'storage/ndb/src/ndbapi/NdbTransaction.cpp' --- a/storage/ndb/src/ndbapi/NdbTransaction.cpp 2010-11-10 08:01:00 +0000 +++ b/storage/ndb/src/ndbapi/NdbTransaction.cpp 2010-11-15 10:26:48 +0000 @@ -989,8 +989,7 @@ NdbTransaction::doSend() query == lastLookupQuery && theFirstExecOpInList == NULL; const int tReturnCode = query->doSend(theDBnode, lastFlag); if (tReturnCode == -1) { - theReturnStatus = ReturnFailure; - break; + goto fail; } last = query; query = query->getNext(); @@ -1008,9 +1007,8 @@ NdbTransaction::doSend() const Uint32 lastFlag = ((tNext == NULL) ? 1 : 0); const int tReturnCode = tOp->doSend(theDBnode, lastFlag); if (tReturnCode == -1) { - theReturnStatus = ReturnFailure; - break; - } + goto fail; + }//if tOp = tNext; } @@ -1052,10 +1050,12 @@ NdbTransaction::doSend() abort(); break; }//switch - setOperationErrorCodeAbort(4002); + theReleaseOnClose = true; theTransactionIsStarted = false; theCommitStatus = Aborted; +fail: + setOperationErrorCodeAbort(4002); DBUG_RETURN(-1); }//NdbTransaction::doSend() === modified file 'storage/ndb/test/ndbapi/testDict.cpp' --- a/storage/ndb/test/ndbapi/testDict.cpp 2010-09-30 14:27:18 +0000 +++ b/storage/ndb/test/ndbapi/testDict.cpp 2010-11-10 10:14:04 +0000 @@ -1875,7 +1875,15 @@ int getColumnMaxLength(const NdbDictiona return 0; } - length= ((1 << attrDesc.AttributeSize) * c->getLength()) >> 3; + if (attrDesc.AttributeSize == 0) + { + // bits... + length = 4 * ((c->getLength() + 31) / 32); + } + else + { + length = ((1 << attrDesc.AttributeSize) * c->getLength()) >> 3; + } } return length; @@ -1995,6 +2003,8 @@ int runFailAddFragment(NDBT_Context* ctx NdbSleep_MilliSleep(SAFTY); // Hope that snapshot has arrived CHECK2(pDic->createTable(tab) != 0, "failed to fail after error insert " << errval); + CHECK2(restarter.insertErrorInNode(nodeId, 0) == 0, + "failed to clean error insert value"); CHECK(restarter.dumpStateAllNodes(&dump2, 1) == 0); NdbSleep_MilliSleep(SAFTY); // Hope that snapshot has arrived CHECK2(pDic->createTable(tab) == 0, @@ -2014,6 +2024,8 @@ int runFailAddFragment(NDBT_Context* ctx NdbSleep_MilliSleep(SAFTY); // Hope that snapshot has arrived CHECK2(pDic->createTable(tab) != 0, "failed to fail after error insert " << errval); + CHECK2(restarter.insertErrorInNode(nodeId, 0) == 0, + "failed to clean error insert value"); CHECK(restarter.dumpStateAllNodes(&dump2, 1) == 0); NdbSleep_MilliSleep(SAFTY); // Hope that snapshot has arrived CHECK2(pDic->createTable(tab) == 0, @@ -2037,6 +2049,8 @@ int runFailAddFragment(NDBT_Context* ctx CHECK2(pDic->createIndex(idx) != 0, "failed to fail after error insert " << errval); + CHECK2(restarter.insertErrorInNode(nodeId, 0) == 0, + "failed to clean error insert value"); CHECK(restarter.dumpStateAllNodes(&dump2, 1) == 0); NdbSleep_MilliSleep(SAFTY); // Hope that snapshot has arrived CHECK2(pDic->createIndex(idx) == 0, @@ -7098,6 +7112,8 @@ loop: NdbDictionary::HashMap check; CHECK2(res != 0, "create hashmap existed"); + CHECK2(restarter.insertErrorInNode(nodeId, 0) == 0, + "failed to clear error insert"); CHECK(restarter.dumpStateAllNodes(&dump2, 1) == 0); } } === modified file 'storage/ndb/test/ndbapi/testNdbApi.cpp' --- a/storage/ndb/test/ndbapi/testNdbApi.cpp 2010-11-05 10:26:02 +0000 +++ b/storage/ndb/test/ndbapi/testNdbApi.cpp 2010-11-10 12:28:34 +0000 @@ -351,6 +351,7 @@ int runTestGetValue(NDBT_Context* ctx, N case 880: // TUP - Read too much case 823: // TUP - Too much AI case 4257: // NDBAPI - Too much AI + case 4002: // NDBAPI - send problem // OK errors ERR(pCon->getNdbError()); break; === modified file 'storage/ndb/tools/CMakeLists.txt' --- a/storage/ndb/tools/CMakeLists.txt 2010-10-28 08:57:25 +0000 +++ b/storage/ndb/tools/CMakeLists.txt 2010-11-11 13:19:26 +0000 @@ -50,7 +50,6 @@ TARGET_LINK_LIBRARIES(ndb_config ndbmgmc SET(options "-I${CMAKE_SOURCE_DIR}/storage/ndb/src/mgmapi") SET(options "${options} -I${CMAKE_SOURCE_DIR}/storage/ndb/src/mgmsrv") SET(options "${options} -I${CMAKE_SOURCE_DIR}/storage/ndb/include/mgmcommon") -#SET(options "${options} -DMYSQLCLUSTERDIR=\"\\\"\\\"\"") SET_TARGET_PROPERTIES(ndb_config PROPERTIES COMPILE_FLAGS "${options}") === modified file 'storage/ndb/tools/Makefile.am' --- a/storage/ndb/tools/Makefile.am 2010-08-06 08:19:19 +0000 +++ b/storage/ndb/tools/Makefile.am 2010-11-11 13:19:26 +0000 @@ -63,8 +63,7 @@ ndb_config_SOURCES = ndb_config.cpp \ ndb_config_CXXFLAGS = -I$(top_srcdir)/storage/ndb/src/mgmapi \ -I$(top_srcdir)/storage/ndb/src/mgmsrv \ - -I$(top_srcdir)/storage/ndb/include/mgmcommon \ - -DMYSQLCLUSTERDIR="\"\"" + -I$(top_srcdir)/storage/ndb/include/mgmcommon ndb_restore_LDADD = $(top_builddir)/storage/ndb/src/common/util/libndbazio.la \ $(LDADD) No bundle (reason: useless for push emails).