diff options
-rw-r--r-- | include/my_sys.h | 2 | ||||
-rw-r--r-- | mysql-test/suite/archive/archive.result | 28 | ||||
-rw-r--r-- | mysql-test/suite/archive/archive.test | 17 | ||||
-rw-r--r-- | mysql-test/suite/archive/discover.result | 5 | ||||
-rw-r--r-- | mysql-test/suite/archive/discover.test | 2 | ||||
-rw-r--r-- | mysys/my_compress.c | 2 | ||||
-rw-r--r-- | sql/datadict.cc | 2 | ||||
-rw-r--r-- | sql/discover.cc | 4 | ||||
-rw-r--r-- | sql/discover.h | 8 | ||||
-rw-r--r-- | sql/handler.cc | 31 | ||||
-rw-r--r-- | sql/handler.h | 4 | ||||
-rw-r--r-- | sql/sql_base.cc | 2 | ||||
-rw-r--r-- | sql/sql_table.cc | 23 | ||||
-rw-r--r-- | sql/table.cc | 35 | ||||
-rw-r--r-- | sql/table.h | 3 | ||||
-rw-r--r-- | sql/unireg.cc | 63 | ||||
-rw-r--r-- | storage/archive/azio.c | 2 | ||||
-rw-r--r-- | storage/archive/azlib.h | 2 | ||||
-rw-r--r-- | storage/archive/ha_archive.cc | 22 | ||||
-rw-r--r-- | storage/archive/ha_archive.h | 2 |
20 files changed, 185 insertions, 74 deletions
diff --git a/include/my_sys.h b/include/my_sys.h index 40061a33636..f2d31405687 100644 --- a/include/my_sys.h +++ b/include/my_sys.h @@ -877,7 +877,7 @@ extern void *my_az_allocator(void *dummy, unsigned int items, unsigned int size) extern void my_az_free(void *dummy, void *address); extern int my_compress_buffer(uchar *dest, size_t *destLen, const uchar *source, size_t sourceLen); -extern int packfrm(uchar *, size_t, uchar **, size_t *); +extern int packfrm(const uchar *, size_t, uchar **, size_t *); extern int unpackfrm(uchar **, size_t *, const uchar *); extern ha_checksum my_checksum(ha_checksum crc, const uchar *mem, diff --git a/mysql-test/suite/archive/archive.result b/mysql-test/suite/archive/archive.result index 9208b987df0..23636021d2a 100644 --- a/mysql-test/suite/archive/archive.result +++ b/mysql-test/suite/archive/archive.result @@ -12816,7 +12816,35 @@ DROP TABLE t1; create table t1 (a int, b char(50)) engine=archive; select * from t1; a b +flush tables; +select * from t1; +a b 1 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa show warnings; Level Code Message drop table t1; +create temporary table t1 (a int) engine=archive; +insert t1 values (1),(2),(3); +select * from t1; +a +1 +2 +3 +show create table t1; +Table Create Table +t1 CREATE TEMPORARY TABLE `t1` ( + `a` int(11) DEFAULT NULL +) ENGINE=ARCHIVE DEFAULT CHARSET=latin1 +alter table t1 add column b varchar(10); +select * from t1; +a b +1 NULL +2 NULL +3 NULL +show create table t1; +Table Create Table +t1 CREATE TEMPORARY TABLE `t1` ( + `a` int(11) DEFAULT NULL, + `b` varchar(10) DEFAULT NULL +) ENGINE=ARCHIVE DEFAULT CHARSET=latin1 +drop table t1; diff --git a/mysql-test/suite/archive/archive.test b/mysql-test/suite/archive/archive.test index 01873de1e93..2acf8b9e6b5 100644 --- a/mysql-test/suite/archive/archive.test +++ b/mysql-test/suite/archive/archive.test @@ -1734,9 +1734,24 @@ DROP TABLE t1; --echo # BUG#917689 Using wrong archive table causes crash --echo # create table t1 (a int, b char(50)) engine=archive; +select * from t1; # open the table to create the frm +flush tables; # and close the table again --remove_file $MYSQLD_DATADIR/test/t1.ARZ copy_file std_data/t917689.ARZ $MYSQLD_DATADIR/test/t1.ARZ; -# --error 1194 +#--error ER_CRASHED_ON_USAGE select * from t1; show warnings; drop table t1; + +# +# temporary archive +# +create temporary table t1 (a int) engine=archive; +insert t1 values (1),(2),(3); +select * from t1; +show create table t1; +alter table t1 add column b varchar(10); +select * from t1; +show create table t1; +drop table t1; + diff --git a/mysql-test/suite/archive/discover.result b/mysql-test/suite/archive/discover.result index db8c3259f46..dc6d124d345 100644 --- a/mysql-test/suite/archive/discover.result +++ b/mysql-test/suite/archive/discover.result @@ -21,6 +21,8 @@ a # show tables # create table t2 (a int) engine=archive; +select * from t2; +a flush tables; show tables; Tables_in_test @@ -107,4 +109,7 @@ drop table t1; # archive_discover # create table `a/../`(a int) engine=archive; +select * from `a/../`; +a +flush tables; drop table `a/../`; diff --git a/mysql-test/suite/archive/discover.test b/mysql-test/suite/archive/discover.test index 6c1f563dfa8..8175511929f 100644 --- a/mysql-test/suite/archive/discover.test +++ b/mysql-test/suite/archive/discover.test @@ -18,6 +18,7 @@ select * from t1; --echo # show tables --echo # create table t2 (a int) engine=archive; +select * from t2; remove_file $mysqld_datadir/test/t1.frm; flush tables; show tables; @@ -84,6 +85,7 @@ drop table t1; --echo # archive_discover --echo # create table `a/../`(a int) engine=archive; +select * from `a/../`; flush tables; remove_file $mysqld_datadir/test/a@002f@002e@002e@002f.frm; drop table `a/../`; diff --git a/mysys/my_compress.c b/mysys/my_compress.c index ea56900db05..10c1903c163 100644 --- a/mysys/my_compress.c +++ b/mysys/my_compress.c @@ -234,7 +234,7 @@ my_bool my_uncompress(uchar *packet, size_t len, size_t *complen) >0 Failure */ -int packfrm(uchar *data, size_t len, +int packfrm(const uchar *data, size_t len, uchar **pack_data, size_t *pack_len) { int error; diff --git a/sql/datadict.cc b/sql/datadict.cc index 55ffd8eaee3..4bc74af7bdb 100644 --- a/sql/datadict.cc +++ b/sql/datadict.cc @@ -107,7 +107,7 @@ bool dd_recreate_table(THD *thd, const char *db, const char *table_name, } /* Attempt to reconstruct the table. */ - error= ha_create_table(thd, path, db, table_name, &create_info); + error= ha_create_table(thd, path, db, table_name, &create_info, NULL); DBUG_RETURN(error); } diff --git a/sql/discover.cc b/sql/discover.cc index a7681a3c2ba..a499e234a8f 100644 --- a/sql/discover.cc +++ b/sql/discover.cc @@ -45,7 +45,7 @@ 3 Could not allocate data for read. Could not read file */ -int readfrm(const char *name, uchar **frmdata, size_t *len) +int readfrm(const char *name, const uchar **frmdata, size_t *len) { int error; char index_file[FN_REFLEN]; @@ -134,7 +134,7 @@ int writefrm(const char *path, const char *db, const char *table, { error= mysql_file_write(file, frmdata, len, MYF(MY_WME | MY_NABP)); - if (!error && need_sync) + if (!error && need_sync && opt_sync_frm) error= mysql_file_sync(file, MYF(MY_WME)) || my_sync_dir_by_file(file_name, MYF(MY_WME)); diff --git a/sql/discover.h b/sql/discover.h index 28d35b73152..aad8bb734ec 100644 --- a/sql/discover.h +++ b/sql/discover.h @@ -18,14 +18,14 @@ #include "my_global.h" /* uchar */ -int readfrm(const char *name, uchar **data, size_t *length); -int writefrm(const char *path, const char *db, const char *table, - bool need_sync, const uchar *frmdata, size_t len); - int extension_based_table_discovery(MY_DIR *dirp, const char *ext, handlerton::discovered_list *tl); #ifdef MYSQL_SERVER +int readfrm(const char *name, const uchar **data, size_t *length); +int writefrm(const char *path, const char *db, const char *table, + bool need_sync, const uchar *frmdata, size_t len); + int ext_table_discovery_simple(MY_DIR *dirp, handlerton::discovered_list *result); #endif diff --git a/sql/handler.cc b/sql/handler.cc index 57282102a1a..00ed78f335d 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -34,7 +34,7 @@ #include "sql_parse.h" // check_stack_overrun #include "sql_acl.h" // SUPER_ACL #include "sql_base.h" // free_io_cache -#include "discover.h" // writefrm +#include "discover.h" // extension_based_table_discovery, etc #include "log_event.h" // *_rows_log_event #include "create_options.h" #include "rpl_filter.h" @@ -4131,7 +4131,7 @@ end: */ int ha_create_table(THD *thd, const char *path, const char *db, const char *table_name, - HA_CREATE_INFO *create_info) + HA_CREATE_INFO *create_info, LEX_CUSTRING *frm) { int error= 1; TABLE table; @@ -4141,9 +4141,28 @@ int ha_create_table(THD *thd, const char *path, DBUG_ENTER("ha_create_table"); init_tmp_table_share(thd, &share, db, 0, table_name, path); - if (open_table_def(thd, &share) || - open_table_from_share(thd, &share, "", 0, (uint) READ_ALL, 0, &table, - TRUE)) + + if (frm) + { + bool write_frm_now= !create_info->db_type->discover_table && + !create_info->tmp_table(); + + share.frm_image= frm; + + // open an frm image + if (share.init_from_binary_frm_image(thd, write_frm_now, + frm->str, frm->length)) + goto err; + } + else + { + // open an frm file + if (open_table_def(thd, &share)) + goto err; + } + + + if (open_table_from_share(thd, &share, "", 0, READ_ALL, 0, &table, true)) goto err; update_create_info_from_table(create_info, &table); @@ -4151,7 +4170,9 @@ int ha_create_table(THD *thd, const char *path, name= get_canonical_filename(table.file, share.path.str, name_buff); error= table.file->ha_create(name, &table, create_info); + (void) closefrm(&table, 0); + if (error) { strxmov(name_buff, db, ".", table_name, NullS); diff --git a/sql/handler.h b/sql/handler.h index 11221fa3b10..8e4d59e7f7f 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -1397,6 +1397,8 @@ struct HA_CREATE_INFO ha_table_option_struct *option_struct; ///< structure with parsed table options ha_field_option_struct **fields_option_struct; ///< array of field option structures ha_index_option_struct **indexes_option_struct; ///< array of index option structures + + bool tmp_table() { return options & HA_LEX_CREATE_TMP_TABLE; } }; @@ -3093,7 +3095,7 @@ void ha_checkpoint_state(bool disable); void ha_commit_checkpoint_request(void *cookie, void (*pre_hook)(void *)); int ha_create_table(THD *thd, const char *path, const char *db, const char *table_name, - HA_CREATE_INFO *create_info); + HA_CREATE_INFO *create_info, LEX_CUSTRING *frm); int ha_delete_table(THD *thd, handlerton *db_type, const char *path, const char *db, const char *alias, bool generate_warning); diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 7c249df8061..f88a3ef05f9 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -5963,7 +5963,7 @@ TABLE *open_table_uncached(THD *thd, const char *path, const char *db, init_tmp_table_share(thd, share, saved_cache_key, key_length, strend(saved_cache_key)+1, tmp_path); - if (open_table_def(thd, share) || + if (open_table_def(thd, share, GTS_TABLE | GTS_FORCE_DISCOVERY) || open_table_from_share(thd, share, table_name, (uint) (HA_OPEN_KEYFILE | HA_OPEN_RNDFILE | HA_GET_INDEX), diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 739a1141992..f6a5cc3448a 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -1724,12 +1724,12 @@ bool mysql_write_frm(ALTER_PARTITION_PARAM_TYPE *lpt, uint flags) handlers that have the main version of the frm file stored in the handler. */ - uchar *data; + const uchar *data; size_t length; if (readfrm(shadow_path, &data, &length) || packfrm(data, length, &lpt->pack_frm_data, &lpt->pack_frm_len)) { - my_free(data); + my_free(const_cast<uchar*>(data)); my_free(lpt->pack_frm_data); mem_alloc_error(length); error= 1; @@ -5981,7 +5981,6 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name, char new_alias_buff[FN_REFLEN], *table_name, *db, *new_alias, *alias; char index_file[FN_REFLEN], data_file[FN_REFLEN]; char path[FN_REFLEN + 1]; - char reg_path[FN_REFLEN+1]; ha_rows copied,deleted; handlerton *old_db_type, *new_db_type, *save_old_db_type; enum_alter_table_change_level need_copy_table= ALTER_TABLE_METADATA_ONLY; @@ -6051,7 +6050,7 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name, } /* - Assign variables table_name, new_name, db, new_db, path, reg_path + Assign variables table_name, new_name, db, new_db, path, to simplify further comparisions: we want to see if it's a RENAME later just by comparing the pointers, avoiding the need for strcmp. */ @@ -6061,7 +6060,6 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name, db=table_list->db; if (!new_db || !my_strcasecmp(table_alias_charset, new_db, db)) new_db= db; - build_table_filename(reg_path, sizeof(reg_path) - 1, db, table_name, reg_ext, 0); build_table_filename(path, sizeof(path) - 1, db, table_name, "", 0); mysql_ha_rm_tables(thd, table_list); @@ -6644,13 +6642,16 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name, need_copy_table, need_lock_for_indexes)); } - /* - better have a negative test here, instead of positive, like - alter_info->flags & ALTER_ADD_COLUMN|ALTER_ADD_INDEX|... - so that ALTER TABLE won't break when somebody will add new flag - */ if (need_copy_table == ALTER_TABLE_METADATA_ONLY) - create_info->frm_only= 1; + { + char frm_name[FN_REFLEN+1]; + strxmov(frm_name, path, reg_ext, NullS); + /* + frm_only can only be used if old frm exists. + discovering frm-less engines cannot enjoy this optimization. + */ + create_info->frm_only= !my_access(frm_name, F_OK); + } #ifdef WITH_PARTITION_STORAGE_ENGINE if (table_for_fast_alter_partition) diff --git a/sql/table.cc b/sql/table.cc index b30ed15ba8e..e47c07f3a7e 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -661,9 +661,6 @@ enum open_frm_error open_table_def(THD *thd, TABLE_SHARE *share, uint flags) error_given= true; // init_from_binary_frm_image has already called my_error() my_free(buf); - if (!share->error) - thd->status_var.opened_shares++; - goto err_not_open; err: @@ -741,9 +738,7 @@ bool TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write, old_root= *root_ptr; *root_ptr= &share->mem_root; - if (write && writefrm(share->normalized_path.str, - share->db.str, share->table_name.str, MY_SYNC, - frm_image, frm_length)) + if (write && write_frm_image(frm_image, frm_length)) goto err; if (frm_length < FRM_HEADER_SIZE + FRM_FORMINFO_SIZE) @@ -1915,6 +1910,7 @@ bool TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write, #endif share->error= OPEN_FRM_OK; + thd->status_var.opened_shares++; *root_ptr= old_root; DBUG_RETURN(0); @@ -1943,6 +1939,33 @@ bool TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write, DBUG_RETURN(1); } /* open_binary_frm */ + +bool TABLE_SHARE::write_frm_image(const uchar *frm, size_t len) +{ + return writefrm(normalized_path.str, db.str, table_name.str, 1, frm, len); +} + + +bool TABLE_SHARE::read_frm_image(const uchar **frm, size_t *len) +{ + if (partition_info_str) // cannot discover a partition + { + DBUG_ASSERT(db_type()->discover_table == 0); + return 1; + } + + if (frm_image) + { + *frm= frm_image->str; + *len= frm_image->length; + frm_image->str= 0; // pass the ownership to the caller + frm_image= 0; + return 0; + } + return readfrm(normalized_path.str, frm, len); +} + + /* @brief Clear GET_FIXED_FIELDS_FLAG in all fields of a table diff --git a/sql/table.h b/sql/table.h index e419f5d1240..562a49bfdae 100644 --- a/sql/table.h +++ b/sql/table.h @@ -988,8 +988,11 @@ struct TABLE_SHARE uint actual_n_key_parts(THD *thd); + LEX_CUSTRING *frm_image; ///< only during CREATE TABLE (@sa ha_create_table) bool init_from_binary_frm_image(THD *thd, bool write, const uchar *frm_image, size_t frm_length); + bool write_frm_image(const uchar *frm_image, size_t frm_length); + bool read_frm_image(const uchar **frm_image, size_t *frm_length); }; diff --git a/sql/unireg.cc b/sql/unireg.cc index fdc4628bace..a50ac99ed20 100644 --- a/sql/unireg.cc +++ b/sql/unireg.cc @@ -80,9 +80,8 @@ bool mysql_create_frm(THD *thd, const char *file_name, if (!frm.str) DBUG_RETURN(1); - bool need_sync= opt_sync_frm && - !(create_info->options & HA_LEX_CREATE_TMP_TABLE); - int error= writefrm(file_name, db, table, need_sync, frm.str, frm.length); + int error= writefrm(file_name, db, table, !create_info->tmp_table(), + frm.str, frm.length); my_free(const_cast<uchar*>(frm.str)); DBUG_RETURN(error); @@ -382,30 +381,49 @@ int rea_create_table(THD *thd, const char *path, { DBUG_ENTER("rea_create_table"); - if (mysql_create_frm(thd, path, db, table_name, create_info, - create_fields, keys, key_info, file)) - + LEX_CUSTRING frm= create_frm_image(thd, table_name, create_info, + create_fields, keys, key_info, file); + if (!frm.str) DBUG_RETURN(1); if (thd->variables.keep_files_on_create) create_info->options|= HA_CREATE_KEEP_FILES; - if (!create_info->frm_only && - (file->ha_create_partitioning_metadata(path, NULL, CHF_CREATE_FLAG, - create_info) || - ha_create_table(thd, path, db, table_name, create_info))) - goto err_handler; + + if (create_info->frm_only) + { + if (writefrm(path, db, table_name, 1, frm.str, frm.length)) + goto err_handler; + } + else + { + // TODO don't write frm for temp tables + if (create_info->tmp_table() && + writefrm(path, db, table_name, 0, frm.str, frm.length)) + goto err_handler; + + if (file->ha_create_partitioning_metadata(path, NULL, CHF_CREATE_FLAG, + create_info) || + ha_create_table(thd, path, db, table_name, create_info, &frm)) + { + file->ha_create_partitioning_metadata(path, NULL, CHF_DELETE_FLAG, + create_info); + goto err_handler; + } + } + + my_free(const_cast<uchar*>(frm.str)); DBUG_RETURN(0); err_handler: - (void) file->ha_create_partitioning_metadata(path, NULL, CHF_DELETE_FLAG, create_info); char frm_name[FN_REFLEN]; strxmov(frm_name, path, reg_ext, NullS); mysql_file_delete(key_file_frm, frm_name, MYF(0)); + my_free(const_cast<uchar*>(frm.str)); DBUG_RETURN(1); } /* rea_create_table */ - /* Pack keyinfo and keynames to keybuff for save in form-file. */ +/* Pack keyinfo and keynames to keybuff for save in form-file. */ static uint pack_keys(uchar *keybuff, uint key_count, KEY *keyinfo, ulong data_offset) @@ -488,7 +506,7 @@ static uint pack_keys(uchar *keybuff, uint key_count, KEY *keyinfo, } /* pack_keys */ - /* Make formheader */ +/* Make formheader */ static bool pack_header(uchar *forminfo, List<Create_field> &create_fields, uint table_options, ulong data_offset, handler *file) @@ -510,8 +528,7 @@ static bool pack_header(uchar *forminfo, List<Create_field> &create_fields, com_length=vcol_info_length=0; n_length=2L; - /* Check fields */ - + /* Check fields */ List_iterator<Create_field> it(create_fields); Create_field *field; while ((field=it++)) @@ -638,8 +655,7 @@ static bool pack_header(uchar *forminfo, List<Create_field> &create_fields, } int_length+=int_count*2; // 255 prefix + 0 suffix - /* Save values in forminfo */ - + /* Save values in forminfo */ if (reclength > (ulong) file->max_record_length()) { my_error(ER_TOO_BIG_ROWSIZE, MYF(0), static_cast<long>(file->max_record_length())); @@ -679,8 +695,7 @@ static bool pack_header(uchar *forminfo, List<Create_field> &create_fields, } /* pack_header */ - /* get each unique interval each own id */ - +/* get each unique interval each own id */ static uint get_interval_id(uint *int_count,List<Create_field> &create_fields, Create_field *last_field) { @@ -742,7 +757,7 @@ static size_t packed_fields_length(List<Create_field> &create_fields) DBUG_RETURN(length); } - /* Save fields, fieldnames and intervals */ +/* Save fields, fieldnames and intervals */ static bool pack_fields(uchar *buff, List<Create_field> &create_fields, ulong data_offset) @@ -751,10 +766,8 @@ static bool pack_fields(uchar *buff, List<Create_field> &create_fields, Create_field *field; DBUG_ENTER("pack_fields"); - /* Write field info */ - + /* Write field info */ List_iterator<Create_field> it(create_fields); - int_count=0; while ((field=it++)) { @@ -907,7 +920,7 @@ static bool pack_fields(uchar *buff, List<Create_field> &create_fields, } - /* save an empty record on start of formfile */ +/* save an empty record on start of formfile */ static bool make_empty_rec(THD *thd, uchar *buff, uint table_options, List<Create_field> &create_fields, diff --git a/storage/archive/azio.c b/storage/archive/azio.c index 43c418e516d..c6058af2e3d 100644 --- a/storage/archive/azio.c +++ b/storage/archive/azio.c @@ -855,7 +855,7 @@ int azclose (azio_stream *s) Though this was added to support MySQL's FRM file, anything can be stored in this location. */ -int azwrite_frm(azio_stream *s, uchar *blob, unsigned int length) +int azwrite_frm(azio_stream *s, const uchar *blob, unsigned int length) { if (s->mode == 'r') return 1; diff --git a/storage/archive/azlib.h b/storage/archive/azlib.h index 05fc299e581..09f61afcd28 100644 --- a/storage/archive/azlib.h +++ b/storage/archive/azlib.h @@ -331,7 +331,7 @@ extern int azclose(azio_stream *file); error number (see function gzerror below). */ -extern int azwrite_frm (azio_stream *s, uchar *blob, unsigned int length); +extern int azwrite_frm (azio_stream *s, const uchar *blob, unsigned int length); extern int azread_frm (azio_stream *s, uchar *blob); extern int azwrite_comment (azio_stream *s, char *blob, unsigned int length); extern int azread_comment (azio_stream *s, char *blob); diff --git a/storage/archive/ha_archive.cc b/storage/archive/ha_archive.cc index 2d2ab5f285c..616af00bcc8 100644 --- a/storage/archive/ha_archive.cc +++ b/storage/archive/ha_archive.cc @@ -302,8 +302,7 @@ int archive_discover(handlerton *hton, THD* thd, TABLE_SHARE *share) azclose(&frm_stream); - if (!share->init_from_binary_frm_image(thd, share->normalized_path.str, - frm_ptr, frm_stream.frm_length)) + if (!share->init_from_binary_frm_image(thd, 1, frm_ptr, frm_stream.frm_length)) my_errno= 0; ret: @@ -437,7 +436,7 @@ ARCHIVE_SHARE *ha_archive::get_share(const char *table_name, int *rc) */ if (archive_tmp.version < ARCHIVE_VERSION) *rc= HA_ERR_TABLE_NEEDS_UPGRADE; - else if (frm_compare(&archive_tmp, table_name)) + else if (frm_compare(&archive_tmp)) *rc= HA_ERR_TABLE_DEF_CHANGED; azclose(&archive_tmp); @@ -669,19 +668,19 @@ int ha_archive::frm_copy(azio_stream *src, azio_stream *dst) Compare frm blob with the on-disk frm file @param s The azio stream. - @param path A path for readfrm() @return Zero if equal, non-zero otherwise. */ -int ha_archive::frm_compare(azio_stream *s, const char *path) +int ha_archive::frm_compare(azio_stream *s) { int rc= 0; - uchar *frm_ptr= 0, *azfrm_ptr= 0; + const uchar *frm_ptr= 0; + uchar *azfrm_ptr= 0; size_t frm_len; /* no frm = no discovery. perhaps it's a partitioned table */ - if (readfrm(path, &frm_ptr, &frm_len)) + if (table->s->read_frm_image(&frm_ptr, &frm_len)) goto err; if (!(azfrm_ptr= (uchar *) my_malloc(s->frm_length, @@ -699,7 +698,7 @@ int ha_archive::frm_compare(azio_stream *s, const char *path) rc= memcmp(frm_ptr, azfrm_ptr, frm_len); err: - my_free(frm_ptr); + my_free(const_cast<uchar*>(frm_ptr)); my_free(azfrm_ptr); return rc; } @@ -721,7 +720,7 @@ int ha_archive::create(const char *name, TABLE *table_arg, char linkname[FN_REFLEN]; int error; azio_stream create_stream; /* Archive file we are working with */ - uchar *frm_ptr; + const uchar *frm_ptr; size_t frm_len; DBUG_ENTER("ha_archive::create"); @@ -784,11 +783,10 @@ int ha_archive::create(const char *name, TABLE *table_arg, /* Here is where we open up the frm and pass it to archive to store */ - readfrm(name, &frm_ptr, &frm_len); - if (frm_ptr) + if (!table_arg->s->read_frm_image(&frm_ptr, &frm_len)) { azwrite_frm(&create_stream, frm_ptr, frm_len); - my_free(frm_ptr); + my_free(const_cast<uchar*>(frm_ptr)); } if (create_info->comment.str) diff --git a/storage/archive/ha_archive.h b/storage/archive/ha_archive.h index 0723ee9bfc9..7e8d5cee47b 100644 --- a/storage/archive/ha_archive.h +++ b/storage/archive/ha_archive.h @@ -76,7 +76,7 @@ class ha_archive: public handler archive_record_buffer *create_record_buffer(unsigned int length); void destroy_record_buffer(archive_record_buffer *r); int frm_copy(azio_stream *src, azio_stream *dst); - int frm_compare(azio_stream *src, const char *path); + int frm_compare(azio_stream *src); public: ha_archive(handlerton *hton, TABLE_SHARE *table_arg); |