summaryrefslogtreecommitdiff
path: root/sql/ha_innodb.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/ha_innodb.cc')
-rw-r--r--sql/ha_innodb.cc98
1 files changed, 58 insertions, 40 deletions
diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc
index aad0ef2d9fd..b58460e30b2 100644
--- a/sql/ha_innodb.cc
+++ b/sql/ha_innodb.cc
@@ -66,6 +66,7 @@ extern "C" {
#include "../innobase/include/trx0roll.h"
#include "../innobase/include/trx0trx.h"
#include "../innobase/include/trx0sys.h"
+#include "../innobase/include/mtr0mtr.h"
#include "../innobase/include/row0ins.h"
#include "../innobase/include/row0mysql.h"
#include "../innobase/include/row0sel.h"
@@ -1735,7 +1736,12 @@ innobase_mysql_cmp(
}
}
- ret = my_strnncoll(charset,
+ /* Starting from 4.1.3, we use strnncollsp() in comparisons of
+ non-latin1_swedish_ci strings. NOTE that the collation order
+ changes then: 'b\0\0...' is ordered BEFORE 'b ...'. Users
+ having indexes on such data need to rebuild their tables! */
+
+ ret = charset->coll->strnncollsp(charset,
a, a_length,
b, b_length);
if (ret < 0) {
@@ -4304,9 +4310,8 @@ ha_innobase::analyze(
}
/**************************************************************************
-This is currently mapped to ::analyze. A better option would be to map this
-to "ALTER TABLE tablename TYPE=InnoDB", which seems to rebuild the table in
-MySQL. */
+This is mapped to "ALTER TABLE tablename TYPE=InnoDB", which rebuilds
+the table in MySQL. */
int
ha_innobase::optimize(
@@ -4314,7 +4319,7 @@ ha_innobase::optimize(
THD* thd, /* in: connection thread handle */
HA_CHECK_OPT* check_opt) /* in: currently ignored */
{
- return(ha_innobase::analyze(thd, check_opt));
+ return(HA_ADMIN_TRY_ALTER);
}
/***********************************************************************
@@ -4631,40 +4636,22 @@ ha_innobase::start_stmt(
prepared for an update of a row */
prebuilt->select_lock_type = LOCK_X;
- } else {
- /* When we first come here after LOCK TABLES,
- select_lock_type is set to LOCK_S or LOCK_X. Store the value
- in case we run also consistent reads and need to restore the
- value later. */
-
- if (prebuilt->select_lock_type != LOCK_NONE) {
- prebuilt->stored_select_lock_type =
- prebuilt->select_lock_type;
- }
-
- if (prebuilt->stored_select_lock_type != LOCK_S
- && prebuilt->stored_select_lock_type != LOCK_X) {
- fprintf(stderr,
-"InnoDB: Error: select_lock_type is %lu inside ::start_stmt()!\n",
- prebuilt->stored_select_lock_type);
-
- ut_error;
- }
-
- if (thd->lex->sql_command == SQLCOM_SELECT
- && thd->lex->lock_option == TL_READ) {
-
- /* For other than temporary tables, we obtain
- no lock for consistent read (plain SELECT) */
-
- prebuilt->select_lock_type = LOCK_NONE;
- } else {
- /* Not a consistent read: restore the
- select_lock_type value */
- prebuilt->select_lock_type =
- prebuilt->stored_select_lock_type;
- }
- }
+ } else {
+ if (thd->lex->sql_command == SQLCOM_SELECT
+ && thd->lex->lock_option == TL_READ) {
+
+ /* For other than temporary tables, we obtain
+ no lock for consistent read (plain SELECT) */
+
+ prebuilt->select_lock_type = LOCK_NONE;
+ } else {
+ /* Not a consistent read: use LOCK_X as the
+ select_lock_type value (TODO: how could we know
+ whether it should be LOCK_S, LOCK_X, or LOCK_NONE?) */
+
+ prebuilt->select_lock_type = LOCK_X;
+ }
+ }
/* Set the MySQL flag to mark that there is an active transaction */
thd->transaction.all.innodb_active_trans = 1;
@@ -5043,7 +5030,7 @@ ha_innobase::store_lock(
/***********************************************************************
This function initializes the auto-inc counter if it has not been
initialized yet. This function does not change the value of the auto-inc
-counter if it already has been initialized. In parameter ret returns
+counter if it already has been initialized. In paramete ret returns
the value of the auto-inc counter. */
int
@@ -5169,4 +5156,35 @@ ha_innobase::get_auto_increment()
return(nr);
}
+/***********************************************************************
+This function stores binlog offset and flushes logs */
+
+void
+innobase_store_binlog_offset_and_flush_log(
+/*=============================*/
+ char *binlog_name, /* in: binlog name */
+ longlong offset /* in: binlog offset */
+)
+{
+ mtr_t mtr;
+
+ assert(binlog_name != NULL);
+
+ /* Start a mini-transaction */
+ mtr_start_noninline(&mtr);
+
+ /* Update the latest MySQL binlog name and offset info
+ in trx sys header */
+
+ trx_sys_update_mysql_binlog_offset(
+ binlog_name,
+ offset,
+ TRX_SYS_MYSQL_LOG_INFO, &mtr);
+
+ /* Commits the mini-transaction */
+ mtr_commit(&mtr);
+
+ /* Syncronous flush of the log buffer to disk */
+ log_buffer_flush_to_disk();
+}
#endif /* HAVE_INNOBASE_DB */