manual merge 5.0-bugteam --> 5.1-bugteam (bug 40021)
sql_view.cc: required_view_parameters has been decreased by 2 (not by 1) because its value was incorrect: 16 instead of 15 (minor performance issue). sql/sql_view.cc: sql_view.cc: required_view_parameters has been decreased by 2 (not by 1) because its value was incorrect: 16 instead of 15 (minor performance issue).
This commit is contained in:
commit
8155de51e5
@ -90,7 +90,6 @@ write_escaped_string(IO_CACHE *file, LEX_STRING *val_s)
|
||||
@param file pointer to IO_CACHE structure for writing
|
||||
@param base pointer to data structure
|
||||
@param parameter pointer to parameter descriptor
|
||||
@param old_version for returning back old version number value
|
||||
|
||||
@retval
|
||||
FALSE OK
|
||||
@ -100,8 +99,7 @@ write_escaped_string(IO_CACHE *file, LEX_STRING *val_s)
|
||||
|
||||
|
||||
static my_bool
|
||||
write_parameter(IO_CACHE *file, uchar* base, File_option *parameter,
|
||||
ulonglong *old_version)
|
||||
write_parameter(IO_CACHE *file, uchar* base, File_option *parameter)
|
||||
{
|
||||
char num_buf[20]; // buffer for numeric operations
|
||||
// string for numeric operations
|
||||
@ -129,15 +127,6 @@ write_parameter(IO_CACHE *file, uchar* base, File_option *parameter,
|
||||
DBUG_RETURN(TRUE);
|
||||
break;
|
||||
}
|
||||
case FILE_OPTIONS_REV:
|
||||
{
|
||||
ulonglong *val_i= (ulonglong *)(base + parameter->offset);
|
||||
*old_version= (*val_i)++;
|
||||
num.set(*val_i, &my_charset_bin);
|
||||
if (my_b_append(file, (const uchar *)num.ptr(), num.length()))
|
||||
DBUG_RETURN(TRUE);
|
||||
break;
|
||||
}
|
||||
case FILE_OPTIONS_TIMESTAMP:
|
||||
{
|
||||
/* string have to be allocated already */
|
||||
@ -207,7 +196,6 @@ write_parameter(IO_CACHE *file, uchar* base, File_option *parameter,
|
||||
@param base base address for parameter reading (structure like
|
||||
TABLE)
|
||||
@param parameters parameters description
|
||||
@param max_versions number of versions to save
|
||||
|
||||
@retval
|
||||
FALSE OK
|
||||
@ -219,13 +207,11 @@ write_parameter(IO_CACHE *file, uchar* base, File_option *parameter,
|
||||
my_bool
|
||||
sql_create_definition_file(const LEX_STRING *dir, const LEX_STRING *file_name,
|
||||
const LEX_STRING *type,
|
||||
uchar* base, File_option *parameters,
|
||||
uint max_versions)
|
||||
uchar* base, File_option *parameters)
|
||||
{
|
||||
File handler;
|
||||
IO_CACHE file;
|
||||
char path[FN_REFLEN+1]; // +1 to put temporary file name for sure
|
||||
ulonglong old_version= ULONGLONG_MAX;
|
||||
int path_end;
|
||||
File_option *param;
|
||||
DBUG_ENTER("sql_create_definition_file");
|
||||
@ -272,7 +258,7 @@ sql_create_definition_file(const LEX_STRING *dir, const LEX_STRING *file_name,
|
||||
if (my_b_append(&file, (const uchar *)param->name.str,
|
||||
param->name.length) ||
|
||||
my_b_append(&file, (const uchar *)STRING_WITH_LEN("=")) ||
|
||||
write_parameter(&file, base, param, &old_version) ||
|
||||
write_parameter(&file, base, param) ||
|
||||
my_b_append(&file, (const uchar *)STRING_WITH_LEN("\n")))
|
||||
goto err_w_cache;
|
||||
}
|
||||
@ -286,55 +272,6 @@ sql_create_definition_file(const LEX_STRING *dir, const LEX_STRING *file_name,
|
||||
}
|
||||
|
||||
path[path_end]='\0';
|
||||
#ifdef FRM_ARCHIVE
|
||||
// archive copies management: disabled unused feature (see bug #17823).
|
||||
if (!access(path, F_OK))
|
||||
{
|
||||
if (old_version != ULONGLONG_MAX && max_versions != 0)
|
||||
{
|
||||
// save backup
|
||||
char path_arc[FN_REFLEN];
|
||||
// backup old version
|
||||
char path_to[FN_REFLEN];
|
||||
|
||||
// check archive directory existence
|
||||
fn_format(path_arc, "arc", dir->str, "", MY_UNPACK_FILENAME);
|
||||
if (access(path_arc, F_OK))
|
||||
{
|
||||
if (my_mkdir(path_arc, 0777, MYF(MY_WME)))
|
||||
{
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
my_snprintf(path_to, FN_REFLEN, "%s/%s-%04lu",
|
||||
path_arc, file_name->str, (ulong) old_version);
|
||||
if (my_rename(path, path_to, MYF(MY_WME)))
|
||||
{
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
|
||||
// remove very old version
|
||||
if (old_version > max_versions)
|
||||
{
|
||||
my_snprintf(path_to, FN_REFLEN, "%s/%s-%04lu",
|
||||
path_arc, file_name->str,
|
||||
(ulong)(old_version - max_versions));
|
||||
if (!access(path_arc, F_OK) && my_delete(path_to, MYF(MY_WME)))
|
||||
{
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (my_delete(path, MYF(MY_WME))) // no backups
|
||||
{
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif//FRM_ARCHIVE
|
||||
|
||||
{
|
||||
// rename temporary file
|
||||
@ -361,8 +298,6 @@ err_w_file:
|
||||
@param schema name of given schema
|
||||
@param old_name original file name
|
||||
@param new_name new file name
|
||||
@param revision revision number
|
||||
@param num_view_backups number of backups
|
||||
|
||||
@retval
|
||||
0 OK
|
||||
@ -371,8 +306,7 @@ err_w_file:
|
||||
*/
|
||||
my_bool rename_in_schema_file(THD *thd,
|
||||
const char *schema, const char *old_name,
|
||||
const char *new_name, ulonglong revision,
|
||||
uint num_view_backups)
|
||||
const char *new_name)
|
||||
{
|
||||
char old_path[FN_REFLEN], new_path[FN_REFLEN], arc_path[FN_REFLEN];
|
||||
|
||||
@ -387,28 +321,6 @@ my_bool rename_in_schema_file(THD *thd,
|
||||
/* check if arc_dir exists: disabled unused feature (see bug #17823). */
|
||||
build_table_filename(arc_path, sizeof(arc_path) - 1, schema, "arc", "", 0);
|
||||
|
||||
#ifdef FRM_ARCHIVE
|
||||
if (revision > 0 && !access(arc_path, F_OK))
|
||||
{
|
||||
char old_name_buf[FN_REFLEN], new_name_buf[FN_REFLEN];
|
||||
ulonglong limit= ((revision > num_view_backups) ?
|
||||
revision - num_view_backups : 0);
|
||||
|
||||
VOID(tablename_to_filename(old_name, old_name_buf, sizeof(old_name_buf)));
|
||||
VOID(tablename_to_filename(new_name, new_name_buf, sizeof(new_name_buf)));
|
||||
|
||||
for (; revision > limit ; revision--)
|
||||
{
|
||||
my_snprintf(old_path, FN_REFLEN, "%s/%s%s-%04lu",
|
||||
arc_path, old_name_buf, reg_ext, (ulong) revision);
|
||||
(void) unpack_filename(old_path, old_path);
|
||||
my_snprintf(new_path, FN_REFLEN, "%s/%s%s-%04lu",
|
||||
arc_path, new_name_buf, reg_ext, (ulong) revision);
|
||||
(void) unpack_filename(new_path, new_path);
|
||||
my_rename(old_path, new_path, MYF(0));
|
||||
}
|
||||
}
|
||||
#else//FRM_ARCHIVE
|
||||
{ // remove obsolete 'arc' directory and files if any
|
||||
MY_DIR *new_dirp;
|
||||
if ((new_dirp = my_dir(arc_path, MYF(MY_DONT_SORT))))
|
||||
@ -417,7 +329,6 @@ my_bool rename_in_schema_file(THD *thd,
|
||||
(void) mysql_rm_arc_files(thd, new_dirp, arc_path);
|
||||
}
|
||||
}
|
||||
#endif//FRM_ARCHIVE
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -846,7 +757,6 @@ File_parser::parse(uchar* base, MEM_ROOT *mem_root,
|
||||
break;
|
||||
}
|
||||
case FILE_OPTIONS_ULONGLONG:
|
||||
case FILE_OPTIONS_REV:
|
||||
if (!(eol= strchr(ptr, '\n')))
|
||||
{
|
||||
my_error(ER_FPARSER_ERROR_IN_PARAMETER, MYF(0),
|
||||
|
@ -23,7 +23,6 @@ enum file_opt_type {
|
||||
FILE_OPTIONS_STRING, /**< String (LEX_STRING) */
|
||||
FILE_OPTIONS_ESTRING, /**< Escaped string (LEX_STRING) */
|
||||
FILE_OPTIONS_ULONGLONG, /**< ulonglong parameter (ulonglong) */
|
||||
FILE_OPTIONS_REV, /**< Revision version number (ulonglong) */
|
||||
FILE_OPTIONS_TIMESTAMP, /**< timestamp (LEX_STRING have to be
|
||||
allocated with length 20 (19+1) */
|
||||
FILE_OPTIONS_STRLIST, /**< list of escaped strings
|
||||
@ -81,11 +80,10 @@ File_parser *sql_parse_prepare(const LEX_STRING *file_name,
|
||||
my_bool
|
||||
sql_create_definition_file(const LEX_STRING *dir, const LEX_STRING *file_name,
|
||||
const LEX_STRING *type,
|
||||
uchar* base, File_option *parameters, uint versions);
|
||||
uchar* base, File_option *parameters);
|
||||
my_bool rename_in_schema_file(THD *thd,
|
||||
const char *schema, const char *old_name,
|
||||
const char *new_name, ulonglong revision,
|
||||
uint num_view_backups);
|
||||
const char *new_name);
|
||||
|
||||
class File_parser: public Sql_alloc
|
||||
{
|
||||
|
@ -1099,7 +1099,6 @@ static long mysql_rm_known_files(THD *thd, MY_DIR *dirp, const char *db,
|
||||
/* .frm archive:
|
||||
Those archives are obsolete, but following code should
|
||||
exist to remove existent "arc" directories.
|
||||
See #ifdef FRM_ARCHIVE directives for obsolete code.
|
||||
*/
|
||||
char newpath[FN_REFLEN];
|
||||
MY_DIR *new_dirp;
|
||||
@ -1268,7 +1267,6 @@ static my_bool rm_dir_w_symlink(const char *org_path, my_bool send_error)
|
||||
NOTE
|
||||
A support of "arc" directories is obsolete, however this
|
||||
function should exist to remove existent "arc" directories.
|
||||
See #ifdef FRM_ARCHIVE directives for obsolete code.
|
||||
*/
|
||||
long mysql_rm_arc_files(THD *thd, MY_DIR *dirp, const char *org_path)
|
||||
{
|
||||
|
@ -682,7 +682,7 @@ bool Table_triggers_list::create_trigger(THD *thd, TABLE_LIST *tables,
|
||||
trigname.trigger_table.length= tables->table_name_length;
|
||||
|
||||
if (sql_create_definition_file(NULL, &trigname_file, &trigname_file_type,
|
||||
(uchar*)&trigname, trigname_file_parameters, 0))
|
||||
(uchar*)&trigname, trigname_file_parameters))
|
||||
return 1;
|
||||
|
||||
/*
|
||||
@ -800,7 +800,7 @@ bool Table_triggers_list::create_trigger(THD *thd, TABLE_LIST *tables,
|
||||
/* Create trigger definition file. */
|
||||
|
||||
if (!sql_create_definition_file(NULL, &file, &triggers_file_type,
|
||||
(uchar*)this, triggers_file_parameters, 0))
|
||||
(uchar*)this, triggers_file_parameters))
|
||||
return 0;
|
||||
|
||||
err_with_cleanup:
|
||||
@ -876,8 +876,7 @@ static bool save_trigger_file(Table_triggers_list *triggers, const char *db,
|
||||
TRG_EXT, 0);
|
||||
file.str= file_buff;
|
||||
return sql_create_definition_file(NULL, &file, &triggers_file_type,
|
||||
(uchar*)triggers, triggers_file_parameters,
|
||||
0);
|
||||
(uchar*)triggers, triggers_file_parameters);
|
||||
}
|
||||
|
||||
|
||||
@ -1806,8 +1805,7 @@ Table_triggers_list::change_table_name_in_trignames(const char *db_name,
|
||||
trigname.trigger_table= *new_table_name;
|
||||
|
||||
if (sql_create_definition_file(NULL, &trigname_file, &trigname_file_type,
|
||||
(uchar*)&trigname, trigname_file_parameters,
|
||||
0))
|
||||
(uchar*)&trigname, trigname_file_parameters))
|
||||
return trigger;
|
||||
}
|
||||
|
||||
|
@ -655,7 +655,7 @@ bool mysql_create_view(THD *thd, TABLE_LIST *views,
|
||||
}
|
||||
|
||||
VOID(pthread_mutex_unlock(&LOCK_open));
|
||||
if (view->revision != 1)
|
||||
if (mode != VIEW_CREATE_NEW)
|
||||
query_cache_invalidate3(thd, view, 0);
|
||||
start_waiting_global_read_lock(thd);
|
||||
if (res)
|
||||
@ -673,12 +673,8 @@ err:
|
||||
}
|
||||
|
||||
|
||||
/* index of revision number in following table */
|
||||
static const int revision_number_position= 8;
|
||||
/* number of required parameters for making view */
|
||||
static const int required_view_parameters= 16;
|
||||
/* number of backups */
|
||||
static const int num_view_backups= 3;
|
||||
static const int required_view_parameters= 14;
|
||||
|
||||
/*
|
||||
table of VIEW .frm field descriptors
|
||||
@ -711,9 +707,6 @@ static File_option view_parameters[]=
|
||||
{{ C_STRING_WITH_LEN("with_check_option")},
|
||||
my_offsetof(TABLE_LIST, with_check),
|
||||
FILE_OPTIONS_ULONGLONG},
|
||||
{{ C_STRING_WITH_LEN("revision")},
|
||||
my_offsetof(TABLE_LIST, revision),
|
||||
FILE_OPTIONS_REV},
|
||||
{{ C_STRING_WITH_LEN("timestamp")},
|
||||
my_offsetof(TABLE_LIST, timestamp),
|
||||
FILE_OPTIONS_TIMESTAMP},
|
||||
@ -921,18 +914,9 @@ loop_out:
|
||||
}
|
||||
|
||||
/*
|
||||
read revision number
|
||||
|
||||
TODO: read dependence list, too, to process cascade/restrict
|
||||
TODO: special cascade/restrict procedure for alter?
|
||||
*/
|
||||
if (parser->parse((uchar*)view, thd->mem_root,
|
||||
view_parameters + revision_number_position, 1,
|
||||
&file_parser_dummy_hook))
|
||||
{
|
||||
error= thd->is_error() ? -1 : 0;
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -997,7 +981,7 @@ loop_out:
|
||||
}
|
||||
|
||||
if (sql_create_definition_file(&dir, &file, view_file_type,
|
||||
(uchar*)view, view_parameters, num_view_backups))
|
||||
(uchar*)view, view_parameters))
|
||||
{
|
||||
error= thd->is_error() ? -1 : 1;
|
||||
goto err;
|
||||
@ -1963,8 +1947,7 @@ mysql_rename_view(THD *thd,
|
||||
goto err;
|
||||
|
||||
/* rename view and it's backups */
|
||||
if (rename_in_schema_file(thd, view->db, view->table_name, new_name,
|
||||
view_def.revision - 1, num_view_backups))
|
||||
if (rename_in_schema_file(thd, view->db, view->table_name, new_name))
|
||||
goto err;
|
||||
|
||||
dir.str= dir_buff;
|
||||
@ -1979,12 +1962,10 @@ mysql_rename_view(THD *thd,
|
||||
file.length= pathstr.length - dir.length;
|
||||
|
||||
if (sql_create_definition_file(&dir, &file, view_file_type,
|
||||
(uchar*)&view_def, view_parameters,
|
||||
num_view_backups))
|
||||
(uchar*)&view_def, view_parameters))
|
||||
{
|
||||
/* restore renamed view in case of error */
|
||||
rename_in_schema_file(thd, view->db, new_name, view->table_name,
|
||||
view_def.revision - 1, num_view_backups);
|
||||
rename_in_schema_file(thd, view->db, new_name, view->table_name);
|
||||
goto err;
|
||||
}
|
||||
} else
|
||||
|
@ -1244,7 +1244,6 @@ struct TABLE_LIST
|
||||
st_lex_user definer; /* definer of view */
|
||||
ulonglong file_version; /* version of file's field set */
|
||||
ulonglong updatable_view; /* VIEW can be updated */
|
||||
ulonglong revision; /* revision control number */
|
||||
/**
|
||||
@brief The declared algorithm, if this is a view.
|
||||
@details One of
|
||||
|
Loading…
x
Reference in New Issue
Block a user