Commit 574c6519 authored by unknown's avatar unknown

system charset (with wich VIEW printed) saved in .frm and restored before parsing view (BUG#5163)


mysql-test/r/view.result:
  VIEWs with national characters
mysql-test/t/view.test:
  VIEWs with national characters
sql/sql_view.cc:
  system charset (with wich VIEW printed) saved in .frm and restored before parsing view
sql/table.h:
  system charset (with wich VIEW printed) saved in .frm
parent 6f3d6a54
...@@ -1222,3 +1222,11 @@ show create view v1; ...@@ -1222,3 +1222,11 @@ show create view v1;
Table Create Table Table Create Table
v1 CREATE VIEW `test`.`v1` AS select 99999999999999999999999999999999999999999999999999999 AS `col1` v1 CREATE VIEW `test`.`v1` AS select 99999999999999999999999999999999999999999999999999999 AS `col1`
drop view v1; drop view v1;
create table t (c char);
create view v as select c from t;
insert into v values ('');
select * from v;
c
drop view v;
drop table t;
...@@ -1168,3 +1168,13 @@ drop table t1; ...@@ -1168,3 +1168,13 @@ drop table t1;
create view v1 as select 99999999999999999999999999999999999999999999999999999 as col1; create view v1 as select 99999999999999999999999999999999999999999999999999999 as col1;
show create view v1; show create view v1;
drop view v1; drop view v1;
#
# VIEWs with national characters
#
create table t (c char);
create view v as select c from t;
insert into v values ('');
select * from v;
drop view v;
drop table t;
...@@ -318,8 +318,10 @@ int mysql_create_view(THD *thd, ...@@ -318,8 +318,10 @@ int mysql_create_view(THD *thd,
} }
// index of revision number in following table /* index of revision number in following table */
static const int revision_number_position= 4; static const int revision_number_position= 5;
/* index of last required parameter for making view */
static const int last_parameter= 8;
static char *view_field_names[]= static char *view_field_names[]=
{ {
...@@ -327,6 +329,7 @@ static char *view_field_names[]= ...@@ -327,6 +329,7 @@ static char *view_field_names[]=
(char*)"md5", (char*)"md5",
(char*)"updatable", (char*)"updatable",
(char*)"algorithm", (char*)"algorithm",
(char*)"syscharset",
(char*)"revision", (char*)"revision",
(char*)"timestamp", (char*)"timestamp",
(char*)"create-version", (char*)"create-version",
...@@ -343,13 +346,15 @@ static File_option view_parameters[]= ...@@ -343,13 +346,15 @@ static File_option view_parameters[]=
FILE_OPTIONS_ULONGLONG}, FILE_OPTIONS_ULONGLONG},
{{view_field_names[3], 9}, offsetof(TABLE_LIST, algorithm), {{view_field_names[3], 9}, offsetof(TABLE_LIST, algorithm),
FILE_OPTIONS_ULONGLONG}, FILE_OPTIONS_ULONGLONG},
{{view_field_names[4], 8}, offsetof(TABLE_LIST, revision), {{view_field_names[4], 10}, offsetof(TABLE_LIST, syscharset),
FILE_OPTIONS_STRING},
{{view_field_names[5], 8}, offsetof(TABLE_LIST, revision),
FILE_OPTIONS_REV}, FILE_OPTIONS_REV},
{{view_field_names[5], 9}, offsetof(TABLE_LIST, timestamp), {{view_field_names[6], 9}, offsetof(TABLE_LIST, timestamp),
FILE_OPTIONS_TIMESTAMP}, FILE_OPTIONS_TIMESTAMP},
{{view_field_names[6], 14}, offsetof(TABLE_LIST, file_version), {{view_field_names[7], 14}, offsetof(TABLE_LIST, file_version),
FILE_OPTIONS_ULONGLONG}, FILE_OPTIONS_ULONGLONG},
{{view_field_names[7], 6}, offsetof(TABLE_LIST, source), {{view_field_names[8], 6}, offsetof(TABLE_LIST, source),
FILE_OPTIONS_ESTRING}, FILE_OPTIONS_ESTRING},
{{NULL, 0}, 0, {{NULL, 0}, 0,
FILE_OPTIONS_STRING} FILE_OPTIONS_STRING}
...@@ -468,6 +473,8 @@ static int mysql_register_view(THD *thd, TABLE_LIST *view, ...@@ -468,6 +473,8 @@ static int mysql_register_view(THD *thd, TABLE_LIST *view,
view->query.length= str.length()-1; // we do not need last \0 view->query.length= str.length()-1; // we do not need last \0
view->source.str= thd->query; view->source.str= thd->query;
view->source.length= thd->query_length; view->source.length= thd->query_length;
view->syscharset.str= (char *)system_charset_info->csname;
view->syscharset.length= strlen(view->syscharset.str);
view->file_version= 1; view->file_version= 1;
view->calc_md5(md5); view->calc_md5(md5);
view->md5.str= md5; view->md5.str= md5;
...@@ -552,7 +559,8 @@ mysql_make_view(File_parser *parser, TABLE_LIST *table) ...@@ -552,7 +559,8 @@ mysql_make_view(File_parser *parser, TABLE_LIST *table)
TODO: when VIEWs will be stored in cache, table mem_root should TODO: when VIEWs will be stored in cache, table mem_root should
be used here be used here
*/ */
if (parser->parse((gptr)table, &thd->mem_root, view_parameters, 6)) if (parser->parse((gptr)table, &thd->mem_root, view_parameters,
last_parameter))
goto err; goto err;
/* /*
...@@ -604,7 +612,21 @@ mysql_make_view(File_parser *parser, TABLE_LIST *table) ...@@ -604,7 +612,21 @@ mysql_make_view(File_parser *parser, TABLE_LIST *table)
*/ */
thd->options&= ~(MODE_PIPES_AS_CONCAT | MODE_ANSI_QUOTES | thd->options&= ~(MODE_PIPES_AS_CONCAT | MODE_ANSI_QUOTES |
MODE_IGNORE_SPACE | MODE_NO_BACKSLASH_ESCAPES); MODE_IGNORE_SPACE | MODE_NO_BACKSLASH_ESCAPES);
CHARSET_INFO *save_cs= thd->variables.character_set_client;
if (!table->syscharset.length)
thd->variables.character_set_client= system_charset_info;
else
{
if (!(thd->variables.character_set_client=
get_charset_by_csname(table->syscharset.str,
MY_CS_PRIMARY, MYF(MY_WME))))
{
thd->variables.character_set_client= save_cs;
goto err;
}
}
res= yyparse((void *)thd); res= yyparse((void *)thd);
thd->variables.character_set_client= save_cs;
thd->options= options; thd->options= options;
} }
if (!res && !thd->is_fatal_error) if (!res && !thd->is_fatal_error)
......
...@@ -224,6 +224,7 @@ typedef struct st_table_list ...@@ -224,6 +224,7 @@ typedef struct st_table_list
LEX_STRING view_db; /* save view database */ LEX_STRING view_db; /* save view database */
LEX_STRING view_name; /* save view name */ LEX_STRING view_name; /* save view name */
LEX_STRING timestamp; /* GMT time stamp of last operation */ LEX_STRING timestamp; /* GMT time stamp of last operation */
LEX_STRING syscharset; /* charset of VIEW query text*/
ulonglong file_version; /* version of file's field set */ ulonglong file_version; /* version of file's field set */
ulonglong updatable_view; /* VIEW can be updated */ ulonglong updatable_view; /* VIEW can be updated */
ulonglong revision; /* revision control number */ ulonglong revision; /* revision control number */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment