Commit 33eaf2cd authored by gluh@mysql.com/eagle.(none)'s avatar gluh@mysql.com/eagle.(none)
Browse files

Bug#29408 Cannot find view in columns table if the selection contains a function

Use view db name as thread default database, in order to ensure
that the view is parsed and prepared correctly.
parent df7771de
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
@@ -6314,4 +6314,26 @@ CALL p1();
NULL
SET NAMES default;
DROP PROCEDURE p1;
create function f1()
returns int(11)
not deterministic
contains sql
sql security definer
comment ''
begin
declare x int(11);
set x=-1;
return x;
end|
create view v1 as select 1 as one, f1() as days;
show create view test.v1;
View	Create View
v1	CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `test`.`v1` AS select 1 AS `one`,`f1`() AS `days`
select column_name from information_schema.columns
where table_name='v1' and table_schema='test';
column_name
one
days
drop view v1;
drop function f1;
End of 5.0 tests
+33 −0
Original line number Diff line number Diff line
@@ -7299,4 +7299,37 @@ CALL p1();
SET NAMES default;
DROP PROCEDURE p1;

#
# Bug#29408 Cannot find view in columns table if the selection contains a function
#
delimiter |;

create function f1()
    returns int(11)
not deterministic
contains sql
sql security definer
comment ''
begin
  declare x int(11);
  set x=-1;
   return x;
end|
                          
delimiter ;|
                  
create view v1 as select 1 as one, f1() as days;
                          
connect (bug29408, localhost, root,,*NO-ONE*);                     
connection bug29408;

show create view test.v1;      
select column_name from information_schema.columns
where table_name='v1' and table_schema='test';

connection default;
disconnect bug29408;
drop view v1;
drop function f1;

--echo End of 5.0 tests
+1 −1
Original line number Diff line number Diff line
@@ -1864,7 +1864,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
    statistic_increment(thd->status_var.com_stat[SQLCOM_SHOW_FIELDS],
			&LOCK_status);
    bzero((char*) &table_list,sizeof(table_list));
    if (thd->copy_db_to(&table_list.db, 0))
    if (thd->copy_db_to(&table_list.db, &table_list.db_length))
      break;
    pend= strend(packet);
    thd->convert_string(&conv_name, system_charset_info,
+14 −0
Original line number Diff line number Diff line
@@ -1008,8 +1008,19 @@ bool mysql_make_view(THD *thd, File_parser *parser, TABLE_LIST *table,
  table->view= lex= thd->lex= (LEX*) new(thd->mem_root) st_lex_local;

  {
    char old_db_buf[NAME_LEN+1];
    LEX_STRING old_db= { old_db_buf, sizeof(old_db_buf) };
    bool dbchanged;
    Lex_input_stream lip(thd, table->query.str, table->query.length);
    thd->m_lip= &lip;

    /* 
      Use view db name as thread default database, in order to ensure
      that the view is parsed and prepared correctly.
    */
    if ((result= sp_use_new_db(thd, table->view_db, &old_db, 1, &dbchanged)))
      goto end;

    lex_start(thd);
    view_select= &lex->select_lex;
    view_select->select_number= ++thd->select_number;
@@ -1051,6 +1062,9 @@ bool mysql_make_view(THD *thd, File_parser *parser, TABLE_LIST *table,

    thd->variables.character_set_client= save_cs;
    thd->variables.sql_mode= save_mode;

    if (dbchanged && mysql_change_db(thd, &old_db, TRUE))
      goto err;
  }
  if (!res && !thd->is_fatal_error)
  {