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.
This commit is contained in:
svoj@mysql.com/april.(none) 2007-06-24 19:44:54 +05:00
parent 491e471fb3
commit 717c8fe98e
3 changed files with 46 additions and 1 deletions

View File

@ -0,0 +1,19 @@
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;

File diff suppressed because one or more lines are too long

View File

@ -205,7 +205,7 @@ bool archive_db_init()
else else
{ {
zoffset_size= 2 << ((zlibCompileFlags() >> 6) & 3); zoffset_size= 2 << ((zlibCompileFlags() >> 6) & 3);
switch (sizeof(z_off_t)) { switch (zoffset_size) {
case 2: case 2:
max_zfile_size= INT_MAX16; max_zfile_size= INT_MAX16;
break; 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(); total_row_length+= ((Field_blob*) table->field[*ptr])->get_length();
if (share->approx_file_size > max_zfile_size - total_row_length) if (share->approx_file_size > max_zfile_size - total_row_length)
{ {
gzflush(writer, Z_SYNC_FLUSH);
info(HA_STATUS_TIME); info(HA_STATUS_TIME);
share->approx_file_size= (ulong) data_file_length; share->approx_file_size= (ulong) data_file_length;
if (share->approx_file_size > max_zfile_size - total_row_length) if (share->approx_file_size > max_zfile_size - total_row_length)