mirror of
https://github.com/MariaDB/server.git
synced 2026-05-15 03:17:20 +02:00
move writing of the frm into init_from_binary_frm_image()
This commit is contained in:
parent
07b2523918
commit
2481db063f
3 changed files with 32 additions and 20 deletions
23
sql/table.cc
23
sql/table.cc
|
|
@ -39,6 +39,7 @@
|
|||
#include "sql_select.h"
|
||||
#include "sql_derived.h"
|
||||
#include "sql_statistics.h"
|
||||
#include "discover.h"
|
||||
#include "mdl.h" // MDL_wait_for_graph_visitor
|
||||
|
||||
/* INFORMATION_SCHEMA name */
|
||||
|
|
@ -613,7 +614,6 @@ enum open_frm_error open_table_def(THD *thd, TABLE_SHARE *share, uint flags)
|
|||
uchar *buf;
|
||||
uchar head[64];
|
||||
char path[FN_REFLEN];
|
||||
MEM_ROOT **root_ptr, *old_root;
|
||||
DBUG_ENTER("open_table_def");
|
||||
DBUG_PRINT("enter", ("table: '%s'.'%s' path: '%s'", share->db.str,
|
||||
share->table_name.str, share->normalized_path.str));
|
||||
|
|
@ -708,12 +708,8 @@ enum open_frm_error open_table_def(THD *thd, TABLE_SHARE *share, uint flags)
|
|||
}
|
||||
mysql_file_close(file, MYF(MY_WME));
|
||||
|
||||
root_ptr= my_pthread_getspecific_ptr(MEM_ROOT**, THR_MALLOC);
|
||||
old_root= *root_ptr;
|
||||
*root_ptr= &share->mem_root;
|
||||
share->init_from_binary_frm_image(thd, buf);
|
||||
share->init_from_binary_frm_image(thd, NULL, buf, stats.st_size);
|
||||
error_given= true;
|
||||
*root_ptr= old_root;
|
||||
my_free(buf);
|
||||
|
||||
if (!share->error)
|
||||
|
|
@ -745,9 +741,12 @@ err_not_open:
|
|||
28..29 (used to be key_info_length)
|
||||
|
||||
They're still set, for compatibility reasons, but never read.
|
||||
|
||||
TODO verify that we never read data from beyond frm_length!
|
||||
*/
|
||||
|
||||
bool TABLE_SHARE::init_from_binary_frm_image(THD *thd, const uchar *frm_image)
|
||||
bool TABLE_SHARE::init_from_binary_frm_image(THD *thd, const char *path,
|
||||
const uchar *frm_image, size_t frm_length)
|
||||
{
|
||||
TABLE_SHARE *share= this;
|
||||
uint new_frm_ver, field_pack_length, new_field_pack_flag;
|
||||
|
|
@ -782,8 +781,16 @@ bool TABLE_SHARE::init_from_binary_frm_image(THD *thd, const uchar *frm_image)
|
|||
uint first_key_parts= 0;
|
||||
keyinfo= &first_keyinfo;
|
||||
share->ext_key_parts= 0;
|
||||
MEM_ROOT **root_ptr, *old_root;
|
||||
DBUG_ENTER("open_binary_frm");
|
||||
|
||||
root_ptr= my_pthread_getspecific_ptr(MEM_ROOT**, THR_MALLOC);
|
||||
old_root= *root_ptr;
|
||||
*root_ptr= &share->mem_root;
|
||||
|
||||
if (path && writefrm(path, frm_image, frm_length))
|
||||
goto err;
|
||||
|
||||
new_field_pack_flag= frm_image[27];
|
||||
new_frm_ver= (frm_image[2] - FRM_VER);
|
||||
field_pack_length= new_frm_ver < 2 ? 11 : 17;
|
||||
|
|
@ -1922,6 +1929,7 @@ bool TABLE_SHARE::init_from_binary_frm_image(THD *thd, const uchar *frm_image)
|
|||
#endif
|
||||
|
||||
share->error= OPEN_FRM_OK;
|
||||
*root_ptr= old_root;
|
||||
DBUG_RETURN(0);
|
||||
|
||||
err:
|
||||
|
|
@ -1945,6 +1953,7 @@ bool TABLE_SHARE::init_from_binary_frm_image(THD *thd, const uchar *frm_image)
|
|||
if (!thd->is_error())
|
||||
open_table_error(share, OPEN_FRM_CORRUPTED, share->open_errno);
|
||||
|
||||
*root_ptr= old_root;
|
||||
DBUG_RETURN(1);
|
||||
} /* open_binary_frm */
|
||||
|
||||
|
|
|
|||
|
|
@ -988,7 +988,8 @@ struct TABLE_SHARE
|
|||
|
||||
uint actual_n_key_parts(THD *thd);
|
||||
|
||||
bool init_from_binary_frm_image(THD *thd, const uchar *frm_image);
|
||||
bool init_from_binary_frm_image(THD *thd, const char *path,
|
||||
const uchar *frm_image, size_t frm_length);
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -281,7 +281,7 @@ int archive_discover(handlerton *hton, THD* thd, TABLE_SHARE *share)
|
|||
strxmov(az_file, share->normalized_path.str, ARZ, NullS);
|
||||
|
||||
if (!(mysql_file_stat(/* arch_key_file_data */ 0, az_file, &file_stat, MYF(0))))
|
||||
goto err;
|
||||
DBUG_RETURN(HA_ERR_NO_SUCH_TABLE);
|
||||
|
||||
if (!(azopen(&frm_stream, az_file, O_RDONLY|O_BINARY)))
|
||||
{
|
||||
|
|
@ -293,21 +293,23 @@ int archive_discover(handlerton *hton, THD* thd, TABLE_SHARE *share)
|
|||
if (frm_stream.frm_length == 0)
|
||||
DBUG_RETURN(HA_ERR_CRASHED_ON_USAGE);
|
||||
|
||||
frm_ptr= (uchar *)my_malloc(sizeof(char) * frm_stream.frm_length, MYF(0));
|
||||
azread_frm(&frm_stream, frm_ptr);
|
||||
frm_ptr= (uchar *)my_malloc(sizeof(char) * frm_stream.frm_length,
|
||||
MYF(MY_THREAD_SPECIFIC | MY_WME));
|
||||
if (!frm_ptr)
|
||||
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
||||
|
||||
if (azread_frm(&frm_stream, frm_ptr))
|
||||
goto ret;
|
||||
|
||||
azclose(&frm_stream);
|
||||
|
||||
// don't go through the discovery again
|
||||
if (writefrm(share->normalized_path.str, frm_ptr, frm_stream.frm_length))
|
||||
DBUG_RETURN(my_errno);
|
||||
|
||||
share->init_from_binary_frm_image(thd, frm_ptr);
|
||||
if (!share->init_from_binary_frm_image(thd, share->normalized_path.str,
|
||||
frm_ptr, frm_stream.frm_length))
|
||||
my_errno= 0;
|
||||
|
||||
ret:
|
||||
my_free(frm_ptr);
|
||||
|
||||
DBUG_RETURN(0);
|
||||
err:
|
||||
DBUG_RETURN(HA_ERR_NO_SUCH_TABLE);
|
||||
DBUG_RETURN(my_errno);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue