Commit graph

220 commits

Author SHA1 Message Date
sunny
6059793abd branches/5.1: Bug#43203: Overflow from auto incrementing causes server segv
It was not a SIGSEGV but an assertion failure. The assertion was checking
the invariant that *first_value passed in by MySQL doesn't contain a value
that is greater than the max value for that type. The assertion has been
changed to a check and if the value is greater than the max we report a
generic AUTOINC failure.

rb://93
Approved by Heikki
2009-03-02 00:28:52 +00:00
sunny
5ead65d215 branches/5.1: Fix Bug#42714 AUTO_INCREMENT errors in 5.1.31. There are two
changes to the autoinc handling.

1. To fix the immediate problem from the bug report, we must ensure that the
   value written to the table is always less than the max value stored in
   dict_table_t.

2. The second related change is that according to MySQL documentation when
   the offset is greater than the increment, we should ignore the offset.
2009-02-25 03:32:01 +00:00
calvin
21da752944 branches/5.1: minor non-functional changes. 2009-02-11 23:34:27 +00:00
sunny
d4a1552773 branches/5.1: Add the ULL suffix otherwise there is an overflow. 2009-02-03 20:06:52 +00:00
sunny
5a4789be8d branches/5.1: In the last round of AUTOINC cleanup we assumed that AUTOINC
is only defined for integer columns. This caused an assertion failure when
we checked for the maximum value of a column type. We now calculate the
max value for floating-point autoinc columns too.

Fix Bug#42400 - InnoDB autoinc code can't handle floating-point columns
rb://84 and Mantis issue://162
2009-01-29 14:01:36 +00:00
vasil
de14b0d1ee branches/5.1:
Merge a change from MySQL:

  ------------------------------------------------------------
  revno: 2646.161.4
  committer: Tatiana A. Nurnberg <azundris@mysql.com>
  branch nick: 51-31177v2
  timestamp: Mon 2009-01-12 06:32:49 +0100
  message:
    Bug#31177: Server variables can't be set to their current values
    
    Bounds-checks and blocksize corrections were applied to user-input,
    but constants in the server were trusted implicitly. If these values
    did not actually meet the requirements, the user could not set change
    a variable, then set it back to the (wonky) factory default or maximum
    by explicitly specifying it (SET <var>=<value> vs SET <var>=DEFAULT).
    
    Now checks also apply to the server's presets. Wonky values and maxima
    get corrected at startup. Consequently all non-offsetted values the user
    sees are valid, and users can set the variable to that exact value if
    they so desire.
2009-01-26 15:26:25 +00:00
marko
85d7d1609a branches/5.1: Make
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED
a true replacement of SET GLOBAL INNODB_LOCKS_UNSAFE_FOR_BINLOG=1.
This fixes an error that was introduced in r370, causing
semi-consistent read not to not unlock rows in READ COMMITTED mode.
(Bug #41671, Issue #146)

rb://67 approved by Heikki Tuuri
2008-12-22 14:05:19 +00:00
marko
7399eef281 branches/5.1: When converting a record to MySQL format, copy the default
column values for columns that are SQL NULL.  This addresses failures in
row-based replication (Bug #39648).

row_prebuilt_t: Add default_rec, for the default values of the columns in
MySQL format.

row_sel_store_mysql_rec(): Use prebuilt->default_rec instead of
padding columns.

rb://64 approved by Heikki Tuuri
2008-12-18 13:33:36 +00:00
inaam
ac4d073d1e branches/5.1:
Fix Bug#40760 "set global innodb_thread_concurrency = 0;" is not safe

The config param innodb_thread_concurrency is dynamically set and is
read when a thread enters/exits innodb. If the value is changed between
the enter and exit time the behaviour becomes erratic.
The fix is not to use srv_thread_concurrency when exiting, instead use
the flag trx->declared_to_be_inside_innodb.

rb://57

Approved by: Marko
2008-11-24 20:06:50 +00:00
calvin
94ae352302 branches/5.1: fix bug#40386: Not flushing query cache after truncate
ha_statistics.records can not be 0 unless the table is empty, set to
1 instead. The original problem of bug#29507 is fixed in the server.

Additional test was done with the fix of bug#29507 in the server.

Approved by: Heikki (on IM)
2008-11-14 18:31:48 +00:00
vasil
18161a9819 branches/5.1:
Fix Bug#38189 innodb_stats_on_metadata missing

Make the variable innodb_stats_on_metadata visible to the users and
also settable at runtime. Previously it was only "visible" as a command
line startup option to mysqld.

Approved by:	Marko (https://svn.innodb.com/rb/r/36)
2008-10-28 10:10:25 +00:00
sunny
190953d4b5 branches/5.1: Backport changes from branches/zip r2725
Simplify the autoinc initialization code. This removes the
non-determinism related to reading the table's autoinc value for the first
time. This change has also reduced the sizeof dict_table_t by sizeof(ibool)
bytes because we don't need the dict_table_t::autoinc_inited field anymore.

Bug#39830 Table autoinc value not updated on first insert.
Bug#35498 Cannot get table test/table1 auto-inccounter value in ::info
Bug#36411 Failed to read auto-increment value from storage engine" in 5.1.24 auto-inc
rb://16
2008-10-23 04:30:32 +00:00
sunny
1f9f5bfaa7 branches/5.1: Backport r2724 from branches/zip
Check column value against the col max value before updating the table's
global autoinc counter value. This is part of simplifying the AUTOINC
sub-system. We extract the type info from MySQL data structures at runtime.

This fixes Bug#37788 InnoDB Plugin: AUTO_INCREMENT wrong for compressed tables
2008-10-22 21:42:24 +00:00
sunny
165ca17fac branches/5.1: Return the actual error code encountered when allocating
a new autoinc value. The change in behavior (bug) was introduced in 5.1.22
when we introduced the new AUTOINC locking model.

rb://31

Bug#40224 New AUTOINC changes mask reporting of deadlock/timeout errors
2008-10-22 08:01:18 +00:00
vasil
097eadc6d5 branches/5.1:
In ha_innobase::info():

Replace sql_print_warning() which prints to mysqld error log with
push_warning_printf() which sends the error message to the client.

Suggested by:	Marko, Sunny, Michael
Objected by:	Inaam
2008-10-21 06:08:30 +00:00
vasil
2c754dd6f7 branches/5.1:
Non-functional change: use a single tab instead of 12 spaces between
variable type and variable name.
2008-10-20 10:09:01 +00:00
marko
fe7d8b5a9a branches/5.1: ha_innobase::delete_all_rows(): In response to a user asking
<http://forums.innodb.com/read.php?4,215,215> why DELETE FROM t is not
mapped to TRUNCATE TABLE t as it is in MyISAM, note in a comment that
DELETE is transactional while TRUNCATE is not.
2008-10-09 06:53:09 +00:00
sunny
37a0550e46 branches/5.1: This bug has always existed but was masked by other errors. The
fix for bug# 38839 triggered this bug. When the offset and increment are > 1
we need to calculate the next value taking into consideration the two
variables. Previously we simply assumed they were 1 particularly offset was
never used. MySQL does its own calculation and that's probably why it seemed
to work in the past. We would return what we thought was the correct next
value and then MySQL would recalculate the actual value from that and return
it to the caller (e.g., handler::write_row()). Several new tests have been
added that try and catch some edge cases. The tests exposed a wrap around
error in MySQL next value calculation which was filed as bug#39828. The tests
will need to be updated once MySQL fix that bug.

One good side effect of this fix is that dict_table_t size has been
reduced by 8 bytes because we have moved the autoinc_increment field to
the row_prebuilt_t structure. See review-board for a detailed discussion.

rb://3
2008-10-03 22:48:04 +00:00
sunny
bce802076f branches/5.1: We need to send the messages to the client because
handler::get_auto_increment() doesn't allow a way to return the
specific error for why it failed.

rb://18
2008-10-03 22:08:23 +00:00
vasil
f3d2c882f3 branches/5.1:
Print a warning if an attempt is made to get the free space for a table
whose .ibd file is missing or the tablespace has been discarded. This is a
followup to r2719.

Suggested by:	Inaam
2008-10-03 15:52:39 +00:00
vasil
5cb733a347 branches/5.1:
Fix Bug#39438 Testcase for Bug#39436 crashes on 5.1 in fil_space_get_latch

In ha_innobase::info() - do not try to get the free space for a tablespace
which has been discarded with ALTER TABLE ... DISCARD TABLESPACE or if the
.ibd file is missing for some other reason.

ibd_file_missing and tablespace_discarded are manipulated only in
row_discard_tablespace_for_mysql() and in row_import_tablespace_for_mysql()
and the manipulation is protected/surrounded by
row_mysql_lock_data_dictionary()/row_mysql_unlock_data_dictionary() thus we
do the same in ha_innobase::info() when checking the values of those members
to avoid race conditions. I have tested the code-path with UNIV_DEBUG and
UNIV_SYNC_DEBUG.

Looks like it is not possible to avoid mysqld printing warnings in the
mysql-test case and thus this test innodb_bug39438 must be added to the
list of exceptional test cases that are allowed to print warnings. For this,
the following patch must be applied to the mysql source tree:

  --- cut ---
  === modified file 'mysql-test/lib/mtr_report.pl'
  --- mysql-test/lib/mtr_report.pl	2008-08-12 10:26:23 +0000
  +++ mysql-test/lib/mtr_report.pl	2008-10-01 11:57:41 +0000
  @@ -412,7 +412,10 @@
   
                   # When trying to set lower_case_table_names = 2
                   # on a case sensitive file system. Bug#37402.
  -                /lower_case_table_names was set to 2, even though your the file system '.*' is case sensitive.  Now setting lower_case_table_names to 0 to avoid future problems./
  +                /lower_case_table_names was set to 2, even though your the file system '.*' is case sensitive.  Now setting lower_case_table_names to 0 to avoid future problems./ or
  +
  +                # this test is expected to print warnings
  +                ($testname eq 'main.innodb_bug39438')
   		)
               {
                 next;                       # Skip these lines
  
  --- cut ---

The mysql-test is currently somewhat disabled (see inside
innodb_bug39438.test), after the above patch has been applied to the mysql
source tree, the test can be enabled.

rb://20

Reviewed by:	Inaam, Calvin
Approved by:	Heikki
2008-10-03 14:17:28 +00:00
sunny
a1631518a6 branches/5.1: Since handler::get_auto_increment() doesn't allow us
to return the cause of failure we have to inform MySQL using the
sql_print_warning() function to return the cause for autoinc failure.
Previously we simply printed the error code, this patch prints the
text string representing the following two error codes:

DB_LOCK_WAIT_TIMEOUT
DB_DEADLOCK.

Bug#35498 Cannot get table test/table1 auto-inccounter value in ::info

Approved by Marko.
2008-09-30 07:41:56 +00:00
inaam
0e56d69666 branches/5.1 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
2008-09-16 15:11:26 +00:00
sunny
0399560ad4 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
2008-08-23 21:19:05 +00:00
marko
52be21866f 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.
2008-08-21 12:25:05 +00:00
vasil
dd439ba618 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
2008-07-25 13:24:23 +00:00
sunny
1c20025ea8 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
2008-06-26 12:55:43 +00:00
sunny
033fffe685 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.
2008-05-28 08:18:35 +00:00
calvin
1d628f1200 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
2008-05-19 21:37:14 +00:00
vasil
bb95926939 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
2008-05-19 13:59:42 +00:00
vasil
486772f8e9 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
2008-04-30 15:04:36 +00:00
calvin
3ce609c736 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().
2008-04-24 11:32:30 +00:00
calvin
ffce3a3a5e 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.
2008-04-24 11:25:30 +00:00
vasil
14b6a9631a 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
2008-04-23 15:08:06 +00:00
marko
94b5f4dc1b branches/5.1: ha_innobase::check_if_incompatible_data(): Check
HA_CREATE_USED_ROW_FORMAT before comparing row_type.  Previously,
the comparison was incorrectly guarded by the presence of an
AUTO_INCREMENT attribute.
2008-03-17 08:23:03 +00:00
vasil
b7986bd8ca branches/5.1:
Merge changes from MySQL AB.
2008-03-11 16:50:50 +00:00
sunny
b657301e96 branches/5.1: Change the InnoDB autoinc type to ulint64. For this added a
new typedef to univ.i (ib_ulonglong). Added checks for overflow and removed
the assertion where it crashed previously, since the type has now changed
to unsigned, it doesn't make sense to check for < 0. Added new tests, to
check for overflow, for the different INT types supported for both
signed and unsigned.

Fixes Bug# 34335
2008-03-05 20:23:39 +00:00
sunny
1e130ba621 branches/5.1: Fix Bug# 34920. We need to use/inherit the passed in autoinc
counter for ALTER TABLE statements too.
2008-03-03 22:50:15 +00:00
vasil
613bcee7ca branches/5.1:
Fix Bug#34053:
* In CREATE TABLE and DROP TABLE check whether the table in question is one
  of the magic innodb_monitor tables and whether the user has enough rights
  to mess with it before doing anything else.
* Implement a mysql-test testcase.

Approved by:	Heikki
2008-02-07 12:02:06 +00:00
vasil
4a71a09282 branches/5.1:
Rename the user visible parameter innodb-use-adaptive-hash-indexes to
innodb-adaptive-hash-index so that it is in sync with MySQL 5.0.

Suggested by:	Heikki
Approved by:	Heikki
2008-02-05 13:29:30 +00:00
vasil
81db7e57d2 branches/5.1:
Fix formatting of the autoinc-lock-mode command line parameter.

Old view (./mysqld --help --verbose):

  --innodb-autoinc-lock-mode=#
                      The AUTOINC lock modes supported by InnoDB:
  0 => Old
                      style AUTOINC locking (for backward compatibility)
  1 =>
                      New style AUTOINC locking
  2 => No AUTOINC locking
                      (unsafe for SBR)

New view:

  --innodb-autoinc-lock-mode=#
                      The AUTOINC lock modes supported by InnoDB:
                      0 => Old style AUTOINC locking (for backward
                      compatibility)
                      1 => New style AUTOINC locking
                      2 => No AUTOINC locking (unsafe for SBR)

Looks like these strings are "automatically" wrapped by MySQL in the
following way:
* newlines (\n) in the string are ignored
* newline separator (\n) is inserted every 57 or so characters.
* lots of white space is appended to each inserted new line.

Approved by:	Heikki
2008-01-16 13:50:51 +00:00
inaam
3fdcdee8fe branches/5.1: bug#33349
Introduce retry/sleep logic as a workaround for a transient bug
where ::open fails for partitioned tables randomly if we are using
one file per table.


Reviewed by: Heikki
2008-01-15 03:22:37 +00:00
vasil
2cc5d98c6f branches/5.1:
Merge r2177 from trunk/:

Fix Bug#29157 "UPDATE, changed rows incorrect":

Return HA_ERR_RECORD_IS_THE_SAME from ha_innobase::update_row() if no
columns were updated.
2007-12-13 14:05:51 +00:00
vasil
203168fee2 branches/5.1:
Merge r2166:2168 from trunk/:

Bug#32440:

Put information about the free space in a tablespace in
INFORMATION_SCHEMA.TABLES.DATA_FREE. This information was previously
available in INFORMATION_SCHEMA.TABLES.TABLE_COMMENT, but MySQL has
removed it from there recently.

The stored value is in kilobytes.

This can be considered as a permanent workaround to
http://bugs.mysql.com/32440. "Workaround" becasue that bug is about the
data missing from TABLE_COMMENT and this is actually not solved.
2007-12-11 14:12:10 +00:00
marko
2883a914f3 convert_error_code_to_mysql(): Do not call thd_mark_transaction_to_rollback()
when thd is NULL.
2007-11-30 12:20:56 +00:00
marko
da72864792 Revert the changes that were reverted in r2144 to get a source tree that
is an exact match of a MySQL BitKeeper tree.

Apply r2116:
------------------------------------------------------------------------
r2116 | vasil | 2007-11-23 19:10:17 +0200 (pe, 23 marras 2007) | 6 lines

Set trx->mysql_query_str to NULL at transaction commit.
It could be a problem if someone looks at it after that because MySQL may
have free()d it then.

Approved by:    Heikki (via IM)
------------------------------------------------------------------------

innodb.test, innodb.result:
Add some tests that were apparently accidentally removed in
ChangeSet@1.2598.2.6  2007-11-06 15:42:58-07:00  tsmith@hindu.god
Apply snapshot innodb-5.1-ss1989

ha_innodb.cc: Add a decorative comment.
2007-11-30 12:02:40 +00:00
marko
5f8a93a6e1 Make our 5.1 tree an exact copy of the MySQL source tree.
Revert r2116:
------------------------------------------------------------------------
r2116 | vasil | 2007-11-23 19:10:17 +0200 (pe, 23 marras 2007) | 6 lines

Set trx->mysql_query_str to NULL at transaction commit.
It could be a problem if someone looks at it after that because MySQL may
have free()d it then.

Approved by:    Heikki (via IM)
------------------------------------------------------------------------

innodb.test, innodb.result:
Remove some tests that were apparently accidentally removed in
ChangeSet@1.2598.2.6  2007-11-06 15:42:58-07:00  tsmith@hindu.god
Apply snapshot innodb-5.1-ss1989

ha_innodb.cc: Remove a decorative comment.

This tree should be an exact match of the following MySQL source tree:

bk://mysql.bkbits.net/mysql-5.1
ROOTKEY=3985cf0cwNRCED_XNSCA7RvkLPer2Q
TIPKEY=47447c7cTrSPx22mH8PXNmurrycaaw

bkf changes | head

ChangeSet@1.2634.1.2, 2007-11-21 19:42:50+01:00, df@pippilotta.erinye.com +1 -0
  Merge pippilotta.erinye.com:/shared/home/df/mysql/build/mysql-5.0-build
  into  pippilotta.erinye.com:/shared/home/df/mysql/build/mysql-5.1-build
  MERGE: 1.1810.3425.2

ChangeSet@1.1810.3425.2, 2007-11-21 19:41:13+01:00, df@pippilotta.erinye.com +1 -0
  add wrong warning to suppression file

ChangeSet@1.2634.1.1, 2007-11-21 19:33:27+01:00, df@pippilotta.erinye.com +1 -0
  Merge pippilotta.erinye.com:/shared/home/df/mysql/build/mysql-5.0-build
  into  pippilotta.erinye.com:/shared/home/df/mysql/build/mysql-5.1-build
  MERGE: 1.1810.3425.1

ChangeSet@1.1810.3425.1, 2007-11-21 18:11:08+01:00, df@pippilotta.erinye.com +1 -0
  ignore readline warnings

ChangeSet@1.2635, 2007-11-21 15:06:38+01:00, mleich@five.local.lan +6 -0
  Merge five.local.lan:/work/merge/mysql-5.0-build-30418
  into  five.local.lan:/work/merge/mysql-5.1-build-31610
  MERGE: 1.1810.3284.72
2007-11-30 11:45:26 +00:00
marko
5330e1515d ha_innobase::get_auto_increment(): Add a comment that was accidentally
removed in r2137, when merging a change from MySQL AB.
2007-11-30 11:41:22 +00:00
marko
d8f1f78e8d Merge a change from MySQL AB:
ChangeSet@1.2598.6.1  2007-11-07 12:59:22-07:00  tsmith@hindu.god

Cast away compiler warning on Windows.

ha_innodb.cc:

Cast away a compiler warning; some functions return ulong or ulint for
errors, and some use int.  Let's hope these all fit in an int.
2007-11-30 09:52:49 +00:00
marko
4cf68d69de Merge a change from MySQL AB:
ChangeSet@1.2528.116.44  2007-09-12 18:16:50-07:00  antony@xiphis.org

Changes for pushbuild test runs and VSC compile warnings

ha_innodb.cc:

resolve a VSC++ typecast compile warning.
2007-11-30 09:44:34 +00:00