From: Date: August 7 2008 3:39pm Subject: bzr push into mysql-6.0-ndb branch (jonas:2655) Bug#36547 List-Archive: http://lists.mysql.com/commits/51103 X-Bug: 36547 Message-Id: <20080807133913.62C96222DB@perch.localdomain> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 2655 jonas@stripped 2008-08-07 [merge] merge 5.1-telco-6.2-merge to 6.0-ndb removed: .bzr-mysql/ .bzr-mysql/default.conf mysql-test/r/innodb_bug34053.result mysql-test/r/rpl_slave_compressed_protocol_basic.result mysql-test/r/rpl_slave_exec_mode_basic.result mysql-test/r/rpl_slave_net_timeout_basic.result mysql-test/r/rpl_slave_transaction_retries_basic_32.result mysql-test/r/rpl_slave_transaction_retries_basic_64.result mysql-test/r/rpl_sync_binlog_basic_32.result mysql-test/r/rpl_sync_binlog_basic_64.result mysql-test/suite/ndb_team/t/ndb_dd_restore_compat.test mysql-test/t/innodb_bug34053.test mysql-test/t/rpl_slave_compressed_protocol_basic.test mysql-test/t/rpl_slave_exec_mode_basic.test mysql-test/t/rpl_slave_net_timeout_basic.test mysql-test/t/rpl_slave_transaction_retries_basic_32.test mysql-test/t/rpl_slave_transaction_retries_basic_64.test mysql-test/t/rpl_sync_binlog_basic_32.test mysql-test/t/rpl_sync_binlog_basic_64.test added: .bzr-mysql/ .bzr-mysql/default.conf mysql-test/include/multi_range_count_basic.inc mysql-test/include/show_qc_status.inc mysql-test/r/innodb_bug34053.result mysql-test/r/log_bin_trust_routine_creators_basic.result mysql-test/r/multi_range_count_basic_32.result mysql-test/r/multi_range_count_basic_64.result mysql-test/std_data/ndb_apply_status.frm mysql-test/suite/ndb/r/bug36547.result mysql-test/suite/ndb/r/ndb_cache_trans.result mysql-test/suite/ndb/t/bug36547.test mysql-test/suite/ndb/t/ndb_cache_trans.test mysql-test/t/innodb_bug34053.test mysql-test/t/log_bin_trust_routine_creators_basic.test mysql-test/t/multi_range_count_basic_32.test mysql-test/t/multi_range_count_basic_64.test mysys/tests/ mysys/tests/Makefile.am storage/ndb/src/common/util/ndb_show_compat.cc renamed: mysql-test/r/rpl_slave_allow_batching_basic.result => mysql-test/r/slave_allow_batching_basic.result mysql-test/suite/ndb_team/r/ndb_dd_restore_compat.result => mysql-test/suite/ndb/r/ndb_dd_restore_compat.result mysql-test/t/rpl_slave_allow_batching_basic.test => mysql-test/t/slave_allow_batching_basic.test mysys/test_charset.c => mysys/tests/test_charset.c mysys/test_dir.c => mysys/tests/test_dir.c mysys/testhash.c => mysys/tests/testhash.c storage/ndb/src/common/util/ndb_init.c => storage/ndb/src/common/util/ndb_init.cpp modified: .bzrignore BUILD/autorun.sh Makefile.am client/Makefile.am client/mysqltest.c config/ac-macros/ha_ndbcluster.m4 config/ac-macros/zlib.m4 configure.in dbug/Makefile.am extra/CMakeLists.txt extra/Makefile.am libmysql/Makefile.am libmysql/Makefile.shared libmysqld/Makefile.am libmysqld/examples/Makefile.am mysql-test/mysql-test-run.pl mysql-test/r/sp-error.result mysql-test/r/union.result mysql-test/suite/ndb/r/ndb_alter_table_backup.result mysql-test/suite/ndb/r/ndb_basic.result mysql-test/suite/ndb/r/ndb_blob.result mysql-test/suite/ndb/r/ndb_condition_pushdown.result mysql-test/suite/ndb/r/ndb_restore_compat.result mysql-test/suite/ndb/r/ndb_restore_different_endian_data.result mysql-test/suite/ndb/t/ndb_alter_table_backup.test mysql-test/suite/ndb/t/ndb_blob.test mysql-test/suite/ndb/t/ndb_condition_pushdown.test mysql-test/suite/ndb/t/ndb_restore_compat.test mysql-test/suite/ndb/t/ndb_restore_different_endian_data.test mysql-test/suite/ndb_team/t/rpl_ndb_dd_advance.test mysql-test/suite/rpl_ndb/r/rpl_ndb_apply_status.result mysql-test/suite/rpl_ndb/t/rpl_ndb_apply_status.test mysql-test/t/sp-error.test mysql-test/t/union.test mysys/Makefile.am mysys/my_bitmap.c mysys/queues.c netware/Makefile.am regex/Makefile.am scripts/mysql_config.sh sql/Makefile.am sql/ha_ndbcluster.cc sql/ha_ndbcluster_binlog.cc sql/ha_ndbcluster_connection.cc sql/ha_ndbcluster_connection.h sql/mysqld.cc sql/sql_class.h sql/stacktrace.c sql/table.cc storage/archive/Makefile.am storage/heap/Makefile.am storage/myisam/Makefile.am storage/ndb/config/type_ndbapitest.mk.am storage/ndb/config/type_ndbapitools.mk.am storage/ndb/include/kernel/signaldata/DumpStateOrd.hpp storage/ndb/include/kernel/signaldata/KeyInfo.hpp storage/ndb/include/kernel/signaldata/ListTables.hpp storage/ndb/include/mgmapi/mgmapi_config_parameters.h storage/ndb/include/ndb_version.h.in storage/ndb/include/ndbapi/NdbOperation.hpp storage/ndb/include/ndbapi/NdbReceiver.hpp storage/ndb/include/util/SimpleProperties.hpp storage/ndb/src/Makefile.am storage/ndb/src/common/debugger/EventLogger.cpp storage/ndb/src/common/transporter/TCP_Transporter.cpp storage/ndb/src/common/transporter/Transporter.cpp storage/ndb/src/common/transporter/TransporterRegistry.cpp storage/ndb/src/common/util/Makefile.am storage/ndb/src/common/util/version.c storage/ndb/src/cw/cpcd/Makefile.am storage/ndb/src/kernel/Makefile.am storage/ndb/src/kernel/blocks/ERROR_codes.txt storage/ndb/src/kernel/blocks/Makefile.am storage/ndb/src/kernel/blocks/backup/Backup.cpp storage/ndb/src/kernel/blocks/backup/Makefile.am storage/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp storage/ndb/src/kernel/blocks/dbacc/Dbacc.hpp storage/ndb/src/kernel/blocks/dbacc/DbaccInit.cpp storage/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp storage/ndb/src/kernel/blocks/dbdict/Makefile.am storage/ndb/src/kernel/blocks/dbdih/Dbdih.hpp storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp storage/ndb/src/kernel/blocks/dbdih/Makefile.am storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp storage/ndb/src/kernel/blocks/dblqh/Makefile.am storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp storage/ndb/src/kernel/blocks/dbtup/DbtupDebug.cpp storage/ndb/src/kernel/blocks/dbtup/DbtupGen.cpp storage/ndb/src/kernel/blocks/dbtup/DbtupMeta.cpp storage/ndb/src/kernel/blocks/dbtup/DbtupTabDesMan.cpp storage/ndb/src/kernel/blocks/dbtup/Makefile.am storage/ndb/src/kernel/blocks/dbtux/Dbtux.hpp storage/ndb/src/kernel/blocks/dbtux/DbtuxDebug.cpp storage/ndb/src/kernel/blocks/lgman.cpp storage/ndb/src/kernel/blocks/ndbcntr/Ndbcntr.hpp storage/ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp storage/ndb/src/kernel/blocks/qmgr/Qmgr.hpp storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp storage/ndb/src/kernel/blocks/suma/Suma.cpp storage/ndb/src/kernel/blocks/suma/Suma.hpp storage/ndb/src/kernel/error/ErrorReporter.cpp storage/ndb/src/kernel/main.cpp storage/ndb/src/kernel/vm/Configuration.cpp storage/ndb/src/kernel/vm/Emulator.cpp storage/ndb/src/kernel/vm/Makefile.am storage/ndb/src/kernel/vm/SimplePropertiesSection.cpp storage/ndb/src/kernel/vm/SimulatedBlock.cpp storage/ndb/src/kernel/vm/SimulatedBlock.hpp storage/ndb/src/kernel/vm/WatchDog.cpp storage/ndb/src/kernel/vm/bench_pool.cpp storage/ndb/src/kernel/vm/ndbd_malloc_impl.cpp storage/ndb/src/mgmclient/Makefile.am storage/ndb/src/mgmsrv/Makefile.am storage/ndb/src/mgmsrv/MgmtSrvr.cpp storage/ndb/src/mgmsrv/Services.cpp storage/ndb/src/mgmsrv/main.cpp storage/ndb/src/ndbapi/ClusterMgr.cpp storage/ndb/src/ndbapi/DictCache.cpp storage/ndb/src/ndbapi/Makefile.am storage/ndb/src/ndbapi/Ndb.cpp storage/ndb/src/ndbapi/NdbApiSignal.hpp storage/ndb/src/ndbapi/NdbBlob.cpp storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp storage/ndb/src/ndbapi/NdbEventOperationImpl.cpp storage/ndb/src/ndbapi/NdbIndexStat.cpp storage/ndb/src/ndbapi/NdbInterpretedCode.cpp storage/ndb/src/ndbapi/NdbOperation.cpp storage/ndb/src/ndbapi/NdbOperationDefine.cpp storage/ndb/src/ndbapi/NdbOperationExec.cpp storage/ndb/src/ndbapi/NdbOperationInt.cpp storage/ndb/src/ndbapi/NdbOperationSearch.cpp storage/ndb/src/ndbapi/NdbRecord.hpp storage/ndb/src/ndbapi/NdbScanOperation.cpp storage/ndb/src/ndbapi/NdbTransaction.cpp storage/ndb/src/ndbapi/Ndbif.cpp storage/ndb/src/ndbapi/Ndbinit.cpp storage/ndb/src/ndbapi/ObjectMap.cpp storage/ndb/src/ndbapi/ObjectMap.hpp storage/ndb/src/ndbapi/TransporterFacade.hpp storage/ndb/src/ndbapi/ndb_cluster_connection.cpp storage/ndb/src/ndbapi/ndberror.c storage/ndb/test/ndbapi/testBlobs.cpp storage/ndb/test/ndbapi/testDict.cpp storage/ndb/test/ndbapi/testInterpreter.cpp storage/ndb/test/ndbapi/testNodeRestart.cpp storage/ndb/test/ndbapi/testOIBasic.cpp storage/ndb/test/ndbapi/testSRBank.cpp storage/ndb/test/ndbapi/testScan.cpp storage/ndb/test/ndbapi/test_event.cpp storage/ndb/test/run-test/Makefile.am storage/ndb/test/run-test/daily-basic-tests.txt storage/ndb/tools/ndb_size.pl strings/Makefile.am unittest/mysys/Makefile.am mysql-test/r/slave_allow_batching_basic.result mysql-test/suite/ndb/r/ndb_dd_restore_compat.result mysql-test/t/slave_allow_batching_basic.test storage/ndb/src/common/util/ndb_init.cpp === added directory '.bzr-mysql' === removed directory '.bzr-mysql' === added file '.bzr-mysql/default.conf' --- a/.bzr-mysql/default.conf 1970-01-01 00:00:00 +0000 +++ b/.bzr-mysql/default.conf 2008-08-07 13:36:47 +0000 @@ -0,0 +1,4 @@ +[MYSQL] +post_commit_to = "commits@stripped" +post_push_to = "commits@stripped" +tree_name = "mysql-6.0-ndb" === removed file '.bzr-mysql/default.conf' --- a/.bzr-mysql/default.conf 2008-05-28 15:13:18 +0000 +++ b/.bzr-mysql/default.conf 1970-01-01 00:00:00 +0000 @@ -1,4 +0,0 @@ -[MYSQL] -post_commit_to = "commits@stripped" -post_push_to = "commits@stripped" -tree_name = "mysql-6.0" === modified file '.bzrignore' --- a/.bzrignore 2008-06-19 09:43:26 +0000 +++ b/.bzrignore 2008-08-07 13:36:47 +0000 @@ -1566,6 +1566,17 @@ mysys/test_thr_alarm mysys/test_thr_lock mysys/test_vsnprintf mysys/testhash +mysys/tests/.deps/test_charset.Tpo +mysys/tests/.deps/test_dir.Tpo +mysys/tests/test_base64 +mysys/tests/test_bitmap +mysys/tests/test_gethwaddr +mysys/tests/test_io_cache +mysys/tests/test_priority_queue +mysys/tests/test_thr_alarm +mysys/tests/test_thr_lock +mysys/tests/test_vsnprintf +mysys/tests/testhash ndb/bin/DbAsyncGenerator ndb/bin/DbCreate ndb/bin/acid @@ -2710,6 +2721,7 @@ storage/ndb/src/common/mgmcommon/printCo storage/ndb/src/common/portlib/libportlib.dsp storage/ndb/src/common/transporter/libtransporter.dsp storage/ndb/src/common/util/libgeneral.dsp +storage/ndb/src/common/util/ndb_show_compat storage/ndb/src/common/util/testBitmask.cpp storage/ndb/src/cw/cpcd/ndb_cpcd storage/ndb/src/dummy.cpp === modified file 'BUILD/autorun.sh' --- a/BUILD/autorun.sh 2007-10-29 21:48:58 +0000 +++ b/BUILD/autorun.sh 2008-04-25 06:32:23 +0000 @@ -27,5 +27,5 @@ $LIBTOOLIZE --automake --force --copy || # --add-missing instructs automake to install missing auxiliary files # and --force to overwrite them if they already exist -automake --add-missing --force --copy || die "Can't execute automake" +automake --add-missing --force --copy --gnu -W no-portability || die "Can't execute automake" autoconf || die "Can't execute autoconf" === modified file 'Makefile.am' --- a/Makefile.am 2008-06-16 19:27:44 +0000 +++ b/Makefile.am 2008-08-07 13:36:47 +0000 @@ -38,7 +38,7 @@ SUBDIRS = . include @docs_dirs@ @zlib_d DIST_SUBDIRS = . include Docs zlib \ cmd-line-utils sql-common scripts \ pstack \ - strings mysys dbug extra regex libmysql libmysql_r client unittest storage plugin \ + strings mysys dbug mysys/tests extra regex libmysql libmysql_r client unittest storage plugin \ vio sql man tests \ netware libmysqld \ mysql-test support-files sql-bench \ === modified file 'client/Makefile.am' --- a/client/Makefile.am 2008-02-19 14:09:52 +0000 +++ b/client/Makefile.am 2008-08-07 13:36:47 +0000 @@ -54,6 +54,7 @@ bin_PROGRAMS = mysql \ mysql_SOURCES = mysql.cc readline.cc sql_string.cc \ completion_hash.cc mysql_LDADD = @readline_link@ @TERMCAP_LIB@ \ + @ZLIB_LIBS@ \ $(LDADD) $(CXXLDFLAGS) mysqladmin_SOURCES = mysqladmin.cc @@ -75,7 +76,7 @@ mysqlimport_SOURCES= mysqlimport.c mysqlimport_LDADD = $(CXXLDFLAGS) $(CLIENT_THREAD_LIBS) \ @CLIENT_EXTRA_LDFLAGS@ \ $(LIBMYSQLCLIENT_LA) \ - $(top_builddir)/mysys/libmysys.a + $(top_builddir)/mysys/libmysyslt.la mysqlshow_SOURCES= mysqlshow.c @@ -84,7 +85,7 @@ mysqlslap_CFLAGS= -DTHREAD -UUNDEF_THRE mysqlslap_LDADD = $(CXXLDFLAGS) $(CLIENT_THREAD_LIBS) \ @CLIENT_EXTRA_LDFLAGS@ \ $(LIBMYSQLCLIENT_LA) \ - $(top_builddir)/mysys/libmysys.a + $(top_builddir)/mysys/libmysyslt.la mysqltest_SOURCES= mysqltest.c \ $(top_srcdir)/mysys/my_getsystime.c \ === modified file 'client/mysqltest.c' --- a/client/mysqltest.c 2008-06-19 09:43:26 +0000 +++ b/client/mysqltest.c 2008-08-07 13:36:47 +0000 @@ -67,7 +67,8 @@ enum { OPT_SKIP_SAFEMALLOC=OPT_MAX_CLIENT_OPTION, OPT_PS_PROTOCOL, OPT_SP_PROTOCOL, OPT_CURSOR_PROTOCOL, OPT_VIEW_PROTOCOL, - OPT_MAX_CONNECT_RETRIES, OPT_MARK_PROGRESS, OPT_LOG_DIR, OPT_TAIL_LINES + OPT_MAX_CONNECT_RETRIES, OPT_MARK_PROGRESS, OPT_LOG_DIR, OPT_TAIL_LINES, + OPT_RESULT_FORMAT_VERSION }; static int record= 0, opt_sleep= -1; @@ -77,6 +78,7 @@ const char *opt_logdir= ""; const char *opt_include= 0, *opt_charsets_dir; static int opt_port= 0; static int opt_max_connect_retries; +static int opt_result_format_version; static my_bool opt_compress= 0, silent= 0, verbose= 0; static my_bool debug_info_flag= 0, debug_check_flag= 0; static my_bool tty_password= 0; @@ -267,10 +269,12 @@ enum enum_commands { Q_WRITE_FILE, Q_COPY_FILE, Q_PERL, Q_DIE, Q_EXIT, Q_SKIP, Q_CHMOD_FILE, Q_APPEND_FILE, Q_CAT_FILE, Q_DIFF_FILES, Q_SEND_QUIT, Q_CHANGE_USER, Q_MKDIR, Q_RMDIR, + Q_RESULT_FORMAT_VERSION, Q_UNKNOWN, /* Unknown command. */ Q_COMMENT, /* Comments, ignored. */ - Q_COMMENT_WITH_COMMAND + Q_COMMENT_WITH_COMMAND, + Q_EMPTY_LINE }; @@ -355,6 +359,7 @@ const char *command_names[]= "change_user", "mkdir", "rmdir", + "result_format", 0 }; @@ -1990,6 +1995,59 @@ void var_query_set(VAR *var, const char } +static void +set_result_format_version(ulong new_version) +{ + switch (new_version){ + case 1: + /* The first format */ + break; + case 2: + /* New format that also writes comments and empty lines + from test file to result */ + break; + default: + die("Version format %lu has not yet been implemented", new_version); + break; + } + opt_result_format_version= new_version; +} + + +/* + Set the result format version to use when generating + the .result file +*/ + +static void +do_result_format_version(struct st_command *command) +{ + long version; + static DYNAMIC_STRING ds_version; + const struct command_arg result_format_args[] = { + "version", ARG_STRING, TRUE, &ds_version, "Version to use", + }; + + DBUG_ENTER("do_result_format_version"); + + check_command_args(command, command->first_argument, + result_format_args, + sizeof(result_format_args)/sizeof(struct command_arg), + ','); + + /* Convert version number to int */ + if (!str2int(ds_version.str, 10, (long) 0, (long) INT_MAX, &version)) + die("Invalid version number: '%s'", ds_version.str); + + set_result_format_version(version); + + dynstr_append(&ds_res, "result_format: "); + dynstr_append_mem(&ds_res, ds_version.str, ds_version.length); + dynstr_append(&ds_res, "\n"); + dynstr_free(&ds_version); +} + + /* Set variable from the result of a field in a query @@ -4613,7 +4671,7 @@ my_bool end_of_query(int c) int read_line(char *buf, int size) { - char c, last_quote; + char c, last_quote, last_char= 0; char *p= buf, *buf_end= buf + size - 1; int skip_char= 0; enum {R_NORMAL, R_Q, R_SLASH_IN_Q, @@ -4712,14 +4770,24 @@ int read_line(char *buf, int size) } else if (my_isspace(charset_info, c)) { - /* Skip all space at begining of line */ if (c == '\n') { + if (last_char == '\n') + { + /* Two new lines in a row, return empty line */ + DBUG_PRINT("info", ("Found two new lines in a row")); + *p++= c; + *p= 0; + DBUG_RETURN(0); + } + /* Query hasn't started yet */ start_lineno= cur_file->lineno; DBUG_PRINT("info", ("Query hasn't started yet, start_lineno: %d", start_lineno)); } + + /* Skip all space at begining of line */ skip_char= 1; } else if (end_of_query(c)) @@ -4760,6 +4828,8 @@ int read_line(char *buf, int size) } + last_char= c; + if (!skip_char) { /* Could be a multibyte character */ @@ -5005,9 +5075,10 @@ int read_command(struct st_command** com DBUG_RETURN(1); } - convert_to_format_v1(read_command_buf); + if (opt_result_format_version == 1) + convert_to_format_v1(read_command_buf); - DBUG_PRINT("info", ("query: %s", read_command_buf)); + DBUG_PRINT("info", ("query: '%s'", read_command_buf)); if (*p == '#') { command->type= Q_COMMENT; @@ -5017,6 +5088,10 @@ int read_command(struct st_command** com command->type= Q_COMMENT_WITH_COMMAND; p+= 2; /* Skip past -- */ } + else if (*p == '\n') + { + command->type= Q_EMPTY_LINE; + } /* Skip leading spaces */ while (*p && my_isspace(charset_info, *p)) @@ -5109,6 +5184,11 @@ static struct my_option my_long_options[ {"result-file", 'R', "Read/Store result from/in this file.", (uchar**) &result_file_name, (uchar**) &result_file_name, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"result-format-version", OPT_RESULT_FORMAT_VERSION, + "Version of the result file format to use", + (uchar**) &opt_result_format_version, + (uchar**) &opt_result_format_version, 0, + GET_INT, REQUIRED_ARG, 1, 1, 2, 0, 0, 0}, {"server-arg", 'A', "Send option value to embedded server as a parameter.", 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"server-file", 'F', "Read embedded server arguments from file.", @@ -5300,6 +5380,9 @@ get_one_option(int optid, const struct m sf_malloc_quick=1; #endif break; + case OPT_RESULT_FORMAT_VERSION: + set_result_format_version(opt_result_format_version); + break; case 'V': print_version(); exit(0); @@ -7003,6 +7086,7 @@ int main(int argc, char **argv) case Q_COPY_FILE: do_copy_file(command); break; case Q_CHMOD_FILE: do_chmod_file(command); break; case Q_PERL: do_perl(command); break; + case Q_RESULT_FORMAT_VERSION: do_result_format_version(command); break; case Q_DELIMITER: do_delimiter(command); break; @@ -7119,9 +7203,38 @@ int main(int argc, char **argv) do_sync_with_master2(0); break; } - case Q_COMMENT: /* Ignore row */ + case Q_COMMENT: + { + const char* p= command->query; command->last_argument= command->end; + + /* Don't output comments in v1 */ + if (opt_result_format_version == 1) + break; + + /* Don't output comments if query logging is off */ + if (disable_query_log) + break; + + /* Write comment's with two starting #'s to result file */ + if (p && *p == '#' && *(p+1) == '#') + { + dynstr_append_mem(&ds_res, command->query, command->query_len); + dynstr_append(&ds_res, "\n"); + } break; + } + case Q_EMPTY_LINE: + /* Don't output newline in v1 */ + if (opt_result_format_version == 1) + break; + + /* Don't output newline if query logging is off */ + if (disable_query_log) + break; + + dynstr_append(&ds_res, "\n"); + break; case Q_PING: (void) mysql_ping(&cur_con->mysql); break; === modified file 'config/ac-macros/ha_ndbcluster.m4' --- a/config/ac-macros/ha_ndbcluster.m4 2008-04-02 12:04:51 +0000 +++ b/config/ac-macros/ha_ndbcluster.m4 2008-08-07 13:36:47 +0000 @@ -2,9 +2,10 @@ dnl ------------------------------------ dnl Macro: MYSQL_CHECK_NDBCLUSTER dnl --------------------------------------------------------------------------- -NDB_MYSQL_VERSION_MAJOR=`echo $MYSQL_NUMERIC_VERSION | cut -d. -f1` -NDB_MYSQL_VERSION_MINOR=`echo $MYSQL_NUMERIC_VERSION | cut -d. -f2` -NDB_MYSQL_VERSION_BUILD=`echo $MYSQL_NUMERIC_VERSION | cut -d. -f3` +NDB_MYSQL_VERSION_MAJOR=`echo $VERSION | cut -d. -f1` +NDB_MYSQL_VERSION_MINOR=`echo $VERSION | cut -d. -f2` +NDB_MYSQL_VERSION_BUILD=`echo $VERSION | cut -d. -f3 | cut -d- -f1` + TEST_NDBCLUSTER="" dnl for build ndb docs @@ -52,38 +53,38 @@ AC_DEFUN([MYSQL_CHECK_NDB_OPTIONS], [ esac AC_ARG_WITH([ndb-test], - [ - --with-ndb-test Include the NDB Cluster ndbapi test programs], + [AC_HELP_STRING([--with-ndb-test], + [Include the NDB Cluster ndbapi test programs])], [ndb_test="$withval"], [ndb_test=no]) AC_ARG_WITH([ndb-docs], - [ - --with-ndb-docs Include the NDB Cluster ndbapi and mgmapi documentation], + [AC_HELP_STRING([--with-ndb-docs], + [Include the NDB Cluster ndbapi and mgmapi documentation])], [ndb_docs="$withval"], [ndb_docs=no]) AC_ARG_WITH([ndb-port], - [ - --with-ndb-port Port for NDB Cluster management server], + [AC_HELP_STRING([--with-ndb-port], + [Port for NDB Cluster management server])], [ndb_port="$withval"], [ndb_port="default"]) AC_ARG_WITH([ndb-port-base], - [ - --with-ndb-port-base Base port for NDB Cluster transporters], + [AC_HELP_STRING([--with-ndb-port-base], + [Base port for NDB Cluster transporters])], [ndb_port_base="$withval"], [ndb_port_base="default"]) AC_ARG_WITH([ndb-debug], - [ - --without-ndb-debug Disable special ndb debug features], + [AC_HELP_STRING([--without-ndb-debug], + [Disable special ndb debug features])], [ndb_debug="$withval"], [ndb_debug="default"]) AC_ARG_WITH([ndb-ccflags], - AC_HELP_STRING([--with-ndb-ccflags=CFLAGS], - [Extra CFLAGS for ndb compile]), + [AC_HELP_STRING([--with-ndb-ccflags=CFLAGS], + [Extra CFLAGS for ndb compile])], [ndb_ccflags=${withval}], [ndb_ccflags=""]) AC_ARG_WITH([ndb-binlog], - [ - --without-ndb-binlog Disable ndb binlog], + [AC_HELP_STRING([--without-ndb-binlog], + [Disable ndb binlog])], [ndb_binlog="$withval"], [ndb_binlog="default"]) @@ -139,6 +140,7 @@ AC_DEFUN([MYSQL_CHECK_NDB_OPTIONS], [ ;; esac + AC_MSG_RESULT([done.]) ]) @@ -202,7 +204,7 @@ AC_DEFUN([MYSQL_SETUP_NDBCLUSTER], [ NDB_DEFS="-DNDB_DEBUG -DVM_TRACE -DERROR_INSERT -DARRAY_GUARD" elif test "$have_ndb_debug" = "full" then - NDB_DEFS="-DNDB_DEBUG_FULL -DVM_TRACE -DERROR_INSERT -DARRAY_GUARD" + NDB_DEFS="-DNDB_DEBUG_FULL -DVM_TRACE -DERROR_INSERT -DARRAY_GUARD -DAPI_TRACE" else # no extra ndb debug but still do asserts if debug version if test "$with_debug" = "yes" -o "$with_debug" = "full" === modified file 'config/ac-macros/zlib.m4' --- a/config/ac-macros/zlib.m4 2007-09-26 16:47:55 +0000 +++ b/config/ac-macros/zlib.m4 2008-04-25 06:32:23 +0000 @@ -19,7 +19,6 @@ AC_DEFUN([MYSQL_CHECK_ZLIB_DIR], [ save_CPPFLAGS="$CPPFLAGS" save_LIBS="$LIBS" CPPFLAGS="$ZLIB_INCLUDES $CPPFLAGS" -LIBS="$LIBS $ZLIB_LIBS" if test X"$with_server" = Xno then zlibsym=zlibVersion === modified file 'configure.in' --- a/configure.in 2008-06-19 09:43:26 +0000 +++ b/configure.in 2008-08-07 13:36:47 +0000 @@ -9,12 +9,12 @@ AC_CANONICAL_SYSTEM # remember to also update version.c in ndb # When changing major version number please also check switch statement # in mysqlbinlog::check_master_version(). -AM_INIT_AUTOMAKE(mysql, 6.0.6-alpha) +AM_INIT_AUTOMAKE(mysql, 6.0.6-alpha-ndb-6.2.16) AM_CONFIG_HEADER([include/config.h:config.h.in]) NDB_VERSION_MAJOR=6 NDB_VERSION_MINOR=2 -NDB_VERSION_BUILD=14 +NDB_VERSION_BUILD=16 NDB_VERSION_STATUS="-RC" PROTOCOL_VERSION=10 @@ -22,7 +22,7 @@ DOT_FRM_VERSION=6 # See the libtool docs for information on how to do shared lib versions. SHARED_LIB_MAJOR_VERSION=16 SHARED_LIB_VERSION=$SHARED_LIB_MAJOR_VERSION:0:0 -NDB_SHARED_LIB_MAJOR_VERSION=3 +NDB_SHARED_LIB_MAJOR_VERSION=4 NDB_SHARED_LIB_VERSION=$NDB_SHARED_LIB_MAJOR_VERSION:0:0 # Set all version vars based on $VERSION. How do we do this more elegant ? @@ -858,6 +858,7 @@ AC_CHECK_FUNCS(log2) AC_CHECK_LIB(nsl_r, gethostbyname_r, [], AC_CHECK_LIB(nsl, gethostbyname_r)) AC_CHECK_FUNC(gethostbyname_r) +AC_CHECK_LIB(mtmalloc, malloc) AC_CHECK_FUNC(setsockopt, , AC_CHECK_LIB(socket, setsockopt)) AC_CHECK_FUNC(yp_get_default_domain, , @@ -2760,7 +2761,7 @@ if test -d "$srcdir/cmd-line-utils/readl AC_CONFIG_FILES(cmd-line-utils/readline/Makefile) fi -AC_CONFIG_FILES(Makefile extra/Makefile mysys/Makefile dnl +AC_CONFIG_FILES(Makefile extra/Makefile mysys/Makefile mysys/tests/Makefile dnl unittest/Makefile unittest/mytap/Makefile unittest/mytap/t/Makefile dnl unittest/mysys/Makefile unittest/examples/Makefile dnl strings/Makefile regex/Makefile storage/Makefile dnl === modified file 'dbug/Makefile.am' --- a/dbug/Makefile.am 2006-12-31 00:32:21 +0000 +++ b/dbug/Makefile.am 2008-04-25 06:32:23 +0000 @@ -16,10 +16,18 @@ # MA 02111-1307, USA INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -LDADD = libdbug.a ../mysys/libmysys.a ../strings/libmystrings.a -pkglib_LIBRARIES = libdbug.a +LDADD = libdbuglt.la $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/strings/libmystringslt.la ${ZLIB_LIBS} +pkglib_LTLIBRARIES = libdbug.la +libdbug_la_LDFLAGS = -static +libdbug_la_SOURCES = +libdbug_la_LIBADD = libdbuglt.la +# Force C++ linking - dummy.cxx doesn't have to exist with EXTRA in the name +nodist_EXTRA_libdbug_la_SOURCES = dummy.cxx + +noinst_LTLIBRARIES = libdbuglt.la noinst_HEADERS = dbug_long.h -libdbug_a_SOURCES = dbug.c sanity.c +libdbuglt_la_SOURCES = dbug.c sanity.c EXTRA_DIST = CMakeLists.txt example1.c example2.c example3.c \ user.r monty.doc dbug_add_tags.pl \ my_main.c main.c factorial.c dbug_analyze.c \ === modified file 'extra/CMakeLists.txt' --- a/extra/CMakeLists.txt 2008-04-02 17:52:11 +0000 +++ b/extra/CMakeLists.txt 2008-08-07 13:36:47 +0000 @@ -47,6 +47,9 @@ TARGET_LINK_LIBRARIES(perror strings mys ADD_EXECUTABLE(resolveip resolveip.c) TARGET_LINK_LIBRARIES(resolveip strings mysys debug dbug ws2_32) +ADD_EXECUTABLE(resolveip resolveip.c) +TARGET_LINK_LIBRARIES(resolveip strings mysys debug dbug wsock32) + ADD_EXECUTABLE(replace replace.c) TARGET_LINK_LIBRARIES(replace strings mysys debug dbug ws2_32) === modified file 'extra/Makefile.am' --- a/extra/Makefile.am 2007-11-01 18:37:56 +0000 +++ b/extra/Makefile.am 2008-08-07 13:36:47 +0000 @@ -15,8 +15,10 @@ INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include \ -I$(top_srcdir)/sql -LDADD = @CLIENT_EXTRA_LDFLAGS@ ../mysys/libmysys.a \ - ../dbug/libdbug.a ../strings/libmystrings.a \ +LDADD = @CLIENT_EXTRA_LDFLAGS@ \ + $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/dbug/libdbuglt.la \ + $(top_builddir)/strings/libmystringslt.la \ $(ZLIB_LIBS) BUILT_SOURCES= $(top_builddir)/include/mysqld_error.h \ $(top_builddir)/include/sql_state.h \ @@ -44,6 +46,7 @@ $(top_builddir)/include/sql_state.h: $(t bin_PROGRAMS = replace perror resolveip my_print_defaults \ resolve_stack_dump mysql_waitpid innochecksum + noinst_PROGRAMS = charset2html EXTRA_PROGRAMS = comp_err EXTRA_DIST = CMakeLists.txt === modified file 'libmysql/Makefile.am' --- a/libmysql/Makefile.am 2007-11-22 11:39:07 +0000 +++ b/libmysql/Makefile.am 2008-04-28 00:09:08 +0000 @@ -22,7 +22,7 @@ target = libmysqlclient.la target_defs = -DUNDEF_THREADS_HACK -DDONT_USE_RAID @LIB_EXTRA_CCFLAGS@ -LIBS = @CLIENT_LIBS@ +LIBS = @CLIENT_LIBS@ INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include \ $(openssl_includes) @ZLIB_INCLUDES@ @@ -36,15 +36,10 @@ noinst_HEADERS = client_settings.h link_sources: set -x; \ - ss=`echo $(mystringsobjects) | sed "s;\.lo;.c;g"`; \ ds=`echo $(dbugobjects) | sed "s;\.lo;.c;g"`; \ ms=`echo $(mysysobjects) | sed "s;\.lo;.c;g"`; \ vs=`echo $(vio_objects) | sed "s;\.lo;.c;g"`; \ scs=`echo $(sql_cmn_objects) | sed "s;\.lo;.c;g"`; \ - for f in $$ss; do \ - rm -f $$f; \ - @LN_CP_F@ $(top_srcdir)/strings/$$f $$f; \ - done; \ for f in $$vs $(vioheaders); do \ rm -f $$f; \ @LN_CP_F@ $(top_srcdir)/vio/$$f $$f; \ @@ -53,10 +48,6 @@ link_sources: rm -f $$f; \ @LN_CP_F@ $(top_srcdir)/sql-common/$$f $$f; \ done; \ - for f in $(mystringsextra); do \ - rm -f $$f; \ - @LN_CP_F@ $(top_srcdir)/strings/$$f $$f; \ - done; \ for f in $$ds; do \ rm -f $$f; \ @LN_CP_F@ $(top_srcdir)/dbug/$$f $$f; \ @@ -87,7 +78,7 @@ nh = my_global.h config-win32.h dbug.h mysys_err.h my_pthread.h thr_alarm.h violite.h hash.h \ sql_common.h ../libmysql/client_settings.h # Get a list of the needed objects -lobjs = $(mysysobjects1) $(dbugobjects) $(mystringsobjects) $(sqlobjects) +lobjs = $(mysysobjects1) $(dbugobjects) $(sqlobjects) do-lib-dist: dir=libmysql-$(MYSQL_NO_DASH_VERSION); \ === modified file 'libmysql/Makefile.shared' --- a/libmysql/Makefile.shared 2008-04-01 15:13:57 +0000 +++ b/libmysql/Makefile.shared 2008-08-07 13:36:47 +0000 @@ -34,21 +34,6 @@ noinst_PROGRAMS = conf_to_src target_sources = libmysql.c password.c \ get_password.c errmsg.c -mystringsobjects = strmov.lo strxmov.lo strxnmov.lo strnmov.lo \ - strmake.lo strend.lo \ - strnlen.lo strfill.lo is_prefix.lo \ - int2str.lo str2int.lo strinstr.lo strcont.lo \ - strcend.lo bcmp.lo ctype-latin1.lo \ - bchange.lo bmove.lo bmove_upp.lo longlong2str.lo \ - strtoull.lo strtoll.lo llstr.lo my_vsnprintf.lo \ - ctype.lo ctype-simple.lo ctype-bin.lo ctype-mb.lo \ - ctype-big5.lo ctype-czech.lo ctype-cp932.lo ctype-eucjpms.lo ctype-euc_kr.lo \ - ctype-win1250ch.lo ctype-utf8.lo ctype-extra.lo \ - ctype-ucs2.lo ctype-gb2312.lo ctype-gbk.lo \ - ctype-sjis.lo ctype-tis620.lo ctype-ujis.lo \ - ctype-uca.lo xml.lo my_strtoll10.lo str_alloc.lo dtoa.lo - -mystringsextra= strto.c dbugobjects = dbug.lo # IT IS IN SAFEMALLOC.C sanity.lo mysysheaders = mysys_priv.h my_static.h vioheaders = vio_priv.h @@ -75,8 +60,7 @@ sql_cmn_objects = pack.lo client.lo my_t # Not needed in the minimum library mysysobjects2 = my_lib.lo mf_qsort.lo mysysobjects = $(mysysobjects1) $(mysysobjects2) -target_libadd = $(mysysobjects) $(mystringsobjects) $(dbugobjects) \ - $(sql_cmn_objects) $(vio_objects) $(sqlobjects) +target_libadd = $(mysysobjects) $(dbugobjects) $(sql_cmn_objects) $(vio_objects) $(sqlobjects) $(top_builddir)/strings/libmystringslt.la target_ldflags = -version-info @SHARED_LIB_VERSION@ @LD_VERSION_SCRIPT@ vio_objects= vio.lo viosocket.lo viossl.lo viosslfactories.lo @@ -100,13 +84,12 @@ endif #bmove_upp.lo: $(LTCHARSET_OBJS) clean-local: - rm -f `echo $(mystringsobjects) | sed "s;\.lo;.c;g"` \ - `echo $(dbugobjects) | sed "s;\.lo;.c;g"` \ + rm -f `echo $(dbugobjects) | sed "s;\.lo;.c;g"` \ `echo $(mysysobjects) | sed "s;\.lo;.c;g"` \ `echo $(vio_objects) | sed "s;\.lo;.c;g"` \ `echo $(sql_cmn_objects) | sed "s;\.lo;.c;g"` \ $(CHARSET_SRCS) $(CHARSET_OBJS) \ - $(mystringsextra) $(mysysheaders) $(vioheaders) \ + $(mysysheaders) $(vioheaders) \ net.c conf_to_src_SOURCES = conf_to_src.c === modified file 'libmysqld/Makefile.am' --- a/libmysqld/Makefile.am 2008-05-09 07:47:28 +0000 +++ b/libmysqld/Makefile.am 2008-08-07 13:36:47 +0000 @@ -97,9 +97,9 @@ sql_yacc.cc sql_yacc.h: $(top_srcdir)/sq # The following libraries should be included in libmysqld.a INC_LIB= $(top_builddir)/regex/libregex.a \ - $(top_builddir)/mysys/libmysys.a \ - $(top_builddir)/strings/libmystrings.a \ - $(top_builddir)/dbug/libdbug.a \ + $(top_builddir)/mysys/.libs/libmysys.a \ + $(top_builddir)/strings/.libs/libmystrings.a \ + $(top_builddir)/dbug/.libs/libdbug.a \ $(top_builddir)/vio/libvio.a \ @NDB_SCI_LIBS@ \ @mysql_plugin_libs@ \ === modified file 'libmysqld/examples/Makefile.am' --- a/libmysqld/examples/Makefile.am 2007-12-07 14:35:28 +0000 +++ b/libmysqld/examples/Makefile.am 2008-08-07 13:36:47 +0000 @@ -37,7 +37,8 @@ INCLUDES = -I$(top_builddir)/include -I$ -I$(top_srcdir) -I$(top_srcdir)/client -I$(top_srcdir)/regex \ $(openssl_includes) LIBS = @LIBS@ @WRAPLIBS@ @CLIENT_LIBS@ $(yassl_libs) -LDADD = @CLIENT_EXTRA_LDFLAGS@ ../libmysqld.a @LIBDL@ $(CXXLDFLAGS) \ +LDADD = @CLIENT_EXTRA_LDFLAGS@ $(top_srcdir)/libmysqld/libmysqld.a \ + @LIBDL@ $(CXXLDFLAGS) \ @NDB_SCI_LIBS@ mysqltest_embedded_LINK = $(CXXLINK) === added file 'mysql-test/include/multi_range_count_basic.inc' --- a/mysql-test/include/multi_range_count_basic.inc 1970-01-01 00:00:00 +0000 +++ b/mysql-test/include/multi_range_count_basic.inc 2008-05-08 18:13:39 +0000 @@ -0,0 +1,219 @@ +############## mysql-test\t\multi_range_count_basic.test ############### +# # +# Variable Name: multi_range_count # +# Scope: GLOBAL | SESSION # +# Access Type: Dynamic # +# Data Type: numeric # +# Default Value: 256 # +# Range:1-4294967295 # +# # +# # +# Creation Date: 2008-02-07 # +# Author: Salman # +# # +# Description: Test Cases of Dynamic System Variable multi_range_count # +# that checks the behavior of this variable in the following ways# +# * Default Value # +# * Valid & Invalid values # +# * Scope & Access method # +# * Data Integrity # +# # +# Reference: http://dev.mysql.com/doc/refman/5.1/en/ # +# server-system-variables.html # +# # +############################################################################### + +--source include/load_sysvars.inc + +################################################################# +# START OF multi_range_count TESTS # +################################################################# + + +############################################################# +# Save initial value # +############################################################# + +SET @start_global_value = @@global.multi_range_count; +SELECT @start_global_value; +SET @start_session_value = @@session.multi_range_count; +SELECT @start_session_value; + + +--echo '#--------------------FN_DYNVARS_090_01-------------------------#' +################################################################# +# Display the DEFAULT value of multi_range_count # +################################################################# + +SET @@global.multi_range_count = 100; +SET @@global.multi_range_count = DEFAULT; +SELECT @@global.multi_range_count; + +SET @@session.multi_range_count = 200; +SET @@session.multi_range_count = DEFAULT; +SELECT @@session.multi_range_count; + + +--echo '#--------------------FN_DYNVARS_090_02-------------------------#' +################################################################# +# Check the DEFAULT value of multi_range_count # +################################################################# + +SET @@global.multi_range_count = DEFAULT; +SELECT @@global.multi_range_count = 256; + +SET @@session.multi_range_count = DEFAULT; +SELECT @@session.multi_range_count = 256; + + +--echo '#--------------------FN_DYNVARS_090_03-------------------------#' +########################################################################### +# Change the value of multi_range_count to a valid value for GLOBAL Scope # +########################################################################### + +SET @@global.multi_range_count = 1; +SELECT @@global.multi_range_count; +SET @@global.multi_range_count = 60020; +SELECT @@global.multi_range_count; +SET @@global.multi_range_count = 65535; +SELECT @@global.multi_range_count; +SET @@global.multi_range_count = 4294967295; +SELECT @@global.multi_range_count; +SET @@global.multi_range_count = 4294967294; +SELECT @@global.multi_range_count; + + + +--echo '#--------------------FN_DYNVARS_090_04-------------------------#' +############################################################################ +# Change the value of multi_range_count to a valid value for SESSION Scope # +############################################################################ + +SET @@session.multi_range_count = 1; +SELECT @@session.multi_range_count; +SET @@session.multi_range_count = 50050; +SELECT @@session.multi_range_count; +SET @@session.multi_range_count = 65535; +SELECT @@session.multi_range_count; +SET @@session.multi_range_count = 4294967295; +SELECT @@session.multi_range_count; +SET @@session.multi_range_count = 4294967294; +SELECT @@session.multi_range_count; + + +--echo '#------------------FN_DYNVARS_090_05-----------------------#' +############################################################# +# Change the value of multi_range_count to an invalid value # +############################################################# + +SET @@global.multi_range_count = 0; +SELECT @@global.multi_range_count; +SET @@global.multi_range_count = 4294967296; +SELECT @@global.multi_range_count; +SET @@global.multi_range_count = -1024; +SELECT @@global.multi_range_count; +SET @@global.multi_range_count = 429496729500; +SELECT @@global.multi_range_count; +--Error ER_WRONG_TYPE_FOR_VAR +SET @@global.multi_range_count = 65530.34; +SELECT @@global.multi_range_count; +--Error ER_WRONG_TYPE_FOR_VAR +SET @@global.multi_range_count = test; +SELECT @@global.multi_range_count; + +SET @@session.multi_range_count = 0; +SELECT @@session.multi_range_count; +SET @@session.multi_range_count = 4294967296; +SELECT @@session.multi_range_count; +SET @@session.multi_range_count = -1; +SELECT @@session.multi_range_count; +--Error ER_PARSE_ERROR +SET @@session.multi_range_count = 65530.34.; +SET @@session.multi_range_count = 4294967295021; +SELECT @@session.multi_range_count; +--echo 'Bug # 34837: Errors are not coming on assigning invalid values to variable'; + +--Error ER_WRONG_TYPE_FOR_VAR +SET @@session.multi_range_count = test; +SELECT @@session.multi_range_count; + + +--echo '#------------------FN_DYNVARS_090_06-----------------------#' +#################################################################### +# Check if the value in GLOBAL Table matches value in variable # +#################################################################### + + +SELECT @@global.multi_range_count = VARIABLE_VALUE +FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES +WHERE VARIABLE_NAME='multi_range_count'; + +--echo '#------------------FN_DYNVARS_090_07-----------------------#' +#################################################################### +# Check if the value in SESSION Table matches value in variable # +#################################################################### + +SELECT @@session.multi_range_count = VARIABLE_VALUE +FROM INFORMATION_SCHEMA.SESSION_VARIABLES +WHERE VARIABLE_NAME='multi_range_count'; + + +--echo '#------------------FN_DYNVARS_090_08-----------------------#' +#################################################################### +# Check if TRUE and FALSE values can be used on variable # +#################################################################### + +SET @@global.multi_range_count = TRUE; +SELECT @@global.multi_range_count; +SET @@global.multi_range_count = FALSE; +SELECT @@global.multi_range_count; + + +--echo '#---------------------FN_DYNVARS_090_09----------------------#' +################################################################################# +# Check if accessing variable with and without GLOBAL point to same variable # +################################################################################# + +SET @@global.multi_range_count = 10; +SELECT @@multi_range_count = @@global.multi_range_count; + + +--echo '#---------------------FN_DYNVARS_090_10----------------------#' +######################################################################################################## +# Check if accessing variable with SESSION,LOCAL and without SCOPE points to same session variable # +######################################################################################################## + +SET @@multi_range_count = 100; +SELECT @@multi_range_count = @@local.multi_range_count; +SELECT @@local.multi_range_count = @@session.multi_range_count; + + +--echo '#---------------------FN_DYNVARS_090_11----------------------#' +############################################################################ +# Check if multi_range_count can be accessed with and without @@ sign # +############################################################################ + +SET multi_range_count = 1; +SELECT @@multi_range_count; +--Error ER_UNKNOWN_TABLE +SELECT local.multi_range_count; +--Error ER_UNKNOWN_TABLE +SELECT session.multi_range_count; +--Error ER_BAD_FIELD_ERROR +SELECT multi_range_count = @@session.multi_range_count; + + +#################################### +# Restore initial value # +#################################### + +SET @@global.multi_range_count = @start_global_value; +SELECT @@global.multi_range_count; +SET @@session.multi_range_count = @start_session_value; +SELECT @@session.multi_range_count; + + +###################################################### +# END OF multi_range_count TESTS # +###################################################### + === added file 'mysql-test/include/show_qc_status.inc' --- a/mysql-test/include/show_qc_status.inc 1970-01-01 00:00:00 +0000 +++ b/mysql-test/include/show_qc_status.inc 2008-05-28 14:26:26 +0000 @@ -0,0 +1,10 @@ +# +# Retrieve the value of 'show status like "Qcache_[inserts, hits, queries]"' +# and display it in a minimal fashion on one line +# +let $_qcache_inserts= query_get_value(SHOW STATUS LIKE "Qcache_inserts", Value, 1); +let $_qcache_hits= query_get_value(SHOW STATUS LIKE "Qcache_hits", Value, 1); +let $_qcache_queries= query_get_value(SHOW STATUS LIKE "Qcache_queries_in_cache", Value, 1); +echo Qcache_queries $_qcache_queries; +echo Qcache_inserts $_qcache_inserts; +echo Qcache_hits $_qcache_hits; === modified file 'mysql-test/mysql-test-run.pl' --- a/mysql-test/mysql-test-run.pl 2008-06-19 09:43:26 +0000 +++ b/mysql-test/mysql-test-run.pl 2008-08-07 13:36:47 +0000 @@ -3997,6 +3997,7 @@ sub stop_all_servers () { { rm_ndbcluster_tables($mysqld->{'path_myddir'}); } + } @@ -4315,22 +4316,6 @@ sub run_testcase_start_servers($) { $tinfo->{'master_num'} > 1 ) { # Test needs cluster, start an extra mysqld connected to cluster - - if ( $mysql_version_id >= 50100 ) - { - # First wait for first mysql server to have created ndb system - # tables ok FIXME This is a workaround so that only one mysqld - # create the tables - if ( ! sleep_until_file_created( - "$master->[0]->{'path_myddir'}/mysql/ndb_apply_status.ndb", - $master->[0]->{'start_timeout'}, - $master->[0]->{'pid'})) - { - - $tinfo->{'comment'}= "Failed to create 'mysql/ndb_apply_status' table"; - return 1; - } - } mysqld_start($master->[1],$tinfo->{'master_opt'},[]); } === added file 'mysql-test/r/innodb_bug34053.result' --- a/mysql-test/r/innodb_bug34053.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/r/innodb_bug34053.result 2008-02-19 16:44:09 +0000 @@ -0,0 +1 @@ +SET storage_engine=InnoDB; === removed file 'mysql-test/r/innodb_bug34053.result' --- a/mysql-test/r/innodb_bug34053.result 2008-06-12 00:08:07 +0000 +++ b/mysql-test/r/innodb_bug34053.result 1970-01-01 00:00:00 +0000 @@ -1 +0,0 @@ -SET storage_engine=InnoDB; === added file 'mysql-test/r/log_bin_trust_routine_creators_basic.result' --- a/mysql-test/r/log_bin_trust_routine_creators_basic.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/r/log_bin_trust_routine_creators_basic.result 2008-04-10 13:14:28 +0000 @@ -0,0 +1,121 @@ +SET @start_global_value = @@global.log_bin_trust_routine_creators; +SELECT @start_global_value; +@start_global_value +1 +'#--------------------FN_DYNVARS_064_01-------------------------#' +SET @@global.log_bin_trust_routine_creators = TRUE; +Warnings: +Warning 1287 The syntax 'log_bin_trust_routine_creators' is deprecated and will be removed in MySQL 5.2. Please use 'log_bin_trust_function_creators' instead +SET @@global.log_bin_trust_routine_creators = DEFAULT; +Warnings: +Warning 1287 The syntax 'log_bin_trust_routine_creators' is deprecated and will be removed in MySQL 5.2. Please use 'log_bin_trust_function_creators' instead +SELECT @@global.log_bin_trust_routine_creators; +@@global.log_bin_trust_routine_creators +0 +'#--------------------FN_DYNVARS_064_02-------------------------#' +SET @@global.log_bin_trust_routine_creators = DEFAULT; +Warnings: +Warning 1287 The syntax 'log_bin_trust_routine_creators' is deprecated and will be removed in MySQL 5.2. Please use 'log_bin_trust_function_creators' instead +SELECT @@global.log_bin_trust_routine_creators = 'FALSE'; +@@global.log_bin_trust_routine_creators = 'FALSE' +1 +Warnings: +Warning 1292 Truncated incorrect DOUBLE value: 'FALSE' +'#--------------------FN_DYNVARS_064_03-------------------------#' +SET @@global.log_bin_trust_routine_creators = ON; +Warnings: +Warning 1287 The syntax 'log_bin_trust_routine_creators' is deprecated and will be removed in MySQL 5.2. Please use 'log_bin_trust_function_creators' instead +SELECT @@global.log_bin_trust_routine_creators; +@@global.log_bin_trust_routine_creators +1 +SET @@global.log_bin_trust_routine_creators = OFF; +Warnings: +Warning 1287 The syntax 'log_bin_trust_routine_creators' is deprecated and will be removed in MySQL 5.2. Please use 'log_bin_trust_function_creators' instead +SELECT @@global.log_bin_trust_routine_creators; +@@global.log_bin_trust_routine_creators +0 +SET @@global.log_bin_trust_routine_creators = 0; +Warnings: +Warning 1287 The syntax 'log_bin_trust_routine_creators' is deprecated and will be removed in MySQL 5.2. Please use 'log_bin_trust_function_creators' instead +SELECT @@global.log_bin_trust_routine_creators; +@@global.log_bin_trust_routine_creators +0 +SET @@global.log_bin_trust_routine_creators = 1; +Warnings: +Warning 1287 The syntax 'log_bin_trust_routine_creators' is deprecated and will be removed in MySQL 5.2. Please use 'log_bin_trust_function_creators' instead +SELECT @@global.log_bin_trust_routine_creators; +@@global.log_bin_trust_routine_creators +1 +SET @@global.log_bin_trust_routine_creators = TRUE; +Warnings: +Warning 1287 The syntax 'log_bin_trust_routine_creators' is deprecated and will be removed in MySQL 5.2. Please use 'log_bin_trust_function_creators' instead +SELECT @@global.log_bin_trust_routine_creators; +@@global.log_bin_trust_routine_creators +1 +SET @@global.log_bin_trust_routine_creators = FALSE; +Warnings: +Warning 1287 The syntax 'log_bin_trust_routine_creators' is deprecated and will be removed in MySQL 5.2. Please use 'log_bin_trust_function_creators' instead +SELECT @@global.log_bin_trust_routine_creators; +@@global.log_bin_trust_routine_creators +0 +'#-------------------FN_DYNVARS_064_04----------------------------#' +SET @@session.log_bin_trust_routine_creators = 0; +ERROR HY000: Variable 'log_bin_trust_routine_creators' is a GLOBAL variable and should be set with SET GLOBAL +SELECT @@session.log_bin_trust_routine_creators; +ERROR HY000: Variable 'log_bin_trust_routine_creators' is a GLOBAL variable +'#------------------FN_DYNVARS_064_05-----------------------#' +SET @@global.log_bin_trust_routine_creators = 'ONN'; +ERROR 42000: Variable 'log_bin_trust_routine_creators' can't be set to the value of 'ONN' +SET @@global.log_bin_trust_routine_creators = "OFFF"; +ERROR 42000: Variable 'log_bin_trust_routine_creators' can't be set to the value of 'OFFF' +SET @@global.log_bin_trust_routine_creators = OF; +Warnings: +Warning 1287 The syntax 'log_bin_trust_routine_creators' is deprecated and will be removed in MySQL 5.2. Please use 'log_bin_trust_function_creators' instead +SELECT @@global.log_bin_trust_routine_creators; +@@global.log_bin_trust_routine_creators +0 +'Bug# 34828: OF is also working as OFF and no error is coming'; +SET @@global.log_bin_trust_routine_creators = TTRUE; +ERROR 42000: Variable 'log_bin_trust_routine_creators' can't be set to the value of 'TTRUE' +SET @@global.log_bin_trust_routine_creators = FELSE; +ERROR 42000: Variable 'log_bin_trust_routine_creators' can't be set to the value of 'FELSE' +SET @@global.log_bin_trust_routine_creators = -1024; +ERROR 42000: Variable 'log_bin_trust_routine_creators' can't be set to the value of '-1024' +SET @@global.log_bin_trust_routine_creators = 65536; +ERROR 42000: Variable 'log_bin_trust_routine_creators' can't be set to the value of '65536' +SET @@global.log_bin_trust_routine_creators = 65530.34; +ERROR 42000: Variable 'log_bin_trust_routine_creators' can't be set to the value of '65530' +SET @@global.log_bin_trust_routine_creators = test; +ERROR 42000: Variable 'log_bin_trust_routine_creators' can't be set to the value of 'test' +'#------------------FN_DYNVARS_064_06-----------------------#' +SELECT @@global.log_bin_trust_routine_creators = VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME='log_bin_trust_routine_creators'; +@@global.log_bin_trust_routine_creators = VARIABLE_VALUE +1 +SELECT @@session.log_bin_trust_routine_creators = VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_VARIABLES WHERE VARIABLE_NAME='log_bin_trust_routine_creators'; +ERROR HY000: Variable 'log_bin_trust_routine_creators' is a GLOBAL variable +'#---------------------FN_DYNVARS_064_07----------------------#' +SET @@global.log_bin_trust_routine_creators = TRUE; +Warnings: +Warning 1287 The syntax 'log_bin_trust_routine_creators' is deprecated and will be removed in MySQL 5.2. Please use 'log_bin_trust_function_creators' instead +SELECT @@log_bin_trust_routine_creators = @@global.log_bin_trust_routine_creators; +@@log_bin_trust_routine_creators = @@global.log_bin_trust_routine_creators +1 +'#---------------------FN_DYNVARS_064_08----------------------#' +SET @@global.log_bin_trust_routine_creators = TRUE; +Warnings: +Warning 1287 The syntax 'log_bin_trust_routine_creators' is deprecated and will be removed in MySQL 5.2. Please use 'log_bin_trust_function_creators' instead +SELECT @@log_bin_trust_routine_creators; +@@log_bin_trust_routine_creators +1 +SELECT local.log_bin_trust_routine_creators; +ERROR 42S02: Unknown table 'local' in field list +SELECT session.log_bin_trust_routine_creators; +ERROR 42S02: Unknown table 'session' in field list +SELECT log_bin_trust_routine_creators = @@session.log_bin_trust_routine_creators; +ERROR 42S22: Unknown column 'log_bin_trust_routine_creators' in 'field list' +SET @@global.log_bin_trust_routine_creators = @start_global_value; +Warnings: +Warning 1287 The syntax 'log_bin_trust_routine_creators' is deprecated and will be removed in MySQL 5.2. Please use 'log_bin_trust_function_creators' instead +SELECT @@global.log_bin_trust_routine_creators; +@@global.log_bin_trust_routine_creators +1 === added file 'mysql-test/r/multi_range_count_basic_32.result' --- a/mysql-test/r/multi_range_count_basic_32.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/r/multi_range_count_basic_32.result 2008-05-08 18:13:39 +0000 @@ -0,0 +1,192 @@ +SET @start_global_value = @@global.multi_range_count; +SELECT @start_global_value; +@start_global_value +256 +SET @start_session_value = @@session.multi_range_count; +SELECT @start_session_value; +@start_session_value +256 +'#--------------------FN_DYNVARS_090_01-------------------------#' +SET @@global.multi_range_count = 100; +SET @@global.multi_range_count = DEFAULT; +SELECT @@global.multi_range_count; +@@global.multi_range_count +256 +SET @@session.multi_range_count = 200; +SET @@session.multi_range_count = DEFAULT; +SELECT @@session.multi_range_count; +@@session.multi_range_count +256 +'#--------------------FN_DYNVARS_090_02-------------------------#' +SET @@global.multi_range_count = DEFAULT; +SELECT @@global.multi_range_count = 256; +@@global.multi_range_count = 256 +1 +SET @@session.multi_range_count = DEFAULT; +SELECT @@session.multi_range_count = 256; +@@session.multi_range_count = 256 +1 +'#--------------------FN_DYNVARS_090_03-------------------------#' +SET @@global.multi_range_count = 1; +SELECT @@global.multi_range_count; +@@global.multi_range_count +1 +SET @@global.multi_range_count = 60020; +SELECT @@global.multi_range_count; +@@global.multi_range_count +60020 +SET @@global.multi_range_count = 65535; +SELECT @@global.multi_range_count; +@@global.multi_range_count +65535 +SET @@global.multi_range_count = 4294967295; +SELECT @@global.multi_range_count; +@@global.multi_range_count +4294967295 +SET @@global.multi_range_count = 4294967294; +SELECT @@global.multi_range_count; +@@global.multi_range_count +4294967294 +'#--------------------FN_DYNVARS_090_04-------------------------#' +SET @@session.multi_range_count = 1; +SELECT @@session.multi_range_count; +@@session.multi_range_count +1 +SET @@session.multi_range_count = 50050; +SELECT @@session.multi_range_count; +@@session.multi_range_count +50050 +SET @@session.multi_range_count = 65535; +SELECT @@session.multi_range_count; +@@session.multi_range_count +65535 +SET @@session.multi_range_count = 4294967295; +SELECT @@session.multi_range_count; +@@session.multi_range_count +4294967295 +SET @@session.multi_range_count = 4294967294; +SELECT @@session.multi_range_count; +@@session.multi_range_count +4294967294 +'#------------------FN_DYNVARS_090_05-----------------------#' +SET @@global.multi_range_count = 0; +Warnings: +Warning 1292 Truncated incorrect multi_range_count value: '0' +SELECT @@global.multi_range_count; +@@global.multi_range_count +1 +SET @@global.multi_range_count = 4294967296; +Warnings: +Warning 1292 Truncated incorrect multi_range_count value: '4294967296' +SELECT @@global.multi_range_count; +@@global.multi_range_count +4294967295 +SET @@global.multi_range_count = -1024; +Warnings: +Warning 1292 Truncated incorrect multi_range_count value: '0' +SELECT @@global.multi_range_count; +@@global.multi_range_count +1 +SET @@global.multi_range_count = 429496729500; +Warnings: +Warning 1292 Truncated incorrect multi_range_count value: '429496729500' +SELECT @@global.multi_range_count; +@@global.multi_range_count +4294967295 +SET @@global.multi_range_count = 65530.34; +ERROR 42000: Incorrect argument type to variable 'multi_range_count' +SELECT @@global.multi_range_count; +@@global.multi_range_count +4294967295 +SET @@global.multi_range_count = test; +ERROR 42000: Incorrect argument type to variable 'multi_range_count' +SELECT @@global.multi_range_count; +@@global.multi_range_count +4294967295 +SET @@session.multi_range_count = 0; +Warnings: +Warning 1292 Truncated incorrect multi_range_count value: '0' +SELECT @@session.multi_range_count; +@@session.multi_range_count +1 +SET @@session.multi_range_count = 4294967296; +Warnings: +Warning 1292 Truncated incorrect multi_range_count value: '4294967296' +SELECT @@session.multi_range_count; +@@session.multi_range_count +4294967295 +SET @@session.multi_range_count = -1; +Warnings: +Warning 1292 Truncated incorrect multi_range_count value: '0' +SELECT @@session.multi_range_count; +@@session.multi_range_count +1 +SET @@session.multi_range_count = 65530.34.; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.' at line 1 +SET @@session.multi_range_count = 4294967295021; +Warnings: +Warning 1292 Truncated incorrect multi_range_count value: '4294967295021' +SELECT @@session.multi_range_count; +@@session.multi_range_count +4294967295 +'Bug # 34837: Errors are not coming on assigning invalid values to variable'; +SET @@session.multi_range_count = test; +ERROR 42000: Incorrect argument type to variable 'multi_range_count' +SELECT @@session.multi_range_count; +@@session.multi_range_count +4294967295 +'#------------------FN_DYNVARS_090_06-----------------------#' +SELECT @@global.multi_range_count = VARIABLE_VALUE +FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES +WHERE VARIABLE_NAME='multi_range_count'; +@@global.multi_range_count = VARIABLE_VALUE +1 +'#------------------FN_DYNVARS_090_07-----------------------#' +SELECT @@session.multi_range_count = VARIABLE_VALUE +FROM INFORMATION_SCHEMA.SESSION_VARIABLES +WHERE VARIABLE_NAME='multi_range_count'; +@@session.multi_range_count = VARIABLE_VALUE +1 +'#------------------FN_DYNVARS_090_08-----------------------#' +SET @@global.multi_range_count = TRUE; +SELECT @@global.multi_range_count; +@@global.multi_range_count +1 +SET @@global.multi_range_count = FALSE; +Warnings: +Warning 1292 Truncated incorrect multi_range_count value: '0' +SELECT @@global.multi_range_count; +@@global.multi_range_count +1 +'#---------------------FN_DYNVARS_090_09----------------------#' +SET @@global.multi_range_count = 10; +SELECT @@multi_range_count = @@global.multi_range_count; +@@multi_range_count = @@global.multi_range_count +0 +'#---------------------FN_DYNVARS_090_10----------------------#' +SET @@multi_range_count = 100; +SELECT @@multi_range_count = @@local.multi_range_count; +@@multi_range_count = @@local.multi_range_count +1 +SELECT @@local.multi_range_count = @@session.multi_range_count; +@@local.multi_range_count = @@session.multi_range_count +1 +'#---------------------FN_DYNVARS_090_11----------------------#' +SET multi_range_count = 1; +SELECT @@multi_range_count; +@@multi_range_count +1 +SELECT local.multi_range_count; +ERROR 42S02: Unknown table 'local' in field list +SELECT session.multi_range_count; +ERROR 42S02: Unknown table 'session' in field list +SELECT multi_range_count = @@session.multi_range_count; +ERROR 42S22: Unknown column 'multi_range_count' in 'field list' +SET @@global.multi_range_count = @start_global_value; +SELECT @@global.multi_range_count; +@@global.multi_range_count +256 +SET @@session.multi_range_count = @start_session_value; +SELECT @@session.multi_range_count; +@@session.multi_range_count +256 === added file 'mysql-test/r/multi_range_count_basic_64.result' --- a/mysql-test/r/multi_range_count_basic_64.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/r/multi_range_count_basic_64.result 2008-05-08 18:13:39 +0000 @@ -0,0 +1,184 @@ +SET @start_global_value = @@global.multi_range_count; +SELECT @start_global_value; +@start_global_value +256 +SET @start_session_value = @@session.multi_range_count; +SELECT @start_session_value; +@start_session_value +256 +'#--------------------FN_DYNVARS_090_01-------------------------#' +SET @@global.multi_range_count = 100; +SET @@global.multi_range_count = DEFAULT; +SELECT @@global.multi_range_count; +@@global.multi_range_count +256 +SET @@session.multi_range_count = 200; +SET @@session.multi_range_count = DEFAULT; +SELECT @@session.multi_range_count; +@@session.multi_range_count +256 +'#--------------------FN_DYNVARS_090_02-------------------------#' +SET @@global.multi_range_count = DEFAULT; +SELECT @@global.multi_range_count = 256; +@@global.multi_range_count = 256 +1 +SET @@session.multi_range_count = DEFAULT; +SELECT @@session.multi_range_count = 256; +@@session.multi_range_count = 256 +1 +'#--------------------FN_DYNVARS_090_03-------------------------#' +SET @@global.multi_range_count = 1; +SELECT @@global.multi_range_count; +@@global.multi_range_count +1 +SET @@global.multi_range_count = 60020; +SELECT @@global.multi_range_count; +@@global.multi_range_count +60020 +SET @@global.multi_range_count = 65535; +SELECT @@global.multi_range_count; +@@global.multi_range_count +65535 +SET @@global.multi_range_count = 4294967295; +SELECT @@global.multi_range_count; +@@global.multi_range_count +4294967295 +SET @@global.multi_range_count = 4294967294; +SELECT @@global.multi_range_count; +@@global.multi_range_count +4294967294 +'#--------------------FN_DYNVARS_090_04-------------------------#' +SET @@session.multi_range_count = 1; +SELECT @@session.multi_range_count; +@@session.multi_range_count +1 +SET @@session.multi_range_count = 50050; +SELECT @@session.multi_range_count; +@@session.multi_range_count +50050 +SET @@session.multi_range_count = 65535; +SELECT @@session.multi_range_count; +@@session.multi_range_count +65535 +SET @@session.multi_range_count = 4294967295; +SELECT @@session.multi_range_count; +@@session.multi_range_count +4294967295 +SET @@session.multi_range_count = 4294967294; +SELECT @@session.multi_range_count; +@@session.multi_range_count +4294967294 +'#------------------FN_DYNVARS_090_05-----------------------#' +SET @@global.multi_range_count = 0; +Warnings: +Warning 1292 Truncated incorrect multi_range_count value: '0' +SELECT @@global.multi_range_count; +@@global.multi_range_count +1 +SET @@global.multi_range_count = 4294967296; +SELECT @@global.multi_range_count; +@@global.multi_range_count +4294967296 +SET @@global.multi_range_count = -1024; +Warnings: +Warning 1292 Truncated incorrect multi_range_count value: '0' +SELECT @@global.multi_range_count; +@@global.multi_range_count +1 +SET @@global.multi_range_count = 429496729500; +SELECT @@global.multi_range_count; +@@global.multi_range_count +429496729500 +SET @@global.multi_range_count = 65530.34; +ERROR 42000: Incorrect argument type to variable 'multi_range_count' +SELECT @@global.multi_range_count; +@@global.multi_range_count +429496729500 +SET @@global.multi_range_count = test; +ERROR 42000: Incorrect argument type to variable 'multi_range_count' +SELECT @@global.multi_range_count; +@@global.multi_range_count +429496729500 +SET @@session.multi_range_count = 0; +Warnings: +Warning 1292 Truncated incorrect multi_range_count value: '0' +SELECT @@session.multi_range_count; +@@session.multi_range_count +1 +SET @@session.multi_range_count = 4294967296; +SELECT @@session.multi_range_count; +@@session.multi_range_count +4294967296 +SET @@session.multi_range_count = -1; +Warnings: +Warning 1292 Truncated incorrect multi_range_count value: '0' +SELECT @@session.multi_range_count; +@@session.multi_range_count +1 +SET @@session.multi_range_count = 65530.34.; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.' at line 1 +SET @@session.multi_range_count = 4294967295021; +SELECT @@session.multi_range_count; +@@session.multi_range_count +4294967295021 +'Bug # 34837: Errors are not coming on assigning invalid values to variable'; +SET @@session.multi_range_count = test; +ERROR 42000: Incorrect argument type to variable 'multi_range_count' +SELECT @@session.multi_range_count; +@@session.multi_range_count +4294967295021 +'#------------------FN_DYNVARS_090_06-----------------------#' +SELECT @@global.multi_range_count = VARIABLE_VALUE +FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES +WHERE VARIABLE_NAME='multi_range_count'; +@@global.multi_range_count = VARIABLE_VALUE +1 +'#------------------FN_DYNVARS_090_07-----------------------#' +SELECT @@session.multi_range_count = VARIABLE_VALUE +FROM INFORMATION_SCHEMA.SESSION_VARIABLES +WHERE VARIABLE_NAME='multi_range_count'; +@@session.multi_range_count = VARIABLE_VALUE +1 +'#------------------FN_DYNVARS_090_08-----------------------#' +SET @@global.multi_range_count = TRUE; +SELECT @@global.multi_range_count; +@@global.multi_range_count +1 +SET @@global.multi_range_count = FALSE; +Warnings: +Warning 1292 Truncated incorrect multi_range_count value: '0' +SELECT @@global.multi_range_count; +@@global.multi_range_count +1 +'#---------------------FN_DYNVARS_090_09----------------------#' +SET @@global.multi_range_count = 10; +SELECT @@multi_range_count = @@global.multi_range_count; +@@multi_range_count = @@global.multi_range_count +0 +'#---------------------FN_DYNVARS_090_10----------------------#' +SET @@multi_range_count = 100; +SELECT @@multi_range_count = @@local.multi_range_count; +@@multi_range_count = @@local.multi_range_count +1 +SELECT @@local.multi_range_count = @@session.multi_range_count; +@@local.multi_range_count = @@session.multi_range_count +1 +'#---------------------FN_DYNVARS_090_11----------------------#' +SET multi_range_count = 1; +SELECT @@multi_range_count; +@@multi_range_count +1 +SELECT local.multi_range_count; +ERROR 42S02: Unknown table 'local' in field list +SELECT session.multi_range_count; +ERROR 42S02: Unknown table 'session' in field list +SELECT multi_range_count = @@session.multi_range_count; +ERROR 42S22: Unknown column 'multi_range_count' in 'field list' +SET @@global.multi_range_count = @start_global_value; +SELECT @@global.multi_range_count; +@@global.multi_range_count +256 +SET @@session.multi_range_count = @start_session_value; +SELECT @@session.multi_range_count; +@@session.multi_range_count +256 === removed file 'mysql-test/r/rpl_slave_compressed_protocol_basic.result' --- a/mysql-test/r/rpl_slave_compressed_protocol_basic.result 2008-05-14 23:24:13 +0000 +++ b/mysql-test/r/rpl_slave_compressed_protocol_basic.result 1970-01-01 00:00:00 +0000 @@ -1,103 +0,0 @@ -SET @global_start_value = @@global.slave_compressed_protocol; -SELECT @global_start_value; -@global_start_value -0 -'#--------------------FN_DYNVARS_147_01------------------------#' -SET @@global.slave_compressed_protocol = 1; -SET @@global.slave_compressed_protocol = DEFAULT; -SELECT @@global.slave_compressed_protocol; -@@global.slave_compressed_protocol -0 -'#---------------------FN_DYNVARS_147_02-------------------------#' -SET slave_compressed_protocol = 1; -ERROR HY000: Variable 'slave_compressed_protocol' is a GLOBAL variable and should be set with SET GLOBAL -SELECT @@slave_compressed_protocol; -@@slave_compressed_protocol -0 -SELECT global.slave_compressed_protocol; -ERROR 42S02: Unknown table 'global' in field list -SET global slave_compressed_protocol = 1; -SELECT @@global.slave_compressed_protocol; -@@global.slave_compressed_protocol -1 -'#--------------------FN_DYNVARS_147_03------------------------#' -SET @@global.slave_compressed_protocol = 0; -SELECT @@global.slave_compressed_protocol; -@@global.slave_compressed_protocol -0 -SET @@global.slave_compressed_protocol = 1; -SELECT @@global.slave_compressed_protocol; -@@global.slave_compressed_protocol -1 -'#--------------------FN_DYNVARS_147_04-------------------------#' -SET @@global.slave_compressed_protocol = -1; -ERROR 42000: Variable 'slave_compressed_protocol' can't be set to the value of '-1' -SET @@global.slave_compressed_protocol = 2; -ERROR 42000: Variable 'slave_compressed_protocol' can't be set to the value of '2' -SET @@global.slave_compressed_protocol = "1.00"; -ERROR 42000: Variable 'slave_compressed_protocol' can't be set to the value of '1.00' -SET @@global.slave_compressed_protocol = "Y"; -ERROR 42000: Variable 'slave_compressed_protocol' can't be set to the value of 'Y' -SET @@global.slave_compressed_protocol = YES; -ERROR 42000: Variable 'slave_compressed_protocol' can't be set to the value of 'YES' -SET @@global.slave_compressed_protocol = ONN; -ERROR 42000: Variable 'slave_compressed_protocol' can't be set to the value of 'ONN' -SET @@global.slave_compressed_protocol = 0FF; -ERROR 42000: Variable 'slave_compressed_protocol' can't be set to the value of '0FF' -SET @@global.slave_compressed_protocol = ' 1'; -ERROR 42000: Variable 'slave_compressed_protocol' can't be set to the value of ' 1' -SET @@global.slave_compressed_protocol = NO; -ERROR 42000: Variable 'slave_compressed_protocol' can't be set to the value of 'NO' -'#-------------------FN_DYNVARS_147_05----------------------------#' -SET @@session.slave_compressed_protocol = 0; -ERROR HY000: Variable 'slave_compressed_protocol' is a GLOBAL variable and should be set with SET GLOBAL -SET @@slave_compressed_protocol = 0; -ERROR HY000: Variable 'slave_compressed_protocol' is a GLOBAL variable and should be set with SET GLOBAL -SET @@local.slave_compressed_protocol = 0; -ERROR HY000: Variable 'slave_compressed_protocol' is a GLOBAL variable and should be set with SET GLOBAL -SELECT @@session.slave_compressed_protocol; -ERROR HY000: Variable 'slave_compressed_protocol' is a GLOBAL variable -SELECT @@local.slave_compressed_protocol; -ERROR HY000: Variable 'slave_compressed_protocol' is a GLOBAL variable -'#----------------------FN_DYNVARS_147_06------------------------#' -SELECT count(VARIABLE_VALUE) -FROM INFORMATION_SCHEMA.SESSION_VARIABLES -WHERE VARIABLE_NAME='slave_compressed_protocol'; -count(VARIABLE_VALUE) -1 -'#----------------------FN_DYNVARS_147_07------------------------#' -SELECT @@global.slave_compressed_protocol = VARIABLE_VALUE -FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES -WHERE VARIABLE_NAME='slave_compressed_protocol'; -@@global.slave_compressed_protocol = VARIABLE_VALUE -0 -SELECT @@global.slave_compressed_protocol; -@@global.slave_compressed_protocol -1 -SELECT VARIABLE_VALUE -FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES -WHERE VARIABLE_NAME='slave_compressed_protocol'; -VARIABLE_VALUE -ON -'#---------------------FN_DYNVARS_147_08-------------------------#' -SET @@global.slave_compressed_protocol = OFF; -SELECT @@global.slave_compressed_protocol; -@@global.slave_compressed_protocol -0 -SET @@global.slave_compressed_protocol = ON; -SELECT @@global.slave_compressed_protocol; -@@global.slave_compressed_protocol -1 -'#---------------------FN_DYNVARS_147_09----------------------#' -SET @@global.slave_compressed_protocol = TRUE; -SELECT @@global.slave_compressed_protocol; -@@global.slave_compressed_protocol -1 -SET @@global.slave_compressed_protocol = FALSE; -SELECT @@global.slave_compressed_protocol; -@@global.slave_compressed_protocol -0 -SET @@global.slave_compressed_protocol = @global_start_value; -SELECT @@global.slave_compressed_protocol; -@@global.slave_compressed_protocol -0 === removed file 'mysql-test/r/rpl_slave_exec_mode_basic.result' --- a/mysql-test/r/rpl_slave_exec_mode_basic.result 2008-05-14 23:24:13 +0000 +++ b/mysql-test/r/rpl_slave_exec_mode_basic.result 1970-01-01 00:00:00 +0000 @@ -1,2 +0,0 @@ -SET @start_value = @@global.slave_exec_mode; -'This variable is not supported in version 5.1.22. It is introduced in 5.1.24' === removed file 'mysql-test/r/rpl_slave_net_timeout_basic.result' --- a/mysql-test/r/rpl_slave_net_timeout_basic.result 2008-05-14 23:24:13 +0000 +++ b/mysql-test/r/rpl_slave_net_timeout_basic.result 1970-01-01 00:00:00 +0000 @@ -1,127 +0,0 @@ -SET @start_global_value = @@global.slave_net_timeout; -SELECT @start_global_value; -@start_global_value -3600 -'#--------------------FN_DYNVARS_146_01-------------------------#' -SET @@global.slave_net_timeout = 500000; -SET @@global.slave_net_timeout = DEFAULT; -SELECT @@global.slave_net_timeout; -@@global.slave_net_timeout -3600 -'#--------------------FN_DYNVARS_146_02-------------------------#' -SET @@global.slave_net_timeout = DEFAULT; -SELECT @@global.slave_net_timeout = 3600; -@@global.slave_net_timeout = 3600 -1 -'#--------------------FN_DYNVARS_146_03-------------------------#' -SET @@global.slave_net_timeout = 0; -Warnings: -Warning 1292 Truncated incorrect slave_net_timeout value: '0' -SELECT @@global.slave_net_timeout; -@@global.slave_net_timeout -1 -SET @@global.slave_net_timeout = 1; -SELECT @@global.slave_net_timeout; -@@global.slave_net_timeout -1 -SET @@global.slave_net_timeout = 15; -SELECT @@global.slave_net_timeout; -@@global.slave_net_timeout -15 -SET @@global.slave_net_timeout = 1024; -SELECT @@global.slave_net_timeout; -@@global.slave_net_timeout -1024 -SET @@global.slave_net_timeout = 3600+1; -SELECT @@global.slave_net_timeout; -@@global.slave_net_timeout -3601 -SET @@global.slave_net_timeout = 2147483648; -Warnings: -Warning 1292 Truncated incorrect slave_net_timeout value: '2147483648' -SELECT @@global.slave_net_timeout; -@@global.slave_net_timeout -31536000 -SET @@global.slave_net_timeout = 2147483648*2-1; -Warnings: -Warning 1292 Truncated incorrect slave_net_timeout value: '4294967295' -SELECT @@global.slave_net_timeout; -@@global.slave_net_timeout -31536000 -'#--------------------FN_DYNVARS_146_04-------------------------#' -SET @@slave_net_timeout = 2; -ERROR HY000: Variable 'slave_net_timeout' is a GLOBAL variable and should be set with SET GLOBAL -SET @@session.slave_net_timeout = 3; -ERROR HY000: Variable 'slave_net_timeout' is a GLOBAL variable and should be set with SET GLOBAL -SET @@local.slave_net_timeout = 4; -ERROR HY000: Variable 'slave_net_timeout' is a GLOBAL variable and should be set with SET GLOBAL -'#------------------FN_DYNVARS_146_05-----------------------#' -SET @@global.slave_net_timeout = -1; -Warnings: -Warning 1292 Truncated incorrect slave_net_timeout value: '0' -SELECT @@global.slave_net_timeout; -@@global.slave_net_timeout -1 -SET @@global.slave_net_timeout = -2147483648; -Warnings: -Warning 1292 Truncated incorrect slave_net_timeout value: '0' -SELECT @@global.slave_net_timeout; -@@global.slave_net_timeout -1 -SET @@global.slave_net_timeout = 2147483649*2; -Warnings: -Warning 1292 Truncated incorrect slave_net_timeout value: '4294967298' -SELECT @@global.slave_net_timeout; -@@global.slave_net_timeout -31536000 -SET @@global.slave_net_timeout = 65530.34.; -ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.' at line 1 -SET @@global.slave_net_timeout = 100s; -ERROR 42000: Incorrect argument type to variable 'slave_net_timeout' -SET @@global.slave_net_timeout = 7483649.56; -ERROR 42000: Incorrect argument type to variable 'slave_net_timeout' -SET @@global.slave_net_timeout = 0.6; -ERROR 42000: Incorrect argument type to variable 'slave_net_timeout' -'Bug# 34877: Invalid Values are coming in variable on assigning valid values'; -'#------------------FN_DYNVARS_146_06-----------------------#' -SET @@global.slave_net_timeout = 3000; -SELECT @@global.slave_net_timeout = VARIABLE_VALUE -FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES -WHERE VARIABLE_NAME='slave_net_timeout'; -@@global.slave_net_timeout = VARIABLE_VALUE -1 -'#------------------FN_DYNVARS_146_07-----------------------#' -SELECT count(VARIABLE_VALUE) -FROM INFORMATION_SCHEMA.SESSION_VARIABLES -WHERE VARIABLE_NAME='slave_net_timeout'; -count(VARIABLE_VALUE) -1 -'#------------------FN_DYNVARS_146_08-----------------------#' -SET @@global.slave_net_timeout = TRUE; -SELECT @@global.slave_net_timeout; -@@global.slave_net_timeout -1 -SET @@global.slave_net_timeout = FALSE; -Warnings: -Warning 1292 Truncated incorrect slave_net_timeout value: '0' -SELECT @@global.slave_net_timeout; -@@global.slave_net_timeout -1 -'#---------------------FN_DYNVARS_001_09----------------------#' -SET @@global.slave_net_timeout = 60*60; -SELECT @@slave_net_timeout = @@global.slave_net_timeout; -@@slave_net_timeout = @@global.slave_net_timeout -1 -'#---------------------FN_DYNVARS_001_10----------------------#' -SET slave_net_timeout = 2048; -ERROR HY000: Variable 'slave_net_timeout' is a GLOBAL variable and should be set with SET GLOBAL -SELECT slave_net_timeout; -ERROR 42S22: Unknown column 'slave_net_timeout' in 'field list' -SELECT @@slave_net_timeout; -@@slave_net_timeout -3600 -SET global slave_net_timeout = 99; -SET @@global.slave_net_timeout = @start_global_value; -SELECT @@global.slave_net_timeout; -@@global.slave_net_timeout -3600 === removed file 'mysql-test/r/rpl_slave_transaction_retries_basic_32.result' --- a/mysql-test/r/rpl_slave_transaction_retries_basic_32.result 2008-05-14 23:24:13 +0000 +++ b/mysql-test/r/rpl_slave_transaction_retries_basic_32.result 1970-01-01 00:00:00 +0000 @@ -1,119 +0,0 @@ -SET @start_global_value = @@global.slave_transaction_retries; -SELECT @start_global_value; -@start_global_value -10 -'#--------------------FN_DYNVARS_149_01-------------------------#' -SET @@global.slave_transaction_retries = 50; -SET @@global.slave_transaction_retries = DEFAULT; -SELECT @@global.slave_transaction_retries; -@@global.slave_transaction_retries -10 -'#--------------------FN_DYNVARS_149_02-------------------------#' -SET @@global.slave_transaction_retries = DEFAULT; -SELECT @@global.slave_transaction_retries = 10; -@@global.slave_transaction_retries = 10 -1 -'#--------------------FN_DYNVARS_149_03-------------------------#' -SET @@global.slave_transaction_retries = 0; -SELECT @@global.slave_transaction_retries; -@@global.slave_transaction_retries -0 -SET @@global.slave_transaction_retries = 1; -SELECT @@global.slave_transaction_retries; -@@global.slave_transaction_retries -1 -SET @@global.slave_transaction_retries = 15; -SELECT @@global.slave_transaction_retries; -@@global.slave_transaction_retries -15 -SET @@global.slave_transaction_retries = 1024; -SELECT @@global.slave_transaction_retries; -@@global.slave_transaction_retries -1024 -SET @@global.slave_transaction_retries = 2147483648; -SELECT @@global.slave_transaction_retries; -@@global.slave_transaction_retries -2147483648 -SET @@global.slave_transaction_retries = 2147483648*2-1; -SELECT @@global.slave_transaction_retries; -@@global.slave_transaction_retries -4294967295 -SET @@global.slave_transaction_retries = 2147483649*2; -Warnings: -Warning 1292 Truncated incorrect slave_transaction_retries value: '4294967298' -SELECT @@global.slave_transaction_retries; -@@global.slave_transaction_retries -4294967295 -SET @@global.slave_transaction_retries = 4294967295; -SELECT @@global.slave_transaction_retries; -@@global.slave_transaction_retries -4294967295 -'#--------------------FN_DYNVARS_149_04-------------------------#' -SET @@slave_transaction_retries = 2; -ERROR HY000: Variable 'slave_transaction_retries' is a GLOBAL variable and should be set with SET GLOBAL -SET @@session.slave_transaction_retries = 3; -ERROR HY000: Variable 'slave_transaction_retries' is a GLOBAL variable and should be set with SET GLOBAL -SET @@local.slave_transaction_retries = 4; -ERROR HY000: Variable 'slave_transaction_retries' is a GLOBAL variable and should be set with SET GLOBAL -'#------------------FN_DYNVARS_149_05-----------------------#' -SET @@global.slave_transaction_retries = -1; -SELECT @@global.slave_transaction_retries; -@@global.slave_transaction_retries -0 -SET @@global.slave_transaction_retries = 2147483649*2147483649; -Warnings: -Warning 1292 Truncated incorrect slave_transaction_retries value: '4611686022722355201' -SELECT @@global.slave_transaction_retries; -@@global.slave_transaction_retries -4294967295 -'Bug# 34877: Invalid Values are coming in variable on assigning valid values'; -SET @@global.slave_transaction_retries = 65530.34.; -ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.' at line 1 -SET @@global.slave_transaction_retries = '100'; -ERROR 42000: Incorrect argument type to variable 'slave_transaction_retries' -SET @@global.slave_transaction_retries = 7483649.56; -ERROR 42000: Incorrect argument type to variable 'slave_transaction_retries' -SET @@global.slave_transaction_retries = ON; -ERROR 42000: Incorrect argument type to variable 'slave_transaction_retries' -SET @@global.slave_transaction_retries = OFF; -ERROR 42000: Incorrect argument type to variable 'slave_transaction_retries' -'#------------------FN_DYNVARS_149_06-----------------------#' -SET @@global.slave_transaction_retries = 3000; -SELECT @@global.slave_transaction_retries = VARIABLE_VALUE -FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES -WHERE VARIABLE_NAME='slave_transaction_retries'; -@@global.slave_transaction_retries = VARIABLE_VALUE -1 -'#------------------FN_DYNVARS_149_07-----------------------#' -SELECT count(VARIABLE_VALUE) -FROM INFORMATION_SCHEMA.SESSION_VARIABLES -WHERE VARIABLE_NAME='slave_transaction_retries'; -count(VARIABLE_VALUE) -1 -'#------------------FN_DYNVARS_149_08-----------------------#' -SET @@global.slave_transaction_retries = TRUE; -SELECT @@global.slave_transaction_retries; -@@global.slave_transaction_retries -1 -SET @@global.slave_transaction_retries = FALSE; -SELECT @@global.slave_transaction_retries; -@@global.slave_transaction_retries -0 -'#---------------------FN_DYNVARS_149_09----------------------#' -SET @@global.slave_transaction_retries = 60*60; -SELECT @@slave_transaction_retries = @@global.slave_transaction_retries; -@@slave_transaction_retries = @@global.slave_transaction_retries -1 -'#---------------------FN_DYNVARS_149_10----------------------#' -SET slave_transaction_retries = 2048; -ERROR HY000: Variable 'slave_transaction_retries' is a GLOBAL variable and should be set with SET GLOBAL -SELECT slave_transaction_retries; -ERROR 42S22: Unknown column 'slave_transaction_retries' in 'field list' -SELECT @@slave_transaction_retries; -@@slave_transaction_retries -3600 -SET global slave_transaction_retries = 99; -SET @@global.slave_transaction_retries = @start_global_value; -SELECT @@global.slave_transaction_retries; -@@global.slave_transaction_retries -10 === removed file 'mysql-test/r/rpl_slave_transaction_retries_basic_64.result' --- a/mysql-test/r/rpl_slave_transaction_retries_basic_64.result 2008-05-14 23:24:13 +0000 +++ b/mysql-test/r/rpl_slave_transaction_retries_basic_64.result 1970-01-01 00:00:00 +0000 @@ -1,115 +0,0 @@ -SET @start_global_value = @@global.slave_transaction_retries; -SELECT @start_global_value; -@start_global_value -10 -'#--------------------FN_DYNVARS_149_01-------------------------#' -SET @@global.slave_transaction_retries = 50; -SET @@global.slave_transaction_retries = DEFAULT; -SELECT @@global.slave_transaction_retries; -@@global.slave_transaction_retries -10 -'#--------------------FN_DYNVARS_149_02-------------------------#' -SET @@global.slave_transaction_retries = DEFAULT; -SELECT @@global.slave_transaction_retries = 10; -@@global.slave_transaction_retries = 10 -1 -'#--------------------FN_DYNVARS_149_03-------------------------#' -SET @@global.slave_transaction_retries = 0; -SELECT @@global.slave_transaction_retries; -@@global.slave_transaction_retries -0 -SET @@global.slave_transaction_retries = 1; -SELECT @@global.slave_transaction_retries; -@@global.slave_transaction_retries -1 -SET @@global.slave_transaction_retries = 15; -SELECT @@global.slave_transaction_retries; -@@global.slave_transaction_retries -15 -SET @@global.slave_transaction_retries = 1024; -SELECT @@global.slave_transaction_retries; -@@global.slave_transaction_retries -1024 -SET @@global.slave_transaction_retries = 2147483648; -SELECT @@global.slave_transaction_retries; -@@global.slave_transaction_retries -2147483648 -SET @@global.slave_transaction_retries = 2147483648*2-1; -SELECT @@global.slave_transaction_retries; -@@global.slave_transaction_retries -4294967295 -SET @@global.slave_transaction_retries = 2147483649*2; -SELECT @@global.slave_transaction_retries; -@@global.slave_transaction_retries -4294967298 -SET @@global.slave_transaction_retries = 4294967295; -SELECT @@global.slave_transaction_retries; -@@global.slave_transaction_retries -4294967295 -'#--------------------FN_DYNVARS_149_04-------------------------#' -SET @@slave_transaction_retries = 2; -ERROR HY000: Variable 'slave_transaction_retries' is a GLOBAL variable and should be set with SET GLOBAL -SET @@session.slave_transaction_retries = 3; -ERROR HY000: Variable 'slave_transaction_retries' is a GLOBAL variable and should be set with SET GLOBAL -SET @@local.slave_transaction_retries = 4; -ERROR HY000: Variable 'slave_transaction_retries' is a GLOBAL variable and should be set with SET GLOBAL -'#------------------FN_DYNVARS_149_05-----------------------#' -SET @@global.slave_transaction_retries = -1; -SELECT @@global.slave_transaction_retries; -@@global.slave_transaction_retries -0 -SET @@global.slave_transaction_retries = 2147483649*2147483649; -SELECT @@global.slave_transaction_retries; -@@global.slave_transaction_retries -4611686022722355201 -'Bug# 34877: Invalid Values are coming in variable on assigning valid values'; -SET @@global.slave_transaction_retries = 65530.34.; -ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.' at line 1 -SET @@global.slave_transaction_retries = '100'; -ERROR 42000: Incorrect argument type to variable 'slave_transaction_retries' -SET @@global.slave_transaction_retries = 7483649.56; -ERROR 42000: Incorrect argument type to variable 'slave_transaction_retries' -SET @@global.slave_transaction_retries = ON; -ERROR 42000: Incorrect argument type to variable 'slave_transaction_retries' -SET @@global.slave_transaction_retries = OFF; -ERROR 42000: Incorrect argument type to variable 'slave_transaction_retries' -'#------------------FN_DYNVARS_149_06-----------------------#' -SET @@global.slave_transaction_retries = 3000; -SELECT @@global.slave_transaction_retries = VARIABLE_VALUE -FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES -WHERE VARIABLE_NAME='slave_transaction_retries'; -@@global.slave_transaction_retries = VARIABLE_VALUE -1 -'#------------------FN_DYNVARS_149_07-----------------------#' -SELECT count(VARIABLE_VALUE) -FROM INFORMATION_SCHEMA.SESSION_VARIABLES -WHERE VARIABLE_NAME='slave_transaction_retries'; -count(VARIABLE_VALUE) -1 -'#------------------FN_DYNVARS_149_08-----------------------#' -SET @@global.slave_transaction_retries = TRUE; -SELECT @@global.slave_transaction_retries; -@@global.slave_transaction_retries -1 -SET @@global.slave_transaction_retries = FALSE; -SELECT @@global.slave_transaction_retries; -@@global.slave_transaction_retries -0 -'#---------------------FN_DYNVARS_149_09----------------------#' -SET @@global.slave_transaction_retries = 60*60; -SELECT @@slave_transaction_retries = @@global.slave_transaction_retries; -@@slave_transaction_retries = @@global.slave_transaction_retries -1 -'#---------------------FN_DYNVARS_149_10----------------------#' -SET slave_transaction_retries = 2048; -ERROR HY000: Variable 'slave_transaction_retries' is a GLOBAL variable and should be set with SET GLOBAL -SELECT slave_transaction_retries; -ERROR 42S22: Unknown column 'slave_transaction_retries' in 'field list' -SELECT @@slave_transaction_retries; -@@slave_transaction_retries -3600 -SET global slave_transaction_retries = 99; -SET @@global.slave_transaction_retries = @start_global_value; -SELECT @@global.slave_transaction_retries; -@@global.slave_transaction_retries -10 === removed file 'mysql-test/r/rpl_sync_binlog_basic_32.result' --- a/mysql-test/r/rpl_sync_binlog_basic_32.result 2008-05-16 02:44:49 +0000 +++ b/mysql-test/r/rpl_sync_binlog_basic_32.result 1970-01-01 00:00:00 +0000 @@ -1,105 +0,0 @@ -SET @start_value = @@global.sync_binlog; -SELECT @start_value; -@start_value -0 -'#--------------------FN_DYNVARS_168_01------------------------#' -SET @@global.sync_binlog = 99; -SET @@global.sync_binlog = DEFAULT; -SELECT @@global.sync_binlog; -@@global.sync_binlog -0 -'#---------------------FN_DYNVARS_168_02-------------------------#' -SET @@global.sync_binlog = @start_value; -SELECT @@global.sync_binlog = 0; -@@global.sync_binlog = 0 -1 -'#--------------------FN_DYNVARS_168_03------------------------#' -SET @@global.sync_binlog = 0; -SELECT @@global.sync_binlog; -@@global.sync_binlog -0 -SET @@global.sync_binlog = 1; -SELECT @@global.sync_binlog; -@@global.sync_binlog -1 -SET @@global.sync_binlog = 4294967295; -SELECT @@global.sync_binlog; -@@global.sync_binlog -4294967295 -SET @@global.sync_binlog = 4294967294; -SELECT @@global.sync_binlog; -@@global.sync_binlog -4294967294 -SET @@global.sync_binlog = 65536; -SELECT @@global.sync_binlog; -@@global.sync_binlog -65536 -'#--------------------FN_DYNVARS_168_04-------------------------#' -SET @@global.sync_binlog = -1; -SELECT @@global.sync_binlog; -@@global.sync_binlog -0 -SET @@global.sync_binlog = 4294967296; -SELECT @@global.sync_binlog; -@@global.sync_binlog -0 -SET @@global.sync_binlog = 10240022115; -SELECT @@global.sync_binlog; -@@global.sync_binlog -1650087523 -SET @@global.sync_binlog = 10000.01; -ERROR 42000: Incorrect argument type to variable 'sync_binlog' -SELECT @@global.sync_binlog; -@@global.sync_binlog -1650087523 -SET @@global.sync_binlog = -1024; -SELECT @@global.sync_binlog; -@@global.sync_binlog -0 -SET @@global.sync_binlog = 42949672950; -SELECT @@global.sync_binlog; -@@global.sync_binlog -4294967286 -'Bug # 34837: Errors are not coming on assigning invalid values to variable'; -SET @@global.sync_binlog = ON; -ERROR 42000: Incorrect argument type to variable 'sync_binlog' -SELECT @@global.sync_binlog; -@@global.sync_binlog -4294967286 -SET @@global.sync_binlog = 'test'; -ERROR 42000: Incorrect argument type to variable 'sync_binlog' -SELECT @@global.sync_binlog; -@@global.sync_binlog -4294967286 -'#-------------------FN_DYNVARS_168_05----------------------------#' -SET @@session.sync_binlog = 0; -ERROR HY000: Variable 'sync_binlog' is a GLOBAL variable and should be set with SET GLOBAL -SELECT @@sync_binlog; -@@sync_binlog -4294967286 -'#----------------------FN_DYNVARS_168_06------------------------#' -SELECT @@global.sync_binlog = VARIABLE_VALUE -FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES -WHERE VARIABLE_NAME='sync_binlog'; -@@global.sync_binlog = VARIABLE_VALUE -1 -'#---------------------FN_DYNVARS_168_07----------------------#' -SET sync_binlog = 1; -ERROR HY000: Variable 'sync_binlog' is a GLOBAL variable and should be set with SET GLOBAL -SELECT @@sync_binlog; -@@sync_binlog -4294967286 -SET local.sync_binlog = 1; -ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'sync_binlog = 1' at line 1 -SELECT local.sync_binlog; -ERROR 42S02: Unknown table 'local' in field list -SET global.sync_binlog = 1; -ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'sync_binlog = 1' at line 1 -SELECT global.sync_binlog; -ERROR 42S02: Unknown table 'global' in field list -SELECT sync_binlog = @@session.sync_binlog; -ERROR 42S22: Unknown column 'sync_binlog' in 'field list' -SET @@global.sync_binlog = @start_value; -SELECT @@global.sync_binlog; -@@global.sync_binlog -0 === removed file 'mysql-test/r/rpl_sync_binlog_basic_64.result' --- a/mysql-test/r/rpl_sync_binlog_basic_64.result 2008-05-16 02:44:49 +0000 +++ b/mysql-test/r/rpl_sync_binlog_basic_64.result 1970-01-01 00:00:00 +0000 @@ -1,105 +0,0 @@ -SET @start_value = @@global.sync_binlog; -SELECT @start_value; -@start_value -0 -'#--------------------FN_DYNVARS_168_01------------------------#' -SET @@global.sync_binlog = 99; -SET @@global.sync_binlog = DEFAULT; -SELECT @@global.sync_binlog; -@@global.sync_binlog -0 -'#---------------------FN_DYNVARS_168_02-------------------------#' -SET @@global.sync_binlog = @start_value; -SELECT @@global.sync_binlog = 0; -@@global.sync_binlog = 0 -1 -'#--------------------FN_DYNVARS_168_03------------------------#' -SET @@global.sync_binlog = 0; -SELECT @@global.sync_binlog; -@@global.sync_binlog -0 -SET @@global.sync_binlog = 1; -SELECT @@global.sync_binlog; -@@global.sync_binlog -1 -SET @@global.sync_binlog = 4294967295; -SELECT @@global.sync_binlog; -@@global.sync_binlog -4294967295 -SET @@global.sync_binlog = 4294967294; -SELECT @@global.sync_binlog; -@@global.sync_binlog -4294967294 -SET @@global.sync_binlog = 65536; -SELECT @@global.sync_binlog; -@@global.sync_binlog -65536 -'#--------------------FN_DYNVARS_168_04-------------------------#' -SET @@global.sync_binlog = -1; -SELECT @@global.sync_binlog; -@@global.sync_binlog -0 -SET @@global.sync_binlog = 4294967296; -SELECT @@global.sync_binlog; -@@global.sync_binlog -4294967296 -SET @@global.sync_binlog = 10240022115; -SELECT @@global.sync_binlog; -@@global.sync_binlog -10240022115 -SET @@global.sync_binlog = 10000.01; -ERROR 42000: Incorrect argument type to variable 'sync_binlog' -SELECT @@global.sync_binlog; -@@global.sync_binlog -10240022115 -SET @@global.sync_binlog = -1024; -SELECT @@global.sync_binlog; -@@global.sync_binlog -0 -SET @@global.sync_binlog = 42949672950; -SELECT @@global.sync_binlog; -@@global.sync_binlog -42949672950 -'Bug # 34837: Errors are not coming on assigning invalid values to variable'; -SET @@global.sync_binlog = ON; -ERROR 42000: Incorrect argument type to variable 'sync_binlog' -SELECT @@global.sync_binlog; -@@global.sync_binlog -42949672950 -SET @@global.sync_binlog = 'test'; -ERROR 42000: Incorrect argument type to variable 'sync_binlog' -SELECT @@global.sync_binlog; -@@global.sync_binlog -42949672950 -'#-------------------FN_DYNVARS_168_05----------------------------#' -SET @@session.sync_binlog = 0; -ERROR HY000: Variable 'sync_binlog' is a GLOBAL variable and should be set with SET GLOBAL -SELECT @@sync_binlog; -@@sync_binlog -42949672950 -'#----------------------FN_DYNVARS_168_06------------------------#' -SELECT @@global.sync_binlog = VARIABLE_VALUE -FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES -WHERE VARIABLE_NAME='sync_binlog'; -@@global.sync_binlog = VARIABLE_VALUE -1 -'#---------------------FN_DYNVARS_168_07----------------------#' -SET sync_binlog = 1; -ERROR HY000: Variable 'sync_binlog' is a GLOBAL variable and should be set with SET GLOBAL -SELECT @@sync_binlog; -@@sync_binlog -42949672950 -SET local.sync_binlog = 1; -ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'sync_binlog = 1' at line 1 -SELECT local.sync_binlog; -ERROR 42S02: Unknown table 'local' in field list -SET global.sync_binlog = 1; -ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'sync_binlog = 1' at line 1 -SELECT global.sync_binlog; -ERROR 42S02: Unknown table 'global' in field list -SELECT sync_binlog = @@session.sync_binlog; -ERROR 42S22: Unknown column 'sync_binlog' in 'field list' -SET @@global.sync_binlog = @start_value; -SELECT @@global.sync_binlog; -@@global.sync_binlog -0 === renamed file 'mysql-test/r/rpl_slave_allow_batching_basic.result' => 'mysql-test/r/slave_allow_batching_basic.result' --- a/mysql-test/r/rpl_slave_allow_batching_basic.result 2008-05-14 23:24:13 +0000 +++ b/mysql-test/r/slave_allow_batching_basic.result 2008-08-07 13:36:47 +0000 @@ -1,3 +1,4 @@ +<<<<<<< TREE SET @global_start_value = @@global.slave_allow_batching; 'Bug: This variable is not supported in mysql version 5.1.22' '#--------------------FN_DYNVARS_145_01------------------------#' @@ -96,3 +97,104 @@ SET @@global.slave_allow_batching = @glo SELECT @@global.slave_allow_batching; @@global.slave_allow_batching 0 +======= +SET @global_start_value = @@global.slave_allow_batching; +SELECT @global_start_value; +@global_start_value +0 +'#--------------------FN_DYNVARS_145_01------------------------#' +SET @@global.slave_allow_batching = 1; +SET @@global.slave_allow_batching = DEFAULT; +SELECT @@global.slave_allow_batching; +@@global.slave_allow_batching +0 +'#---------------------FN_DYNVARS_145_02-------------------------#' +SET slave_allow_batching = 1; +ERROR HY000: Variable 'slave_allow_batching' is a GLOBAL variable and should be set with SET GLOBAL +SELECT @@slave_allow_batching; +@@slave_allow_batching +0 +SELECT global.slave_allow_batching; +ERROR 42S02: Unknown table 'global' in field list +SET global slave_allow_batching = 1; +SELECT @@global.slave_allow_batching; +@@global.slave_allow_batching +1 +'#--------------------FN_DYNVARS_145_03------------------------#' +SET @@global.slave_allow_batching = 0; +SELECT @@global.slave_allow_batching; +@@global.slave_allow_batching +0 +SET @@global.slave_allow_batching = 1; +SELECT @@global.slave_allow_batching; +@@global.slave_allow_batching +1 +'#--------------------FN_DYNVARS_145_04-------------------------#' +SET @@global.slave_allow_batching = -1; +ERROR 42000: Variable 'slave_allow_batching' can't be set to the value of '-1' +SET @@global.slave_allow_batching = 2; +ERROR 42000: Variable 'slave_allow_batching' can't be set to the value of '2' +SET @@global.slave_allow_batching = "T"; +ERROR 42000: Variable 'slave_allow_batching' can't be set to the value of 'T' +SET @@global.slave_allow_batching = "Y"; +ERROR 42000: Variable 'slave_allow_batching' can't be set to the value of 'Y' +SET @@global.slave_allow_batching = YES; +ERROR 42000: Variable 'slave_allow_batching' can't be set to the value of 'YES' +SET @@global.slave_allow_batching = ONN; +ERROR 42000: Variable 'slave_allow_batching' can't be set to the value of 'ONN' +SET @@global.slave_allow_batching = OOF; +ERROR 42000: Variable 'slave_allow_batching' can't be set to the value of 'OOF' +SET @@global.slave_allow_batching = 0FF; +ERROR 42000: Variable 'slave_allow_batching' can't be set to the value of '0FF' +SET @@global.slave_allow_batching = ' 1'; +ERROR 42000: Variable 'slave_allow_batching' can't be set to the value of ' 1' +SET @@global.slave_allow_batching = NO; +ERROR 42000: Variable 'slave_allow_batching' can't be set to the value of 'NO' +'#-------------------FN_DYNVARS_145_05----------------------------#' +SET @@session.slave_allow_batching = 0; +ERROR HY000: Variable 'slave_allow_batching' is a GLOBAL variable and should be set with SET GLOBAL +SET @@slave_allow_batching = 0; +ERROR HY000: Variable 'slave_allow_batching' is a GLOBAL variable and should be set with SET GLOBAL +SET @@local.slave_allow_batching = 0; +ERROR HY000: Variable 'slave_allow_batching' is a GLOBAL variable and should be set with SET GLOBAL +SELECT @@session.slave_allow_batching; +ERROR HY000: Variable 'slave_allow_batching' is a GLOBAL variable +SELECT @@local.slave_allow_batching; +ERROR HY000: Variable 'slave_allow_batching' is a GLOBAL variable +'#----------------------FN_DYNVARS_145_06------------------------#' +SELECT count(VARIABLE_VALUE) FROM INFORMATION_SCHEMA.SESSION_VARIABLES WHERE VARIABLE_NAME='slave_allow_batching'; +count(VARIABLE_VALUE) +1 +'#----------------------FN_DYNVARS_145_07------------------------#' +SELECT @@global.slave_allow_batching = VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME='slave_allow_batching'; +@@global.slave_allow_batching = VARIABLE_VALUE +0 +SELECT @@global.slave_allow_batching; +@@global.slave_allow_batching +1 +SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME='slave_allow_batching'; +VARIABLE_VALUE +ON +'#---------------------FN_DYNVARS_145_08-------------------------#' +SET @@global.slave_allow_batching = OFF; +SELECT @@global.slave_allow_batching; +@@global.slave_allow_batching +0 +SET @@global.slave_allow_batching = ON; +SELECT @@global.slave_allow_batching; +@@global.slave_allow_batching +1 +'#---------------------FN_DYNVARS_145_09----------------------#' +SET @@global.slave_allow_batching = TRUE; +SELECT @@global.slave_allow_batching; +@@global.slave_allow_batching +1 +SET @@global.slave_allow_batching = FALSE; +SELECT @@global.slave_allow_batching; +@@global.slave_allow_batching +0 +SET @@global.slave_allow_batching = @global_start_value; +SELECT @@global.slave_allow_batching; +@@global.slave_allow_batching +0 +>>>>>>> MERGE-SOURCE === modified file 'mysql-test/r/sp-error.result' --- a/mysql-test/r/sp-error.result 2008-04-21 07:30:39 +0000 +++ b/mysql-test/r/sp-error.result 2008-08-07 13:36:47 +0000 @@ -1635,3 +1635,15 @@ end| call p1(1); set @@max_sp_recursion_depth = @old_recursion_depth; drop procedure p1; +drop procedure if exists proc_8759; +create procedure proc_8759() +begin +declare should_be_illegal condition for sqlstate '00000'; +declare continue handler for should_be_illegal set @x=0; +end$$ +ERROR 42000: Bad SQLSTATE: '00000' +create procedure proc_8759() +begin +declare continue handler for sqlstate '00000' set @x=0; +end$$ +ERROR 42000: Bad SQLSTATE: '00000' === modified file 'mysql-test/r/union.result' --- a/mysql-test/r/union.result 2008-05-13 15:15:40 +0000 +++ b/mysql-test/r/union.result 2008-08-07 13:36:47 +0000 @@ -153,6 +153,48 @@ ERROR 42S22: Unknown column 'a' in 'fiel 1 3 1 3 2 1 +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (1); +SELECT a INTO @v FROM ( +SELECT a FROM t1 +UNION +SELECT a FROM t1 +) alias; +SELECT a INTO OUTFILE 'union.out.file' FROM ( +SELECT a FROM t1 +UNION +SELECT a FROM t1 WHERE 0 +) alias; +SELECT a INTO DUMPFILE 'union.out.file2' FROM ( +SELECT a FROM t1 +UNION +SELECT a FROM t1 WHERE 0 +) alias; +SELECT a FROM ( +SELECT a FROM t1 +UNION +SELECT a INTO @v FROM t1 +) alias; +SELECT a FROM ( +SELECT a FROM t1 +UNION +SELECT a INTO OUTFILE 'union.out.file3' FROM t1 +) alias; +SELECT a FROM ( +SELECT a FROM t1 +UNION +SELECT a INTO DUMPFILE 'union.out.file4' FROM t1 +) alias; +SELECT a FROM t1 UNION SELECT a INTO @v FROM t1; +SELECT a FROM t1 UNION SELECT a INTO OUTFILE 'union.out.file5' FROM t1; +SELECT a FROM t1 UNION SELECT a INTO OUTFILE 'union.out.file6' FROM t1; +SELECT a INTO @v FROM t1 UNION SELECT a FROM t1; +ERROR HY000: Incorrect usage of UNION and INTO +SELECT a INTO OUTFILE 'union.out.file7' FROM t1 UNION SELECT a FROM t1; +ERROR HY000: Incorrect usage of UNION and INTO +SELECT a INTO DUMPFILE 'union.out.file8' FROM t1 UNION SELECT a FROM t1; +ERROR HY000: Incorrect usage of UNION and INTO +DROP TABLE t1; CREATE TABLE t1 ( `pseudo` char(35) NOT NULL default '', `pseudo1` char(35) NOT NULL default '', === added file 'mysql-test/std_data/ndb_apply_status.frm' Files a/mysql-test/std_data/ndb_apply_status.frm 1970-01-01 00:00:00 +0000 and b/mysql-test/std_data/ndb_apply_status.frm 2008-05-09 09:42:18 +0000 differ === added file 'mysql-test/suite/ndb/r/bug36547.result' --- a/mysql-test/suite/ndb/r/bug36547.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/ndb/r/bug36547.result 2008-05-07 14:43:32 +0000 @@ -0,0 +1,12 @@ +SET NDB_EXTRA_LOGGING=1; +ERROR HY000: Variable 'ndb_extra_logging' is a GLOBAL variable and should be set with SET GLOBAL +SET @SAVE_NDB_EXTRA_LOGGING= @@NDB_EXTRA_LOGGING; +SET GLOBAL NDB_EXTRA_LOGGING=1; +SHOW VARIABLES LIKE 'ndb_extra%'; +Variable_name Value +ndb_extra_logging 1 +SET GLOBAL NDB_EXTRA_LOGGING=0; +SHOW VARIABLES LIKE 'ndb_extra%'; +Variable_name Value +ndb_extra_logging 0 +SET @GLOBAL.NDB_EXTRA_LOGGGING= @SAVE_NDB_EXTRA_LOGGING; === modified file 'mysql-test/suite/ndb/r/ndb_alter_table_backup.result' --- a/mysql-test/suite/ndb/r/ndb_alter_table_backup.result 2008-01-25 20:23:18 +0000 +++ b/mysql-test/suite/ndb/r/ndb_alter_table_backup.result 2008-08-07 13:36:47 +0000 @@ -6,18 +6,6 @@ DROP TABLE IF EXISTS t1; SHOW TABLES; Tables_in_test t1 -SHOW CREATE TABLE t1; -Table Create Table -t1 CREATE TABLE `t1` ( - `a` int(10) unsigned NOT NULL AUTO_INCREMENT, - `b` int(11) /*!50205 COLUMN_FORMAT DYNAMIC */ DEFAULT NULL, - `c` float DEFAULT NULL, - `d` double unsigned DEFAULT NULL, - `e` decimal(5,2) DEFAULT NULL, - `f` datetime DEFAULT NULL, - `g` binary(4) DEFAULT NULL, - PRIMARY KEY (`a`) -) ENGINE=ndbcluster DEFAULT CHARSET=latin1 SELECT * FROM t1 WHERE a = 1 or a = 10 or a = 20 or a = 30 ORDER BY a; a b c d e f g 1 5 3.40282e38 1.2686868689898e308 666.66 2007-10-23 23:23:23 1111 @@ -31,18 +19,6 @@ DROP TABLE t1; SHOW TABLES; Tables_in_test t1 -SHOW CREATE TABLE t1; -Table Create Table -t1 CREATE TABLE `t1` ( - `a` int(10) unsigned NOT NULL AUTO_INCREMENT, - `b` int(11) /*!50205 COLUMN_FORMAT DYNAMIC */ DEFAULT NULL, - `c` float DEFAULT NULL, - `d` double unsigned DEFAULT NULL, - `e` decimal(5,2) DEFAULT NULL, - `f` datetime DEFAULT NULL, - `g` binary(4) DEFAULT NULL, - PRIMARY KEY (`a`) -) ENGINE=ndbcluster DEFAULT CHARSET=latin1 SELECT * FROM t1 WHERE a = 1 or a = 10 or a = 20 or a = 30 ORDER BY a; a b c d e f g 1 5 3.40282e38 1.2686868689898e308 666.66 2007-10-23 23:23:23 1111 === modified file 'mysql-test/suite/ndb/r/ndb_basic.result' --- a/mysql-test/suite/ndb/r/ndb_basic.result 2007-11-12 12:25:34 +0000 +++ b/mysql-test/suite/ndb/r/ndb_basic.result 2008-08-07 13:36:47 +0000 @@ -13,6 +13,7 @@ Ndb_cluster_node_id # Ndb_config_from_host # Ndb_config_from_port # Ndb_number_of_data_nodes # +Ndb_cluster_connection_pool # SHOW GLOBAL VARIABLES LIKE 'ndb%'; Variable_name Value ndb_autoincrement_prefetch_sz # === modified file 'mysql-test/suite/ndb/r/ndb_blob.result' --- a/mysql-test/suite/ndb/r/ndb_blob.result 2008-04-07 14:27:02 +0000 +++ b/mysql-test/suite/ndb/r/ndb_blob.result 2008-08-07 13:36:47 +0000 @@ -601,3 +601,38 @@ a length(blob_nn) length(text_nn) blob_n 1 0 0 NULL NULL 2 0 0 NULL MySQL Cluster NDB drop table t1; +create table `t1` ( +`f1` int(11) not null default -1, +`f11` text, +unique key `i1` (`f1`) +) engine=ndbcluster default charset=utf8; +insert into `t1` values (123,null); +create table `t2` ( +`f1` int(11) not null default -1, +unique key `i2` (`f1`) +) engine=ndbcluster default charset=utf8; +begin; +delete from t2 where f1=5; +delete from t1 where f1=123; +delete from t2 where f1=5; +commit; +show warnings; +Level Code Message +drop table t1; +drop table t2; +create table t1 ( +a int primary key, +giga longblob) +engine=ndb; +set @stuff = '1234567890'; +insert into t1 values (0, repeat(@stuff, 2000)); +select sha1(repeat(@stuff, 2000)); +sha1(repeat(@stuff, 2000)) +c8d94eb4127361ac22cf1c8a8f1178a37fb25e41 +select sha1(giga) from t1; +sha1(giga) +c8d94eb4127361ac22cf1c8a8f1178a37fb25e41 +select (giga = repeat(@stuff, 2000)) from t1 where a=0; +(giga = repeat(@stuff, 2000)) +1 +drop table t1; === added file 'mysql-test/suite/ndb/r/ndb_cache_trans.result' --- a/mysql-test/suite/ndb/r/ndb_cache_trans.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/ndb/r/ndb_cache_trans.result 2008-05-30 15:46:02 +0000 @@ -0,0 +1,317 @@ +result_format: 2 +drop table if exists t1; +set GLOBAL query_cache_type=on; +set GLOBAL query_cache_size=1355776; +reset query cache; +flush status; + +## Turn off autocommit, instead use COMMIT after each statement +set AUTOCOMMIT=off; + +## Create test table in NDB +CREATE TABLE t1 ( + pk int not null primary key, + a int, + b int not null, + c varchar(20) +) ENGINE=ndbcluster; + +## Add first row +insert into t1 value (1, 2, 3, 'First row'); +COMMIT; + +## Query should be inserted in qcache +Qcache_queries 0 +Qcache_inserts 0 +Qcache_hits 0 +select * from t1; +pk a b c +1 2 3 First row +Qcache_queries 1 +Qcache_inserts 1 +Qcache_hits 0 +COMMIT; +Qcache_queries 1 +Qcache_inserts 1 +Qcache_hits 0 + +## Perform the same query and make sure the query cache is hit +Qcache_queries 1 +Qcache_inserts 1 +Qcache_hits 0 +select * from t1; +pk a b c +1 2 3 First row +COMMIT; +Qcache_queries 1 +Qcache_inserts 1 +Qcache_hits 1 + +## Update the table, should be no queries in cache afterwards +update t1 set a=3 where pk=1; +COMMIT; +Qcache_queries 0 +Qcache_inserts 1 +Qcache_hits 1 + +## Read row after update, should not hit the cache, but get inserted +select * from t1; +pk a b c +1 3 3 First row +COMMIT; +Qcache_queries 1 +Qcache_inserts 2 +Qcache_hits 1 + +## Read row from cache +select * from t1; +pk a b c +1 3 3 First row +COMMIT; +Qcache_queries 1 +Qcache_inserts 2 +Qcache_hits 2 + +## Insert two new rows, queries in cache should be zero +insert into t1 value (2, 7, 8, 'Second row'); +insert into t1 value (4, 5, 6, 'Fourth row'); +COMMIT; +Qcache_queries 0 +Qcache_inserts 2 +Qcache_hits 2 + +## Read the three rows, should not hit the cache +select * from t1 order by pk; +pk a b c +1 3 3 First row +2 7 8 Second row +4 5 6 Fourth row +COMMIT; +Qcache_queries 1 +Qcache_inserts 3 +Qcache_hits 2 + +## Read the three rows, should now hit the cache! +select * from t1 order by pk; +pk a b c +1 3 3 First row +2 7 8 Second row +4 5 6 Fourth row +COMMIT; +Qcache_queries 1 +Qcache_inserts 3 +Qcache_hits 3 + +## Two selects in the same transaction should hit cache +select * from t1 order by pk; +pk a b c +1 3 3 First row +2 7 8 Second row +4 5 6 Fourth row +select * from t1 order by pk; +pk a b c +1 3 3 First row +2 7 8 Second row +4 5 6 Fourth row +COMMIT; +Qcache_queries 1 +Qcache_inserts 3 +Qcache_hits 5 + +## Perform a "new" query and make sure the query cache is not hit +select * from t1 where b=3; +pk a b c +1 3 3 First row +COMMIT; +Qcache_queries 2 +Qcache_inserts 4 +Qcache_hits 5 + +## Same query again... +select * from t1 where b=3; +pk a b c +1 3 3 First row +COMMIT; +Qcache_queries 2 +Qcache_inserts 4 +Qcache_hits 6 + +## Delete from the table, should clear the cache +delete from t1 where c='Fourth row'; +COMMIT; +Qcache_queries 0 +Qcache_inserts 4 +Qcache_hits 6 +select * from t1 where b=3; +pk a b c +1 3 3 First row +COMMIT; +Qcache_queries 1 +Qcache_inserts 5 +Qcache_hits 6 + +## Start another connection and check that the query cache is hit +set AUTOCOMMIT=off; +use test; +select * from t1 order by pk; +pk a b c +1 3 3 First row +2 7 8 Second row +select * from t1 where b=3; +pk a b c +1 3 3 First row +Qcache_queries 2 +Qcache_inserts 6 +Qcache_hits 7 + +## Update the table and switch to other connection +update t1 set a=4 where b=3; +COMMIT; + +## Connection 2 +set AUTOCOMMIT=off; +use test; + +## Should not hit cache, table updated +Qcache_queries 0 +Qcache_inserts 6 +Qcache_hits 7 +select * from t1 order by pk desc; +pk a b c +2 7 8 Second row +1 4 3 First row +Qcache_queries 1 +Qcache_inserts 7 +Qcache_hits 7 +## Should hit cache +select * from t1 order by pk desc; +pk a b c +2 7 8 Second row +1 4 3 First row +Qcache_queries 1 +Qcache_inserts 7 +Qcache_hits 8 + +## Connection 1, should hit the cache +Qcache_queries 1 +Qcache_inserts 7 +Qcache_hits 8 +select * from t1 order by pk desc; +pk a b c +2 7 8 Second row +1 4 3 First row +select * from t1 order by pk desc; +pk a b c +2 7 8 Second row +1 4 3 First row +Qcache_queries 1 +Qcache_inserts 7 +Qcache_hits 10 + +## Starting transaction and update t1 +begin; +update t1 set a=5 where pk=1; +Qcache_queries 0 +Qcache_inserts 7 +Qcache_hits 10 + +## Connection 2 +## Update has flushed the qc for t1, should not hit qc +select * from t1 order by pk desc; +pk a b c +2 7 8 Second row +1 4 3 First row +Qcache_queries 1 +Qcache_inserts 8 +Qcache_hits 10 + +## Connection 1 +commit; +Qcache_queries 1 +Qcache_inserts 8 +Qcache_hits 10 + +## Connection 2 +## Update is now committed, should not hit the cache +select * from t1 order by pk desc; +pk a b c +2 7 8 Second row +1 5 3 First row +Qcache_queries 1 +Qcache_inserts 9 +Qcache_hits 10 +COMMIT; +Qcache_queries 1 +Qcache_inserts 9 +Qcache_hits 10 + +## Connection 1 +## Should hit the cache +select * from t1 order by pk desc; +pk a b c +2 7 8 Second row +1 5 3 First row +Qcache_queries 1 +Qcache_inserts 9 +Qcache_hits 11 + +update t1 set a=6 where pk=1; + +## Following query should not be taken from cache, trans is ongoing +select * from t1 order by pk desc; +pk a b c +2 7 8 Second row +1 6 3 First row +Qcache_queries 0 +Qcache_inserts 9 +Qcache_hits 11 + +## Connection 2 should still see old data and not hit cache +Qcache_queries 0 +Qcache_inserts 9 +Qcache_hits 11 +select * from t1 order by pk desc; +pk a b c +2 7 8 Second row +1 5 3 First row +Qcache_queries 1 +Qcache_inserts 10 +Qcache_hits 11 + +## Connection 1 +COMMIT; + +## Update has just been committed, should not hit cache +Qcache_queries 1 +Qcache_inserts 10 +Qcache_hits 11 +select * from t1 order by pk desc; +pk a b c +2 7 8 Second row +1 6 3 First row +Qcache_queries 1 +Qcache_inserts 11 +Qcache_hits 11 + +## Connection 2 + +## Should hit cache +Qcache_queries 1 +Qcache_inserts 11 +Qcache_hits 11 +select * from t1 order by pk desc; +pk a b c +2 7 8 Second row +1 6 3 First row +Qcache_queries 1 +Qcache_inserts 11 +Qcache_hits 12 + +drop table t1; + +## Finally, there should be no queries in cache +Qcache_queries 0 +Qcache_inserts 11 +Qcache_hits 12 + +SET GLOBAL query_cache_size=0; === modified file 'mysql-test/suite/ndb/r/ndb_condition_pushdown.result' --- a/mysql-test/suite/ndb/r/ndb_condition_pushdown.result 2008-03-26 23:22:46 +0000 +++ b/mysql-test/suite/ndb/r/ndb_condition_pushdown.result 2008-08-07 13:36:47 +0000 @@ -1953,5 +1953,14 @@ create table t1 (a int primary key, b va insert into t1 values (0, 'I just cant beg you, any-more'); select * from t1 where b="value"; a b +drop table t1; +create table t1 (a int primary key, b varchar(5000) character set latin1) engine=ndb; +insert into t1 values(0, 'Edinburgh'),(1, 'Glasgow'),(2,'Aberdeen'); +select * from t1 where b in ('0', '1', '2','3','4','5','6','7','8','9', +'10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', 'Aberdeen'); +a b +2 Aberdeen +show warnings; +Level Code Message set engine_condition_pushdown = @old_ecpd; DROP TABLE t1,t2,t3,t4,t5; === renamed file 'mysql-test/suite/ndb_team/r/ndb_dd_restore_compat.result' => 'mysql-test/suite/ndb/r/ndb_dd_restore_compat.result' --- a/mysql-test/suite/ndb_team/r/ndb_dd_restore_compat.result 2008-01-04 16:14:42 +0000 +++ b/mysql-test/suite/ndb/r/ndb_dd_restore_compat.result 2008-08-07 13:36:47 +0000 @@ -1,3 +1,4 @@ +<<<<<<< TREE select * from information_schema.columns where table_name = "t1"; TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME ORDINAL_POSITION COLUMN_DEFAULT IS_NULLABLE DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH NUMERIC_PRECISION NUMERIC_SCALE CHARACTER_SET_NAME COLLATION_NAME COLUMN_TYPE COLUMN_KEY EXTRA PRIVILEGES COLUMN_COMMENT STORAGE FORMAT @@ -51,3 +52,58 @@ drop tablespace ts engine ndb; drop logfile group lg engine ndb; +======= +select * from information_schema.columns +where table_name = "t1"; +TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME ORDINAL_POSITION COLUMN_DEFAULT IS_NULLABLE DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH NUMERIC_PRECISION NUMERIC_SCALE CHARACTER_SET_NAME COLLATION_NAME COLUMN_TYPE COLUMN_KEY EXTRA PRIVILEGES COLUMN_COMMENT STORAGE FORMAT +NULL test t1 a1 1 NULL NO smallint NULL NULL 5 0 NULL NULL smallint(6) PRI select,insert,update,references Default Default +NULL test t1 a2 2 NULL NO int NULL NULL 10 0 NULL NULL int(11) select,insert,update,references Default Default +NULL test t1 a3 3 NULL NO bigint NULL NULL 19 0 NULL NULL bigint(20) select,insert,update,references Default Default +NULL test t1 a4 4 NULL YES char 10 10 NULL NULL latin1 latin1_swedish_ci char(10) select,insert,update,references Default Default +NULL test t1 a5 5 NULL YES decimal NULL NULL 5 1 NULL NULL decimal(5,1) select,insert,update,references Default Default +NULL test t1 a6 6 NULL YES time NULL NULL NULL NULL NULL NULL time select,insert,update,references Default Default +NULL test t1 a7 7 NULL YES date NULL NULL NULL NULL NULL NULL date select,insert,update,references Default Default +NULL test t1 a8 8 NULL YES datetime NULL NULL NULL NULL NULL NULL datetime select,insert,update,references Default Default +NULL test t1 a9 9 NULL YES varchar 255 255 NULL NULL latin1 latin1_swedish_ci varchar(255) select,insert,update,references Default Default +NULL test t1 a10 10 NULL YES blob 65535 65535 NULL NULL NULL NULL blob select,insert,update,references Default Default +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a1` smallint(6) NOT NULL, + `a2` int(11) NOT NULL, + `a3` bigint(20) NOT NULL, + `a4` char(10) DEFAULT NULL, + `a5` decimal(5,1) DEFAULT NULL, + `a6` time DEFAULT NULL, + `a7` date DEFAULT NULL, + `a8` datetime DEFAULT NULL, + `a9` varchar(255) DEFAULT NULL, + `a10` blob, + PRIMARY KEY (`a1`) +) /*!50100 TABLESPACE ts */ ENGINE=ndbcluster DEFAULT CHARSET=latin1 +a1 Smallint PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY +a2 Int NOT NULL AT=FIXED ST=DISK +a3 Bigint NOT NULL AT=FIXED ST=DISK +a4 Char(10;latin1_swedish_ci) NULL AT=FIXED ST=DISK +a5 Decimal(5,1) NULL AT=FIXED ST=DISK +a6 Time NULL AT=FIXED ST=DISK +a7 Date NULL AT=FIXED ST=DISK +a8 Datetime NULL AT=FIXED ST=DISK +a9 Varchar(255;latin1_swedish_ci) NULL AT=FIXED ST=DISK +a10 Blob(256,2000,16) NULL AT=FIXED ST=DISK BV=1 +select * from t1 order by a1; +a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 +1 2 2000000001 aaa1 34.2 04:03:02 2006-01-01 1971-05-28 16:55:03 bbbbbbbbbbbbb1 binary data +2 3 2000000002 aaa2 34.2 04:03:02 2006-01-01 1971-05-28 16:55:03 bbbbbbbbbbbbb2 binary data +3 4 2000000003 aaa3 34.2 04:03:02 2006-01-01 1971-05-28 16:55:03 bbbbbbbbbbbbb3 binary data +4 5 2000000004 aaa4 34.2 04:03:02 2006-01-01 1971-05-28 16:55:03 bbbbbbbbbbbbb4 binary data +5 6 2000000005 aaa5 34.2 04:03:02 2006-01-01 1971-05-28 16:55:03 bbbbbbbbbbbbb5 binary data +drop table t1; +ALTER TABLESPACE ts +DROP DATAFILE 'datafile.dat' +ENGINE NDB; +drop tablespace ts +engine ndb; +drop logfile group lg +engine ndb; +>>>>>>> MERGE-SOURCE === modified file 'mysql-test/suite/ndb/r/ndb_restore_compat.result' --- a/mysql-test/suite/ndb/r/ndb_restore_compat.result 2008-01-04 15:33:40 +0000 +++ b/mysql-test/suite/ndb/r/ndb_restore_compat.result 2008-08-07 13:36:47 +0000 @@ -4,10 +4,10 @@ USE BANK; SHOW TABLES; Tables_in_BANK ACCOUNT -GL ACCOUNT_TYPE -TRANSACTION +GL SYSTEM_VALUES +TRANSACTION SELECT * FROM GL ORDER BY TIME,ACCOUNT_TYPE; TIME ACCOUNT_TYPE BALANCE DEPOSIT_COUNT DEPOSIT_SUM WITHDRAWAL_COUNT WITHDRAWAL_SUM PURGED 0 0 10000000 0 0 0 0 1 === modified file 'mysql-test/suite/ndb/r/ndb_restore_different_endian_data.result' --- a/mysql-test/suite/ndb/r/ndb_restore_different_endian_data.result 2007-12-08 16:32:40 +0000 +++ b/mysql-test/suite/ndb/r/ndb_restore_different_endian_data.result 2008-08-07 13:36:47 +0000 @@ -2,10 +2,10 @@ USE test; DROP TABLE IF EXISTS t_num,t_datetime,t_string_1,t_string_2,t_gis; SHOW TABLES; Tables_in_test -t_gis -t_string_1 t_datetime +t_gis t_num +t_string_1 t_string_2 SHOW CREATE TABLE t_num; Table Create Table @@ -101,10 +101,10 @@ GEOMETRYCOLLECTION(POINT(44 6),LINESTRIN DROP TABLE t_num,t_datetime,t_string_1,t_string_2,t_gis; SHOW TABLES; Tables_in_test -t_gis -t_string_1 t_datetime +t_gis t_num +t_string_1 t_string_2 SHOW CREATE TABLE t_num; Table Create Table === added file 'mysql-test/suite/ndb/t/bug36547.test' --- a/mysql-test/suite/ndb/t/bug36547.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/ndb/t/bug36547.test 2008-05-07 14:43:32 +0000 @@ -0,0 +1,13 @@ +--source include/have_ndb.inc +# +# Bug #36547 SET GLOBAL ndb_extra_logging crashes mysqld +# +--error 1229 +SET NDB_EXTRA_LOGGING=1; + +SET @SAVE_NDB_EXTRA_LOGGING= @@NDB_EXTRA_LOGGING; +SET GLOBAL NDB_EXTRA_LOGGING=1; +SHOW VARIABLES LIKE 'ndb_extra%'; +SET GLOBAL NDB_EXTRA_LOGGING=0; +SHOW VARIABLES LIKE 'ndb_extra%'; +SET @GLOBAL.NDB_EXTRA_LOGGGING= @SAVE_NDB_EXTRA_LOGGING; === modified file 'mysql-test/suite/ndb/t/ndb_alter_table_backup.test' --- a/mysql-test/suite/ndb/t/ndb_alter_table_backup.test 2007-11-02 23:20:13 +0000 +++ b/mysql-test/suite/ndb/t/ndb_alter_table_backup.test 2008-08-07 13:36:47 +0000 @@ -23,7 +23,6 @@ DROP TABLE IF EXISTS t1; --exec $NDB_TOOLS_DIR/ndb_restore --no-defaults -b 1 -n 1 -m -r $MYSQL_TEST_DIR/std_data/ndb_backup51_d2_le >> $NDB_TOOLS_OUTPUT --exec $NDB_TOOLS_DIR/ndb_restore --no-defaults -b 1 -n 2 -r $MYSQL_TEST_DIR/std_data/ndb_backup51_d2_le >> $NDB_TOOLS_OUTPUT SHOW TABLES; -SHOW CREATE TABLE t1; SELECT * FROM t1 WHERE a = 1 or a = 10 or a = 20 or a = 30 ORDER BY a; DROP TABLE t1; @@ -36,7 +35,6 @@ DROP TABLE t1; --exec $NDB_TOOLS_DIR/ndb_restore --no-defaults -b 1 -n 1 -m -r $MYSQL_TEST_DIR/std_data/ndb_backup51_d2_be >> $NDB_TOOLS_OUTPUT --exec $NDB_TOOLS_DIR/ndb_restore --no-defaults -b 1 -n 2 -r $MYSQL_TEST_DIR/std_data/ndb_backup51_d2_be >> $NDB_TOOLS_OUTPUT SHOW TABLES; -SHOW CREATE TABLE t1; SELECT * FROM t1 WHERE a = 1 or a = 10 or a = 20 or a = 30 ORDER BY a; DROP TABLE t1; # End of 5.1 Test Case === modified file 'mysql-test/suite/ndb/t/ndb_blob.test' --- a/mysql-test/suite/ndb/t/ndb_blob.test 2008-04-07 14:27:02 +0000 +++ b/mysql-test/suite/ndb/t/ndb_blob.test 2008-08-07 13:36:47 +0000 @@ -538,3 +538,54 @@ insert into t1(a, text_nl) values (2, 'M select a, length(blob_nn), length(text_nn), blob_nl, text_nl from t1 order by a; drop table t1; + +# bug # 36756 +# Behaviour of delete of non existing row should not be affected +# by presence of Blob operations in the same transaction +# Specifically, transaction should not be aborted. +create table `t1` ( + `f1` int(11) not null default -1, + `f11` text, + unique key `i1` (`f1`) +) engine=ndbcluster default charset=utf8; + +insert into `t1` values (123,null); + +create table `t2` ( + `f1` int(11) not null default -1, + unique key `i2` (`f1`) +) engine=ndbcluster default charset=utf8; + +begin; +delete from t2 where f1=5; # No such row, no problem +delete from t1 where f1=123; # Blob operation +delete from t2 where f1=5; # No such row, no problem +commit; +show warnings; + +drop table t1; +drop table t2; + +# bug # 31284 +# Long Blob (8000 byte parts) with Blob v2 (+2 bytes length) +# exposed buffer overrun for old Api setValue() call used for +# writing parts. +# Check that data written into long Blob can be retrieved +# correctly +create table t1 ( + a int primary key, + giga longblob) +engine=ndb; + +# length 10 +set @stuff = '1234567890'; + +# 20,000 bytes = 3 parts +insert into t1 values (0, repeat(@stuff, 2000)); + +# Check that we get the same data back that we put in +select sha1(repeat(@stuff, 2000)); +select sha1(giga) from t1; +select (giga = repeat(@stuff, 2000)) from t1 where a=0; + +drop table t1; === added file 'mysql-test/suite/ndb/t/ndb_cache_trans.test' --- a/mysql-test/suite/ndb/t/ndb_cache_trans.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/ndb/t/ndb_cache_trans.test 2008-05-28 14:26:26 +0000 @@ -0,0 +1,200 @@ +-- source include/have_query_cache.inc +-- source include/have_ndb.inc +-- source include/not_embedded.inc + +--result_format 2 + +--disable_warnings +drop table if exists t1; +--enable_warnings + +# Turn on and reset query cache +set GLOBAL query_cache_type=on; +set GLOBAL query_cache_size=1355776; +reset query cache; +flush status; + +## Turn off autocommit, instead use COMMIT after each statement +set AUTOCOMMIT=off; + +## Create test table in NDB +CREATE TABLE t1 ( + pk int not null primary key, + a int, + b int not null, + c varchar(20) +) ENGINE=ndbcluster; + +## Add first row +insert into t1 value (1, 2, 3, 'First row'); +COMMIT; + +## Query should be inserted in qcache +--source include/show_qc_status.inc +select * from t1; +--source include/show_qc_status.inc +COMMIT; +--source include/show_qc_status.inc + +## Perform the same query and make sure the query cache is hit +--source include/show_qc_status.inc +select * from t1; +COMMIT; +--source include/show_qc_status.inc + +## Update the table, should be no queries in cache afterwards +update t1 set a=3 where pk=1; +COMMIT; +--source include/show_qc_status.inc + +## Read row after update, should not hit the cache, but get inserted +select * from t1; +COMMIT; +--source include/show_qc_status.inc + +## Read row from cache +select * from t1; +COMMIT; +--source include/show_qc_status.inc + +## Insert two new rows, queries in cache should be zero +insert into t1 value (2, 7, 8, 'Second row'); +insert into t1 value (4, 5, 6, 'Fourth row'); +COMMIT; +--source include/show_qc_status.inc + +## Read the three rows, should not hit the cache +select * from t1 order by pk; +COMMIT; +--source include/show_qc_status.inc + +## Read the three rows, should now hit the cache! +select * from t1 order by pk; +COMMIT; +--source include/show_qc_status.inc + +## Two selects in the same transaction should hit cache +select * from t1 order by pk; +select * from t1 order by pk; +COMMIT; +--source include/show_qc_status.inc + +## Perform a "new" query and make sure the query cache is not hit +select * from t1 where b=3; +COMMIT; +--source include/show_qc_status.inc + +## Same query again... +select * from t1 where b=3; +COMMIT; +--source include/show_qc_status.inc + +## Delete from the table, should clear the cache +delete from t1 where c='Fourth row'; +COMMIT; +--source include/show_qc_status.inc +select * from t1 where b=3; +COMMIT; +--source include/show_qc_status.inc + +## Start another connection and check that the query cache is hit +connect (con1,localhost,root,,); +connection con1; +set AUTOCOMMIT=off; +use test; +select * from t1 order by pk; +select * from t1 where b=3; +--source include/show_qc_status.inc + +## Update the table and switch to other connection +update t1 set a=4 where b=3; +COMMIT; + +## Connection 2 +connect (con2,localhost,root,,); +connection con2; +set AUTOCOMMIT=off; +use test; + +## Should not hit cache, table updated +--source include/show_qc_status.inc +select * from t1 order by pk desc; +--source include/show_qc_status.inc +## Should hit cache +select * from t1 order by pk desc; +--source include/show_qc_status.inc + +## Connection 1, should hit the cache +connection con1; +--source include/show_qc_status.inc +select * from t1 order by pk desc; +select * from t1 order by pk desc; +--source include/show_qc_status.inc + + +## Starting transaction and update t1 +begin; +update t1 set a=5 where pk=1; +--source include/show_qc_status.inc + +## Connection 2 +connection con2; +## Update has flushed the qc for t1, should not hit qc +select * from t1 order by pk desc; +--source include/show_qc_status.inc + +## Connection 1 +connection con1; +commit; +--source include/show_qc_status.inc + +## Connection 2 +connection con2; +## Update is now committed, should not hit the cache +select * from t1 order by pk desc; +--source include/show_qc_status.inc +COMMIT; +--source include/show_qc_status.inc + +## Connection 1 +connection con1; +## Should hit the cache +select * from t1 order by pk desc; +--source include/show_qc_status.inc + +update t1 set a=6 where pk=1; + +## Following query should not be taken from cache, trans is ongoing +select * from t1 order by pk desc; +--source include/show_qc_status.inc + + +## Connection 2 should still see old data and not hit cache +connection con2; +--source include/show_qc_status.inc +select * from t1 order by pk desc; +--source include/show_qc_status.inc + +## Connection 1 +connection con1; +COMMIT; + +## Update has just been committed, should not hit cache +--source include/show_qc_status.inc +select * from t1 order by pk desc; +--source include/show_qc_status.inc + +## Connection 2 +connection con2; + +## Should hit cache +--source include/show_qc_status.inc +select * from t1 order by pk desc; +--source include/show_qc_status.inc + +drop table t1; + +## Finally, there should be no queries in cache +--source include/show_qc_status.inc + +SET GLOBAL query_cache_size=0; === modified file 'mysql-test/suite/ndb/t/ndb_condition_pushdown.test' --- a/mysql-test/suite/ndb/t/ndb_condition_pushdown.test 2008-03-26 23:22:46 +0000 +++ b/mysql-test/suite/ndb/t/ndb_condition_pushdown.test 2008-08-07 13:36:47 +0000 @@ -2089,5 +2089,15 @@ create table t1 (a int primary key, b va insert into t1 values (0, 'I just cant beg you, any-more'); select * from t1 where b="value"; +# Bug 35393, Sending irrelevant data for var length comparison +drop table t1; + +create table t1 (a int primary key, b varchar(5000) character set latin1) engine=ndb; +insert into t1 values(0, 'Edinburgh'),(1, 'Glasgow'),(2,'Aberdeen'); +select * from t1 where b in ('0', '1', '2','3','4','5','6','7','8','9', +'10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', 'Aberdeen'); + +show warnings; + set engine_condition_pushdown = @old_ecpd; DROP TABLE t1,t2,t3,t4,t5; === modified file 'mysql-test/suite/ndb/t/ndb_restore_compat.test' --- a/mysql-test/suite/ndb/t/ndb_restore_compat.test 2007-09-12 12:35:51 +0000 +++ b/mysql-test/suite/ndb/t/ndb_restore_compat.test 2008-08-07 13:36:47 +0000 @@ -16,6 +16,7 @@ CREATE DATABASE BANK default charset=lat --exec $NDB_TOOLS_DIR/ndb_restore --no-defaults -b 1 -n 1 -p 1 -m -r $MYSQL_TEST_DIR/std_data/ndb_backup51 >> $NDB_TOOLS_OUTPUT --exec $NDB_TOOLS_DIR/ndb_restore --no-defaults -e -b 1 -n 2 -p 1 -r $MYSQL_TEST_DIR/std_data/ndb_backup51 >> $NDB_TOOLS_OUTPUT USE BANK; +--sorted_result SHOW TABLES; SELECT * FROM GL ORDER BY TIME,ACCOUNT_TYPE; SELECT * FROM ACCOUNT ORDER BY ACCOUNT_ID; === modified file 'mysql-test/suite/ndb/t/ndb_restore_different_endian_data.test' --- a/mysql-test/suite/ndb/t/ndb_restore_different_endian_data.test 2007-09-05 13:01:30 +0000 +++ b/mysql-test/suite/ndb/t/ndb_restore_different_endian_data.test 2008-05-16 20:13:53 +0000 @@ -147,6 +147,7 @@ DROP TABLE IF EXISTS t_num,t_datetime,t_ --enable_warnings --exec $NDB_TOOLS_DIR/ndb_restore --no-defaults -b 1 -n 1 -m -r $MYSQL_TEST_DIR/std_data/ndb_backup51_data_le >> $NDB_TOOLS_OUTPUT --exec $NDB_TOOLS_DIR/ndb_restore --no-defaults -b 1 -n 2 -r $MYSQL_TEST_DIR/std_data/ndb_backup51_data_le >> $NDB_TOOLS_OUTPUT +--sorted_result SHOW TABLES; SHOW CREATE TABLE t_num; SHOW CREATE TABLE t_datetime; @@ -168,6 +169,7 @@ SELECT AsText(t_geometrycollection), AsT DROP TABLE t_num,t_datetime,t_string_1,t_string_2,t_gis; --exec $NDB_TOOLS_DIR/ndb_restore --no-defaults -b 1 -n 1 -m -r $MYSQL_TEST_DIR/std_data/ndb_backup51_data_be >> $NDB_TOOLS_OUTPUT --exec $NDB_TOOLS_DIR/ndb_restore --no-defaults -b 1 -n 2 -r $MYSQL_TEST_DIR/std_data/ndb_backup51_data_be >> $NDB_TOOLS_OUTPUT +--sorted_result SHOW TABLES; SHOW CREATE TABLE t_num; SHOW CREATE TABLE t_datetime; === removed file 'mysql-test/suite/ndb_team/t/ndb_dd_restore_compat.test' --- a/mysql-test/suite/ndb_team/t/ndb_dd_restore_compat.test 2008-01-04 16:14:42 +0000 +++ b/mysql-test/suite/ndb_team/t/ndb_dd_restore_compat.test 1970-01-01 00:00:00 +0000 @@ -1,22 +0,0 @@ --- source include/have_ndb.inc --- source include/not_embedded.inc - ---exec $NDB_TOOLS_DIR/ndb_restore --no-defaults -b 1 -n 1 -p 1 -m -r $MYSQL_TEST_DIR/std_data/ndb_backup51_dd >> $NDB_TOOLS_OUTPUT ---exec $NDB_TOOLS_DIR/ndb_restore --no-defaults -e -b 1 -n 2 -p 1 -r $MYSQL_TEST_DIR/std_data/ndb_backup51_dd >> $NDB_TOOLS_OUTPUT - -select * from information_schema.columns -where table_name = "t1"; -show create table t1; ---exec $NDB_TOOLS_DIR/ndb_desc --no-defaults -d test t1 | grep 'ST=' -select * from t1 order by a1; -drop table t1; - -ALTER TABLESPACE ts -DROP DATAFILE 'datafile.dat' -ENGINE NDB; - -drop tablespace ts -engine ndb; - -drop logfile group lg -engine ndb; === modified file 'mysql-test/suite/ndb_team/t/rpl_ndb_dd_advance.test' --- a/mysql-test/suite/ndb_team/t/rpl_ndb_dd_advance.test 2008-01-04 15:33:40 +0000 +++ b/mysql-test/suite/ndb_team/t/rpl_ndb_dd_advance.test 2008-08-07 13:36:47 +0000 @@ -341,7 +341,6 @@ while ($j) --echo ***** Finsh the slave sync process ******* --disable_query_log # 1. 2. 3. ---sync_slave_with_master --source include/ndb_setup_slave.inc --enable_query_log === modified file 'mysql-test/suite/rpl_ndb/r/rpl_ndb_apply_status.result' --- a/mysql-test/suite/rpl_ndb/r/rpl_ndb_apply_status.result 2007-11-02 12:07:14 +0000 +++ b/mysql-test/suite/rpl_ndb/r/rpl_ndb_apply_status.result 2008-05-09 09:42:18 +0000 @@ -1,3 +1,4 @@ +select * from mysql.ndb_apply_status; stop slave; drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; reset master; === 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 2007-11-02 12:07:14 +0000 +++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_apply_status.test 2008-05-20 10:18:38 +0000 @@ -1,3 +1,20 @@ + +# +# BUG#36123 Selecting from mysql.ndb_apply_status leads to failure +# +# Load the mysql.ndb_apply_status table into table def cache +# + +# 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; +--disable_result_log +--disable_abort_on_error +select * from mysql.ndb_apply_status; +--enable_abort_on_error +--enable_result_log + + -- source include/have_ndb.inc -- source include/have_binlog_format_row.inc -- source include/ndb_master-slave.inc === added file 'mysql-test/t/innodb_bug34053.test' --- a/mysql-test/t/innodb_bug34053.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/t/innodb_bug34053.test 2008-02-22 23:56:34 +0000 @@ -0,0 +1,50 @@ +# +# Make sure http://bugs.mysql.com/34053 remains fixed. +# + +-- source include/not_embedded.inc +-- source include/have_innodb.inc + +SET storage_engine=InnoDB; + +# we do not really care about what gets printed, we are only +# interested in getting success or failure according to our +# expectations +-- disable_query_log +-- disable_result_log + +GRANT USAGE ON *.* TO 'shane'@'localhost' IDENTIFIED BY '12345'; +FLUSH PRIVILEGES; + +-- connect (con1,localhost,shane,12345,) + +-- connection con1 +-- error ER_SPECIFIC_ACCESS_DENIED_ERROR +CREATE TABLE innodb_monitor (a INT) ENGINE=INNODB; +-- error ER_SPECIFIC_ACCESS_DENIED_ERROR +CREATE TABLE innodb_mem_validate (a INT) ENGINE=INNODB; +CREATE TABLE innodb_monitorx (a INT) ENGINE=INNODB; +DROP TABLE innodb_monitorx; +CREATE TABLE innodb_monito (a INT) ENGINE=INNODB; +DROP TABLE innodb_monito; +CREATE TABLE xinnodb_monitor (a INT) ENGINE=INNODB; +DROP TABLE xinnodb_monitor; +CREATE TABLE nnodb_monitor (a INT) ENGINE=INNODB; +DROP TABLE nnodb_monitor; + +-- connection default +CREATE TABLE innodb_monitor (a INT) ENGINE=INNODB; +CREATE TABLE innodb_mem_validate (a INT) ENGINE=INNODB; + +-- connection con1 +-- error ER_SPECIFIC_ACCESS_DENIED_ERROR +DROP TABLE innodb_monitor; +-- error ER_SPECIFIC_ACCESS_DENIED_ERROR +DROP TABLE innodb_mem_validate; + +-- connection default +DROP TABLE innodb_monitor; +DROP TABLE innodb_mem_validate; +DROP USER 'shane'@'localhost'; + +-- disconnect con1 === removed file 'mysql-test/t/innodb_bug34053.test' --- a/mysql-test/t/innodb_bug34053.test 2008-06-12 00:08:07 +0000 +++ b/mysql-test/t/innodb_bug34053.test 1970-01-01 00:00:00 +0000 @@ -1,50 +0,0 @@ -# -# Make sure http://bugs.mysql.com/34053 remains fixed. -# - --- source include/not_embedded.inc --- source include/have_innodb.inc - -SET storage_engine=InnoDB; - -# we do not really care about what gets printed, we are only -# interested in getting success or failure according to our -# expectations --- disable_query_log --- disable_result_log - -GRANT USAGE ON *.* TO 'shane'@'localhost' IDENTIFIED BY '12345'; -FLUSH PRIVILEGES; - --- connect (con1,localhost,shane,12345,) - --- connection con1 --- error ER_SPECIFIC_ACCESS_DENIED_ERROR -CREATE TABLE innodb_monitor (a INT) ENGINE=INNODB; --- error ER_SPECIFIC_ACCESS_DENIED_ERROR -CREATE TABLE innodb_mem_validate (a INT) ENGINE=INNODB; -CREATE TABLE innodb_monitorx (a INT) ENGINE=INNODB; -DROP TABLE innodb_monitorx; -CREATE TABLE innodb_monito (a INT) ENGINE=INNODB; -DROP TABLE innodb_monito; -CREATE TABLE xinnodb_monitor (a INT) ENGINE=INNODB; -DROP TABLE xinnodb_monitor; -CREATE TABLE nnodb_monitor (a INT) ENGINE=INNODB; -DROP TABLE nnodb_monitor; - --- connection default -CREATE TABLE innodb_monitor (a INT) ENGINE=INNODB; -CREATE TABLE innodb_mem_validate (a INT) ENGINE=INNODB; - --- connection con1 --- error ER_SPECIFIC_ACCESS_DENIED_ERROR -DROP TABLE innodb_monitor; --- error ER_SPECIFIC_ACCESS_DENIED_ERROR -DROP TABLE innodb_mem_validate; - --- connection default -DROP TABLE innodb_monitor; -DROP TABLE innodb_mem_validate; -DROP USER 'shane'@'localhost'; - --- disconnect con1 === added file 'mysql-test/t/log_bin_trust_routine_creators_basic.test' --- a/mysql-test/t/log_bin_trust_routine_creators_basic.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/t/log_bin_trust_routine_creators_basic.test 2008-04-10 13:14:28 +0000 @@ -0,0 +1,164 @@ +############## mysql-test\t\log_bin_trust_routine_creators_basic.test ######### +# # +# Variable Name: log_bin_trust_routine_creators # +# Scope: GLOBAL # +# Access Type: Dynamic # +# Data Type: boolean # +# Default Value: False # +# Range: # +# # +# # +# Creation Date: 2008-02-12 # +# Author: Salman # +# # +# Description: Test Cases of Dynamic System Variable # +# log_bin_trust_routine_creators that checks the # +# behavior of this variable in the following ways # +# * Default Value # +# * Valid & Invalid values # +# * Scope & Access method # +# * Data Integrity # +# # +# Reference: (Not given on website) # +# # +############################################################################### + +--source include/load_sysvars.inc +#################################################################### +# START OF log_bin_trust_routine_creators TESTS # +#################################################################### + + +############################################################# +# Save initial value # +############################################################# + +SET @start_global_value = @@global.log_bin_trust_routine_creators; +SELECT @start_global_value; + + +--echo '#--------------------FN_DYNVARS_064_01-------------------------#' +######################################################################## +# Display the DEFAULT value of log_bin_trust_routine_creators # +######################################################################## + +SET @@global.log_bin_trust_routine_creators = TRUE; +SET @@global.log_bin_trust_routine_creators = DEFAULT; +SELECT @@global.log_bin_trust_routine_creators; + + +--echo '#--------------------FN_DYNVARS_064_02-------------------------#' +############################################################################## +# Check the DEFAULT value of log_bin_trust_routine_creators # +############################################################################## + +SET @@global.log_bin_trust_routine_creators = DEFAULT; +SELECT @@global.log_bin_trust_routine_creators = 'FALSE'; + + +--echo '#--------------------FN_DYNVARS_064_03-------------------------#' +################################################################## +# Change the value of variable to a valid value for GLOBAL Scope # +################################################################## + +SET @@global.log_bin_trust_routine_creators = ON; +SELECT @@global.log_bin_trust_routine_creators; +SET @@global.log_bin_trust_routine_creators = OFF; +SELECT @@global.log_bin_trust_routine_creators; +SET @@global.log_bin_trust_routine_creators = 0; +SELECT @@global.log_bin_trust_routine_creators; +SET @@global.log_bin_trust_routine_creators = 1; +SELECT @@global.log_bin_trust_routine_creators; +SET @@global.log_bin_trust_routine_creators = TRUE; +SELECT @@global.log_bin_trust_routine_creators; +SET @@global.log_bin_trust_routine_creators = FALSE; +SELECT @@global.log_bin_trust_routine_creators; + + +--echo '#-------------------FN_DYNVARS_064_04----------------------------#' +########################################################################### +# Test if accessing session log_bin_trust_routine_creators gives error # +########################################################################### + +--Error ER_GLOBAL_VARIABLE +SET @@session.log_bin_trust_routine_creators = 0; +--Error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.log_bin_trust_routine_creators; + + +--echo '#------------------FN_DYNVARS_064_05-----------------------#' +########################################################################## +# Change the value of log_bin_trust_routine_creators to an invalid value # +########################################################################## + +--Error ER_WRONG_VALUE_FOR_VAR +SET @@global.log_bin_trust_routine_creators = 'ONN'; +--Error ER_WRONG_VALUE_FOR_VAR +SET @@global.log_bin_trust_routine_creators = "OFFF"; +SET @@global.log_bin_trust_routine_creators = OF; +SELECT @@global.log_bin_trust_routine_creators; +--echo 'Bug# 34828: OF is also working as OFF and no error is coming'; + +--Error ER_WRONG_VALUE_FOR_VAR +SET @@global.log_bin_trust_routine_creators = TTRUE; +--Error ER_WRONG_VALUE_FOR_VAR +SET @@global.log_bin_trust_routine_creators = FELSE; +--Error ER_WRONG_VALUE_FOR_VAR +SET @@global.log_bin_trust_routine_creators = -1024; +--Error ER_WRONG_VALUE_FOR_VAR +SET @@global.log_bin_trust_routine_creators = 65536; +--Error ER_WRONG_VALUE_FOR_VAR +SET @@global.log_bin_trust_routine_creators = 65530.34; +--Error ER_WRONG_VALUE_FOR_VAR +SET @@global.log_bin_trust_routine_creators = test; + + +--echo '#------------------FN_DYNVARS_064_06-----------------------#' +############################################################################### +# Check if the value in GLOBAL & SESSION Tables matches value in variable # +############################################################################### + + +SELECT @@global.log_bin_trust_routine_creators = VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME='log_bin_trust_routine_creators'; + +--Error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.log_bin_trust_routine_creators = VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_VARIABLES WHERE VARIABLE_NAME='log_bin_trust_routine_creators'; + + +--echo '#---------------------FN_DYNVARS_064_07----------------------#' +################################################################################# +# Check if accessing variable with and without GLOBAL point to same variable # +################################################################################# + + +SET @@global.log_bin_trust_routine_creators = TRUE; +SELECT @@log_bin_trust_routine_creators = @@global.log_bin_trust_routine_creators; + + +--echo '#---------------------FN_DYNVARS_064_08----------------------#' +################################################################### +# Check if variable can be accessed with and without @@ sign # +################################################################### + +SET @@global.log_bin_trust_routine_creators = TRUE; +SELECT @@log_bin_trust_routine_creators; +--Error ER_UNKNOWN_TABLE +SELECT local.log_bin_trust_routine_creators; +--Error ER_UNKNOWN_TABLE +SELECT session.log_bin_trust_routine_creators; +--Error ER_BAD_FIELD_ERROR +SELECT log_bin_trust_routine_creators = @@session.log_bin_trust_routine_creators; + + +#################################### +# Restore initial value # +#################################### + +SET @@global.log_bin_trust_routine_creators = @start_global_value; +SELECT @@global.log_bin_trust_routine_creators; + + +################################################################### +# END OF log_bin_trust_routine_creators TESTS # +################################################################### + === added file 'mysql-test/t/multi_range_count_basic_32.test' --- a/mysql-test/t/multi_range_count_basic_32.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/t/multi_range_count_basic_32.test 2008-05-08 18:13:39 +0000 @@ -0,0 +1,9 @@ +################################################################################ +# Created by Horst Hunger 2008-05-07 # +# # +# Wrapper for 32 bit machines # +################################################################################ + +--source include/have_32bit.inc +--source include/multi_range_count_basic.inc + === added file 'mysql-test/t/multi_range_count_basic_64.test' --- a/mysql-test/t/multi_range_count_basic_64.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/t/multi_range_count_basic_64.test 2008-05-08 18:13:39 +0000 @@ -0,0 +1,9 @@ +################################################################################ +# Created by Horst Hunger 2008-05-07 # +# # +# Wrapper for 64 bit machines # +################################################################################ + +--source include/have_64bit.inc +--source include/multi_range_count_basic.inc + === removed file 'mysql-test/t/rpl_slave_compressed_protocol_basic.test' --- a/mysql-test/t/rpl_slave_compressed_protocol_basic.test 2008-05-14 23:24:13 +0000 +++ b/mysql-test/t/rpl_slave_compressed_protocol_basic.test 1970-01-01 00:00:00 +0000 @@ -1,167 +0,0 @@ -############# mysql-test\t\slave_compressed_protocol_basic.test ############### -# # -# Variable Name: slave_compressed_protocol # -# Scope: GLOBAL # -# Access Type: Dynamic # -# Data Type: boolean # -# Default Value: FALSE # -# Range: TRUE, FALSE # -# # -# # -# Creation Date: 2008-02-07 # -# Author: Rizwan # -# # -# Description: Test Cases of Dynamic System Variable slave_compressed_protocol# -# that checks the behavior of this variable in the following ways# -# * Default Value # -# * Valid & Invalid values # -# * Scope & Access method # -# * Data Integrity # -# # -# Reference: http://dev.mysql.com/doc/refman/5.1/en/ # -# server-system-variables.html # -# # -############################################################################### - ---source include/not_embedded.inc ---source include/load_sysvars.inc -######################################################################## -# START OF slave_compressed_protocol TESTS # -######################################################################## - - -############################################################################## -# Saving initial value of slave_compressed_protocol in a temporary variable # -############################################################################## - -SET @global_start_value = @@global.slave_compressed_protocol; -SELECT @global_start_value; - ---echo '#--------------------FN_DYNVARS_147_01------------------------#' -######################################################################## -# Display the DEFAULT value of slave_compressed_protocol # -######################################################################## - -SET @@global.slave_compressed_protocol = 1; -SET @@global.slave_compressed_protocol = DEFAULT; -SELECT @@global.slave_compressed_protocol; - ---echo '#---------------------FN_DYNVARS_147_02-------------------------#' -############################################################################### -# Check if slave_compressed_protocol can be accessed with and without @@ sign # -############################################################################### - ---Error ER_GLOBAL_VARIABLE -SET slave_compressed_protocol = 1; -SELECT @@slave_compressed_protocol; ---Error ER_UNKNOWN_TABLE -SELECT global.slave_compressed_protocol; - -SET global slave_compressed_protocol = 1; -SELECT @@global.slave_compressed_protocol; - - ---echo '#--------------------FN_DYNVARS_147_03------------------------#' -######################################################################## -# Change the value of slave_compressed_protocol to a valid value # -######################################################################## - -SET @@global.slave_compressed_protocol = 0; -SELECT @@global.slave_compressed_protocol; -SET @@global.slave_compressed_protocol = 1; -SELECT @@global.slave_compressed_protocol; - - ---echo '#--------------------FN_DYNVARS_147_04-------------------------#' -########################################################################### -# Change the value of slave_compressed_protocol to invalid value # -########################################################################### - ---Error ER_WRONG_VALUE_FOR_VAR -SET @@global.slave_compressed_protocol = -1; ---Error ER_WRONG_VALUE_FOR_VAR -SET @@global.slave_compressed_protocol = 2; ---Error ER_WRONG_VALUE_FOR_VAR -SET @@global.slave_compressed_protocol = "1.00"; ---Error ER_WRONG_VALUE_FOR_VAR -SET @@global.slave_compressed_protocol = "Y"; ---Error ER_WRONG_VALUE_FOR_VAR -SET @@global.slave_compressed_protocol = YES; ---Error ER_WRONG_VALUE_FOR_VAR -SET @@global.slave_compressed_protocol = ONN; ---Error ER_WRONG_VALUE_FOR_VAR -SET @@global.slave_compressed_protocol = 0FF; ---Error ER_WRONG_VALUE_FOR_VAR -SET @@global.slave_compressed_protocol = ' 1'; ---Error ER_WRONG_VALUE_FOR_VAR -SET @@global.slave_compressed_protocol = NO; - - ---echo '#-------------------FN_DYNVARS_147_05----------------------------#' -########################################################################### -# Test if accessing session slave_compressed_protocol gives error # -########################################################################### - ---Error ER_GLOBAL_VARIABLE -SET @@session.slave_compressed_protocol = 0; ---Error ER_GLOBAL_VARIABLE -SET @@slave_compressed_protocol = 0; ---Error ER_GLOBAL_VARIABLE -SET @@local.slave_compressed_protocol = 0; ---Error ER_INCORRECT_GLOBAL_LOCAL_VAR -SELECT @@session.slave_compressed_protocol; ---Error ER_INCORRECT_GLOBAL_LOCAL_VAR -SELECT @@local.slave_compressed_protocol; - ---echo '#----------------------FN_DYNVARS_147_06------------------------#' -######################################################################### -# Check if the value in SESSION Table contains variable value # -######################################################################### - -SELECT count(VARIABLE_VALUE) -FROM INFORMATION_SCHEMA.SESSION_VARIABLES -WHERE VARIABLE_NAME='slave_compressed_protocol'; - ---echo '#----------------------FN_DYNVARS_147_07------------------------#' -######################################################################### -# Check if the value in GLOBAL Table matches value in variable # -######################################################################### - -SELECT @@global.slave_compressed_protocol = VARIABLE_VALUE -FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES -WHERE VARIABLE_NAME='slave_compressed_protocol'; -SELECT @@global.slave_compressed_protocol; -SELECT VARIABLE_VALUE -FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES -WHERE VARIABLE_NAME='slave_compressed_protocol'; - ---echo '#---------------------FN_DYNVARS_147_08-------------------------#' -################################################################### -# Check if ON and OFF values can be used on variable # -################################################################### - -SET @@global.slave_compressed_protocol = OFF; -SELECT @@global.slave_compressed_protocol; -SET @@global.slave_compressed_protocol = ON; -SELECT @@global.slave_compressed_protocol; - ---echo '#---------------------FN_DYNVARS_147_09----------------------#' -################################################################### -# Check if TRUE and FALSE values can be used on variable # -################################################################### - -SET @@global.slave_compressed_protocol = TRUE; -SELECT @@global.slave_compressed_protocol; -SET @@global.slave_compressed_protocol = FALSE; -SELECT @@global.slave_compressed_protocol; - -############################## -# Restore initial value # -############################## - -SET @@global.slave_compressed_protocol = @global_start_value; -SELECT @@global.slave_compressed_protocol; - -############################################################### -# END OF slave_compressed_protocol TESTS # -############################################################### === removed file 'mysql-test/t/rpl_slave_exec_mode_basic.test' --- a/mysql-test/t/rpl_slave_exec_mode_basic.test 2008-05-14 23:24:13 +0000 +++ b/mysql-test/t/rpl_slave_exec_mode_basic.test 1970-01-01 00:00:00 +0000 @@ -1,41 +0,0 @@ -############## mysql-test\t\slave_exec_mode_basic.test ######################### -# # -# Variable Name: slave_exec_mode # -# Scope: GLOBAL & SESSION # -# Access Type: Dynamic # -# Data Type: Numeric # -# Default Value: 1 # -# Range: 1 - 65536 # -# # -# # -# Creation Date: 2008-02-07 # -# Author: Rizwan Maredia # -# # -# Description: Test Cases of Dynamic System Variable slave_exec_mode # -# that checks the behavior of this variable in the following ways # -# * Default Value # -# * Valid & Invalid values # -# * Scope & Access method # -# * Data Integrity # -# # -# Reference: http://dev.mysql.com/doc/refman/5.1/en/ # -# server-system-variables.html # -# # -################################################################################ - ---source include/load_sysvars.inc - -######################################################################## -# START OF slave_exec_mode TESTS # -######################################################################## - - -######################################################################## -# Saving initial value of slave_exec_mode in a temporary variable # -######################################################################## -SET @start_value = @@global.slave_exec_mode; ---echo 'This variable is not supported in version 5.1.22. It is introduced in 5.1.24' - -######################################################################## -# END OF slave_exec_mode TESTS # -######################################################################## === removed file 'mysql-test/t/rpl_slave_net_timeout_basic.test' --- a/mysql-test/t/rpl_slave_net_timeout_basic.test 2008-05-14 23:24:13 +0000 +++ b/mysql-test/t/rpl_slave_net_timeout_basic.test 1970-01-01 00:00:00 +0000 @@ -1,187 +0,0 @@ -################## mysql-test\t\slave_net_timeout_basic.test ################## -# # -# Variable Name: slave_net_timeout # -# Scope: GLOBAL # -# Access Type: Dynamic # -# Data Type: numeric # -# Default Value: 3600 # -# Range: # -# # -# # -# Creation Date: 2008-02-07 # -# Author: Rizwan # -# # -# Description: Test Cases of Dynamic System Variable slave_net_timeout # -# that checks the behavior of this variable in the following ways# -# * Default Value # -# * Valid & Invalid values # -# * Scope & Access method # -# * Data Integrity # -# # -# Reference: http://dev.mysql.com/doc/refman/5.1/en/ # -# server-system-variables.html # -# # -############################################################################### - ---source include/not_embedded.inc ---source include/load_sysvars.inc -########################################################### -# START OF slave_net_timeout TESTS # -########################################################### - - -############################################################# -# Save initial value # -############################################################# - -SET @start_global_value = @@global.slave_net_timeout; -SELECT @start_global_value; - ---echo '#--------------------FN_DYNVARS_146_01-------------------------#' -########################################################### -# Display the DEFAULT value of slave_net_timeout # -########################################################### - -SET @@global.slave_net_timeout = 500000; -SET @@global.slave_net_timeout = DEFAULT; -SELECT @@global.slave_net_timeout; - ---echo '#--------------------FN_DYNVARS_146_02-------------------------#' -############################################################ -# Check the DEFAULT value of slave_net_timeout # -############################################################ - -SET @@global.slave_net_timeout = DEFAULT; -SELECT @@global.slave_net_timeout = 3600; - ---echo '#--------------------FN_DYNVARS_146_03-------------------------#' -########################################################################### -# Change the value of slave_net_timeout to a valid value for GLOBAL Scope # -########################################################################### - -SET @@global.slave_net_timeout = 0; -SELECT @@global.slave_net_timeout; -SET @@global.slave_net_timeout = 1; -SELECT @@global.slave_net_timeout; -SET @@global.slave_net_timeout = 15; -SELECT @@global.slave_net_timeout; -SET @@global.slave_net_timeout = 1024; -SELECT @@global.slave_net_timeout; -SET @@global.slave_net_timeout = 3600+1; -SELECT @@global.slave_net_timeout; -SET @@global.slave_net_timeout = 2147483648; -SELECT @@global.slave_net_timeout; -SET @@global.slave_net_timeout = 2147483648*2-1; -SELECT @@global.slave_net_timeout; - - ---echo '#--------------------FN_DYNVARS_146_04-------------------------#' -############################################################################### -# Check if variable can be access with session scope # -############################################################################### - ---Error ER_GLOBAL_VARIABLE -SET @@slave_net_timeout = 2; - ---Error ER_GLOBAL_VARIABLE -SET @@session.slave_net_timeout = 3; - ---Error ER_GLOBAL_VARIABLE -SET @@local.slave_net_timeout = 4; - - - ---echo '#------------------FN_DYNVARS_146_05-----------------------#' -############################################################# -# Change the value of slave_net_timeout to an invalid value # -############################################################# - -SET @@global.slave_net_timeout = -1; -SELECT @@global.slave_net_timeout; - -SET @@global.slave_net_timeout = -2147483648; -SELECT @@global.slave_net_timeout; - -SET @@global.slave_net_timeout = 2147483649*2; -SELECT @@global.slave_net_timeout; - ---Error ER_PARSE_ERROR -SET @@global.slave_net_timeout = 65530.34.; ---Error ER_WRONG_TYPE_FOR_VAR -SET @@global.slave_net_timeout = 100s; ---Error ER_WRONG_TYPE_FOR_VAR -SET @@global.slave_net_timeout = 7483649.56; ---Error ER_WRONG_TYPE_FOR_VAR -SET @@global.slave_net_timeout = 0.6; - ---echo 'Bug# 34877: Invalid Values are coming in variable on assigning valid values'; - - ---echo '#------------------FN_DYNVARS_146_06-----------------------#' -#################################################################### -# Check if the value in GLOBAL Table matches value in variable # -#################################################################### - -SET @@global.slave_net_timeout = 3000; -SELECT @@global.slave_net_timeout = VARIABLE_VALUE -FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES -WHERE VARIABLE_NAME='slave_net_timeout'; - - ---echo '#------------------FN_DYNVARS_146_07-----------------------#' -########################################################################### -# Check if the value is present in INFORMATION_SCHEMA.SESSION_VARIABLES # -########################################################################### - -SELECT count(VARIABLE_VALUE) -FROM INFORMATION_SCHEMA.SESSION_VARIABLES -WHERE VARIABLE_NAME='slave_net_timeout'; - - ---echo '#------------------FN_DYNVARS_146_08-----------------------#' -#################################################################### -# Check if TRUE and FALSE values can be used on variable # -#################################################################### - -SET @@global.slave_net_timeout = TRUE; -SELECT @@global.slave_net_timeout; -SET @@global.slave_net_timeout = FALSE; -SELECT @@global.slave_net_timeout; - - ---echo '#---------------------FN_DYNVARS_001_09----------------------#' -############################################################################### -# Check if accessing variable with and without GLOBAL point to same variable # -############################################################################### - - -SET @@global.slave_net_timeout = 60*60; -SELECT @@slave_net_timeout = @@global.slave_net_timeout; - - ---echo '#---------------------FN_DYNVARS_001_10----------------------#' -########################################################################## -# Check if slave_net_timeout can be accessed without @@ sign and scope # -########################################################################## - ---Error ER_GLOBAL_VARIABLE -SET slave_net_timeout = 2048; ---Error ER_BAD_FIELD_ERROR -SELECT slave_net_timeout; - -SELECT @@slave_net_timeout; - -#verifying another another syntax for setting value -SET global slave_net_timeout = 99; - -#################################### -# Restore initial value # -#################################### - -SET @@global.slave_net_timeout = @start_global_value; -SELECT @@global.slave_net_timeout; - -################################################ -# END OF slave_net_timeout TESTS # -################################################ - === removed file 'mysql-test/t/rpl_slave_transaction_retries_basic_32.test' --- a/mysql-test/t/rpl_slave_transaction_retries_basic_32.test 2008-05-14 23:24:13 +0000 +++ b/mysql-test/t/rpl_slave_transaction_retries_basic_32.test 1970-01-01 00:00:00 +0000 @@ -1,9 +0,0 @@ -################################################################################ -# Created by Horst Hunger 2008-05-07 # -# # -# Wrapper for 32 bit machines # -################################################################################ - ---source include/have_32bit.inc ---source include/slave_transaction_retries_basic.inc - === removed file 'mysql-test/t/rpl_slave_transaction_retries_basic_64.test' --- a/mysql-test/t/rpl_slave_transaction_retries_basic_64.test 2008-05-14 23:24:13 +0000 +++ b/mysql-test/t/rpl_slave_transaction_retries_basic_64.test 1970-01-01 00:00:00 +0000 @@ -1,9 +0,0 @@ -################################################################################ -# Created by Horst Hunger 2008-05-07 # -# # -# Wrapper for 64 bit machines # -################################################################################ - ---source include/have_64bit.inc ---source include/slave_transaction_retries_basic.inc - === removed file 'mysql-test/t/rpl_sync_binlog_basic_32.test' --- a/mysql-test/t/rpl_sync_binlog_basic_32.test 2008-05-16 02:44:49 +0000 +++ b/mysql-test/t/rpl_sync_binlog_basic_32.test 1970-01-01 00:00:00 +0000 @@ -1,9 +0,0 @@ -################################################################################ -# Created by Horst Hunger 2008-05-07 # -# # -# Wrapper for 32 bit machines # -################################################################################ - ---source include/have_32bit.inc ---source include/sync_binlog_basic.inc - === removed file 'mysql-test/t/rpl_sync_binlog_basic_64.test' --- a/mysql-test/t/rpl_sync_binlog_basic_64.test 2008-05-16 02:44:49 +0000 +++ b/mysql-test/t/rpl_sync_binlog_basic_64.test 1970-01-01 00:00:00 +0000 @@ -1,9 +0,0 @@ -################################################################################ -# Created by Horst Hunger 2008-05-07 # -# # -# Wrapper for 64 bit machines # -################################################################################ - ---source include/have_64bit.inc ---source include/sync_binlog_basic.inc - === renamed file 'mysql-test/t/rpl_slave_allow_batching_basic.test' => 'mysql-test/t/slave_allow_batching_basic.test' --- a/mysql-test/t/rpl_slave_allow_batching_basic.test 2008-05-14 23:24:13 +0000 +++ b/mysql-test/t/slave_allow_batching_basic.test 2008-08-07 13:36:47 +0000 @@ -1,3 +1,4 @@ +<<<<<<< TREE ############## mysql-test\t\slave_allow_batching_basic.test #################### # # # Variable Name: slave_allow_batching # @@ -164,3 +165,169 @@ SELECT @@global.slave_allow_batching; ############################################################### # END OF slave_allow_batching TESTS # ############################################################### +======= +############## mysql-test\t\slave_allow_batching_basic.test #################### +# # +# Variable Name: slave_allow_batching # +# Scope: GLOBAL & SESSION # +# Access Type: Dynamic # +# Data Type: Numeric # +# Default Value: 1 # +# Range: 1 - 65536 # +# # +# # +# Creation Date: 2008-02-07 # +# Author: Rizwan Maredia # +# # +# Description: Test Cases of Dynamic System Variable slave_allow_batching # +# that checks the behavior of this variable in the following ways # +# * Default Value # +# * Valid & Invalid values # +# * Scope & Access method # +# * Data Integrity # +# # +# Reference: http://dev.mysql.com/doc/refman/5.1/en/ # +# server-system-variables.html # +# # +################################################################################ + +--source include/not_embedded.inc +--source include/load_sysvars.inc +######################################################################## +# START OF slave_allow_batching TESTS # +######################################################################## + + +################################################################################ +# Saving initial value of slave_allow_batching in a temporary variable # +################################################################################ + +SET @global_start_value = @@global.slave_allow_batching; +SELECT @global_start_value; + +--echo '#--------------------FN_DYNVARS_145_01------------------------#' +######################################################################## +# Display the DEFAULT value of slave_allow_batching # +######################################################################## + +SET @@global.slave_allow_batching = 1; +SET @@global.slave_allow_batching = DEFAULT; +SELECT @@global.slave_allow_batching; + +--echo '#---------------------FN_DYNVARS_145_02-------------------------#' +############################################################################# +# Check if slave_allow_batching can be accessed with and without @@ sign # +############################################################################# + +--Error ER_GLOBAL_VARIABLE +SET slave_allow_batching = 1; +SELECT @@slave_allow_batching; +--Error ER_UNKNOWN_TABLE +SELECT global.slave_allow_batching; + +SET global slave_allow_batching = 1; +SELECT @@global.slave_allow_batching; + + +--echo '#--------------------FN_DYNVARS_145_03------------------------#' +######################################################################## +# Change the value of slave_allow_batching to a valid value # +######################################################################## + +SET @@global.slave_allow_batching = 0; +SELECT @@global.slave_allow_batching; +SET @@global.slave_allow_batching = 1; +SELECT @@global.slave_allow_batching; + + +--echo '#--------------------FN_DYNVARS_145_04-------------------------#' +########################################################################### +# Change the value of slave_allow_batching to invalid value # +########################################################################### + +--Error ER_WRONG_VALUE_FOR_VAR +SET @@global.slave_allow_batching = -1; +--Error ER_WRONG_VALUE_FOR_VAR +SET @@global.slave_allow_batching = 2; +--Error ER_WRONG_VALUE_FOR_VAR +SET @@global.slave_allow_batching = "T"; +--Error ER_WRONG_VALUE_FOR_VAR +SET @@global.slave_allow_batching = "Y"; +--Error ER_WRONG_VALUE_FOR_VAR +SET @@global.slave_allow_batching = YES; +--Error ER_WRONG_VALUE_FOR_VAR +SET @@global.slave_allow_batching = ONN; +--Error ER_WRONG_VALUE_FOR_VAR +SET @@global.slave_allow_batching = OOF; +--Error ER_WRONG_VALUE_FOR_VAR +SET @@global.slave_allow_batching = 0FF; +--Error ER_WRONG_VALUE_FOR_VAR +SET @@global.slave_allow_batching = ' 1'; +--Error ER_WRONG_VALUE_FOR_VAR +SET @@global.slave_allow_batching = NO; + + +--echo '#-------------------FN_DYNVARS_145_05----------------------------#' +########################################################################### +# Test if accessing session slave_allow_batching gives error # +########################################################################### + +--Error ER_GLOBAL_VARIABLE +SET @@session.slave_allow_batching = 0; +--Error ER_GLOBAL_VARIABLE +SET @@slave_allow_batching = 0; +--Error ER_GLOBAL_VARIABLE +SET @@local.slave_allow_batching = 0; +--Error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.slave_allow_batching; +--Error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@local.slave_allow_batching; + +--echo '#----------------------FN_DYNVARS_145_06------------------------#' +######################################################################### +# Check if the value in SESSION Table contains variable value # +######################################################################### + +SELECT count(VARIABLE_VALUE) FROM INFORMATION_SCHEMA.SESSION_VARIABLES WHERE VARIABLE_NAME='slave_allow_batching'; + + +--echo '#----------------------FN_DYNVARS_145_07------------------------#' +######################################################################### +# Check if the value in GLOBAL Table matches value in variable # +######################################################################### + +SELECT @@global.slave_allow_batching = VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME='slave_allow_batching'; +SELECT @@global.slave_allow_batching; +SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME='slave_allow_batching'; + +--echo '#---------------------FN_DYNVARS_145_08-------------------------#' +################################################################### +# Check if ON and OFF values can be used on variable # +################################################################### + +SET @@global.slave_allow_batching = OFF; +SELECT @@global.slave_allow_batching; +SET @@global.slave_allow_batching = ON; +SELECT @@global.slave_allow_batching; + +--echo '#---------------------FN_DYNVARS_145_09----------------------#' +################################################################### +# Check if TRUE and FALSE values can be used on variable # +################################################################### + +SET @@global.slave_allow_batching = TRUE; +SELECT @@global.slave_allow_batching; +SET @@global.slave_allow_batching = FALSE; +SELECT @@global.slave_allow_batching; + +############################## +# Restore initial value # +############################## + +SET @@global.slave_allow_batching = @global_start_value; +SELECT @@global.slave_allow_batching; + +############################################################### +# END OF slave_allow_batching TESTS # +############################################################### +>>>>>>> MERGE-SOURCE === modified file 'mysql-test/t/sp-error.test' --- a/mysql-test/t/sp-error.test 2008-04-14 23:28:17 +0000 +++ b/mysql-test/t/sp-error.test 2008-08-07 13:36:47 +0000 @@ -2420,6 +2420,32 @@ set @@max_sp_recursion_depth = @old_recu drop procedure p1; # +# Bug#8759 (Stored Procedures: SQLSTATE '00000' should be illegal) +# + +--disable_warnings +drop procedure if exists proc_8759; +--enable_warnings + +delimiter $$; + +--error ER_SP_BAD_SQLSTATE +create procedure proc_8759() +begin + declare should_be_illegal condition for sqlstate '00000'; + declare continue handler for should_be_illegal set @x=0; +end$$ + +--error ER_SP_BAD_SQLSTATE +create procedure proc_8759() +begin + declare continue handler for sqlstate '00000' set @x=0; +end$$ + +delimiter ;$$ + + +# # BUG#NNNN: New bug synopsis # #--disable_warnings === modified file 'mysql-test/t/union.test' --- a/mysql-test/t/union.test 2008-05-13 15:15:40 +0000 +++ b/mysql-test/t/union.test 2008-08-07 13:36:47 +0000 @@ -91,6 +91,65 @@ SELECT @a:=1 UNION SELECT @a:=@a+1; (SELECT 1) UNION (SELECT 2) ORDER BY (SELECT a); (SELECT 1,3) UNION (SELECT 2,1) ORDER BY (SELECT 2); + +# +# Bug#32858: Erro: "Incorrect usage of UNION and INTO" does not take subselects +# into account +# +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (1); + +SELECT a INTO @v FROM ( + SELECT a FROM t1 + UNION + SELECT a FROM t1 +) alias; + +SELECT a INTO OUTFILE 'union.out.file' FROM ( + SELECT a FROM t1 + UNION + SELECT a FROM t1 WHERE 0 +) alias; + +SELECT a INTO DUMPFILE 'union.out.file2' FROM ( + SELECT a FROM t1 + UNION + SELECT a FROM t1 WHERE 0 +) alias; + +# +# INTO will not be allowed in subqueries in version 5.1 and above. +# +SELECT a FROM ( + SELECT a FROM t1 + UNION + SELECT a INTO @v FROM t1 +) alias; + +SELECT a FROM ( + SELECT a FROM t1 + UNION + SELECT a INTO OUTFILE 'union.out.file3' FROM t1 +) alias; + +SELECT a FROM ( + SELECT a FROM t1 + UNION + SELECT a INTO DUMPFILE 'union.out.file4' FROM t1 +) alias; + +SELECT a FROM t1 UNION SELECT a INTO @v FROM t1; +SELECT a FROM t1 UNION SELECT a INTO OUTFILE 'union.out.file5' FROM t1; +SELECT a FROM t1 UNION SELECT a INTO OUTFILE 'union.out.file6' FROM t1; +--error ER_WRONG_USAGE +SELECT a INTO @v FROM t1 UNION SELECT a FROM t1; +--error ER_WRONG_USAGE +SELECT a INTO OUTFILE 'union.out.file7' FROM t1 UNION SELECT a FROM t1; +--error ER_WRONG_USAGE +SELECT a INTO DUMPFILE 'union.out.file8' FROM t1 UNION SELECT a FROM t1; + +DROP TABLE t1; + # # Test bug reported by joc@stripped # === modified file 'mysys/Makefile.am' --- a/mysys/Makefile.am 2008-04-01 15:13:57 +0000 +++ b/mysys/Makefile.am 2008-08-07 13:36:47 +0000 @@ -18,10 +18,25 @@ MYSQLSHAREdir = $(pkgdatadir) MYSQLBASEdir= $(prefix) INCLUDES = @ZLIB_INCLUDES@ -I$(top_builddir)/include \ -I$(top_srcdir)/include -I$(srcdir) -pkglib_LIBRARIES = libmysys.a -LDADD = libmysys.a $(top_builddir)/strings/libmystrings.a $(top_builddir)/dbug/libdbug.a +LDADD = $(top_builddir)/strings/libmystringslt.la \ + $(top_builddir)/dbug/libdbuglt.la @ZLIB_LIBS@ + + +pkglib_LTLIBRARIES = libmysys.la +libmysys_la_LDFLAGS = -static +libmysys_la_SOURCES = +# This can't be listed here as $(top_builddir)/mysys/libmysyslt.la +# or it breaks make's dependency track for -j builds +libmysys_la_LIBADD = libmysyslt.la libmysyswrap.la +# Force C++ linking - dummy.cxx doesn't have to exist with EXTRA in the name +nodist_EXTRA_libmysys_la_SOURCES = dummy.cxx + +# We split out my_wrap because it's only used by mysqld and otherwise +# creates an unneccesary linking dependency on -lwrap +noinst_LTLIBRARIES = libmysyslt.la libmysyswrap.la +libmysyswrap_la_SOURCES = my_libwrap.c noinst_HEADERS = mysys_priv.h my_static.h my_handler_errors.h -libmysys_a_SOURCES = my_init.c my_getwd.c mf_getdate.c my_mmap.c \ +libmysyslt_la_SOURCES = my_init.c my_getwd.c mf_getdate.c my_mmap.c \ mf_path.c mf_loadpath.c my_file.c \ my_open.c my_create.c my_dup.c my_seek.c my_read.c \ my_pread.c my_write.c my_getpagesize.c \ @@ -53,16 +68,13 @@ libmysys_a_SOURCES = my_init.c my_get my_gethostbyname.c rijndael.c my_aes.c sha1.c \ my_handler.c my_netware.c my_largepage.c \ my_memmem.c \ - my_windac.c my_access.c base64.c my_libwrap.c -EXTRA_DIST = thr_alarm.c thr_lock.c my_pthread.c my_thr_init.c \ + my_windac.c my_access.c base64.c \ + thr_alarm.c thr_lock.c my_pthread.c my_thr_init.c \ thr_mutex.c thr_rwlock.c \ - CMakeLists.txt mf_soundex.c \ + mf_soundex.c \ my_conio.c my_wincond.c my_winthread.c -libmysys_a_LIBADD = @THREAD_LOBJECTS@ -# test_dir_DEPENDENCIES= $(LIBRARIES) -# testhash_DEPENDENCIES= $(LIBRARIES) -# test_charset_DEPENDENCIES= $(LIBRARIES) -# charset2html_DEPENDENCIES= $(LIBRARIES) +EXTRA_DIST = CMakeLists.txt + DEFS = -DDEFAULT_BASEDIR=\"$(prefix)\" \ -DDATADIR="\"$(MYSQLDATAdir)\"" \ -DDEFAULT_CHARSET_HOME="\"$(MYSQLBASEdir)\"" \ @@ -72,60 +84,5 @@ DEFS = -DDEFAULT_BASEDIR=\"$(prefix)\" -DDEFAULT_SYSCONFDIR="\"$(sysconfdir)\"" \ @DEFS@ -libmysys_a_DEPENDENCIES= @THREAD_LOBJECTS@ - -# I hope this always does the right thing. Otherwise this is only test programs -FLAGS=$(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) @NOINST_LDFLAGS@ - -# -# The CP .. RM stuff is to avoid problems with some compilers (like alpha ccc) -# which automaticly removes the object files you use to compile a final program -# - -test_bitmap$(EXEEXT): my_bitmap.c $(LIBRARIES) - $(LINK) $(FLAGS) -DMAIN ./my_bitmap.c $(LDADD) $(LIBS) - -test_priority_queue$(EXEEXT): queues.c $(LIBRARIES) - $(LINK) $(FLAGS) -DMAIN ./queues.c $(LDADD) $(LIBS) - -test_thr_alarm$(EXEEXT): thr_alarm.c $(LIBRARIES) - $(CP) $(srcdir)/thr_alarm.c ./test_thr_alarm.c - $(LINK) $(FLAGS) -DMAIN ./test_thr_alarm.c $(LDADD) $(LIBS) - $(RM) -f ./test_thr_alarm.c - -test_thr_lock$(EXEEXT): thr_lock.c $(LIBRARIES) - $(CP) $(srcdir)/thr_lock.c test_thr_lock.c - $(LINK) $(FLAGS) -DMAIN ./test_thr_lock.c $(LDADD) $(LIBS) - $(RM) -f ./test_thr_lock.c - -test_vsnprintf$(EXEEXT): my_vsnprintf.c $(LIBRARIES) - $(CP) $(srcdir)/my_vsnprintf.c test_vsnprintf.c - $(LINK) $(FLAGS) -DMAIN ./test_vsnprintf.c $(LDADD) $(LIBS) - $(RM) -f test_vsnprintf.c - -test_io_cache$(EXEEXT): mf_iocache.c $(LIBRARIES) - $(CP) $(srcdir)/mf_iocache.c test_io_cache.c - $(LINK) $(FLAGS) -DMAIN ./test_io_cache.c $(LDADD) $(LIBS) - $(RM) -f test_io_cache.c - -test_dir$(EXEEXT): test_dir.c $(LIBRARIES) - $(LINK) $(FLAGS) -DMAIN $(srcdir)/test_dir.c $(LDADD) $(LIBS) - -test_charset$(EXEEXT): test_charset.c $(LIBRARIES) - $(LINK) $(FLAGS) -DMAIN $(srcdir)/test_charset.c $(LDADD) $(LIBS) - -testhash$(EXEEXT): testhash.c $(LIBRARIES) - $(LINK) $(FLAGS) -DMAIN $(srcdir)/testhash.c $(LDADD) $(LIBS) - -test_gethwaddr$(EXEEXT): my_gethwaddr.c $(LIBRARIES) - $(CP) $(srcdir)/my_gethwaddr.c ./test_gethwaddr.c - $(LINK) $(FLAGS) -DMAIN ./test_gethwaddr.c $(LDADD) $(LIBS) - $(RM) -f ./test_gethwaddr.c - -test_base64$(EXEEXT): base64.c $(LIBRARIES) - $(CP) $(srcdir)/base64.c ./test_base64.c - $(LINK) $(FLAGS) -DMAIN ./test_base64.c $(LDADD) $(LIBS) - $(RM) -f ./test_base64.c - # Don't update the files from bitkeeper %::SCCS/s.% === modified file 'mysys/my_bitmap.c' --- a/mysys/my_bitmap.c 2008-04-01 15:13:57 +0000 +++ b/mysys/my_bitmap.c 2008-08-07 13:36:47 +0000 @@ -763,7 +763,7 @@ uint get_rand_bit(uint bitsize) return (rand() % bitsize); } -bool test_set_get_clear_bit(MY_BITMAP *map, uint bitsize) +my_bool test_set_get_clear_bit(MY_BITMAP *map, uint bitsize) { uint i, test_bit; uint no_loops= bitsize > 128 ? 128 : bitsize; @@ -786,7 +786,7 @@ error2: return TRUE; } -bool test_flip_bit(MY_BITMAP *map, uint bitsize) +my_bool test_flip_bit(MY_BITMAP *map, uint bitsize) { uint i, test_bit; uint no_loops= bitsize > 128 ? 128 : bitsize; @@ -809,13 +809,13 @@ error2: return TRUE; } -bool test_operators(MY_BITMAP *map __attribute__((unused)), +my_bool test_operators(MY_BITMAP *map __attribute__((unused)), uint bitsize __attribute__((unused))) { return FALSE; } -bool test_get_all_bits(MY_BITMAP *map, uint bitsize) +my_bool test_get_all_bits(MY_BITMAP *map, uint bitsize) { uint i; bitmap_set_all(map); @@ -857,7 +857,7 @@ error6: return TRUE; } -bool test_compare_operators(MY_BITMAP *map, uint bitsize) +my_bool test_compare_operators(MY_BITMAP *map, uint bitsize) { uint i, j, test_bit1, test_bit2, test_bit3,test_bit4; uint no_loops= bitsize > 128 ? 128 : bitsize; @@ -963,7 +963,7 @@ error5: return TRUE; } -bool test_count_bits_set(MY_BITMAP *map, uint bitsize) +my_bool test_count_bits_set(MY_BITMAP *map, uint bitsize) { uint i, bit_count=0, test_bit; uint no_loops= bitsize > 128 ? 128 : bitsize; @@ -989,7 +989,7 @@ error2: return TRUE; } -bool test_get_first_bit(MY_BITMAP *map, uint bitsize) +my_bool test_get_first_bit(MY_BITMAP *map, uint bitsize) { uint i, test_bit; uint no_loops= bitsize > 128 ? 128 : bitsize; @@ -1014,7 +1014,7 @@ error2: return TRUE; } -bool test_get_next_bit(MY_BITMAP *map, uint bitsize) +my_bool test_get_next_bit(MY_BITMAP *map, uint bitsize) { uint i, j, test_bit; uint no_loops= bitsize > 128 ? 128 : bitsize; @@ -1033,7 +1033,7 @@ error1: return TRUE; } -bool test_prefix(MY_BITMAP *map, uint bitsize) +my_bool test_prefix(MY_BITMAP *map, uint bitsize) { uint i, j, test_bit; uint no_loops= bitsize > 128 ? 128 : bitsize; @@ -1068,7 +1068,7 @@ error3: } -bool do_test(uint bitsize) +my_bool do_test(uint bitsize) { MY_BITMAP map; my_bitmap_map buf[1024]; === modified file 'mysys/queues.c' --- a/mysys/queues.c 2008-02-19 21:53:33 +0000 +++ b/mysys/queues.c 2008-08-07 13:36:47 +0000 @@ -384,11 +384,11 @@ static uint tot_no_parts= 0; static uint tot_no_loops= 0; static uint expected_part= 0; static uint expected_num= 0; -static bool max_ind= 0; -static bool fix_used= 0; +static my_bool max_ind= 0; +static my_bool fix_used= 0; static ulonglong start_time= 0; -static bool is_divisible_by(uint num, uint divisor) +static my_bool is_divisible_by(uint num, uint divisor) { uint quotient= num / divisor; if (quotient * divisor == num) @@ -495,7 +495,7 @@ static int test_compare(void *null_arg, return 0; } -bool check_num(uint num_part) +my_bool check_num(uint num_part) { uint part= num_part >> 22; uint num= num_part & 0x3FFFFF; @@ -546,7 +546,7 @@ void perform_insert(QUEUE *queue) } } -bool perform_ins_del(QUEUE *queue, bool max_ind) +my_bool perform_ins_del(QUEUE *queue, my_bool max_ind) { uint i= 0, no_loops= tot_no_loops, j= tot_no_parts; do @@ -574,10 +574,10 @@ bool perform_ins_del(QUEUE *queue, bool return FALSE; } -bool do_test(uint no_parts, uint l_max_ind, bool l_fix_used) +my_bool do_test(uint no_parts, uint l_max_ind, my_bool l_fix_used) { QUEUE queue; - bool result; + my_bool result; max_ind= l_max_ind; fix_used= l_fix_used; init_queue(&queue, no_parts, 0, max_ind, test_compare, NULL); === added directory 'mysys/tests' === added file 'mysys/tests/Makefile.am' --- a/mysys/tests/Makefile.am 1970-01-01 00:00:00 +0000 +++ b/mysys/tests/Makefile.am 2008-04-25 23:09:48 +0000 @@ -0,0 +1,52 @@ +# Copyright (C) 2000-2006 MySQL AB +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +MYSQLDATAdir = $(localstatedir) +MYSQLSHAREdir = $(pkgdatadir) +MYSQLBASEdir= $(prefix) +INCLUDES = @ZLIB_INCLUDES@ -I$(top_builddir)/include \ + -I$(top_srcdir)/include -I$(srcdir) \ + -I$(top_srcdir)/mysys +LDADD = $(top_builddir)/mysys/libmysyslt.la $(top_builddir)/strings/libmystrings.la $(top_builddir)/dbug/libdbug.la + +DEFS = -DMAIN \ + -DDEFAULT_BASEDIR=\"$(prefix)\" \ + -DDATADIR="\"$(MYSQLDATAdir)\"" \ + -DDEFAULT_CHARSET_HOME="\"$(MYSQLBASEdir)\"" \ + -DSHAREDIR="\"$(MYSQLSHAREdir)\"" \ + -DDEFAULT_HOME_ENV=MYSQL_HOME \ + -DDEFAULT_GROUP_SUFFIX_ENV=MYSQL_GROUP_SUFFIX \ + -DDEFAULT_SYSCONFDIR="\"$(sysconfdir)\"" \ + @DEFS@ + +# I hope this always does the right thing. Otherwise this is only test programs +FLAGS=$(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) @NOINST_LDFLAGS@ + +noinst_PROGRAMS = test_bitmap test_priority_queue test_thr_alarm test_thr_lock test_vsnprintf test_io_cache testhash test_gethwaddr test_base64 #test_charset +test_bitmap_SOURCES = $(top_srcdir)/mysys/my_bitmap.c +test_thr_alarm_SOURCES = $(top_srcdir)/mysys/thr_alarm.c +test_priority_queue_SOURCES = $(top_srcdir)/mysys/queues.c +test_thr_lock_SOURCES = $(top_srcdir)/mysys/thr_lock.c +test_vsnprintf_SOURCES = $(top_srcdir)/strings/my_vsnprintf.c +test_io_cache_SOURCES = $(top_srcdir)/mysys/mf_iocache.c +#test_dir_SOURCES = test_dir.c +#test_charset_SOURCES = test_charset.c +testhash_SOURCES = testhash.c +test_gethwaddr_SOURCES = $(top_srcdir)/mysys/my_gethwaddr.c +test_base64_SOURCES = $(top_srcdir)/mysys/base64.c +test_base64_LDADD = $(top_builddir)/mysys/libmysyslt.la $(top_builddir)/strings/libmystrings.la + +# Don't update the files from bitkeeper +%::SCCS/s.% === renamed file 'mysys/test_charset.c' => 'mysys/tests/test_charset.c' === renamed file 'mysys/test_dir.c' => 'mysys/tests/test_dir.c' === renamed file 'mysys/testhash.c' => 'mysys/tests/testhash.c' === modified file 'netware/Makefile.am' --- a/netware/Makefile.am 2007-10-30 19:08:54 +0000 +++ b/netware/Makefile.am 2008-08-07 13:36:47 +0000 @@ -16,14 +16,16 @@ if HAVE_NETWARE INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I.. -LDADD = @CLIENT_EXTRA_LDFLAGS@ ../mysys/libmysys.a \ - ../dbug/libdbug.a ../strings/libmystrings.a +LDADD = @CLIENT_EXTRA_LDFLAGS@ \ + $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/dbug/libdbuglt.la \ + $(top_builddir)/strings/libmystringslt.la bin_PROGRAMS = mysqld_safe mysql_install_db mysql_test_run libmysql mysqld_safe_SOURCES= mysqld_safe.c my_manage.c mysql_install_db_SOURCES= mysql_install_db.c my_manage.c mysql_test_run_SOURCES= mysql_test_run.c my_manage.c libmysql_SOURCES= libmysqlmain.c -libmysql_LDADD = ../libmysql/.libs/libmysqlclient.a \ +libmysql_LDADD = $(top_builddir)/libmysql/.libs/libmysqlclient.a \ @openssl_libs@ @yassl_libs@ netware_build_files = client/mysql.def client/mysqladmin.def \ === modified file 'regex/Makefile.am' --- a/regex/Makefile.am 2006-12-31 00:32:21 +0000 +++ b/regex/Makefile.am 2008-04-25 06:32:23 +0000 @@ -17,7 +17,7 @@ INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include noinst_LIBRARIES = libregex.a -LDADD= libregex.a $(top_builddir)/strings/libmystrings.a +LDADD= libregex.a $(top_builddir)/strings/libmystrings.la noinst_HEADERS = cclass.h cname.h regex2.h utils.h engine.c my_regex.h libregex_a_SOURCES = regerror.c regcomp.c regexec.c regfree.c reginit.c noinst_PROGRAMS = re === modified file 'scripts/mysql_config.sh' --- a/scripts/mysql_config.sh 2008-03-27 22:47:31 +0000 +++ b/scripts/mysql_config.sh 2008-08-07 13:36:47 +0000 @@ -107,6 +107,7 @@ fi libs=" $ldflags -L$pkglibdir -lmysqlclient @ZLIB_DEPS@ @NON_THREADED_LIBS@" libs="$libs @openssl_libs@ @STATIC_NSS_FLAGS@ " libs_r=" $ldflags -L$pkglibdir -lmysqlclient_r @ZLIB_DEPS@ @LIBS@ @openssl_libs@ " +libdir="-L$pkglibdir" embedded_libs=" $ldflags -L$pkglibdir -lmysqld @ZLIB_DEPS@ @LIBS@ @WRAPLIBS@ @innodb_system_libs@ @openssl_libs@ " if [ -r "$pkglibdir/libmygcc.a" ]; then @@ -162,6 +163,7 @@ Options: --include [$include] --libs [$libs] --libs_r [$libs_r] + --libdir [$libdir] --plugindir [$plugindir] --socket [$socket] --port [$port] @@ -179,6 +181,7 @@ while test $# -gt 0; do --include) echo "$include" ;; --libs) echo "$libs" ;; --libs_r) echo "$libs_r" ;; + --libdir) echo "$libdir" ;; --plugindir) echo "$plugindir" ;; --socket) echo "$socket" ;; --port) echo "$port" ;; === modified file 'sql/Makefile.am' --- a/sql/Makefile.am 2008-05-09 07:47:28 +0000 +++ b/sql/Makefile.am 2008-08-07 13:36:47 +0000 @@ -42,10 +42,12 @@ noinst_LTLIBRARIES= libndb.la \ udf_example.la SUPPORTING_LIBS = $(top_builddir)/vio/libvio.a \ - $(top_builddir)/mysys/libmysys.a \ - $(top_builddir)/dbug/libdbug.a \ + $(top_builddir)/mysys/libmysyswrap.la \ + $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/dbug/libdbuglt.la \ $(top_builddir)/regex/libregex.a \ - $(top_builddir)/strings/libmystrings.a + $(top_builddir)/strings/libmystringsextra.la \ + $(top_builddir)/strings/libmystringslt.la mysqld_DEPENDENCIES= @mysql_plugin_libs@ $(SUPPORTING_LIBS) backup/libbackup.la libndb.la LDADD = $(SUPPORTING_LIBS) @ZLIB_LIBS@ @NDB_SCI_LIBS@ mysqld_LDADD = libndb.la \ === modified file 'sql/ha_ndbcluster.cc' --- a/sql/ha_ndbcluster.cc 2008-05-16 08:56:03 +0000 +++ b/sql/ha_ndbcluster.cc 2008-08-07 13:36:47 +0000 @@ -202,6 +202,7 @@ SHOW_VAR ndb_status_variables[]= { {"config_from_port", (char*) &g_ndb_status.connected_port, SHOW_LONG}, //{"number_of_replicas", (char*) &g_ndb_status.number_of_replicas, SHOW_LONG}, {"number_of_data_nodes",(char*) &g_ndb_status.number_of_data_nodes, SHOW_LONG}, + {"cluster_connection_pool",(char*) &opt_ndb_cluster_connection_pool, SHOW_LONG}, {NullS, NullS, SHOW_LONG} }; @@ -4624,21 +4625,26 @@ int ha_ndbcluster::external_lock(THD *th { DBUG_PRINT("info", ("lock_type == F_UNLCK")); - if (ndb_cache_check_time && m_rows_changed) + if (m_rows_changed) { - DBUG_PRINT("info", ("Rows has changed and util thread is running")); + DBUG_PRINT("info", ("Rows has changed")); + if (thd->options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) { - DBUG_PRINT("info", ("Add share to list of tables to be invalidated")); + DBUG_PRINT("info", ("Add share to list of changed tables")); /* NOTE push_back allocates memory using transactions mem_root! */ - thd_ndb->changed_tables.push_back(m_share, &thd->transaction.mem_root); + thd_ndb->changed_tables.push_back(m_share, + &thd->transaction.mem_root); } - pthread_mutex_lock(&m_share->mutex); - DBUG_PRINT("info", ("Invalidating commit_count")); - m_share->commit_count= 0; - m_share->commit_count_lock++; - pthread_mutex_unlock(&m_share->mutex); + if (ndb_cache_check_time) + { + pthread_mutex_lock(&m_share->mutex); + DBUG_PRINT("info", ("Invalidating commit_count")); + m_share->commit_count= 0; + m_share->commit_count_lock++; + pthread_mutex_unlock(&m_share->mutex); + } } if (!--thd_ndb->lock_count) @@ -6334,6 +6340,8 @@ retry_temporary_error1: int ha_ndbcluster::delete_table(const char *name) { THD *thd= current_thd; + Ndb *ndb; + int error= 0; DBUG_ENTER("ha_ndbcluster::delete_table"); DBUG_PRINT("enter", ("name: %s", name)); set_dbname(name); @@ -6348,17 +6356,35 @@ int ha_ndbcluster::delete_table(const ch { DBUG_PRINT("info", ("Schema distribution table not setup")); DBUG_ASSERT(ndb_schema_share); - DBUG_RETURN(HA_ERR_NO_CONNECTION); + error= HA_ERR_NO_CONNECTION; + goto err; } #endif if (check_ndb_connection(thd)) - DBUG_RETURN(HA_ERR_NO_CONNECTION); + { + error= HA_ERR_NO_CONNECTION; + goto err; + } - /* Call ancestor function to delete .ndb file */ - handler::delete_table(name); + ndb= get_ndb(thd); + /* + Drop table in ndb. + If it was already gone it might have been dropped + remotely, give a warning and then drop .ndb file. + */ + if (!(error= delete_table(thd, this, ndb, name, + m_dbname, m_tabname)) || + error == HA_ERR_NO_SUCH_TABLE) + { + /* Call ancestor function to delete .ndb file */ + int error1= handler::delete_table(name); + if (!error) + error= error1; + } - DBUG_RETURN(delete_table(thd, this, get_ndb(thd), name, m_dbname, m_tabname)); +err: + DBUG_RETURN(error); } @@ -8070,20 +8096,34 @@ ndbcluster_cache_retrieval_allowed(THD * ulonglong *engine_data) { Uint64 commit_count; - bool is_autocommit= !(thd->options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)); char *dbname= full_name; char *tabname= dbname+strlen(dbname)+1; #ifndef DBUG_OFF char buff[22], buff2[22]; #endif DBUG_ENTER("ndbcluster_cache_retrieval_allowed"); - DBUG_PRINT("enter", ("dbname: %s, tabname: %s, is_autocommit: %d", - dbname, tabname, is_autocommit)); + DBUG_PRINT("enter", ("dbname: %s, tabname: %s", + dbname, tabname)); - if (!is_autocommit) + if (thd->options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) { - DBUG_PRINT("exit", ("No, don't use cache in transaction")); - DBUG_RETURN(FALSE); + /* Don't allow qc to be used if table has been previously + modified in transaction */ + Thd_ndb *thd_ndb= get_thd_ndb(thd); + if (!thd_ndb->changed_tables.is_empty()) + { + NDB_SHARE* share; + List_iterator_fast it(thd_ndb->changed_tables); + while ((share= it++)) + { + if (strcmp(share->table_name, tabname) == 0 && + strcmp(share->db, dbname) == 0) + { + DBUG_PRINT("exit", ("No, transaction has changed table")); + DBUG_RETURN(FALSE); + } + } + } } if (ndb_get_commitcount(thd, dbname, tabname, &commit_count)) @@ -8145,15 +8185,29 @@ ha_ndbcluster::register_query_cache_tabl #ifndef DBUG_OFF char buff[22]; #endif - bool is_autocommit= !(thd->options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)); DBUG_ENTER("ha_ndbcluster::register_query_cache_table"); - DBUG_PRINT("enter",("dbname: %s, tabname: %s, is_autocommit: %d", - m_dbname, m_tabname, is_autocommit)); + DBUG_PRINT("enter",("dbname: %s, tabname: %s", + m_dbname, m_tabname)); - if (!is_autocommit) + if (thd->options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) { - DBUG_PRINT("exit", ("Can't register table during transaction")); - DBUG_RETURN(FALSE); + /* Don't allow qc to be used if table has been previously + modified in transaction */ + Thd_ndb *thd_ndb= get_thd_ndb(thd); + if (!thd_ndb->changed_tables.is_empty()) + { + DBUG_ASSERT(m_share); + NDB_SHARE* share; + List_iterator_fast it(thd_ndb->changed_tables); + while ((share= it++)) + { + if (m_share == share) + { + DBUG_PRINT("exit", ("No, transaction has changed table")); + DBUG_RETURN(FALSE); + } + } + } } if (ndb_get_commitcount(thd, m_dbname, m_tabname, &commit_count)) === modified file 'sql/ha_ndbcluster_binlog.cc' --- a/sql/ha_ndbcluster_binlog.cc 2008-05-16 08:56:03 +0000 +++ b/sql/ha_ndbcluster_binlog.cc 2008-08-07 13:36:47 +0000 @@ -786,7 +786,22 @@ static int ndbcluster_create_ndb_apply_s { build_table_filename(buf, sizeof(buf), NDB_REP_DB, NDB_APPLY_TABLE, reg_ext, 0); - my_delete(buf, MYF(0)); + if (my_delete(buf, MYF(0)) == 0) + { + /* + The .frm file existed and was deleted from disk. + It's possible that someone has tried to use it and thus + it might have been inserted in the table definition cache. + It must be flushed to avoid that it exist only in the + table definition cache. + */ + if (ndb_extra_logging) + sql_print_information("NDB: Flushing " NDB_REP_DB "." NDB_APPLY_TABLE); + + end= strmov(buf, "FLUSH TABLE " NDB_REP_DB "." NDB_APPLY_TABLE); + const int no_print_error[1]= {0}; + run_query(thd, buf, end, no_print_error, TRUE); + } } /* @@ -801,9 +816,10 @@ static int ndbcluster_create_ndb_apply_s " end_pos BIGINT UNSIGNED NOT NULL, " " PRIMARY KEY USING HASH (server_id) ) ENGINE=NDB CHARACTER SET latin1"); - const int no_print_error[5]= {ER_TABLE_EXISTS_ERROR, + const int no_print_error[6]= {ER_TABLE_EXISTS_ERROR, 701, 702, + 721, // Table already exist 4009, 0}; // do not print error 701 etc run_query(thd, buf, end, no_print_error, TRUE); @@ -843,7 +859,22 @@ static int ndbcluster_create_schema_tabl { build_table_filename(buf, sizeof(buf), NDB_REP_DB, NDB_SCHEMA_TABLE, reg_ext, 0); - my_delete(buf, MYF(0)); + if (my_delete(buf, MYF(0)) == 0) + { + /* + The .frm file existed and was deleted from disk. + It's possible that someone has tried to use it and thus + it might have been inserted in the table definition cache. + It must be flushed to avoid that it exist only in the + table definition cache. + */ + if (ndb_extra_logging) + sql_print_information("NDB: Flushing " NDB_REP_DB "." NDB_SCHEMA_TABLE); + + end= strmov(buf, "FLUSH TABLE " NDB_REP_DB "." NDB_SCHEMA_TABLE); + const int no_print_error[1]= {0}; + run_query(thd, buf, end, no_print_error, TRUE); + } } /* @@ -862,9 +893,10 @@ static int ndbcluster_create_schema_tabl " type INT UNSIGNED NOT NULL," " PRIMARY KEY USING HASH (db,name) ) ENGINE=NDB CHARACTER SET latin1"); - const int no_print_error[5]= {ER_TABLE_EXISTS_ERROR, + const int no_print_error[6]= {ER_TABLE_EXISTS_ERROR, 701, 702, + 721, // Table already exist 4009, 0}; // do not print error 701 etc run_query(thd, buf, end, no_print_error, TRUE); === modified file 'sql/ha_ndbcluster_connection.cc' --- a/sql/ha_ndbcluster_connection.cc 2008-02-22 12:29:11 +0000 +++ b/sql/ha_ndbcluster_connection.cc 2008-04-09 13:52:09 +0000 @@ -28,7 +28,6 @@ extern my_bool opt_ndb_optimized_node_selection; extern const char *opt_ndbcluster_connectstring; extern ulong opt_ndb_wait_connected; -extern ulong opt_ndb_cluster_connection_pool; Ndb* g_ndb= NULL; Ndb_cluster_connection* g_ndb_cluster_connection= NULL; === modified file 'sql/ha_ndbcluster_connection.h' --- a/sql/ha_ndbcluster_connection.h 2007-11-20 14:22:05 +0000 +++ b/sql/ha_ndbcluster_connection.h 2008-04-09 13:52:09 +0000 @@ -20,3 +20,6 @@ Ndb_cluster_connection *ndb_get_cluster_ ulonglong ndb_get_latest_trans_gci(); void ndb_set_latest_trans_gci(ulonglong val); int ndb_has_node_id(uint id); + +/* options from from mysqld.cc */ +extern ulong opt_ndb_cluster_connection_pool; === modified file 'sql/mysqld.cc' --- a/sql/mysqld.cc 2008-06-19 09:43:26 +0000 +++ b/sql/mysqld.cc 2008-08-07 13:36:47 +0000 @@ -6068,7 +6068,7 @@ thread is in the master's binlogs.", "Turn on more logging in the error log.", (uchar**) &ndb_extra_logging, (uchar**) &ndb_extra_logging, - 0, GET_INT, OPT_ARG, 0, 0, 0, 0, 0, 0}, + 0, GET_ULONG, OPT_ARG, 0, 0, 0, 0, 0, 0}, #ifdef HAVE_NDB_BINLOG {"ndb-report-thresh-binlog-epoch-slip", OPT_NDB_REPORT_THRESH_BINLOG_EPOCH_SLIP, "Threshold on number of epochs to be behind before reporting binlog status. " === modified file 'sql/sql_class.h' --- a/sql/sql_class.h 2008-06-19 09:43:26 +0000 +++ b/sql/sql_class.h 2008-08-07 13:36:47 +0000 @@ -2362,6 +2362,7 @@ class select_result :public Sql_alloc { protected: THD *thd; SELECT_LEX_UNIT *unit; + uint nest_level; public: select_result(); virtual ~select_result() {}; @@ -2398,6 +2399,12 @@ public: */ virtual void cleanup(); void set_thd(THD *thd_arg) { thd= thd_arg; } + /** + The nest level, if supported. + @return + -1 if nest level is undefined, otherwise a positive integer. + */ + int get_nest_level() { return nest_level; } #ifdef EMBEDDED_LIBRARY virtual void begin_dataset() {} #else @@ -2491,6 +2498,14 @@ class select_export :public select_to_fi bool fixed_row_size; public: select_export(sql_exchange *ex) :select_to_file(ex) {} + /** + Creates a select_export to represent INTO OUTFILE with a + defined level of subquery nesting. + */ + select_export(sql_exchange *ex, uint nest_level_arg) :select_to_file(ex) + { + nest_level= nest_level_arg; + } ~select_export(); int prepare(List &list, SELECT_LEX_UNIT *u); bool send_data(List &items); @@ -2500,6 +2515,15 @@ public: class select_dump :public select_to_file { public: select_dump(sql_exchange *ex) :select_to_file(ex) {} + /** + Creates a select_export to represent INTO DUMPFILE with a + defined level of subquery nesting. + */ + select_dump(sql_exchange *ex, uint nest_level_arg) : + select_to_file(ex) + { + nest_level= nest_level_arg; + } int prepare(List &list, SELECT_LEX_UNIT *u); bool send_data(List &items); }; @@ -2939,6 +2963,16 @@ class select_dumpvar :public select_resu public: List var_list; select_dumpvar() { var_list.empty(); row_count= 0;} + /** + Creates a select_dumpvar to represent INTO with a defined + level of subquery nesting. + */ + select_dumpvar(uint nest_level_arg) + { + var_list.empty(); + row_count= 0; + nest_level= nest_level_arg; + } ~select_dumpvar() {} int prepare(List &list, SELECT_LEX_UNIT *u); bool send_data(List &items); === modified file 'sql/stacktrace.c' --- a/sql/stacktrace.c 2008-04-09 01:07:00 +0000 +++ b/sql/stacktrace.c 2008-08-07 13:36:47 +0000 @@ -13,6 +13,9 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +/* Workaround for Bug#32082: VOID redefinition on Win results in compile errors*/ +#define DONT_DEFINE_VOID 1 + #include #include "stacktrace.h" === modified file 'sql/table.cc' --- a/sql/table.cc 2008-05-16 08:56:03 +0000 +++ b/sql/table.cc 2008-08-07 13:36:47 +0000 @@ -693,7 +693,8 @@ static int open_binary_frm(THD *thd, TAB const char **interval_array; enum legacy_db_type legacy_db_type; my_bitmap_map *bitmaps; - uchar *buff= 0; + uchar *buffbuff= 0; // rename to cause compile error if automerged stuff + // as scope of variable has changed uchar *field_extra_info= 0; DBUG_ENTER("open_binary_frm"); @@ -889,14 +890,14 @@ static int open_binary_frm(THD *thd, TAB /* Read extra data segment */ uchar *next_chunk, *buff_end; DBUG_PRINT("info", ("extra segment size is %u bytes", n_length)); - if (!(next_chunk= buff= (uchar*) my_malloc(n_length, MYF(MY_WME)))) + if (!(next_chunk= buffbuff= (uchar*) my_malloc(n_length, MYF(MY_WME)))) goto err; - if (my_pread(file, buff, n_length, record_offset + share->reclength, + if (my_pread(file, buffbuff, n_length, record_offset + share->reclength, MYF(MY_NABP))) { goto err; } - share->connect_string.length= uint2korr(buff); + share->connect_string.length= uint2korr(buffbuff); if (!(share->connect_string.str= strmake_root(&share->mem_root, (char*) next_chunk + 2, share->connect_string. @@ -905,7 +906,7 @@ static int open_binary_frm(THD *thd, TAB goto err; } next_chunk+= share->connect_string.length + 2; - buff_end= buff + n_length; + buff_end= buffbuff + n_length; if (next_chunk + 2 < buff_end) { uint str_db_type_length= uint2korr(next_chunk); @@ -922,7 +923,6 @@ static int open_binary_frm(THD *thd, TAB plugin_data(tmp_plugin, handlerton *))) { /* bad file, legacy_db_type did not match the name */ - my_free(buff, MYF(0)); goto err; } /* @@ -958,7 +958,6 @@ static int open_binary_frm(THD *thd, TAB /* purecov: begin inspected */ error= 8; my_error(ER_UNKNOWN_STORAGE_ENGINE, MYF(0), name.str); - my_free(buff, MYF(0)); goto err; /* purecov: end */ } @@ -1040,20 +1039,18 @@ static int open_binary_frm(THD *thd, TAB { DBUG_PRINT("error", ("long table comment is not defined in .frm")); - my_free(buff, MYF(0)); goto err; } share->comment.length = uint2korr(next_chunk); if (! (share->comment.str= strmake_root(&share->mem_root, (char*)next_chunk + 2, share->comment.length))) { - my_free(buff, MYF(0)); goto err; } next_chunk+= 2 + share->comment.length; } DBUG_ASSERT (next_chunk <= buff_end); - if (share->mysql_version >= MYSQL_VERSION_TABLESPACE_IN_FRM_CGE) + if (share->mysql_version >= MYSQL_VERSION_TABLESPACE_IN_FRM) { /* New frm format in mysql_version 5.2.5 (originally in @@ -1095,12 +1092,6 @@ static int open_binary_frm(THD *thd, TAB next_chunk+= format_section_len; } } - DBUG_ASSERT (next_chunk <= buff_end); - if (next_chunk > buff_end) - { - DBUG_PRINT("error", ("Buffer overflow in field extra info")); - goto err; - } } share->key_block_size= uint2korr(head+62); @@ -1680,13 +1671,13 @@ static int open_binary_frm(THD *thd, TAB if (use_hash) (void) hash_check(&share->name_hash); #endif - if (buff) - my_free(buff, MYF(0)); + if (buffbuff) + my_free(buffbuff, MYF(0)); DBUG_RETURN (0); err: - if (buff) - my_free(buff, MYF(0)); + if (buffbuff) + my_free(buffbuff, MYF(0)); share->error= error; share->open_errno= my_errno; share->errarg= errarg; === modified file 'storage/archive/Makefile.am' --- a/storage/archive/Makefile.am 2008-03-06 14:14:53 +0000 +++ b/storage/archive/Makefile.am 2008-08-07 13:36:47 +0000 @@ -56,36 +56,36 @@ libarchive_a_SOURCES = ha_archive.cc azi archive_performance_SOURCES = archive_performance.c azio.c archive_performance_CFLAGS = $(AM_CFLAGS) -archive_performance_LDADD = $(top_builddir)/mysys/libmysys.a \ - $(top_builddir)/dbug/libdbug.a \ - $(top_builddir)/strings/libmystrings.a \ +archive_performance_LDADD = $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/dbug/libdbuglt.la \ + $(top_builddir)/strings/libmystringslt.la \ $(LDADD) \ @ZLIB_LIBS@ archive_performance_LDFLAGS = @NOINST_LDFLAGS@ archive_test_SOURCES = archive_test.c azio.c -archive_test_CFLAGS = $(AM_CFLAGS) -archive_test_LDADD = $(top_builddir)/mysys/libmysys.a \ - $(top_builddir)/dbug/libdbug.a \ - $(top_builddir)/strings/libmystrings.a \ +archive_test_CFLAGS = $(AM_CFLAGS) +archive_test_LDADD = $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/dbug/libdbuglt.la \ + $(top_builddir)/strings/libmystringslt.la \ $(LDADD) \ @ZLIB_LIBS@ archive_test_LDFLAGS = @NOINST_LDFLAGS@ archive_reader_SOURCES = archive_reader.c azio.c -archive_reader_CFLAGS = $(AM_CFLAGS) -archive_reader_LDADD = $(top_builddir)/mysys/libmysys.a \ - $(top_builddir)/dbug/libdbug.a \ - $(top_builddir)/strings/libmystrings.a \ +archive_reader_CFLAGS = $(AM_CFLAGS) +archive_reader_LDADD = $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/dbug/libdbuglt.la \ + $(top_builddir)/strings/libmystringslt.la \ $(LDADD) \ @ZLIB_LIBS@ archive_reader_LDFLAGS = @NOINST_LDFLAGS@ concurrency_test_SOURCES = concurrency_test.c azio.c concurrency_test_CFLAGS = $(AM_CFLAGS) -concurrency_test_LDADD = $(top_builddir)/mysys/libmysys.a \ - $(top_builddir)/dbug/libdbug.a \ - $(top_builddir)/strings/libmystrings.a \ +concurrency_test_LDADD = $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/dbug/libdbuglt.la \ + $(top_builddir)/strings/libmystringslt.la \ $(LIBMYSQLCLIENT_LA) \ $(LDADD) \ @ZLIB_LIBS@ === modified file 'storage/heap/Makefile.am' --- a/storage/heap/Makefile.am 2006-12-31 00:32:21 +0000 +++ b/storage/heap/Makefile.am 2008-04-25 06:32:23 +0000 @@ -31,14 +31,14 @@ noinst_PROGRAMS = hp_test1 hp_test2 noinst_LIBRARIES = libheap.a hp_test1_LDFLAGS = @NOINST_LDFLAGS@ hp_test1_LDADD = libheap.a \ - $(top_builddir)/mysys/libmysys.a \ - $(top_builddir)/dbug/libdbug.a \ - $(top_builddir)/strings/libmystrings.a + $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/dbug/libdbuglt.la \ + $(top_builddir)/strings/libmystringslt.la hp_test2_LDFLAGS = @NOINST_LDFLAGS@ hp_test2_LDADD = libheap.a \ - $(top_builddir)/mysys/libmysys.a \ - $(top_builddir)/dbug/libdbug.a \ - $(top_builddir)/strings/libmystrings.a + $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/dbug/libdbuglt.la \ + $(top_builddir)/strings/libmystringslt.la noinst_HEADERS = heapdef.h ha_heap.h libheap_a_SOURCES = hp_open.c hp_extra.c hp_close.c hp_panic.c hp_info.c \ hp_rrnd.c hp_scan.c hp_update.c hp_write.c hp_delete.c \ === modified file 'storage/myisam/Makefile.am' --- a/storage/myisam/Makefile.am 2007-10-12 16:04:59 +0000 +++ b/storage/myisam/Makefile.am 2008-08-07 13:36:47 +0000 @@ -34,55 +34,55 @@ pkglib_LIBRARIES = libmyisam.a bin_PROGRAMS = myisamchk myisamlog myisampack myisam_ftdump myisamchk_DEPENDENCIES= $(LIBRARIES) myisamchk_LDADD= @CLIENT_EXTRA_LDFLAGS@ libmyisam.a \ - $(top_builddir)/mysys/libmysys.a \ - $(top_builddir)/dbug/libdbug.a \ - $(top_builddir)/strings/libmystrings.a @ZLIB_LIBS@ + $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/dbug/libdbuglt.la \ + $(top_builddir)/strings/libmystringslt.la @ZLIB_LIBS@ myisamlog_DEPENDENCIES= $(LIBRARIES) myisamlog_LDADD= @CLIENT_EXTRA_LDFLAGS@ libmyisam.a \ - $(top_builddir)/mysys/libmysys.a \ - $(top_builddir)/dbug/libdbug.a \ - $(top_builddir)/strings/libmystrings.a @ZLIB_LIBS@ + $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/dbug/libdbuglt.la \ + $(top_builddir)/strings/libmystringslt.la @ZLIB_LIBS@ myisampack_DEPENDENCIES=$(LIBRARIES) myisampack_LDADD= @CLIENT_EXTRA_LDFLAGS@ libmyisam.a \ - $(top_builddir)/mysys/libmysys.a \ - $(top_builddir)/dbug/libdbug.a \ - $(top_builddir)/strings/libmystrings.a @ZLIB_LIBS@ + $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/dbug/libdbuglt.la \ + $(top_builddir)/strings/libmystringslt.la @ZLIB_LIBS@ noinst_PROGRAMS = mi_test1 mi_test2 mi_test3 rt_test sp_test #ft_test1 ft_eval noinst_HEADERS = myisamdef.h rt_index.h rt_key.h rt_mbr.h sp_defs.h \ fulltext.h ftdefs.h ft_test1.h ft_eval.h \ ha_myisam.h mi_extrafunc.h mi_test1_DEPENDENCIES= $(LIBRARIES) mi_test1_LDADD= @CLIENT_EXTRA_LDFLAGS@ libmyisam.a \ - $(top_builddir)/mysys/libmysys.a \ - $(top_builddir)/dbug/libdbug.a \ - $(top_builddir)/strings/libmystrings.a @ZLIB_LIBS@ + $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/dbug/libdbuglt.la \ + $(top_builddir)/strings/libmystringslt.la @ZLIB_LIBS@ mi_test2_DEPENDENCIES= $(LIBRARIES) mi_test2_LDADD= @CLIENT_EXTRA_LDFLAGS@ libmyisam.a \ - $(top_builddir)/mysys/libmysys.a \ - $(top_builddir)/dbug/libdbug.a \ - $(top_builddir)/strings/libmystrings.a @ZLIB_LIBS@ + $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/dbug/libdbuglt.la \ + $(top_builddir)/strings/libmystringslt.la @ZLIB_LIBS@ mi_test3_DEPENDENCIES= $(LIBRARIES) mi_test3_LDADD= @CLIENT_EXTRA_LDFLAGS@ libmyisam.a \ - $(top_builddir)/mysys/libmysys.a \ - $(top_builddir)/dbug/libdbug.a \ - $(top_builddir)/strings/libmystrings.a @ZLIB_LIBS@ + $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/dbug/libdbuglt.la \ + $(top_builddir)/strings/libmystringslt.la @ZLIB_LIBS@ #ft_test1_DEPENDENCIES= $(LIBRARIES) #ft_eval_DEPENDENCIES= $(LIBRARIES) myisam_ftdump_DEPENDENCIES= $(LIBRARIES) myisam_ftdump_LDADD = @CLIENT_EXTRA_LDFLAGS@ libmyisam.a \ - $(top_builddir)/mysys/libmysys.a \ - $(top_builddir)/dbug/libdbug.a \ - $(top_builddir)/strings/libmystrings.a @ZLIB_LIBS@ + $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/dbug/libdbuglt.la \ + $(top_builddir)/strings/libmystringslt.la @ZLIB_LIBS@ rt_test_DEPENDENCIES= $(LIBRARIES) rt_test_LDADD = @CLIENT_EXTRA_LDFLAGS@ libmyisam.a \ - $(top_builddir)/mysys/libmysys.a \ - $(top_builddir)/dbug/libdbug.a \ - $(top_builddir)/strings/libmystrings.a @ZLIB_LIBS@ + $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/dbug/libdbuglt.la \ + $(top_builddir)/strings/libmystringslt.la @ZLIB_LIBS@ sp_test_DEPENDENCIES= $(LIBRARIES) sp_test_LDADD = @CLIENT_EXTRA_LDFLAGS@ libmyisam.a \ - $(top_builddir)/mysys/libmysys.a \ - $(top_builddir)/dbug/libdbug.a \ - $(top_builddir)/strings/libmystrings.a @ZLIB_LIBS@ + $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/dbug/libdbuglt.la \ + $(top_builddir)/strings/libmystringslt.la @ZLIB_LIBS@ libmyisam_a_SOURCES = mi_open.c mi_extra.c mi_info.c mi_rkey.c \ mi_rnext.c mi_rnext_same.c \ mi_search.c mi_page.c mi_key.c mi_locking.c \ === modified file 'storage/ndb/config/type_ndbapitest.mk.am' --- a/storage/ndb/config/type_ndbapitest.mk.am 2006-12-31 00:32:21 +0000 +++ b/storage/ndb/config/type_ndbapitest.mk.am 2008-04-25 06:32:23 +0000 @@ -15,9 +15,9 @@ LDADD += $(top_builddir)/storage/ndb/test/src/libNDBT.a \ $(top_builddir)/storage/ndb/src/libndbclient.la \ - $(top_builddir)/dbug/libdbug.a \ - $(top_builddir)/mysys/libmysys.a \ - $(top_builddir)/strings/libmystrings.a @NDB_SCI_LIBS@ + $(top_builddir)/dbug/libdbuglt.la \ + $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/strings/libmystringslt.la @NDB_SCI_LIBS@ INCLUDES += -I$(top_srcdir) \ -I$(top_builddir)/include \ === modified file 'storage/ndb/config/type_ndbapitools.mk.am' --- a/storage/ndb/config/type_ndbapitools.mk.am 2007-06-11 15:51:40 +0000 +++ b/storage/ndb/config/type_ndbapitools.mk.am 2008-04-25 06:32:23 +0000 @@ -15,9 +15,9 @@ LDADD += \ $(top_builddir)/storage/ndb/src/libndbclient.la \ - $(top_builddir)/dbug/libdbug.a \ - $(top_builddir)/mysys/libmysys.a \ - $(top_builddir)/strings/libmystrings.a @NDB_SCI_LIBS@ @ZLIB_LIBS@ + $(top_builddir)/dbug/libdbuglt.la \ + $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/strings/libmystringslt.la @NDB_SCI_LIBS@ @ZLIB_LIBS@ INCLUDES += -I$(srcdir) \ -I$(top_builddir)/include \ === modified file 'storage/ndb/include/kernel/signaldata/DumpStateOrd.hpp' --- a/storage/ndb/include/kernel/signaldata/DumpStateOrd.hpp 2007-05-21 09:03:20 +0000 +++ b/storage/ndb/include/kernel/signaldata/DumpStateOrd.hpp 2008-05-29 15:58:58 +0000 @@ -156,7 +156,10 @@ public: DumpTsman = 9800, DumpLgman = 10000, - DumpPgman = 11000 + DumpPgman = 11000, + + SchemaResourceSnapshot = 4000, // Save resource consumption + SchemaResourceCheckLeak = 4001 // check same as snapshot }; public: === modified file 'storage/ndb/include/kernel/signaldata/KeyInfo.hpp' --- a/storage/ndb/include/kernel/signaldata/KeyInfo.hpp 2008-02-19 15:00:29 +0000 +++ b/storage/ndb/include/kernel/signaldata/KeyInfo.hpp 2008-06-03 10:00:31 +0000 @@ -37,6 +37,16 @@ public: STATIC_CONST( HeaderLength = 3 ); STATIC_CONST( DataLength = 20 ); STATIC_CONST( MaxSignalLength = HeaderLength + DataLength ); + + /* IndexBound constants */ + STATIC_CONST( PerBoundColumnOverhead = 2 ); + /* Max number of key columns with max total key size */ + STATIC_CONST( MaxWordsPerBoundRow = \ + (PerBoundColumnOverhead * MAX_ATTRIBUTES_IN_INDEX) \ + + MAX_KEY_SIZE_IN_WORDS ); + /* Single key column with max total key size */ + STATIC_CONST( MaxWordsPerBoundColumn = \ + PerBoundColumnOverhead + MAX_KEY_SIZE_IN_WORDS ); private: Uint32 connectPtr; === modified file 'storage/ndb/include/kernel/signaldata/ListTables.hpp' --- a/storage/ndb/include/kernel/signaldata/ListTables.hpp 2006-12-23 19:20:40 +0000 +++ b/storage/ndb/include/kernel/signaldata/ListTables.hpp 2008-05-16 13:08:36 +0000 @@ -19,11 +19,63 @@ #include #include "SignalData.hpp" +class ListTablesData { +public: + Uint32 getTableId() { + return tableId; + } + void setTableId(Uint32 val) { + tableId = val; + } + Uint32 getTableType() { + return tableType; + } + void setTableType(Uint32 val) { + tableType = val; + } + Uint32 getTableStore() { + return BitmaskImpl::getField(1, &requestData, 20, 3); + } + void setTableStore(Uint32 val) { + BitmaskImpl::setField(1, &requestData, 20, 3, val); + } + Uint32 getTableTemp() { + return BitmaskImpl::getField(1, &requestData, 23, 1); + } + void setTableTemp(Uint32 val) { + BitmaskImpl::setField(1, &requestData, 23, 1, val); + } + Uint32 getTableState() { + return BitmaskImpl::getField(1, &requestData, 24, 4); + } + void setTableState(Uint32 val) { + BitmaskImpl::setField(1, &requestData, 24, 4, val); + } + Uint32 getListNames() { + return BitmaskImpl::getField(1, &requestData, 28, 1); + } + void setListNames(Uint32 val) { + BitmaskImpl::setField(1, &requestData, 28, 1, val); + } + Uint32 getListIndexes() { + return BitmaskImpl::getField(1, &requestData, 29, 1); + } + void setListIndexes(Uint32 val) { + BitmaskImpl::setField(1, &requestData, 29, 1, val); + } +public: + Uint32 requestData; + Uint32 tableId; + Uint32 tableType; +}; + /** + * DEPRICATED * It is convenient to pack request/response data per table in one * 32-bit word... + * */ -class ListTablesData { +class OldListTablesData { public: static Uint32 getTableId(Uint32 data) { return BitmaskImpl::getField(1, &data, 0, 12); @@ -83,36 +135,58 @@ class ListTablesReq { friend class Dbdict; public: - STATIC_CONST( SignalLength = 3 ); + STATIC_CONST( oldSignalLength = 3 ); + STATIC_CONST( SignalLength = 5 ); public: Uint32 senderData; Uint32 senderRef; Uint32 requestData; + Uint32 tableId; + Uint32 tableType; Uint32 getTableId() { - return ListTablesData::getTableId(requestData); + return tableId; } void setTableId(Uint32 val) { - ListTablesData::setTableId(requestData, val); + tableId = val; } Uint32 getTableType() const { - return ListTablesData::getTableType(requestData); + return tableType; } void setTableType(Uint32 val) { - ListTablesData::setTableType(requestData, val); + tableType = val; } Uint32 getListNames() const { - return ListTablesData::getListNames(requestData); + ListTablesData* ltd = (ListTablesData *) &requestData; + return ltd->getListNames(); } void setListNames(Uint32 val) { - ListTablesData::setListNames(requestData, val); + ListTablesData* ltd = (ListTablesData *) &requestData; + ltd->setListNames(val); } Uint32 getListIndexes() const { - return ListTablesData::getListIndexes(requestData); + ListTablesData* ltd = (ListTablesData *) &requestData; + return ltd->getListIndexes(); } void setListIndexes(Uint32 val) { - ListTablesData::setListIndexes(requestData, val); + ListTablesData* ltd = (ListTablesData *) &requestData; + ltd->setListIndexes(val); + } + + + /* For backwards compatility */ + Uint32 oldGetTableId() { + return OldListTablesData::getTableId(requestData); + } + void oldSetTableId(Uint32 val) { + OldListTablesData::setTableId(requestData, val); + } + Uint32 oldGetTableType() const { + return OldListTablesData::getTableType(requestData); + } + void oldSetTableType(Uint32 val) { + OldListTablesData::setTableType(requestData, val); } }; @@ -127,7 +201,29 @@ class ListTablesConf { */ friend class Backup; friend class Table; - friend class Suma; + +public: + STATIC_CONST( SignalLength = 2 ); + +public: + Uint32 senderData; + Uint32 noOfTables; + + SECTION( TABLE_DATA = 0 ); + SECTION( TABLE_NAMES = 1 ); +}; + +class OldListTablesConf { + /** + * Sender(s) + */ + friend class Dbdict; + + /** + * Reciver(s) + */ + friend class Backup; + friend class Table; public: /** @@ -143,34 +239,34 @@ public: Uint32 tableData[DataLength]; static Uint32 getTableId(Uint32 data) { - return ListTablesData::getTableId(data); + return OldListTablesData::getTableId(data); } void setTableId(unsigned pos, Uint32 val) { - ListTablesData::setTableId(tableData[pos], val); + OldListTablesData::setTableId(tableData[pos], val); } static Uint32 getTableType(Uint32 data) { - return ListTablesData::getTableType(data); + return OldListTablesData::getTableType(data); } void setTableType(unsigned pos, Uint32 val) { - ListTablesData::setTableType(tableData[pos], val); + OldListTablesData::setTableType(tableData[pos], val); } static Uint32 getTableStore(Uint32 data) { - return ListTablesData::getTableStore(data); + return OldListTablesData::getTableStore(data); } void setTableStore(unsigned pos, Uint32 val) { - ListTablesData::setTableStore(tableData[pos], val); + OldListTablesData::setTableStore(tableData[pos], val); } static Uint32 getTableState(Uint32 data) { - return ListTablesData::getTableState(data); + return OldListTablesData::getTableState(data); } void setTableState(unsigned pos, Uint32 val) { - ListTablesData::setTableState(tableData[pos], val); + OldListTablesData::setTableState(tableData[pos], val); } static Uint32 getTableTemp(Uint32 data) { - return ListTablesData::getTableTemp(data); + return OldListTablesData::getTableTemp(data); } void setTableTemp(unsigned pos, Uint32 val) { - ListTablesData::setTableTemp(tableData[pos], val); + OldListTablesData::setTableTemp(tableData[pos], val); } }; === modified file 'storage/ndb/include/mgmapi/mgmapi_config_parameters.h' --- a/storage/ndb/include/mgmapi/mgmapi_config_parameters.h 2008-02-20 15:15:31 +0000 +++ b/storage/ndb/include/mgmapi/mgmapi_config_parameters.h 2008-05-29 13:09:49 +0000 @@ -26,6 +26,7 @@ #define CFG_NODE_HOST 5 #define CFG_NODE_SYSTEM 6 #define CFG_NODE_DATADIR 7 +#define CFG_9 9 /* used in later version */ /** * DB config parameters @@ -129,12 +130,14 @@ #define CFG_DB_SUBSCRIBERS 180 #define CFG_DB_SUB_OPERATIONS 181 #define CFG_DB_MAX_BUFFERED_EPOCHS 182 /* subscriptions */ +#define CFG_DB_SUMA_HANDOVER_TIMEOUT 183 #define CFG_DB_SGA 198 /* super pool mem */ #define CFG_DB_DATA_MEM_2 199 /* used in special build in 5.1 */ #define CFG_NODE_ARBIT_RANK 200 #define CFG_NODE_ARBIT_DELAY 201 +#define CFG_202 202 /* used in later version */ #define CFG_MIN_LOGLEVEL 250 #define CFG_LOGLEVEL_STARTUP 250 @@ -164,6 +167,7 @@ #define CFG_CONNECTION_HOSTNAME_2 408 #define CFG_CONNECTION_GROUP 409 #define CFG_CONNECTION_NODE_ID_SERVER 410 +#define CFG_411 411 /* used in later version */ #define CFG_TCP_SERVER 452 #define CFG_TCP_SEND_BUFFER_SIZE 454 === modified file 'storage/ndb/include/ndb_version.h.in' --- a/storage/ndb/include/ndb_version.h.in 2008-03-14 11:35:36 +0000 +++ b/storage/ndb/include/ndb_version.h.in 2008-08-07 13:36:47 +0000 @@ -183,4 +183,27 @@ ndbd_suma_dictlock(Uint32 x) return x >= NDBD_SUMA_DICT_LOCK_63; } +#define NDBD_LONG_LIST_TABLES_CONF_62 NDB_MAKE_VERSION(6,2,16) +#define NDBD_LONG_LIST_TABLES_CONF_63 NDB_MAKE_VERSION(6,3,15) + +static +inline +int +ndbd_LIST_TABLES_CONF_long_signal(Uint32 x) +{ + if (x >= NDB_VERSION_D) + return 1; + + const Uint32 major = (x >> 16) & 0xFF; + const Uint32 minor = (x >> 8) & 0xFF; + + if (major >= 6) + { + if (minor == 2) + return x >= NDBD_LONG_LIST_TABLES_CONF_62; + } + + return x >= NDBD_LONG_LIST_TABLES_CONF_63; +} + #endif === modified file 'storage/ndb/include/ndbapi/NdbOperation.hpp' --- a/storage/ndb/include/ndbapi/NdbOperation.hpp 2008-02-19 15:00:29 +0000 +++ b/storage/ndb/include/ndbapi/NdbOperation.hpp 2008-04-28 14:17:28 +0000 @@ -1254,6 +1254,7 @@ protected: virtual void setErrorCode(int aErrorCode) const; virtual void setErrorCodeAbort(int aErrorCode) const; + bool isNdbRecordOperation(); int incCheck(const NdbColumnImpl* anAttrObject); int initial_interpreterCheck(); int intermediate_interpreterCheck(); === modified file 'storage/ndb/include/ndbapi/NdbReceiver.hpp' --- a/storage/ndb/include/ndbapi/NdbReceiver.hpp 2008-02-19 15:00:29 +0000 +++ b/storage/ndb/include/ndbapi/NdbReceiver.hpp 2008-04-25 09:17:19 +0000 @@ -31,6 +31,7 @@ class NdbReceiver friend class NdbIndexOperation; friend class NdbIndexScanOperation; friend class NdbTransaction; + public: enum ReceiverType { NDB_UNINITIALIZED, NDB_OPERATION = 1, @@ -62,6 +63,7 @@ public: inline NdbReceiver* next() { return m_next; } void setErrorCode(int); + private: Uint32 theMagicNumber; Ndb* m_ndb; === modified file 'storage/ndb/include/util/SimpleProperties.hpp' --- a/storage/ndb/include/util/SimpleProperties.hpp 2007-01-28 23:47:35 +0000 +++ b/storage/ndb/include/util/SimpleProperties.hpp 2008-05-16 13:08:36 +0000 @@ -277,11 +277,12 @@ Uint32 SimplePropertiesSectionReader::ge class SimplePropertiesSectionWriter : public SimpleProperties::Writer { public: SimplePropertiesSectionWriter(class SectionSegmentPool &); - virtual ~SimplePropertiesSectionWriter() {} + virtual ~SimplePropertiesSectionWriter(); virtual bool reset(); virtual bool putWord(Uint32 val); virtual bool putWords(const Uint32 * src, Uint32 len); + Uint32 getWordsUsed() const; /** * This "unlinks" the writer from the memory @@ -289,6 +290,8 @@ public: void getPtr(struct SegmentedSectionPtr & dst); private: + void release(); + Int32 m_pos; Uint32 m_sz; class SectionSegmentPool & m_pool; === modified file 'storage/ndb/src/Makefile.am' --- a/storage/ndb/src/Makefile.am 2007-01-20 00:58:03 +0000 +++ b/storage/ndb/src/Makefile.am 2008-04-25 06:32:23 +0000 @@ -25,6 +25,9 @@ libndbclient_la_LDFLAGS = -version-info libndbclient_la_LIBADD = \ ndbapi/libndbapi.la \ + $(top_builddir)/strings/libmystringslt.la \ + $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/dbug/libdbuglt.la \ common/transporter/libtransporter.la \ common/debugger/libtrace.la \ common/debugger/signaldata/libsignaldataprint.la \ @@ -32,7 +35,7 @@ libndbclient_la_LIBADD = \ common/mgmcommon/libmgmsrvcommon.la \ common/logger/liblogger.la \ common/portlib/libportlib.la \ - common/util/libgeneral.la + common/util/libgeneral.la @ZLIB_LIBS@ windoze-dsp: libndbclient.dsp === modified file 'storage/ndb/src/common/debugger/EventLogger.cpp' --- a/storage/ndb/src/common/debugger/EventLogger.cpp 2008-02-20 13:05:20 +0000 +++ b/storage/ndb/src/common/debugger/EventLogger.cpp 2008-04-22 19:36:05 +0000 @@ -1253,3 +1253,18 @@ EventLogger::setFilterLevel(int filterLe { m_filterLevel = filterLevel; } + + +EventLogger* +create_event_logger() +{ + return new EventLogger(); +} + +void +destroy_event_logger(class EventLogger ** g_eventLogger) +{ + delete *g_eventLogger; + *g_eventLogger = 0; +} + === modified file 'storage/ndb/src/common/transporter/TCP_Transporter.cpp' --- a/storage/ndb/src/common/transporter/TCP_Transporter.cpp 2008-03-11 16:15:47 +0000 +++ b/storage/ndb/src/common/transporter/TCP_Transporter.cpp 2008-08-07 13:36:47 +0000 @@ -21,7 +21,7 @@ #include #include -extern EventLogger g_eventLogger; +extern EventLogger * g_eventLogger; // End of stuff to be moved #ifdef NDB_WIN32 @@ -175,8 +175,8 @@ set_get(NDB_SOCKET_TYPE fd, int level, i (char*)&val, sizeof(val)) < 0) { #ifdef DEBUG_TRANSPORTER - g_eventLogger.error("setsockopt(%s, %d) errno: %d %s", - optname, val, errno, strerror(errno)); + g_eventLogger->error("setsockopt(%s, %d) errno: %d %s", + optname, val, errno, strerror(errno)); #endif } @@ -186,8 +186,8 @@ set_get(NDB_SOCKET_TYPE fd, int level, i actual != val) { #ifdef DEBUG_TRANSPORTER - g_eventLogger.error("setsockopt(%s, %d) - actual %d default: %d", - optname, val, actual, defval); + g_eventLogger->error("setsockopt(%s, %d) - actual %d default: %d", + optname, val, actual, defval); #endif } } @@ -225,7 +225,7 @@ TCP_Transporter::setSocketNonBlocking(ND if(ioctlsocket(socket, FIONBIO, &ul)) { #ifdef DEBUG_TRANSPORTER - g_eventLogger.error("Set non-blocking server error3: %d", InetErrno); + g_eventLogger->error("Set non-blocking server error3: %d", InetErrno); #endif }//if return true; @@ -239,13 +239,13 @@ TCP_Transporter::setSocketNonBlocking(ND flags = fcntl(socket, F_GETFL, 0); if (flags < 0) { #ifdef DEBUG_TRANSPORTER - g_eventLogger.error("Set non-blocking server error1: %s", strerror(InetErrno)); + g_eventLogger->error("Set non-blocking server error1: %s", strerror(InetErrno)); #endif }//if flags |= NDB_NONBLOCK; if (fcntl(socket, F_SETFL, flags) == -1) { #ifdef DEBUG_TRANSPORTER - g_eventLogger.error("Set non-blocking server error2: %s", strerror(InetErrno)); + g_eventLogger->error("Set non-blocking server error2: %s", strerror(InetErrno)); #endif }//if return true; @@ -378,12 +378,13 @@ TCP_Transporter::doSend() { // Send failed #if defined DEBUG_TRANSPORTER - g_eventLogger.error("Send Failure(disconnect==%d) to node = %d nBytesSent = %d " - "errno = %d strerror = %s", - DISCONNECT_ERRNO(InetErrno, nBytesSent), - remoteNodeId, nBytesSent, InetErrno, - (char*)ndbstrerror(InetErrno)); -#endif + g_eventLogger->error("Send Failure(disconnect==%d) to node = %d " + "nBytesSent = %d " + "errno = %d strerror = %s", + DISCONNECT_ERRNO(InetErrno, nBytesSent), + remoteNodeId, nBytesSent, InetErrno, + (char*)ndbstrerror(InetErrno)); +#endif if(DISCONNECT_ERRNO(InetErrno, nBytesSent)){ doDisconnect(); report_disconnect(InetErrno); @@ -413,12 +414,12 @@ TCP_Transporter::doReceive() { if(receiveBuffer.sizeOfData > receiveBuffer.sizeOfBuffer){ #ifdef DEBUG_TRANSPORTER - g_eventLogger.error("receiveBuffer.sizeOfData(%d) > receiveBuffer.sizeOfBuffer(%d)", - receiveBuffer.sizeOfData, receiveBuffer.sizeOfBuffer); - g_eventLogger.error("nBytesRead = %d", nBytesRead); + g_eventLogger->error("receiveBuffer.sizeOfData(%d) > receiveBuffer.sizeOfBuffer(%d)", + receiveBuffer.sizeOfData, receiveBuffer.sizeOfBuffer); + g_eventLogger->error("nBytesRead = %d", nBytesRead); #endif - g_eventLogger.error("receiveBuffer.sizeOfData(%d) > receiveBuffer.sizeOfBuffer(%d)", - receiveBuffer.sizeOfData, receiveBuffer.sizeOfBuffer); + g_eventLogger->error("receiveBuffer.sizeOfData(%d) > receiveBuffer.sizeOfBuffer(%d)", + receiveBuffer.sizeOfData, receiveBuffer.sizeOfBuffer); report_error(TE_INVALID_MESSAGE_LENGTH); return 0; } @@ -434,11 +435,11 @@ TCP_Transporter::doReceive() { return nBytesRead; } else { #if defined DEBUG_TRANSPORTER - g_eventLogger.error("Receive Failure(disconnect==%d) to node = %d nBytesSent = %d " - "errno = %d strerror = %s", - DISCONNECT_ERRNO(InetErrno, nBytesRead), - remoteNodeId, nBytesRead, InetErrno, - (char*)ndbstrerror(InetErrno)); + g_eventLogger->error("Receive Failure(disconnect==%d) to node = %d nBytesSent = %d " + "errno = %d strerror = %s", + DISCONNECT_ERRNO(InetErrno, nBytesRead), + remoteNodeId, nBytesRead, InetErrno, + (char*)ndbstrerror(InetErrno)); #endif if(DISCONNECT_ERRNO(InetErrno, nBytesRead)){ // The remote node has closed down === modified file 'storage/ndb/src/common/transporter/Transporter.cpp' --- a/storage/ndb/src/common/transporter/Transporter.cpp 2007-11-14 12:22:57 +0000 +++ b/storage/ndb/src/common/transporter/Transporter.cpp 2008-04-22 19:36:05 +0000 @@ -24,7 +24,7 @@ #include #include -extern EventLogger g_eventLogger; +extern EventLogger * g_eventLogger; Transporter::Transporter(TransporterRegistry &t_reg, TransporterType _type, @@ -204,14 +204,14 @@ Transporter::connect_client(NDB_SOCKET_T DBUG_PRINT("error", ("Transporter types mismatch this=%d remote=%d", m_type, remote_transporter_type)); NDB_CLOSE_SOCKET(sockfd); - g_eventLogger.error("Incompatible configuration: transporter type " - "mismatch with node %d", nodeId); + g_eventLogger->error("Incompatible configuration: transporter type " + "mismatch with node %d", nodeId); DBUG_RETURN(false); } } else if (m_type == tt_SHM_TRANSPORTER) { - g_eventLogger.warning("Unable to verify transporter compatability with node %d", nodeId); + g_eventLogger->warning("Unable to verify transporter compatability with node %d", nodeId); } { === modified file 'storage/ndb/src/common/transporter/TransporterRegistry.cpp' --- a/storage/ndb/src/common/transporter/TransporterRegistry.cpp 2007-11-14 12:22:57 +0000 +++ b/storage/ndb/src/common/transporter/TransporterRegistry.cpp 2008-04-25 09:17:15 +0000 @@ -47,7 +47,7 @@ extern int g_ndb_shm_signum; #include #include -extern EventLogger g_eventLogger; +extern EventLogger * g_eventLogger; struct in_addr TransporterRegistry::get_connect_address(NodeId node_id) const @@ -241,8 +241,8 @@ TransporterRegistry::connect_server(NDB_ { DBUG_PRINT("error", ("Transporter types mismatch this=%d remote=%d", t->m_type, remote_transporter_type)); - g_eventLogger.error("Incompatible configuration: Transporter type " - "mismatch with node %d", nodeId); + g_eventLogger->error("Incompatible configuration: Transporter type " + "mismatch with node %d", nodeId); // wait for socket close for 1 second to let message arrive at client { @@ -258,13 +258,18 @@ TransporterRegistry::connect_server(NDB_ } else if (t->m_type == tt_SHM_TRANSPORTER) { - g_eventLogger.warning("Unable to verify transporter compatability with node %d", nodeId); + g_eventLogger->warning("Unable to verify transporter compatability with node %d", nodeId); } // setup transporter (transporter responsible for closing sockfd) - t->connect_server(sockfd); + bool res = t->connect_server(sockfd); - DBUG_RETURN(true); + if (res && performStates[nodeId] != TransporterRegistry::CONNECTING) + { + DBUG_RETURN(false); + } + + DBUG_RETURN(res); } bool @@ -787,7 +792,7 @@ TransporterRegistry::poll_TCP(Uint32 tim tcpReadSelectReply = select(maxSocketValue, &tcpReadset, 0, 0, &timeout); if(false && tcpReadSelectReply == -1 && errno == EINTR) - g_eventLogger.info("woke-up by signal"); + g_eventLogger->info("woke-up by signal"); #ifdef NDB_WIN32 if(tcpReadSelectReply == SOCKET_ERROR) @@ -1129,19 +1134,20 @@ TransporterRegistry::start_clients_threa } else if(ndb_mgm_is_connected(m_mgm_handle)) { - g_eventLogger.info("Failed to get dynamic port to connect to: %d", res); + g_eventLogger->info("Failed to get dynamic port to connect to: %d", res); ndb_mgm_disconnect(m_mgm_handle); } else { - g_eventLogger.info("Management server closed connection early. " - "It is probably being shut down (or has problems). " - "We will retry the connection. %d %s %s line: %d", - ndb_mgm_get_latest_error(m_mgm_handle), - ndb_mgm_get_latest_error_desc(m_mgm_handle), - ndb_mgm_get_latest_error_msg(m_mgm_handle), - ndb_mgm_get_latest_error_line(m_mgm_handle) - ); + g_eventLogger->info + ("Management server closed connection early. " + "It is probably being shut down (or has problems). " + "We will retry the connection. %d %s %s line: %d", + ndb_mgm_get_latest_error(m_mgm_handle), + ndb_mgm_get_latest_error_desc(m_mgm_handle), + ndb_mgm_get_latest_error_msg(m_mgm_handle), + ndb_mgm_get_latest_error_line(m_mgm_handle) + ); } } /** else @@ -1235,7 +1241,7 @@ TransporterRegistry::start_service(Socke DBUG_ENTER("TransporterRegistry::start_service"); if (m_transporter_interface.size() > 0 && !nodeIdSpecified) { - g_eventLogger.error("TransporterRegistry::startReceiving: localNodeId not specified"); + g_eventLogger->error("TransporterRegistry::startReceiving: localNodeId not specified"); DBUG_RETURN(false); } @@ -1261,10 +1267,10 @@ TransporterRegistry::start_service(Socke * If it wasn't a dynamically allocated port, or * our attempts at getting a new dynamic port failed */ - g_eventLogger.error("Unable to setup transporter service port: %s:%d!\n" - "Please check if the port is already used,\n" - "(perhaps the node is already running)", - t.m_interface ? t.m_interface : "*", t.m_s_service_port); + g_eventLogger->error("Unable to setup transporter service port: %s:%d!\n" + "Please check if the port is already used,\n" + "(perhaps the node is already running)", + t.m_interface ? t.m_interface : "*", t.m_s_service_port); delete transporter_service; DBUG_RETURN(false); } @@ -1306,9 +1312,9 @@ TransporterRegistry::startReceiving() if(ret != 0) { DBUG_PRINT("error",("Install failed")); - g_eventLogger.error("Failed to install signal handler for" - " SHM transporter, signum %d, errno: %d (%s)", - g_ndb_shm_signum, errno, strerror(errno)); + g_eventLogger->error("Failed to install signal handler for" + " SHM transporter, signum %d, errno: %d (%s)", + g_ndb_shm_signum, errno, strerror(errno)); } } #endif // NDB_SHM_TRANSPORTER @@ -1358,13 +1364,13 @@ bool TransporterRegistry::connect_client if(!mgm_nodeid) { - g_eventLogger.error("%s: %d", __FILE__, __LINE__); + g_eventLogger->error("%s: %d", __FILE__, __LINE__); return false; } Transporter * t = theTransporters[mgm_nodeid]; if (!t) { - g_eventLogger.error("%s: %d", __FILE__, __LINE__); + g_eventLogger->error("%s: %d", __FILE__, __LINE__); return false; } DBUG_RETURN(t->connect_client(connect_ndb_mgmd(h))); @@ -1380,7 +1386,7 @@ NDB_SOCKET_TYPE TransporterRegistry::con if ( h==NULL || *h == NULL ) { - g_eventLogger.error("%s: %d", __FILE__, __LINE__); + g_eventLogger->error("%s: %d", __FILE__, __LINE__); return NDB_INVALID_SOCKET; } @@ -1393,10 +1399,10 @@ NDB_SOCKET_TYPE TransporterRegistry::con m_transporter_interface[i].m_s_service_port, &mgm_reply) < 0) { - g_eventLogger.error("Error: %s: %d", - ndb_mgm_get_latest_error_desc(*h), - ndb_mgm_get_latest_error(*h)); - g_eventLogger.error("%s: %d", __FILE__, __LINE__); + g_eventLogger->error("Error: %s: %d", + ndb_mgm_get_latest_error_desc(*h), + ndb_mgm_get_latest_error(*h)); + g_eventLogger->error("%s: %d", __FILE__, __LINE__); ndb_mgm_destroy_handle(h); return NDB_INVALID_SOCKET; } @@ -1408,10 +1414,10 @@ NDB_SOCKET_TYPE TransporterRegistry::con NDB_SOCKET_TYPE sockfd= ndb_mgm_convert_to_transporter(h); if ( sockfd == NDB_INVALID_SOCKET) { - g_eventLogger.error("Error: %s: %d", - ndb_mgm_get_latest_error_desc(*h), - ndb_mgm_get_latest_error(*h)); - g_eventLogger.error("%s: %d", __FILE__, __LINE__); + g_eventLogger->error("Error: %s: %d", + ndb_mgm_get_latest_error_desc(*h), + ndb_mgm_get_latest_error(*h)); + g_eventLogger->error("%s: %d", __FILE__, __LINE__); ndb_mgm_destroy_handle(h); } return sockfd; === modified file 'storage/ndb/src/common/util/Makefile.am' --- a/storage/ndb/src/common/util/Makefile.am 2007-09-25 10:05:32 +0000 +++ b/storage/ndb/src/common/util/Makefile.am 2008-05-09 17:53:25 +0000 @@ -23,7 +23,7 @@ libgeneral_la_SOURCES = \ NdbSqlUtil.cpp new.cpp \ uucode.c random.c version.c \ strdup.c \ - ConfigValues.cpp ndb_init.c basestring_vsnprintf.c \ + ConfigValues.cpp ndb_init.cpp basestring_vsnprintf.c \ Bitmask.cpp \ ndb_rand.c @@ -31,9 +31,18 @@ EXTRA_PROGRAMS = testBitmask testBitmask_SOURCES = testBitmask.cpp testBitmask_LDFLAGS = @ndb_bin_am_ldflags@ \ $(top_builddir)/storage/ndb/src/libndbclient.la \ - $(top_builddir)/dbug/libdbug.a \ - $(top_builddir)/mysys/libmysys.a \ - $(top_builddir)/strings/libmystrings.a + $(top_builddir)/dbug/libdbuglt.la \ + $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/strings/libmystringslt.la + +#noinst_PROGRAMS = ndb_show_compat +ndb_show_compat_SOURCES = ndb_show_compat.cc +ndb_show_compat_LDADD = \ + $(builddir)libgeneral.la \ + $(top_builddir)/storage/ndb/src/common/portlib/libportlib.la \ + $(top_builddir)/dbug/libdbuglt.la \ + $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/strings/libmystringslt.la testBitmask.cpp : Bitmask.cpp rm -f testBitmask.cpp === renamed file 'storage/ndb/src/common/util/ndb_init.c' => 'storage/ndb/src/common/util/ndb_init.cpp' --- a/storage/ndb/src/common/util/ndb_init.c 2006-12-23 19:20:40 +0000 +++ b/storage/ndb/src/common/util/ndb_init.cpp 2008-04-22 19:36:05 +0000 @@ -17,37 +17,73 @@ #include #include +class EventLogger *g_eventLogger = NULL; + NdbMutex *g_ndb_connection_mutex = NULL; +extern class EventLogger * create_event_logger(); +extern void destroy_event_logger(class EventLogger ** g_eventLogger); + +static int ndb_init_called = 0; + +extern "C" +{ + void ndb_init_internal() { if (!g_ndb_connection_mutex) g_ndb_connection_mutex = NdbMutex_Create(); + if (!g_eventLogger) + g_eventLogger = create_event_logger(); + if ((g_ndb_connection_mutex == NULL) || (g_eventLogger == NULL)) + { + { + const char* err = "ndb_init() failed - exit\n"; + write(2, err, strlen(err)); + exit(1); + } + } } int ndb_init() { - if (my_init()) { - const char* err = "my_init() failed - exit\n"; - write(2, err, strlen(err)); - exit(1); + if (ndb_init_called == 0) + { + ndb_init_called = 1; + if (my_init()) + { + const char* err = "my_init() failed - exit\n"; + write(2, err, strlen(err)); + exit(1); + } + ndb_init_internal(); } - ndb_init_internal(); return 0; } void ndb_end_internal() { - if (g_ndb_connection_mutex) + if (g_ndb_connection_mutex) + { NdbMutex_Destroy(g_ndb_connection_mutex); + g_ndb_connection_mutex=NULL; + } + if (g_eventLogger) + destroy_event_logger(&g_eventLogger); } void ndb_end(int flags) { - my_end(flags); - ndb_end_internal(); + if (ndb_init_called == 1) + { + my_end(flags); + ndb_end_internal(); + ndb_init_called = 0; + } } + +} /* extern "C" */ === added file 'storage/ndb/src/common/util/ndb_show_compat.cc' --- a/storage/ndb/src/common/util/ndb_show_compat.cc 1970-01-01 00:00:00 +0000 +++ b/storage/ndb/src/common/util/ndb_show_compat.cc 2008-05-09 07:37:37 +0000 @@ -0,0 +1,27 @@ +/* Copyright (C) 2008 MySQL AB + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + + +extern "C" { + void ndbPrintFullyCompatibleTable(void); + void ndbPrintUpgradeCompatibleTable(void); +} + +int main(void){ + ndbPrintFullyCompatibleTable(); + ndbPrintUpgradeCompatibleTable(); +} + + === modified file 'storage/ndb/src/common/util/version.c' --- a/storage/ndb/src/common/util/version.c 2007-10-30 16:58:36 +0000 +++ b/storage/ndb/src/common/util/version.c 2008-08-07 13:36:47 +0000 @@ -275,3 +275,48 @@ ndbCompatible_ndb_ndb(Uint32 ownVersion, { return ndbCompatible_upgrade(ownVersion, otherVersion); } + + +void +ndbPrintCompatibleTable(struct NdbUpGradeCompatible table[]) +{ + int i; + printf("ownVersion, matchType, otherVersion\n"); + for (i = 0; table[i].ownVersion != 0 && table[i].otherVersion != 0; i++) { + + printf("%u.%u.%u, ", + getMajor(table[i].ownVersion), + getMinor(table[i].ownVersion), + getBuild(table[i].ownVersion)); + switch (table[i].matchType) { + case UG_Range: + printf("Range"); + break; + case UG_Exact: + printf("Exact"); + break; + default: + break; + } + printf(", %u.%u.%u\n", + getMajor(table[i].otherVersion), + getMinor(table[i].otherVersion), + getBuild(table[i].otherVersion)); + + } + printf("\n"); +} + + +void +ndbPrintFullyCompatibleTable(void){ + printf("ndbCompatibleTable_full\n"); + ndbPrintCompatibleTable(ndbCompatibleTable_full); +} + + +void +ndbPrintUpgradeCompatibleTable(void){ + printf("ndbCompatibleTable_upgrade\n"); + ndbPrintCompatibleTable(ndbCompatibleTable_upgrade); +} === modified file 'storage/ndb/src/cw/cpcd/Makefile.am' --- a/storage/ndb/src/cw/cpcd/Makefile.am 2007-02-13 01:38:54 +0000 +++ b/storage/ndb/src/cw/cpcd/Makefile.am 2008-04-25 06:32:23 +0000 @@ -19,9 +19,9 @@ ndb_cpcd_SOURCES = main.cpp CPCD.cpp Pro LDADD_LOC = \ $(top_builddir)/storage/ndb/src/libndbclient.la \ - $(top_builddir)/dbug/libdbug.a \ - $(top_builddir)/mysys/libmysys.a \ - $(top_builddir)/strings/libmystrings.a @NDB_SCI_LIBS@ + $(top_builddir)/dbug/libdbuglt.la \ + $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/strings/libmystringslt.la @NDB_SCI_LIBS@ include $(top_srcdir)/storage/ndb/config/common.mk.am include $(top_srcdir)/storage/ndb/config/type_util.mk.am === modified file 'storage/ndb/src/kernel/Makefile.am' --- a/storage/ndb/src/kernel/Makefile.am 2006-12-31 00:32:21 +0000 +++ b/storage/ndb/src/kernel/Makefile.am 2008-04-25 23:09:48 +0000 @@ -53,9 +53,10 @@ LDADD += \ $(top_builddir)/storage/ndb/src/mgmapi/libmgmapi.la \ $(top_builddir)/storage/ndb/src/common/portlib/libportlib.la \ $(top_builddir)/storage/ndb/src/common/util/libgeneral.la \ - $(top_builddir)/dbug/libdbug.a \ - $(top_builddir)/mysys/libmysys.a \ - $(top_builddir)/strings/libmystrings.a @NDB_SCI_LIBS@ + $(top_builddir)/dbug/libdbuglt.la \ + $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/strings/libmystringslt.la \ + $(top_builddir)/zlib/libzlt.la @NDB_SCI_LIBS@ windoze-dsp: ndbd.dsp === modified file 'storage/ndb/src/kernel/blocks/ERROR_codes.txt' --- a/storage/ndb/src/kernel/blocks/ERROR_codes.txt 2008-03-25 15:46:12 +0000 +++ b/storage/ndb/src/kernel/blocks/ERROR_codes.txt 2008-05-30 08:03:55 +0000 @@ -1,12 +1,12 @@ -Next QMGR 1 +Next QMGR 937 Next NDBCNTR 1002 Next NDBFS 2000 Next DBACC 3002 Next DBTUP 4029 -Next DBLQH 5050 +Next DBLQH 5051 Next DBDICT 6008 -Next DBDIH 7202 -Next DBTC 8058 +Next DBDIH 7211 +Next DBTC 8064 Next CMVMI 9000 Next BACKUP 10041 Next DBUTIL 11002 @@ -551,6 +551,11 @@ Dbdict: 6005 Crash in participant @ CreateTabReq::CreateDrop 6007 Fail on readTableFile for READ_TAB_FILE1 (28770) +6200 Set error code after handleTabInfoInit in master +6201 Set error code after handleTabInfoInit in master (index) +6202 Set error code before CREATE_FRAGMENTATION in master +6203 Set error code before CREATE_FRAGMENTATION in master (index) + Dbtup: 4014 - handleInsert - Out of undo buffer 4015 - handleInsert - Out of log space === modified file 'storage/ndb/src/kernel/blocks/Makefile.am' --- a/storage/ndb/src/kernel/blocks/Makefile.am 2006-12-31 00:32:21 +0000 +++ b/storage/ndb/src/kernel/blocks/Makefile.am 2008-04-25 06:32:23 +0000 @@ -57,9 +57,9 @@ EXTRA_PROGRAMS = ndb_print_file ndb_print_file_SOURCES = print_file.cpp diskpage.cpp dbtup/tuppage.cpp ndb_print_file_LDFLAGS = @ndb_bin_am_ldflags@ \ $(top_builddir)/storage/ndb/src/libndbclient.la \ - $(top_builddir)/dbug/libdbug.a \ - $(top_builddir)/mysys/libmysys.a \ - $(top_builddir)/strings/libmystrings.a + $(top_builddir)/dbug/libdbuglt.la \ + $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/strings/libmystringslt.la include $(top_srcdir)/storage/ndb/config/common.mk.am include $(top_srcdir)/storage/ndb/config/type_kernel.mk.am === modified file 'storage/ndb/src/kernel/blocks/backup/Backup.cpp' --- a/storage/ndb/src/kernel/blocks/backup/Backup.cpp 2008-03-25 15:46:12 +0000 +++ b/storage/ndb/src/kernel/blocks/backup/Backup.cpp 2008-05-16 13:08:36 +0000 @@ -2813,6 +2813,8 @@ Backup::backupAllData(Signal* signal, Ba req->senderRef = reference(); req->senderData = ptr.i; req->requestData = 0; + req->tableId = 0; + req->tableType = 0; sendSignal(DBDICT_REF, GSN_LIST_TABLES_REQ, signal, ListTablesReq::SignalLength, JBB); } @@ -2821,56 +2823,68 @@ void Backup::execLIST_TABLES_CONF(Signal* signal) { jamEntry(); - + Uint32 fragInfo = signal->header.m_fragmentInfo; ListTablesConf* conf = (ListTablesConf*)signal->getDataPtr(); + Uint32 noOfTables = conf->noOfTables; BackupRecordPtr ptr LINT_SET_PTR; c_backupPool.getPtr(ptr, conf->senderData); - - const Uint32 len = signal->length() - ListTablesConf::HeaderLength; - for(unsigned int i = 0; itableData[i]); - Uint32 tableType = ListTablesConf::getTableType(conf->tableData[i]); - Uint32 state= ListTablesConf::getTableState(conf->tableData[i]); - - if (! (DictTabInfo::isTable(tableType) || - DictTabInfo::isIndex(tableType) || - DictTabInfo::isFilegroup(tableType) || - DictTabInfo::isFile(tableType))) - { - jam(); - continue; - } - - if (state != DictTabInfo::StateOnline) - { - jam(); - continue; - } - - TablePtr tabPtr; - ptr.p->tables.seize(tabPtr); - if(tabPtr.i == RNIL) { - jam(); - defineBackupRef(signal, ptr, DefineBackupRef::FailedToAllocateTables); - return; - }//if - tabPtr.p->tableId = tableId; - tabPtr.p->tableType = tableType; - }//for - - if(len == ListTablesConf::DataLength) { - jam(); - /** - * Not finished... - */ - return; - }//if - /** - * All tables fetched + if (noOfTables > 0) + { + ndbassert(signal->getNoOfSections() > 0); + ListTablesData ltd; + const Uint32 listTablesDataSizeInWords = (sizeof(ListTablesData) + 3) / 4; + SegmentedSectionPtr tableDataPtr; + signal->getSection(tableDataPtr, ListTablesConf::TABLE_DATA); + SimplePropertiesSectionReader + tableDataReader(tableDataPtr, getSectionSegmentPool()); + + tableDataReader.reset(); + for(unsigned int i = 0; itables.seize(tabPtr); + if(tabPtr.i == RNIL) { + jam(); + defineBackupRef(signal, ptr, DefineBackupRef::FailedToAllocateTables); + releaseSections(signal); + return; + }//if + tabPtr.p->tableId = tableId; + tabPtr.p->tableType = tableType; + }//for + releaseSections(signal); + } + + /* + If first or not last signal + then keep accumulating table data */ + if ((fragInfo == 1) || (fragInfo == 2)) + { + return; + } openFiles(signal, ptr); } === modified file 'storage/ndb/src/kernel/blocks/backup/Makefile.am' --- a/storage/ndb/src/kernel/blocks/backup/Makefile.am 2006-12-31 00:32:21 +0000 +++ b/storage/ndb/src/kernel/blocks/backup/Makefile.am 2008-04-25 06:32:23 +0000 @@ -17,9 +17,9 @@ ndbtools_PROGRAMS = ndb_print_backup_fil ndb_print_backup_file_SOURCES = read.cpp ndb_print_backup_file_LDFLAGS = @ndb_bin_am_ldflags@ \ $(top_builddir)/storage/ndb/src/libndbclient.la \ - $(top_builddir)/mysys/libmysys.a \ - $(top_builddir)/dbug/libdbug.a \ - $(top_builddir)/strings/libmystrings.a + $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/dbug/libdbuglt.la \ + $(top_builddir)/strings/libmystringslt.la include $(top_srcdir)/storage/ndb/config/common.mk.am include $(top_srcdir)/storage/ndb/config/type_kernel.mk.am === modified file 'storage/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp' --- a/storage/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp 2007-11-23 10:09:30 +0000 +++ b/storage/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp 2008-04-25 10:56:03 +0000 @@ -43,7 +43,7 @@ #include // Used here only to print event reports on stdout/console. -EventLogger g_eventLogger; +extern EventLogger * g_eventLogger; extern int simulate_error_during_shutdown; Cmvmi::Cmvmi(Block_context& ctx) : @@ -241,8 +241,8 @@ void Cmvmi::execEVENT_REP(Signal* signal } // Print the event info - g_eventLogger.log(eventReport->getEventType(), - signal->theData, signal->getLength(), 0, 0); + g_eventLogger->log(eventReport->getEventType(), + signal->theData, signal->getLength(), 0, 0); return; }//execEVENT_REP() @@ -421,7 +421,7 @@ void Cmvmi::execSTTOR(Signal* signal) { int res = NdbMem_MemLockAll(0); if(res != 0){ - g_eventLogger.warning("Failed to memlock pages"); + g_eventLogger->warning("Failed to memlock pages"); warningEvent("Failed to memlock pages"); } } @@ -433,13 +433,26 @@ void Cmvmi::execSTTOR(Signal* signal) globalData.activateSendPacked = 1; sendSTTORRY(signal); } else if (theStartPhase == 8){ - /*---------------------------------------------------*/ - /* Open com to API + REP nodes */ - /*---------------------------------------------------*/ - signal->theData[0] = 0; // no answer - signal->theData[1] = 0; // no id - signal->theData[2] = NodeInfo::API; - execOPEN_COMREQ(signal); +#ifdef ERROR_INSERT + if (ERROR_INSERTED(9004)) + { + Uint32 len = signal->getLength(); + Uint32 db = c_dbNodes.find(0); + if (db == getOwnNodeId()) + db = c_dbNodes.find(db); + Uint32 i = c_error_9000_nodes_mask.find(0); + Uint32 tmp[25]; + memcpy(tmp, signal->theData, sizeof(tmp)); + signal->theData[0] = i; + sendSignal(calcQmgrBlockRef(db),GSN_API_FAILREQ, signal, 1, JBA); + ndbout_c("stopping %u using %u", i, db); + CLEAR_ERROR_INSERT_VALUE; + memcpy(signal->theData, tmp, sizeof(tmp)); + sendSignalWithDelay(reference(), GSN_STTOR, + signal, 100, len); + return; + } +#endif globalData.theStartLevel = NodeState::SL_STARTED; sendSTTORRY(signal); } @@ -502,14 +515,6 @@ void Cmvmi::execOPEN_COMREQ(Signal* sign && c_error_9000_nodes_mask.get(tStartingNode))) #endif { - if (globalData.theStartLevel != NodeState::SL_STARTED && - (getNodeInfo(tStartingNode).m_type != NodeInfo::DB && - getNodeInfo(tStartingNode).m_type != NodeInfo::MGM)) - { - jam(); - goto done; - } - globalTransporterRegistry.do_connect(tStartingNode); globalTransporterRegistry.setIOState(tStartingNode, HaltIO); @@ -534,7 +539,6 @@ void Cmvmi::execOPEN_COMREQ(Signal* sign && c_error_9000_nodes_mask.get(i)) continue; #endif - globalTransporterRegistry.do_connect(i); globalTransporterRegistry.setIOState(i, HaltIO); @@ -607,38 +611,17 @@ void Cmvmi::execCONNECT_REP(Signal *sign globalData.m_nodeInfo[hostId].m_version = 0; globalData.m_nodeInfo[hostId].m_mysql_version = 0; - if(type == NodeInfo::DB || globalData.theStartLevel >= NodeState::SL_STARTED){ - jam(); - - /** - * Inform QMGR that client has connected - */ - - signal->theData[0] = hostId; - sendSignal(QMGR_REF, GSN_CONNECT_REP, signal, 1, JBA); - } else if(globalData.theStartLevel == NodeState::SL_CMVMI || - globalData.theStartLevel == NodeState::SL_STARTING) { - jam(); - /** - * Someone connected before start was finished - */ - if(type == NodeInfo::MGM){ - jam(); - signal->theData[0] = hostId; - sendSignal(QMGR_REF, GSN_CONNECT_REP, signal, 1, JBA); - } else { - /** - * Dont allow api nodes to connect - */ - ndbout_c("%d %d %d", hostId, type, globalData.theStartLevel); - abort(); - globalTransporterRegistry.do_disconnect(hostId); - } - } + /** + * Inform QMGR that client has connected + */ + signal->theData[0] = hostId; + sendSignal(QMGR_REF, GSN_CONNECT_REP, signal, 1, JBA); + /* Automatically subscribe events for MGM nodes. */ - if(type == NodeInfo::MGM){ + if(type == NodeInfo::MGM) + { jam(); globalTransporterRegistry.setIOState(hostId, NoHalt); } @@ -827,26 +810,16 @@ Cmvmi::execSTART_ORD(Signal* signal) { return; } - if(globalData.theStartLevel == NodeState::SL_NOTHING){ + if(globalData.theStartLevel == NodeState::SL_NOTHING) + { jam(); globalData.theStartLevel = NodeState::SL_CMVMI; - /** - * Open connections to management servers - */ - for(unsigned int i = 1; i < MAX_NODES; i++ ){ - if (getNodeInfo(i).m_type == NodeInfo::MGM){ - if(!globalTransporterRegistry.is_connected(i)){ - globalTransporterRegistry.do_connect(i); - globalTransporterRegistry.setIOState(i, NoHalt); - } - } - } - EXECUTE_DIRECT(QMGR, GSN_START_ORD, signal, 1); return ; } - if(globalData.theStartLevel == NodeState::SL_CMVMI){ + if(globalData.theStartLevel == NodeState::SL_CMVMI) + { jam(); if(m_ctx.m_config.lockPagesInMainMemory() == 2) @@ -854,12 +827,12 @@ Cmvmi::execSTART_ORD(Signal* signal) { int res = NdbMem_MemLockAll(1); if(res != 0) { - g_eventLogger.warning("Failed to memlock pages"); + g_eventLogger->warning("Failed to memlock pages"); warningEvent("Failed to memlock pages"); } else { - g_eventLogger.info("Locked future allocations"); + g_eventLogger->info("Locked future allocations"); } } @@ -874,8 +847,10 @@ Cmvmi::execSTART_ORD(Signal* signal) { // Disconnect all nodes as part of the system restart. // We need to ensure that we are starting up // without any connected nodes. - for(unsigned int i = 1; i < MAX_NODES; i++ ){ - if (i != getOwnNodeId() && getNodeInfo(i).m_type != NodeInfo::MGM){ + for(unsigned int i = 1; i < MAX_NODES; i++ ) + { + if (i != getOwnNodeId() && getNodeInfo(i).m_type != NodeInfo::MGM) + { globalTransporterRegistry.do_disconnect(i); globalTransporterRegistry.setIOState(i, HaltIO); } @@ -1027,15 +1002,15 @@ Cmvmi::execDUMP_STATE_ORD(Signal* signal { SubscriberPtr ptr; subscribers.first(ptr); - g_eventLogger.info("List subscriptions:"); + g_eventLogger->info("List subscriptions:"); while(ptr.i != RNIL) { - g_eventLogger.info("Subscription: %u, nodeId: %u, ref: 0x%x", - ptr.i, refToNode(ptr.p->blockRef), ptr.p->blockRef); + g_eventLogger->info("Subscription: %u, nodeId: %u, ref: 0x%x", + ptr.i, refToNode(ptr.p->blockRef), ptr.p->blockRef); for(Uint32 i = 0; i < LogLevel::LOGLEVEL_CATEGORIES; i++) { Uint32 level = ptr.p->logLevel.getLogLevel((LogLevel::EventCategory)i); - g_eventLogger.info("Category %u Level %u", i, level); + g_eventLogger->info("Category %u Level %u", i, level); } subscribers.next(ptr); } @@ -1151,6 +1126,20 @@ Cmvmi::execDUMP_STATE_ORD(Signal* signal } c_error_9000_nodes_mask.clear(); } + + if (arg == 9004 && signal->getLength() == 2) + { + SET_ERROR_INSERT_VALUE(9004); + c_error_9000_nodes_mask.clear(); + c_error_9000_nodes_mask.set(signal->theData[1]); + } + + if (arg == 9004 && signal->getLength() == 2) + { + SET_ERROR_INSERT_VALUE(9004); + c_error_9000_nodes_mask.clear(); + c_error_9000_nodes_mask.set(signal->theData[1]); + } #endif #ifdef VM_TRACE === modified file 'storage/ndb/src/kernel/blocks/dbacc/Dbacc.hpp' --- a/storage/ndb/src/kernel/blocks/dbacc/Dbacc.hpp 2007-03-16 10:16:48 +0000 +++ b/storage/ndb/src/kernel/blocks/dbacc/Dbacc.hpp 2008-05-29 15:58:58 +0000 @@ -881,6 +881,10 @@ private: FragmentrecPtr fragrecptr; Uint32 cfirstfreefrag; Uint32 cfragmentsize; + RSS_OP_COUNTER(cnoOfFreeFragrec); + RSS_OP_SNAPSHOT(cnoOfFreeFragrec); + + /* --------------------------------------------------------------------------------- */ /* FS_CONNECTREC */ /* --------------------------------------------------------------------------------- */ === modified file 'storage/ndb/src/kernel/blocks/dbacc/DbaccInit.cpp' --- a/storage/ndb/src/kernel/blocks/dbacc/DbaccInit.cpp 2007-02-14 05:37:40 +0000 +++ b/storage/ndb/src/kernel/blocks/dbacc/DbaccInit.cpp 2008-05-29 15:58:58 +0000 @@ -43,6 +43,9 @@ void Dbacc::initData() cnoOfAllocatedPages = cpagesize = 0; // Records with constant sizes + + RSS_OP_COUNTER_INIT(cnoOfFreeFragrec); + }//Dbacc::initData() void Dbacc::initRecords() === modified file 'storage/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp' --- a/storage/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp 2008-02-03 13:16:36 +0000 +++ b/storage/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp 2008-05-29 15:58:58 +0000 @@ -858,6 +858,7 @@ void Dbacc::releaseFragRecord(Signal* si regFragPtr.p->nextfreefrag = cfirstfreefrag; cfirstfreefrag = regFragPtr.i; initFragGeneral(regFragPtr); + RSS_OP_FREE(cnoOfFreeFragrec); }//Dbacc::releaseFragRecord() /* -------------------------------------------------------------------------- */ @@ -6175,6 +6176,7 @@ void Dbacc::initFragAdd(Signal* signal, regFragPtr.p->mytabptr = req->tableId; regFragPtr.p->roothashcheck = req->kValue + req->lhFragBits; regFragPtr.p->noOfElements = 0; + regFragPtr.p->m_commit_count = 0; // stable results for (Uint32 i = 0; i < MAX_PARALLEL_SCANS_PER_FRAG; i++) { regFragPtr.p->scan[i] = RNIL; }//for @@ -8073,6 +8075,7 @@ void Dbacc::seizeDirrange(Signal* signal /* --------------------------------------------------------------------------------- */ void Dbacc::seizeFragrec(Signal* signal) { + RSS_OP_ALLOC(cnoOfFreeFragrec); fragrecptr.i = cfirstfreefrag; ptrCheckGuard(fragrecptr, cfragmentsize, fragmentrec); cfirstfreefrag = fragrecptr.p->nextfreefrag; @@ -8519,6 +8522,18 @@ Dbacc::execDUMP_STATE_ORD(Signal* signal return; }//if #endif + + if (signal->theData[0] == DumpStateOrd::SchemaResourceSnapshot) + { + RSS_OP_SNAPSHOT_SAVE(cnoOfFreeFragrec); + return; + } + + if (signal->theData[0] == DumpStateOrd::SchemaResourceCheckLeak) + { + RSS_OP_SNAPSHOT_CHECK(cnoOfFreeFragrec); + return; + } }//Dbacc::execDUMP_STATE_ORD() void === modified file 'storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp' --- a/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp 2008-04-03 12:46:03 +0000 +++ b/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp 2008-05-30 08:03:55 +0000 @@ -83,15 +83,14 @@ #include #include -#include -extern EventLogger g_eventLogger; - #include #include #include +#include + #include -extern EventLogger g_eventLogger; +extern EventLogger * g_eventLogger; #define ZNOT_FOUND 626 #define ZALREADYEXIST 630 @@ -312,8 +311,28 @@ Dbdict::execDUMP_STATE_ORD(Signal* signa c_counterMgr.getNoOfFree()); c_counterMgr.printNODE_FAILREP(); } - + + if (signal->theData[0] == DumpStateOrd::SchemaResourceSnapshot) + { + RSS_AP_SNAPSHOT_SAVE(c_rope_pool); + RSS_AP_SNAPSHOT_SAVE(c_attributeRecordPool); + RSS_AP_SNAPSHOT_SAVE(c_tableRecordPool); + RSS_AP_SNAPSHOT_SAVE(c_triggerRecordPool); + RSS_AP_SNAPSHOT_SAVE(c_obj_pool); + } + + if (signal->theData[0] == DumpStateOrd::SchemaResourceCheckLeak) + { + RSS_AP_SNAPSHOT_CHECK(c_rope_pool); + RSS_AP_SNAPSHOT_CHECK(c_attributeRecordPool); + RSS_AP_SNAPSHOT_CHECK(c_tableRecordPool); + RSS_AP_SNAPSHOT_CHECK(c_triggerRecordPool); + RSS_AP_SNAPSHOT_CHECK(c_obj_pool); + } + return; + + }//Dbdict::execDUMP_STATE_ORD() /* ---------------------------------------------------------------- */ @@ -2025,6 +2044,10 @@ Uint32 Dbdict::getFreeObjId(Uint32 minId Uint32 Dbdict::getFreeTableRecord(Uint32 primaryTableId) { Uint32 minId = (primaryTableId == RNIL ? 0 : primaryTableId + 1); + if (ERROR_INSERTED(6012) && minId < 4096){ + minId = 4096; + CLEAR_ERROR_INSERT_VALUE; + } Uint32 i = getFreeObjId(minId); if (i == RNIL) { jam(); @@ -2038,7 +2061,6 @@ Uint32 Dbdict::getFreeTableRecord(Uint32 c_tableRecordPool.getPtr(tablePtr, i); ndbrequire(tablePtr.p->tabState == TableRecord::NOT_DEFINED); initialiseTableRecord(tablePtr); - tablePtr.p->tabState = TableRecord::DEFINING; return i; } @@ -3936,10 +3958,26 @@ Dbdict::execCREATE_TABLE_REQ(Signal* sig handleTabInfoInit(r, &parseRecord); releaseSections(signal); + + if (parseRecord.errorCode == 0) + { + if (ERROR_INSERTED(6200) || + (ERROR_INSERTED(6201) && + DictTabInfo::isIndex(parseRecord.tablePtr.p->tableType))) + { + CLEAR_ERROR_INSERT_VALUE; + parseRecord.errorCode = 1; + } + } if(parseRecord.errorCode != 0){ jam(); c_opCreateTable.release(createTabPtr); + if (!parseRecord.tablePtr.isNull()) + { + jam(); + releaseTableObject(parseRecord.tablePtr.i, true); + } break; } @@ -3989,9 +4027,20 @@ Dbdict::execCREATE_TABLE_REQ(Signal* sig */ parseRecord.tablePtr.p->primaryTableId = RNIL; } - EXECUTE_DIRECT(DBDIH, GSN_CREATE_FRAGMENTATION_REQ, signal, - CreateFragmentationReq::SignalLength); - jamEntry(); + if (ERROR_INSERTED(6202) || + (ERROR_INSERTED(6203) && + DictTabInfo::isIndex(parseRecord.tablePtr.p->tableType))) + { + CLEAR_ERROR_INSERT_VALUE; + signal->theData[0] = 1; + } + else + { + EXECUTE_DIRECT(DBDIH, GSN_CREATE_FRAGMENTATION_REQ, signal, + CreateFragmentationReq::SignalLength); + jamEntry(); + } + if (signal->theData[0] != 0) { jam(); @@ -6262,7 +6311,7 @@ Dbdict::execTC_SCHVERCONF(Signal* signal jam(); \ parseP->errorCode = error; parseP->errorLine = __LINE__; \ parseP->errorKey = it.getKey(); \ - return; \ + return; \ }//if // handleAddTableFailure(signal, __LINE__, allocatedTable); @@ -6348,10 +6397,11 @@ void Dbdict::handleTabInfoInit(SimplePro if(checkExist){ jam(); - tabRequire(get_object(c_tableDesc.TableName, tableNameLength) == 0, - CreateTableRef::TableAlreadyExist); + + tabRequire(get_object(c_tableDesc.TableName, tableNameLength) == 0, + CreateTableRef::TableAlreadyExist;); } - + TableRecordPtr tablePtr; switch (parseP->requestType) { case DictTabInfo::CreateTableFromAPI: { @@ -6364,7 +6414,6 @@ void Dbdict::handleTabInfoInit(SimplePro // Check if no free tables existed. /* ---------------------------------------------------------------- */ tabRequire(tablePtr.i != RNIL, CreateTableRef::NoMoreTableRecords); - c_tableRecordPool.getPtr(tablePtr); break; } @@ -6399,21 +6448,20 @@ void Dbdict::handleTabInfoInit(SimplePro /* ---------------------------------------------------------------- */ Uint32 tableVersion = c_tableDesc.TableVersion; tablePtr.p->tableVersion = tableVersion; - + break; } default: ndbrequire(false); break; }//switch - parseP->tablePtr = tablePtr; { Rope name(c_rope_pool, tablePtr.p->tableName); tabRequire(name.assign(c_tableDesc.TableName, tableNameLength, name_hash), - CreateTableRef::OutOfStringBuffer); + CreateTableRef::OutOfStringBuffer); } - + Ptr obj_ptr; if (parseP->requestType != DictTabInfo::AlterTableFromAPI) { jam(); @@ -6430,7 +6478,9 @@ void Dbdict::handleTabInfoInit(SimplePro c_tableDesc.TableName, tablePtr.i, tablePtr.p->m_obj_ptr_i); #endif } - + parseP->tablePtr = tablePtr; + tablePtr.p->tabState = TableRecord::DEFINING; + // Disallow logging of a temporary table. tabRequire(!(c_tableDesc.TableTemporaryFlag && c_tableDesc.TableLoggedFlag), CreateTableRef::NoLoggingTemporaryTable); @@ -6510,6 +6560,7 @@ void Dbdict::handleTabInfoInit(SimplePro * Release table */ releaseTableObject(tablePtr.i, checkExist); + parseP->tablePtr.setNull(); return; } @@ -7897,15 +7948,28 @@ Dbdict::execLIST_TABLES_REQ(Signal* sign { jamEntry(); ListTablesReq * req = (ListTablesReq*)signal->getDataPtr(); + + Uint32 senderRef = req->senderRef; + Uint32 receiverVersion = getNodeInfo(refToNode(senderRef)).m_version; + + if (ndbd_LIST_TABLES_CONF_long_signal(receiverVersion)) + sendLIST_TABLES_CONF(signal, req); + else + sendOLD_LIST_TABLES_CONF(signal, req); +} + +void Dbdict::sendOLD_LIST_TABLES_CONF(Signal* signal, ListTablesReq* req) +{ Uint32 senderRef = req->senderRef; Uint32 senderData = req->senderData; // save req flags - const Uint32 reqTableId = req->getTableId(); - const Uint32 reqTableType = req->getTableType(); + const Uint32 reqTableId = req->oldGetTableId(); + const Uint32 reqTableType = req->oldGetTableType(); const bool reqListNames = req->getListNames(); const bool reqListIndexes = req->getListIndexes(); + // init the confs - ListTablesConf * conf = (ListTablesConf *)signal->getDataPtrSend(); + OldListTablesConf * conf = (OldListTablesConf *)signal->getDataPtrSend(); conf->senderData = senderData; conf->counter = 0; Uint32 pos = 0; @@ -8023,9 +8087,9 @@ Dbdict::execLIST_TABLES_REQ(Signal* sign pos++; } - if (pos >= ListTablesConf::DataLength) { + if (pos >= OldListTablesConf::DataLength) { sendSignal(senderRef, GSN_LIST_TABLES_CONF, signal, - ListTablesConf::SignalLength, JBB); + OldListTablesConf::SignalLength, JBB); conf->counter++; pos = 0; } @@ -8037,9 +8101,9 @@ Dbdict::execLIST_TABLES_REQ(Signal* sign const Uint32 size = name.size(); conf->tableData[pos] = size; pos++; - if (pos >= ListTablesConf::DataLength) { + if (pos >= OldListTablesConf::DataLength) { sendSignal(senderRef, GSN_LIST_TABLES_CONF, signal, - ListTablesConf::SignalLength, JBB); + OldListTablesConf::SignalLength, JBB); conf->counter++; pos = 0; } @@ -8055,9 +8119,9 @@ Dbdict::execLIST_TABLES_REQ(Signal* sign *p++ = 0; } pos++; - if (pos >= ListTablesConf::DataLength) { + if (pos >= OldListTablesConf::DataLength) { sendSignal(senderRef, GSN_LIST_TABLES_CONF, signal, - ListTablesConf::SignalLength, JBB); + OldListTablesConf::SignalLength, JBB); conf->counter++; pos = 0; } @@ -8065,7 +8129,292 @@ Dbdict::execLIST_TABLES_REQ(Signal* sign } // last signal must have less than max length sendSignal(senderRef, GSN_LIST_TABLES_CONF, signal, - ListTablesConf::HeaderLength + pos, JBB); + OldListTablesConf::HeaderLength + pos, JBB); +} + +void Dbdict::sendLIST_TABLES_CONF(Signal* signal, ListTablesReq* req) +{ + Uint32 senderRef = req->senderRef; + Uint32 senderData = req->senderData; + // save req flags + const Uint32 reqTableId = req->getTableId(); + const Uint32 reqTableType = req->getTableType(); + const bool reqListNames = req->getListNames(); + const bool reqListIndexes = req->getListIndexes(); + + NodeReceiverGroup rg(senderRef); + + DLHashTable::Iterator iter; + bool done = !c_obj_hash.first(iter); + + if (done) + { + /* + * Empty hashtable, send empty signal + */ + jam(); + ListTablesConf * const conf = (ListTablesConf*)signal->getDataPtrSend(); + conf->senderData = senderData; + conf->noOfTables = 0; + sendSignal(rg, GSN_LIST_TABLES_CONF, signal, + ListTablesConf::SignalLength, JBB); + return; + } + + /* + Pack table data and table names (if requested) in + two signal segments and send it in one long fragmented + signal + */ + ListTablesData ltd; + const Uint32 listTablesDataSizeInWords = (sizeof(ListTablesData) + 3) / 4; + char tname[MAX_TAB_NAME_SIZE]; + SimplePropertiesSectionWriter tableDataWriter(getSectionSegmentPool()); + SimplePropertiesSectionWriter tableNamesWriter(getSectionSegmentPool()); + + Uint32 count = 0; + Uint32 fragId = rand(); + Uint32 fragInfo = 0; + const Uint32 fragSize = 240; + + tableDataWriter.first(); + tableNamesWriter.first(); + while(true) + { + Uint32 type = iter.curr.p->m_type; + + if ((reqTableType != (Uint32)0) && (reqTableType != type)) + goto flush; + + if (reqListIndexes && !DictTabInfo::isIndex(type)) + goto flush; + + TableRecordPtr tablePtr; + if (DictTabInfo::isTable(type) || DictTabInfo::isIndex(type)){ + c_tableRecordPool.getPtr(tablePtr, iter.curr.p->m_id); + + if(reqListIndexes && (reqTableId != tablePtr.p->primaryTableId)) + goto flush; + + ltd.requestData = 0; // clear + ltd.setTableId(tablePtr.i); // id + ltd.setTableType(type); // type + // state + + if(DictTabInfo::isTable(type)){ + switch (tablePtr.p->tabState) { + case TableRecord::DEFINING: + ltd.setTableState(DictTabInfo::StateBuilding); + break; + case TableRecord::PREPARE_DROPPING: + case TableRecord::DROPPING: + ltd.setTableState(DictTabInfo::StateDropping); + break; + case TableRecord::DEFINED: + ltd.setTableState(DictTabInfo::StateOnline); + break; + case TableRecord::BACKUP_ONGOING: + ltd.setTableState(DictTabInfo::StateBackup); + break; + default: + ltd.setTableState(DictTabInfo::StateBroken); + break; + } + } + if (tablePtr.p->isIndex()) { + switch (tablePtr.p->indexState) { + case TableRecord::IS_OFFLINE: + ltd.setTableState(DictTabInfo::StateOffline); + break; + case TableRecord::IS_BUILDING: + ltd.setTableState(DictTabInfo::StateBuilding); + break; + case TableRecord::IS_DROPPING: + ltd.setTableState(DictTabInfo::StateDropping); + break; + case TableRecord::IS_ONLINE: + ltd.setTableState(DictTabInfo::StateOnline); + break; + default: + ltd.setTableState(DictTabInfo::StateBroken); + break; + } + } + // Logging status + if (! (tablePtr.p->m_bits & TableRecord::TR_Logged)) { + ltd.setTableStore(DictTabInfo::StoreNotLogged); + } else { + ltd.setTableStore(DictTabInfo::StorePermanent); + } + // Temporary status + if (tablePtr.p->m_bits & TableRecord::TR_Temporary) { + ltd.setTableTemp(NDB_TEMP_TAB_TEMPORARY); + } else { + ltd.setTableTemp(NDB_TEMP_TAB_PERMANENT); + } + } + if(DictTabInfo::isTrigger(type)){ + TriggerRecordPtr triggerPtr; + c_triggerRecordPool.getPtr(triggerPtr, iter.curr.p->m_id); + + ltd.requestData = 0; + ltd.setTableId(triggerPtr.i); + ltd.setTableType(type); + switch (triggerPtr.p->triggerState) { + case TriggerRecord::TS_OFFLINE: + ltd.setTableState(DictTabInfo::StateOffline); + break; + case TriggerRecord::TS_ONLINE: + ltd.setTableState(DictTabInfo::StateOnline); + break; + default: + ltd.setTableState(DictTabInfo::StateBroken); + break; + } + ltd.setTableStore(DictTabInfo::StoreNotLogged); + } + if (DictTabInfo::isFilegroup(type)){ + jam(); + ltd.requestData = 0; + ltd.setTableId(iter.curr.p->m_id); + ltd.setTableType(type); // type + ltd.setTableState(DictTabInfo::StateOnline); // XXX todo + } + if (DictTabInfo::isFile(type)){ + jam(); + ltd.requestData = 0; + ltd.setTableId(iter.curr.p->m_id); + ltd.setTableType(type); // type + ltd.setTableState(DictTabInfo::StateOnline); // XXX todo + } + tableDataWriter.putWords((Uint32 *) <d, listTablesDataSizeInWords); + count++; + + if (reqListNames) + { + jam(); + Rope name(c_rope_pool, iter.curr.p->m_name); + const Uint32 size = name.size(); // String length including \0 + const Uint32 wsize = (size + 3) / 4; + tableNamesWriter.putWord(size); + name.copy(tname); + tableNamesWriter.putWords((Uint32 *) tname, wsize); + } + +flush: + Uint32 tableDataWords = tableDataWriter.getWordsUsed(); + Uint32 tableNameWords = tableNamesWriter.getWordsUsed(); + + done = !c_obj_hash.next(iter); + if ((tableDataWords + tableNameWords) > fragSize || done) + { + jam(); + + /* + * Flush signal fragment to keep memory usage down + */ + Uint32 sigLen = ListTablesConf::SignalLength; + Uint32 secs = 0; + if (tableDataWords != 0) + { + jam(); + secs++; + } + if (tableNameWords != 0) + { + jam(); + secs++; + } + Uint32 * secNos = &signal->theData[sigLen]; + signal->theData[sigLen + secs] = fragId; + switch (secs) { + case(0): + jam(); + sigLen++; // + fragId; + break; + case(1): + { + jam(); + SegmentedSectionPtr segSecPtr; + sigLen += 2; // 1 sections + fragid + if (tableNameWords == 0) + { + tableDataWriter.getPtr(segSecPtr); + secNos[0] = ListTablesConf::TABLE_DATA;; + } + else + { + tableNamesWriter.getPtr(segSecPtr); + secNos[0] = ListTablesConf::TABLE_NAMES; + } + signal->setSection(segSecPtr, 0); + break; + } + case(2): + { + jam(); + sigLen += 3; // 2 sections + fragid + SegmentedSectionPtr tableDataPtr; + tableDataWriter.getPtr(tableDataPtr); + signal->setSection(tableDataPtr, ListTablesConf::TABLE_DATA); + SegmentedSectionPtr tableNamesPtr; + tableNamesWriter.getPtr(tableNamesPtr); + signal->setSection(tableNamesPtr, ListTablesConf::TABLE_NAMES); + secNos[0] = ListTablesConf::TABLE_DATA; + secNos[1] = ListTablesConf::TABLE_NAMES; + break; + } + } + + if (done) + { + jam(); + if (fragInfo) + { + jam(); + fragInfo = 3; + } + } + else + { + jam(); + if (fragInfo == 0) + { + jam(); + fragInfo = 1; + } + else + { + jam(); + fragInfo = 2; + } + } + signal->header.m_fragmentInfo = fragInfo; + + ListTablesConf * const conf = (ListTablesConf*)signal->getDataPtrSend(); + conf->senderData = senderData; + conf->noOfTables = count; + sendSignal(rg, GSN_LIST_TABLES_CONF, signal, + sigLen, JBB); + + signal->header.m_noOfSections = 0; + signal->header.m_fragmentInfo = 0; + + if (done) + { + jam(); + return; + } + + /** + * Reset counter for next signal + * Reset buffers + */ + count = 0; + tableDataWriter.first(); + tableNamesWriter.first(); + } + } } /** @@ -14146,14 +14495,14 @@ Dbdict::execDICT_LOCK_REQ(Signal* signal if (c_outstanding_sub_startstop) { jam(); - g_eventLogger.info("refing dict lock to %u", refToNode(req.userRef)); + g_eventLogger->info("refing dict lock to %u", refToNode(req.userRef)); sendDictLockRef(signal, req, DictLockRef::TooManyRequests); return; } c_sub_startstop_lock.set(refToNode(req.userRef)); - g_eventLogger.info("granting dict lock to %u", refToNode(req.userRef)); + g_eventLogger->info("granting dict lock to %u", refToNode(req.userRef)); DictLockConf* conf = (DictLockConf*)signal->getDataPtrSend(); conf->userPtr = req.userPtr; conf->lockType = req.lockType; @@ -14270,7 +14619,7 @@ Dbdict::execDICT_UNLOCK_ORD(Signal* sign if (ord->lockType == DictLockReq::SumaStartMe) { ndbassert(signal->getLength() == DictUnlockOrd::SignalLengthSuma); - g_eventLogger.info("clearing dict lock for %u", refToNode(ord->senderRef)); + g_eventLogger->info("clearing dict lock for %u", refToNode(ord->senderRef)); c_sub_startstop_lock.clear(refToNode(ord->senderRef)); return; } === modified file 'storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp' --- a/storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp 2008-02-20 09:04:29 +0000 +++ b/storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp 2008-05-30 08:03:55 +0000 @@ -41,6 +41,7 @@ #include #include #include +#include #include #include #include @@ -197,6 +198,7 @@ public: typedef Ptr AttributeRecordPtr; ArrayPool c_attributeRecordPool; DLHashTable c_attributeRecordHash; + RSS_AP_SNAPSHOT(c_attributeRecordPool); /** * Shared table / index record. Most of this is permanent data stored @@ -383,6 +385,7 @@ public: typedef Ptr TableRecordPtr; ArrayPool c_tableRecordPool; + RSS_AP_SNAPSHOT(c_tableRecordPool); /** Node Group and Tablespace id+version + range or list data. * This is only stored temporarily in DBDICT during an ongoing @@ -462,6 +465,7 @@ public: Uint32 c_maxNoOfTriggers; typedef Ptr TriggerRecordPtr; ArrayPool c_triggerRecordPool; + RSS_AP_SNAPSHOT(c_triggerRecordPool); /** * Information for each FS connection. @@ -611,6 +615,7 @@ public: Filegroup_hash c_filegroup_hash; RopePool c_rope_pool; + RSS_AP_SNAPSHOT(c_rope_pool); struct DictObject { DictObject() {} @@ -642,6 +647,7 @@ public: DLHashTable c_obj_hash; // Name ArrayPool c_obj_pool; + RSS_AP_SNAPSHOT(c_obj_pool); DictObject * get_object(const char * name){ return get_object(name, strlen(name) + 1); @@ -1119,6 +1125,7 @@ private: * Temporary structure used when parsing table info */ struct ParseDictTabInfoRecord { + ParseDictTabInfoRecord() { tablePtr.setNull();} DictTabInfo::RequestType requestType; Uint32 errorCode; Uint32 errorLine; @@ -2673,6 +2680,9 @@ public: int checkSingleUserMode(Uint32 senderRef); + void sendOLD_LIST_TABLES_CONF(Signal *signal, ListTablesReq*); + void sendLIST_TABLES_CONF(Signal *signal, ListTablesReq*); + Uint32 c_outstanding_sub_startstop; NdbNodeBitmask c_sub_startstop_lock; === modified file 'storage/ndb/src/kernel/blocks/dbdict/Makefile.am' --- a/storage/ndb/src/kernel/blocks/dbdict/Makefile.am 2006-12-31 00:32:21 +0000 +++ b/storage/ndb/src/kernel/blocks/dbdict/Makefile.am 2008-04-25 06:32:23 +0000 @@ -19,17 +19,17 @@ include $(top_srcdir)/storage/ndb/config LDADD += \ $(top_builddir)/storage/ndb/src/common/util/libgeneral.la \ $(top_builddir)/storage/ndb/src/common/portlib/libportlib.la \ - $(top_builddir)/dbug/libdbug.a \ - $(top_builddir)/mysys/libmysys.a \ - $(top_builddir)/strings/libmystrings.a + $(top_builddir)/dbug/libdbuglt.la \ + $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/strings/libmystringslt.la ndbtools_PROGRAMS = ndb_print_schema_file ndb_print_schema_file_SOURCES = printSchemaFile.cpp ndb_print_schema_file_LDFLAGS = @ndb_bin_am_ldflags@ \ $(top_builddir)/storage/ndb/src/libndbclient.la \ - $(top_builddir)/dbug/libdbug.a \ - $(top_builddir)/mysys/libmysys.a \ - $(top_builddir)/strings/libmystrings.a + $(top_builddir)/dbug/libdbuglt.la \ + $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/strings/libmystringslt.la # Don't update the files from bitkeeper %::SCCS/s.% === modified file 'storage/ndb/src/kernel/blocks/dbdih/Dbdih.hpp' --- a/storage/ndb/src/kernel/blocks/dbdih/Dbdih.hpp 2008-03-12 09:29:12 +0000 +++ b/storage/ndb/src/kernel/blocks/dbdih/Dbdih.hpp 2008-04-23 14:29:01 +0000 @@ -1399,6 +1399,9 @@ private: Uint32 m_masterLcpDihRef; bool m_MASTER_LCPREQ_Received; Uint32 m_MASTER_LCPREQ_FailedNodeId; + + Uint32 m_lastLCP_COMPLETE_REP_id; + Uint32 m_lastLCP_COMPLETE_REP_ref; } c_lcpState; /*------------------------------------------------------------------------*/ === modified file 'storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp' --- a/storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp 2008-03-12 09:29:12 +0000 +++ b/storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp 2008-04-23 14:29:01 +0000 @@ -72,7 +72,7 @@ #include #include -extern EventLogger g_eventLogger; +extern EventLogger * g_eventLogger; #define SYSFILE ((Sysfile *)&sysfileData[0]) @@ -2064,8 +2064,8 @@ ref: if (getNodeStatus(nodeId) != NodeRecord::DEAD) { jam(); - g_eventLogger.error("nodeStatus in START_PERMREQ = %u", - (Uint32) getNodeStatus(nodeId)); + g_eventLogger->error("nodeStatus in START_PERMREQ = %u", + (Uint32) getNodeStatus(nodeId)); goto ref; }//if @@ -4597,9 +4597,9 @@ void Dbdih::checkCopyTab(Signal* signal, jam(); break; default: - g_eventLogger.error("outstanding gsn: %s(%d)", - getSignalName(c_nodeStartMaster.m_outstandingGsn), - c_nodeStartMaster.m_outstandingGsn); + g_eventLogger->error("outstanding gsn: %s(%d)", + getSignalName(c_nodeStartMaster.m_outstandingGsn), + c_nodeStartMaster.m_outstandingGsn); ndbrequire(false); } @@ -5067,10 +5067,10 @@ void Dbdih::failedNodeLcpHandling(Signal failedNodePtr.p->activeStatus = Sysfile::NS_NotActive_NotTakenOver; break; default: - g_eventLogger.error("activeStatus = %u " - "at failure after NODE_FAILREP of node = %u", - (Uint32) failedNodePtr.p->activeStatus, - failedNodePtr.i); + g_eventLogger->error("activeStatus = %u " + "at failure after NODE_FAILREP of node = %u", + (Uint32) failedNodePtr.p->activeStatus, + failedNodePtr.i); ndbrequire(false); break; }//switch @@ -5079,37 +5079,47 @@ void Dbdih::failedNodeLcpHandling(Signal c_lcpState.m_participatingDIH.clear(failedNodePtr.i); c_lcpState.m_participatingLQH.clear(failedNodePtr.i); - if(c_lcpState.m_LCP_COMPLETE_REP_Counter_DIH.isWaitingFor(failedNodePtr.i)){ + bool wf = c_MASTER_LCPREQ_Counter.isWaitingFor(failedNodePtr.i); + + if(c_lcpState.m_LCP_COMPLETE_REP_Counter_DIH.isWaitingFor(failedNodePtr.i)) + { jam(); LcpCompleteRep * rep = (LcpCompleteRep*)signal->getDataPtrSend(); rep->nodeId = failedNodePtr.i; rep->lcpId = SYSFILE->latestLCP_ID; rep->blockNo = DBDIH; sendSignal(reference(), GSN_LCP_COMPLETE_REP, signal, - LcpCompleteRep::SignalLength, JBB); + LcpCompleteRep::SignalLength, JBB); } - - /** - * Check if we'r waiting for the failed node's LQH to complete - * - * Note that this is ran "before" LCP master take over - */ - if(c_lcpState.m_LCP_COMPLETE_REP_Counter_LQH.isWaitingFor(nodeId)){ + + bool lcp_complete_rep = false; + if (!wf) + { jam(); - - LcpCompleteRep * rep = (LcpCompleteRep*)signal->getDataPtrSend(); - rep->nodeId = nodeId; - rep->lcpId = SYSFILE->latestLCP_ID; - rep->blockNo = DBLQH; - sendSignal(reference(), GSN_LCP_COMPLETE_REP, signal, - LcpCompleteRep::SignalLength, JBB); - - if(c_lcpState.m_LAST_LCP_FRAG_ORD.isWaitingFor(nodeId)){ + + /** + * Check if we'r waiting for the failed node's LQH to complete + * + * Note that this is ran "before" LCP master take over + */ + if(c_lcpState.m_LCP_COMPLETE_REP_Counter_LQH.isWaitingFor(nodeId)){ jam(); - /** - * Make sure we're ready to accept it - */ - c_lcpState.m_LAST_LCP_FRAG_ORD.clearWaitingFor(nodeId); + + lcp_complete_rep = true; + LcpCompleteRep * rep = (LcpCompleteRep*)signal->getDataPtrSend(); + rep->nodeId = nodeId; + rep->lcpId = SYSFILE->latestLCP_ID; + rep->blockNo = DBLQH; + sendSignal(reference(), GSN_LCP_COMPLETE_REP, signal, + LcpCompleteRep::SignalLength, JBB); + + if(c_lcpState.m_LAST_LCP_FRAG_ORD.isWaitingFor(nodeId)){ + jam(); + /** + * Make sure we're ready to accept it + */ + c_lcpState.m_LAST_LCP_FRAG_ORD.clearWaitingFor(nodeId); + } } } @@ -5135,7 +5145,9 @@ void Dbdih::failedNodeLcpHandling(Signal StartLcpConf::SignalLength, JBB); }//if - if (c_EMPTY_LCP_REQ_Counter.isWaitingFor(failedNodePtr.i)) { +dosend: + if (c_EMPTY_LCP_REQ_Counter.isWaitingFor(failedNodePtr.i)) + { jam(); EmptyLcpConf * const rep = (EmptyLcpConf *)&signal->theData[0]; rep->senderNodeId = failedNodePtr.i; @@ -5146,8 +5158,14 @@ void Dbdih::failedNodeLcpHandling(Signal rep->idle = true; sendSignal(reference(), GSN_EMPTY_LCP_CONF, signal, EmptyLcpConf::SignalLength, JBB); - }//if - + } + else if (!c_EMPTY_LCP_REQ_Counter.done() && lcp_complete_rep) + { + jam(); + c_EMPTY_LCP_REQ_Counter.setWaitingFor(failedNodePtr.i); + goto dosend; + } + if (c_MASTER_LCPREQ_Counter.isWaitingFor(failedNodePtr.i)) { jam(); MasterLCPRef * const ref = (MasterLCPRef *)&signal->theData[0]; @@ -5221,19 +5239,35 @@ Dbdih::startLcpMasterTakeOver(Signal* si c_lcpMasterTakeOverState.set(LMTOS_WAIT_EMPTY_LCP, __LINE__); - if(c_EMPTY_LCP_REQ_Counter.done()){ - jam(); - c_lcpState.m_LAST_LCP_FRAG_ORD.clearWaitingFor(); - - EmptyLcpReq* req = (EmptyLcpReq*)signal->getDataPtrSend(); - req->senderRef = reference(); - sendLoopMacro(EMPTY_LCP_REQ, sendEMPTY_LCP_REQ); - ndbrequire(!c_EMPTY_LCP_REQ_Counter.done()); - } else { - /** - * Node failure during master take over... - */ - g_eventLogger.info("Nodefail during master take over (old: %d)", oldNode); + EmptyLcpReq* req = (EmptyLcpReq*)signal->getDataPtrSend(); + req->senderRef = reference(); + { + NodeRecordPtr specNodePtr; + specNodePtr.i = cfirstAliveNode; + do { + jam(); + ptrCheckGuard(specNodePtr, MAX_NDB_NODES, nodeRecord); + if (!c_EMPTY_LCP_REQ_Counter.isWaitingFor(specNodePtr.i)) + { + jam(); + c_EMPTY_LCP_REQ_Counter.setWaitingFor(specNodePtr.i); + if (!(ERROR_INSERTED(7209) && specNodePtr.i == getOwnNodeId())) + { + sendEMPTY_LCP_REQ(signal, specNodePtr.i); + } + else + { + ndbout_c("NOT sending EMPTY_LCP_REQ to %u", specNodePtr.i); + } + + if (c_lcpState.m_LAST_LCP_FRAG_ORD.isWaitingFor(specNodePtr.i)) + { + jam(); + c_lcpState.m_LAST_LCP_FRAG_ORD.clearWaitingFor(); + } + } + specNodePtr.i = specNodePtr.p->nextNode; + } while (specNodePtr.i != RNIL); } NodeRecordPtr nodePtr; @@ -5510,8 +5544,8 @@ void Dbdih::execMASTER_GCPCONF(Signal* s if (latestLcpId > SYSFILE->latestLCP_ID) { jam(); #if 0 - g_eventLogger.info("Dbdih: Setting SYSFILE->latestLCP_ID to %d", - latestLcpId); + g_eventLogger->info("Dbdih: Setting SYSFILE->latestLCP_ID to %d", + latestLcpId); SYSFILE->latestLCP_ID = latestLcpId; #endif SYSFILE->keepGCI = oldestKeepGci; @@ -6114,10 +6148,10 @@ Dbdih::checkLocalNodefailComplete(Signal if (ERROR_INSERTED(7030)) { - g_eventLogger.info("Reenable GCP_PREPARE"); + g_eventLogger->info("Reenable GCP_PREPARE"); CLEAR_ERROR_INSERT_VALUE; } - + NFCompleteRep * const nf = (NFCompleteRep *)&signal->theData[0]; nf->blockNo = DBDIH; nf->nodeId = cownNodeId; @@ -6164,6 +6198,9 @@ void Dbdih::execEMPTY_LCP_CONF(Signal* s const EmptyLcpConf * const conf = (EmptyLcpConf *)&signal->theData[0]; Uint32 nodeId = conf->senderNodeId; + CRASH_INSERTION(7206); + + if(!conf->idle){ jam(); if (conf->tableId < c_lcpMasterTakeOverState.minTableId) { @@ -6241,6 +6278,25 @@ void Dbdih::execMASTER_LCPREQ(Signal* si jamEntry(); const BlockReference newMasterBlockref = req->masterRef; + CRASH_INSERTION(7205); + + if (ERROR_INSERTED(7207)) + { + jam(); + SET_ERROR_INSERT_VALUE(7208); + sendSignalWithDelay(reference(), GSN_MASTER_LCPREQ, signal, + 500, signal->getLength()); + return; + } + + if (ERROR_INSERTED(7208)) + { + jam(); + signal->theData[0] = 9999; + sendSignal(numberToRef(CMVMI, refToNode(newMasterBlockref)), + GSN_NDB_TAMPER, signal, 1, JBB); + } + if (newMasterBlockref != cmasterdihref) { jam(); @@ -6263,6 +6319,11 @@ void Dbdih::execMASTER_LCPREQ(Signal* si jam(); ndbrequire(0); } + + if (ERROR_INSERTED(7209)) + { + SET_ERROR_INSERT_VALUE(7210); + } sendMASTER_LCPCONF(signal); }//Dbdih::execMASTER_LCPREQ() @@ -6305,7 +6366,7 @@ Dbdih::sendMASTER_LCPCONF(Signal * signa c_lcpState.setLcpStatus(LCP_STATUS_IDLE, __LINE__); #if 0 if(c_copyGCISlave.m_copyReason == CopyGCIReq::LOCAL_CHECKPOINT){ - g_eventLogger.info("Dbdih: Also resetting c_copyGCISlave"); + g_eventLogger->info("Dbdih: Also resetting c_copyGCISlave"); c_copyGCISlave.m_copyReason = CopyGCIReq::IDLE; c_copyGCISlave.m_expectedNextWord = 0; } @@ -6390,7 +6451,7 @@ Dbdih::sendMASTER_LCPCONF(Signal * signa if(c_lcpState.lcpStatus == LCP_TAB_SAVED){ #ifdef VM_TRACE - g_eventLogger.info("Sending extra GSN_LCP_COMPLETE_REP to new master"); + g_eventLogger->info("Sending extra GSN_LCP_COMPLETE_REP to new master"); #endif sendLCP_COMPLETE_REP(signal); } @@ -6557,7 +6618,7 @@ void Dbdih::execMASTER_LCPCONF(Signal* s CRASH_INSERTION(7180); #ifdef VM_TRACE - g_eventLogger.info("MASTER_LCPCONF"); + g_eventLogger->info("MASTER_LCPCONF"); printMASTER_LCP_CONF(stdout, &signal->theData[0], 0, 0); #endif @@ -6602,12 +6663,22 @@ void Dbdih::execMASTER_LCPREF(Signal* si { const MasterLCPRef * const ref = (MasterLCPRef *)&signal->theData[0]; jamEntry(); - receiveLoopMacro(MASTER_LCPREQ, ref->senderNodeId); + + Uint32 senderNodeId = ref->senderNodeId; + Uint32 failedNodeId = ref->failedNodeId; + + if (c_lcpState.m_LCP_COMPLETE_REP_Counter_LQH.isWaitingFor(senderNodeId)) + { + jam(); + c_lcpState.m_LCP_COMPLETE_REP_Counter_LQH.clearWaitingFor(senderNodeId); + } + + receiveLoopMacro(MASTER_LCPREQ, senderNodeId); /*-------------------------------------------------------------------------*/ // We have now received all responses and are ready to take over the LCP // protocol as master. /*-------------------------------------------------------------------------*/ - MASTER_LCPhandling(signal, ref->failedNodeId); + MASTER_LCPhandling(signal, failedNodeId); }//Dbdih::execMASTER_LCPREF() void Dbdih::MASTER_LCPhandling(Signal* signal, Uint32 failedNodeId) @@ -6634,7 +6705,7 @@ void Dbdih::MASTER_LCPhandling(Signal* s // protocol. /* --------------------------------------------------------------------- */ #ifdef VM_TRACE - g_eventLogger.info("MASTER_LCPhandling:: LMTOS_ALL_IDLE -> checkLcpStart"); + g_eventLogger->info("MASTER_LCPhandling:: LMTOS_ALL_IDLE -> checkLcpStart"); #endif checkLcpStart(signal, __LINE__); break; @@ -6645,7 +6716,7 @@ void Dbdih::MASTER_LCPhandling(Signal* s // protocol by calculating the keep gci and storing the new lcp id. /* --------------------------------------------------------------------- */ #ifdef VM_TRACE - g_eventLogger.info("MASTER_LCPhandling:: LMTOS_COPY_ONGOING -> storeNewLcpId"); + g_eventLogger->info("MASTER_LCPhandling:: LMTOS_COPY_ONGOING -> storeNewLcpId"); #endif if (c_lcpState.lcpStatus == LCP_STATUS_ACTIVE) { jam(); @@ -6656,7 +6727,7 @@ void Dbdih::MASTER_LCPhandling(Signal* s /*---------------------------------------------------------------------*/ Uint32 lcpId = SYSFILE->latestLCP_ID; #ifdef VM_TRACE - g_eventLogger.info("Decreasing latestLCP_ID from %d to %d", lcpId, lcpId - 1); + g_eventLogger->info("Decreasing latestLCP_ID from %d to %d", lcpId, lcpId - 1); #endif SYSFILE->latestLCP_ID--; }//if @@ -6673,10 +6744,10 @@ void Dbdih::MASTER_LCPhandling(Signal* s * complete before finalising the LCP process. * ------------------------------------------------------------------ */ #ifdef VM_TRACE - g_eventLogger.info("MASTER_LCPhandling:: LMTOS_ALL_ACTIVE -> " - "startLcpRoundLoopLab(table=%u, fragment=%u)", - c_lcpMasterTakeOverState.minTableId, - c_lcpMasterTakeOverState.minFragId); + g_eventLogger->info("MASTER_LCPhandling:: LMTOS_ALL_ACTIVE -> " + "startLcpRoundLoopLab(table=%u, fragment=%u)", + c_lcpMasterTakeOverState.minTableId, + c_lcpMasterTakeOverState.minFragId); #endif c_lcpState.keepGci = SYSFILE->keepGCI; @@ -8540,7 +8611,7 @@ void Dbdih::GCP_SAVEhandling(Signal* sig getNodeState().startLevel == NodeState::SL_STARTED){ jam(); #if 0 - g_eventLogger.info("Dbdih: Clearing initial start ongoing"); + g_eventLogger->info("Dbdih: Clearing initial start ongoing"); #endif Sysfile::clearInitialStartOngoing(SYSFILE->systemRestartBits); } @@ -8562,7 +8633,7 @@ void Dbdih::execGCP_PREPARE(Signal* sign if (ERROR_INSERTED(7030)) { cgckptflag = true; - g_eventLogger.info("Delayed GCP_PREPARE 5s"); + g_eventLogger->info("Delayed GCP_PREPARE 5s"); sendSignalWithDelay(reference(), GSN_GCP_PREPARE, signal, 5000, signal->getLength()); return; @@ -8620,7 +8691,7 @@ void Dbdih::execGCP_PREPARE(Signal* sign if (ERROR_INSERTED(7031)) { - g_eventLogger.info("Crashing delayed in GCP_PREPARE 3s"); + g_eventLogger->info("Crashing delayed in GCP_PREPARE 3s"); signal->theData[0] = 9999; sendSignalWithDelay(CMVMI_REF, GSN_NDB_TAMPER, signal, 3000, 1); return; @@ -9319,7 +9390,7 @@ void Dbdih::initLcpLab(Signal* signal, U * This is LCP master takeover */ #ifdef VM_TRACE - g_eventLogger.info("initLcpLab aborted due to LCP master takeover - 1"); + g_eventLogger->info("initLcpLab aborted due to LCP master takeover - 1"); #endif c_lcpState.setLcpStatus(LCP_STATUS_IDLE, __LINE__); sendMASTER_LCPCONF(signal); @@ -9332,7 +9403,7 @@ void Dbdih::initLcpLab(Signal* signal, U * Master take over but has not yet received MASTER_LCPREQ */ #ifdef VM_TRACE - g_eventLogger.info("initLcpLab aborted due to LCP master takeover - 2"); + g_eventLogger->info("initLcpLab aborted due to LCP master takeover - 2"); #endif return; } @@ -10641,10 +10712,10 @@ void Dbdih::checkTcCounterLab(Signal* si { CRASH_INSERTION(7009); if (c_lcpState.lcpStatus != LCP_STATUS_IDLE) { - g_eventLogger.error("lcpStatus = %u" - "lcpStatusUpdatedPlace = %d", - (Uint32) c_lcpState.lcpStatus, - c_lcpState.lcpStatusUpdatedPlace); + g_eventLogger->error("lcpStatus = %u" + "lcpStatusUpdatedPlace = %d", + (Uint32) c_lcpState.lcpStatus, + c_lcpState.lcpStatusUpdatedPlace); ndbrequire(false); return; }//if @@ -11237,8 +11308,8 @@ void Dbdih::execLCP_FRAG_REP(Signal* sig if(tabPtr.p->tabStatus == TabRecord::TS_DROPPING){ jam(); - g_eventLogger.info("TS_DROPPING - Neglecting to save Table: %d Frag: %d - ", - tableId, fragId); + g_eventLogger->info("TS_DROPPING - Neglecting to save Table: %d Frag: %d - ", + tableId, fragId); } else { jam(); /** @@ -11251,7 +11322,15 @@ void Dbdih::execLCP_FRAG_REP(Signal* sig signal->theData[1] = tabPtr.i; sendSignal(reference(), GSN_CONTINUEB, signal, 2, JBB); - checkLcpAllTablesDoneInLqh(); + bool ret = checkLcpAllTablesDoneInLqh(); + if (ret && ERROR_INSERTED(7209)) + { + jam(); + + signal->theData[0] = 9999; + sendSignal(numberToRef(CMVMI, cmasterNodeId), + GSN_NDB_TAMPER, signal, 1, JBB); + } } } @@ -11375,7 +11454,7 @@ void Dbdih::findReplica(ReplicaRecordPtr }; #ifdef VM_TRACE - g_eventLogger.info("Fragment Replica(node=%d) not found", nodeId); + g_eventLogger->info("Fragment Replica(node=%d) not found", nodeId); replicaPtr.i = fragPtrP->oldStoredReplicas; while(replicaPtr.i != RNIL){ ptrCheckGuard(replicaPtr, creplicaFileSize, replicaRecord); @@ -11388,9 +11467,9 @@ void Dbdih::findReplica(ReplicaRecordPtr }//if }; if(replicaPtr.i != RNIL){ - g_eventLogger.info("...But was found in oldStoredReplicas"); + g_eventLogger->info("...But was found in oldStoredReplicas"); } else { - g_eventLogger.info("...And wasn't found in oldStoredReplicas"); + g_eventLogger->info("...And wasn't found in oldStoredReplicas"); } #endif ndbrequire(false); @@ -11455,8 +11534,8 @@ Dbdih::reportLcpCompletion(const LcpFrag if(lcpNo != replicaPtr.p->nextLcp){ if (handle_invalid_lcp_no(lcpReport, replicaPtr)) { - g_eventLogger.error("lcpNo = %d replicaPtr.p->nextLcp = %d", - lcpNo, replicaPtr.p->nextLcp); + g_eventLogger->error("lcpNo = %d replicaPtr.p->nextLcp = %d", + lcpNo, replicaPtr.p->nextLcp); ndbrequire(false); } } @@ -11492,7 +11571,7 @@ Dbdih::reportLcpCompletion(const LcpFrag // Not all fragments in table have been checkpointed. /* ----------------------------------------------------------------- */ if(0) - g_eventLogger.info("reportLcpCompletion: fragment %d not ready", fid); + g_eventLogger->info("reportLcpCompletion: fragment %d not ready", fid); return false; }//if }//for @@ -11580,12 +11659,30 @@ void Dbdih::checkLcpCompletedLab(Signal* CRASH_INSERTION2(7027, isMaster()); CRASH_INSERTION2(7018, !isMaster()); - if(c_lcpState.lcpStatus == LCP_TAB_COMPLETED){ + if(c_lcpState.lcpStatus == LCP_TAB_COMPLETED) + { /** * We'r done */ + + if (ERROR_INSERTED(7209)) + { + signal->theData[0] = DihContinueB::ZCHECK_LCP_COMPLETED; + sendSignal(reference(), GSN_CONTINUEB, signal, 1, JBB); + return; + } + c_lcpState.setLcpStatus(LCP_TAB_SAVED, __LINE__); sendLCP_COMPLETE_REP(signal); + + if (ERROR_INSERTED(7210)) + { + CLEAR_ERROR_INSERT_VALUE; + EmptyLcpReq* req = (EmptyLcpReq*)signal->getDataPtr(); + req->senderRef = reference(); + sendEMPTY_LCP_REQ(signal, getOwnNodeId()); + } + return; } @@ -11597,13 +11694,28 @@ void Dbdih::checkLcpCompletedLab(Signal* void Dbdih::sendLCP_COMPLETE_REP(Signal* signal){ jam(); - LcpCompleteRep * rep = (LcpCompleteRep*)signal->getDataPtrSend(); - rep->nodeId = getOwnNodeId(); - rep->lcpId = SYSFILE->latestLCP_ID; - rep->blockNo = DBDIH; - - sendSignal(c_lcpState.m_masterLcpDihRef, GSN_LCP_COMPLETE_REP, signal, - LcpCompleteRep::SignalLength, JBB); + + /** + * Quick and dirty fix for bug#36276 dont save + * LCP_COMPLETE_REP to same node same LCP twice + */ + bool alreadysent = + c_lcpState.m_lastLCP_COMPLETE_REP_id == SYSFILE->latestLCP_ID && + c_lcpState.m_lastLCP_COMPLETE_REP_ref == c_lcpState.m_masterLcpDihRef; + + if (!alreadysent) + { + LcpCompleteRep * rep = (LcpCompleteRep*)signal->getDataPtrSend(); + rep->nodeId = getOwnNodeId(); + rep->lcpId = SYSFILE->latestLCP_ID; + rep->blockNo = DBDIH; + + sendSignal(c_lcpState.m_masterLcpDihRef, GSN_LCP_COMPLETE_REP, signal, + LcpCompleteRep::SignalLength, JBB); + + c_lcpState.m_lastLCP_COMPLETE_REP_id = SYSFILE->latestLCP_ID; + c_lcpState.m_lastLCP_COMPLETE_REP_ref = c_lcpState.m_masterLcpDihRef; + } /** * Say that an initial node restart does not need to be redone @@ -11627,7 +11739,7 @@ void Dbdih::execLCP_COMPLETE_REP(Signal* CRASH_INSERTION(7191); #if 0 - g_eventLogger.info("LCP_COMPLETE_REP"); + g_eventLogger->info("LCP_COMPLETE_REP"); printLCP_COMPLETE_REP(stdout, signal->getDataPtr(), signal->length(), number()); @@ -11713,7 +11825,7 @@ void Dbdih::allNodesLcpCompletedLab(Sign if(c_lcpMasterTakeOverState.state != LMTOS_IDLE){ jam(); #ifdef VM_TRACE - g_eventLogger.info("Exiting from allNodesLcpCompletedLab"); + g_eventLogger->info("Exiting from allNodesLcpCompletedLab"); #endif return; } @@ -12869,7 +12981,7 @@ void Dbdih::initCommonData() c_lcpState.ctimer = 0; c_lcpState.immediateLcpStart = false; c_lcpState.m_MASTER_LCPREQ_Received = false; - + c_lcpState.m_lastLCP_COMPLETE_REP_ref = 0; cmasterdihref = 0; cmasterNodeId = 0; cmasterState = MASTER_IDLE; @@ -14446,9 +14558,9 @@ void Dbdih::setLcpActiveStatusEnd() nodePtr.i = getOwnNodeId(); ptrAss(nodePtr, nodeRecord); ndbrequire(nodePtr.p->activeStatus == Sysfile::NS_Active); - g_eventLogger.info("NR: setLcpActiveStatusEnd - m_participatingLQH"); + g_eventLogger->info("NR: setLcpActiveStatusEnd - m_participatingLQH"); } else { - g_eventLogger.info("NR: setLcpActiveStatusEnd - !m_participatingLQH"); + g_eventLogger->info("NR: setLcpActiveStatusEnd - !m_participatingLQH"); } } @@ -15228,9 +15340,9 @@ Dbdih::execDUMP_STATE_ORD(Signal* signal warningEvent("gsn: %d block: %s, length: %d theData: %s", gsn, getBlockName(block, "UNKNOWN"), length, buf); - g_eventLogger.warning("-- SENDING CUSTOM SIGNAL --"); - g_eventLogger.warning("gsn: %d block: %s, length: %d theData: %s", - gsn, getBlockName(block, "UNKNOWN"), length, buf); + g_eventLogger->warning("-- SENDING CUSTOM SIGNAL --"); + g_eventLogger->warning("gsn: %d block: %s, length: %d theData: %s", + gsn, getBlockName(block, "UNKNOWN"), length, buf); } if(arg == DumpStateOrd::DihDumpLCPState){ @@ -15291,8 +15403,8 @@ Dbdih::execDUMP_STATE_ORD(Signal* signal } if(arg == DumpStateOrd::EnableUndoDelayDataWrite){ - g_eventLogger.info("Dbdih:: delay write of datapages for table = %d", - dumpState->args[1]); + g_eventLogger->info("Dbdih:: delay write of datapages for table = %d", + dumpState->args[1]); // Send this dump to ACC and TUP EXECUTE_DIRECT(DBACC, GSN_DUMP_STATE_ORD, signal, 2); EXECUTE_DIRECT(DBTUP, GSN_DUMP_STATE_ORD, signal, 2); @@ -15309,13 +15421,13 @@ Dbdih::execDUMP_STATE_ORD(Signal* signal }//if if (signal->theData[0] == DumpStateOrd::DihMinTimeBetweenLCP) { // Set time between LCP to min value - g_eventLogger.info("Set time between LCP to min value"); + g_eventLogger->info("Set time between LCP to min value"); c_lcpState.clcpDelay = 0; // TimeBetweenLocalCheckpoints.min return; } if (signal->theData[0] == DumpStateOrd::DihMaxTimeBetweenLCP) { // Set time between LCP to max value - g_eventLogger.info("Set time between LCP to max value"); + g_eventLogger->info("Set time between LCP to max value"); c_lcpState.clcpDelay = 31; // TimeBetweenLocalCheckpoints.max return; } @@ -15353,7 +15465,7 @@ Dbdih::execDUMP_STATE_ORD(Signal* signal tmp = signal->theData[1]; } m_gcp_save.m_master.m_time_between_gcp = tmp; - g_eventLogger.info("Setting time between gcp : %d", tmp); + g_eventLogger->info("Setting time between gcp : %d", tmp); } if (arg == 7021 && signal->getLength() == 2) @@ -15487,7 +15599,7 @@ Dbdih::execPREP_DROP_TAB_REQ(Signal* sig while(index < count){ if(nodePtr.p->queuedChkpt[index].tableId == tabPtr.i){ jam(); - // g_eventLogger.info("Unqueuing %d", index); + // g_eventLogger->info("Unqueuing %d", index); count--; for(Uint32 i = index; iinfo("This is the last table"); /** * Then check if saving of tab info is done for all tables @@ -15535,9 +15647,9 @@ Dbdih::execPREP_DROP_TAB_REQ(Signal* sig LcpStatus a = c_lcpState.lcpStatus; checkLcpCompletedLab(signal); - if(a != c_lcpState.lcpStatus){ - g_eventLogger.info("And all tables are written to already written disk"); - } + if(a != c_lcpState.lcpStatus){ + g_eventLogger->info("And all tables are written to already written disk"); + } } break; } === modified file 'storage/ndb/src/kernel/blocks/dbdih/Makefile.am' --- a/storage/ndb/src/kernel/blocks/dbdih/Makefile.am 2006-12-31 00:32:21 +0000 +++ b/storage/ndb/src/kernel/blocks/dbdih/Makefile.am 2008-04-25 06:32:23 +0000 @@ -17,9 +17,9 @@ ndbtools_PROGRAMS = ndb_print_sys_file ndb_print_sys_file_SOURCES = printSysfile.cpp ndb_print_sys_file_LDFLAGS = @ndb_bin_am_ldflags@ \ $(top_builddir)/storage/ndb/src/libndbclient.la \ - $(top_builddir)/dbug/libdbug.a \ - $(top_builddir)/mysys/libmysys.a \ - $(top_builddir)/strings/libmystrings.a + $(top_builddir)/dbug/libdbuglt.la \ + $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/strings/libmystringslt.la include $(top_srcdir)/storage/ndb/config/common.mk.am === modified file 'storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp' --- a/storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp 2007-11-19 10:04:24 +0000 +++ b/storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp 2008-05-30 06:33:46 +0000 @@ -2647,6 +2647,7 @@ private: // Configurable FragrecordPtr fragptr; ArrayPool c_fragment_pool; + RSS_AP_SNAPSHOT(c_fragment_pool); #define ZGCPREC_FILE_SIZE 1 GcpRecord *gcpRecord; === modified file 'storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp' --- a/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp 2008-02-06 12:15:05 +0000 +++ b/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp 2008-05-30 06:33:46 +0000 @@ -7687,6 +7687,22 @@ void Dblqh::lqhTransNextLab(Signal* sign * * now scan markers */ + if (ERROR_INSERTED(5050)) + { + ndbout_c("send ZSCAN_MARKERS with 5s delay and killing master"); + CLEAR_ERROR_INSERT_VALUE; + signal->theData[0] = ZSCAN_MARKERS; + signal->theData[1] = tcNodeFailptr.i; + signal->theData[2] = 0; + signal->theData[3] = RNIL; + sendSignalWithDelay(cownref, GSN_CONTINUEB, signal, 5000, 4); + + signal->theData[0] = 9999; + sendSignal(numberToRef(CMVMI, + refToNode(tcNodeFailptr.p->newTcBlockref)), + GSN_NDB_TAMPER, signal, 1, JBB); + return; + } scanMarkers(signal, tcNodeFailptr.i, 0, RNIL); return; }//if @@ -7772,6 +7788,20 @@ Dblqh::scanMarkers(Signal* signal, tcNodeFailPtr.i = tcNodeFail; ptrCheckGuard(tcNodeFailPtr, ctcNodeFailrecFileSize, tcNodeFailRecord); const Uint32 crashedTcNodeId = tcNodeFailPtr.p->oldNodeId; + + if (tcNodeFailPtr.p->tcFailStatus == TcNodeFailRecord::TC_STATE_BREAK) + { + jam(); + + /* ---------------------------------------------------------------------- + * AN INTERRUPTION TO THIS NODE FAIL HANDLING WAS RECEIVED AND A NEW + * TC HAVE BEEN ASSIGNED TO TAKE OVER THE FAILED TC. PROBABLY THE OLD + * NEW TC HAVE FAILED. + * ---------------------------------------------------------------------- */ + tcNodeFailptr = tcNodeFailPtr; + lqhTransNextLab(signal); + return; + } CommitAckMarkerIterator iter; if(i == RNIL){ @@ -19695,6 +19725,18 @@ Dblqh::execDUMP_STATE_ORD(Signal* signal infoEvent(buf); } } + + if (arg == DumpStateOrd::SchemaResourceSnapshot) + { + RSS_AP_SNAPSHOT_SAVE(c_fragment_pool); + return; + } + + if (arg == DumpStateOrd::SchemaResourceCheckLeak) + { + RSS_AP_SNAPSHOT_CHECK(c_fragment_pool); + return; + } }//Dblqh::execDUMP_STATE_ORD() /* **************************************************************** */ === modified file 'storage/ndb/src/kernel/blocks/dblqh/Makefile.am' --- a/storage/ndb/src/kernel/blocks/dblqh/Makefile.am 2007-05-30 18:29:14 +0000 +++ b/storage/ndb/src/kernel/blocks/dblqh/Makefile.am 2008-04-25 06:32:23 +0000 @@ -23,9 +23,9 @@ include $(top_srcdir)/storage/ndb/config ndbd_redo_log_reader_LDFLAGS = @ndb_bin_am_ldflags@ \ $(top_builddir)/storage/ndb/src/libndbclient.la \ - $(top_builddir)/dbug/libdbug.a \ - $(top_builddir)/mysys/libmysys.a \ - $(top_builddir)/strings/libmystrings.a + $(top_builddir)/dbug/libdbuglt.la \ + $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/strings/libmystringslt.la # Don't update the files from bitkeeper %::SCCS/s.% === modified file 'storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp' --- a/storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp 2008-02-19 15:00:29 +0000 +++ b/storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp 2008-05-27 19:43:02 +0000 @@ -2746,6 +2746,8 @@ void Dbtc::execTCKEYREQ(Signal* signal) if (seizeCacheRecord(signal) != 0) { return; }//if + + CRASH_INSERTION(8063); TcConnectRecord * const regTcPtr = tcConnectptr.p; CacheRecord * const regCachePtr = cachePtr.p; @@ -4630,9 +4632,7 @@ void Dbtc::execCOMMITTED(Signal* signal) CLEAR_ERROR_INSERT_VALUE; return; }//if - if (ERROR_INSERTED(8030)) { - systemErrorLab(signal, __LINE__); - }//if + CRASH_INSERTION(8030); if (ERROR_INSERTED(8025)) { SET_ERROR_INSERT_VALUE(8026); return; @@ -7232,21 +7232,10 @@ void Dbtc::execNODE_FAILREP(Signal* sign }//if }//if - if (getOwnNodeId() != tnewMasterId) - { - jam(); - /** - * Only master does takeover currently - */ - hostptr.p->m_nf_bits &= ~HostRecord::NF_TAKEOVER; - } - else - { - jam(); - signal->theData[0] = hostptr.i; - sendSignal(cownref, GSN_TAKE_OVERTCREQ, signal, 1, JBB); - } - + jam(); + signal->theData[0] = hostptr.i; + sendSignal(cownref, GSN_TAKE_OVERTCREQ, signal, 1, JBB); + checkScanActiveInFailedLqh(signal, 0, hostptr.i); checkWaitDropTabFailedLqh(signal, hostptr.i, 0); // nodeid, tableid nodeFailCheckTransactions(signal, 0, hostptr.i); @@ -7270,6 +7259,14 @@ Dbtc::checkNodeFailComplete(Signal* sign sendSignal(cdihblockref, GSN_NF_COMPLETEREP, signal, NFCompleteRep::SignalLength, JBB); } + + CRASH_INSERTION(8058); + if (ERROR_INSERTED(8059)) + { + signal->theData[0] = 9999; + sendSignalWithDelay(numberToRef(CMVMI, hostptr.i), + GSN_NDB_TAMPER, signal, 100, 1); + } } void Dbtc::checkScanActiveInFailedLqh(Signal* signal, @@ -7338,30 +7335,44 @@ Dbtc::nodeFailCheckTransactions(Signal* Ptr transPtr; Uint32 TtcTimer = ctcTimer; Uint32 TapplTimeout = c_appl_timeout_value; - for (transPtr.i = transPtrI; transPtr.i < capiConnectFilesize; transPtr.i++) + Uint32 RT_BREAK = 64; + Uint32 endPtrI = transPtrI + RT_BREAK; + if (endPtrI > capiConnectFilesize) + { + endPtrI = capiConnectFilesize; + } + + for (transPtr.i = transPtrI; transPtr.i < endPtrI; transPtr.i++) { ptrCheckGuard(transPtr, capiConnectFilesize, apiConnectRecord); if (transPtr.p->m_transaction_nodes.get(failedNodeId)) { jam(); - + // Force timeout regardless of state c_appl_timeout_value = 1; setApiConTimer(transPtr.i, TtcTimer - 2, __LINE__); timeOutFoundLab(signal, transPtr.i, ZNODEFAIL_BEFORE_COMMIT); c_appl_timeout_value = TapplTimeout; + + transPtr.i++; + break; } - - // Send CONTINUEB to continue later + } + + if (transPtr.i == capiConnectFilesize) + { + jam(); + checkNodeFailComplete(signal, failedNodeId, + HostRecord::NF_CHECK_TRANSACTION); + } + else + { signal->theData[0] = TcContinueB::ZNF_CHECK_TRANSACTIONS; - signal->theData[1] = transPtr.i + 1; // Check next + signal->theData[1] = transPtr.i; signal->theData[2] = failedNodeId; sendSignal(cownref, GSN_CONTINUEB, signal, 3, JBB); - return; } - - checkNodeFailComplete(signal, failedNodeId, - HostRecord::NF_CHECK_TRANSACTION); } @@ -7384,7 +7395,23 @@ void Dbtc::execTAKE_OVERTCCONF(Signal* s if (signal->getSendersBlockRef() != reference()) { jam(); - return; + /** + * Node should be in queue + */ + Uint32 i = 0; + Uint32 end = tcNodeFailptr.p->queueIndex; + for (; iqueueList[i] == hostptr.i) + { + jam(); + break; + } + } + ndbrequire(i != end); + tcNodeFailptr.p->queueList[i] = tcNodeFailptr.p->queueList[end-1]; + tcNodeFailptr.p->queueIndex = end - 1; } checkNodeFailComplete(signal, hostptr.i, HostRecord::NF_TAKEOVER); @@ -7396,7 +7423,9 @@ void Dbtc::execTAKE_OVERTCREQ(Signal* si tfailedNodeId = signal->theData[0]; tcNodeFailptr.i = 0; ptrAss(tcNodeFailptr, tcFailRecord); - if (tcNodeFailptr.p->failStatus != FS_IDLE) { + if (tcNodeFailptr.p->failStatus != FS_IDLE || + cmasterNodeId != getOwnNodeId()) + { jam(); /*------------------------------------------------------------*/ /* WE CAN CURRENTLY ONLY HANDLE ONE TAKE OVER AT A TIME */ @@ -7450,6 +7479,8 @@ void Dbtc::execLQH_TRANSCONF(Signal* sig jamEntry(); LqhTransConf * const lqhTransConf = (LqhTransConf *)&signal->theData[0]; + CRASH_INSERTION(8060); + tcNodeFailptr.i = lqhTransConf->tcRef; ptrCheckGuard(tcNodeFailptr, 1, tcFailRecord); tnodeid = lqhTransConf->lqhNodeId; @@ -7521,6 +7552,8 @@ void Dbtc::nodeTakeOverCompletedLab(Sign { Uint32 guard0; + CRASH_INSERTION(8061); + hostptr.i = tnodeid; ptrCheckGuard(hostptr, chostFilesize, hostRecord); hostptr.p->lqhTransStatus = LTS_IDLE; @@ -7629,6 +7662,8 @@ void Dbtc::completeTransAtTakeOverDoLast tcNodeFailptr.p->takeOverProcState[TtakeOverInd] = ZTAKE_OVER_IDLE; tcNodeFailptr.p->completedTakeOver++; + CRASH_INSERTION(8062); + if (tcNodeFailptr.p->completedTakeOver == cnoParallelTakeOver) { jam(); /*------------------------------------------------------------*/ @@ -9521,7 +9556,7 @@ void Dbtc::execDIGETPRIMCONF(Signal* sig * TC - transaction hinting / scan partition pruning has failed * Used by testPartitioning.cpp */ - ndbassert(false); + CRASH_INSERTION(8050); } ndbrequire(scanFragptr.p->scanFragState == ScanFragRec::WAIT_GET_PRIMCONF); === modified file 'storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp' --- a/storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp 2008-04-03 12:46:03 +0000 +++ b/storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp 2008-05-29 15:58:58 +0000 @@ -2967,10 +2967,14 @@ private: Fragoperrec *fragoperrec; Uint32 cfirstfreeFragopr; Uint32 cnoOfFragoprec; + RSS_OP_COUNTER(cnoOfFreeFragoprec); + RSS_OP_SNAPSHOT(cnoOfFreeFragoprec); Fragrecord *fragrecord; Uint32 cfirstfreefrag; Uint32 cnoOfFragrec; + RSS_OP_COUNTER(cnoOfFreeFragrec); + RSS_OP_SNAPSHOT(cnoOfFreeFragrec); AlterTabOperation *alterTabOperRec; Uint32 cfirstfreeAlterTabOp; @@ -2993,6 +2997,8 @@ private: TableDescriptor *tableDescriptor; Uint32 cnoOfTabDescrRec; + RSS_OP_COUNTER(cnoOfFreeTabDescrRec); + RSS_OP_SNAPSHOT(cnoOfFreeTabDescrRec); Uint32 cdata[32]; Uint32 cdataPages[16]; === modified file 'storage/ndb/src/kernel/blocks/dbtup/DbtupDebug.cpp' --- a/storage/ndb/src/kernel/blocks/dbtup/DbtupDebug.cpp 2007-06-12 07:39:23 +0000 +++ b/storage/ndb/src/kernel/blocks/dbtup/DbtupDebug.cpp 2008-05-29 15:58:58 +0000 @@ -259,6 +259,22 @@ Dbtup::execDUMP_STATE_ORD(Signal* signal max_loop); } #endif + + if (signal->theData[0] == DumpStateOrd::SchemaResourceSnapshot) + { + RSS_OP_SNAPSHOT_SAVE(cnoOfFreeFragoprec); + RSS_OP_SNAPSHOT_SAVE(cnoOfFreeFragrec); + RSS_OP_SNAPSHOT_SAVE(cnoOfFreeTabDescrRec); + return; + } + + if (signal->theData[0] == DumpStateOrd::SchemaResourceCheckLeak) + { + RSS_OP_SNAPSHOT_CHECK(cnoOfFreeFragoprec); + RSS_OP_SNAPSHOT_CHECK(cnoOfFreeFragrec); + RSS_OP_SNAPSHOT_CHECK(cnoOfFreeTabDescrRec); + return; + } }//Dbtup::execDUMP_STATE_ORD() /* ---------------------------------------------------------------- */ === modified file 'storage/ndb/src/kernel/blocks/dbtup/DbtupGen.cpp' --- a/storage/ndb/src/kernel/blocks/dbtup/DbtupGen.cpp 2007-06-14 17:09:19 +0000 +++ b/storage/ndb/src/kernel/blocks/dbtup/DbtupGen.cpp 2008-05-29 15:58:58 +0000 @@ -117,6 +117,10 @@ Dbtup::Dbtup(Block_context& ctx, Pgman* initData(); CLEAR_ERROR_INSERT_VALUE; + + RSS_OP_COUNTER_INIT(cnoOfFreeFragoprec); + RSS_OP_COUNTER_INIT(cnoOfFreeFragrec); + RSS_OP_COUNTER_INIT(cnoOfFreeTabDescrRec); }//Dbtup::Dbtup() Dbtup::~Dbtup() @@ -762,6 +766,7 @@ void Dbtup::releaseFragrec(FragrecordPtr { regFragPtr.p->nextfreefrag = cfirstfreefrag; cfirstfreefrag = regFragPtr.i; + RSS_OP_FREE(cnoOfFreeFragrec); }//Dbtup::releaseFragrec() === modified file 'storage/ndb/src/kernel/blocks/dbtup/DbtupMeta.cpp' --- a/storage/ndb/src/kernel/blocks/dbtup/DbtupMeta.cpp 2008-03-19 12:57:01 +0000 +++ b/storage/ndb/src/kernel/blocks/dbtup/DbtupMeta.cpp 2008-05-29 15:58:58 +0000 @@ -266,6 +266,7 @@ void Dbtup::seizeFragrecord(FragrecordPt ptrCheckGuard(regFragPtr, cnoOfFragrec, fragrecord); cfirstfreefrag= regFragPtr.p->nextfreefrag; regFragPtr.p->nextfreefrag= RNIL; + RSS_OP_ALLOC(cnoOfFreeFragrec); } void Dbtup::seizeFragoperrec(FragoperrecPtr& fragOperPtr) @@ -275,6 +276,7 @@ void Dbtup::seizeFragoperrec(Fragoperrec cfirstfreeFragopr = fragOperPtr.p->nextFragoprec; fragOperPtr.p->nextFragoprec = RNIL; fragOperPtr.p->inUse = true; + RSS_OP_ALLOC(cnoOfFreeFragoprec); }//Dbtup::seizeFragoperrec() void Dbtup::seizeAlterTabOperation(AlterTabOperationPtr& alterTabOpPtr) @@ -314,6 +316,17 @@ void Dbtup::execTUP_ADD_ATTRREQ(Signal* fragOperPtr.p->attributeCount--; const bool lastAttr = (fragOperPtr.p->attributeCount == 0); + if (ERROR_INSERTED(4009) && regTabPtr.p->fragid[0] == fragId && attrId == 0|| + ERROR_INSERTED(4010) && regTabPtr.p->fragid[0] == fragId && lastAttr || + ERROR_INSERTED(4011) && regTabPtr.p->fragid[1] == fragId && attrId == 0|| + ERROR_INSERTED(4012) && regTabPtr.p->fragid[1] == fragId && lastAttr) { + jam(); + terrorCode = 1; + addattrrefuseLab(signal, regFragPtr, fragOperPtr, regTabPtr.p, fragId); + CLEAR_ERROR_INSERT_VALUE; + return; + } + if (regTabPtr.p->tableStatus != DEFINING) { ndbrequire(regTabPtr.p->tableStatus == DEFINED); @@ -455,17 +468,6 @@ void Dbtup::execTUP_ADD_ATTRREQ(Signal* fragOperPtr.p->charsetIndex, attrDes2); setTabDescrWord(firstTabDesIndex + 1, attrDes2); - if (ERROR_INSERTED(4009) && regTabPtr.p->fragid[0] == fragId && attrId == 0|| - ERROR_INSERTED(4010) && regTabPtr.p->fragid[0] == fragId && lastAttr || - ERROR_INSERTED(4011) && regTabPtr.p->fragid[1] == fragId && attrId == 0|| - ERROR_INSERTED(4012) && regTabPtr.p->fragid[1] == fragId && lastAttr) { - jam(); - terrorCode = 1; - addattrrefuseLab(signal, regFragPtr, fragOperPtr, regTabPtr.p, fragId); - CLEAR_ERROR_INSERT_VALUE; - return; - } - /* **************************************************************** */ /* ************** TUP_ADD_ATTCONF ****************** */ /* **************************************************************** */ @@ -1359,7 +1361,6 @@ void Dbtup::addattrrefuseLab(Signal* sig deleteFragTab(regTabPtr, fragId); releaseFragrec(regFragPtr); releaseTabDescr(regTabPtr); - initTab(regTabPtr); signal->theData[0]= fragOperPtr.p->lqhPtrFrag; signal->theData[1]= terrorCode; @@ -1372,10 +1373,24 @@ void Dbtup::fragrefuse4Lab(Signal* signa FragoperrecPtr fragOperPtr, FragrecordPtr regFragPtr, Tablerec* const regTabPtr, - Uint32 fragId) + Uint32 fragId) { + bool found = false; + for (Uint32 i = 0; i < MAX_FRAG_PER_NODE; i++) + { + jam(); + if (regTabPtr->fragid[i] == fragId) + { + jam(); + ndbrequire(regTabPtr->fragrec[i] == regFragPtr.i); + regTabPtr->fragid[i] = RNIL; + regTabPtr->fragrec[i] = RNIL; + found = true; + break; + } + } + ndbrequire(found); fragrefuse3Lab(signal, fragOperPtr, regFragPtr, regTabPtr, fragId); - initTab(regTabPtr); } void Dbtup::fragrefuse3Lab(Signal* signal, @@ -1413,6 +1428,7 @@ void Dbtup::releaseFragoperrec(Fragoperr fragOperPtr.p->inUse = false; fragOperPtr.p->nextFragoprec = cfirstfreeFragopr; cfirstfreeFragopr = fragOperPtr.i; + RSS_OP_FREE(cnoOfFreeFragoprec); }//Dbtup::releaseFragoperrec() void Dbtup::releaseAlterTabOpRec(AlterTabOperationPtr regAlterTabOpPtr) @@ -1466,6 +1482,19 @@ Dbtup::execDROP_TAB_REQ(Signal* signal) tabPtr.p->m_dropTable.tabUserRef = req->senderRef; tabPtr.p->m_dropTable.tabUserPtr = req->senderData; + + if (tabPtr.p->tableStatus == NOT_DEFINED) + { + jam(); + DropTabConf * const dropConf= (DropTabConf *)signal->getDataPtrSend(); + dropConf->senderRef= reference(); + dropConf->senderData= tabPtr.p->m_dropTable.tabUserPtr; + dropConf->tableId= tabPtr.i; + sendSignal(tabPtr.p->m_dropTable.tabUserRef, GSN_DROP_TAB_CONF, + signal, DropTabConf::SignalLength, JBB); + return; + } + tabPtr.p->tableStatus = DROPPING; signal->theData[0]= ZREL_FRAG; === modified file 'storage/ndb/src/kernel/blocks/dbtup/DbtupTabDesMan.cpp' --- a/storage/ndb/src/kernel/blocks/dbtup/DbtupTabDesMan.cpp 2008-02-03 11:32:08 +0000 +++ b/storage/ndb/src/kernel/blocks/dbtup/DbtupTabDesMan.cpp 2008-05-29 15:58:58 +0000 @@ -144,6 +144,7 @@ Dbtup::setTabDescrWord(Uint32 index, Uin void Dbtup::insertTdArea(Uint32 tabDesRef, Uint32 list) { ndbrequire(list < 16); + RSS_OP_FREE_X(cnoOfFreeTabDescrRec, 1 << list); setTabDescrWord(tabDesRef + ZTD_FL_HEADER, ZTD_TYPE_FREE); setTabDescrWord(tabDesRef + ZTD_FL_NEXT, cfreeTdList[list]); if (cfreeTdList[list] != RNIL) { @@ -217,6 +218,8 @@ void Dbtup::itdaMergeTabDescr(Uint32& re void Dbtup::removeTdArea(Uint32 tabDesRef, Uint32 list) { ndbrequire(list < 16); + RSS_OP_ALLOC_X(cnoOfFreeTabDescrRec, 1 << list); + Uint32 tabDescrNextPtr = getTabDescrWord(tabDesRef + ZTD_FL_NEXT); Uint32 tabDescrPrevPtr = getTabDescrWord(tabDesRef + ZTD_FL_PREV); === modified file 'storage/ndb/src/kernel/blocks/dbtup/Makefile.am' --- a/storage/ndb/src/kernel/blocks/dbtup/Makefile.am 2006-12-31 00:32:21 +0000 +++ b/storage/ndb/src/kernel/blocks/dbtup/Makefile.am 2008-04-25 06:32:23 +0000 @@ -20,9 +20,9 @@ EXTRA_PROGRAMS = test_varpage test_varpage_SOURCES = test_varpage.cpp tuppage.cpp test_varpage_LDFLAGS = @ndb_bin_am_ldflags@ \ $(top_builddir)/storage/ndb/src/libndbclient.la \ - $(top_builddir)/mysys/libmysys.a \ - $(top_builddir)/dbug/libdbug.a \ - $(top_builddir)/strings/libmystrings.a + $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/dbug/libdbuglt.la \ + $(top_builddir)/strings/libmystringslt.la # Don't update the files from bitkeeper %::SCCS/s.% === modified file 'storage/ndb/src/kernel/blocks/dbtux/Dbtux.hpp' --- a/storage/ndb/src/kernel/blocks/dbtux/Dbtux.hpp 2006-12-23 19:20:40 +0000 +++ b/storage/ndb/src/kernel/blocks/dbtux/Dbtux.hpp 2008-05-30 06:33:46 +0000 @@ -451,6 +451,7 @@ private: }; typedef Ptr IndexPtr; ArrayPool c_indexPool; + RSS_AP_SNAPSHOT(c_indexPool); /* * Fragment of an index, as known to DIH/TC. Represents the two @@ -481,6 +482,7 @@ private: }; typedef Ptr FragPtr; ArrayPool c_fragPool; + RSS_AP_SNAPSHOT(c_fragPool); /* * Fragment metadata operation. @@ -500,6 +502,7 @@ private: }; typedef Ptr FragOpPtr; ArrayPool c_fragOpPool; + RSS_AP_SNAPSHOT(c_fragOpPool); // node handles === modified file 'storage/ndb/src/kernel/blocks/dbtux/DbtuxDebug.cpp' --- a/storage/ndb/src/kernel/blocks/dbtux/DbtuxDebug.cpp 2006-12-23 19:20:40 +0000 +++ b/storage/ndb/src/kernel/blocks/dbtux/DbtuxDebug.cpp 2008-05-30 06:33:46 +0000 @@ -55,6 +55,20 @@ Dbtux::execDUMP_STATE_ORD(Signal* signal abort(); } #endif + + if (signal->theData[0] == DumpStateOrd::SchemaResourceSnapshot) + { + RSS_AP_SNAPSHOT_SAVE(c_indexPool); + RSS_AP_SNAPSHOT_SAVE(c_fragPool); + RSS_AP_SNAPSHOT_SAVE(c_fragOpPool); + } + + if (signal->theData[0] == DumpStateOrd::SchemaResourceCheckLeak) + { + RSS_AP_SNAPSHOT_CHECK(c_indexPool); + RSS_AP_SNAPSHOT_CHECK(c_fragPool); + RSS_AP_SNAPSHOT_CHECK(c_fragOpPool); + } } #ifdef VM_TRACE === modified file 'storage/ndb/src/kernel/blocks/lgman.cpp' --- a/storage/ndb/src/kernel/blocks/lgman.cpp 2008-02-08 14:21:07 +0000 +++ b/storage/ndb/src/kernel/blocks/lgman.cpp 2008-04-22 19:36:05 +0000 @@ -30,7 +30,7 @@ #include "dbtup/Dbtup.hpp" #include -extern EventLogger g_eventLogger; +extern EventLogger * g_eventLogger; #include @@ -2434,9 +2434,9 @@ Lgman::find_log_head_in_file(Signal* sig infoEvent("Undo head - %s page: %d lsn: %lld", fs->get_filename(file_ptr.p->m_fd), tail, file_ptr.p->m_online.m_lsn); - g_eventLogger.info("Undo head - %s page: %d lsn: %lld", - fs->get_filename(file_ptr.p->m_fd), - tail, file_ptr.p->m_online.m_lsn); + g_eventLogger->info("Undo head - %s page: %d lsn: %lld", + fs->get_filename(file_ptr.p->m_fd), + tail, file_ptr.p->m_online.m_lsn); for(files.prev(file_ptr); !file_ptr.isNull(); files.prev(file_ptr)) { @@ -2444,9 +2444,9 @@ Lgman::find_log_head_in_file(Signal* sig fs->get_filename(file_ptr.p->m_fd), file_ptr.p->m_online.m_lsn); - g_eventLogger.info(" - next - %s(%lld)", - fs->get_filename(file_ptr.p->m_fd), - file_ptr.p->m_online.m_lsn); + g_eventLogger->info(" - next - %s(%lld)", + fs->get_filename(file_ptr.p->m_fd), + file_ptr.p->m_online.m_lsn); } } @@ -3001,17 +3001,17 @@ Lgman::stop_run_undo_log(Signal* signal) m_file_pool.getPtr(tf, tail.m_ptr_i); m_file_pool.getPtr(hf, ptr.p->m_file_pos[HEAD].m_ptr_i); infoEvent("Logfile group: %d ", ptr.p->m_logfile_group_id); - g_eventLogger.info("Logfile group: %d ", ptr.p->m_logfile_group_id); + g_eventLogger->info("Logfile group: %d ", ptr.p->m_logfile_group_id); infoEvent(" head: %s page: %d", - fs->get_filename(hf.p->m_fd), - ptr.p->m_file_pos[HEAD].m_idx); - g_eventLogger.info(" head: %s page: %d", - fs->get_filename(hf.p->m_fd), - ptr.p->m_file_pos[HEAD].m_idx); + fs->get_filename(hf.p->m_fd), + ptr.p->m_file_pos[HEAD].m_idx); + g_eventLogger->info(" head: %s page: %d", + fs->get_filename(hf.p->m_fd), + ptr.p->m_file_pos[HEAD].m_idx); infoEvent(" tail: %s page: %d", fs->get_filename(tf.p->m_fd), tail.m_idx); - g_eventLogger.info(" tail: %s page: %d", - fs->get_filename(tf.p->m_fd), tail.m_idx); + g_eventLogger->info(" tail: %s page: %d", + fs->get_filename(tf.p->m_fd), tail.m_idx); } } @@ -3033,7 +3033,7 @@ Lgman::stop_run_undo_log(Signal* signal) } infoEvent("Flushing page cache after undo completion"); - g_eventLogger.info("Flushing page cache after undo completion"); + g_eventLogger->info("Flushing page cache after undo completion"); /** * Start flushing pages (local, LCP) @@ -3098,7 +3098,7 @@ Lgman::execEND_LCP_CONF(Signal* signal) ptr.p->m_last_synced_lsn = last_lsn; infoEvent("Flushing complete"); - g_eventLogger.info("Flushing complete"); + g_eventLogger->info("Flushing complete"); signal->theData[0] = reference(); sendSignal(DBLQH_REF, GSN_START_RECCONF, signal, 1, JBB); === modified file 'storage/ndb/src/kernel/blocks/ndbcntr/Ndbcntr.hpp' --- a/storage/ndb/src/kernel/blocks/ndbcntr/Ndbcntr.hpp 2007-02-26 07:12:02 +0000 +++ b/storage/ndb/src/kernel/blocks/ndbcntr/Ndbcntr.hpp 2008-04-25 09:17:15 +0000 @@ -47,6 +47,7 @@ //------- OTHERS --------------------------------------------- #define ZSTARTUP 1 #define ZSHUTDOWN 2 +#define ZBLOCK_STTOR 3 #define ZSIZE_NDB_BLOCKS_REC 16 /* MAX BLOCKS IN NDB */ #define ZSIZE_SYSTAB 2048 @@ -382,6 +383,10 @@ private: void execREAD_CONFIG_CONF(Signal*); friend struct UpgradeStartup; + +#ifdef ERROR_INSERT + Uint32 c_error_insert_extra; +#endif }; #endif === modified file 'storage/ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp' --- a/storage/ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp 2007-09-13 11:59:48 +0000 +++ b/storage/ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp 2008-04-25 10:59:17 +0000 @@ -159,6 +159,18 @@ void Ndbcntr::execCONTINUEB(Signal* sign jam(); c_stopRec.checkTimeout(signal); break; + case ZBLOCK_STTOR: + if (ERROR_INSERTED(1002)) + { + signal->theData[0] = ZBLOCK_STTOR; + sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 100, 1); + return; + } + else + { + c_missra.sendNextSTTOR(signal); + } + return; default: jam(); systemErrorLab(signal, __LINE__); @@ -2084,6 +2096,21 @@ Ndbcntr::execDUMP_STATE_ORD(Signal* sign return; } + if (arg == 71) + { +#ifdef ERROR_INSERT + if (signal->getLength() == 2) + { + c_error_insert_extra = signal->theData[1]; + SET_ERROR_INSERT_VALUE(1002); + } + else if (ERROR_INSERTED(1002)) + { + CLEAR_ERROR_INSERT_VALUE; + } +#endif + } + }//Ndbcntr::execDUMP_STATE_ORD() void Ndbcntr::updateNodeState(Signal* signal, const NodeState& newState) const{ @@ -2880,6 +2907,16 @@ void Ndbcntr::Missra::sendNextSTTOR(Sign for(; currentStartPhase < 255 ; currentStartPhase++, g_currentStartPhase = currentStartPhase){ jam(); + +#ifdef ERROR_INSERT + if (cntr.cerrorInsert == 1002 && + cntr.c_error_insert_extra == currentStartPhase) + { + signal->theData[0] = ZBLOCK_STTOR; + cntr.sendSignalWithDelay(cntr.reference(), GSN_CONTINUEB, signal, 100, 1); + return; + } +#endif const Uint32 start = currentBlockIndex; === modified file 'storage/ndb/src/kernel/blocks/qmgr/Qmgr.hpp' --- a/storage/ndb/src/kernel/blocks/qmgr/Qmgr.hpp 2008-02-20 09:04:29 +0000 +++ b/storage/ndb/src/kernel/blocks/qmgr/Qmgr.hpp 2008-04-25 09:17:15 +0000 @@ -421,6 +421,7 @@ private: Uint16 cnoPrepFailedNodes; Uint16 cnoCommitFailedNodes; Uint16 cactivateApiCheck; + Uint16 c_allow_api_connect; UintR chbApiDelay; UintR ccommitFailureNr; === modified file 'storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp' --- a/storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp 2008-02-20 09:04:29 +0000 +++ b/storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp 2008-04-25 09:17:15 +0000 @@ -252,15 +252,34 @@ Qmgr::execSTART_ORD(Signal* signal) { ptrAss(nodePtr, nodeRec); nodePtr.p->ndynamicId = 0; - if(getNodeInfo(nodePtr.i).m_type == NodeInfo::DB) - { + Uint32 cnt = 0; + Uint32 type = getNodeInfo(nodePtr.i).m_type; + switch(type){ + case NodeInfo::DB: + jam(); nodePtr.p->phase = ZINIT; c_definedNodes.set(nodePtr.i); - } else { + break; + case NodeInfo::API: + jam(); + nodePtr.p->phase = ZAPI_INACTIVE; + break; + case NodeInfo::MGM: + jam(); + /** + * Enable communication to MGM direcly + * by setting ZFAIL_CLOSING (picked up in checkStartInterface) + */ + cnt = 3; + nodePtr.p->phase = ZFAIL_CLOSING; + nodePtr.p->failState = NORMAL; + break; + default: + jam(); nodePtr.p->phase = ZAPI_INACTIVE; } - setNodeInfo(nodePtr.i).m_heartbeat_cnt= 0; + setNodeInfo(nodePtr.i).m_heartbeat_cnt = cnt; nodePtr.p->sendPrepFailReqStatus = Q_NOT_ACTIVE; nodePtr.p->sendCommitFailReqStatus = Q_NOT_ACTIVE; nodePtr.p->sendPresToStatus = Q_NOT_ACTIVE; @@ -313,6 +332,30 @@ void Qmgr::execSTTOR(Signal* signal) } } break; + case 8:{ + /** + * Enable communication to all API nodes by setting state + * to ZFAIL_CLOSING (which will make it auto-open in checkStartInterface) + */ + c_allow_api_connect = 1; + NodeRecPtr nodePtr; + for (nodePtr.i = 1; nodePtr.i < MAX_NODES; nodePtr.i++) + { + jam(); + Uint32 type = getNodeInfo(nodePtr.i).m_type; + if (type != NodeInfo::API) + continue; + + ptrAss(nodePtr, nodeRec); + if (nodePtr.p->phase == ZAPI_INACTIVE) + { + jam(); + setNodeInfo(nodePtr.i).m_heartbeat_cnt = 3; + nodePtr.p->phase = ZFAIL_CLOSING; + nodePtr.p->failState = NORMAL; + } + } + } } sendSttorryLab(signal); @@ -325,8 +368,9 @@ void Qmgr::sendSttorryLab(Signal* signal /*< STTORRY <*/ /****************************<*/ signal->theData[3] = 7; - signal->theData[4] = 255; - sendSignal(NDBCNTR_REF, GSN_STTORRY, signal, 5, JBB); + signal->theData[4] = 8; + signal->theData[5] = 255; + sendSignal(NDBCNTR_REF, GSN_STTORRY, signal, 6, JBB); return; }//Qmgr::sendSttorryLab() @@ -2178,6 +2222,7 @@ void Qmgr::initData(Signal* signal) cneighbourl = ZNIL; cdelayRegreq = ZDELAY_REGREQ; cactivateApiCheck = 0; + c_allow_api_connect = 0; ctoStatus = Q_NOT_ACTIVE; interface_check_timer.setDelay(1000); @@ -2493,13 +2538,34 @@ void Qmgr::checkStartInterface(Signal* s * IS COMPLETE. *-------------------------------------------------------------------*/ nodePtr.p->failState = NORMAL; - if (getNodeInfo(nodePtr.i).m_type != NodeInfo::DB){ + Uint32 type = getNodeInfo(nodePtr.i).m_type; + switch(type){ + case NodeInfo::DB: + jam(); + nodePtr.p->phase = ZINIT; + break; + case NodeInfo::MGM: jam(); nodePtr.p->phase = ZAPI_INACTIVE; - } else { + break; + case NodeInfo::API: jam(); - nodePtr.p->phase = ZINIT; - }//if + if (c_allow_api_connect) + { + jam(); + nodePtr.p->phase = ZAPI_INACTIVE; + break; + } + else + { + /** + * Dont allow API node to connect before c_allow_api_connect + */ + jam(); + setNodeInfo(nodePtr.i).m_heartbeat_cnt = 3; + continue; + } + } setNodeInfo(nodePtr.i).m_heartbeat_cnt= 0; signal->theData[0] = 0; @@ -2623,28 +2689,37 @@ void Qmgr::execNDB_FAILCONF(Signal* sign progError(__LINE__, 0, buf); systemErrorLab(signal, __LINE__); }//if - if (cpresident == getOwnNodeId()) { + + if (cpresident == getOwnNodeId()) + { jam(); - /** - * Prepare a NFCompleteRep and send to all connected API's - * They can then abort all transaction waiting for response from - * the failed node - */ - NFCompleteRep * const nfComp = (NFCompleteRep *)&signal->theData[0]; - nfComp->blockNo = QMGR_REF; - nfComp->nodeId = getOwnNodeId(); - nfComp->failedNodeId = failedNodePtr.i; + + CRASH_INSERTION(936); + } - for (nodePtr.i = 1; nodePtr.i < MAX_NODES; nodePtr.i++) { + /** + * Prepare a NFCompleteRep and send to all connected API's + * They can then abort all transaction waiting for response from + * the failed node + * + * NOTE: This is sent from all nodes, as otherwise we would need + * take-over if cpresident dies befor sending this + */ + NFCompleteRep * const nfComp = (NFCompleteRep *)&signal->theData[0]; + nfComp->blockNo = QMGR_REF; + nfComp->nodeId = getOwnNodeId(); + nfComp->failedNodeId = failedNodePtr.i; + + for (nodePtr.i = 1; nodePtr.i < MAX_NODES; nodePtr.i++) + { + jam(); + ptrAss(nodePtr, nodeRec); + if (nodePtr.p->phase == ZAPI_ACTIVE){ jam(); - ptrAss(nodePtr, nodeRec); - if (nodePtr.p->phase == ZAPI_ACTIVE){ - jam(); - sendSignal(nodePtr.p->blockRef, GSN_NF_COMPLETEREP, signal, - NFCompleteRep::SignalLength, JBA); - }//if - }//for - } + sendSignal(nodePtr.p->blockRef, GSN_NF_COMPLETEREP, signal, + NFCompleteRep::SignalLength, JBA); + }//if + }//for return; }//Qmgr::execNDB_FAILCONF() @@ -3695,9 +3770,17 @@ void Qmgr::execCOMMIT_FAILREQ(Signal* si jam(); NdbNodeBitmask::set(nodeFail->theNodes, ccommitFailedNodes[i]); }//if - sendSignal(NDBCNTR_REF, GSN_NODE_FAILREP, signal, - NodeFailRep::SignalLength, JBB); - + + if (ERROR_INSERTED(936)) + { + sendSignalWithDelay(NDBCNTR_REF, GSN_NODE_FAILREP, signal, + 200, NodeFailRep::SignalLength); + } + else + { + sendSignal(NDBCNTR_REF, GSN_NODE_FAILREP, signal, + NodeFailRep::SignalLength, JBB); + } guard0 = cnoCommitFailedNodes - 1; arrGuard(guard0, MAX_NDB_NODES); /**-------------------------------------------------------------------- === modified file 'storage/ndb/src/kernel/blocks/suma/Suma.cpp' --- a/storage/ndb/src/kernel/blocks/suma/Suma.cpp 2008-02-20 20:59:22 +0000 +++ b/storage/ndb/src/kernel/blocks/suma/Suma.cpp 2008-05-21 07:18:45 +0000 @@ -53,7 +53,7 @@ #include <../dbdih/Dbdih.hpp> #include -extern EventLogger g_eventLogger; +extern EventLogger * g_eventLogger; //#define HANDOVER_DEBUG //#define NODEFAIL_DEBUG @@ -2383,6 +2383,16 @@ Suma::execSUB_START_REQ(Signal* signal){ senderRef, senderData, SubStartRef::OutOfSubOpRecords); return; } + + if (! check_sub_start(subscriberRef)) + { + jam(); + c_subscriberPool.release(subbPtr); + c_subOpPool.release(subOpPtr); + sendSubStartRef(signal, + senderRef, senderData, SubStartRef::NodeDied); + return; + } // setup subscriber record subbPtr.p->m_senderRef = subscriberRef; @@ -2587,6 +2597,19 @@ Suma::execCREATE_TRIG_REF(Signal* signal drop_triggers(signal, subPtr); } +bool +Suma::check_sub_start(Uint32 subscriberRef) +{ + Uint32 nodeId = refToNode(subscriberRef); + bool startme = c_startup.m_restart_server_node_id; + bool handover = c_startup.m_wait_handover; + bool connected = + c_failedApiNodes.get(nodeId) == false && + c_connected_nodes.get(nodeId); + + return (startme || handover || connected); +} + void Suma::report_sub_start_conf(Signal* signal, Ptr subPtr) { @@ -2607,9 +2630,8 @@ Suma::report_sub_start_conf(Signal* sign c_subscriberPool.getPtr(ptr, subOpPtr.p->m_subscriberRef); Uint32 nodeId = refToNode(ptr.p->m_senderRef); - if (c_startup.m_restart_server_node_id || - (c_failedApiNodes.get(nodeId) == false && - c_connected_nodes.get(nodeId))) + + if (check_sub_start(ptr.p->m_senderRef)) { SubStartConf* conf = (SubStartConf*)signal->getDataPtrSend(); conf->senderRef = reference(); @@ -2636,8 +2658,7 @@ Suma::report_sub_start_conf(Signal* sign else { jam(); - g_eventLogger.warning("Node %u failed in report_sub_start_conf", - nodeId); + sendSubStartRef(signal, senderRef, senderData, SubStartRef::NodeDied); @@ -3754,8 +3775,8 @@ Suma::execSUB_GCP_COMPLETE_REP(Signal* s { char buf[100]; c_subscriber_nodes.getText(buf); - g_eventLogger.error("c_gcp_list.seize() failed: gci: %d nodes: %s", - gci, buf); + g_eventLogger->error("c_gcp_list.seize() failed: gci: %d nodes: %s", + gci, buf); } } @@ -4009,9 +4030,9 @@ Suma::execSUB_GCP_COMPLETE_ACK(Signal* s if(gcp.isNull()) { - g_eventLogger.warning("ACK wo/ gcp record (gci: %u/%u) ref: %.8x from: %.8x", - Uint32(gci >> 32), Uint32(gci), - senderRef, signal->getSendersBlockRef()); + g_eventLogger->warning("ACK wo/ gcp record (gci: %u/%u) ref: %.8x from: %.8x", + Uint32(gci >> 32), Uint32(gci), + senderRef, signal->getSendersBlockRef()); } else { === modified file 'storage/ndb/src/kernel/blocks/suma/Suma.hpp' --- a/storage/ndb/src/kernel/blocks/suma/Suma.hpp 2008-02-20 15:15:31 +0000 +++ b/storage/ndb/src/kernel/blocks/suma/Suma.hpp 2008-05-21 07:18:45 +0000 @@ -376,7 +376,6 @@ public: void completeSubRemove(SubscriptionPtr subPtr); - void send_sub_start_stop_event(Signal *signal, Ptr ptr, NdbDictionary::Event::_TableEvent event, @@ -389,6 +388,7 @@ public: void drop_triggers(Signal*, Ptr); void drop_triggers_complete(Signal*, Ptr); + bool check_sub_start(Uint32 subscriberRef); void report_sub_start_conf(Signal* signal, Ptr subPtr); void report_sub_start_ref(Signal* signal, Ptr subPtr, Uint32); === modified file 'storage/ndb/src/kernel/error/ErrorReporter.cpp' --- a/storage/ndb/src/kernel/error/ErrorReporter.cpp 2007-02-05 15:44:59 +0000 +++ b/storage/ndb/src/kernel/error/ErrorReporter.cpp 2008-04-22 19:36:05 +0000 @@ -40,7 +40,7 @@ static void dumpJam(FILE* jamStream, Uint32 thrdTheEmulatedJamIndex, Uint8 thrdTheEmulatedJam[]); -extern EventLogger g_eventLogger; +extern EventLogger * g_eventLogger; const char* ErrorReporter::formatTimeStampString(){ TimeModule DateTime; /* To create "theDateTimeString" */ @@ -197,8 +197,8 @@ ErrorReporter::handleError(int messageID WriteMessage(messageID, problemData, objRef, theEmulatedJamIndex, theEmulatedJam); - g_eventLogger.info(problemData); - g_eventLogger.info(objRef); + g_eventLogger->info(problemData); + g_eventLogger->info(objRef); childReportError(messageID); === modified file 'storage/ndb/src/kernel/main.cpp' --- a/storage/ndb/src/kernel/main.cpp 2007-01-06 00:21:39 +0000 +++ b/storage/ndb/src/kernel/main.cpp 2008-04-22 19:36:05 +0000 @@ -44,7 +44,7 @@ #include // For system informatio #endif -extern EventLogger g_eventLogger; +extern EventLogger * g_eventLogger; extern NdbMutex * theShutdownMutex; void catchsigs(bool ignore); // for process signal handling @@ -180,8 +180,8 @@ int reportShutdown(class Configuration * { // Log event const EventReport * const eventReport = (EventReport *)&theData[0]; - g_eventLogger.log(eventReport->getEventType(), theData, length, - eventReport->getNodeId(), 0); + g_eventLogger->log(eventReport->getEventType(), theData, length, + eventReport->getNodeId(), 0); } for (unsigned n = 0; n < config->m_mgmds.size(); n++) @@ -208,13 +208,13 @@ handle_error: BaseString tmp(ndb_mgm_get_latest_error_msg(h)); tmp.append(" : "); tmp.append(ndb_mgm_get_latest_error_desc(h)); - g_eventLogger.warning("Unable to report shutdown reason to %s: %s", - config->m_mgmds[n].c_str(), tmp.c_str()); + g_eventLogger->warning("Unable to report shutdown reason to %s: %s", + config->m_mgmds[n].c_str(), tmp.c_str()); } else { - g_eventLogger.error("Unable to report shutdown reason to %s", - config->m_mgmds[n].c_str()); + g_eventLogger->error("Unable to report shutdown reason to %s", + config->m_mgmds[n].c_str()); } do_next: if (h) @@ -230,14 +230,14 @@ int main(int argc, char** argv) { NDB_INIT(argv[0]); // Print to stdout/console - g_eventLogger.createConsoleHandler(); - g_eventLogger.setCategory("ndbd"); - g_eventLogger.enable(Logger::LL_ON, Logger::LL_INFO); - g_eventLogger.enable(Logger::LL_ON, Logger::LL_CRITICAL); - g_eventLogger.enable(Logger::LL_ON, Logger::LL_ERROR); - g_eventLogger.enable(Logger::LL_ON, Logger::LL_WARNING); + g_eventLogger->createConsoleHandler(); + g_eventLogger->setCategory("ndbd"); + g_eventLogger->enable(Logger::LL_ON, Logger::LL_INFO); + g_eventLogger->enable(Logger::LL_ON, Logger::LL_CRITICAL); + g_eventLogger->enable(Logger::LL_ON, Logger::LL_ERROR); + g_eventLogger->enable(Logger::LL_ON, Logger::LL_WARNING); - g_eventLogger.m_logLevel.setLogLevel(LogLevel::llStartUp, 15); + g_eventLogger->m_logLevel.setLogLevel(LogLevel::llStartUp, 15); globalEmulatorData.create(); @@ -278,21 +278,21 @@ int main(int argc, char** argv) int filedes[2]; if (pipe(filedes)) { - g_eventLogger.error("pipe() failed with errno=%d (%s)", - errno, strerror(errno)); + g_eventLogger->error("pipe() failed with errno=%d (%s)", + errno, strerror(errno)); return 1; } else { if (!(child_info_file_w= fdopen(filedes[1],"w"))) { - g_eventLogger.error("fdopen() failed with errno=%d (%s)", - errno, strerror(errno)); + g_eventLogger->error("fdopen() failed with errno=%d (%s)", + errno, strerror(errno)); } if (!(child_info_file_r= fdopen(filedes[0],"r"))) { - g_eventLogger.error("fdopen() failed with errno=%d (%s)", - errno, strerror(errno)); + g_eventLogger->error("fdopen() failed with errno=%d (%s)", + errno, strerror(errno)); } } @@ -319,7 +319,7 @@ int main(int argc, char** argv) if(WIFEXITED(status)){ switch(WEXITSTATUS(status)){ case NRT_Default: - g_eventLogger.info("Angel shutting down"); + g_eventLogger->info("Angel shutting down"); reportShutdown(theConfig, 0, 0); exit(0); break; @@ -360,7 +360,7 @@ int main(int argc, char** argv) else { signum = 127; - g_eventLogger.info("Unknown exit reason. Stopped."); + g_eventLogger->info("Unknown exit reason. Stopped."); } if(theConfig->stopOnError()){ /** @@ -381,25 +381,25 @@ int main(int argc, char** argv) /** * Error shutdown && stopOnError() */ - g_eventLogger.alert("Ndbd has failed %u consecutive startups. " - "Not restarting", failed_startups); + g_eventLogger->alert("Ndbd has failed %u consecutive startups. " + "Not restarting", failed_startups); reportShutdown(theConfig, error_exit, 0); exit(0); } failed_startup_flag = false; reportShutdown(theConfig, error_exit, 1); - g_eventLogger.info("Ndb has terminated (pid %d) restarting", child); + g_eventLogger->info("Ndb has terminated (pid %d) restarting", child); theConfig->fetch_configuration(); } if (child >= 0) - g_eventLogger.info("Angel pid: %d ndb pid: %d", getppid(), getpid()); + g_eventLogger->info("Angel pid: %d ndb pid: %d", getppid(), getpid()); else if (child > 0) - g_eventLogger.info("Ndb pid: %d", getpid()); + g_eventLogger->info("Ndb pid: %d", getpid()); else - g_eventLogger.info("Ndb started in foreground"); + g_eventLogger->info("Ndb started in foreground"); #else - g_eventLogger.info("Ndb started"); + g_eventLogger->info("Ndb started"); #endif theConfig->setupConfiguration(); systemInfo(* theConfig, * theConfig->m_logLevel); @@ -511,19 +511,19 @@ systemInfo(const Configuration & config, #endif if(logLevel.getLogLevel(LogLevel::llStartUp) > 0){ - g_eventLogger.info("NDB Cluster -- DB node %d", globalData.ownId); - g_eventLogger.info("%s --", NDB_VERSION_STRING); + g_eventLogger->info("NDB Cluster -- DB node %d", globalData.ownId); + g_eventLogger->info("%s --", NDB_VERSION_STRING); if (config.get_mgmd_host()) - g_eventLogger.info("Configuration fetched at %s port %d", - config.get_mgmd_host(), config.get_mgmd_port()); + g_eventLogger->info("Configuration fetched at %s port %d", + config.get_mgmd_host(), config.get_mgmd_port()); #ifdef NDB_SOLARIS // ok - g_eventLogger.info("NDB is running on a machine with %d processor(s) at %d MHz", - processor, speed); + g_eventLogger->info("NDB is running on a machine with %d processor(s) at %d MHz", + processor, speed); #endif } if(logLevel.getLogLevel(LogLevel::llStartUp) > 3){ Uint32 t = config.timeBetweenWatchDogCheck(); - g_eventLogger.info("WatchDog timer is set to %d ms", t); + g_eventLogger->info("WatchDog timer is set to %d ms", t); } } @@ -601,7 +601,7 @@ catchsigs(bool ignore){ extern "C" void handler_shutdown(int signum){ - g_eventLogger.info("Received signal %d. Performing stop.", signum); + g_eventLogger->info("Received signal %d. Performing stop.", signum); childReportError(0); childReportSignal(signum); globalData.theRestartFlag = perform_stop; @@ -627,7 +627,7 @@ handler_error(int signum){ while(true) NdbSleep_MilliSleep(10); thread_id= my_thread_id(); - g_eventLogger.info("Received signal %d. Running error handler.", signum); + g_eventLogger->info("Received signal %d. Running error handler.", signum); childReportSignal(signum); // restart the system char errorData[64], *info= 0; @@ -648,5 +648,5 @@ handler_sigusr1(int signum) failed_startups++; failed_startup_flag = true; } - g_eventLogger.info("Angel received ndbd startup failure count %u.", failed_startups); + g_eventLogger->info("Angel received ndbd startup failure count %u.", failed_startups); } === modified file 'storage/ndb/src/kernel/vm/Configuration.cpp' --- a/storage/ndb/src/kernel/vm/Configuration.cpp 2007-07-02 17:08:02 +0000 +++ b/storage/ndb/src/kernel/vm/Configuration.cpp 2008-04-22 19:36:05 +0000 @@ -43,7 +43,7 @@ extern "C" { } #include -extern EventLogger g_eventLogger; +extern EventLogger * g_eventLogger; enum ndbd_options { OPT_INITIAL = NDB_STD_OPTIONS_LAST, === modified file 'storage/ndb/src/kernel/vm/Emulator.cpp' --- a/storage/ndb/src/kernel/vm/Emulator.cpp 2006-12-23 19:20:40 +0000 +++ b/storage/ndb/src/kernel/vm/Emulator.cpp 2008-04-22 19:36:05 +0000 @@ -41,7 +41,7 @@ void childAbort(int code, Uint32 current extern "C" { extern void (* ndb_new_handler)(); } -extern EventLogger g_eventLogger; +extern EventLogger * g_eventLogger; extern my_bool opt_core; // instantiated and updated in NdbcntrMain.cpp extern Uint32 g_currentStartPhase; @@ -155,26 +155,26 @@ NdbShutdown(NdbShutdownType type, switch(type){ case NST_Normal: - g_eventLogger.info("Shutdown initiated"); + g_eventLogger->info("Shutdown initiated"); break; case NST_Watchdog: - g_eventLogger.info("Watchdog %s system", shutting); + g_eventLogger->info("Watchdog %s system", shutting); break; case NST_ErrorHandler: - g_eventLogger.info("Error handler %s system", shutting); + g_eventLogger->info("Error handler %s system", shutting); break; case NST_ErrorHandlerSignal: - g_eventLogger.info("Error handler signal %s system", shutting); + g_eventLogger->info("Error handler signal %s system", shutting); break; case NST_ErrorHandlerStartup: - g_eventLogger.info("Error handler startup %s system", shutting); + g_eventLogger->info("Error handler startup %s system", shutting); break; case NST_Restart: - g_eventLogger.info("Restarting system"); + g_eventLogger->info("Restarting system"); break; default: - g_eventLogger.info("Error handler %s system (unknown type: %u)", - shutting, (unsigned)type); + g_eventLogger->info("Error handler %s system (unknown type: %u)", + shutting, (unsigned)type); type = NST_ErrorHandler; break; } @@ -189,7 +189,7 @@ NdbShutdown(NdbShutdownType type, /** * Very serious, don't attempt to free, just die!! */ - g_eventLogger.info("Watchdog shutdown completed - %s", exitAbort); + g_eventLogger->info("Watchdog shutdown completed - %s", exitAbort); if (opt_core) { childAbort(-1,g_currentStartPhase); @@ -248,7 +248,7 @@ NdbShutdown(NdbShutdownType type, // Signal parent that error occured during startup if (type == NST_ErrorHandlerStartup) kill(getppid(), SIGUSR1); - g_eventLogger.info("Error handler shutdown completed - %s", exitAbort); + g_eventLogger->info("Error handler shutdown completed - %s", exitAbort); if (opt_core) { childAbort(-1,g_currentStartPhase); @@ -266,7 +266,7 @@ NdbShutdown(NdbShutdownType type, childExit(restartType,g_currentStartPhase); } - g_eventLogger.info("Shutdown completed - exiting"); + g_eventLogger->info("Shutdown completed - exiting"); } else { /** * Shutdown is already in progress @@ -276,7 +276,7 @@ NdbShutdown(NdbShutdownType type, * If this is the watchdog, kill system the hard way */ if (type== NST_Watchdog){ - g_eventLogger.info("Watchdog is killing system the hard way"); + g_eventLogger->info("Watchdog is killing system the hard way"); #if defined VM_TRACE childAbort(-1,g_currentStartPhase); #else === modified file 'storage/ndb/src/kernel/vm/Makefile.am' --- a/storage/ndb/src/kernel/vm/Makefile.am 2006-12-31 00:32:21 +0000 +++ b/storage/ndb/src/kernel/vm/Makefile.am 2008-04-25 06:32:23 +0000 @@ -65,24 +65,24 @@ ndbd_malloc_impl_test_CXXFLAGS = -DUNIT_ ndbd_malloc_impl_test_SOURCES = ndbd_malloc_impl.cpp ndbd_malloc_impl_test_LDFLAGS = @ndb_bin_am_ldflags@ \ $(top_builddir)/storage/ndb/src/libndbclient.la \ - $(top_builddir)/mysys/libmysys.a \ - $(top_builddir)/dbug/libdbug.a \ - $(top_builddir)/strings/libmystrings.a + $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/dbug/libdbuglt.la \ + $(top_builddir)/strings/libmystringslt.la bench_pool_SOURCES = bench_pool.cpp bench_pool_LDFLAGS = @ndb_bin_am_ldflags@\ libkernel.a ../error/liberror.a \ $(top_builddir)/storage/ndb/src/libndbclient.la \ - $(top_builddir)/mysys/libmysys.a \ - $(top_builddir)/dbug/libdbug.a \ - $(top_builddir)/strings/libmystrings.a + $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/dbug/libdbuglt.la \ + $(top_builddir)/strings/libmystringslt.la testDynArr256_CXXFLAGS = -DUNIT_TEST testDynArr256_SOURCES = DynArr256.cpp testDynArr256_LDFLAGS = @ndb_bin_am_ldflags@ \ libkernel.a ../error/liberror.a \ $(top_builddir)/storage/ndb/src/libndbclient.la \ - $(top_builddir)/mysys/libmysys.a \ - $(top_builddir)/dbug/libdbug.a \ - $(top_builddir)/strings/libmystrings.a + $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/dbug/libdbuglt.la \ + $(top_builddir)/strings/libmystringslt.la === modified file 'storage/ndb/src/kernel/vm/SimplePropertiesSection.cpp' --- a/storage/ndb/src/kernel/vm/SimplePropertiesSection.cpp 2006-12-23 19:20:40 +0000 +++ b/storage/ndb/src/kernel/vm/SimplePropertiesSection.cpp 2008-05-16 13:08:36 +0000 @@ -121,6 +121,55 @@ SimplePropertiesSectionReader::getWords( SimplePropertiesSectionWriter::SimplePropertiesSectionWriter(class SectionSegmentPool & pool) : m_pool(pool) { + m_pos = -1; + m_head = 0; + m_currentSegment = 0; + m_prevPtrI = RNIL; + reset(); +} + +extern void release(SegmentedSectionPtr & ptr); + +SimplePropertiesSectionWriter::~SimplePropertiesSectionWriter() +{ + release(); +} + +void +SimplePropertiesSectionWriter::release() +{ + if (m_head) + { + if (m_sz) + { + SegmentedSectionPtr ptr; + ptr.p = m_head; + ptr.i = m_head->m_lastSegment; + ptr.sz = m_sz; + m_head->m_sz = m_sz; + m_head->m_lastSegment = m_currentSegment->m_lastSegment; + + if((m_pos % SectionSegment::DataLength) == 0){ + m_pool.release(m_currentSegment->m_lastSegment); + m_head->m_lastSegment = m_prevPtrI; + } + ::release(ptr); + } + else + { + m_pool.release(m_head->m_lastSegment); + } + } + m_pos = -1; + m_head = 0; + m_currentSegment = 0; + m_prevPtrI = RNIL; +} + +bool +SimplePropertiesSectionWriter::reset() +{ + release(); Ptr first; if(m_pool.seize(first)){ ; @@ -129,7 +178,7 @@ SimplePropertiesSectionWriter::SimplePro m_head = 0; m_currentSegment = 0; m_prevPtrI = RNIL; - return; + return false; } m_sz = 0; m_pos = 0; @@ -137,14 +186,6 @@ SimplePropertiesSectionWriter::SimplePro m_head->m_lastSegment = first.i; m_currentSegment = first.p; m_prevPtrI = RNIL; -} - -bool -SimplePropertiesSectionWriter::reset(){ - if(m_pos >= 0){ - m_pos = 0; - return true; - } return false; } @@ -188,6 +229,11 @@ SimplePropertiesSectionWriter::putWords( return true; } +Uint32 SimplePropertiesSectionWriter::getWordsUsed() const +{ + return m_sz; +} + void SimplePropertiesSectionWriter::getPtr(struct SegmentedSectionPtr & dst){ // Set last ptr and size @@ -213,8 +259,11 @@ SimplePropertiesSectionWriter::getPtr(st dst.sz = 0; dst.i = RNIL; - m_pool.release(m_head->m_lastSegment); - + if (m_head) + { + m_pool.release(m_head->m_lastSegment); + } + m_sz = 0; m_pos = -1; m_head = m_currentSegment = 0; === modified file 'storage/ndb/src/kernel/vm/SimulatedBlock.cpp' --- a/storage/ndb/src/kernel/vm/SimulatedBlock.cpp 2008-02-20 09:04:29 +0000 +++ b/storage/ndb/src/kernel/vm/SimulatedBlock.cpp 2008-04-22 19:36:05 +0000 @@ -40,7 +40,7 @@ #include #include -extern EventLogger g_eventLogger; +extern EventLogger * g_eventLogger; #define ljamEntry() jamEntryLine(30000 + __LINE__) #define ljam() jamLine(30000 + __LINE__) @@ -710,9 +710,9 @@ SimulatedBlock::allocRecordAligned(const *unaligned_buffer = p; p = (void *)(((UintPtr)p + over_alloc) & ~(UintPtr)(over_alloc)); #ifdef VM_TRACE - g_eventLogger.info("'%s' (%u) %llu %llu, alignment correction %u bytes", - type, align, (Uint64)p, (Uint64)p+n*s, - (Uint32)((UintPtr)p - (UintPtr)*unaligned_buffer)); + g_eventLogger->info("'%s' (%u) %llu %llu, alignment correction %u bytes", + type, align, (Uint64)p, (Uint64)p+n*s, + (Uint32)((UintPtr)p - (UintPtr)*unaligned_buffer)); #endif } } === modified file 'storage/ndb/src/kernel/vm/SimulatedBlock.hpp' --- a/storage/ndb/src/kernel/vm/SimulatedBlock.hpp 2008-02-20 09:04:29 +0000 +++ b/storage/ndb/src/kernel/vm/SimulatedBlock.hpp 2008-05-29 15:58:58 +0000 @@ -822,5 +822,38 @@ BLOCK::addRecSignal(GlobalSignalNumber g #include "Mutex.hpp" +#ifdef ERROR_INSERT +#define RSS_AP_SNAPSHOT(x) Uint32 rss_##x +#define RSS_AP_SNAPSHOT_SAVE(x) rss_##x = x.getNoOfFree() +#define RSS_AP_SNAPSHOT_CHECK(x) ndbrequire(rss_##x == x.getNoOfFree()) + +#define RSS_OP_COUNTER(x) Uint32 x +#define RSS_OP_COUNTER_INIT(x) x = 0 +#define RSS_OP_ALLOC(x) x ++ +#define RSS_OP_FREE(x) x -- +#define RSS_OP_ALLOC_X(x,n) x += n +#define RSS_OP_FREE_X(x,n) x -= n + +#define RSS_OP_SNAPSHOT(x) Uint32 rss_##x +#define RSS_OP_SNAPSHOT_SAVE(x) rss_##x = x +#define RSS_OP_SNAPSHOT_CHECK(x) ndbrequire(rss_##x == x) +#else +#define RSS_AP_SNAPSHOT(x) +#define RSS_AP_SNAPSHOT_SAVE(x) +#define RSS_AP_SNAPSHOT_CHECK(x) + +#define RSS_OP_COUNTER(x) +#define RSS_OP_COUNTER_INIT(x) +#define RSS_OP_ALLOC(x) +#define RSS_OP_FREE(x) +#define RSS_OP_ALLOC_X(x,n) +#define RSS_OP_FREE_X(x,n) + +#define RSS_OP_SNAPSHOT(x) +#define RSS_OP_SNAPSHOT_SAVE(x) +#define RSS_OP_SNAPSHOT_CHECK(x) + +#endif + #endif === modified file 'storage/ndb/src/kernel/vm/WatchDog.cpp' --- a/storage/ndb/src/kernel/vm/WatchDog.cpp 2007-06-09 05:25:49 +0000 +++ b/storage/ndb/src/kernel/vm/WatchDog.cpp 2008-04-22 19:36:05 +0000 @@ -27,7 +27,7 @@ #include -extern EventLogger g_eventLogger; +extern EventLogger * g_eventLogger; extern "C" void* @@ -136,12 +136,12 @@ WatchDog::run() { struct tms my_tms; times(&my_tms); - g_eventLogger.info("Watchdog: User time: %llu System time: %llu", - (Uint64)my_tms.tms_utime, - (Uint64)my_tms.tms_stime); - g_eventLogger.warning("Watchdog: Warning overslept %u ms, expected %u ms.", - NdbTick_getMicrosPassed(last_time, now)/1000, - sleep_time); + g_eventLogger->info("Watchdog: User time: %llu System time: %llu", + (Uint64)my_tms.tms_utime, + (Uint64)my_tms.tms_stime); + g_eventLogger->warning("Watchdog: Warning overslept %u ms, expected %u ms.", + NdbTick_getMicrosPassed(last_time, now)/1000, + sleep_time); } last_time = now; @@ -171,13 +171,13 @@ WatchDog::run() if (warn) { const char *last_stuck_action = get_action(oldIPValue); - g_eventLogger.warning("Ndb kernel is stuck in: %s", last_stuck_action); + g_eventLogger->warning("Ndb kernel is stuck in: %s", last_stuck_action); { struct tms my_tms; times(&my_tms); - g_eventLogger.info("Watchdog: User time: %llu System time: %llu", - (Uint64)my_tms.tms_utime, - (Uint64)my_tms.tms_stime); + g_eventLogger->info("Watchdog: User time: %llu System time: %llu", + (Uint64)my_tms.tms_utime, + (Uint64)my_tms.tms_stime); } if (elapsed > 3 * theInterval) { === modified file 'storage/ndb/src/kernel/vm/bench_pool.cpp' --- a/storage/ndb/src/kernel/vm/bench_pool.cpp 2006-12-27 01:23:51 +0000 +++ b/storage/ndb/src/kernel/vm/bench_pool.cpp 2008-04-22 19:36:05 +0000 @@ -416,7 +416,7 @@ void test_wo(Uint32 cnt, Uint32 loop) } #include -extern EventLogger g_eventLogger; +extern EventLogger * g_eventLogger; int main(int argc, char **argv) === modified file 'storage/ndb/src/kernel/vm/ndbd_malloc_impl.cpp' --- a/storage/ndb/src/kernel/vm/ndbd_malloc_impl.cpp 2008-03-11 16:15:47 +0000 +++ b/storage/ndb/src/kernel/vm/ndbd_malloc_impl.cpp 2008-08-07 13:36:47 +0000 @@ -19,11 +19,7 @@ #include #include -#ifndef UNIT_TEST -extern EventLogger g_eventLogger; -#else -extern EventLogger g_eventLogger; -#endif +extern EventLogger * g_eventLogger; static int f_method_idx = 0; #ifdef NDBD_MALLOC_METHOD_SBRK @@ -174,7 +170,7 @@ Ndbd_mem_manager::Ndbd_mem_manager() if (sizeof(Free_page_data) != (4 * (1 << FPD_2LOG))) { - g_eventLogger.error("Invalid build, ndbd_malloc_impl.cpp:%d", __LINE__); + g_eventLogger->error("Invalid build, ndbd_malloc_impl.cpp:%d", __LINE__); abort(); } } @@ -266,11 +262,11 @@ Ndbd_mem_manager::init(bool alloc_less_m m_resource_limit[0].m_min = pages; } - g_eventLogger.info("Ndbd_mem_manager::init(%d) min: %dMb initial: %dMb", - alloc_less_memory, - (sizeof(Alloc_page)*m_resource_limit[0].m_min)>>20, - (sizeof(Alloc_page)*pages)>>20); - + g_eventLogger->info("Ndbd_mem_manager::init(%d) min: %dMb initial: %dMb", + alloc_less_memory, + (sizeof(Alloc_page)*m_resource_limit[0].m_min)>>20, + (sizeof(Alloc_page)*pages)>>20); + if (pages == 0) { return 0; @@ -318,21 +314,21 @@ Ndbd_mem_manager::init(bool alloc_less_m if (allocated < m_resource_limit[0].m_min) { - g_eventLogger. + g_eventLogger-> error("Unable to alloc min memory from OS: min: %lldMb " - " allocated: %lldMb", - (Uint64)(sizeof(Alloc_page)*m_resource_limit[0].m_min) >> 20, - (Uint64)(sizeof(Alloc_page)*allocated) >> 20); + " allocated: %lldMb", + (Uint64)(sizeof(Alloc_page)*m_resource_limit[0].m_min) >> 20, + (Uint64)(sizeof(Alloc_page)*allocated) >> 20); return false; } else if (allocated < pages) { - g_eventLogger. + g_eventLogger-> warning("Unable to alloc requested memory from OS: min: %lldMb" - " requested: %lldMb allocated: %lldMb", - (Uint64)(sizeof(Alloc_page)*m_resource_limit[0].m_min)>>20, - (Uint64)(sizeof(Alloc_page)*m_resource_limit[0].m_max)>>20, - (Uint64)(sizeof(Alloc_page)*allocated)>>20); + " requested: %lldMb allocated: %lldMb", + (Uint64)(sizeof(Alloc_page)*m_resource_limit[0].m_min)>>20, + (Uint64)(sizeof(Alloc_page)*m_resource_limit[0].m_max)>>20, + (Uint64)(sizeof(Alloc_page)*allocated)>>20); if (!alloc_less_memory) return false; } @@ -402,10 +398,10 @@ Ndbd_mem_manager::grow(Uint32 start, Uin " - Unable to use due to bitmap pages missaligned!!", __LINE__, start, cnt, start, (start_bmp << BPP_2LOG), (cnt >> (20 - 15))); - g_eventLogger.error("ndbd_malloc_impl.cpp:%d:grow(%d, %d) not using %uMb" - " - Unable to use due to bitmap pages missaligned!!", - __LINE__, start, cnt, - (cnt >> (20 - 15))); + g_eventLogger->error("ndbd_malloc_impl.cpp:%d:grow(%d, %d) not using %uMb" + " - Unable to use due to bitmap pages missaligned!!", + __LINE__, start, cnt, + (cnt >> (20 - 15))); dump(); return; @@ -881,12 +877,12 @@ main(int argc, char** argv) Timer timer[4]; printf("Startar modul test av Page Manager %dMb %ds\n", (sz >> 5), run_time); - g_eventLogger.createConsoleHandler(); - g_eventLogger.setCategory("keso"); - g_eventLogger.enable(Logger::LL_ON, Logger::LL_INFO); - g_eventLogger.enable(Logger::LL_ON, Logger::LL_CRITICAL); - g_eventLogger.enable(Logger::LL_ON, Logger::LL_ERROR); - g_eventLogger.enable(Logger::LL_ON, Logger::LL_WARNING); + g_eventLogger->createConsoleHandler(); + g_eventLogger->setCategory("keso"); + g_eventLogger->enable(Logger::LL_ON, Logger::LL_INFO); + g_eventLogger->enable(Logger::LL_ON, Logger::LL_CRITICAL); + g_eventLogger->enable(Logger::LL_ON, Logger::LL_ERROR); + g_eventLogger->enable(Logger::LL_ON, Logger::LL_WARNING); #define DEBUG 0 === modified file 'storage/ndb/src/mgmclient/Makefile.am' --- a/storage/ndb/src/mgmclient/Makefile.am 2007-08-01 07:24:01 +0000 +++ b/storage/ndb/src/mgmclient/Makefile.am 2008-04-25 06:32:23 +0000 @@ -37,9 +37,9 @@ LDADD_LOC = $(noinst_LTLIBRARIES) \ ../common/portlib/libportlib.la \ @readline_link@ \ $(top_builddir)/storage/ndb/src/libndbclient.la \ - $(top_builddir)/dbug/libdbug.a \ - $(top_builddir)/mysys/libmysys.a \ - $(top_builddir)/strings/libmystrings.a \ + $(top_builddir)/dbug/libdbuglt.la \ + $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/strings/libmystringslt.la \ @TERMCAP_LIB@ @NDB_SCI_LIBS@ ndb_mgm_LDFLAGS = @ndb_bin_am_ldflags@ === modified file 'storage/ndb/src/mgmsrv/Makefile.am' --- a/storage/ndb/src/mgmsrv/Makefile.am 2007-08-01 03:07:58 +0000 +++ b/storage/ndb/src/mgmsrv/Makefile.am 2008-04-25 06:32:23 +0000 @@ -40,9 +40,9 @@ INCLUDES_LOC = -I$(top_srcdir)/storage/n LDADD_LOC = $(top_builddir)/storage/ndb/src/mgmclient/CommandInterpreter.lo \ $(top_builddir)/storage/ndb/src/libndbclient.la \ - $(top_builddir)/dbug/libdbug.a \ - $(top_builddir)/mysys/libmysys.a \ - $(top_builddir)/strings/libmystrings.a \ + $(top_builddir)/dbug/libdbuglt.la \ + $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/strings/libmystringslt.la \ @readline_link@ \ @NDB_SCI_LIBS@ \ @TERMCAP_LIB@ === modified file 'storage/ndb/src/mgmsrv/MgmtSrvr.cpp' --- a/storage/ndb/src/mgmsrv/MgmtSrvr.cpp 2008-03-14 13:32:49 +0000 +++ b/storage/ndb/src/mgmsrv/MgmtSrvr.cpp 2008-04-22 19:36:05 +0000 @@ -102,7 +102,7 @@ MgmtSrvr::logLevelThread_C(void* m) return 0; } -extern EventLogger g_eventLogger; +extern EventLogger * g_eventLogger; #ifdef NOT_USED static NdbOut& @@ -223,7 +223,7 @@ MgmtSrvr::startEventLog() { NdbMutex_Lock(m_configMutex); - g_eventLogger.setCategory("MgmSrvr"); + g_eventLogger->setCategory("MgmSrvr"); ndb_mgm_configuration_iterator iter(* _config->m_configValues, CFG_SECTION_NODE); @@ -250,7 +250,7 @@ MgmtSrvr::startEventLog() clusterLog); } errStr[0]='\0'; - if(!g_eventLogger.addHandler(logdest, &err, sizeof(errStr), errStr)) { + if(!g_eventLogger->addHandler(logdest, &err, sizeof(errStr), errStr)) { ndbout << "Warning: could not add log destination \"" << logdest.c_str() << "\". Reason: "; if(err) @@ -266,7 +266,7 @@ MgmtSrvr::startEventLog() void MgmtSrvr::stopEventLog() { - g_eventLogger.close(); + g_eventLogger->close(); } bool @@ -274,21 +274,21 @@ MgmtSrvr::setEventLogFilter(int severity { Logger::LoggerLevel level = (Logger::LoggerLevel)severity; if (enable > 0) { - g_eventLogger.enable(level); + g_eventLogger->enable(level); } else if (enable == 0) { - g_eventLogger.disable(level); - } else if (g_eventLogger.isEnable(level)) { - g_eventLogger.disable(level); + g_eventLogger->disable(level); + } else if (g_eventLogger->isEnable(level)) { + g_eventLogger->disable(level); } else { - g_eventLogger.enable(level); + g_eventLogger->enable(level); } - return g_eventLogger.isEnable(level); + return g_eventLogger->isEnable(level); } bool MgmtSrvr::isEventLogFilterEnabled(int severity) { - return g_eventLogger.isEnable((Logger::LoggerLevel)severity); + return g_eventLogger->isEnable((Logger::LoggerLevel)severity); } int MgmtSrvr::translateStopRef(Uint32 errCode) @@ -693,11 +693,11 @@ int MgmtSrvr::okToSendTo(NodeId nodeId, void report_unknown_signal(SimpleSignal *signal) { - g_eventLogger.error("Unknown signal received. SignalNumber: " - "%i from (%d, %x)", - signal->readSignalNumber(), - refToNode(signal->header.theSendersBlockRef), - refToBlock(signal->header.theSendersBlockRef)); + g_eventLogger->error("Unknown signal received. SignalNumber: " + "%i from (%d, %x)", + signal->readSignalNumber(), + refToNode(signal->header.theSendersBlockRef), + refToBlock(signal->header.theSendersBlockRef)); } /***************************************************************************** @@ -2012,13 +2012,13 @@ MgmtSrvr::handleReceivedSignal(NdbApiSig break; default: - g_eventLogger.error("Unknown signal received. SignalNumber: " - "%i from (%d, %x)", - gsn, - refToNode(signal->theSendersBlockRef), - refToBlock(signal->theSendersBlockRef)); + g_eventLogger->error("Unknown signal received. SignalNumber: " + "%i from (%d, %x)", + gsn, + refToNode(signal->theSendersBlockRef), + refToBlock(signal->theSendersBlockRef)); } - + if (theWaitState == NO_WAIT) { NdbCondition_Signal(theMgmtWaitForResponseCondPtr); } @@ -2367,11 +2367,12 @@ MgmtSrvr::alloc_node_id(NodeId * nodeId, ndb_error_string(res, buf, sizeof(buf)); error_string.appfmt("Cluster refused allocation of id %d. Error: %d (%s).", save_id_found, res, buf); - g_eventLogger.warning("Cluster refused allocation of id %d. " - "Connection from ip %s. " - "Returned error string \"%s\"", save_id_found, - inet_ntoa(((struct sockaddr_in *)(client_addr))->sin_addr), - error_string.c_str()); + g_eventLogger->warning("Cluster refused allocation of id %d. " + "Connection from ip %s. " + "Returned error string \"%s\"", save_id_found, + inet_ntoa(((struct sockaddr_in *) + (client_addr))->sin_addr), + error_string.c_str()); DBUG_RETURN(false); } } @@ -2411,9 +2412,9 @@ MgmtSrvr::alloc_node_id(NodeId * nodeId, char tmp_str[128]; m_reserved_nodes.getText(tmp_str); - g_eventLogger.info("Mgmt server state: nodeid %d reserved for ip %s, " - "m_reserved_nodes %s.", - id_found, get_connect_address(id_found), tmp_str); + g_eventLogger->info("Mgmt server state: nodeid %d reserved for ip %s, " + "m_reserved_nodes %s.", + id_found, get_connect_address(id_found), tmp_str); DBUG_RETURN(true); } @@ -2509,14 +2510,14 @@ MgmtSrvr::alloc_node_id(NodeId * nodeId, if (log_event || error_code == NDB_MGM_ALLOCID_CONFIG_MISMATCH) { - g_eventLogger.warning("Allocate nodeid (%d) failed. Connection from ip %s." - " Returned error string \"%s\"", - *nodeId, - client_addr != 0 - ? inet_ntoa(((struct sockaddr_in *) - (client_addr))->sin_addr) - : "", - error_string.c_str()); + g_eventLogger->warning("Allocate nodeid (%d) failed. Connection from ip %s." + " Returned error string \"%s\"", + *nodeId, + client_addr != 0 + ? inet_ntoa(((struct sockaddr_in *) + (client_addr))->sin_addr) + : "", + error_string.c_str()); NodeBitmask connected_nodes2; get_connected_nodes(connected_nodes2); @@ -2534,11 +2535,11 @@ MgmtSrvr::alloc_node_id(NodeId * nodeId, } } if (tmp_connected.length() > 0) - g_eventLogger.info("Mgmt server state: node id's %s connected but not reserved", - tmp_connected.c_str()); + g_eventLogger->info("Mgmt server state: node id's %s connected but not reserved", + tmp_connected.c_str()); if (tmp_not_connected.length() > 0) - g_eventLogger.info("Mgmt server state: node id's %s not connected but reserved", - tmp_not_connected.c_str()); + g_eventLogger->info("Mgmt server state: node id's %s not connected but reserved", + tmp_not_connected.c_str()); } DBUG_RETURN(false); } @@ -2570,8 +2571,8 @@ MgmtSrvr::eventReport(const Uint32 * the NodeId nodeId = eventReport->getNodeId(); Ndb_logevent_type type = eventReport->getEventType(); // Log event - g_eventLogger.log(type, theData, len, nodeId, - &m_event_listner[0].m_logLevel); + g_eventLogger->log(type, theData, len, nodeId, + &m_event_listner[0].m_logLevel); m_event_listner.log(type, theData, len, nodeId); } @@ -2769,8 +2770,8 @@ MgmtSrvr::Allocated_resources::~Allocate char tmp_str[128]; m_mgmsrv.m_reserved_nodes.getText(tmp_str); - g_eventLogger.info("Mgmt server state: nodeid %d freed, m_reserved_nodes %s.", - get_nodeid(), tmp_str); + g_eventLogger->info("Mgmt server state: nodeid %d freed, m_reserved_nodes %s.", + get_nodeid(), tmp_str); } } @@ -2786,8 +2787,8 @@ MgmtSrvr::Allocated_resources::is_timed_ { if (m_alloc_timeout && tick > m_alloc_timeout) { - g_eventLogger.info("Mgmt server state: nodeid %d timed out.", - get_nodeid()); + g_eventLogger->info("Mgmt server state: nodeid %d timed out.", + get_nodeid()); return true; } return false; === modified file 'storage/ndb/src/mgmsrv/Services.cpp' --- a/storage/ndb/src/mgmsrv/Services.cpp 2008-03-14 12:37:00 +0000 +++ b/storage/ndb/src/mgmsrv/Services.cpp 2008-08-07 13:36:47 +0000 @@ -36,7 +36,7 @@ extern bool g_StopServer; extern bool g_RestartServer; -extern EventLogger g_eventLogger; +extern EventLogger * g_eventLogger; static const unsigned int MAX_READ_TIMEOUT = 1000 ; static const unsigned int MAX_WRITE_TIMEOUT = 100 ; @@ -548,7 +548,7 @@ MgmApiSession::get_nodeid(Parser_t::Cont m_allocated_resources->reserve_node(tmp, timeout*1000); if (name) - g_eventLogger.info("Node %d: %s", tmp, name); + g_eventLogger->info("Node %d: %s", tmp, name); return; } === modified file 'storage/ndb/src/mgmsrv/main.cpp' --- a/storage/ndb/src/mgmsrv/main.cpp 2007-08-30 09:29:29 +0000 +++ b/storage/ndb/src/mgmsrv/main.cpp 2008-04-22 19:36:05 +0000 @@ -128,7 +128,7 @@ static MgmGlobals *glob= 0; */ bool g_StopServer; bool g_RestartServer; -extern EventLogger g_eventLogger; +extern EventLogger * g_eventLogger; enum ndb_mgmd_options { OPT_INTERACTIVE = NDB_STD_OPTIONS_LAST, @@ -317,14 +317,14 @@ start: BaseString::snprintf(msg, sizeof(msg), "NDB Cluster Management Server. %s", NDB_VERSION_STRING); ndbout_c(msg); - g_eventLogger.info(msg); + g_eventLogger->info(msg); BaseString::snprintf(msg, 256, "Id: %d, Command port: %s:%d", glob->localNodeId, _bind_address ? _bind_address : "*", glob->port); ndbout_c(msg); - g_eventLogger.info(msg); + g_eventLogger->info(msg); g_StopServer = false; g_RestartServer= false; @@ -345,13 +345,13 @@ start: } if(g_RestartServer) - g_eventLogger.info("Restarting server..."); + g_eventLogger->info("Restarting server..."); else - g_eventLogger.info("Shutting down server..."); + g_eventLogger->info("Shutting down server..."); glob->socketServer->stopServer(); // We disconnect from the ConfigRetreiver mgmd when we delete glob below glob->socketServer->stopSessions(true); - g_eventLogger.info("Shutdown complete"); + g_eventLogger->info("Shutdown complete"); the_end: delete glob; if(g_RestartServer) === modified file 'storage/ndb/src/ndbapi/ClusterMgr.cpp' --- a/storage/ndb/src/ndbapi/ClusterMgr.cpp 2007-12-10 10:10:27 +0000 +++ b/storage/ndb/src/ndbapi/ClusterMgr.cpp 2008-08-07 13:36:47 +0000 @@ -482,8 +482,11 @@ ClusterMgr::execNF_COMPLETEREP(const Uin const NodeId nodeId = nfComp->failedNodeId; assert(nodeId > 0 && nodeId < MAX_NDB_NODES); - theFacade.ReportNodeFailureComplete(nodeId); - theNodes[nodeId].nfCompleteRep = true; + if (theNodes[nodeId].nfCompleteRep == false) + { + theFacade.ReportNodeFailureComplete(nodeId); + theNodes[nodeId].nfCompleteRep = true; + } } void === modified file 'storage/ndb/src/ndbapi/DictCache.cpp' --- a/storage/ndb/src/ndbapi/DictCache.cpp 2008-04-08 14:13:10 +0000 +++ b/storage/ndb/src/ndbapi/DictCache.cpp 2008-08-07 13:36:47 +0000 @@ -20,8 +20,10 @@ #include #include -static NdbTableImpl f_invalid_table; -static NdbTableImpl f_altered_table; +static NdbTableImpl * f_invalid_table = 0; +static NdbTableImpl * f_altered_table = 0; + +static int ndb_dict_cache_count = 0; Ndb_local_table_info * Ndb_local_table_info::create(NdbTableImpl *table_impl, Uint32 sz) @@ -93,11 +95,29 @@ GlobalDictCache::GlobalDictCache(){ DBUG_ENTER("GlobalDictCache::GlobalDictCache"); m_tableHash.createHashTable(); m_waitForTableCondition = NdbCondition_Create(); + if (f_invalid_table == NULL) + f_invalid_table = new NdbTableImpl(); + if (f_altered_table == NULL) + f_altered_table = new NdbTableImpl(); + ndb_dict_cache_count++; DBUG_VOID_RETURN; } GlobalDictCache::~GlobalDictCache(){ DBUG_ENTER("GlobalDictCache::~GlobalDictCache"); + if (--ndb_dict_cache_count == 0) + { + if (f_invalid_table) + { + delete f_invalid_table; + f_invalid_table = 0; + } + if (f_altered_table) + { + delete f_altered_table; + f_altered_table = 0; + } + } NdbElement_t > * curr = m_tableHash.getNext(0); while(curr != 0){ Vector * vers = curr->theData; @@ -254,7 +274,7 @@ GlobalDictCache::put(const char * name, TableVersion & ver = vers->back(); if(ver.m_status != RETREIVING || !(ver.m_impl == 0 || - ver.m_impl == &f_invalid_table || ver.m_impl == &f_altered_table) || + ver.m_impl == f_invalid_table || ver.m_impl == f_altered_table) || ver.m_version != 0 || ver.m_refCount == 0){ abort(); @@ -271,7 +291,7 @@ GlobalDictCache::put(const char * name, ver.m_version = tab->m_version; ver.m_status = OK; } - else if (ver.m_impl == &f_invalid_table) + else if (ver.m_impl == f_invalid_table) { DBUG_PRINT("info", ("Table DROPPED invalid")); ver.m_impl = tab; @@ -279,7 +299,7 @@ GlobalDictCache::put(const char * name, ver.m_status = DROPPED; ver.m_impl->m_status = NdbDictionary::Object::Invalid; } - else if(ver.m_impl == &f_altered_table) + else if(ver.m_impl == f_altered_table) { DBUG_PRINT("info", ("Table DROPPED altered")); ver.m_impl = tab; @@ -440,7 +460,7 @@ GlobalDictCache::alter_table_rep(const c if(i == sz - 1 && ver.m_status == RETREIVING) { - ver.m_impl = altered ? &f_altered_table : &f_invalid_table; + ver.m_impl = altered ? f_altered_table : f_invalid_table; DBUG_VOID_RETURN; } } === modified file 'storage/ndb/src/ndbapi/Makefile.am' --- a/storage/ndb/src/ndbapi/Makefile.am 2007-05-29 11:46:57 +0000 +++ b/storage/ndb/src/ndbapi/Makefile.am 2008-04-25 06:32:23 +0000 @@ -68,9 +68,10 @@ include $(top_srcdir)/storage/ndb/config include $(top_srcdir)/storage/ndb/config/type_ndbapi.mk.am ndberror_check_LDFLAGS = \ - $(top_builddir)/dbug/libdbug.a \ - $(top_builddir)/mysys/libmysys.a \ - $(top_builddir)/strings/libmystrings.a + $(top_builddir)/dbug/libdbuglt.la \ + $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/strings/libmystringslt.la \ + $(top_builddir)/zlib/libzlt.la # Don't update the files from bitkeeper %::SCCS/s.% === modified file 'storage/ndb/src/ndbapi/Ndb.cpp' --- a/storage/ndb/src/ndbapi/Ndb.cpp 2008-03-12 13:13:49 +0000 +++ b/storage/ndb/src/ndbapi/Ndb.cpp 2008-08-07 13:36:47 +0000 @@ -550,7 +550,8 @@ Ndb::startTransaction(const NdbDictionar Uint32 hashValue; { Uint32 buf[4]; - Uint64 tmp[1000]; + const Uint32 MaxKeySizeInLongWords= (NDB_MAX_KEY_SIZE + 7) / 8; + Uint64 tmp[ MaxKeySizeInLongWords ]; if (keyLen >= sizeof(tmp)) { === modified file 'storage/ndb/src/ndbapi/NdbApiSignal.hpp' --- a/storage/ndb/src/ndbapi/NdbApiSignal.hpp 2006-12-23 19:20:40 +0000 +++ b/storage/ndb/src/ndbapi/NdbApiSignal.hpp 2008-05-16 13:08:36 +0000 @@ -76,6 +76,7 @@ public: /** * Fragmentation */ + bool isFragmented() const { return m_fragmentInfo != 0;} bool isFirstFragment() const { return m_fragmentInfo <= 1;} bool isLastFragment() const { return m_fragmentInfo == 0 || m_fragmentInfo == 3; === modified file 'storage/ndb/src/ndbapi/NdbBlob.cpp' --- a/storage/ndb/src/ndbapi/NdbBlob.cpp 2008-04-08 14:13:10 +0000 +++ b/storage/ndb/src/ndbapi/NdbBlob.cpp 2008-08-07 13:36:47 +0000 @@ -621,7 +621,7 @@ int NdbBlob::copyKeyFromRow(const NdbRecord *record, const char *row, Buf& packedBuf, Buf& unpackedBuf) { - char buf[256]; + char buf[NdbRecord::Attr::SHRINK_VARCHAR_BUFFSIZE]; DBUG_ENTER("NdbBlob::copyKeyFromRow"); assert(record->flags & NdbRecord::RecHasAllKeys); @@ -2419,33 +2419,62 @@ NdbBlob::preExecute(NdbTransaction::Exec } } if (isInsertOp() && theSetFlag) { - /* Add operations to insert parts and update the - * Blob head+inline in the main tables + /* If the main operation uses AbortOnError then + * we can add operations to insert parts and update + * the Blob head+inline here. + * If the main operation uses IgnoreError then + * we have to wait until we are sure that the main + * insert succeeded before performing any other + * operations (Otherwise we may perform duplicate insert, + * and the transaction can fail on the AbortOnError + * part operations or corrupt the head with the + * post-update operation) */ - if (theGetSetBytes > theInlineSize) { - // add ops to write rest of a setValue - assert(theSetBuf != NULL); - const char* buf = theSetBuf + theInlineSize; - Uint32 bytes = theGetSetBytes - theInlineSize; - assert(thePos == theInlineSize); - if (writeDataPrivate(buf, bytes) == -1) - DBUG_RETURN(-1); - } - - if (theHeadInlineUpdateFlag) + bool performExtraInsertOpsInPreExec= + (theNdbOp->m_abortOption != NdbOperation::AO_IgnoreError); + + if (performExtraInsertOpsInPreExec) { - NdbOperation* tOp = theNdbCon->getNdbOperation(theTable); - if (tOp == NULL || - tOp->updateTuple() == -1 || - setTableKeyValue(tOp) == -1 || - setHeadInlineValue(tOp) == -1) { - setErrorCode(NdbBlobImpl::ErrAbort); - DBUG_RETURN(-1); + DBUG_PRINT("info", + ("Insert abortError - extra ops added in preExecute")); + /* Add operations to insert parts and update the + * Blob head+inline in the main tables + */ + if (theGetSetBytes > theInlineSize) { + // add ops to write rest of a setValue + assert(theSetBuf != NULL); + const char* buf = theSetBuf + theInlineSize; + Uint32 bytes = theGetSetBytes - theInlineSize; + assert(thePos == theInlineSize); + if (writeDataPrivate(buf, bytes) == -1) + DBUG_RETURN(-1); } - if (thePartitionId != noPartitionId()) { - tOp->setPartitionId(thePartitionId); + + if (theHeadInlineUpdateFlag) + { + NdbOperation* tOp = theNdbCon->getNdbOperation(theTable); + if (tOp == NULL || + tOp->updateTuple() == -1 || + setTableKeyValue(tOp) == -1 || + setHeadInlineValue(tOp) == -1) { + setErrorCode(NdbBlobImpl::ErrAbort); + DBUG_RETURN(-1); + } + if (thePartitionId != noPartitionId()) { + tOp->setPartitionId(thePartitionId); + } + DBUG_PRINT("info", ("Insert : added op to update head+inline in preExecute")); } - DBUG_PRINT("info", ("Insert : added op to update head+inline")); + } + else + { + DBUG_PRINT("info", + ("Insert ignoreError - waiting for Blob head insert")); + /* Require that this insert op is completed + * before beginning more user ops - avoid interleave + * with delete etc. + */ + batch= true; } } @@ -2687,6 +2716,55 @@ NdbBlob::postExecute(NdbTransaction::Exe DBUG_RETURN(-1); } } + if (isInsertOp() && theSetFlag) { + /* For Inserts where the main table operation is IgnoreError, + * we perform extra operations on the head and inline parts + * now + */ + bool performDelayedInsertOpsInPostExec= + (theNdbOp->m_abortOption == NdbOperation::AO_IgnoreError); + + if (performDelayedInsertOpsInPostExec) + { + DBUG_PRINT("info", ("Insert IgnoreError adding extra ops")); + /* Check the main table op for an error (don't proceed if + * it failed) + */ + if (theNdbOp->theError.code == 0) + { + /* Add operations to insert parts and update the + * Blob head+inline in the main table + */ + if (theGetSetBytes > theInlineSize) { + // add ops to write rest of a setValue + assert(theSetBuf != NULL); + const char* buf = theSetBuf + theInlineSize; + Uint32 bytes = theGetSetBytes - theInlineSize; + assert(thePos == theInlineSize); + if (writeDataPrivate(buf, bytes) == -1) + DBUG_RETURN(-1); + } + + if (theHeadInlineUpdateFlag) + { + NdbOperation* tOp = theNdbCon->getNdbOperation(theTable); + if (tOp == NULL || + tOp->updateTuple() == -1 || + setTableKeyValue(tOp) == -1 || + setHeadInlineValue(tOp) == -1) { + setErrorCode(NdbBlobImpl::ErrAbort); + DBUG_RETURN(-1); + } + if (thePartitionId != noPartitionId()) { + tOp->setPartitionId(thePartitionId); + } + DBUG_PRINT("info", ("Insert : added op to update head+inline")); + } + } + // NOTE : Could map IgnoreError insert error onto Blob here + } + } + if (isUpdateOp()) { assert(anExecType == NdbTransaction::NoCommit); getHeadFromRecAttr(); === modified file 'storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp' --- a/storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp 2008-04-02 14:32:01 +0000 +++ b/storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp 2008-08-07 13:36:47 +0000 @@ -4542,13 +4542,12 @@ NdbDictionaryImpl::listObjects(List& lis ListTablesReq req; req.requestData = 0; + req.tableId = 0; req.setTableType(getKernelConstant(type, objectTypeMapping, 0)); req.setListNames(true); if (!list2.count) - return m_receiver.listObjects(list, req.requestData, - m_ndb.usingFullyQualifiedNames()); - ret = m_receiver.listObjects(list1, req.requestData, - m_ndb.usingFullyQualifiedNames()); + return m_receiver.listObjects(list, req, m_ndb.usingFullyQualifiedNames()); + ret = m_receiver.listObjects(list1, req, m_ndb.usingFullyQualifiedNames()); if (ret) return ret; list.count = list1.count + list2.count; @@ -4576,25 +4575,168 @@ NdbDictionaryImpl::listIndexes(List& lis ListTablesReq req; req.requestData = 0; req.setTableId(indexId); + req.tableType = 0; req.setListNames(true); req.setListIndexes(true); - return m_receiver.listObjects(list, req.requestData, m_ndb.usingFullyQualifiedNames()); + return m_receiver.listObjects(list, req, m_ndb.usingFullyQualifiedNames()); } int NdbDictInterface::listObjects(NdbDictionary::Dictionary::List& list, - Uint32 requestData, bool fullyQualifiedNames) + ListTablesReq& ltreq, bool fullyQualifiedNames) { + bool listTablesLongSignal = false; NdbApiSignal tSignal(m_reference); ListTablesReq* const req = CAST_PTR(ListTablesReq, tSignal.getDataPtrSend()); req->senderRef = m_reference; req->senderData = 0; - req->requestData = requestData; + req->requestData = ltreq.requestData; + req->setTableId(ltreq.getTableId()); + req->setTableType(ltreq.getTableType()); + if (ltreq.getTableId() > 4096) + { + /* + Enforce new long signal format, + if this is not supported by the + called node the request will fail + */ + listTablesLongSignal = true; + } + + /* + Set table id and type according to old format + in case sent to old nodes (during upgrade). + */ + req->oldSetTableId(ltreq.getTableId()); + req->oldSetTableType(ltreq.getTableType()); + tSignal.theReceiversBlockNumber = DBDICT; tSignal.theVerId_signalNumber = GSN_LIST_TABLES_REQ; tSignal.theLength = ListTablesReq::SignalLength; - if (listObjects(&tSignal) != 0) + if (listObjects(&tSignal, listTablesLongSignal) != 0) return -1; + + if (listTablesLongSignal) + { + return unpackListTables(list, fullyQualifiedNames); + } + else + { + return unpackOldListTables(list, fullyQualifiedNames); + } +} + +int +NdbDictInterface::unpackListTables(NdbDictionary::Dictionary::List& list, + bool fullyQualifiedNames) +{ + Uint32 count = 0; + Uint32* tableData = (Uint32*)m_tableData.get_data(); + Uint32* tableNames = (Uint32*)m_tableNames.get_data(); + const Uint32 listTablesDataSizeInWords = (sizeof(ListTablesData) + 3) / 4; + list.count = m_noOfTables; + list.elements = new NdbDictionary::Dictionary::List::Element[m_noOfTables]; + + while (count < m_noOfTables) + { + NdbDictionary::Dictionary::List::Element& element = list.elements[count]; + ListTablesData* ltd = (ListTablesData *) tableData; + tableData += listTablesDataSizeInWords; + element.id = ltd->getTableId(); + element.type = (NdbDictionary::Object::Type) + getApiConstant(ltd->getTableType(), objectTypeMapping, 0); + element.state = (NdbDictionary::Object::State) + getApiConstant(ltd->getTableState(), objectStateMapping, 0); + element.store = (NdbDictionary::Object::Store) + getApiConstant(ltd->getTableStore(), objectStoreMapping, 0); + element.temp = ltd->getTableTemp(); + // table or index name + BaseString databaseName; + BaseString schemaName; + BaseString objectName; + if (!databaseName || !schemaName || !objectName) + { + m_error.code= 4000; + return -1; + } + Uint32 size = tableNames[0]; + Uint32 wsize = (size + 3) / 4; + tableNames++; + if ((element.type == NdbDictionary::Object::UniqueHashIndex) || + (element.type == NdbDictionary::Object::OrderedIndex)) { + char * indexName = new char[size]; + if (indexName == NULL) + { + m_error.code= 4000; + return -1; + } + memcpy(indexName, (char *) tableNames, size); + if (!(databaseName = Ndb::getDatabaseFromInternalName(indexName)) || + !(schemaName = Ndb::getSchemaFromInternalName(indexName))) + { + delete [] indexName; + m_error.code= 4000; + return -1; + } + objectName = BaseString(Ndb::externalizeIndexName(indexName, + fullyQualifiedNames)); + delete [] indexName; + } else if ((element.type == NdbDictionary::Object::SystemTable) || + (element.type == NdbDictionary::Object::UserTable)) { + char * tableName = new char[size]; + if (tableName == NULL) + { + m_error.code= 4000; + return -1; + } + memcpy(tableName, (char *) tableNames, size); + if (!(databaseName = Ndb::getDatabaseFromInternalName(tableName)) || + !(schemaName = Ndb::getSchemaFromInternalName(tableName))) + { + delete [] tableName; + m_error.code= 4000; + return -1; + } + objectName = BaseString(Ndb::externalizeTableName(tableName, + fullyQualifiedNames)); + delete [] tableName; + } + else { + char * otherName = new char[size]; + if (otherName == NULL) + { + m_error.code= 4000; + return -1; + } + memcpy(otherName, (char *) tableNames, size); + if (!(objectName = BaseString(otherName))) + { + m_error.code= 4000; + return -1; + } + delete [] otherName; + } + if (!(element.database = new char[databaseName.length() + 1]) || + !(element.schema = new char[schemaName.length() + 1]) || + !(element.name = new char[objectName.length() + 1])) + { + m_error.code= 4000; + return -1; + } + strcpy(element.database, databaseName.c_str()); + strcpy(element.schema, schemaName.c_str()); + strcpy(element.name, objectName.c_str()); + count++; + tableNames += wsize; + } + + return 0; +} + +int +NdbDictInterface::unpackOldListTables(NdbDictionary::Dictionary::List& list, + bool fullyQualifiedNames) +{ // count const Uint32* data = (const Uint32*)m_buffer.get_data(); const unsigned length = m_buffer.length() / 4; @@ -4628,14 +4770,14 @@ NdbDictInterface::listObjects(NdbDiction while (pos < length) { NdbDictionary::Dictionary::List::Element& element = list.elements[count]; Uint32 d = data[pos++]; - element.id = ListTablesConf::getTableId(d); + element.id = OldListTablesConf::getTableId(d); element.type = (NdbDictionary::Object::Type) - getApiConstant(ListTablesConf::getTableType(d), objectTypeMapping, 0); + getApiConstant(OldListTablesConf::getTableType(d), objectTypeMapping, 0); element.state = (NdbDictionary::Object::State) - getApiConstant(ListTablesConf::getTableState(d), objectStateMapping, 0); + getApiConstant(OldListTablesConf::getTableState(d), objectStateMapping, 0); element.store = (NdbDictionary::Object::Store) - getApiConstant(ListTablesConf::getTableStore(d), objectStoreMapping, 0); - element.temp = ListTablesConf::getTableTemp(d); + getApiConstant(OldListTablesConf::getTableStore(d), objectStoreMapping, 0); + element.temp = OldListTablesConf::getTableTemp(d); // table or index name Uint32 n = (data[pos++] + 3) >> 2; BaseString databaseName; @@ -4715,7 +4857,8 @@ NdbDictInterface::listObjects(NdbDiction } int -NdbDictInterface::listObjects(NdbApiSignal* signal) +NdbDictInterface::listObjects(NdbApiSignal* signal, + bool& listTablesLongSignal) { const Uint32 RETRIES = 100; for (Uint32 i = 0; i < RETRIES; i++) { @@ -4733,6 +4876,24 @@ NdbDictInterface::listObjects(NdbApiSign m_error.code= 4009; return -1; } + NodeInfo info = m_transporter->theClusterMgr->getNodeInfo(aNodeId).m_info; + if (ndbd_LIST_TABLES_CONF_long_signal(info.m_version)) + { + /* + Called node will return a long signal + */ + listTablesLongSignal = true; + } + else if (listTablesLongSignal) + { + /* + We are requesting info from a table with table id > 4096 + and older versions don't support that, bug#36044 + */ + m_error.code= 4105; + return -1; + } + if (m_transporter->sendSignal(signal, aNodeId) != 0) { continue; } @@ -4751,15 +4912,94 @@ NdbDictInterface::listObjects(NdbApiSign void NdbDictInterface::execLIST_TABLES_CONF(NdbApiSignal* signal, - LinearSectionPtr ptr[3]) + LinearSectionPtr ptr[3]) +{ + Uint16 nodeId = refToNode(signal->theSendersBlockRef); + NodeInfo info = m_transporter->theClusterMgr->getNodeInfo(nodeId).m_info; + if (!ndbd_LIST_TABLES_CONF_long_signal(info.m_version)) + { + /* + Sender doesn't support new signal format + */ + NdbDictInterface::execOLD_LIST_TABLES_CONF(signal, ptr); + return; + } + + if (signal->isFirstFragment()) + { + m_fragmentId = signal->getFragmentId(); + m_noOfTables = 0; + m_tableData.clear(); + m_tableNames.clear(); + } + else + { + Uint32 fid = signal->getFragmentId(); + if (m_fragmentId != signal->getFragmentId()) + { + abort(); + } + } + + /* + Save the count + */ + const ListTablesConf* const conf= + CAST_CONSTPTR(ListTablesConf, signal->getDataPtr()); + m_noOfTables+= conf->noOfTables; + + bool fragmented = signal->isFragmented(); + Uint32 sigLen = signal->getLength() - 1; + const Uint32 secs = signal->m_noOfSections; + const Uint32 directMap[3] = {0,1,2}; + const Uint32 * const secNos = + (fragmented) ? + &signal->getDataPtr()[sigLen - secs] + : (const Uint32 *) &directMap; + + for(Uint32 i = 0; iisLastFragment()){ + return; + } + + m_waiter.signal(NO_WAIT); +} + + +void +NdbDictInterface::execOLD_LIST_TABLES_CONF(NdbApiSignal* signal, + LinearSectionPtr ptr[3]) { - const unsigned off = ListTablesConf::HeaderLength; + const unsigned off = OldListTablesConf::HeaderLength; const unsigned len = (signal->getLength() - off); if (m_buffer.append(signal->getDataPtr() + off, len << 2)) { m_error.code= 4000; } - if (signal->getLength() < ListTablesConf::SignalLength) { + if (signal->getLength() < OldListTablesConf::SignalLength) { // last signal has less than full length m_waiter.signal(NO_WAIT); } @@ -4816,7 +5056,7 @@ NdbDictInterface::execWAIT_GCP_CONF(NdbA void NdbDictInterface::execWAIT_GCP_REF(NdbApiSignal* signal, - LinearSectionPtr ptr[3]) + LinearSectionPtr ptr[3]) { m_waiter.signal(NO_WAIT); } === modified file 'storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp' --- a/storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp 2008-04-01 15:37:28 +0000 +++ b/storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp 2008-05-16 13:08:36 +0000 @@ -31,6 +31,8 @@ #include "NdbWaiter.hpp" #include "DictCache.hpp" +class ListTablesReq; + bool is_ndb_blob_table(const char* name, Uint32* ptab_id = 0, Uint32* pcol_no = 0); bool @@ -506,8 +508,14 @@ public: int executeSubscribeEvent(class Ndb & ndb, NdbEventOperationImpl &); int stopSubscribeEvent(class Ndb & ndb, NdbEventOperationImpl &); - int listObjects(NdbDictionary::Dictionary::List& list, Uint32 requestData, bool fullyQualifiedNames); - int listObjects(NdbApiSignal* signal); + int listObjects(NdbDictionary::Dictionary::List& list, + ListTablesReq& ltreq, bool fullyQualifiedNames); + int listObjects(NdbApiSignal* signal, bool& listTablesLongSignal); + + int unpackListTables(NdbDictionary::Dictionary::List& list, + bool fullyQualifiedNames); + int unpackOldListTables(NdbDictionary::Dictionary::List& list, + bool fullyQualifiedNames); NdbTableImpl * getTable(int tableId, bool fullyQualifiedNames); NdbTableImpl * getTable(const BaseString& name, bool fullyQualifiedNames); @@ -584,6 +592,7 @@ private: void execDROP_TABLE_REF(NdbApiSignal *, LinearSectionPtr ptr[3]); void execDROP_TABLE_CONF(NdbApiSignal *, LinearSectionPtr ptr[3]); + void execOLD_LIST_TABLES_CONF(NdbApiSignal *, LinearSectionPtr ptr[3]); void execLIST_TABLES_CONF(NdbApiSignal *, LinearSectionPtr ptr[3]); void execCREATE_FILE_REF(NdbApiSignal *, LinearSectionPtr ptr[3]); @@ -603,6 +612,10 @@ private: Uint32 m_fragmentId; UtilBuffer m_buffer; + + Uint32 m_noOfTables; + UtilBuffer m_tableData; + UtilBuffer m_tableNames; }; class NdbDictionaryImpl; === modified file 'storage/ndb/src/ndbapi/NdbEventOperationImpl.cpp' --- a/storage/ndb/src/ndbapi/NdbEventOperationImpl.cpp 2008-04-02 14:32:01 +0000 +++ b/storage/ndb/src/ndbapi/NdbEventOperationImpl.cpp 2008-08-07 13:36:47 +0000 @@ -44,7 +44,7 @@ #include "ndb_internal.hpp" #include -extern EventLogger g_eventLogger; +extern EventLogger * g_eventLogger; static Gci_container_pod g_empty_gci_container; @@ -1220,8 +1220,8 @@ NdbEventBuffer::flushIncompleteEvents(Ui Uint32 minpos = m_min_gci_index; Uint32 maxpos = m_max_gci_index; - g_eventLogger.info("Flushing incomplete GCI:s < %u/%u", - Uint32(gci >> 32), Uint32(gci)); + g_eventLogger->info("Flushing incomplete GCI:s < %u/%u", + Uint32(gci >> 32), Uint32(gci)); while (minpos != maxpos && array[minpos] < gci) { Gci_container* tmp = find_bucket(array[minpos]); @@ -1929,11 +1929,11 @@ NdbEventBuffer::execSUB_GCP_COMPLETE_REP goto do_complete; } /** out of order something */ - g_eventLogger.info("out of order bucket: %d gci: %u/%u minGCI: %u/%u m_latestGCI: %u/%u", - (int)(bucket-(Gci_container*)m_active_gci.getBase()), - Uint32(gci >> 32), Uint32(gci), - Uint32(minGCI >> 32), Uint32(minGCI), - Uint32(m_latestGCI >> 32), Uint32(m_latestGCI)); + g_eventLogger->info("out of order bucket: %d gci: %u/%u minGCI: %u/%u m_latestGCI: %u/%u", + (int)(bucket-(Gci_container*)m_active_gci.getBase()), + Uint32(gci >> 32), Uint32(gci), + Uint32(minGCI >> 32), Uint32(minGCI), + Uint32(m_latestGCI >> 32), Uint32(m_latestGCI)); bucket->m_state = Gci_container::GC_COMPLETE; bucket->m_gcp_complete_rep_count = 1; // Prevent from being reused m_latest_complete_GCI = gci; @@ -1957,9 +1957,9 @@ NdbEventBuffer::complete_outof_order_gci Uint64 stop_gci = m_latest_complete_GCI; Uint64 start_gci = array[minpos]; - g_eventLogger.info("complete_outof_order_gcis from: %u/%u to: %u/%u", - Uint32(start_gci >> 32), Uint32(start_gci), - Uint32(stop_gci >> 32), Uint32(stop_gci)); + g_eventLogger->info("complete_outof_order_gcis from: %u/%u to: %u/%u", + Uint32(start_gci >> 32), Uint32(start_gci), + Uint32(stop_gci >> 32), Uint32(stop_gci)); assert(start_gci <= stop_gci); do === modified file 'storage/ndb/src/ndbapi/NdbIndexStat.cpp' --- a/storage/ndb/src/ndbapi/NdbIndexStat.cpp 2008-02-19 15:00:29 +0000 +++ b/storage/ndb/src/ndbapi/NdbIndexStat.cpp 2008-06-03 10:00:31 +0000 @@ -398,7 +398,7 @@ NdbIndexStat::addKeyPartInfo(const NdbRe Uint32* keyStatData, Uint32& keyLength) { - char buf[256]; // For shrinking MySQLD varchars + char buf[NdbRecord::Attr::SHRINK_VARCHAR_BUFFSIZE]; Uint32 key_index= record->key_indexes[ keyPartNum ]; const NdbRecord::Attr *column= &record->columns[ key_index ]; === modified file 'storage/ndb/src/ndbapi/NdbInterpretedCode.cpp' --- a/storage/ndb/src/ndbapi/NdbInterpretedCode.cpp 2008-04-07 09:52:25 +0000 +++ b/storage/ndb/src/ndbapi/NdbInterpretedCode.cpp 2008-05-22 16:22:34 +0000 @@ -511,14 +511,25 @@ NdbInterpretedCode::branch_col(Uint32 br if (val == NULL) len = 0; else { - if (! col->getStringType()) { - // prevent assert in NdbSqlUtil on length error - Uint32 sizeInBytes = col->m_attrSize * col->m_arraySize; - if (len != 0 && len != sizeInBytes) + if (! col->getStringType()) + { + /* Fixed size type */ + len= col->m_attrSize * col->m_arraySize; + } + else + { + /* For Like and Not like we must use the passed in + * length. Otherwise we use the length encoded + * in the passed string + */ + if ((branch_type != Interpreter::LIKE) && + (branch_type != Interpreter::NOT_LIKE)) { - DBUG_RETURN(error(BadLength)); + if (! col->get_var_length(val, len)) + { + DBUG_RETURN(error(BadLength)); + } } - len = sizeInBytes; } } === modified file 'storage/ndb/src/ndbapi/NdbOperation.cpp' --- a/storage/ndb/src/ndbapi/NdbOperation.cpp 2008-02-19 10:41:22 +0000 +++ b/storage/ndb/src/ndbapi/NdbOperation.cpp 2008-04-17 06:59:16 +0000 @@ -313,26 +313,62 @@ NdbOperation::getValue(const NdbDictiona int NdbOperation::equal(const char* anAttrName, const char* aValuePassed) { - return equal_impl(m_accessTable->getColumn(anAttrName), aValuePassed); + const NdbColumnImpl* col = m_accessTable->getColumn(anAttrName); + if (col == NULL) + { + setErrorCode(4004); + return -1; + } + else + { + return equal_impl(col, aValuePassed); + } } int NdbOperation::equal(Uint32 anAttrId, const char* aValuePassed) { - return equal_impl(m_accessTable->getColumn(anAttrId), aValuePassed); + const NdbColumnImpl* col = m_accessTable->getColumn(anAttrId); + if (col == NULL) + { + setErrorCode(4004); + return -1; + } + else + { + return equal_impl(col, aValuePassed); + } } int NdbOperation::setValue(const char* anAttrName, const char* aValuePassed) { - return setValue(m_currentTable->getColumn(anAttrName), aValuePassed); + const NdbColumnImpl* col = m_currentTable->getColumn(anAttrName); + if (col == NULL) + { + setErrorCode(4004); + return -1; + } + else + { + return setValue(col, aValuePassed); + } } int NdbOperation::setValue(Uint32 anAttrId, const char* aValuePassed) { - return setValue(m_currentTable->getColumn(anAttrId), aValuePassed); + const NdbColumnImpl* col = m_currentTable->getColumn(anAttrId); + if (col == NULL) + { + setErrorCode(4004); + return -1; + } + else + { + return setValue(col, aValuePassed); + } } NdbBlob* === modified file 'storage/ndb/src/ndbapi/NdbOperationDefine.cpp' --- a/storage/ndb/src/ndbapi/NdbOperationDefine.cpp 2008-04-08 14:13:10 +0000 +++ b/storage/ndb/src/ndbapi/NdbOperationDefine.cpp 2008-08-07 13:36:47 +0000 @@ -481,7 +481,7 @@ NdbOperation::setValue( const NdbColumnI int tReturnCode; Uint32 tAttrId; Uint32 tData; - Uint32 tempData[2000]; + Uint32 tempData[ NDB_MAX_TUPLE_SIZE_IN_WORDS ]; OperationType tOpType = theOperationType; OperationStatus tStatus = theStatus; @@ -884,7 +884,9 @@ NdbOperation::setVarValue(const NdbColum DBUG_PRINT("info", ("aLen=%u", (Uint32)aLen)); // wl3717_todo not optimal.. - Uint64 buf[2048]; + const Uint32 MaxTupleSizeInLongWords= (NDB_MAX_TUPLE_SIZE + 7)/ 8; + Uint64 buf[ MaxTupleSizeInLongWords ]; + assert( aLen < (NDB_MAX_TUPLE_SIZE - 2) ); unsigned char* p = (unsigned char*)buf; p[0] = (aLen & 0xff); p[1] = (aLen >> 8); === modified file 'storage/ndb/src/ndbapi/NdbOperationExec.cpp' --- a/storage/ndb/src/ndbapi/NdbOperationExec.cpp 2008-04-01 15:37:28 +0000 +++ b/storage/ndb/src/ndbapi/NdbOperationExec.cpp 2008-06-03 10:00:31 +0000 @@ -606,7 +606,7 @@ int NdbOperation::buildSignalsNdbRecord(Uint32 aTC_ConnectPtr, Uint64 aTransId) { - char buf[256]; + char buf[NdbRecord::Attr::SHRINK_VARCHAR_BUFFSIZE]; Uint32 *keyInfoPtr, *attrInfoPtr; Uint32 remain; int res; === modified file 'storage/ndb/src/ndbapi/NdbOperationInt.cpp' --- a/storage/ndb/src/ndbapi/NdbOperationInt.cpp 2008-04-08 14:13:10 +0000 +++ b/storage/ndb/src/ndbapi/NdbOperationInt.cpp 2008-08-07 13:36:47 +0000 @@ -58,12 +58,28 @@ NdbOperation::initInterpreter(){ theTotalCurrAI_Len = AttrInfo::SectionSizeInfoLength; } +bool +NdbOperation::isNdbRecordOperation() +{ + /* All scans are 'NdbRecord'. For PK and UK access + * check if we've got an m_attribute_record set + */ + return !(((m_type == PrimaryKeyAccess) || + (m_type == UniqueIndexAccess)) && + (m_attribute_record == NULL)); +} + int NdbOperation::incCheck(const NdbColumnImpl* tNdbColumnImpl) { + if (isNdbRecordOperation()) { + /* Wrong API. Use NdbInterpretedCode for NdbRecord operations */ + setErrorCodeAbort(4537); + return -1; + } + if ((theInterpretIndicator == 1)) { - if ((tNdbColumnImpl == NULL) || - (theStatus == UseNdbRecord)) + if (tNdbColumnImpl == NULL) goto inc_check_error1; if ((tNdbColumnImpl->getInterpretableType() != true) || (tNdbColumnImpl->m_pk != false) || @@ -90,11 +106,6 @@ NdbOperation::incCheck(const NdbColumnIm return -1; inc_check_error1: - if (theStatus == UseNdbRecord) { - /* Wrong API. Use NdbInterpretedCode for NdbRecord operations */ - setErrorCodeAbort(4537); - return -1; - } setErrorCodeAbort(4004); return -1; @@ -118,9 +129,14 @@ NdbOperation::incCheck(const NdbColumnIm int NdbOperation::write_attrCheck(const NdbColumnImpl* tNdbColumnImpl) { + if (isNdbRecordOperation()) { + /* Wrong API. Use NdbInterpretedCode for NdbRecord operations */ + setErrorCodeAbort(4537); + return -1; + } + if ((theInterpretIndicator == 1)) { - if ((tNdbColumnImpl == NULL) || - (theStatus == UseNdbRecord)) + if (tNdbColumnImpl == NULL) goto write_attr_check_error1; if ((tNdbColumnImpl->getInterpretableType() == false) || (tNdbColumnImpl->m_pk)) @@ -143,11 +159,6 @@ NdbOperation::write_attrCheck(const NdbC return -1; write_attr_check_error1: - if (theStatus == UseNdbRecord) { - /* Wrong API. Use NdbInterpretedCode for NdbRecord operations */ - setErrorCodeAbort(4537); - return -1; - } setErrorCodeAbort(4004); return -1; @@ -167,9 +178,14 @@ write_attr_check_error2: int NdbOperation::read_attrCheck(const NdbColumnImpl* tNdbColumnImpl) { + if (isNdbRecordOperation()) { + /* Wrong API. Use NdbInterpretedCode for NdbRecord operations */ + setErrorCodeAbort(4537); + return -1; + } + if ((theInterpretIndicator == 1)) { - if ((tNdbColumnImpl == NULL) || - (theStatus == UseNdbRecord)) + if (tNdbColumnImpl == NULL) goto read_attr_check_error1; if (tNdbColumnImpl->getInterpretableType() == false) goto read_attr_check_error2; @@ -194,11 +210,6 @@ NdbOperation::read_attrCheck(const NdbCo return -1; read_attr_check_error1: - if (theStatus == UseNdbRecord) { - /* Wrong API. Use NdbInterpretedCode for NdbRecord operations */ - setErrorCodeAbort(4537); - return -1; - } setErrorCodeAbort(4004); return -1; @@ -214,13 +225,15 @@ NdbOperation::read_attrCheck(const NdbCo int NdbOperation::initial_interpreterCheck() { + if (isNdbRecordOperation()) { + /* Wrong API. Use NdbInterpretedCode for NdbRecord operations */ + setErrorCodeAbort(4537); + return -1; + } + if ((theInterpretIndicator == 1)) { if (theStatus == ExecInterpretedValue) { - return 0; // Simply continue with interpretation - } else if (theStatus == UseNdbRecord) { - /* Wrong API. Use NdbInterpretedCode for NdbRecord operations */ - setErrorCodeAbort(4537); - return -1; + return 0; // Simply continue with interpretation } else if (theStatus == GetValue) { theInitialReadSize = theTotalCurrAI_Len - AttrInfo::SectionSizeInfoLength; theStatus = ExecInterpretedValue; @@ -242,13 +255,15 @@ NdbOperation::initial_interpreterCheck() int NdbOperation::labelCheck() { + if (isNdbRecordOperation()) { + /* Wrong API. Use NdbInterpretedCode for NdbRecord operations */ + setErrorCodeAbort(4537); + return -1; + } + if ((theInterpretIndicator == 1)) { if (theStatus == ExecInterpretedValue) { - return 0; // Simply continue with interpretation - } else if (theStatus == UseNdbRecord) { - /* Wrong API. Use NdbInterpretedCode for NdbRecord operations */ - setErrorCodeAbort(4537); - return -1; + return 0; // Simply continue with interpretation } else if (theStatus == GetValue) { theInitialReadSize = theTotalCurrAI_Len - AttrInfo::SectionSizeInfoLength; theStatus = ExecInterpretedValue; @@ -272,13 +287,15 @@ NdbOperation::labelCheck() int NdbOperation::intermediate_interpreterCheck() { + if (isNdbRecordOperation()) { + /* Wrong API. Use NdbInterpretedCode for NdbRecord operations */ + setErrorCodeAbort(4537); + return -1; + } + if ((theInterpretIndicator == 1)) { if (theStatus == ExecInterpretedValue) { - return 0; // Simply continue with interpretation - } else if (theStatus == UseNdbRecord) { - /* Wrong API. Use NdbInterpretedCode for NdbRecord operations */ - setErrorCodeAbort(4537); - return -1; + return 0; // Simply continue with interpretation } else if (theStatus == SubroutineExec) { return 0; // Simply continue with interpretation } else { @@ -1073,21 +1090,32 @@ NdbOperation::branch_col(Uint32 type, if (val == NULL) len = 0; else { - if (! col->getStringType()) { - // prevent assert in NdbSqlUtil on length error - Uint32 sizeInBytes = col->m_attrSize * col->m_arraySize; - if (len != 0 && len != sizeInBytes) + if (! col->getStringType()) + { + /* Fixed size type */ + len= col->m_attrSize * col->m_arraySize; + } + else + { + /* For Like and Not like we must use the passed in + * length. Otherwise we use the length encoded + * in the passed string + */ + if ((type != Interpreter::LIKE) && + (type != Interpreter::NOT_LIKE)) { - setErrorCodeAbort(4209); - DBUG_RETURN(-1); + if (! col->get_var_length(val, len)) + { + setErrorCodeAbort(4209); + DBUG_RETURN(-1); + } } - len = sizeInBytes; } } m_no_disk_flag &= (col->m_storageType == NDB_STORAGETYPE_DISK ? 0:1); - Uint32 tempData[2000]; + Uint32 tempData[ NDB_MAX_TUPLE_SIZE_IN_WORDS ]; if (((UintPtr)val & 3) != 0) { memcpy(tempData, val, len); val = tempData; === modified file 'storage/ndb/src/ndbapi/NdbOperationSearch.cpp' --- a/storage/ndb/src/ndbapi/NdbOperationSearch.cpp 2008-04-08 14:13:10 +0000 +++ b/storage/ndb/src/ndbapi/NdbOperationSearch.cpp 2008-08-07 13:36:47 +0000 @@ -62,7 +62,8 @@ NdbOperation::equal_impl(const NdbColumn (long) aValuePassed)); const char* aValue = aValuePassed; - Uint64 tempData[512]; + const Uint32 MaxKeyLenInLongWords= (NDB_MAX_KEY_SIZE + 7)/8; + Uint64 tempData[ MaxKeyLenInLongWords ]; if ((theStatus == OperationDefined) && (aValue != NULL) && @@ -465,8 +466,8 @@ LastWordLabel: void NdbOperation::reorderKEYINFO() { - Uint32 data[4000]; - Uint32 size = 4000; + Uint32 data[ NDB_MAX_KEYSIZE_IN_WORDS ]; + Uint32 size = NDB_MAX_KEYSIZE_IN_WORDS; getKeyFromTCREQ(data, size); Uint32 pos = 1; Uint32 k; @@ -480,7 +481,8 @@ NdbOperation::reorderKEYINFO() if (theTupleKeyDefined[j][0] == i) { Uint32 off = theTupleKeyDefined[j][1] - 1; Uint32 len = theTupleKeyDefined[j][2]; - assert(off < 4000 && off + len <= 4000); + assert(off < NDB_MAX_KEYSIZE_IN_WORDS && + off + len <= NDB_MAX_KEYSIZE_IN_WORDS); int ret = insertKEYINFO((char*)&data[off], pos, len); assert(ret == 0); pos += len; @@ -508,11 +510,12 @@ NdbOperation::getKeyFromTCREQ(Uint32* da NdbApiSignal* tSignal = theTCREQ->next(); unsigned n = 0; while (pos < size) { - if (n == 20) { + if (n == KeyInfo::DataLength) { tSignal = tSignal->next(); n = 0; } - data[pos++] = tSignal->getDataPtrSend()[3 + n++]; + data[pos++] = + tSignal->getDataPtrSend()[KeyInfo::HeaderLength + n++]; } return 0; } @@ -538,7 +541,8 @@ NdbOperation::handle_distribution_key(co ptrs[0].len = len; ptrs[1].ptr = 0; - Uint64 tmp[1000]; + const Uint32 MaxKeyLenInLongWords= (NDB_MAX_KEY_SIZE + 7)/ 8; + Uint64 tmp[ MaxKeyLenInLongWords ]; Uint32 hashValue; int ret = Ndb::computeHash(&hashValue, m_currentTable, === modified file 'storage/ndb/src/ndbapi/NdbRecord.hpp' --- a/storage/ndb/src/ndbapi/NdbRecord.hpp 2008-04-01 15:37:28 +0000 +++ b/storage/ndb/src/ndbapi/NdbRecord.hpp 2008-06-03 10:00:31 +0000 @@ -133,6 +133,9 @@ public: return (flags & IsNullable) && (row[nullbit_byte_offset] & (1 << nullbit_bit_in_byte)); } + + /* 255 bytes of data and 1 byte of length */ + STATIC_CONST( SHRINK_VARCHAR_BUFFSIZE= 256 ); /* Mysqld uses a slightly different format for storing varchar in index keys; the length is always two bytes little endian, even @@ -143,7 +146,7 @@ public: { const char *p= row + offset; Uint32 len= uint2korr(p); - if (len >= 256 || len >= maxSize) + if (len >= SHRINK_VARCHAR_BUFFSIZE || len >= maxSize) return false; buf[0]= (unsigned char)len; memcpy(buf+1, p+2, len); === modified file 'storage/ndb/src/ndbapi/NdbScanOperation.cpp' --- a/storage/ndb/src/ndbapi/NdbScanOperation.cpp 2008-04-07 14:27:02 +0000 +++ b/storage/ndb/src/ndbapi/NdbScanOperation.cpp 2008-08-07 13:36:47 +0000 @@ -121,6 +121,11 @@ NdbScanOperation::init(const NdbTableImp m_executed = false; m_scanUsingOldApi= false; m_interpretedCodeOldApi= NULL; + + m_api_receivers_count = 0; + m_current_api_receiver = 0; + m_sent_receivers_count = 0; + m_conf_receivers_count = 0; return 0; } @@ -510,25 +515,58 @@ NdbIndexScanOperation::setDistKeyFromRan const char *row, Uint32 distkeyMax) { - Uint64 tmp[1000]; + const Uint32 MaxKeySizeInLongWords= (NDB_MAX_KEY_SIZE + 7) / 8; + Uint64 tmp[ MaxKeySizeInLongWords ]; + char* tmpshrink = (char*)tmp; + size_t tmplen = sizeof(tmp); + Ndb::Key_part_ptr ptrs[NDB_MAX_NO_OF_ATTRIBUTES_IN_KEY+1]; Uint32 i; for (i = 0; idistkey_index_length; i++) { const NdbRecord::Attr *col = &key_record->columns[key_record->distkey_indexes[i]]; - ptrs[i].ptr = row + col->offset; + if (col->flags & NdbRecord::IsMysqldShrinkVarchar) + { + if (tmplen >= 256) + { + Uint32 len; + bool len_ok = col->shrink_varchar(row, len, tmpshrink); + if (!len_ok) + { + assert(false); + return; + } + ptrs[i].ptr = tmpshrink; + tmpshrink += len; + tmplen -= len; + } + else + { + // no buffer... + return; + } + } + else + { + ptrs[i].ptr = row + col->offset; + } ptrs[i].len = col->maxSize; } ptrs[i].ptr = 0; Uint32 hashValue; int ret = Ndb::computeHash(&hashValue, result_record->table, - ptrs, tmp, sizeof(tmp)); + ptrs, tmpshrink, tmplen); if (ret == 0) { theDistributionKey= result_record->table->getPartitionId(hashValue); theDistrKeyIndicator_= 1; + + ScanTabReq *req= CAST_PTR(ScanTabReq, theSCAN_TABREQ->getDataPtrSend()); + ScanTabReq::setDistributionKeyFlag(req->requestInfo, 1); + req->distributionKey= theDistributionKey; + theSCAN_TABREQ->setLength(ScanTabReq::StaticLength + 1); } #ifdef VM_TRACE else @@ -571,6 +609,14 @@ NdbIndexScanOperation::setBound(const Nd return -1; } + if (((bound.low_key == NULL) && (bound.high_key == NULL)) || + ((bound.low_key_count == 0) && (bound.high_key_count == 0))) + { + /* IndexBound passed has no bound information */ + setErrorCodeAbort(4541); + return -1; + } + m_num_bounds++; if (unlikely((m_num_bounds > 1) && @@ -1720,12 +1766,24 @@ int NdbScanOperation::finaliseScanOldApi { assert(theOperationType == OpenRangeScanRequest); NdbIndexScanOperation *isop = - reinterpret_cast(this); + static_cast(this); /* Prepare a single bound if necessary */ NdbIndexScanOperation::IndexBound ib; - if (isop->buildIndexBoundOldApi(ib) != 0) + NdbIndexScanOperation::IndexBound* ib_ptr= NULL; + + switch (isop->buildIndexBoundOldApi(ib)) { + case 0: + /* Bound was specified */ + ib_ptr= &ib; + break; + case 1: + /* No bound was specified */ + ib_ptr= NULL; + break; + default: return -1; + } /* If this is an ordered scan, then we need * the pk columns in the mask, otherwise we @@ -1733,14 +1791,14 @@ int NdbScanOperation::finaliseScanOldApi */ const unsigned char * resultMask= ((m_savedScanFlagsOldApi & SF_OrderBy) !=0) ? - m_currentTable->m_pkMask : + m_accessTable->m_pkMask : emptyMask; result= isop->scanIndexImpl(m_accessTable->m_ndbrecord, m_currentTable->m_ndbrecord, m_savedLockModeOldApi, resultMask, - &ib, + ib_ptr, &options, sizeof(ScanOptions)); @@ -2650,10 +2708,16 @@ NdbIndexScanOperation::setBound(const Nd /* Method called just prior to scan execution to initialise * the passed in IndexBound for the scan using the information * stored by the old API's setBound() call. + * Return codes + * 0 == bound present and built + * 1 == bound not present + * -1 == error */ int NdbIndexScanOperation::buildIndexBoundOldApi(IndexBound& ib) { + int result= 1; + if (lowBound.highestKey != 0) { /* Have a low bound @@ -2672,6 +2736,7 @@ NdbIndexScanOperation::buildIndexBoundOl ib.low_key= lowBound.keyRecAttr->aRef(); ib.low_key_count= lowBound.highestKey; ib.low_inclusive= !lowBound.highestSoFarIsStrict; + result= 0; } else { @@ -2697,6 +2762,7 @@ NdbIndexScanOperation::buildIndexBoundOl ib.high_key= highBound.keyRecAttr->aRef(); ib.high_key_count= highBound.highestKey; ib.high_inclusive= !highBound.highestSoFarIsStrict; + result= 0; } else { @@ -2707,7 +2773,7 @@ NdbIndexScanOperation::buildIndexBoundOl ib.range_no= 0; - return 0; + return result; } /* Method called to release any resources allocated by the old @@ -2789,7 +2855,7 @@ NdbIndexScanOperation::ndbrecord_insert_ const char *row, Uint32 bound_type) { - char buf[256]; + char buf[NdbRecord::Attr::SHRINK_VARCHAR_BUFFSIZE]; Uint32 currLen= theTotalNrOfKeyWordInSignal; Uint32 remaining= KeyInfo::DataLength - currLen; const NdbRecord::Attr *column= &key_record->columns[column_index]; @@ -2839,7 +2905,10 @@ NdbIndexScanOperation::ndbrecord_insert_ theTotalNrOfKeyWordInSignal= currLen + totalLen; } else { if(!aligned || !nobytes){ - Uint32 tempData[2000]; + /* Space for Bound type, Attr header and (possibly max-sized) + * key column + */ + Uint32 tempData[ KeyInfo::MaxWordsPerBoundColumn ]; if (len > sizeof(tempData)) len= sizeof(tempData); tempData[0] = bound_type; === modified file 'storage/ndb/src/ndbapi/NdbTransaction.cpp' --- a/storage/ndb/src/ndbapi/NdbTransaction.cpp 2008-04-07 14:27:02 +0000 +++ b/storage/ndb/src/ndbapi/NdbTransaction.cpp 2008-08-07 13:36:47 +0000 @@ -307,8 +307,30 @@ NdbTransaction::execute(ExecType aTypeOf * NdbBlob::postExecute() for more info. */ - ExecType tExecType; NdbOperation* tPrepOp; + + if (abortOption != NdbOperation::DefaultAbortOption) + { + DBUG_PRINT("info", ("Forcing operations to take execute() abortOption %d", + abortOption)); + /* For Blobs, we have to execute with DefaultAbortOption + * If the user supplied a non default AbortOption to execute() + * then we need to make sure that all of the operations in their + * batch are set to use the supplied AbortOption so that the + * expected behaviour is obtained when executing below + */ + tPrepOp= theFirstOpInList; + while(tPrepOp != NULL) + { + DBUG_PRINT("info", ("Changing abortOption from %d", + tPrepOp->m_abortOption)); + tPrepOp->m_abortOption= abortOption; + tPrepOp= tPrepOp->next(); + } + } + + + ExecType tExecType; NdbOperation* tCompletedFirstOp = NULL; NdbOperation* tCompletedLastOp = NULL; @@ -524,14 +546,14 @@ NdbTransaction::executeNoBlobs(NdbTransa * We behave rather similarly in both places. * Hitting this is certainly a bug though... */ - g_eventLogger.error("WARNING: Timeout in executeNoBlobs() waiting for " - "response from NDB data nodes. This should NEVER " - "occur. You have likely hit a NDB Bug. Please " - "file a bug."); + g_eventLogger->error("WARNING: Timeout in executeNoBlobs() waiting for " + "response from NDB data nodes. This should NEVER " + "occur. You have likely hit a NDB Bug. Please " + "file a bug."); DBUG_PRINT("error",("This timeout should never occure, execute()")); - g_eventLogger.error("Forcibly trying to rollback txn (%p" - ") to try to clean up data node resources.", - this); + g_eventLogger->error("Forcibly trying to rollback txn (%p" + ") to try to clean up data node resources.", + this); executeNoBlobs(NdbTransaction::Rollback); theError.code = 4012; theError.status= NdbError::PermanentError; @@ -935,7 +957,7 @@ NdbTransaction::sendROLLBACK() // S tSignal.setData(tTransId2, 3); if(theError.code == 4012) { - g_eventLogger.error("Sending TCROLLBACKREQ with Bad flag"); + g_eventLogger->error("Sending TCROLLBACKREQ with Bad flag"); tSignal.setLength(tSignal.getLength() + 1); // + flags tSignal.setData(0x1, 4); // potentially bad data } === modified file 'storage/ndb/src/ndbapi/Ndbif.cpp' --- a/storage/ndb/src/ndbapi/Ndbif.cpp 2007-09-12 11:30:27 +0000 +++ b/storage/ndb/src/ndbapi/Ndbif.cpp 2008-04-22 19:36:05 +0000 @@ -44,7 +44,7 @@ #include #include -extern EventLogger g_eventLogger; +extern EventLogger * g_eventLogger; /****************************************************************************** * int init( int aNrOfCon, int aNrOfOp ); @@ -743,8 +743,8 @@ Ndb::handleReceivedSignal(NdbApiSignal* if (unlikely(op == 0 || op->m_magic_number != NDB_EVENT_OP_MAGIC_NUMBER)) { - g_eventLogger.error("dropped GSN_SUB_TABLE_DATA due to wrong magic " - "number"); + g_eventLogger->error("dropped GSN_SUB_TABLE_DATA due to wrong magic " + "number"); return ; } === modified file 'storage/ndb/src/ndbapi/Ndbinit.cpp' --- a/storage/ndb/src/ndbapi/Ndbinit.cpp 2008-03-26 23:22:46 +0000 +++ b/storage/ndb/src/ndbapi/Ndbinit.cpp 2008-08-07 13:36:47 +0000 @@ -35,7 +35,7 @@ #include "NdbEventOperationImpl.hpp" #include -extern EventLogger g_eventLogger; +extern EventLogger * g_eventLogger; Ndb::Ndb( Ndb_cluster_connection *ndb_cluster_connection, const char* aDataBase , const char* aSchema) @@ -142,7 +142,7 @@ Ndb::~Ndb() for (NdbEventOperationImpl *op= theImpl->m_ev_op; op; op=op->m_next) { if (op->m_state == NdbEventOperation::EO_EXECUTING && op->stop()) - g_eventLogger.error("stopping NdbEventOperation failed in Ndb destructor"); + g_eventLogger->error("stopping NdbEventOperation failed in Ndb destructor"); op->m_magic_number= 0; } doDisconnect(); === modified file 'storage/ndb/src/ndbapi/ObjectMap.cpp' --- a/storage/ndb/src/ndbapi/ObjectMap.cpp 2007-04-11 16:10:45 +0000 +++ b/storage/ndb/src/ndbapi/ObjectMap.cpp 2008-04-22 19:36:05 +0000 @@ -53,8 +53,8 @@ int NdbObjectIdMap::expand(Uint32 incSiz else { NdbMutex_Unlock(m_mutex); - g_eventLogger.error("NdbObjectIdMap::expand: realloc(%u*%u) failed", - newSize, sizeof(MapEntry)); + g_eventLogger->error("NdbObjectIdMap::expand: realloc(%u*%u) failed", + newSize, sizeof(MapEntry)); return -1; } NdbMutex_Unlock(m_mutex); === modified file 'storage/ndb/src/ndbapi/ObjectMap.hpp' --- a/storage/ndb/src/ndbapi/ObjectMap.hpp 2007-04-11 13:51:09 +0000 +++ b/storage/ndb/src/ndbapi/ObjectMap.hpp 2008-04-22 19:36:05 +0000 @@ -21,7 +21,7 @@ #include #include -extern EventLogger g_eventLogger; +extern EventLogger * g_eventLogger; //#define DEBUG_OBJECTMAP @@ -85,8 +85,8 @@ NdbObjectIdMap::unmap(Uint32 id, void *o m_map[i].m_next = m_firstFree; m_firstFree = i; } else { - g_eventLogger.error("NdbObjectIdMap::unmap(%u, 0x%x) obj=0x%x", - id, (long) object, (long) obj); + g_eventLogger->error("NdbObjectIdMap::unmap(%u, 0x%x) obj=0x%x", + id, (long) object, (long) obj); DBUG_PRINT("error",("NdbObjectIdMap::unmap(%u, 0x%lx) obj=0x%lx", id, (long) object, (long) obj)); return 0; === modified file 'storage/ndb/src/ndbapi/TransporterFacade.hpp' --- a/storage/ndb/src/ndbapi/TransporterFacade.hpp 2007-04-02 19:37:49 +0000 +++ b/storage/ndb/src/ndbapi/TransporterFacade.hpp 2008-05-16 13:08:36 +0000 @@ -176,7 +176,8 @@ private: friend class Ndb; friend class Ndb_cluster_connection_impl; friend class NdbTransaction; - + friend class NdbDictInterface; + int sendSignalUnCond(NdbApiSignal *, NodeId nodeId); bool isConnected(NodeId aNodeId); === modified file 'storage/ndb/src/ndbapi/ndb_cluster_connection.cpp' --- a/storage/ndb/src/ndbapi/ndb_cluster_connection.cpp 2007-04-12 14:04:47 +0000 +++ b/storage/ndb/src/ndbapi/ndb_cluster_connection.cpp 2008-04-22 19:36:05 +0000 @@ -31,14 +31,14 @@ #include #include -#include -EventLogger g_eventLogger; - #include #ifdef VM_TRACE NdbMutex *ndb_print_state_mutex= NULL; #endif +#include +extern EventLogger *g_eventLogger; + static int g_ndb_connection_count = 0; /* @@ -285,13 +285,46 @@ Ndb_cluster_connection_impl(const char * DBUG_ENTER("Ndb_cluster_connection"); DBUG_PRINT("enter",("Ndb_cluster_connection this=0x%lx", (long) this)); + NdbMutex_Lock(g_ndb_connection_mutex); + if(g_ndb_connection_count++ == 0){ + NdbDictionary::Column::FRAGMENT= + NdbColumnImpl::create_pseudo("NDB$FRAGMENT"); + NdbDictionary::Column::FRAGMENT_FIXED_MEMORY= + NdbColumnImpl::create_pseudo("NDB$FRAGMENT_FIXED_MEMORY"); + NdbDictionary::Column::FRAGMENT_VARSIZED_MEMORY= + NdbColumnImpl::create_pseudo("NDB$FRAGMENT_VARSIZED_MEMORY"); + NdbDictionary::Column::ROW_COUNT= + NdbColumnImpl::create_pseudo("NDB$ROW_COUNT"); + NdbDictionary::Column::COMMIT_COUNT= + NdbColumnImpl::create_pseudo("NDB$COMMIT_COUNT"); + NdbDictionary::Column::ROW_SIZE= + NdbColumnImpl::create_pseudo("NDB$ROW_SIZE"); + NdbDictionary::Column::RANGE_NO= + NdbColumnImpl::create_pseudo("NDB$RANGE_NO"); + NdbDictionary::Column::DISK_REF= + NdbColumnImpl::create_pseudo("NDB$DISK_REF"); + NdbDictionary::Column::RECORDS_IN_RANGE= + NdbColumnImpl::create_pseudo("NDB$RECORDS_IN_RANGE"); + NdbDictionary::Column::ROWID= + NdbColumnImpl::create_pseudo("NDB$ROWID"); + NdbDictionary::Column::ROW_GCI= + NdbColumnImpl::create_pseudo("NDB$ROW_GCI"); + NdbDictionary::Column::ANY_VALUE= + NdbColumnImpl::create_pseudo("NDB$ANY_VALUE"); + NdbDictionary::Column::COPY_ROWID= + NdbColumnImpl::create_pseudo("NDB$COPY_ROWID"); + + g_eventLogger->createConsoleHandler(); + g_eventLogger->setCategory("NdbApi"); + g_eventLogger->enable(Logger::LL_ON, Logger::LL_ERROR); + + } + NdbMutex_Unlock(g_ndb_connection_mutex); + if (!m_event_add_drop_mutex) m_event_add_drop_mutex= NdbMutex_Create(); m_new_delete_ndb_mutex = NdbMutex_Create(); - - g_eventLogger.createConsoleHandler(); - g_eventLogger.setCategory("NdbApi"); - g_eventLogger.enable(Logger::LL_ON, Logger::LL_ERROR); + m_connect_thread= 0; m_connect_callback= 0; @@ -327,36 +360,6 @@ Ndb_cluster_connection_impl(const char * new TransporterFacade(m_main_connection->m_impl.m_globalDictCache); } - NdbMutex_Lock(g_ndb_connection_mutex); - if(g_ndb_connection_count++ == 0){ - NdbDictionary::Column::FRAGMENT= - NdbColumnImpl::create_pseudo("NDB$FRAGMENT"); - NdbDictionary::Column::FRAGMENT_FIXED_MEMORY= - NdbColumnImpl::create_pseudo("NDB$FRAGMENT_FIXED_MEMORY"); - NdbDictionary::Column::FRAGMENT_VARSIZED_MEMORY= - NdbColumnImpl::create_pseudo("NDB$FRAGMENT_VARSIZED_MEMORY"); - NdbDictionary::Column::ROW_COUNT= - NdbColumnImpl::create_pseudo("NDB$ROW_COUNT"); - NdbDictionary::Column::COMMIT_COUNT= - NdbColumnImpl::create_pseudo("NDB$COMMIT_COUNT"); - NdbDictionary::Column::ROW_SIZE= - NdbColumnImpl::create_pseudo("NDB$ROW_SIZE"); - NdbDictionary::Column::RANGE_NO= - NdbColumnImpl::create_pseudo("NDB$RANGE_NO"); - NdbDictionary::Column::DISK_REF= - NdbColumnImpl::create_pseudo("NDB$DISK_REF"); - NdbDictionary::Column::RECORDS_IN_RANGE= - NdbColumnImpl::create_pseudo("NDB$RECORDS_IN_RANGE"); - NdbDictionary::Column::ROWID= - NdbColumnImpl::create_pseudo("NDB$ROWID"); - NdbDictionary::Column::ROW_GCI= - NdbColumnImpl::create_pseudo("NDB$ROW_GCI"); - NdbDictionary::Column::ANY_VALUE= - NdbColumnImpl::create_pseudo("NDB$ANY_VALUE"); - NdbDictionary::Column::COPY_ROWID= - NdbColumnImpl::create_pseudo("NDB$COPY_ROWID"); - } - NdbMutex_Unlock(g_ndb_connection_mutex); DBUG_VOID_RETURN; } @@ -429,6 +432,7 @@ Ndb_cluster_connection_impl::~Ndb_cluste delete NdbDictionary::Column::COPY_ROWID; NdbDictionary::Column::COPY_ROWID = 0; + } NdbMutex_Unlock(g_ndb_connection_mutex); === modified file 'storage/ndb/src/ndbapi/ndberror.c' --- a/storage/ndb/src/ndbapi/ndberror.c 2008-04-02 14:32:01 +0000 +++ b/storage/ndb/src/ndbapi/ndberror.c 2008-08-07 13:36:47 +0000 @@ -584,6 +584,7 @@ ErrorBundle ErrorCodes[] = { { 4538, DMEC, AE, "NdbInterpretedCode instruction requires that table is set" }, { 4539, DMEC, AE, "NdbInterpretedCode not supported for operation type" }, { 4540, DMEC, AE, "Attempt to pass an Index column to createRecord. Use base table columns only" }, + { 4541, DMEC, AE, "IndexBound has no bound information" }, { 4200, DMEC, AE, "Status Error when defining an operation" }, { 4201, DMEC, AE, "Variable Arrays not yet supported" }, === modified file 'storage/ndb/test/ndbapi/testBlobs.cpp' --- a/storage/ndb/test/ndbapi/testBlobs.cpp 2008-02-19 15:00:29 +0000 +++ b/storage/ndb/test/ndbapi/testBlobs.cpp 2008-05-23 10:20:10 +0000 @@ -165,6 +165,7 @@ printusage() << " -bug 4088 ndb api hang with mixed ops on index table" << endl << " -bug 27018 middle partial part write clobbers rest of part" << endl << " -bug 27370 Potential inconsistent blob reads for ReadCommitted reads" << endl + << " -bug 36756 Handling execute(.., abortOption) and Blobs " << endl ; } @@ -2198,6 +2199,322 @@ deleteScan(int api, bool idx) return 0; } + +enum OpTypes { + PkRead, + PkInsert, + PkUpdate, + PkWrite, + PkDelete, + UkRead, + UkUpdate, + UkWrite, + UkDelete}; + +static const char* +operationName(OpTypes optype) +{ + switch(optype){ + case PkRead: + return "Pk Read"; + case PkInsert: + return "Pk Insert"; + case PkUpdate: + return "Pk Update"; + case PkWrite: + return "Pk Write"; + case PkDelete: + return "Pk Delete"; + case UkRead: + return "Uk Read"; + case UkUpdate: + return "Uk Update"; + case UkWrite: + return "Uk Write"; + case UkDelete: + return "Uk Delete"; + default: + return "Bad operation type"; + } +} + +static const char* +aoName(int abortOption) +{ + if (abortOption == 0) + return "AbortOnError"; + return "IgnoreError"; +} + +static int +setupOperation(NdbOperation*& op, OpTypes optype, Tup& tup) +{ + bool pkop; + switch(optype){ + case PkRead: case PkInsert : case PkUpdate: + case PkWrite : case PkDelete : + pkop=true; + break; + default: + pkop= false; + } + + if (pkop) + CHK((op= g_con->getNdbOperation(g_opt.m_tname)) != 0); + else + CHK((op = g_con->getNdbIndexOperation(g_opt.m_x1name, g_opt.m_tname)) != 0); + + switch(optype){ + case PkRead: + case UkRead: + CHK(op->readTuple() == 0); + break; + case PkInsert: + CHK(op->insertTuple() == 0); + break; + case PkUpdate: + case UkUpdate: + CHK(op->updateTuple() == 0); + break; + case PkWrite: + case UkWrite: + CHK(op->writeTuple() == 0); + break; + case PkDelete: + case UkDelete: + CHK(op->deleteTuple() == 0); + break; + default: + CHK(false); + return -1; + } + + if (pkop) + { + CHK(op->equal("PK1", tup.m_pk1) == 0); + if (g_opt.m_pk2chr.m_len != 0) + { + CHK(op->equal("PK2", tup.m_pk2) == 0); + CHK(op->equal("PK3", tup.m_pk3) == 0); + } + } + else + { + CHK(op->equal("PK2", tup.m_pk2) == 0); + CHK(op->equal("PK3", tup.m_pk3) == 0); + } + + CHK(getBlobHandles(op) == 0); + + switch(optype){ + case PkRead: + case UkRead: + CHK(getBlobValue(tup) == 0); + break; + case PkInsert: + case PkUpdate: + case UkUpdate: + /* Fall through */ + case PkWrite: + case UkWrite: + CHK(setBlobValue(tup) == 0); + break; + case PkDelete: + case UkDelete: + /* Nothing */ + break; + default: + CHK(false); + return -1; + } + + return 0; +} + +static int +bugtest_36756() +{ + /* Transaction which had accessed a Blob table was ignoring + * abortOption passed in the execute() call. + * Check that option passed in execute() call overrides + * default / manually set operation abortOption, even in the + * presence of Blobs in the transaction + */ + + /* Operation AbortOnError IgnoreError + * PkRead NoDataFound* NoDataFound + * PkInsert Duplicate key Duplicate key* + * PkUpdate NoDataFound NoDataFound* + * PkWrite NoDataFound NoDataFound* + * PkDelete NoDataFound NoDataFound* + * UkRead NoDataFound* NoDataFound + * UkUpdate NoDataFound NoDataFound* + * UkWrite NoDataFound NoDataFound* + * UkDelete NoDataFound NoDataFound* + * + * * Are interesting, where non-default behaviour is requested. + */ + + struct ExpectedOutcome + { + int executeRc; + int transactionErrorCode; + int opr1ErrorCode; + int opr2ErrorCode; + int commitStatus; + }; + + /* Generally, AbortOnError sets the transaction error + * but not the Operation error codes + * IgnoreError sets the transaction error and the + * failing operation error code(s) + * Odd cases : + * Pk Write : Can't fail due to key presence, just + * incorrect NULLs etc. + * Uk Write : Key must exist, so not really different + * to Update? + */ + ExpectedOutcome outcomes[9][2]= + { + // PkRead + {{-1, 626, 0, 0, NdbTransaction::Aborted}, // AE + {0, 626, 0, 626, NdbTransaction::Started}}, // IE + // PkInsert + // Note operation order reversed for insert + {{-1, 630, 0, 0, NdbTransaction::Aborted}, // AE + {0, 630, 0, 630, NdbTransaction::Started}}, // IE + // PkUpdate + {{-1, 626, 0, 0, NdbTransaction::Aborted}, // AE + {0, 626, 0, 626, NdbTransaction::Started}}, // IE + // PkWrite + {{0, 0, 0, 0, NdbTransaction::Started}, // AE + {0, 0, 0, 0, NdbTransaction::Started}}, // IE + // PkDelete + {{-1, 626, 0, 0, NdbTransaction::Aborted}, // AE + {0, 626, 0, 626, NdbTransaction::Started}}, // IE + // UkRead + {{-1, 626, 0, 0, NdbTransaction::Aborted}, // AE + {0, 626, 0, 626, NdbTransaction::Started}}, // IE + // UkUpdate + {{-1, 626, 0, 0, NdbTransaction::Aborted}, // AE + {0, 626, 0, 626, NdbTransaction::Started}}, // IE + // UkWrite + {{-1, 626, 0, 0, NdbTransaction::Aborted}, // AE + {0, 626, 0, 626, NdbTransaction::Started}}, // IE + // UkDelete + {{-1, 626, 0, 0, NdbTransaction::Aborted}, // AE + {0, 626, 0, 626, NdbTransaction::Started}} // IE + }; + + DBG("bugtest_36756 : IgnoreError Delete of nonexisting tuple aborts"); + DBG(" Also 36851 : Insert IgnoreError of existing tuple aborts"); + + for (int iterations=0; iterations < 50; iterations++) + { + /* Recalculate and insert different tuple every time to + * get different keys(and therefore nodes), and + * different length Blobs, including zero length + * and NULL + */ + calcTups(true); + + Tup& tupExists = g_tups[0]; + Tup& tupDoesNotExist = g_tups[1]; + + /* Setup table with just 1 row present */ + CHK((g_con= g_ndb->startTransaction()) != 0); + CHK((g_opr= g_con->getNdbOperation(g_opt.m_tname)) != 0); + CHK(g_opr->insertTuple() == 0); + CHK(g_opr->equal("PK1", tupExists.m_pk1) == 0); + if (g_opt.m_pk2chr.m_len != 0) + { + CHK(g_opr->equal("PK2", tupExists.m_pk2) == 0); + CHK(g_opr->equal("PK3", tupExists.m_pk3) == 0); + } + CHK(getBlobHandles(g_opr) == 0); + + CHK(setBlobValue(tupExists) == 0); + + CHK(g_con->execute(Commit) == 0); + g_con->close(); + + DBG("Iteration : " << iterations); + for (int optype=PkRead; optype <= UkDelete; optype++) + { + DBG(" " << operationName((OpTypes)optype)); + + Tup* tup1= &tupExists; + Tup* tup2= &tupDoesNotExist; + + if (optype == PkInsert) + { + /* Inserts - we want the failing operation to be second + * rather than first to avoid hitting bugs with IgnoreError + * and the first DML in a transaction + * So we swap them + */ + tup1= &tupDoesNotExist; // (Insert succeeds) + tup2= &tupExists; //(Insert fails) + } + + for (int abortOption=0; abortOption < 2; abortOption++) + { + DBG(" " << aoName(abortOption)); + NdbOperation *opr1, *opr2; + NdbOperation::AbortOption ao= (abortOption==0)? + NdbOperation::AbortOnError : + NdbOperation::AO_IgnoreError; + + CHK((g_con= g_ndb->startTransaction()) != 0); + + /* Operation 1 */ + CHK(setupOperation(opr1, (OpTypes)optype, *tup1) == 0); + + /* Operation2 */ + CHK(setupOperation(opr2, (OpTypes)optype, *tup2) == 0); + + ExpectedOutcome eo= outcomes[optype][abortOption]; + + int rc = g_con->execute(NdbTransaction::NoCommit, ao); + + DBG("execute returned " << rc << + " Trans err " << g_con->getNdbError().code << + " Opr1 err " << opr1->getNdbError().code << + " Opr2 err " << opr2->getNdbError().code << + " CommitStatus " << g_con->commitStatus()); + + CHK(rc == eo.executeRc); + CHK(g_con->getNdbError().code == eo.transactionErrorCode); + CHK(opr1->getNdbError().code == eo.opr1ErrorCode); + CHK(opr2->getNdbError().code == eo.opr2ErrorCode); + CHK(g_con->commitStatus() == eo.commitStatus); + + g_con->close(); + } + } + + /* Now delete the 'existing'row */ + CHK((g_con= g_ndb->startTransaction()) != 0); + CHK((g_opr= g_con->getNdbOperation(g_opt.m_tname)) != 0); + CHK(g_opr->deleteTuple() == 0); + CHK(g_opr->equal("PK1", tupExists.m_pk1) == 0); + if (g_opt.m_pk2chr.m_len != 0) + { + CHK(g_opr->equal("PK2", tupExists.m_pk2) == 0); + CHK(g_opr->equal("PK3", tupExists.m_pk3) == 0); + } + + CHK(g_con->execute(Commit) == 0); + g_con->close(); + } + + g_opr= 0; + g_con= 0; + g_bh1= 0; + + return 0; +} + // main // from here on print always @@ -3026,7 +3343,8 @@ static struct { } g_bugtest[] = { { 4088, bugtest_4088 }, { 27018, bugtest_27018 }, - { 27370, bugtest_27370 } + { 27370, bugtest_27370 }, + { 36756, bugtest_36756 } }; NDB_COMMAND(testOdbcDriver, "testBlobs", "testBlobs", "testBlobs", 65535) === modified file 'storage/ndb/test/ndbapi/testDict.cpp' --- a/storage/ndb/test/ndbapi/testDict.cpp 2008-01-24 15:39:38 +0000 +++ b/storage/ndb/test/ndbapi/testDict.cpp 2008-05-30 08:03:55 +0000 @@ -24,6 +24,8 @@ #include #include #include +#include +#include char f_tablename[256]; @@ -1967,10 +1969,13 @@ runCreateDiskTable(NDBT_Context* ctx, ND return NDBT_OK; } +#include + int runFailAddFragment(NDBT_Context* ctx, NDBT_Step* step){ - static int acclst[] = { 3001 }; + static int acclst[] = { 3001, 6200, 6202 }; static int tuplst[] = { 4007, 4008, 4009, 4010, 4011, 4012 }; - static int tuxlst[] = { 12001, 12002, 12003, 12004, 12005, 12006 }; + static int tuxlst[] = { 12001, 12002, 12003, 12004, 12005, 12006, + 6201, 6203 }; static unsigned acccnt = sizeof(acclst)/sizeof(acclst[0]); static unsigned tupcnt = sizeof(tuplst)/sizeof(tuplst[0]); static unsigned tuxcnt = sizeof(tuxlst)/sizeof(tuxlst[0]); @@ -1982,31 +1987,64 @@ int runFailAddFragment(NDBT_Context* ctx NdbDictionary::Table tab(*ctx->getTab()); tab.setFragmentType(NdbDictionary::Object::FragAllLarge); + int errNo = 0; + char buf[100]; + if (NdbEnv_GetEnv("ERRNO", buf, sizeof(buf))) + { + errNo = atoi(buf); + ndbout_c("Using errno: %u", errNo); + } + // ordered index on first few columns NdbDictionary::Index idx("X"); idx.setTable(tab.getName()); idx.setType(NdbDictionary::Index::OrderedIndex); idx.setLogging(false); - for (int i_hate_broken_compilers = 0; - i_hate_broken_compilers < 3 && + for (int cnt = 0, i_hate_broken_compilers = 0; + cnt < 3 && i_hate_broken_compilers < tab.getNoOfColumns(); i_hate_broken_compilers++) { - idx.addColumn(*tab.getColumn(i_hate_broken_compilers)); + if (NdbSqlUtil::check_column_for_ordered_index + (tab.getColumn(i_hate_broken_compilers)->getType(), 0) == 0 && + tab.getColumn(i_hate_broken_compilers)->getStorageType() != + NdbDictionary::Column::StorageTypeDisk) + { + idx.addColumn(*tab.getColumn(i_hate_broken_compilers)); + cnt++; + } + } + + for (Uint32 i = 0; igetStorageType() == + NdbDictionary::Column::StorageTypeDisk) + { + NDBT_Tables::create_default_tablespace(pNdb); + break; + } } const int loops = ctx->getNumLoops(); int result = NDBT_OK; (void)pDic->dropTable(tab.getName()); + int dump1 = DumpStateOrd::SchemaResourceSnapshot; + int dump2 = DumpStateOrd::SchemaResourceCheckLeak; + for (int l = 0; l < loops; l++) { for (unsigned i0 = 0; i0 < acccnt; i0++) { unsigned j = (l == 0 ? i0 : myRandom48(acccnt)); int errval = acclst[j]; + if (errNo != 0 && errNo != errval) + continue; g_info << "insert error node=" << nodeId << " value=" << errval << endl; CHECK2(restarter.insertErrorInNode(nodeId, errval) == 0, "failed to set error insert"); + CHECK(restarter.dumpStateAllNodes(&dump1, 1) == 0); + CHECK2(pDic->createTable(tab) != 0, "failed to fail after error insert " << errval); + CHECK(restarter.dumpStateAllNodes(&dump2, 1) == 0); CHECK2(pDic->createTable(tab) == 0, pDic->getNdbError()); CHECK2(pDic->dropTable(tab.getName()) == 0, @@ -2015,11 +2053,15 @@ int runFailAddFragment(NDBT_Context* ctx for (unsigned i1 = 0; i1 < tupcnt; i1++) { unsigned j = (l == 0 ? i1 : myRandom48(tupcnt)); int errval = tuplst[j]; + if (errNo != 0 && errNo != errval) + continue; g_info << "insert error node=" << nodeId << " value=" << errval << endl; CHECK2(restarter.insertErrorInNode(nodeId, errval) == 0, "failed to set error insert"); + CHECK(restarter.dumpStateAllNodes(&dump1, 1) == 0); CHECK2(pDic->createTable(tab) != 0, "failed to fail after error insert " << errval); + CHECK(restarter.dumpStateAllNodes(&dump2, 1) == 0); CHECK2(pDic->createTable(tab) == 0, pDic->getNdbError()); CHECK2(pDic->dropTable(tab.getName()) == 0, @@ -2028,13 +2070,17 @@ int runFailAddFragment(NDBT_Context* ctx for (unsigned i2 = 0; i2 < tuxcnt; i2++) { unsigned j = (l == 0 ? i2 : myRandom48(tuxcnt)); int errval = tuxlst[j]; + if (errNo != 0 && errNo != errval) + continue; g_info << "insert error node=" << nodeId << " value=" << errval << endl; CHECK2(restarter.insertErrorInNode(nodeId, errval) == 0, "failed to set error insert"); CHECK2(pDic->createTable(tab) == 0, pDic->getNdbError()); + CHECK(restarter.dumpStateAllNodes(&dump1, 1) == 0); CHECK2(pDic->createIndex(idx) != 0, "failed to fail after error insert " << errval); + CHECK(restarter.dumpStateAllNodes(&dump2, 1) == 0); CHECK2(pDic->createIndex(idx) == 0, pDic->getNdbError()); CHECK2(pDic->dropTable(tab.getName()) == 0, === modified file 'storage/ndb/test/ndbapi/testInterpreter.cpp' --- a/storage/ndb/test/ndbapi/testInterpreter.cpp 2008-01-31 22:46:07 +0000 +++ b/storage/ndb/test/ndbapi/testInterpreter.cpp 2008-05-23 09:07:58 +0000 @@ -73,7 +73,6 @@ int runTestIncValue64(NDBT_Context* ctx, } int runTestIncValue32(NDBT_Context* ctx, NDBT_Step* step){ - int result = NDBT_OK; const NdbDictionary::Table * pTab = ctx->getTab(); Ndb* pNdb = GETNDB(step); @@ -114,8 +113,16 @@ int runTestIncValue32(NDBT_Context* ctx, } // Attributes + + // Perform initial read of column start value + NdbRecAttr* initialVal = pOp->getValue("KOL2"); + if( initialVal == NULL ) { + ERR(pTrans->getNdbError()); + pNdb->closeTransaction(pTrans); + return NDBT_FAILED; + } - // Update column + // Update the column Uint32 valToIncWith = 1; check = pOp->incValue("KOL2", valToIncWith); if( check == -1 ) { @@ -124,8 +131,9 @@ int runTestIncValue32(NDBT_Context* ctx, return NDBT_FAILED; } - NdbRecAttr* valueRec = pOp->getValue("KOL2"); - if( valueRec == NULL ) { + // Perform final read of column after value + NdbRecAttr* afterVal = pOp->getValue("KOL2"); + if( afterVal == NULL ) { ERR(pTrans->getNdbError()); pNdb->closeTransaction(pTrans); return NDBT_FAILED; @@ -138,8 +146,19 @@ int runTestIncValue32(NDBT_Context* ctx, return NDBT_FAILED; } - Uint32 value = valueRec->u_32_value(); + Uint32 oldValue = initialVal->u_32_value(); + Uint32 newValue = afterVal->u_32_value(); + Uint32 expectedValue = oldValue + valToIncWith; + if (newValue != expectedValue) + { + g_err << "Failed : Expected " << oldValue << "+" << + valToIncWith << "=" << expectedValue << + " but received " << newValue << endl; + pNdb->closeTransaction(pTrans); + return NDBT_FAILED; + } + pNdb->closeTransaction(pTrans); @@ -147,7 +166,6 @@ int runTestIncValue32(NDBT_Context* ctx, } int runTestBug19537(NDBT_Context* ctx, NDBT_Step* step){ - int result = NDBT_OK; const NdbDictionary::Table * pTab = ctx->getTab(); Ndb* pNdb = GETNDB(step); @@ -264,9 +282,12 @@ int runTestBug19537(NDBT_Context* ctx, N int runTestBug34107(NDBT_Context* ctx, NDBT_Step* step){ - int result = NDBT_OK; const NdbDictionary::Table * pTab = ctx->getTab(); Ndb* pNdb = GETNDB(step); + const Uint32 okSize= 10000; + const Uint32 tooBig= 30000; + + Uint32 codeBuff[tooBig]; int i; for (i = 0; i <= 1; i++) { @@ -291,19 +312,43 @@ int runTestBug34107(NDBT_Context* ctx, N return NDBT_FAILED; } - int n = i == 0 ? 10000 : 30000; + /* Test kernel mechanism for dealing with too large program + * We need to provide our own program buffer as default + * NdbInterpretedCode buffer will not grow larger than + * NDB_MAX_SCANFILTER_SIZE + */ + + NdbInterpretedCode code(NULL, // Table is irrelevant + codeBuff, + tooBig); // Size of codeBuff + + int n = i == 0 ? okSize : tooBig; int k; for (k = 0; k < n; k++) { // inserts 1 word ATTRINFO - if (pOp->interpret_exit_ok() == -1) { - ERR(pOp->getNdbError()); + if (code.interpret_exit_ok() == -1) { + ERR(code.getNdbError()); pNdb->closeTransaction(pTrans); return NDBT_FAILED; } } + + if (code.finalise() != 0) + { + ERR(code.getNdbError()); + pNdb->closeTransaction(pTrans); + return NDBT_FAILED; + } + + if (pOp->setInterpretedCode(&code) != 0) + { + ERR(pOp->getNdbError()); + pNdb->closeTransaction(pTrans); + return NDBT_FAILED; + } if (pTrans->execute(NoCommit) == -1) { ERR(pTrans->getNdbError()); === modified file 'storage/ndb/test/ndbapi/testNodeRestart.cpp' --- a/storage/ndb/test/ndbapi/testNodeRestart.cpp 2008-02-20 20:44:04 +0000 +++ b/storage/ndb/test/ndbapi/testNodeRestart.cpp 2008-04-25 07:14:29 +0000 @@ -2327,6 +2327,576 @@ runBug34702(NDBT_Context* ctx, NDBT_Step if (res.waitClusterStarted()) return NDBT_FAILED; } + + return NDBT_OK; +} + +int +runMNF(NDBT_Context* ctx, NDBT_Step* step) +{ + int result = NDBT_OK; + NdbRestarter res; + + if (res.getNumDbNodes() < 2) + { + return NDBT_OK; + } + + Vector part0; + Vector part1; + Bitmask<255> part0mask; + Bitmask<255> part1mask; + Bitmask<255> ngmask; + for (int i = 0; igetNumLoops(); + while (loops-- && !ctx->isTestStopped()) + { + int cnt, *nodes; + int master = res.getMasterNodeId(); + int nextMaster = res.getNextMasterNodeId(master); + + bool cmf = false; + if (part0mask.get(master) && part0mask.get(nextMaster)) + { + cmf = true; + cnt = part0.size(); + nodes = part0.getBase(); + printf("restarting part0"); + } + else if(part1mask.get(master) && part1mask.get(nextMaster)) + { + cmf = true; + cnt = part1.size(); + nodes = part1.getBase(); + printf("restarting part1"); + } + else + { + cmf = false; + if (loops & 1) + { + cnt = part0.size(); + nodes = part0.getBase(); + printf("restarting part0"); + } + else + { + cnt = part1.size(); + nodes = part0.getBase(); + printf("restarting part0"); + } + } + + int val2[] = { DumpStateOrd::CmvmiSetRestartOnErrorInsert, 1 }; + for (int i = 0; istopTest(); + return NDBT_OK; +} + +int +runBug36199(NDBT_Context* ctx, NDBT_Step* step) +{ + int result = NDBT_OK; + int loops = ctx->getNumLoops(); + NdbRestarter res; + + if (res.getNumDbNodes() < 4) + return NDBT_OK; + + int master = res.getMasterNodeId(); + int nextMaster = res.getNextMasterNodeId(master); + int victim = res.getRandomNodeSameNodeGroup(nextMaster, rand()); + if (victim == master) + { + victim = res.getRandomNodeOtherNodeGroup(nextMaster, rand()); + } + + ndbout_c("master: %u next master: %u victim: %u", + master, nextMaster, victim); + + int val2[] = { DumpStateOrd::CmvmiSetRestartOnErrorInsert, 1 }; + res.dumpStateOneNode(master, val2, 2); + res.dumpStateOneNode(victim, val2, 2); + + res.insertErrorInNode(victim, 7205); + res.insertErrorInNode(master, 7014); + int lcp = 7099; + res.dumpStateOneNode(master, &lcp, 1); + + int nodes[2]; + nodes[0] = master; + nodes[1] = victim; + if (res.waitNodesNoStart(nodes, 2)) + { + return NDBT_FAILED; + } + + if (res.startNodes(nodes, 2)) + { + return NDBT_FAILED; + } + + if (res.waitClusterStarted()) + return NDBT_FAILED; + + return NDBT_OK; +} + +int +runBug36246(NDBT_Context* ctx, NDBT_Step* step) +{ + int result = NDBT_OK; + int loops = ctx->getNumLoops(); + NdbRestarter res; + Ndb* pNdb = GETNDB(step); + + if (res.getNumDbNodes() < 4) + return NDBT_OK; + + HugoOperations hugoOps(*ctx->getTab()); +restartloop: + int tryloop = 0; + int master = res.getMasterNodeId(); + int nextMaster = res.getNextMasterNodeId(master); + +loop: + if(hugoOps.startTransaction(pNdb) != 0) + return NDBT_FAILED; + + if(hugoOps.pkUpdateRecord(pNdb, 1, 1) != 0) + return NDBT_FAILED; + + if(hugoOps.execute_NoCommit(pNdb) != 0) + return NDBT_FAILED; + + int victim = hugoOps.getTransaction()->getConnectedNodeId(); + printf("master: %u nextMaster: %u victim: %u", + master, nextMaster, victim); + if (victim == master || victim == nextMaster || + res.getNodeGroup(victim) == res.getNodeGroup(master) || + res.getNodeGroup(victim) == res.getNodeGroup(nextMaster)) + { + hugoOps.execute_Rollback(pNdb); + hugoOps.closeTransaction(pNdb); + tryloop++; + if (tryloop == 10) + { + ndbout_c(" -> restarting next master: %u", nextMaster); + res.restartOneDbNode(nextMaster, + /** initial */ false, + /** nostart */ true, + /** abort */ true); + + res.waitNodesNoStart(&nextMaster, 1); + res.startNodes(&nextMaster, 1); + if (res.waitClusterStarted()) + return NDBT_FAILED; + goto restartloop; + } + else + { + ndbout_c(" -> loop"); + goto loop; + } + } + ndbout_c(" -> go go gadget skates"); + + int val2[] = { DumpStateOrd::CmvmiSetRestartOnErrorInsert, 1 }; + res.dumpStateOneNode(master, val2, 2); + res.dumpStateOneNode(victim, val2, 2); + + res.insertErrorInNode(master, 8060); + res.insertErrorInNode(victim, 9999); + + int nodes[2]; + nodes[0] = master; + nodes[1] = victim; + if (res.waitNodesNoStart(nodes, 2)) + { + return NDBT_FAILED; + } + + if (res.startNodes(nodes, 2)) + { + return NDBT_FAILED; + } + + if (res.waitClusterStarted()) + return NDBT_FAILED; + + hugoOps.execute_Rollback(pNdb); + hugoOps.closeTransaction(pNdb); + + return NDBT_OK; +} + +int +runBug36247(NDBT_Context* ctx, NDBT_Step* step) +{ + int result = NDBT_OK; + int loops = ctx->getNumLoops(); + NdbRestarter res; + Ndb* pNdb = GETNDB(step); + + if (res.getNumDbNodes() < 4) + return NDBT_OK; + + HugoOperations hugoOps(*ctx->getTab()); + +restartloop: + int tryloop = 0; + int master = res.getMasterNodeId(); + int nextMaster = res.getNextMasterNodeId(master); + +loop: + if(hugoOps.startTransaction(pNdb) != 0) + return NDBT_FAILED; + + if(hugoOps.pkUpdateRecord(pNdb, 1, 100) != 0) + return NDBT_FAILED; + + if(hugoOps.execute_NoCommit(pNdb) != 0) + return NDBT_FAILED; + + int victim = hugoOps.getTransaction()->getConnectedNodeId(); + printf("master: %u nextMaster: %u victim: %u", + master, nextMaster, victim); + if (victim == master || victim == nextMaster || + res.getNodeGroup(victim) == res.getNodeGroup(master) || + res.getNodeGroup(victim) == res.getNodeGroup(nextMaster)) + { + hugoOps.execute_Rollback(pNdb); + hugoOps.closeTransaction(pNdb); + tryloop++; + if (tryloop == 10) + { + ndbout_c(" -> restarting next master: %u", nextMaster); + res.restartOneDbNode(nextMaster, + /** initial */ false, + /** nostart */ true, + /** abort */ true); + + res.waitNodesNoStart(&nextMaster, 1); + res.startNodes(&nextMaster, 1); + if (res.waitClusterStarted()) + return NDBT_FAILED; + goto restartloop; + } + else + { + ndbout_c(" -> loop"); + goto loop; + } + } + ndbout_c(" -> go go gadget skates"); + + int val2[] = { DumpStateOrd::CmvmiSetRestartOnErrorInsert, 1 }; + res.dumpStateOneNode(master, val2, 2); + res.dumpStateOneNode(victim, val2, 2); + + for (int i = 0; igetNumLoops(); + NdbRestarter res; + Ndb* pNdb = GETNDB(step); + + if (res.getNumDbNodes() < 4) + return NDBT_OK; + + int master = res.getMasterNodeId(); + int nextMaster = res.getNextMasterNodeId(master); + int victim = res.getRandomNodeSameNodeGroup(nextMaster, rand()); + if (victim == master) + { + victim = res.getRandomNodeOtherNodeGroup(nextMaster, rand()); + } + + ndbout_c("master: %u nextMaster: %u victim: %u", + master, nextMaster, victim); + + int val2[] = { DumpStateOrd::CmvmiSetRestartOnErrorInsert, 1 }; + res.dumpStateOneNode(master, val2, 2); + res.insertErrorInNode(victim, 7209); + + int lcp = 7099; + res.dumpStateOneNode(master, &lcp, 1); + + if (res.waitNodesNoStart(&master, 1)) + { + return NDBT_FAILED; + } + + if (res.startNodes(&master, 1)) + { + return NDBT_FAILED; + } + + if (res.waitClusterStarted()) + return NDBT_FAILED; + + return NDBT_OK; +} + +int +runBug36245(NDBT_Context* ctx, NDBT_Step* step) +{ + int result = NDBT_OK; + int loops = ctx->getNumLoops(); + NdbRestarter res; + Ndb* pNdb = GETNDB(step); + + if (res.getNumDbNodes() < 4) + return NDBT_OK; + + /** + * Make sure master and nextMaster is in different node groups + */ +loop1: + int master = res.getMasterNodeId(); + int nextMaster = res.getNextMasterNodeId(master); + + printf("master: %u nextMaster: %u", master, nextMaster); + if (res.getNodeGroup(master) == res.getNodeGroup(nextMaster)) + { + ndbout_c(" -> restarting next master: %u", nextMaster); + res.restartOneDbNode(nextMaster, + /** initial */ false, + /** nostart */ true, + /** abort */ true); + + res.waitNodesNoStart(&nextMaster, 1); + res.startNodes(&nextMaster, 1); + if (res.waitClusterStarted()) + { + ndbout_c("cluster didnt restart!!"); + return NDBT_FAILED; + } + goto loop1; + } + ndbout_c(" -> go go gadget skates"); + + int val2[] = { DumpStateOrd::CmvmiSetRestartOnErrorInsert, 1 }; + res.dumpStateOneNode(master, val2, 2); + res.dumpStateOneNode(nextMaster, val2, 2); + + res.insertErrorInNode(master, 8063); + res.insertErrorInNode(nextMaster, 936); + + + int err = 0; + HugoOperations hugoOps(*ctx->getTab()); +loop2: + if((err = hugoOps.startTransaction(pNdb)) != 0) + { + ndbout_c("failed to start transaction: %u", err); + return NDBT_FAILED; + } + + int victim = hugoOps.getTransaction()->getConnectedNodeId(); + if (victim != master) + { + ndbout_c("transnode: %u != master: %u -> loop", + victim, master); + hugoOps.closeTransaction(pNdb); + goto loop2; + } + + if((err = hugoOps.pkUpdateRecord(pNdb, 1)) != 0) + { + ndbout_c("failed to update: %u", err); + return NDBT_FAILED; + } + + if((err = hugoOps.execute_Commit(pNdb)) != 4010) + { + ndbout_c("incorrect error code: %u", err); + return NDBT_FAILED; + } + hugoOps.closeTransaction(pNdb); + + int nodes[2]; + nodes[0] = master; + nodes[1] = nextMaster; + if (res.waitNodesNoStart(nodes, 2)) + { + return NDBT_FAILED; + } + + if (res.startNodes(nodes, 2)) + { + return NDBT_FAILED; + } + + if (res.waitClusterStarted()) + return NDBT_FAILED; return NDBT_OK; } @@ -2733,6 +3303,34 @@ TESTCASE("mixedmultiop", ""){ TESTCASE("Bug34702", ""){ INITIALIZER(runBug34702); } +TESTCASE("MNF", ""){ + INITIALIZER(runLoadTable); + STEP(runMNF); + STEP(runScanUpdateUntilStopped); +} +TESTCASE("Bug36199", ""){ + INITIALIZER(runBug36199); +} +TESTCASE("Bug36246", ""){ + INITIALIZER(runLoadTable); + STEP(runBug36246); + VERIFIER(runClearTable); +} +TESTCASE("Bug36247", ""){ + INITIALIZER(runLoadTable); + STEP(runBug36247); + VERIFIER(runClearTable); +} +TESTCASE("Bug36276", ""){ + INITIALIZER(runLoadTable); + STEP(runBug36276); + VERIFIER(runClearTable); +} +TESTCASE("Bug36245", ""){ + INITIALIZER(runLoadTable); + STEP(runBug36245); + VERIFIER(runClearTable); +} NDBT_TESTSUITE_END(testNodeRestart); int main(int argc, const char** argv){ === modified file 'storage/ndb/test/ndbapi/testOIBasic.cpp' --- a/storage/ndb/test/ndbapi/testOIBasic.cpp 2008-02-11 20:36:27 +0000 +++ b/storage/ndb/test/ndbapi/testOIBasic.cpp 2008-08-07 13:36:47 +0000 @@ -3336,12 +3336,6 @@ BSet::setbnd(Par par) const const BVal& bval = *m_bval[j2]; CHK(bval.setbnd(par) == 0); } - // duplicate - if (urandom(5) == 0) { - uint j3 = urandom(m_bvals); - const BVal& bval = *m_bval[j3]; - CHK(bval.setbnd(par) == 0); - } } return 0; } === modified file 'storage/ndb/test/ndbapi/testSRBank.cpp' --- a/storage/ndb/test/ndbapi/testSRBank.cpp 2007-04-17 07:54:36 +0000 +++ b/storage/ndb/test/ndbapi/testSRBank.cpp 2008-04-28 15:17:02 +0000 @@ -294,4 +294,3 @@ main(int argc, const char** argv){ return testSRBank.execute(argc, argv); } -template class Vector; === modified file 'storage/ndb/test/ndbapi/testScan.cpp' --- a/storage/ndb/test/ndbapi/testScan.cpp 2008-02-19 15:00:29 +0000 +++ b/storage/ndb/test/ndbapi/testScan.cpp 2008-04-28 14:17:28 +0000 @@ -1164,6 +1164,45 @@ runScanVariants(NDBT_Context* ctx, NDBT_ } int +runBug36124(NDBT_Context* ctx, NDBT_Step* step){ + Ndb * pNdb = GETNDB(step); + const NdbDictionary::Table* pTab = ctx->getTab(); + + NdbTransaction* pCon = pNdb->startTransaction(); + NdbScanOperation* pOp = pCon->getNdbScanOperation(pTab->getName()); + if (pOp == NULL) { + ERR(pCon->getNdbError()); + return NDBT_FAILED; + } + + if( pOp->readTuples(NdbOperation::LM_Read) != 0) + { + ERR(pCon->getNdbError()); + return NDBT_FAILED; + } + + if( pOp->getValue(NdbDictionary::Column::ROW_COUNT) == 0) + { + ERR(pCon->getNdbError()); + return NDBT_FAILED; + } + + /* Old style interpreted code api should fail when + * we try to use it + */ + if( pOp->interpret_exit_last_row() == 0) + { + return NDBT_FAILED; + } + + pOp->close(); + + pCon->close(); + + return NDBT_OK; +} + +int runBug24447(NDBT_Context* ctx, NDBT_Step* step){ int loops = 1; //ctx->getNumLoops(); int records = ctx->getNumRecords(); @@ -1680,6 +1719,12 @@ TESTCASE("Bug24447", STEP(runBug24447); FINALIZER(runClearTable); } +TESTCASE("Bug36124", + "Old interpreted Api usage"){ + INITIALIZER(runLoadTable); + STEP(runBug36124); + FINALIZER(runClearTable); +} NDBT_TESTSUITE_END(testScan); int main(int argc, const char** argv){ === modified file 'storage/ndb/test/ndbapi/test_event.cpp' --- a/storage/ndb/test/ndbapi/test_event.cpp 2008-03-25 13:27:14 +0000 +++ b/storage/ndb/test/ndbapi/test_event.cpp 2008-04-25 09:17:15 +0000 @@ -2075,7 +2075,184 @@ runBug33793(NDBT_Context* ctx, NDBT_Step return NDBT_OK; } +static +int +cc(Ndb_cluster_connection** ctx, Ndb** ndb) +{ + Ndb_cluster_connection* xncc = new Ndb_cluster_connection; + int ret; + if ((ret = xncc->connect(30, 1, 0)) != 0) + { + delete xncc; + return NDBT_FAILED; + } + + if ((ret = xncc->wait_until_ready(30, 10)) != 0) + { + delete xncc; + return NDBT_FAILED; + } + + Ndb* xndb = new Ndb(xncc, "TEST_DB"); + if (xndb->init() != 0) + { + delete xndb; + delete xncc; + return NDBT_FAILED; + } + + if (xndb->waitUntilReady(30) != 0) + { + delete xndb; + delete xncc; + return NDBT_FAILED; + } + + * ctx = xncc; + * ndb = xndb; + return 0; +} + +static +NdbEventOperation* +op(Ndb* xndb, const NdbDictionary::Table * table) +{ + char buf[1024]; + sprintf(buf, "%s_EVENT", table->getName()); + NdbEventOperation *pOp; + pOp = xndb->createEventOperation(buf); + if ( pOp == NULL ) + { + g_err << "Event operation creation failed on %s" << buf << endl; + return 0; + } + + int n_columns= table->getNoOfColumns(); + NdbRecAttr* recAttr[1024]; + NdbRecAttr* recAttrPre[1024]; + for (int i = 0; i < n_columns; i++) { + recAttr[i] = pOp->getValue(table->getColumn(i)->getName()); + recAttrPre[i] = pOp->getPreValue(table->getColumn(i)->getName()); + } + return pOp; +} + +int +runBug34853(NDBT_Context* ctx, NDBT_Step* step) +{ + int result = NDBT_OK; + int loops = ctx->getNumLoops(); + int records = ctx->getNumRecords(); + Ndb* pNdb = GETNDB(step); + NdbRestarter res; + + if (res.getNumDbNodes() < 2) + { + return NDBT_OK; + } + + Ndb_cluster_connection* xncc; + Ndb* xndb; + + if (cc(&xncc, &xndb)) + { + return NDBT_FAILED; + } + + NdbEventOperation* pOp = op(xndb, ctx->getTab()); + if (pOp == 0) + { + delete xndb; + delete xncc; + return NDBT_FAILED; + } + + int api = xncc->node_id(); + int nodeId = res.getDbNodeId(rand() % res.getNumDbNodes()); + ndbout_c("stopping %u", nodeId); + res.restartOneDbNode(nodeId, + /** initial */ false, + /** nostart */ true, + /** abort */ true); + + ndbout_c("waiting for %u", nodeId); + res.waitNodesNoStart(&nodeId, 1); + + int dump[2]; + dump[0] = 9004; + dump[1] = api; + res.dumpStateOneNode(nodeId, dump, 2); + res.startNodes(&nodeId, 1); + ndbout_c("waiting cluster"); + res.waitClusterStarted(); + + if (pOp->execute()) + { // This starts changes to "start flowing" + g_err << "execute operation execution failed: \n"; + g_err << pOp->getNdbError().code << " " + << pOp->getNdbError().message << endl; + delete xndb; + delete xncc; + return NDBT_FAILED; + } + + xndb->dropEventOperation(pOp); + + ndbout_c("stopping %u", nodeId); + res.restartOneDbNode(nodeId, + /** initial */ false, + /** nostart */ true, + /** abort */ true); + + ndbout_c("waiting for %u", nodeId); + res.waitNodesNoStart(&nodeId, 1); + + dump[0] = 71; + dump[1] = 7; + res.dumpStateOneNode(nodeId, dump, 2); + res.startNodes(&nodeId, 1); + ndbout_c("waiting node sp 7"); + res.waitNodesStartPhase(&nodeId, 1, 6); + + delete xndb; + delete xncc; + + NdbSleep_SecSleep(5); // 3 seconds to open connections. i.e 5 > 3 + + dump[0] = 71; + res.dumpStateOneNode(nodeId, dump, 1); + + res.waitClusterStarted(); + + if (cc(&xncc, &xndb)) + { + return NDBT_FAILED; + } + + pOp = op(xndb, ctx->getTab()); + if (pOp == 0) + { + delete xndb; + delete xncc; + return NDBT_FAILED; + } + + if (pOp->execute()) + { // This starts changes to "start flowing" + g_err << "execute operation execution failed: \n"; + g_err << pOp->getNdbError().code << " " + << pOp->getNdbError().message << endl; + delete xndb; + delete xncc; + return NDBT_FAILED; + } + + xndb->dropEventOperation(pOp); + delete xndb; + delete xncc; + return NDBT_OK; +} /** Telco 6.2 **/ @@ -2502,6 +2679,11 @@ TESTCASE("Bug33793", ""){ STEP(runBug33793); FINALIZER(runDropEvent); } +TESTCASE("Bug34853", ""){ + INITIALIZER(runCreateEvent); + INITIALIZER(runBug34853); + FINALIZER(runDropEvent); +} TESTCASE("Bug35208", ""){ INITIALIZER(runBug35208_createTable); INITIALIZER(runCreateEvent); === modified file 'storage/ndb/test/run-test/Makefile.am' --- a/storage/ndb/test/run-test/Makefile.am 2008-02-21 13:57:42 +0000 +++ b/storage/ndb/test/run-test/Makefile.am 2008-04-25 06:32:23 +0000 @@ -33,9 +33,9 @@ atrt_SOURCES = main.cpp setup.cpp files. INCLUDES_LOC = -I$(top_srcdir)/storage/ndb/test/include LDADD_LOC = $(top_builddir)/storage/ndb/test/src/libNDBT.a \ $(top_builddir)/storage/ndb/src/libndbclient.la \ - $(top_builddir)/dbug/libdbug.a \ - $(top_builddir)/mysys/libmysys.a \ - $(top_builddir)/strings/libmystrings.a @NDB_SCI_LIBS@ \ + $(top_builddir)/dbug/libdbuglt.la \ + $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/strings/libmystringslt.la @NDB_SCI_LIBS@ \ $(top_builddir)/libmysql_r/libmysqlclient_r.la atrt_CXXFLAGS = -I$(top_srcdir)/ndb/src/mgmapi \ === modified file 'storage/ndb/test/run-test/daily-basic-tests.txt' --- a/storage/ndb/test/run-test/daily-basic-tests.txt 2008-04-07 06:49:01 +0000 +++ b/storage/ndb/test/run-test/daily-basic-tests.txt 2008-08-07 13:36:47 +0000 @@ -485,6 +485,10 @@ max-time: 1000 cmd: testScan args: -n ScanVariants +max-time: 500 +cmd: testScan +args: -n Bug36124 T1 + max-time: 1000 cmd: testNodeRestart args: -n Bug27003 T1 @@ -790,11 +794,15 @@ args: max-time: 600 cmd: testBlobs -args: -bug 27018 +args: -bug 27018 -skip p + +max-time: 600 +cmd: testBlobs +args: -bug 27370 -skip p max-time: 600 cmd: testBlobs -args: -bug 27370 +args: -bug 36756 -skip p max-time: 5000 cmd: testOIBasic @@ -1090,3 +1098,40 @@ max-time: 600 cmd: test_event args: -n Bug35208 T1 +# 2008-04-22 +max-time: 1500 +cmd: testNodeRestart +args: -n MNF -l 15 T1 + +max-time: 300 +cmd: testNodeRestart +args: -n Bug36199 T1 + +max-time: 300 +cmd: testNodeRestart +args: -n Bug36246 T1 + +max-time: 300 +cmd: testNodeRestart +args: -n Bug36247 T1 + +max-time: 300 +cmd: testNodeRestart +args: -n Bug36276 T1 + +# 2008-04-25 +max-time: 300 +cmd: testNodeRestart +args: -n Bug36245 T1 + +max-time: 300 +cmd: test_event +args: -n Bug34853 T1 + +# EOF 2008-04-25 +# 2008-05-29 +max-time: 1200 +cmd: testDict +args: -l 1 -n FailAddFragment + +# EOF 2008-05-29 === modified file 'storage/ndb/tools/ndb_size.pl' --- a/storage/ndb/tools/ndb_size.pl 2007-08-15 02:12:59 +0000 +++ b/storage/ndb/tools/ndb_size.pl 2008-05-23 07:54:06 +0000 @@ -913,14 +913,14 @@ foreach(@{$tables}) } foreach my $i(@show_indexes) { - $indexes{${%$i}{Key_name}}= { - type=>${%$i}{Index_type}, - unique=>!${%$i}{Non_unique}, - comment=>${%$i}{Comment}, - } if !defined($indexes{${%$i}{Key_name}}); + $indexes{$i->{Key_name}}= { + type=>$i->{Index_type}, + unique=>$i->{Non_unique}, + comment=>$i->{Comment}, + } if !defined($indexes{$i->{Key_name}}); - $indexes{${%$i}{Key_name}}{columns}[${%$i}{Seq_in_index}-1]= - ${%$i}{Column_name}; + $indexes{$i->{Key_name}}{columns}[$i->{Seq_in_index}-1]= + $i->{Column_name}; } } my $t= new MySQL::NDB::Size::Table(name => $table, === modified file 'strings/Makefile.am' --- a/strings/Makefile.am 2007-12-07 16:56:17 +0000 +++ b/strings/Makefile.am 2008-08-07 13:36:47 +0000 @@ -16,7 +16,19 @@ # This file is public domain and comes with NO WARRANTY of any kind INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -pkglib_LIBRARIES = libmystrings.a +pkglib_LTLIBRARIES = libmystrings.la +libmystrings_la_LDFLAGS = -static +libmystrings_la_SOURCES = +# These are the symbols we don't use in mysqlclient +libmystringsextra_la_SOURCES = bfill.c r_strinstr.c strtol.c strtoul.c my_strchr.c +# Force C++ linking - dummy.cxx doesn't have to exist with EXTRA in the name +nodist_EXTRA_libmystrings_la_SOURCES = dummy.cxx +# This can't be listed here as $(top_builddir)/strings/libmystingslt.la +# or it breaks make's dependency track for -j builds +libmystrings_la_LIBADD = libmystringslt.la libmystringsextra.la + + +noinst_LTLIBRARIES = libmystringslt.la libmystringsextra.la # Exact one of ASSEMBLER_X if ASSEMBLER_x86 @@ -37,11 +49,11 @@ CSRCS = strxmov.c bmove_upp.c strappend endif endif -libmystrings_a_SOURCES = $(ASRCS) $(CSRCS) +libmystringslt_la_SOURCES = $(ASRCS) $(CSRCS) noinst_PROGRAMS = conf_to_src CLEANFILES = str_test uctypedump test_decimal # Default charset definitions -EXTRA_DIST = ctype-big5.c ctype-cp932.c ctype-czech.c ctype-eucjpms.c ctype-euc_kr.c ctype-win1250ch.c \ +EXTRA_DIST = ctype-big5.c ctype-cp932.c ctype-czech.c ctype-eucjpms.c ctype-euc_kr.c ctype-win1250ch.c \ ctype-gb2312.c ctype-gbk.c ctype-sjis.c ctype-utf8.c \ ctype-ucs2.c ctype-uca.c ctype-tis620.c ctype-ujis.c \ xml.c decimal.c strto.c strings-x86.s \ @@ -55,9 +67,8 @@ EXTRA_DIST = ctype-big5.c ctype-cp932.c strnmov-sparc.s strstr-sparc.s strxmov-sparc.s \ t_ctype.h my_strchr.c CMakeLists.txt -libmystrings_a_LIBADD= -conf_to_src_SOURCES = conf_to_src.c xml.c ctype.c bcmp.c -conf_to_src_LDADD= +conf_to_src_SOURCES = conf_to_src.c +conf_to_src_LDADD= libmystringslt.la #force static linking of conf_to_src - essential when linking against #custom installation of libc conf_to_src_LDFLAGS= @NOINST_LDFLAGS@ @@ -68,15 +79,15 @@ conf_to_src_LDFLAGS= @NOINST_LDFLAGS@ FLAGS=$(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) @NOINST_LDFLAGS@ -str_test: str_test.c $(pkglib_LIBRARIES) - $(LINK) $(FLAGS) -DMAIN $(INCLUDES) $(srcdir)/str_test.c $(LDADD) $(pkglib_LIBRARIES) +str_test: str_test.c $(noinst_LTLIBRARIES) + $(LINK) $(FLAGS) -DMAIN $(INCLUDES) $(srcdir)/str_test.c $(LDADD) $(noinst_LTLIBRARIES) uctypedump: uctypedump.c $(LINK) $(INCLUDES) $(srcdir)/uctypedump.c -test_decimal$(EXEEXT): decimal.c $(pkglib_LIBRARIES) +test_decimal$(EXEEXT): decimal.c $(noinst_LTLIBRARIES) $(CP) $(srcdir)/decimal.c ./test_decimal.c - $(LINK) $(FLAGS) -DMAIN ./test_decimal.c $(LDADD) $(pkglib_LIBRARIES) + $(LINK) $(FLAGS) -DMAIN ./test_decimal.c $(LDADD) $(noinst_LTLIBRARIES) $(RM) -f ./test_decimal.c # Don't update the files from bitkeeper === modified file 'unittest/mysys/Makefile.am' --- a/unittest/mysys/Makefile.am 2007-10-10 07:14:58 +0000 +++ b/unittest/mysys/Makefile.am 2008-08-07 13:36:47 +0000 @@ -17,9 +17,10 @@ AM_CPPFLAGS = @ZLIB_INCLUDES@ -I$(t AM_CPPFLAGS += -I$(top_srcdir)/include -I$(top_srcdir)/unittest/mytap LDADD = $(top_builddir)/unittest/mytap/libmytap.a \ - $(top_builddir)/mysys/libmysys.a \ - $(top_builddir)/dbug/libdbug.a \ - $(top_builddir)/strings/libmystrings.a + $(top_builddir)/mysys/libmysyslt.la \ + $(top_builddir)/dbug/libdbuglt.la \ + $(top_builddir)/strings/libmystringslt.la \ + @ZLIB_LIBS@ noinst_PROGRAMS = bitmap-t base64-t my_atomic-t