Commit graph

170 commits

Author SHA1 Message Date
marko
d247fe38c3 Merge a change from MySQL AB:
ChangeSet@1.2528.116.43  2007-09-12 13:35:39-07:00  antony@xiphis.org

undo unneccessary change to ha_innodb.cc
remove 'drop database' from new tests.

ha_innodb.cc:

undo unneccessary edits.
2007-11-30 09:43:06 +00:00
marko
52e26fc38d Merge a change from MySQL AB:
ChangeSet@1.2528.116.42  2007-09-08 20:26:12-07:00  antony@xiphis.org

Bug#30919
  "Rows not deleted from innodb partitioned tables if
  --innodb_autoinc_lock_mode=0"

  Due to a previous bugfix which initializes a previously uninitialized
  variable, ha_partition::get_auto_increment() may fail to operate
  correctly when the storage engine reports that it is only reserving
  one value and one or more partitions have a different 'next-value'.
  Currently, only affects Innodb's new-style auto-increment code which
  reserves larger blocks of values and has less inter-thread contention.

ha_innodb.cc:
Bug30919
  Only set *first_value if it is less than autoinc value. This allows
  a higher value to be hinted when operating as a partitioned table.
2007-11-30 09:40:20 +00:00
marko
204964b702 Merge a change from MySQL AB:
ChangeSet@1.2528.116.40  2007-09-08 11:19:35-07:00  acurtis@xiphis.org

Bug#30907
  "Regression: "--innodb_autoinc_lock_mode=0" (off) not same as older releases"
Bug#28430
  "Failure in replication of innodb partitioned tables on row/mixed format"
Bug#30888
  "Innodb table + stored procedure + row deletion = server crash"

  Apply Oracle patch from Sunny
  Include tests cases by Omer
  Ensure that innobase_read_and_init_auto performs table autoinc lock when
  lock_mode = 0
  No need for "if" guard around row_unlock_table_autoinc_for_mysql() because
  it already performs same check.
  Make autoinc_lock_mode variable read-only for duration of running
  mysqld process.

ha_innodb.cc:
Bug30907/28430
  "Regression: "--innodb_autoinc_lock_mode=0" (off) not same as older releases"
  "Failure in replication of innodb partitioned tables on row/mixed format"
  Apply Oracle patch from Sunny
  Ensure that innobase_read_and_init_auto performs table autoinc lock when
  lock_mode = 0
  No need for "if" guard around row_unlock_table_autoinc_for_mysql() because
  it already performs same check.
  Make autoinc_lock_mode variable read-only for duration of running
  mysqld process.
2007-11-30 09:36:27 +00:00
marko
faabd6de9e Merge a change from MySQL AB:
ChangeSet@1.2528.24.43  2007-08-02 02:22:31-06:00  tsmith@hindu.god

Post-merge fix, add InnoDB compatibility hook (defined for
InnoDB only), thd_mark_transaction_to_rollback().
2007-11-30 09:25:46 +00:00
marko
f52b8888e4 convert_search_mode_to_innobase(): Add the missing case label
HA_READ_MBR_EQUAL that was forgotten in r2088.
2007-11-16 13:03:21 +00:00
marko
5b53daeb9d Remove the unused function innobase_convert_from_filename() that was
inadvertently added in r590.
2007-11-16 12:59:33 +00:00
vasil
6c6208ac94 Non-functional change: convert the switch in convert_search_mode_to_innobase()
to the InnoDB coding style.
2007-11-14 13:15:24 +00:00
vasil
eddb125877 Fix Bug#32125 (http://bugs.mysql.com/32125)
"Database crash due to ha_innodb.cc:3896: ulint convert_search_mode_to_innobase":

When unknown find_flag is encountered in convert_search_mode_to_innobase()
do not call assert(0); instead queue a MySQL error using my_error() and
return the error code PAGE_CUR_UNSUPP. Change the functions that call
convert_search_mode_to_innobase() to handle that error code by "canceling"
execution and returning appropriate error code further upstream.

Approved by:	Heikki (via IM)
2007-11-14 12:49:24 +00:00
sunny
2eec90cf46 Remove ut_print_timestamp(), this should have been removed when the following
changes were made by MySQL.

	ChangeSet@1.1810.467.1  2005-08-11 19:19:20+03:00  jani@omakaista.fi

Fix error message so that it conforms to "  InnoDB: Error: ...".
2007-10-25 01:17:40 +00:00
marko
491d106832 Use "InnoDB:" prefix in error messages. 2007-10-24 11:35:23 +00:00
sunny
e501f63f14 Suppress printing of deadlock errors while reading the autoinc value.
DB_DEADLOCK errors are part of normal processing and excessive printing
of these error messages could be disconcerting for users.
2007-10-17 11:44:41 +00:00
sunny
e89155b32f Bug fix: The problem was that when write_row() attempted to update the max
autoinc value, and if it was rolled back because of a deadlock, the 
deadlock error (transaction rollback) was not being propagated back to MySQL.
2007-10-16 11:08:35 +00:00
sunny
1a4b717f6e Prevent loading of tables that have unsupported features most notably
FTS indexes.
2007-10-12 16:40:42 +00:00
marko
b44b2ae51d Merge a change from MySQL AB:
ChangeSet@1.2560  2007-09-21 10:15:16+02:00  gkodinov@local

ha_innodb.cc: fixed type conversion warnings revealed by bug 30639
2007-09-24 11:28:51 +00:00
marko
16566e237c Merge a change from MySQL AB:
ChangeSet@1.2528.115.30  2007-08-28 10:17:15-06:00  tsmith@hindu.god

Fix another compiler warning on Windows in InnoDB.

ha_innodb.cc:

Fix compiler warning: ::get_auto_increment takes a ulonglong
for nb_desired_values, but InnoDB's trx struct stores it as
a ulint (unsigned long).  Probably harmless, as a single
statement won't be asking for more than 2^32 rows.
2007-09-24 11:26:57 +00:00
marko
f0d11fca62 Merge changes from MySQL AB:
ChangeSet@1.2528.115.25  2007-08-27 18:18:14-06:00  tsmith@hindu.god

Fix some Windows compiler warnings.

dict0mem.c: Fix compiler warning with a cast.

ha_innodb.cc: Change type to fix a compiler warning.
2007-09-24 11:23:24 +00:00
vasil
2ee633f8eb Revert r1850 as MySQL did not approve the addition.
log for r1850:

Implement this feature request:
http://bugs.mysql.com/30706

* Add a function that returns the number of microseconds since
  epoch - ut_time_us().

* Add (innodb|innobase|srv)_replication_delay MySQL config parameter.

* Add UT_WAIT_FOR() macro that waits for a specified condition to occur
  until a timeout elapses.

* Using all of the above, handle the replication thread specially in
  srv_conc_enter_innodb().
2007-09-20 14:37:03 +00:00
vasil
8785af49a3 Implement this feature request:
http://bugs.mysql.com/30706

* Add a function that returns the number of microseconds since
  epoch - ut_time_us().

* Add (innodb|innobase|srv)_replication_delay MySQL config parameter.

* Add UT_WAIT_FOR() macro that waits for a specified condition to occur
  until a timeout elapses.

* Using all of the above, handle the replication thread specially in
  srv_conc_enter_innodb().

Approved by:	Heikki
2007-09-17 18:15:44 +00:00
vasil
ac6d4693c0 Add config option innodb_use_adaptive_hash_indexes to enable/disable
adaptive hash indexes. It is enabled by default (no change in default
behavior).

Approved by:	Marko
2007-09-14 08:19:48 +00:00
sunny
18e0aaa3a4 Add /*== ... === */ decoration that was missing around some auto-inc functions.
Add a missing comment, fix the length of a decoration.  Initialize the *value
out parameter in ha_innobase::innobase_get_auto_increment().
2007-09-10 20:26:01 +00:00
sunny
4678dfac36 Add assertion to enforce check of an implicit invariant and add comment about
retry of autoinc read semantics. We always reread the table's autoinc counter
after attempting to initialize it i.e., we want to guarantee that a read of
autoinc valus that is returned to the caller is always covered by the
AUTOINC locking mechanism.
2007-09-09 22:41:42 +00:00
sunny
73fd262210 Fix two bugs:
Bug# 30907: We don't rely on *first_value to be 0 when checking whether
get_auto_increment() has been invoked for the first time in a multi-row
INSERT. We instead use trx_t::n_autoinc_rows. Initialize trx::n_autoinc_rows
inside ha_innobase::start_stmt() too.

Bug# 30888: While adding code for the low level read of the AUTOINC value
from the index, the case for MEDIUM ints which are 3 bytes was missed
triggering an assertion.
2007-09-08 20:40:10 +00:00
marko
520d554ba5 ha_innobase::external_lock(): Update prebuilt->mysql_has_locked and
trx->n_mysql_tables_in_use only after row_lock_table_for_mysql()
returns DB_SUCCESS.  A timeout on LOCK TABLES would lead to an
inconsistent state, which would cause trx_free() to print a warning.

This was later reported as Bug #31444.
2007-09-05 13:02:36 +00:00
marko
b1663422e2 Move the prototype of innobase_print_identifier() from ut0ut.c to
ha_prototypes.h.  Enclose the definitions in ha_prototypes.h in
#ifndef UNIV_HOTBACKUP.
2007-08-31 06:39:46 +00:00
sunny
028c933bb8 We check whether the AUTOINC sub-system has been initialized (first) by
holding the AUTOINC mutex and if initialization is required then we
initialize using our normal procedure. This change is related to Bug#27950.
2007-08-23 03:40:42 +00:00
sunny
d1d15b3e1e Add a table level counter that tracks the number of AUTOINC locks that are
pending and/or granted on a table. We peek at this value to determine whether
a transaction doing a simple INSERT in innodb_autoinc_lock_mode = 1, needs to
acquire the AUTOINC lock or not. This change is related to Bug# 16979.
2007-08-23 03:37:37 +00:00
marko
4ca60264a7 Remove some code from ha_innodb.cc that was already enclosed in #if 0.
The code was related to replication and group commit, and it was
unreachable already as of MySQL 5.0.

Approved by Heikki
2007-08-22 11:36:55 +00:00
sunny
2a9014d545 Add variable "innodb_autoinc_lock_mode" to control the behavior of the
AUTOINC locking. There are three modes, 0 for backward compatibility, 1 for the
new style locking (default, safe for statement-based replication) and
2 for no AUTOINC locking (unsafe for statement-based replication).
2007-08-20 21:48:16 +00:00
marko
487677d01b Merge r1264 from branches/zip: Avoid memory fragmentation when
adding column definitions to tables.

dict_mem_table_add_col(): Add the parameter "heap" for temporary memory
allocation.  Allow it and "name" to be NULL.  These parameters are NULL
when creating dummy indexes.

dict_add_col_name(): Remove calls to ut_malloc() and ut_free().

dict_table_get_col_name(): Allow table->col_names to be NULL.

dict_table_add_system_columns(), dict_table_add_to_cache():
Add the parameter "heap".
---
Additional changes that had to be merged from branches/zip:

dict_table_add_system_columns(): New function, factored out from
dict_table_add_to_cache().

mlog_parse_index(): Add some consistency checks, and make use of
dict_table_add_system_columns().
2007-08-15 12:41:46 +00:00
marko
f3a8c1a641 Replace mysql_byte with uchar and remove the #define mysql_byte from
ha_innodb.cc.  This cleanup was made possible as of r1550:

Merge changes from MySQL AB:

ChangeSet@2007-05-10 12:59:39+03:00, monty@mysql.com 
  WL#3817: Simplify string / memory area types and make things more consistent
  (first part)
  
  The following type conversions was done:
  
  - Changed byte to uchar
...
2007-08-15 12:29:46 +00:00
marko
1646ac7555 check_trx_exists(): Remove a redundant function call and assignment that
was added by someone at MySQL.
2007-07-31 18:46:55 +00:00
marko
645f111017 Merge a change from MySQL AB:
ChangeSet@1.1810.3176.1  2007-07-20 14:17:15+03:00  gkodinov@magare.gmz

Bug #29644: alter table hangs if records locked in share mode 
by long running transaction

On Windows opened files can't be deleted. There was a special
upgraded lock mode (TL_WRITE instead of TL_WRITE_ALLOW_READ) 
in ALTER TABLE to make sure nobody has the table opened
when deleting the old table in ALTER TABLE. This special mode
was causing ALTER TABLE to hang waiting on a lock inside InnoDB.
This special lock is no longer necessary as the server is 
closing the tables it needs to delete in ALTER TABLE.
Fixed by removing the special lock.
Note that this also reverses the fix for bug 17264 that deals with
another consequence of this special lock mode being used.

ha_innodb.cc@1.202.46.1  2007-07-20 14:17:14+03:00  gkodinov@magare.gmz

Bug #29644: reverse the (now excessive) fix
for bug 17264 (but leave the test case).
2007-07-31 06:45:39 +00:00
marko
e4d8de77af Merge changes from MySQL AB, as of the following changeset:
ChangeSet@1.2567, 2007-07-27 14:44:31+05:00, svoj@june.mysql.com +3 -0
  Merge mysql.com:/home/svoj/devel/mysql/BUG29957/mysql-5.0-engines
  into  mysql.com:/home/svoj/devel/mysql/BUG29957/mysql-5.1-engines
  MERGE: 1.1810.2871.44

One test case in innodb.test fails because of auto-increment
changes in r1562:1653:

$diff innodb.result innodb.reject
504c504
< 3	test2		this will work
---
> 4	test2		this will work
2007-07-31 05:56:17 +00:00
sunny
08a1857151 Fix for bug# 16979, this is a major change in InnoDB auto-inc handling. There
is one test that fails as of this commit. The updated test case should be
part of the snapshot from MySQL shortly.

Fix for bug# 27950 - Init AUTOINC from delete_row().

Fix for bug# 28781 - Use value specified by MySQL, in update_row().

Summary of structural changes:
==============================
InnoDB needs to hold a table level lock for AUTOINC allocations to overcome
the non-determinism inherent in MySQL SBR for INSERT ... SELECT. In this fix 
for simple INSERT statements (including multi-value inserts), we try and avoid
acquiring the special AUTOINC table level lock unless another transaction has
already reserved the AUTOINC table level lock, in which case we fall back
to the old behavior of acquiring the AUTOINC table level lock.

The max AUTOINC value is now read directly using the low level interface
of InnoDB.
2007-07-24 01:42:16 +00:00
vasil
88662a2da4 Fix Bug#29097 "fsp_get_available_space_in_free_extents() is capped at 4TB"
by typecasting the variables before multiplying them, so that the result of
the multiplication is of type "unsigned long long".

I verified this fix by creating a sparse file of 6TB and forcing InnoDB to
use it without overwriting it with zeroes (by commenting the code that
overwrites :newraw files).

New type ullint is introduced with the sole purpose of shortening
"unsigned long long", please do not define it to something else than
"unsigned long long".

Approved by:	Heikki
2007-06-26 13:08:11 +00:00
marko
db26a7e13f innodb_check_for_record_too_big_error(): Divide the return value of
page_get_free_space_of_empty_noninline() by 2.  Until r1571, that function
did not return the same value as page_get_free_space_of_empty().
2007-06-13 10:18:12 +00:00
marko
a3a3d6cda4 create_table_def(): Eliminate the inline function call to dict_table_is_comp()
that was introduced in r1571.  Inlining is disabled in ha_innodb.cc.
2007-06-13 09:02:58 +00:00
marko
640246e6a0 Fix a severe bug that was introduced in r1422 when fixing Bug #21101.
When creating an index containing a too long record, InnoDB would
dereference a NULL pointer when trying to determine the maximum row length.

innodb_check_for_record_too_big_error(): Replace the dict_table_t*
parameter with a Boolean flag.  There is not always a dict_table_t object
when this function is called.

page_get_free_space_of_empty_noninline(): Move the definition and
declaration from row0mysql (!) to page0page.  Make the signature
identical with page_get_free_space_of_empty().

create_clustered_index_when_no_primary(): Add the parameter "comp".
Remove unnecessary casts.
2007-06-12 09:51:03 +00:00
marko
a837a4df1e ha_innobase::innobase_read_and_init_auto_inc(): Remember and restore
prebuilt->sql_stat_start.  In an ALTER TABLE statement in the innodb_gis
test, an ut_ad() assertion failed, because no IX lock had been acquired
on the table, because prebuilt->sql_stat_start was inadvertently reset
to FALSE, by this function.  This function was called via
ha_innobase::info() and mysql_prepare_alter_table().
2007-06-04 12:25:32 +00:00
marko
935ac4c285 Merge changes from MySQL AB:
ChangeSet@2007-05-10 12:59:39+03:00, monty@mysql.com 
  WL#3817: Simplify string / memory area types and make things more consistent
  (first part)
  
  The following type conversions was done:
  
  - Changed byte to uchar
  - Changed gptr to uchar*
  - Change my_string to char *
  - Change my_size_t to size_t
  - Change size_s to size_t
  
  Removed declaration of byte, gptr, my_string, my_size_t and size_s. 
[...]
ha_innodb.cc:
  Removed some old types
  Updated hash-get-key function arguments
  Added missing casts for alloc() and printf()
  Removed some not needed casts

ha_innodb.h:
  Removed some old types
2007-06-04 08:45:27 +00:00
inaam
3b74dd4a61 Do not return error in ha_innobase::info if srv_force_recovery >= 4. This is to allow for
normal processing of the query by MySQL instead of generating an error.

Reviewed by: Heikki
2007-05-29 13:16:47 +00:00
marko
aa2ef7454a Cleanup in ha_innodb.cc:
thd_is_replication_slave_thread(), thd_has_edited_nontrans_tables():
Remove blank line between the function comment and the function
definition.  There should be exactly one line between the return
type and the function comment, and this line should be one of
'', 'static', 'UNIV_INLINE', and 'extern "C"'.
2007-05-28 11:07:03 +00:00
vasil
c10dd8440a Split ut_a(a && b [&& c...]); into separate ut_a(a); ut_a(b); [ut_a(c); ...].
This makes it possible to see which expression was false by looking at the
error message.

Approved by:	Marko
2007-05-21 13:43:36 +00:00
vasil
6f3ea31c69 Fix Bug#21293: Consider transactions that had edited non-transactional
tables heavier than ones that had not. This helps killing the "right"
transaction in case of a deadlock.

Approved by:	Heikki
2007-05-15 14:53:04 +00:00
marko
a3208f4239 ha_innobase::extra(): Replace references to prebuilt->trx with
thd_to_trx(ha_thd()), in order to avoid potential memory corruption.
2007-05-14 11:25:41 +00:00
marko
a8c23d1423 Introduce the function reset_template() for resetting some fields of
row_prebuilt_t; currently prebuilt->read_just_key and
prebuilt->keep_other_fields_on_keyread.
2007-05-14 11:08:44 +00:00
marko
7b191edf34 ha_innodb.cc: Remove the declarations of some global InnoDB variables
whose name starts with srv_.  These variables are declared in the header
files that are covered by #include directives in ha_innodb.cc.
2007-05-14 07:12:31 +00:00
vasil
6f64bbe8e1 Convert innobase_buffer_pool_size and innobase_log_file_size types from
longlong to long long because MYSQL_SYSVAR_LONGLONG marco expects long long
type.

Also change
((ulint)innobase_buffer_pool_size) / 1024
to
(ulint)(innobase_buffer_pool_size / 1024)
and remove comment which is no longer true.

Provided that innobase_buffer_pool_size is always 64bits these statements
are equivalent if ulint is 64 bit (well it will screw up if
innobase_buffer_pool_size is negative). And if ulint is 32 bit the later
variant gives a little more chance that the value will fit.

Approved by:	Heikki
2007-05-11 15:38:34 +00:00
marko
9347e855c1 thd_to_trx(), check_trx_exists(): Remove the handlerton parameter. It is a
singleton object whose address is stored into innodb_hton_ptr.
2007-05-10 12:09:03 +00:00
marko
82b81a2987 Make InnoDB pluggable. That is, merge the modifications from MySQL WL#2936
and adapt some things.

Note that ha_innodb.cc depends on mysql_tmpfile() being declared in
<mysql/plugin.h>.  Until the function is declared there, you can
uncomment the buggy definition of mysql_tmpfile in ha_innodb.cc.

Remove storage/innobase/*/Makefile.am.  The whole compilation is driven by
storage/innobase/Makefile.am and storage/innobase/plug.in.

plug.in: Declare InnoDB as a dynamic plugin.

ha_innodb.h: Remove the declarations of many global variables.  The variables
are no longer directly referenced outside of storage/innobase.

trx_t: Add the field trx->duplicates.

trx_create(): Initialize the fields trx->active_trans and trx->duplicates.

innobase_query_is_update(): Remove.  Consult trx->duplicates instead.
2007-05-10 11:31:36 +00:00