Commit graph

60718 commits

Author SHA1 Message Date
Alexander Nozdrin
cb7078f57a Auto-merge from mysql-next-4284. 2010-02-15 15:04:05 +03:00
Alexander Nozdrin
fe8d83a1d9 After-merge fix. 2010-02-15 15:00:45 +03:00
Dmitry Lenev
be3e256d25 Fix for bug #51136 "Crash in pthread_rwlock_rdlock on
TEMPORARY + HANDLER + LOCK + SP".

Server crashed when one: 
1) Opened HANDLER or acquired global read lock
2) Then locked one or several temporary tables with
   LOCK TABLES statement (but no base tables).
3) Then issued any statement causing commit (explicit 
   or implicit).
4) Issued statement which should have closed HANDLER
   or released global read lock.
   
The problem was that when entering LOCK TABLES mode in the
scenario described above we incorrectly set transactional
MDL sentinel to zero. As result during commit all metadata 
locks were released (including lock for open HANDLER or
global metadata shared lock). Indeed, attempt to release
metadata lock for the second time which happened during
HANLDER CLOSE or during release of GLR caused crash.

This patch fixes problem by changing MDL_context's
set_trans_sentinel() method to set sentinel to correct 
value (it should point to the most recent ticket).

mysql-test/include/handler.inc:
  Added test for bug #51136 "Crash in pthread_rwlock_rdlock on 
  TEMPORARY + HANDLER + LOCK + SP".
mysql-test/r/flush.result:
  Updated test results (see flush.test).
mysql-test/r/handler_innodb.result:
  Updated test results (see include/handler.inc).
mysql-test/r/handler_myisam.result:
  Updated test results (see include/handler.inc).
mysql-test/t/flush.test:
  Added additional coverage for bug #51136 "Crash in
  pthread_rwlock_rdlock on TEMPORARY + HANDLER + LOCK +
  SP".
sql/mdl.h:
  When setting new value of transactional sentinel use 
  pointer to the most recent ticket instead of value 
  returned by MDL_context::mdl_savepoint(). 
  This allows to handle correctly situation when the new 
  value of sentinel should be the same as its current value 
  (MDL_context::mdl_savepoint() returns NULL in this case).
2010-02-15 14:23:36 +03:00
Alexander Nozdrin
a8ef1bafb1 Manual merge from mysql-next-mr.
Conflicts:
  - sql/log_event.cc
  - sql/sql_class.h
2010-02-15 14:16:49 +03:00
Dmitry Lenev
eb0f09712e Fix for bug #51134 "Crash in MDL_lock::destroy on a concurrent
DDL workload".

When a RENAME TABLE or LOCK TABLE ... WRITE statement which
mentioned the same table several times were aborted during 
the process of acquring metadata locks (due to deadlock 
which was discovered or because of KILL statement) server 
might have crashed.

When attempt to acquire all locks requested had failed we
went through the list of requests and released locks which
we have managed to acquire by that moment one by one. Since 
in the scenario described above list of requests contained 
duplicates this led to releasing the same ticket twice and 
a crash as result.

This patch solves the problem by employing different approach
to releasing locks in case of failure to acquire all locks
requested. 
Now we take a MDL savepoint before starting acquiring locks 
and simply rollback to it if things go bad.

mysql-test/r/lock_multi.result:
  Updated test results (see lock_multi.test).
mysql-test/t/lock_multi.test:
  Added test case for bug #51134 "Crash in MDL_lock::destroy
  on a concurrent DDL workload".
sql/mdl.cc:
  MDL_context::acquire_locks():
    When attempt to acquire all locks requested has failed do
    not go through the list of requests and release locks which
    we have managed to acquire one by one. 
    Since list of requests can contain duplicates such approach
    may lead to releasing the same ticket twice and a crash as
    result.
    Instead use the following approach - take a MDL savepoint
    before starting acquiring locks and simply rollback to it
    if things go bad.
2010-02-15 13:23:34 +03:00
Alexander Nozdrin
cd437325bb Empty merge from mysql-trunk. 2010-02-14 13:23:09 +03:00
Alexander Nozdrin
1b9f84bf01 Fix tree name. 2010-02-14 13:22:03 +03:00
Alexander Nozdrin
70cafe287e Null-merge (configure.in) from mysql-trunk. 2010-02-13 11:33:27 +03:00
unknown
c142ef4679 Raise version number after cloning 5.5.2-m2 2010-02-12 20:17:53 +01:00
Joerg Bruehe
f0db2e92ce Upmerge a merge changeset, whose contents was already here,
so this one doesn't have any contents change.
2010-02-12 17:51:26 +01:00
Joerg Bruehe
52e16367f4 Automerge from central "trunk-bugfixing". 2010-02-12 17:41:00 +01:00
Joerg Bruehe
896562d021 Null-upmerge a fix to the RPM spec file, this one was already correct. 2010-02-12 17:30:52 +01:00
Joerg Bruehe
c25ea41c5a Upmerge the RPM spec file correction: "release" was missing. 2010-02-12 17:26:22 +01:00
Joerg Bruehe
b7302312fe Correction: The "release" setting had got lost in the RPM spec file. 2010-02-12 17:23:22 +01:00
Joerg Bruehe
c81dc09fea Upmerge the spec file alignment from current 5.5 to the next milestone. 2010-02-12 16:31:18 +01:00
Joerg Bruehe
1c15c2b74a Upmerge the spec file alignment from 5.1 to 5.5,
no other functional changes.
2010-02-12 13:20:42 +01:00
Guilhem Bichot
822f669023 merge with latest next-mr-bugfixing 2010-02-12 13:08:45 +01:00
Alexander Nozdrin
18c613a48b Fix tree name. 2010-02-12 13:13:12 +03:00
Alexander Nozdrin
cbe90dd1fe Auto-merge from mysql-next-mr-bugfixing. 2010-02-12 12:59:12 +03:00
Evgeny Potemkin
86db818b9d Auto-merged fix for the bug#50539. 2010-02-12 12:41:15 +03:00
Evgeny Potemkin
3e0f70d2cc Bug#50539: Wrong result when loose index scan is used for an aggregate
function with distinct.
Loose index scan is used to find MIN/MAX values using appropriate index and
thus allow to avoid grouping. For each found row it updates non-aggregated
fields with values from row with found MIN/MAX value.
Without loose index scan non-aggregated fields are copied by end_send_group
function. With loose index scan there is no need in end_send_group and
end_send is used instead. Non-aggregated fields still need to be copied and
this was wrongly implemented in QUICK_GROUP_MIN_MAX_SELECT::get_next.
WL#3220 added a case when loose index scan can be used with end_send_group to
optimize calculation of aggregate functions with distinct. In this case
the row found by QUICK_GROUP_MIN_MAX_SELECT::get_next might belong to a next
group and copying it will produce wrong result.

Update of non-aggregated fields is moved to the end_send function from
QUICK_GROUP_MIN_MAX_SELECT::get_next.


mysql-test/r/group_min_max.result:
  Added a test case for the bug#50539.
mysql-test/t/group_min_max.test:
  Added a test case for the bug#50539.
sql/opt_range.cc:
  Bug#50539: Wrong result when loose index scan is used for an aggregate
  function with distinct.
  Update of non-aggregated fields is moved to the end_send function from
  QUICK_GROUP_MIN_MAX_SELECT::get_next.
sql/sql_select.cc:
  Bug#50539: Wrong result when loose index scan is used for an aggregate
  function with distinct.
  Update of non-aggregated fields is moved to the end_send function from
  QUICK_GROUP_MIN_MAX_SELECT::get_next.
2010-02-12 11:51:52 +03:00
Dmitry Lenev
d5a498abc6 Fix for bug #50908 "Assertion `handler_tables_hash.records == 0'
failed in enter_locked_tables_mode".

Server was aborted due to assertion failure when one tried to 
execute statement requiring prelocking (i.e. firing triggers
or using stored functions) while having open HANDLERs.

The problem was that THD::enter_locked_tables_mode() method
which was called at the beginning of execution of prelocked 
statement assumed there are no open HANDLERs. It had to do 
so because corresponding THD::leave_locked_tables_mode()
method was unable to properly restore MDL sentinel when
leaving LOCK TABLES/prelocked mode in the presence of open 
HANDLERs.

This patch solves this problem by changing the latter method
to properly restore MDL sentinel and thus removing need for 
this assumption. As a side-effect, it lifts unjustified
limitation by allowing to keep HANDLERs open when entering 
LOCK TABLES mode.

mysql-test/include/handler.inc:
  Adjusted tests after making LOCK TABLES not to close
  open HANDLERs. Added coverage for bug #50908
  "Assertion `handler_tables_hash.records == 0' failed
  in enter_locked_tables_mode".
mysql-test/r/handler_innodb.result:
  Updated test results (see include/handler.inc).
mysql-test/r/handler_myisam.result:
  Updated test results (see include/handler.inc).
sql/mysql_priv.h:
  Introduced mysql_ha_move_tickets_after_trans_sentinel()
  routine which allows to move tickets for metadata locks
  corresponding to open HANDLERs after transaction sentinel.
sql/sql_class.cc:
  Changed THD::leave_locked_tables_mode() to correctly restore 
  MDL sentinel value in the presence of open HANDLERs.
sql/sql_class.h:
  Removed assert from THD::enter_locked_tables_mode() as we
  no longer have to close HANDLERs when entering LOCK TABLES 
  or prelocked modes. Instead we keep them open and correctly
  restore MDL sentinel value after leaving them.
  Removal of assert also fixes problem from the bug report.
sql/sql_handler.cc:
  Introduced mysql_ha_move_tickets_after_trans_sentinel()
  routine which allows to move tickets for metadata locks
  corresponding to open HANDLERs after transaction sentinel.
sql/sql_parse.cc:
  We no longer have to close HANDLERs when entering LOCK TABLES 
  mode. Instead we keep them open and simply correctly restore 
  MDL sentinel value after leaving this mode.
2010-02-12 10:05:43 +03:00
unknown
645106d2b3 Bug #43913 rpl_cross_version can't pass on conflicts complainig clash with
--slave-load-tm
      
The MDL_SHARED lock was introduced for an object in 5.4, but the 'TABLE_LIST' 
object was not initialized with the MDL_SHARED lock when applying event with 
LOAD DATA INFILE into table. So the failure is caused when checking the 
MDL_SHARED lock for the object.
      
To fix the problem, the 'TABLE_LIST' object was initialized with the MDL_SHARED 
lock when applying event with LOAD DATA INFILE into table.
2010-02-12 12:12:43 +08:00
unknown
97afccae53 Bug #43913 rpl_cross_version can't pass on conflicts complainig clash with
--slave-load-tm
      
The MDL_SHARED lock was introduced for an object in 5.4, but the 'TABLE_LIST' 
object was not initialized with the MDL_SHARED lock when applying event with 
LOAD DATA INFILE into table. So the failure is caused when checking the 
MDL_SHARED lock for the object.
To fix the problem, the 'TABLE_LIST' object was initialized with the MDL_SHARED 
lock when applying event with LOAD DATA INFILE into table.


mysql-test/suite/rpl/t/disabled.def:
  Got rid of the line for enabling 'rpl_cross_version' test.
2010-02-12 12:04:57 +08:00
Joerg Bruehe
2813cd5899 Upmerge changes done to the generic spec file in 5.0 to 5.1,
this includes a major whitespace (formatting) alignment
and sequence changes to better agree with other spec files.

Further changes:
- All features are controlled by "%define" set from call
  options or builtin.
- "bundled zlib" is on by default.
- "with libgcc" is controlled by runtime detection of gcc.
- Handling of "CFLAGS" and "CXXFLAGS" is more concentrated.
- Several missing man pages were added.
2010-02-11 21:33:48 +01:00
Magne Mahre
4480e80312 merge from mysql-trunk-bugfixing 2010-02-11 18:32:53 +01:00
Magne Mahre
203793514d Bug#50574 5.5.x allows spatial indexes on non-spatial columns,
causing crashes!

Adding a SPATIAL INDEX on a non-geometrical column caused a
segmentation fault when the table was subsequently 
inserted into.
      
A test was added in mysql_prepare_create_table to explicitly
check whether non-geometrical columns are used in a
spatial index, and throw an error if so.


mysql-test/t/gis.test:
  Added test cases to verify that only geometrical
  columns can get a spatial index.
          
  In addition, verify that only a single geom.
  column can participate in a spatial index.
2010-02-11 18:25:34 +01:00
Magne Mahre
fe70c23742 merge 2010-02-11 18:04:32 +01:00
Magne Mahre
93cd02bc82 Bug#50542 5.5.x doesn't check length of key prefixes:
corruption and crash results
      
An index creation statement where the index key
is larger/wider than the column it references 
should throw an error.
      
A statement like:
  CREATE TABLE t1 (a CHAR(1), PRIMARY KEY (A(255)))
did not error, but a segmentation fault followed when
an insertion was attempted on the table
      
The partial key validiation clause has been 
restructured to (hopefully) better document which
uses of partial keys are valid.
2010-02-11 18:02:41 +01:00
Konstantin Osipov
e6cb88eb74 next-4284 tree:
fix lock_sync.test failure in row based replication mode.
2010-02-11 19:10:34 +03:00
Konstantin Osipov
c48c21eb05 Fix a sporadic failure of rpl_sp.test in next-4284 tree: when doing
SELECT * FROM t1 on slave, first make sure that the slave has received
the CREATE TABLE from the master.
2010-02-11 19:02:21 +03:00
Konstantin Osipov
6cf17332bb next-4284 tree: fix the failures of processlist_val_* tests,
update the condition to wait for in wait_condition
to reflect type-of-operation aware metadata locks.
2010-02-11 18:19:04 +03:00
Luis Soares
c4f1de9f11 Automerge from mysql-next-mr-bugfixing. 2010-02-11 13:50:18 +00:00
Jon Olav Hauglid
c9e4b1bb0c Followup to Bug#34604 handler::ha_rnd_end(): Assertion `inited==RND' failed.
The test case for this bug relies on getting a ER_LOCK_WAIT_TIMEOUT
error. However with the introduction of MDL, the test would hang
forever since the metadata locks would not timeout.

MDL timeouts are now introduced in the scope of Bug#45225. This
patch changes the testcase for Bug#34604 to set the new server
variable "lock_wait_timeout" to one second which makes the test
generate the necessary timeout again.
2010-02-11 12:59:12 +01:00
Jon Olav Hauglid
3d6a89e792 Bug #45225 Locking: hang if drop table with no timeout
This patch introduces timeouts for metadata locks. 

The timeout is specified in seconds using the new dynamic system 
variable  "lock_wait_timeout" which has both GLOBAL and SESSION
scopes. Allowed values range from 1 to 31536000 seconds (= 1 year). 
The default value is 1 year.

The new server parameter "lock-wait-timeout" can be used to set
the default value parameter upon server startup.

"lock_wait_timeout" applies to all statements that use metadata locks.
These include DML and DDL operations on tables, views, stored procedures
and stored functions. They also include LOCK TABLES, FLUSH TABLES WITH
READ LOCK and HANDLER statements.

The patch also changes thr_lock.c code (table data locks used by MyISAM
and other simplistic engines) to use the same system variable.
InnoDB row locks are unaffected.

One exception to the handling of the "lock_wait_timeout" variable
is delayed inserts. All delayed inserts are executed with a timeout
of 1 year regardless of the setting for the global variable. As the
connection issuing the delayed insert gets no notification of 
delayed insert timeouts, we want to avoid unnecessary timeouts.

It's important to note that the timeout value is used for each lock
acquired and that one statement can take more than one lock.
A statement can therefore block for longer than the lock_wait_timeout 
value before reporting a timeout error. When lock timeout occurs, 
ER_LOCK_WAIT_TIMEOUT is reported.

Test case added to lock_multi.test.


include/my_pthread.h:
  Added macros for comparing two timespec structs.
include/thr_lock.h:
  Introduced timeouts for thr_lock.c locks.
mysql-test/r/mysqld--help-notwin.result:
  Updated result file with the new server variable.
mysql-test/r/mysqld--help-win.result:
  Updated result file with the new server variable.
mysql-test/suite/sys_vars/r/lock_wait_timeout_basic.result:
  Added basic test for the new server variable.
mysql-test/suite/sys_vars/t/lock_wait_timeout_basic.test:
  Added basic test for the new server variable.
mysys/thr_lock.c:
  Introduced timeouts for thr_lock.c locks.
sql/mdl.cc:
  Introduced timeouts for metadata locks.
sql/mdl.h:
  Introduced timeouts for metadata locks.
sql/sql_base.cc:
  Introduced timeouts in tdc_wait_for_old_versions().
sql/sql_class.h:
  Added new server variable lock_wait_timeout.
sql/sys_vars.cc:
  Added new server variable lock_wait_timeout.
2010-02-11 11:23:39 +01:00
Luis Soares
7ae4c06da7 Manual merge from mysql-next-mr bug branch.
Conflicts
=========
  Text conflict in sql/sql_base.cc
2010-02-10 22:27:23 +00:00
Luis Soares
87a589f83a BUG#51021: current_stmt_binlog_row_based not removed in next-mr
A closely related problem, hardly worth a new bug report:
Removed a spurious call to:  
  thd->set_current_stmt_binlog_format_row_if_mixed()
in sql_base.cc:lock_tables().
2010-02-10 21:57:07 +00:00
Alexander Nozdrin
d7f203c79f Update result file. 2010-02-10 19:31:34 +03:00
Luis Soares
563ba7db9b BUG#51021: current_stmt_binlog_row_based not removed in next-mr
Deployed DBUG_ASSERT before the conditional binlog format
restore.
2010-02-10 16:01:31 +00:00
Dmitry Lenev
96344befd3 Fix for bug #50998 "Deadlock in MDL code during test
rqg_mdl_stability".

When start of statement's waiting on a metadata lock 
created more than one loop in waiters graph server might 
have entered deadlock condition.

The problem was that in the case described above MDL deadlock 
detector had to perform several searches for deadlock but
forgot to reset Deadlock_detection_context before performing 
new search. 
Failure to do so has broken assumption in code resposible for 
choosing victim that if Deadlock_detection_context::victim
is set we also have read lock on m_waiting_for_lock for this
context. As result this lock could have been unlocked more
times than it was acquired which corrupted rwlock's state
which led to server deadlock.

This fix ensures that such reset is done before each attempt
to find a deadlock.

mysql-test/r/mdl_sync.result:
  Added test for bug #50998 "Deadlock in MDL code during test
  rqg_mdl_stability" as well as coverage for the case when
  addition of statement waiting for metadata lock adds several
  loops in the waiters graph and therefore several searches
  for deadlock should be performed by MDL deadlock detector.
mysql-test/t/mdl_sync.test:
  Added test for bug #50998 "Deadlock in MDL code during test
  rqg_mdl_stability" as well as coverage for the case when
  addition of statement waiting for metadata lock adds several
  loops in the waiters graph and therefore several searches
  for deadlock should be performed by MDL deadlock detector.
sql/mdl.cc:
  Ensure that in cases when MDL deadlock detector had to
  perform several searches for deadlock because several loops
  in waiters graph are possible we reset
  Deadlock_detection_context before performing each search.
  Failure to do so has broken assumption in code resposible
  for choosing victim that if Deadlock_detection_context::victim
  is set we also have read lock on m_waiting_for_lock for this
  context. As result this lock could have been unlocked more
  times than it was acquired which corrupted rwlock's state
  (no one was able to acquire write lock on it anymore).
2010-02-10 18:46:03 +03:00
Luis Soares
4eda0bf0b0 Automerge from mysql-trunk-bugfixing. 2010-02-10 12:16:49 +00:00
Luis Soares
5df69267c2 BUG#50984: check_testcase fails for rpl_tmp_table_and_DDL
We found that there are some tests that are not cleaning
up properly:
      
  1. rpl_tmp_table_and_DDL
  2. rpl_do_grant
  3. rpl_sync
      
For #1 and #2 we found that the slave would not, for some
cases, replicate all the instructions the master processed 
in the cleanup section. We fix these by deploying some 
synchronization commands in the test cases so that slave 
processes all clean up instructions.
      
As for #3, this is tracked as part of another bug 
(BUG@50442).
2010-02-10 12:12:55 +00:00
Mattias Jonsson
6cd0eebed8 merge 2010-02-10 11:08:39 +01:00
Mattias Jonsson
dca6700620 Bug#50201: Server crashes in explain_filename on an InnoDB partitioned table
Problem was that in mysql-trunk the ER() macro is now dependent on current_thd
and the innodb monitor thread has no binding to that thd object. This cause 
the crash because of bad derefencing.

Solution was to add a new macro which take the thd as an argument (which the innodb
thread uses for the call).

(Updated according to reviewers comments, i.e. added ER_THD_OR_DEFAULT and
moved test to suite parts.)

mysql-test/suite/parts/r/partition_innodb_status_file.result:
  Bug#50201: Server crashes in explain_filename on an InnoDB partitioned table
  
  New test result file
mysql-test/suite/parts/t/partition_innodb_status_file-master.opt:
  Bug#50201: Server crashes in explain_filename on an InnoDB partitioned table
  
  New test opt file
mysql-test/suite/parts/t/partition_innodb_status_file.test:
  Bug#50201: Server crashes in explain_filename on an InnoDB partitioned table
  
  New test.
  Note that the innodb monitor thread only runs every 15 seconds, so this
  test will take at least 15 seconds, so I have moved it to the parts suite.
sql/sql_table.cc:
  Bug#50201: Server crashes in explain_filename on an InnoDB partitioned table
  
  Using thd safe ER macro.
sql/unireg.h:
  Bug#50201: Server crashes in explain_filename on an InnoDB partitioned table
  
  Added ER macros for use with specified thd pointer.
2010-02-10 10:47:14 +01:00
Luis Soares
d142fca3bd Post-push fix: float/double to string conversions and vice versa
changed in mysql-next-mr (see: WL@2934). Thence, we need to 
update the result file for rpl_stm_user_variables test case.
2010-02-10 00:05:45 +00:00
Luis Soares
06df9b073d BUG#51021: current_stmt_binlog_row_based not removed in next-mr
As part of BUG@39934 fix, the public:
 - THD::current_stmt_binlog_row_based 
variable had been removed and replaced by a private variable:
 - THD::current_stmt_binlog_format. 

THD was refactored and some modifiers and accessors were
implemented for the new variable.

However, due to a bad merge, the
THD::current_stmt_binlog_row_based variable is back as a public
member of THD. This in itself is already potentially
harmful. What's even worse is that while merging some more
patches and resolving conflicts, the variable started being used
again, which is obviously wrong.

To fix this we:
  1. remove the extraneous variable from sql_class.h
  2. revert a bad merge for BUG#49132
  3. merge BUG#49132 properly again (actually, making use of the
     cset used to merge the original patch to mysql-pe).
2010-02-09 17:22:31 +00:00
Guilhem Bichot
7e75239694 merge with latest next-mr-bugfixing 2010-02-09 15:06:04 +01:00
Luis Soares
b581081697 Automerge from mysql-next-mr. 2010-02-09 12:30:05 +00:00
Luis Soares
349513d1e8 auto merge from mysql-5.1-rep+3. 2010-02-09 12:10:47 +00:00
Alexander Nozdrin
b0e2a9b2d5 Auto-merge (empty) from mysql-trunk-bugfixing. 2010-02-09 15:05:30 +03:00