Commit 717c8fe9 authored by svoj@mysql.com/april.(none)'s avatar svoj@mysql.com/april.(none)
Browse files

BUG#15787 - MySQL crashes when archive table exceeds 2GB

Max compressed file size was calculated incorretly causing server
crash on INSERT.

With this patch we use proper max file size provided by zlib.

Affects 5.0 only.
parent 491e471f
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
CREATE TABLE t1(a BLOB) ENGINE=ARCHIVE;
INSERT INTO t1 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t1;
DROP TABLE t1;
+25 −0

File added.

Preview size limit exceeded, changes collapsed.

+2 −1
Original line number Diff line number Diff line
@@ -205,7 +205,7 @@ bool archive_db_init()
  else
  {
    zoffset_size= 2 << ((zlibCompileFlags() >> 6) & 3);
    switch (sizeof(z_off_t)) {
    switch (zoffset_size) {
    case 2:
      max_zfile_size= INT_MAX16;
      break;
@@ -676,6 +676,7 @@ int ha_archive::real_write_row(byte *buf, gzFile writer)
    total_row_length+= ((Field_blob*) table->field[*ptr])->get_length();
  if (share->approx_file_size > max_zfile_size - total_row_length)
  {
    gzflush(writer, Z_SYNC_FLUSH);
    info(HA_STATUS_TIME);
    share->approx_file_size= (ulong) data_file_length;
    if (share->approx_file_size > max_zfile_size - total_row_length)