mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Merge olga.mysql.com:/home/igor/mysql-5.1
into olga.mysql.com:/home/igor/mysql-5.1-opt-merge mysql-test/r/alter_table.result: Auto merged mysql-test/r/create.result: Auto merged mysql-test/r/innodb_mysql.result: Auto merged mysql-test/r/sp.result: Auto merged mysql-test/r/user_var.result: Auto merged mysql-test/t/alter_table.test: Auto merged mysql-test/t/sp.test: Auto merged mysql-test/t/strict.test: Auto merged mysql-test/t/subselect3.test: Auto merged sql/field.h: Auto merged sql/handler.h: Auto merged sql/item_func.cc: Auto merged sql/item_func.h: Auto merged sql/mysqld.cc: Auto merged sql/sp_head.cc: Auto merged sql/sql_base.cc: Auto merged sql/sql_class.h: Auto merged sql/sql_select.cc: Auto merged sql/sql_update.cc: Auto merged mysql-test/r/ps_2myisam.result: Manual merge. mysql-test/r/ps_3innodb.result: Manual merge. mysql-test/r/ps_4heap.result: Manual merge. mysql-test/r/ps_5merge.result: Manual merge. mysql-test/r/ps_7ndb.result: Manual merge. sql/sql_table.cc: Manual merge. sql/sql_view.cc: Manual merge.
This commit is contained in:
157
sql/sql_view.cc
157
sql/sql_view.cc
@ -692,6 +692,7 @@ static int mysql_register_view(THD *thd, TABLE_LIST *view,
|
||||
char dir_buff[FN_REFLEN], path_buff[FN_REFLEN];
|
||||
const char *endp;
|
||||
LEX_STRING dir, file, path;
|
||||
int error= 0;
|
||||
DBUG_ENTER("mysql_register_view");
|
||||
|
||||
/* print query */
|
||||
@ -702,80 +703,14 @@ static int mysql_register_view(THD *thd, TABLE_LIST *view,
|
||||
lex->unit.print(&str);
|
||||
thd->variables.sql_mode|= sql_mode;
|
||||
}
|
||||
str.append('\0');
|
||||
DBUG_PRINT("info", ("View: %s", str.ptr()));
|
||||
|
||||
/* print file name */
|
||||
dir.length= build_table_filename(dir_buff, sizeof(dir_buff),
|
||||
view->db, "", "", 0);
|
||||
dir.str= dir_buff;
|
||||
|
||||
path.length= build_table_filename(path_buff, sizeof(path_buff),
|
||||
view->db, view->table_name, reg_ext, 0);
|
||||
path.str= path_buff;
|
||||
|
||||
file.str= path.str + dir.length;
|
||||
file.length= path.length - dir.length;
|
||||
|
||||
/* init timestamp */
|
||||
if (!view->timestamp.str)
|
||||
view->timestamp.str= view->timestamp_buffer;
|
||||
|
||||
/* check old .frm */
|
||||
{
|
||||
char path_buff[FN_REFLEN];
|
||||
LEX_STRING path;
|
||||
File_parser *parser;
|
||||
|
||||
path.str= path_buff;
|
||||
fn_format(path_buff, file.str, dir.str, "", MY_UNPACK_FILENAME);
|
||||
path.length= strlen(path_buff);
|
||||
|
||||
if (!access(path.str, F_OK))
|
||||
{
|
||||
if (mode == VIEW_CREATE_NEW)
|
||||
{
|
||||
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), view->alias);
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
|
||||
if (!(parser= sql_parse_prepare(&path, thd->mem_root, 0)))
|
||||
DBUG_RETURN(1);
|
||||
|
||||
if (!parser->ok() || !is_equal(&view_type, parser->type()))
|
||||
{
|
||||
my_error(ER_WRONG_OBJECT, MYF(0), view->db, view->table_name, "VIEW");
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
|
||||
/*
|
||||
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))
|
||||
{
|
||||
DBUG_RETURN(thd->net.report_error? -1 : 0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (mode == VIEW_ALTER)
|
||||
{
|
||||
my_error(ER_NO_SUCH_TABLE, MYF(0), view->db, view->alias);
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
}
|
||||
}
|
||||
/* fill structure */
|
||||
view->query.str= (char*)str.ptr();
|
||||
view->query.length= str.length()-1; // we do not need last \0
|
||||
view->query.str= str.c_ptr_safe();
|
||||
view->query.length= str.length();
|
||||
view->source.str= thd->query + thd->lex->create_view_select_start;
|
||||
endp= view->source.str;
|
||||
endp= skip_rear_comments(thd->charset(), endp, thd->query + thd->query_length);
|
||||
endp= skip_rear_comments(endp, thd->query + thd->query_length);
|
||||
view->source.length= endp - view->source.str;
|
||||
view->file_version= 1;
|
||||
view->calc_md5(md5);
|
||||
@ -818,6 +753,78 @@ static int mysql_register_view(THD *thd, TABLE_LIST *view,
|
||||
}
|
||||
}
|
||||
loop_out:
|
||||
/* print file name */
|
||||
dir.length= build_table_filename(dir_buff, sizeof(dir_buff),
|
||||
view->db, "", "", 0);
|
||||
dir.str= dir_buff;
|
||||
|
||||
path.length= build_table_filename(path_buff, sizeof(path_buff),
|
||||
view->db, view->table_name, reg_ext, 0);
|
||||
path.str= path_buff;
|
||||
|
||||
file.str= path.str + dir.length;
|
||||
file.length= path.length - dir.length;
|
||||
|
||||
/* init timestamp */
|
||||
if (!view->timestamp.str)
|
||||
view->timestamp.str= view->timestamp_buffer;
|
||||
|
||||
/* check old .frm */
|
||||
{
|
||||
char path_buff[FN_REFLEN];
|
||||
LEX_STRING path;
|
||||
File_parser *parser;
|
||||
|
||||
path.str= path_buff;
|
||||
fn_format(path_buff, file.str, dir.str, "", MY_UNPACK_FILENAME);
|
||||
path.length= strlen(path_buff);
|
||||
|
||||
if (!access(path.str, F_OK))
|
||||
{
|
||||
if (mode == VIEW_CREATE_NEW)
|
||||
{
|
||||
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), view->alias);
|
||||
error= -1;
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (!(parser= sql_parse_prepare(&path, thd->mem_root, 0)))
|
||||
{
|
||||
error= 1;
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (!parser->ok() || !is_equal(&view_type, parser->type()))
|
||||
{
|
||||
my_error(ER_WRONG_OBJECT, MYF(0), view->db, view->table_name, "VIEW");
|
||||
error= -1;
|
||||
goto err;
|
||||
}
|
||||
|
||||
/*
|
||||
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->net.report_error? -1 : 0;
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (mode == VIEW_ALTER)
|
||||
{
|
||||
my_error(ER_NO_SUCH_TABLE, MYF(0), view->db, view->alias);
|
||||
error= -1;
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
Check that table of main select do not used in subqueries.
|
||||
|
||||
@ -842,15 +849,23 @@ loop_out:
|
||||
!view->updatable_view)
|
||||
{
|
||||
my_error(ER_VIEW_NONUPD_CHECK, MYF(0), view->db, view->table_name);
|
||||
DBUG_RETURN(-1);
|
||||
error= -1;
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (sql_create_definition_file(&dir, &file, view_file_type,
|
||||
(uchar*)view, view_parameters, num_view_backups))
|
||||
{
|
||||
DBUG_RETURN(thd->net.report_error? -1 : 1);
|
||||
error= thd->net.report_error? -1 : 1;
|
||||
goto err;
|
||||
}
|
||||
DBUG_RETURN(0);
|
||||
err:
|
||||
view->query.str= NULL;
|
||||
view->query.length= 0;
|
||||
view->md5.str= NULL;
|
||||
view->md5.length= 0;
|
||||
DBUG_RETURN(error);
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user