From: magnus.blaudd Date: May 23 2011 12:03pm Subject: bzr commit into mysql-5.1-telco-7.0 branch (magnus.blaudd:4400) Bug#11885602 List-Archive: http://lists.mysql.com/commits/137873 X-Bug: 11885602 Message-Id: <20110523120334.AD94A13402B@pilot> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1518005234939741462==" --===============1518005234939741462== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/msvensson/mysql/bug11885602/7.0/ based on revid:jonas@stripped 4400 magnus.blaudd@stripped 2011-05-23 Bug#11885602 - mysql_upgrade fails upgrading from 7.1.8 to later release - It was allowed to CREATE TABLE which was not in NDB, but creating a view on that table failed since the table has to be opened as part of the create. - Make it possible to workaround this with a new "ndbinfo_offline" mode which allows tables to be created and opened although they don't exist or have different table definition. This is exactly the same behaviour as when NDBCLUSTER is disabled. SELECTs on a table which has been opened in offline mode, return no rows and a warning is printed(like before). modified: mysql-test/suite/ndb/r/ndbinfo.result mysql-test/suite/ndb/t/ndbinfo.test sql/ha_ndbinfo.cc sql/ha_ndbinfo.h storage/ndb/tools/ndbinfo_sql.cpp === modified file 'mysql-test/suite/ndb/r/ndbinfo.result' --- a/mysql-test/suite/ndb/r/ndbinfo.result 2010-11-03 09:48:25 +0000 +++ b/mysql-test/suite/ndb/r/ndbinfo.result 2011-05-23 11:57:55 +0000 @@ -136,6 +136,7 @@ Variable_name Value ndbinfo_database ndbinfo ndbinfo_max_bytes 0 ndbinfo_max_rows 10 +ndbinfo_offline OFF ndbinfo_show_hidden OFF ndbinfo_table_prefix ndb$ ndbinfo_version NDB_VERSION_D @@ -237,4 +238,56 @@ from ndbinfo.diskpagebuffer; node_id 1 2 + +set @@ndbinfo_offline=1; +ERROR HY000: Variable 'ndbinfo_offline' is a GLOBAL variable and should be set with SET GLOBAL + +SELECT DISTINCT(node_id) FROM ndbinfo.counters ORDER BY node_id; +node_id +1 +2 + +set @@global.ndbinfo_offline=TRUE; +select @@ndbinfo_offline; +@@ndbinfo_offline +1 + +CREATE TABLE ndb$does_not_exist_in_ndb( + node_id int, + message varchar(255) +) ENGINE = ndbinfo; + +CREATE VIEW view_on_table_which_does_not_exist_in_ndb AS + SELECT node_id, message + FROM ndbinfo.ndb$does_not_exist_in_ndb; + +SHOW CREATE TABLE ndb$does_not_exist_in_ndb; +Table Create Table +ndb$does_not_exist_in_ndb CREATE TABLE `ndb$does_not_exist_in_ndb` ( + `node_id` int(11) DEFAULT NULL, + `message` varchar(255) DEFAULT NULL +) ENGINE=NDBINFO DEFAULT CHARSET=latin1 + +SELECT * FROM view_on_table_which_does_not_exist_in_ndb; +node_id message +Warnings: +Note 1 'NDBINFO' has been started in offline mode since the 'NDBCLUSTER' engine is disabled or @@global.ndbinfo_offline is turned on - no rows can be returned +SELECT * FROM ndb$does_not_exist_in_ndb; +node_id message +Warnings: +Note 1 'NDBINFO' has been started in offline mode since the 'NDBCLUSTER' engine is disabled or @@global.ndbinfo_offline is turned on - no rows can be returned +SELECT DISTINCT(node_id) FROM ndbinfo.counters ORDER BY node_id; +node_id +Warnings: +Note 1 'NDBINFO' has been started in offline mode since the 'NDBCLUSTER' engine is disabled or @@global.ndbinfo_offline is turned on - no rows can be returned + +DROP VIEW view_on_table_which_does_not_exist_in_ndb; +DROP TABLE ndb$does_not_exist_in_ndb; + +set @@global.ndbinfo_offline = FALSE; + +SELECT DISTINCT(node_id) FROM ndbinfo.counters ORDER BY node_id; +node_id +1 +2 === modified file 'mysql-test/suite/ndb/t/ndbinfo.test' --- a/mysql-test/suite/ndb/t/ndbinfo.test 2010-11-03 09:48:25 +0000 +++ b/mysql-test/suite/ndb/t/ndbinfo.test 2011-05-23 11:57:55 +0000 @@ -148,4 +148,52 @@ CREATE TABLE ndb$test (node_id int AUTO_ select distinct node_id from ndbinfo.diskpagebuffer; + +# +# BUG#11885602 +# - It was allowed to CREATE TABLE which was not in NDB, but +# creating a view on that table failed. Implement ndbinfo_offline +# mode which allows tables to be created and opened although they +# don't exists or have different table definition. +# This is exactly the same behaviour as when NDBCLUSTER +# is disabled +# + +# Check ndbinfo_offline is GLOBAL variable +--error ER_GLOBAL_VARIABLE +set @@ndbinfo_offline=1; + +# Query used to check that open tables are closed +# when offline mode is turned on and off +let $q1 = SELECT DISTINCT(node_id) FROM ndbinfo.counters ORDER BY node_id; +eval $q1; + +# Turn on ndbinfo_offline +set @@global.ndbinfo_offline=TRUE; +select @@ndbinfo_offline; + +CREATE TABLE ndb$does_not_exist_in_ndb( + node_id int, + message varchar(255) +) ENGINE = ndbinfo; + +CREATE VIEW view_on_table_which_does_not_exist_in_ndb AS + SELECT node_id, message + FROM ndbinfo.ndb$does_not_exist_in_ndb; + +SHOW CREATE TABLE ndb$does_not_exist_in_ndb; + +# SELECTs return no rows in offline mode +SELECT * FROM view_on_table_which_does_not_exist_in_ndb; +SELECT * FROM ndb$does_not_exist_in_ndb; +eval $q1; + +DROP VIEW view_on_table_which_does_not_exist_in_ndb; +DROP TABLE ndb$does_not_exist_in_ndb; + +# Restore original value +set @@global.ndbinfo_offline = FALSE; + +eval $q1; + --source ndbinfo_drop.inc === modified file 'sql/ha_ndbinfo.cc' --- a/sql/ha_ndbinfo.cc 2010-11-10 14:17:13 +0000 +++ b/sql/ha_ndbinfo.cc 2011-05-23 11:57:55 +0000 @@ -92,6 +92,45 @@ static MYSQL_SYSVAR_UINT( 0 /* block */ ); +static my_bool opt_ndbinfo_offline; + +static +void +offline_update(THD* thd, struct st_mysql_sys_var* var, + void* var_ptr, const void* save) +{ + DBUG_ENTER("offline_update"); + + const my_bool new_offline = + (*(static_cast(save)) != 0); + if (new_offline == opt_ndbinfo_offline) + { + // No change + DBUG_VOID_RETURN; + } + + // Set offline mode, any tables opened from here on will + // be opened in the new mode + opt_ndbinfo_offline = new_offline; + + // Close any open tables which may be in the old mode + (void)close_cached_tables(thd, NULL, false, true, false); + + DBUG_VOID_RETURN; +} + +static MYSQL_SYSVAR_BOOL( + offline, /* name */ + opt_ndbinfo_offline, /* var */ + PLUGIN_VAR_NOCMDOPT, + "Set ndbinfo in offline mode, tables and views can " + "be opened even if they don't exist or have different " + "definition in NDB. No rows will be returned.", + NULL, /* check func. */ + offline_update, /* update func. */ + 0 /* default */ +); + static NdbInfo* g_ndbinfo; @@ -124,10 +163,15 @@ struct ha_ndbinfo_impl Vector m_columns; bool m_first_use; + // Indicates if table has been opened in offline mode + // can only be reset by closing the table + bool m_offline; + ha_ndbinfo_impl() : m_table(NULL), m_scan_op(NULL), - m_first_use(true) + m_first_use(true), + m_offline(false) { } }; @@ -289,12 +333,18 @@ bool ha_ndbinfo::is_open(void) const return m_impl.m_table != NULL; } +bool ha_ndbinfo::is_offline(void) const +{ + return m_impl.m_offline; +} + int ha_ndbinfo::open(const char *name, int mode, uint test_if_locked) { DBUG_ENTER("ha_ndbinfo::open"); DBUG_PRINT("enter", ("name: %s, mode: %d", name, mode)); assert(is_closed()); + assert(!is_offline()); // Closed table can not be offline if (mode == O_RDWR) { @@ -307,9 +357,11 @@ int ha_ndbinfo::open(const char *name, i DBUG_ASSERT(false); } - if (ndbcluster_is_disabled()) + if (opt_ndbinfo_offline || + ndbcluster_is_disabled()) { - // Allow table to be opened with ndbcluster disabled + // Mark table as being offline and allow it to be opened + m_impl.m_offline = true; DBUG_RETURN(0); } @@ -378,7 +430,7 @@ int ha_ndbinfo::close(void) { DBUG_ENTER("ha_ndbinfo::close"); - if (ndbcluster_is_disabled()) + if (is_offline()) DBUG_RETURN(0); assert(is_open()); @@ -395,12 +447,13 @@ int ha_ndbinfo::rnd_init(bool scan) DBUG_ENTER("ha_ndbinfo::rnd_init"); DBUG_PRINT("info", ("scan: %d", scan)); - if (ndbcluster_is_disabled()) + if (is_offline()) { push_warning(current_thd, MYSQL_ERROR::WARN_LEVEL_NOTE, 1, - "'NDBINFO' has been started " - "in limited mode since the 'NDBCLUSTER' " - "engine is disabled - no rows can be returned"); + "'NDBINFO' has been started in offline mode " + "since the 'NDBCLUSTER' engine is disabled " + "or @@global.ndbinfo_offline is turned on " + "- no rows can be returned"); DBUG_RETURN(0); } @@ -466,7 +519,7 @@ int ha_ndbinfo::rnd_end() { DBUG_ENTER("ha_ndbinfo::rnd_end"); - if (ndbcluster_is_disabled()) + if (is_offline()) DBUG_RETURN(0); assert(is_open()); @@ -486,7 +539,7 @@ int ha_ndbinfo::rnd_next(uchar *buf) int err; DBUG_ENTER("ha_ndbinfo::rnd_next"); - if (ndbcluster_is_disabled()) + if (is_offline()) DBUG_RETURN(HA_ERR_END_OF_FILE); assert(is_open()); @@ -712,6 +765,7 @@ struct st_mysql_sys_var* ndbinfo_system_ MYSQL_SYSVAR(database), MYSQL_SYSVAR(table_prefix), MYSQL_SYSVAR(version), + MYSQL_SYSVAR(offline), NULL }; === modified file 'sql/ha_ndbinfo.h' --- a/sql/ha_ndbinfo.h 2011-02-01 14:58:21 +0000 +++ b/sql/ha_ndbinfo.h 2011-05-23 11:57:55 +0000 @@ -83,6 +83,8 @@ private: bool is_open(void) const; bool is_closed(void) const { return ! is_open(); }; + bool is_offline(void) const; + struct ha_ndbinfo_impl& m_impl; }; === modified file 'storage/ndb/tools/ndbinfo_sql.cpp' --- a/storage/ndb/tools/ndbinfo_sql.cpp 2011-04-12 11:59:36 +0000 +++ b/storage/ndb/tools/ndbinfo_sql.cpp 2011-05-23 11:57:55 +0000 @@ -327,6 +327,12 @@ int main(int argc, char** argv){ sql.assfmt("CREATE DATABASE IF NOT EXISTS `%s`", opt_ndbinfo_db); print_conditional_sql(sql); + printf("# Set NDBINFO in offline mode during (re)create of tables\n"); + printf("# and views to avoid errors caused by no such table or\n"); + printf("# different table definition in NDB\n"); + sql.assfmt("SET @@global.ndbinfo_offline=TRUE"); + print_conditional_sql(sql); + printf("# Drop any old views in %s\n", opt_ndbinfo_db); for (size_t i = 0; i < num_views; i++) { @@ -430,6 +436,10 @@ int main(int argc, char** argv){ print_conditional_sql(sql); } + printf("# Finally turn off offline mode\n"); + sql.assfmt("SET @@global.ndbinfo_offline=FALSE"); + print_conditional_sql(sql); + return 0; } --===============1518005234939741462== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/magnus.blaudd@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: magnus.blaudd@stripped\ # 3l1esbdcl4reaj9m # target_branch: file:///home/msvensson/mysql/bug11885602/7.0/ # testament_sha1: c7454dec1374966b18185d39f83b4e68f57ca0d7 # timestamp: 2011-05-23 14:03:34 +0200 # base_revision_id: jonas@stripped # # Begin bundle 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 --===============1518005234939741462==--