mirror of
https://github.com/MariaDB/server.git
synced 2026-05-16 20:07:13 +02:00
Fix for Bug #37007 Maria: different checksum for MyISAM table depending on CHECKSUM=0|1
This also adds a check that MyISAM tables with incompatible checksums are detected by CHECK TABLE ... [FOR UPGRADE] and thus also by mysql_upgrade. The tables that are incomatible are MyISAM tables with ROW_FORMAT=fixed and has VARCHAR fields and have CHECKSUM enabled. Before these tables gave different checksum if you used CHECK TABLE with or without EXTENDED mysql-test/r/old-mode.result: Now we get same results with and without EXTENDED mysql-test/r/row-checksum-old.result: Initial results mysql-test/r/row-checksum.result: Initial results mysql-test/t/old-mode.test: Added test with QUICK to show that the live checksum is not used when running with --old mysql-test/t/row-checksum-old-master.opt: Start mysqld with --old mode to enable old checksum code mysql-test/t/row-checksum-old.test: Run row-checksum test under mysqld --old mysql-test/t/row-checksum.test: Verify that checksum are calculated the same way with and without EXTENDED We run this with several storage engines to ensure results are the same over storage engines sql/ha_partition.cc: Use new HA_HAS_xxx_CHECKSUM flags sql/handler.cc: Use new HA_HAS_xxx_CHECKSUM flags sql/handler.h: Split HA_HAS_CHECKSUM into HA_HAS_NEW_CHECKSUM and HA_HAS_OLD_CHECKSUM flags. This is a safe API change as only MyISAM and Maria should use these handler flags. sql/sql_show.cc: Use new HA_HAS_xxx_CHECKSUM flags sql/sql_table.cc: Use file->checksum() for live checksums if the life checksum method corresponds to the mysqld --old flag storage/maria/ha_maria.cc: Use new HA_HAS_xxx_CHECKSUM flags storage/myisam/ha_myisam.cc: Set HA_HAS_OLD_CHECKSUM and/or HA_HAS_NEW_CHECKSUM flags depending on if this is a new myisam or old myisam file Add method check_for_upgrade() to detect if the table is of old version with a checksum that is incompatible with CHECK TABLE ... EXTENDED storage/myisam/ha_myisam.h: Added check_for_upgrade() storage/myisam/mi_open.c: Removed not neede cast Initialize share->has_null_fields and share->has_varchar_fields variables storage/myisam/myisamdef.h: Added share->has_null_fields and share->has_varchar_fields
This commit is contained in:
parent
9f589947b8
commit
d29e7f7472
17 changed files with 306 additions and 13 deletions
|
|
@ -19,6 +19,7 @@
|
|||
#include "sp_defs.h"
|
||||
#include "rt_index.h"
|
||||
#include <m_ctype.h>
|
||||
#include <mysql_version.h>
|
||||
|
||||
#if defined(MSDOS) || defined(__WIN__)
|
||||
#ifdef __WIN__
|
||||
|
|
@ -453,13 +454,20 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
|
|||
share->rec[i].pack_type=0;
|
||||
share->rec[i].huff_tree=0;
|
||||
share->rec[i].offset=offset;
|
||||
if (share->rec[i].type == (int) FIELD_BLOB)
|
||||
if (share->rec[i].type == FIELD_BLOB)
|
||||
{
|
||||
share->blobs[j].pack_length=
|
||||
share->rec[i].length - portable_sizeof_char_ptr;
|
||||
share->blobs[j].offset=offset;
|
||||
j++;
|
||||
}
|
||||
#if MYSQL_VERSION_ID <= 60100
|
||||
/* This is to detect old checksum option */
|
||||
if (share->rec[i].null_bit)
|
||||
share->has_null_fields= 1;
|
||||
if (share->rec[i].type == FIELD_VARCHAR)
|
||||
share->has_varchar_fields= 1;
|
||||
#endif
|
||||
offset+=share->rec[i].length;
|
||||
}
|
||||
share->rec[i].type=(int) FIELD_LAST; /* End marker */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue