mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 12:02:42 +01:00
95f8d9a2a4
This is the 5.5 version of the fix. The 5.1 version was too complicated to merge and was null merged. This is a regression from the fix for bug no 38999. A storage engine capable of reading only a subset of a table's columns updates corresponding bits in the read buffer to signal that it has read NULL values for the corresponding columns. It cannot, and should not, update any other bits. Bug no 38999 occurred because the implementation of UPDATE statements compare the NULL bits using memcmp, inadvertently comparing bits that were never requested from the storage engine. The regression was caused by the storage engine trying to alleviate the situation by writing to all NULL bits, even those that it had no knowledge of. This has devastating effects for the index merge algorithm, which relies on all NULL bits, except those explicitly requested, being left unchanged. The fix reverts the fix for bug no 38999 in both InnoDB and InnoDB plugin and changes the server's method of comparing records. For engines that always read entire rows, we proceed as usual. For engines capable of reading only select columns, the record buffers are now compared on a column by column basis. An assertion was also added so that non comparable buffers are never read. Some relevant copy-pasted code was also consolidated in a new function.
44 lines
1.8 KiB
C++
44 lines
1.8 KiB
C++
/* Copyright 2006-2008 MySQL AB, 2008-2009 Sun Microsystems, Inc.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; version 2 of the License.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
|
|
|
|
#ifndef SQL_UPDATE_INCLUDED
|
|
#define SQL_UPDATE_INCLUDED
|
|
|
|
#include "sql_class.h" /* enum_duplicates */
|
|
|
|
class Item;
|
|
struct TABLE_LIST;
|
|
class THD;
|
|
|
|
typedef class st_select_lex SELECT_LEX;
|
|
typedef class st_select_lex_unit SELECT_LEX_UNIT;
|
|
|
|
bool mysql_prepare_update(THD *thd, TABLE_LIST *table_list,
|
|
Item **conds, uint order_num, ORDER *order);
|
|
int mysql_update(THD *thd,TABLE_LIST *tables,List<Item> &fields,
|
|
List<Item> &values,COND *conds,
|
|
uint order_num, ORDER *order, ha_rows limit,
|
|
enum enum_duplicates handle_duplicates, bool ignore,
|
|
ha_rows *found_return, ha_rows *updated_return);
|
|
bool mysql_multi_update(THD *thd, TABLE_LIST *table_list,
|
|
List<Item> *fields, List<Item> *values,
|
|
COND *conds, ulonglong options,
|
|
enum enum_duplicates handle_duplicates, bool ignore,
|
|
SELECT_LEX_UNIT *unit, SELECT_LEX *select_lex,
|
|
multi_update **result);
|
|
bool records_are_comparable(const TABLE *table);
|
|
bool compare_records(const TABLE *table);
|
|
|
|
#endif /* SQL_UPDATE_INCLUDED */
|