• Michael Widenius's avatar
    Fix for Bug #37007 Maria: different checksum for MyISAM table depending on CHECKSUM=0|1 · d29e7f74
    Michael Widenius authored
    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
    d29e7f74
sql_table.cc 232 KB