bug#39483 InnoDB hang on adaptive hash because of out of order ::open()
call by MySQL
Forward port of r2629
Under some conditions MySQL calls ::open with search_latch leading
to a deadlock as we try to acquire dict_sys->mutex inside ::open
breaking the latching order. The fix is to release search_latch.
Reviewed by: Heikki
Add the parameter struct charset_info_st* cs, so that the call
thd_charset(current_thd) can be avoided. The macro current_thd has no
defined value in the Windows plugin.
ha_innodb.cc: Declare strict_mode as PLUGIN_VAR_OPCMDARG, because we
do want to be able to disable innodb_strict_mode. This is a non-functional
change, because PLUGIN_VAR_NOCMDARG seems to accept an argument as well.
innodb-zip.test: Do not store innodb_strict_mode. It is a session variable.
Add a test case for innodb_strict_mode=off.
Merge 2605:2617 from branches/5.1:
------------------------------------------------------------------------
r2609 | sunny | 2008-08-24 01:19:05 +0300 (Sun, 24 Aug 2008) | 12 lines
Changed paths:
M /branches/5.1/handler/ha_innodb.cc
M /branches/5.1/mysql-test/innodb-autoinc.result
M /branches/5.1/mysql-test/innodb-autoinc.test
branches/5.1: Fix for MySQL Bug#38839. Reset the statement level last
value field in prebuilt. This field tracks the last value in an autoincrement
interval. We use this value to check whether we need to update a table's
AUTOINC counter, if the value written to a table is less than this value
then we avoid updating the table's AUTOINC value in order to reduce
mutex contention. If it's not reset (e.g., after a DELETE statement) then
there is the possibility of missing updates to the table's AUTOINC counter
resulting in a subsequent duplicate row error message under certain
conditions (see the test case for details).
Bug #38839 - auto increment does not work properly with InnoDB after update
------------------------------------------------------------------------
r2617 | vasil | 2008-09-09 15:46:17 +0300 (Tue, 09 Sep 2008) | 47 lines
Changed paths:
M /branches/5.1/mysql-test/innodb.result
branches/5.1:
Merge a change from MySQL (fix the failing innodb test):
------------------------------------------------------------
revno: 2646.12.1
committer: Mattias Jonsson <mattiasj@mysql.com>
branch nick: wl4176_2-51-bugteam
timestamp: Mon 2008-08-11 20:02:03 +0200
message:
Bug#20129: ALTER TABLE ... REPAIR PARTITION ... complains that
partition is corrupt
The main problem was that ALTER TABLE t ANALYZE/CHECK/OPTIMIZE/REPAIR
PARTITION took another code path (over mysql_alter_table instead of
mysql_admin_table) which differs in two ways:
1) alter table opens the tables in a different way than admin tables do
resulting in returning with error before it tried the command
2) alter table does not start to send any diagnostic rows to the client
which the lower admin functions continue to use -> resulting in
assertion crash
The fix:
Remapped ALTER TABLE t ANALYZE/CHECK/OPTIMIZE/REPAIR PARTITION to use
the same code path as ANALYZE/CHECK/OPTIMIZE/REPAIR TABLE t.
Adding check in mysql_admin_table to setup the partition list for
which partitions that should be used.
Partitioned tables will still not work with
REPAIR TABLE/PARTITION USE_FRM, since that requires moving partitions
to tables, REPAIR TABLE t USE_FRM, and check that the data still
fulfills the partitioning function and then move the table back to
being a partition.
NOTE: I have removed the following functions from the handler
interface:
analyze_partitions, check_partitions, optimize_partitions,
repair_partitions
Since they are not longer needed.
THIS ALTERS THE STORAGE ENGINE API
I have verified that OPTIMIZE TABLE actually rebuilds the table
and calls ANALYZE.
Approved by: Heikki
foreign key constraint, find a truly equivalent index for it.
If none is available, refuse to drop the index. MySQL can drop
an index when creating a "stronger" index.
This was reported as Mantis issue #70 and MySQL Bug #38786.
innodb-index.test: Add a test case.
dict_foreign_find_equiv_index(): New function, to replace the
incorrectly written function dict_table_find_equivalent_index().
dict_table_replace_index_in_foreign_list(): Simplify the implementation.
Merge 2537:2605 from branches/5.1:
------------------------------------------------------------------------
r2545 | vasil | 2008-07-25 17:24:23 +0300 (Fri, 25 Jul 2008) | 37 lines
Changed paths:
M /branches/5.1/handler/ha_innodb.cc
branches/5.1:
Fix Bug#38185 ha_innobase::info can hold locks even when called with HA_STATUS_NO_LOCK
The fix is to call fsp_get_available_space_in_free_extents() from
ha_innobase::info() only if HA_STATUS_NO_LOCK is not present in the flag
*AND*
change get_schema_tables_record() in MySQL's sql/sql_show.cc to call
::info() *without* HA_STATUS_NO_LOCK whenever a user issues SELECT FROM
information_schema.tables;
Without the change to sql/sql_show.cc this patch would lead to Bug#32440
resurfacing. I.e. delete_length would never be updated in ::info() and
will remain 0 forever, resulting in the free space not being shown
anywhere.
This is the change to sql/sql_show.cc for reference, it needs to be
committed to the MySQL repo before or at the same time with this change
to ha_innodb.cc:
--- patch begins here ---
--- sql/sql_show.cc.orig 2008-07-23 09:32:14.000000000 +0300
+++ sql/sql_show.cc 2008-07-23 09:32:19.000000000 +0300
@@ -3549,8 +3549,7 @@ static int get_schema_tables_record(THD
if(file)
{
- file->info(HA_STATUS_VARIABLE | HA_STATUS_TIME | HA_STATUS_AUTO |
- HA_STATUS_NO_LOCK);
+ file->info(HA_STATUS_VARIABLE | HA_STATUS_TIME | HA_STATUS_AUTO);
enum row_type row_type = file->get_row_type();
switch (row_type) {
case ROW_TYPE_NOT_USED:
--- patch ends here ---
Approved by: Heikki
------------------------------------------------------------------------
r2603 | marko | 2008-08-21 16:25:05 +0300 (Thu, 21 Aug 2008) | 10 lines
Changed paths:
M /branches/5.1/handler/ha_innodb.cc
M /branches/5.1/include/ha_prototypes.h
M /branches/5.1/row/row0sel.c
branches/5.1: Identify SELECT statements by thd_sql_command() == SQLCOM_SELECT
instead of parsing the query string. This fixes MySQL Bug #37885 without
us having to implement lexical analysis of SQL comments in yet another place.
thd_is_select(): A new predicate.
row_search_for_mysql(): Use thd_is_select().
Approved by Heikki.
------------------------------------------------------------------------
The cardinality of every index (the number of different key values) is
calculated when the table is opened, at SHOW TABLE STATUS,
ANALYZE TABLE and on other circumstances (like when the table has
changed too much). Note that if the mysql client is running with the
auto-rehash setting turned on (default) this causes all tables to be
opened when it starts.
Previously InnoDB sampled 8 random pages from the index to get an
estimate of the cardinality. Now the number of sampled pages can be
changed via the global parameter innodb_stats_sample_pages which can
be tuned at runtime. The default value for this parameter is 8.
If the value of this parameter is changed, there may be serious problems:
- small values (say, 1) can cause an error in table stats;
- values much larger than 8 (say, 100), can cause a big slowdown in
table opening time, SHOW TABLE status, etc.
- query plans may be different from the old ones.
Approved by: Heikki
Add a space in a warning message. No functional change to the code.
The original message is "invalid innodb_file_format_checkvalue;...".
The new one is "invalid innodb_file_format_check value;..."
------------------------------------------------------------------------
r2519 | sunny | 2008-06-26 16:55:43 +0300 (Thu, 26 Jun 2008) | 5 lines
branches/5.1: Add test cases and fix a bug where the last AUTOINC cached value
was not reset to 0 when the table was truncated.
Bug #37531 : After truncate, auto_increment behaves incorrectly for InnoDB
------------------------------------------------------------------------
r2520 | vasil | 2008-06-26 17:38:02 +0300 (Thu, 26 Jun 2008) | 7 lines
branches/5.1:
Fix Bug#36941 Performance problem in ha_print_info (SHOW INNODB STATUS)
by disabling some of the code in ha_print_info() in production builds.
Approved by: Heikki (via IM)
------------------------------------------------------------------------
r2521 | vasil | 2008-06-26 17:39:01 +0300 (Thu, 26 Jun 2008) | 8 lines
branches/5.1:
Fix Bug#36942 Performance problem in lock_get_n_rec_locks (SHOW INNODB STATUS)
by not calling lock_get_n_rec_locks() from lock_print_info_summary() on
production builds.
Approved by: Heikki (via IM)
------------------------------------------------------------------------
r2524 | vasil | 2008-07-01 10:37:34 +0300 (Tue, 01 Jul 2008) | 29 lines
branches/5.1:
Merge a change from MySQL (this fixes the failing innodb-replace test):
revno: 2659
committer: Mattias Jonsson <mattiasj@mysql.com>
branch nick: b31210-51-bugteam
timestamp: Tue 2008-06-03 13:25:41 +0200
message:
Bug#31210: INSERT DELAYED crashes server when used on partitioned tables
Problem was an unclear error message since it could suggest that
MyISAM did not support INSERT DELAYED.
Changed the error message to say that DELAYED is not supported by the
table, instead of the table's storage engine.
The confusion is that a partitioned table is in somewhat sense using
the partitioning storage engine, which in turn uses the ordinary
storage engine. By saying that the table does not support DELAYED we
do not give any extra informantion about the storage engine or if it
is partitioned.
modified:
mysql-test/r/innodb-replace.result
mysql-test/t/innodb-replace.test
mysql-test/t/merge.test
mysql-test/t/partition_hash.test
sql/share/errmsg.txt
sql/sql_insert.cc
------------------------------------------------------------------------
Rewrite the function innodb_plugin_init() to support parameters in
different order (in static and dynamic InnoDB) and to support more
parameters in the static InnoDB.
The previous implementation traversed both lists at the same time,
skipping parameters in the dynamic list that do not exist in the static
list. E.g. both lists were allowed to be static=(a, b, c),
dynamic=(a, b, c) or static=(a, b, c), dynamic=(a, b, x, c).
With the new implementation they are allowed to be
static=(a, b, c), dynamic=(b, a, c) or
static=(a, b, x, c), dynamic=(b, a, c) in addition.
The new implementation has complexity O(N^2) while the old one was O(N),
but this is acceptable sacrifice provided that innodb_plugin_init() is
called once per InnoDB lifetime and that N=39 currently, and N is not
going to increase much in the future, N=number of the InnoDB parameters.
Suggested by: Sunny
Approved by: Sunny
Fix the rpl_ddl mysql-test that produces a warnings:
master.err: rpl.rpl_ddl: 080611 16:27:01 [Warning] MySQL is closing a connection that has an active InnoDB transaction. 13 row modifications will roll back.
the bug was introduced in r2256, which adds "prebuilt->trx->active_trans = 1;"
in ::add_index() and ::final_drop_index() but never calls innobase_commit() or
innobase_rollback() to set back active_trans to 0.
Also, per Heikki's suggestion we remove the calls to trans_register_ha() from
::add_index() and ::final_drop_index(). Following is the IM discussion that
took place about this:
--- cut ---
(17:59:05) vasil:
unsigned active_trans:2; /* 1 - if a transaction in MySQL
is active. 2 - if prepare_commit_mutex
was taken */
(17:59:13) vasil: what about 0?
(17:59:26) Heikki: Hmm
(17:59:42) Heikki: Maybe in the other cases :)
(18:01:00) vasil:
2 1369 handler/ha_innodb.cc <<<unknown>>>
if (trx->active_trans == 0) {
3 1372 handler/ha_innodb.cc <<<unknown>>>
trx->active_trans = 1;
(18:01:05) vasil: yes, it can be 0
(18:01:38) Heikki: Maybe no active transaction => the value is 0
(18:02:03) vasil: probably yes
(18:09:09) vasil:
/* The flag trx->active_trans is set to 1 in
1. ::external_lock(),
2. ::start_stmt(),
3. innobase_query_caching_of_table_permitted(),
4. innobase_savepoint(),
5. ::init_table_handle_for_HANDLER(),
6. innobase_start_trx_and_assign_read_view(),
7. ::transactional_table_lock()
and it is only set to 0 in a commit or a rollback.
(18:09:14) vasil: this is no longer true
(18:09:35) vasil: it is also set to 1 in ::final_drop_index
(18:09:56) vasil: and in ::add_index()
(18:12:31) Heikki: Please correct the comment :(
(18:13:01) vasil: it is not only the comment, I am trying to understand what's wrong
(18:13:28) Heikki: What is the symptom?
(18:14:37) vasil: can you find this email and the subsequent one:
From: Vasil Dimov <vasil.dimov@oracle.com>
To: InnoDB Dev <innodb_dev_ww@oracle.com>
Subject: Re: innodb - marko - r2256 - in branches/zip: handler include lock
trx
Date: Wed, 11 Jun 2008 16:33:47 +0300
(18:15:02) vasil: the symptom is
master.err: rpl.rpl_ddl: 080611 16:27:01 [Warning] MySQL is closing a connection that has
+an active InnoDB transaction. 13 row modifications will roll back.
(18:16:22) vasil: My understanding till now is that active_trans is set to 1 in ::add_index() and forgotten like this, never set to 0; I wonder if it should be set to 0 somewhere at the end or not set to 1 at all... or there is more...
(18:16:31) Heikki: Vasil, ok the problem is that Marko forgets to commit the transaction
(18:16:55) Heikki: An active transaction has to be committed or rolled back
(18:17:09) vasil: but i can find this in ::add_index():
/* Commit the data dictionary transaction in order to release
the table locks on the system tables. Unfortunately, this
means that if MySQL crashes while creating a new primary key
inside row_merge_build_indexes(), indexed_table will not be
dropped on crash recovery. Thus, it will become orphaned. */
trx_commit_for_mysql(trx);
(18:17:27) vasil: but this function does not set active_trans to 0
(18:17:43) Heikki: Let me look
(18:19:20) vasil: it is only set to 0 in innobase_commit() and in innobase_rollback()
(18:20:10) Heikki: Ok
(18:20:59) Heikki: Hmm...
(18:21:08) vasil: innobase_commit() calls innobase_commit_low() calls trx_commit_for_mysql()
innobase_commit() sets active_trans=0
(18:21:26) Heikki: active_trans is strictly a ha_innodb.cc variable
(18:21:53) Heikki: It is intended to be used in transactions visible to MySQL
(18:22:25) Heikki: I think Marko should call innobase_commit()
(18:23:51) vasil: but still set active_trans=1 inside :add_index() inside handler/handler0alter.cc?
(18:24:12) Heikki: Hmm
(18:24:56) Heikki: I think the transaction is NOT really visible to MySQL
(18:24:57) vasil:
> Author: marko
> Date: 2008-01-25 16:26:07 +0200 (Fri, 25 Jan 2008)
> New Revision: 2256
>
> Log:
> branches/zip: Fast index creation: Release locks on system tables before
> creating indexes. Lock the user table inside the user transaction.
>
> enum trx_dict_op: Remove TRX_OP_INDEX_MAY_WAIT.
>
> ha_innobase::add_index(): Lock the user tables within prebuilt->trx.
> Commit the data dictionary transaction before creating indexes.
>
> ha_innobase::final_drop_index(): Lock the user table within prebuilt->trx.
(18:26:41) Heikki: Let me look at the old ::create_table()
(18:27:25) Heikki: Ok, in the old code, the transactions are internal to InnoDB, not visible to MySQL
(18:27:46) Heikki: I think it is an error to set active_trans=1 inside :add_index() i
(18:28:11) Heikki: MySQL is not really interested in HOW the engine adds the index. In a transaction or not.
(18:28:26) vasil: this is the change inside drop_index(), that is supposed to "Lock the user table within prebuilt->trx":
(18:28:37) vasil:
@@ -1093,27 +1101,25 @@ ha_innobase::final_drop_index(
/* Create a background transaction for the operations on
the data dictionary tables. */
trx = trx_allocate_for_mysql();
trx_start_if_not_started(trx);
trans_register_ha(user_thd, FALSE, ht);
+ prebuilt->trx->active_trans = 1;
trx->mysql_thd = user_thd;
trx->mysql_query_str = thd_query(user_thd);
/* Flag this transaction as a dictionary operation, so that
- the data dictionary will be locked in crash recovery. Prevent
- warnings if row_merge_lock_table() results in a lock wait,
- i.e., when another transaction is holding a conflicting lock
- on the table, e.g., because of SELECT ... FOR UPDATE. */
- trx_set_dict_operation(trx, TRX_DICT_OP_INDEX_MAY_WAIT);
+ the data dictionary will be locked in crash recovery. */
+ trx_set_dict_operation(trx, TRX_DICT_OP_INDEX);
/* Lock the table exclusively, to ensure that no active
transaction depends on an index that is being dropped. */
err = convert_error_code_to_mysql(
- row_merge_lock_table(trx, prebuilt->table, LOCK_X),
+ row_merge_lock_table(prebuilt->trx, prebuilt->table, LOCK_X),
user_thd);
if (UNIV_UNLIKELY(err)) {
/* Unmark the indexes to be dropped. */
row_mysql_lock_data_dictionary(trx);
@@ -1125,14 +1131,12 @@ ha_innobase::final_drop_index(
}
row_mysql_unlock_data_dictionary(trx);
goto func_exit;
}
- trx_set_dict_operation(trx, TRX_DICT_OP_INDEX);
-
/* Drop indexes marked to be dropped */
row_mysql_lock_data_dictionary(trx);
index = dict_table_get_first_index(prebuilt->table);
@@ -1159,12 +1163,13 @@ ha_innobase::final_drop_index(
dict_table_check_for_dup_indexes(prebuilt->table);
#endif
row_mysql_unlock_data_dictionary(trx);
func_exit:
trx_commit_for_mysql(trx);
+ trx_commit_for_mysql(prebuilt->trx);
/* Flush the log to reduce probability that the .frm files and
the InnoDB data dictionary get out-of-sync if the user runs
with innodb_flush_log_at_trx_commit = 0 */
log_buffer_flush_to_disk();
(18:28:43) Heikki: Let me look
(18:29:05) vasil: this is the change inside drop_index(), that is supposed to "Lock the user table within prebuilt->trx"
(18:29:26) Heikki: trans_register_ha(user_thd, FALSE, ht);
+ prebuilt->trx->active_trans = 1;
(18:29:34) Heikki: I think the above code should be removed
(18:29:53) Heikki: MySQL is not interested in InnoDB's transaction in this case
(18:30:33) Heikki: Alternatively, we should use innobase_commit() instead of trx_commit_...
(18:31:01) vasil: but there are many places in ::add_index() where it could return before reaching the trx_commit...
(18:31:12) vasil: leaving active_traans=1
(18:31:56) Heikki: Does Marko handle the errors with trx_rollback()?
(18:32:08) vasil: let me see..
(18:32:30) Heikki: It is risky to leave error handling to MySQL :(
(18:32:35) vasil:
651 if (UNIV_UNLIKELY(error)) {
652 err_exit:
653 mem_heap_free(heap);
654 trx_general_rollback_for_mysql(trx, FALSE, NULL);
655 trx_free_for_mysql(trx);
656 trx_commit_for_mysql(prebuilt->trx);
657 DBUG_RETURN(error);
658 }
(18:32:43) Heikki: Ok
(18:33:25) Heikki: Please remove the ha_register... and active_trx =1 ....
(18:33:42) Heikki: Then check if it prints something
(18:34:08) Heikki: I believe MySQL is not interested in how the engine does the index build
(18:34:11) vasil: why remove ha_register?
(18:34:28) Heikki: Because there is no transaction visible to MySQL
(18:34:53) vasil: the ha_register call was there from before
(18:35:09) Heikki: Registers that InnoDB takes part in an SQL statement, so that MySQL knows to
roll back the statement if the statement results in an error. This MUST be
called for every SQL statement that may be rolled back by MySQL. Calling this
several times to register the same statement is allowed, too.
(18:36:01) Heikki: Hmm
(18:36:17) Heikki: Obviously, MySQL does NOT call commit at the end
(18:36:36) Heikki: Because then innobase_commit() would set active_trx=0!
(18:37:00) Heikki: Ok, maybe MySQL thinks CREATE INDEX is NOT a transactional statement
(18:37:21) Heikki: Then, .._register_.. should be removed
(18:37:51) Heikki: It is logical this way. If it also passes test, even better
(18:38:21) vasil: ha_registrer in add_index() was added in r1845 and in drop_index() in r2128, let me read the comments..
(18:38:55) vasil:
------------------------------------------------------------------------
r1845 | marko | 2007-09-13 13:31:54 +0300 (Thu, 13 Sep 2007) | 3 lines
branches/zip: Move the code related to fast index creation
(smart ALTER TABLE) from ha_innodb.cc to a separate module, handler0alter.cc.
(18:39:05) Heikki: One thing you must check is that MySQL does write the CREATE INDEX in the binlog, even if we remove the _register_
(18:39:41) Heikki: I assume Marko did not know if MySQL thinks CREATE INDEX is transactional or not
(18:39:49) Heikki: He thought it is transactional
(18:39:53) vasil:
------------------------------------------------------------------------
r2128 | marko | 2007-11-29 12:34:55 +0200 (Thu, 29 Nov 2007) | 5 lines
branches/zip: ha_innobase::final_drop_index(): Allocate a separate transaction
for dropping the index trees, and set the dictionary operation flag, similar
to what ha_innobase::add_index() does. This should ensure correct crash
recovery.
(18:40:10) Heikki: Ok
(18:40:17) vasil: how do you know CREATE INDEX is not transactional?
(18:40:33) Heikki: You cannot roll it back
(18:40:44) vasil: ok
(18:41:03) Heikki: MySQL devs probably thought this way
(18:44:15) vasil: hmm
(18:44:21) vasil: about r1845
(18:45:00) vasil: the comments says "move the code" but it is actually "move and change the code"
(18:45:28) Heikki: Well
(18:45:29) vasil: the code that is deleted from ha_innodb is this:
(18:45:32) vasil:
- update_thd(ha_thd());
-
- heap = mem_heap_create(1024);
-
- /* In case MySQL calls this in the middle of a SELECT query, release
- possible adaptive hash latch to avoid deadlocks of threads. */
- trx_search_latch_release_if_reserved(check_trx_exists(user_thd));
-
- trx = trx_allocate_for_mysql();
- trx_start_if_not_started(trx);
-
- innobase_register_stmt(ht, user_thd);
-
- trx->mysql_thd = user_thd;
(18:45:38) vasil: (in add_index)
(18:45:48) inaam left the room.
(18:45:52) vasil: but the new one in handler0alter is this:
(18:46:16) vasil:
+ update_thd(ha_thd());
+
+ heap = mem_heap_create(1024);
+
+ /* In case MySQL calls this in the middle of a SELECT query, release
+ possible adaptive hash latch to avoid deadlocks of threads. */
+ trx_search_latch_release_if_reserved(check_trx_exists(user_thd));
+
+ trx = trx_allocate_for_mysql();
+ trx_start_if_not_started(trx);
+
+ trans_register_ha(user_thd, FALSE, ht);
+
+ trx->mysql_thd = user_thd;
(18:46:48) vasil: innobase_register_stmt(ht, user_thd); was substituted with trans_register_ha(user_thd, FALSE, ht); during the move
(18:46:49) Heikki: I do not see how MySQL could call it in the middle of a SELECT query!
(18:46:59) Heikki: Yes
(18:47:21) Heikki: Did Marko change innobase_register_stmt() code too?
(18:48:05) vasil: not in this commit r1845
(18:48:54) Heikki: Anyway, please test a version where you remove the register thing
(18:49:08) vasil: and active_trans=1?
(18:49:15) Heikki: Remove that, too
(18:49:35) Heikki: innobase_register_stmt(
/*===================*/
handlerton* hton, /* in: Innobase hton */
THD* thd) /* in: MySQL thd (connection) object */
{
DBUG_ASSERT(hton == innodb_hton_ptr);
/* Register the statement */
trans_register_ha(thd, FALSE, hton);
}
(18:50:23) Heikki: looks pretty much the same as what Marko has in the later version
(18:50:43) vasil: innobase_register_stmt() was added in add_index() in r1584
(18:50:47) vasil:
r1584 | marko | 2007-06-18 15:46:42 +0300 (Mon, 18 Jun 2007) | 12 lines
branches/zip: ha_innobase::add_index(): Split some assertions.
Remove the variable parent_trx.
Call innobase_register_stmt() in order to work around a MySQL bug
in mysql_alter_table(), which, as of
ChangeSet@1.2482.61.2, 2007-06-07 16:37:15+02:00, joerg@trift2. +8 -0
commits the transaction before calling ha_innobase::add_index().
Without re-registering the statement, the ha_commit_stmt(thd)
in mysql_alter_table() would not invoke innobase_commit.
(18:51:56) Heikki: But it does not seem to invoke it now, because active_trans is left 1!
(18:54:15) Heikki: Apparently, there has been confusion also among MySQL devs whether CREATE INDEX is transactional or not
(18:54:45) vasil: :-(
(18:54:53) Heikki: The most robust way is to handle all commits and rollbacks internally inside InnoDB and not tell MySQL anything about InnoDB's internal transactions
(18:55:01) Heikki: That is my idea
(18:55:20) Heikki: Then MySQL cannot spoil the logic of the code
(18:55:59) vasil: mysql_alter_table() is ~1100 lines
(18:56:08) vasil: and you suggest what?
(18:56:43) Heikki: I suggest removing the ..._register_... thing and active_trans = 1
(18:57:08) Heikki: Those things tell MySQL that there is a transaction going on
(18:57:14) Heikki: Better not to tell
(18:57:29) vasil: and possibly ignoring the above comment in r1584, "Call innobase_register_stmt() in order to work around a MySQL bug
in mysql_alter_table()........."
(18:57:32) vasil: ?
(18:57:36) Heikki: Yes
(18:57:38) vasil: ok
(18:57:44) vasil: same for drop_index?
(18:57:48) Heikki: Yes
(18:58:51) vasil: testing
Index: handler/handler0alter.cc
===================================================================
--- handler/handler0alter.cc (revision 2498)
+++ handler/handler0alter.cc (working copy)
@@ -632,14 +632,14 @@ ha_innobase::add_index(
/* Create a background transaction for the operations on
the data dictionary tables. */
trx = trx_allocate_for_mysql();
trx_start_if_not_started(trx);
- trans_register_ha(user_thd, FALSE, ht);
- prebuilt->trx->active_trans = 1;
+ //trans_register_ha(user_thd, FALSE, ht);
+ //prebuilt->trx->active_trans = 1;
trx->mysql_thd = user_thd;
trx->mysql_query_str = thd_query(user_thd);
innodb_table = indexed_table
= dict_table_get(prebuilt->table->name, FALSE);
@@ -1081,14 +1081,14 @@ ha_innobase::final_drop_index(
/* Create a background transaction for the operations on
the data dictionary tables. */
trx = trx_allocate_for_mysql();
trx_start_if_not_started(trx);
- trans_register_ha(user_thd, FALSE, ht);
- prebuilt->trx->active_trans = 1;
+ //trans_register_ha(user_thd, FALSE, ht);
+ //prebuilt->trx->active_trans = 1;
trx->mysql_thd = user_thd;
trx->mysql_query_str = thd_query(user_thd);
/* Flag this transaction as a dictionary operation, so that
the data dictionary will be locked in crash recovery. */
(18:59:07) vasil: not warnings
(18:59:22) Heikki: Did it create the indexes
(18:59:36) vasil: I did test only removing active_trans=1 and it removed the warnings too
(18:59:38) vasil: dunno
(18:59:54) Heikki: That is the most important thing to check :)
(19:00:10) vasil: :)
(19:00:38) vasil: it is some mysqltest that is 610 lines
(19:00:48) vasil: and it happens at the end
(19:01:02) vasil: lets see how may add index statements...
(19:01:11) vasil: 0
(19:01:26) Heikki: Mostly I am concerned that MySQL might work wrong without that _register_ thing
(19:03:28) vasil: could be
(19:03:49) Heikki: You need to check it still calls ::add_index()
(19:05:15) vasil: well, the change we made is inside ::add_index() how could it result in mysql stopping to call ::add_index()?
(19:05:39) vasil: if it calls it twice...
(19:05:43) Heikki: :-D
(19:08:34) vasil: I guess it must have created the index, because the test is doing SHOW INDEX after CREATE INDEX and after DROP INDEX
(19:08:43) vasil: the test would have failed if the index was not created
(19:09:10) Heikki: You need to check that a query using that index will have the right EXPLAIN and result
(19:15:04) vasil: this is with the patch:
+CREATE TABLE t (a INT) ENGINE=innodb;
+CREATE INDEX ti ON t(a);
+INSERT INTO t VALUES (1), (2), (3);
+EXPLAIN SELECT * FROM t WHERE a=2;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t ref ti ti 5 const 1 Using where; Using index
+SELECT * FROM t WHERE a=2;
+a
+2
(19:15:15) Heikki: :)
(19:15:46) vasil: this is with the original code:
+CREATE TABLE t (a INT) ENGINE=innodb;
+CREATE INDEX ti ON t(a);
+INSERT INTO t VALUES (1), (2), (3);
+EXPLAIN SELECT * FROM t WHERE a=2;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t ref ti ti 5 const 1 Using where; Using index
+SELECT * FROM t WHERE a=2;
+a
+2
(19:15:59) vasil: it is the same
(19:16:06) vasil: do you think this is sufficient?
(19:16:20) Heikki: No, you need to do some manual tests, too
(19:16:28) vasil: this is manual test
(19:16:37) Heikki: Several of them
(19:16:46) vasil: what should they do?
(19:17:13) Heikki: Test tables of different sizes, different indexes
(19:17:27) Heikki: CREATE several indexes at a time
(19:19:14) Heikki: Dinner time -->
--- cut ---
Approved by: Heikki
(r2478 was skipped for the obvious reason)
------------------------------------------------------------------------
r2464 | vasil | 2008-05-19 17:59:42 +0300 (Mon, 19 May 2008) | 9 lines
branches/5.1:
Fix Bug#36600 SHOW STATUS takes a lot of CPU in buf_get_latched_pages_number
by removing the Innodb_buffer_pool_pages_latched variable from
SHOW STATUS output in non-UNIV_DEBUG compilation.
Approved by: Heikki
------------------------------------------------------------------------
r2466 | calvin | 2008-05-20 01:37:14 +0300 (Tue, 20 May 2008) | 12 lines
branches/5.1:
Fix Bug#11894 innodb_file_per_table crashes w/ Windows .sym symbolic
link hack
The crash was due to un-handled error 3 (path not found). In the case
of file per table, change the call to os_file_handle_error_no_exit()
from os_file_handle_error(). Also, checks for full path pattern during
table create (Windows only), which is used in symbolic link and temp
table creation.
Approved by: Heikki
------------------------------------------------------------------------
r2478 | sunny | 2008-05-23 08:29:08 +0300 (Fri, 23 May 2008) | 3 lines
branches/5.1: Fix for bug# 36793. This is a back port from branches/zip. This
code has been tested on a big-endian machine too.
------------------------------------------------------------------------
r2480 | vasil | 2008-05-27 11:40:07 +0300 (Tue, 27 May 2008) | 11 lines
branches/5.1:
Fix Bug#36819 ut_usectime does not handle errors from gettimeofday
by retrying gettimeofday() several times if it fails in ut_usectime().
If it fails on all calls then return error to the caller to be handled
at higher level.
Update the variable innodb_row_lock_time_max in SHOW STATUS output only
if ut_usectime() was successful.
------------------------------------------------------------------------
r2482 | sunny | 2008-05-28 12:18:35 +0300 (Wed, 28 May 2008) | 5 lines
branches/5.1: Fix for Bug#35602, "Failed to read auto-increment value from
storage engine". The test for REPLACE was an error of ommission since it's
classified as a simple INSERT. For REPLACE statements we don't acquire
the special AUTOINC lock for AUTOINC_NEW_STYLE_LOCKING with this fix.
------------------------------------------------------------------------
r2485 | vasil | 2008-05-28 16:01:14 +0300 (Wed, 28 May 2008) | 9 lines
branches/5.1:
Fix Bug#36149 Read buffer overflow in srv0start.c found during "make test"
Use strncmp(3) instead of memcmp(3) to avoid reading past end of the string
if it is empty (*str == '\0'). This bug is _not_ a buffer overflow.
Discussed with: Sunny (via IM)
------------------------------------------------------------------------
Implement the system tablespace tagging described on the wiki:
https://svn.innodb.com/innobase/InnoDB_version_and_feature_compatibility
A brief description of the changes:
* The file format tag will be saved in the trx system page, starting at
(UNIV_PAGE_SIZE - 16) for 8 bytes.
* The configuration parameter innodb_file_format_check is introduced.
This variable can be set to on/off and any of the supported file
formats in the configuration file, but can only be set to any of
the supported file formats during runtime. The default is on.
* During table create/open, check the current file format against
the max in file_format_max. If the current file format is newer,
update file_format_max and tag the system tablespace with the
newer one in a normal mtr.
* During startup, write the tag to the error log and check it against
DICT_TF_FORMAT_MAX. Refuse to start with error, if
-- DICT_TF_FORMAT_MAX < the tag, and
-- innodb_file_format_check is ON
Print out a warning , if
-- DICT_TF_FORMAT_MAX < the tag, but
-- innodb_file_format_check is off
* The system tablespace tag is re-settable using:
set innodb_file_format_check = <file_format>
Approved by: Sunny
Add InnoDB version in these places:
* In INFORMATION_SCHEMA.PLUGINS.PLUGIN_VERSION, only 1.2 out of 1.2.3
because MySQL supports only one dot there
* At startup:
"080501 12:28:06 InnoDB Plugin 1.0.1 started; log sequence number 46509"
* In a server variable innodb_version;
mysql> select @@innodb_version;
+------------------+
| @@innodb_version |
+------------------+
| 1.0.1 |
+------------------+
Approved by: Sunny
Allow InnoDB I_S plugins to be installed when InnoDB storage engine is
not installed but show empty tables when SELECTing from them in this
case. Set srv_was_started to FALSE at the end of
innobase_shutdown_for_mysql() so the I_S plugins can detect if InnoDB is
uninstalled.
This is needed to workaround the MySQL
Bug#36399 Double free bug when INFORMATION_SCHEMA plugin init function fails
and is more flexible as it allows I_S plugins to be installed before the
InnoDB plugin and detects if the latter is uninstalled after this.
Approved by: Heikki
------------------------------------------------------------------------
r2429 | vasil | 2008-04-30 11:19:06 +0300 (Wed, 30 Apr 2008) | 10 lines
branches/5.1:
* Use INNODB_CFLAGS insead of cluttering CFLAGS with InnoDB specific
flags. CFLAGS are used to compile every file in the MySQL source tree.
* Add INNODB_DYNAMIC_CFLAGS to the flags of the dynamic plugin and use
-prefer-non-pic to make the dynamic plugin faster on i386.
Approved by: Sunny
------------------------------------------------------------------------
r2430 | vasil | 2008-04-30 11:48:35 +0300 (Wed, 30 Apr 2008) | 8 lines
branches/5.1:
Use CFLAGS instead of INNODB_CFLAGS to avoid having incompatible flags
inserted in CFLAGS and INNODB_CFLAGS and to avoid compiling mysql and
innodb with different flags.
Discussed with: Sunny
------------------------------------------------------------------------
r2431 | vasil | 2008-04-30 11:54:49 +0300 (Wed, 30 Apr 2008) | 4 lines
branches/5.1:
Fix r2430, it should be CFLAGS="$CFLAGS ..." not CFLAGS="..."
------------------------------------------------------------------------
r2432 | vasil | 2008-04-30 11:58:38 +0300 (Wed, 30 Apr 2008) | 4 lines
branches/5.1:
Non-functional change: use tabs for indentation in plug.in.
------------------------------------------------------------------------
r2433 | vasil | 2008-04-30 12:02:35 +0300 (Wed, 30 Apr 2008) | 5 lines
branches/5.1:
Add vim modeline to hint it that plug.in is a config file
so it can be colorized.
------------------------------------------------------------------------
r2434 | vasil | 2008-04-30 18:45:44 +0300 (Wed, 30 Apr 2008) | 17 lines
branches/5.1:
Merge changes from MySQL:
ChangeSet@1.2645, 2007-12-19 13:24:43+00:00, jperkin@chorlton.adsl.perkin.org.uk +14 -0
Add new pkgplugindir handling to seperate plugins from libraries,
and allow override for binary distributions. Extend mysql_config
to print compiled-in plugin location for third-party plugins to
use. Resolves bug#31736.
and
ChangeSet@1.2646, 2008-01-02 13:00:46+00:00, jperkin@chorlton.adsl.perkin.org.uk +11 -0
Use pkglibdir to simplify pkgplugindir, and fix the path in a
couple of Makefiles. Continuation of the fix for bug#31736.
------------------------------------------------------------------------
r2435 | vasil | 2008-04-30 19:04:36 +0300 (Wed, 30 Apr 2008) | 10 lines
branches/5.1:
Merge change from MySQL:
ChangeSet@1.2563, 2008-03-18 19:42:04+04:00, gluh@mysql.com +1 -0
Bug#35406 5.1-opt crashes on select from I_S.REFERENTIAL_CONSTRAINTS
added intialization of f_key_info.referenced_key_name for the case when
referenced table is dropped
------------------------------------------------------------------------
r2436 | vasil | 2008-04-30 19:15:46 +0300 (Wed, 30 Apr 2008) | 7 lines
branches/5.1:
Non-functional white space change in Makefile.am:
Use tabs for indentation and be consistent about spaces around the
equal sign.
------------------------------------------------------------------------
r2437 | vasil | 2008-04-30 20:36:11 +0300 (Wed, 30 Apr 2008) | 8 lines
branches/5.1:
Fix Bug#36434 ha_innodb.so is installed in the wrong directory
Change pkglib_LTLIBRARIES with pkgplugin_LTLIBRARIES which has been
forgotten in this commit: http://lists.mysql.com/commits/40206
------------------------------------------------------------------------
------------------------------------------------------------------------
r2386 | vasil | 2008-03-27 07:45:02 +0200 (Thu, 27 Mar 2008) | 22 lines
branches/5.1:
Merge change from MySQL (this fixes the failing innodb test):
ChangeSet@1.1810.3601.4, 2008-02-07 02:33:21+04:00, gshchepa@host.loc +9 -0
Fixed bug#30059.
Server handles truncation for assignment of too-long values
into CHAR/VARCHAR/TEXT columns in a different ways when the
truncated characters are spaces:
1. CHAR(N) columns silently ignore end-space truncation;
2. TEXT columns post a truncation warning/error in the
non-strict/strict mode.
3. VARCHAR columns always post a truncation note in
any mode.
Space truncation processing has been synchronised over
CHAR/VARCHAR/TEXT columns: current behavior of VARCHAR
columns has been propagated as standard.
Binary-encoded string/BLOB columns are not affected.
------------------------------------------------------------------------
r2387 | vasil | 2008-03-27 08:49:05 +0200 (Thu, 27 Mar 2008) | 8 lines
branches/5.1:
Check whether *trx->mysql_query_str is != NULL in addition to
trx->mysql_query_str. This adds more safety.
This may or may not fix Bug#35226 RBR event crashes slave.
------------------------------------------------------------------------
r2388 | vasil | 2008-03-27 14:02:34 +0200 (Thu, 27 Mar 2008) | 7 lines
branches/5.1:
Swap the order in which mysql_thd, mysql_query_str and *mysql_query_str
are checked for non-NULL.
Suggested by: Marko
------------------------------------------------------------------------
r2419 | vasil | 2008-04-23 19:08:06 +0300 (Wed, 23 Apr 2008) | 9 lines
branches/5.1:
Change the fix for Bug#32440 to show bytes instead of kilobytes in
INFORMATION_SCHEMA.TABLES.DATA_FREE.
Suggested by: Domas Mituzas <domas@mysql.com>
Approved by: Heikki
------------------------------------------------------------------------
r2420 | calvin | 2008-04-24 15:25:30 +0300 (Thu, 24 Apr 2008) | 4 lines
branches/5.1: Fix bug#29507 TRUNCATE shows to many rows effected
In InnoDB, the row count is only a rough estimate used by SQL
optimization. InnoDB is now return row count 0 for TRUNCATE operation.
------------------------------------------------------------------------
r2421 | calvin | 2008-04-24 15:32:30 +0300 (Thu, 24 Apr 2008) | 6 lines
branches/5.1: Fix bug#35537 - Innodb doesn't increment handler_update
and handler_delete
Add the calls to ha_statistic_increment() in ha_innobase::delete_row()
and ha_innobase::update_row().
------------------------------------------------------------------------
r2422 | vasil | 2008-04-24 16:00:30 +0300 (Thu, 24 Apr 2008) | 11 lines
branches/5.1:
Fix Bug#36169 create innodb compressed table with too large row size crashed
Sometimes it is possible that
row_drop_table_for_mysql(index->table_name, trx, FALSE); is invoked in
row_create_index_for_mysql() when the index object is freed so copy the
table name to a safe place beforehand and use the copy.
Approved by: Sunny
------------------------------------------------------------------------
Fix Mantis issue#34 https://svn.innodb.com/mantis/view.php?id=34
"I_S plugins should refuse to load if the storage engine plugin is not loaded"
and MySQL Bug#36310 http://bugs.mysql.com/36310
"InnoDB plugin crash"
* Make srv_was_started public
* Set srv_was_started at the end of innobase_start_or_create_for_mysql()
so it is not set to TRUE if innodb encounters some startup error
* Refuse to start any of the I_S plugins if srv_was_started is not TRUE
Approved by: Heikki
described in Mantis#30. Specifically:
- Allow innodb_file_format to take string arguments
- Make innodb_file_format system variable a string instead of a number
- Implement the callback functions
- Update warning messages
Three new functions are implemented:
file_format_name_lookup(): Validate the file format name and return
its corresponding id.
innodb_file_format_check(): Check if it is a valid file format. This
function is registered as a callback with MySQL.
innodb_file_format_update(): Update the global variable using the
"saved" value. This functions is registered as a callback with MySQL.
Introduced a new session level config param innodb_strict_mode.
If it is set we do extra checking at time of table creation
and fail if any invalid combination of KEY_BLOCK_SIZE
or ROW_FORMAT is specified.
Reviewed by: Sunny
in INFORMATION_SCHEMA.INNODB_CMP*.
i_s_cmp_fields_info, i_s_cmpmem_fields_info: Define the field lengths
as MY_INT32_NUM_DECIMAL_DIGITS or MY_INT64_NUM_DECIMAL_DIGITS.
i_s_cmpmem_fields_info: Define "relocation_ops" as MYSQL_TYPE_LONGLONG.
and columns as suggested by Ken.
INNODB_COMPRESSION, INNODB_COMPRESSION_RESET:
Rename to INNODB_CMP, INNODB_CMP_RESET, with the following columns:
page_size
compress_ops
compress_ops_ok
compress_time
uncompress_ops
uncompress_time
INNODB_COMPRESSION_BUDDY, INNODB_COMPRESSION_BUDDY_RESET:
Rename to INNODB_CMPMEM, INNODB_CMPMEM_RESET, with the following columns:
page_size
pages_used
pages_free
relocation_ops
relocation_time
INNODB_COMPRESSION_BUDDY and INNODB_COMPRESSION_BUDDY_RESET.
buf_buddy_stat_struct, buf_buddy_stat_t, buf_buddy_stat[]:
Statistics of the buddy system grouped by block size.
i_s_innodb_compression_buddy, i_s_innodb_compression_buddy_reset:
New INFORMATION_SCHEMA plugins.
i_s_compression_buddy_fields_info[]: Define the fields:
size, used, free, relocated, relocated_sec.
i_s_compression_buddy_fill_low(), i_s_compression_buddy_fill(),
i_s_compression_buddy_reset_fill(): Fill the fields.
i_s_compression_buddy_init(), i_s_compression_buddy_reset_init():
Initialize the tables.
i_s_compression_fill_low(): Do not acquire or release the buffer pool
mutex. The page_zip_stat[] is not protected by any mutex.
i_s_innodb_compression, i_s_innodb_compression_reset: Change the
description to say "compression" instead of "compressed buffer pool".
INNODB_ZIP and INNODB_ZIP_RESET to
INNODB_COMPRESSION and INNODB_COMPRESSION_RESET,
and remove the statistics of the buddy system.
This change was discussed with Ken. It makes the tables shorter
and easier to understand. The removed data will be represented in
the tables INNODB_COMPRESSION_BUDDY and INNODB_COMPRESSION_BUDDY_RESET
that will be added later.
i_s_innodb_zip, i_s_innodb_zip_reset, i_s_zip_fields_info[],
i_s_zip_fill_low(), i_s_zip_fill(), i_s_zip_reset_fill(),
i_s_zip_init(), i_s_zip_reset_init(): Replace "zip" with "compression".
i_s_compression_fields_info[]: Remove "used", "free",
"relocated", "relocated_usec". In "compressed_usec" and "decompressed_usec",
replace microseconds with seconds ("usec" with "sec").
page_zip_decompress(): Correct a typo in the function comment.
PAGE_ZIP_SSIZE_BITS, PAGE_ZIP_NUM_SSIZE: New constants.
page_zip_stat_t, page_zip_stat: Statistics of the compression, grouped
by page size.
page_zip_simple_validate(): Assert that page_zip->ssize is reasonable.
Add the prototype of check_global_access() if MySQL version is less than
5.1.24 to make zip compile with 5.1.23. This was removed when MySQL added
the prototype in their code in 5.1.24 but we still need zip to compile with
older versions.
my_error(ER_TOO_BIG_ROWSIZE, ...). Otherwise, MySQL can report
"Got error 139 from storage engine" instead of the appropriate
error message.
ha_innobase::index_read(), ha_innobase::general_fetch():
Replace if-else if-else with switch-case.
Pass table->flags to convert_error_code_to_mysql().
innodb_check_for_record_too_big_error(). Remove. This code belongs to
convert_error_code_to_mysql().
convert_error_code_to_mysql(): Add the parameter "flags", for table flags.
Translate DB_TOO_BIG_RECORD into ER_TOO_BIG_ROWSIZE.
create_index(): Add the parameter "flags".
create_clustered_index_when_no_primary(): Replace the parameter "comp"
with "flags".
innobase_drop_database(): Remove the #ifdef'd-out call to
convert_error_code_to_mysql().
Throw warnings, not errors for wrong ROW_FORMAT or KEY_BLOCK_SIZE,
so that any table dump can be loaded.
As of this change, InnoDB supports the following table formats:
ROW_FORMAT=REDUNDANT
the only format before MySQL/InnoDB 5.0.3
ROW_FORMAT=COMPACT
the new default format of MySQL/InnoDB 5.0.3
ROW_FORMAT=DYNAMIC
uncompressed, no prefix in the clustered index record for BLOBs
ROW_FORMAT=COMPRESSED
like ROW_FORMAT=DYNAMIC, but zlib compressed B-trees and BLOBs;
the compressed page size is specified by KEY_BLOCK_SIZE in
kilobytes (1, 2, 4, 8, or 16; default 8)
KEY_BLOCK_SIZE=1, 2, 4, 8, or 16: implies ROW_FORMAT=COMPRESSED;
ignored if ROW_FORMAT is not COMPRESSED
KEY_BLOCK_SIZE=anything else: ignored
The InnoDB row format is displayed in the 4th column (Row_format) of
the output of SHOW TABLE STATUS. The Create_options column may show
ROW_FORMAT= and KEY_BLOCK_SIZE=, but they do not necessarily have
anything to do with InnoDB.
The table format can also be queried like this:
SELECT table_schema, table_name, row_format
FROM information_schema.tables
WHERE engine='innodb' and row_format in ('Compressed','Dynamic');
When Row_format='Compressed', KEY_BLOCK_SIZE should usually correspond
to the compressed page size. But the .frm file could be manipulated
to show any KEY_BLOCK_SIZE.
For some reason, INFORMATION_SCHEMA.TABLES.CREATE_OPTIONS does not
include KEY_BLOCK_SIZE. It does include row_format (spelled in
lowercase). This looks like a MySQL bug, because the table
INFORMATION_SCHEMA.TABLES probably tries to replace SHOW TABLE STATUS.
I reported this as Bug #35275 <http://bugs.mysql.com/35275>.
ha_innobase::get_row_type(): Add ROW_TYPE_COMPRESSED, ROW_TYPE_DYNAMIC.
ha_innobase::create(): Implement ROW_FORMAT=COMPRESSED and
ROW_FORMAT=DYNAMIC. Do not throw errors for wrong ROW_FORMAT or
KEY_BLOCK_SIZE, but issue warnings instead.
ha_innobase::check_if_incompatible_data(): Return COMPATIBLE_DATA_NO
if KEY_BLOCK_SIZE has been specified.
innodb.result: Adjust the result for the warning issued for ROW_FORMAT=FIXED.
innodb-zip.test: Add tests. Query INFORMATION_SCHEMA.TABLES for ROW_FORMAT.
variable innodb_file_format. Implement file format version stamping of
*.ibd files and SYS_TABLES.TYPE.
This change breaks introduces an incompatible change for for
compressed tables. We can do this, as we have not released yet.
innodb-zip.test: Add tests for stricter KEY_BLOCK_SIZE and ROW_FORMAT
checks.
DICT_TF_COMPRESSED_MASK, DICT_TF_COMPRESSED_SHIFT: Replace with
DICT_TF_ZSSIZE_MASK, DICT_TF_ZSSIZE_SHIFT.
DICT_TF_FORMAT_MASK, DICT_TF_FORMAT_SHIFT, DICT_TF_FORMAT_51,
DICT_TF_FORMAT_ZIP: File format version, stored in table->flags,
in the .ibd file header, and in SYS_TABLES.TYPE.
dict_create_sys_tables_tuple(): Write the table flags to SYS_TABLES.TYPE
if the format is at least DICT_TF_FORMAT_ZIP. For old formats
(DICT_TF_FORMAT_51), write DICT_TABLE_ORDINARY as the table type.
DB_TABLE_ZIP_NO_IBD: Remove the error code. The error handling is done
in ha_innodb.cc; as a failsafe measure, dict_build_table_def_step() will
silently clear the compression and format flags instead of returning this
error.
dict_mem_table_create(): Assert that no extra bits are set in the flags.
dict_sys_tables_get_zip_size(): Rename to dict_sys_tables_get_flags().
Check all flag bits, and return ULINT_UNDEFINED if the combination is
unsupported.
dict_boot(): Document the SYS_TABLES columns N_COLS and TYPE.
dict_table_get_format(), dict_table_set_format(),
dict_table_flags_to_zip_size(): New accessors to table->flags.
dtuple_convert_big_rec(): Introduce the auxiliary variables
local_len, local_prefix_len. Store a 768-byte prefix locally
if the file format is less than DICT_TF_FORMAT_ZIP.
dtuple_convert_back_big_rec(): Restore the columns.
srv_file_format: New variable: innodb_file_format.
fil_create_new_single_table_tablespace(): Replace the parameter zip_size
with table->flags.
fil_open_single_table_tablespace(): Replace the parameter zip_size_in_k
with table->flags. Check the flags.
fil_space_struct, fil_space_create(), fil_op_write_log():
Replace zip_size with flags.
fil_node_open_file(): Note a TODO item for InnoDB Hot Backup.
Check that the tablespace flags match.
fil_space_get_zip_size(): Rename to fil_space_get_flags(). Add a
wrapper for fil_space_get_zip_size().
fsp_header_get_flags(): New function.
fsp_header_init_fields(): Replace zip_size with flags.
FSP_SPACE_FLAGS: New name for the tablespace flags. This field used
to be called FSP_PAGE_ZIP_SIZE, or FSP_LOWEST_NO_WRITE. It has always
been written as 0 in MySQL/InnoDB versions 4.1 to 5.1.
MLOG_ZIP_FILE_CREATE: Rename to MLOG_FILE_CREATE2. Add a 32-bit
parameter for the tablespace flags.
ha_innobase::create(): Check the table attributes ROW_FORMAT and
KEY_BLOCK_SIZE. Issue errors if they are inappropriate, or warnings
if the inherited attributes (in ALTER TABLE) will be ignored.
PAGE_ZIP_MIN_SIZE_SHIFT: New constant: the 2-logarithm of PAGE_ZIP_MIN_SIZE.
There is one consideration: fil_init() chooses the tablespace hash size
based on the initial value of srv_file_per_table. However, this is nothing
new: InnoDB could be started with innodb_file_per_table=0 even though
*.ibd files exist.
srv_file_per_table: Declare as my_bool instead of ibool, because
MYSQL_SYSVAR_BOOL() expects a pointer to my_bool. Document the
variable also in srv0srv.h.
innobase_start_or_create_for_mysql(): Note why it is OK to temporarily
clear srv_file_per_table.
innobase_file_per_table: Remove.
lock_get_table(), locks_row_eq_lock(), buf_page_get_mutex(): Add return
after ut_error. On Windows, ut_error is not declared as "noreturn".
Add explicit type casts when assigning ulint to byte to get rid of
"possible loss of precision" warnings.
struct i_s_table_cache_struct: Declare rows_used, rows_allocd as ulint
instead of ullint. 32 bits should be enough.
fill_innodb_trx_from_cache(), i_s_zip_fill_low(): Cast 64-bit unsigned
integers to longlong when calling Field::store(longlong, bool is_unsigned).
Otherwise, the compiler would implicitly convert them to double and
invoke Field::store(double) instead.
recv_truncate_group(), recv_copy_group(), recv_calc_lsn_on_data_add():
Cast ib_uint64_t expressions to ulint to get rid of "possible loss of
precision" warnings. (There should not be any loss of precision in
these cases.)
log_close(), log_checkpoint_margin(): Declare some variables as ib_uint64_t
instead of ulint, so that there won't be any potential loss of precision.
mach_write_ull(): Cast the second argument of mach_write_to_4() to ulint.
OS_FILE_FROM_FD(): Cast the return value of _get_osfhandle() to HANDLE.
row_merge_dict_table_get_index(): Cast the parameter of mem_free() to (void*)
in order to get rid of the bogus MSVC warning C4090, which has been reported
as MSVC bug 101661:
<http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=101661>
row_mysql_read_blob_ref(): To get rid of a bogus MSVC warning C4090,
drop a const qualifier.
innobase_raw_format(), move the definition from row0row.c to
ha_innodb.cc. After this change, row0row.c no longer references
system_charset_info (Mantis issue #17). Patch prepared by Vasil,
tested by Calvin, and reviewed by Marko.
also when row_merge_create_temporary_table() fails. Otherwise, an
assertion would fail when the client connection is closed, because
prebuilt->trx would still be holding a table lock on innodb_table.
Use innobase_strcasecmp() insteaed of strcasecmp() in i_s.cc and get rid
of strings.h (that file is not present on Windows).
Move the prototype of innobase_strcasecmp() from ha_innodb.cc and
dict0dict.c to ha_prototypes.h.
Approved by: Heikki
buf_buddy_relocated_duration[],
page_zip_compress_duration[]
page_zip_decompress_duration[]: Record the total duration of the operations.
buf_buddy_relocate(), page_zip_compress(), page_zip_decompress():
Add ut_time_us() instrumentation.
i_s_zip_fields_info[], i_s_zip_fill_low(): Move the columns containing
cumulated statistics last. Add relocated_usec, compressed_usec, and
decompressed_usec.
innobase_check_index_keys(): Remove unused parameters. Use
sql_print_error() for error message output.
ha_innobase::add_index(): When row_merge_rename_tables() fails, do not
allow row_merge_drop_table() to alter the error code returned to MySQL.