summaryrefslogtreecommitdiffstats
path: root/mysql-test/suite/innodb/include/ibd_convert.pl
diff options
context:
space:
mode:
Diffstat (limited to 'mysql-test/suite/innodb/include/ibd_convert.pl')
-rw-r--r--mysql-test/suite/innodb/include/ibd_convert.pl45
1 files changed, 45 insertions, 0 deletions
diff --git a/mysql-test/suite/innodb/include/ibd_convert.pl b/mysql-test/suite/innodb/include/ibd_convert.pl
new file mode 100644
index 00000000..dfa29ee1
--- /dev/null
+++ b/mysql-test/suite/innodb/include/ibd_convert.pl
@@ -0,0 +1,45 @@
+# Convert tablespace flags to the format understood by MariaDB 10.1.0..10.1.20,
+# with the assumption that the flags were correct.
+
+sub convert_to_mariadb_101
+{
+ my ($file, $page_size) = @_;
+ open(FILE, "+<", $file) or die "Unable to open $file\n";
+ sysread(FILE, $_, $page_size)==$page_size||die "Unable to read $file\n";
+ sysseek(FILE, 0, 0)||die "Unable to seek $file\n";
+
+ # FIL_PAGE_DATA + FSP_SPACE_FLAGS = 38 + 16 = 54 bytes from the start
+ my($flags) = unpack "x[54]N", $_;
+ my $badflags = ($flags & 0x3f);
+ my $compression_level=3;
+ $badflags |= 1<<6|$compression_level<<7 if ($flags & 1 << 16);
+ $badflags |= ($flags & 15 << 6) << 7; # PAGE_SSIZE
+
+ if ($badflags != $flags)
+ {
+ warn "$file: changing $flags to $badflags\n";
+ substr ($_, 54, 4) = pack("N", $badflags);
+ # Compute and replace the innodb_checksum_algorithm=crc32 checksum
+ my $polynomial = 0x82f63b78; # CRC-32C
+ if ($page_size == 1024)
+ {
+ # ROW_FORMAT=COMPRESSED
+ substr($_,0,4)=pack("N",
+ mycrc32(substr($_, 4, 12), 0, $polynomial) ^
+ mycrc32(substr($_, 24, 2), 0, $polynomial) ^
+ mycrc32(substr($_, 34, $page_size - 34), 0,
+ $polynomial));
+ }
+ else
+ {
+ my $ck=pack("N",
+ mycrc32(substr($_, 4, 22), 0, $polynomial) ^
+ mycrc32(substr($_, 38, $page_size - 38 - 8), 0,
+ $polynomial));
+ substr($_, 0, 4) = $ck;
+ substr ($_, $page_size - 8, 4) = $ck;
+ }
+ syswrite(FILE, $_, $page_size)==$page_size||die "Unable to write $file\n";
+ }
+ close(FILE);
+}