Commit 42022710 authored by unknown's avatar unknown
Browse files

Now we shall store only position (index of first character)

of SELECT from query begining, to be independet of query buffer
allocation.
Correct procedure used to find beginning of the current statement
during parsing (BUG#14885).


mysql-test/r/view.result:
  BUG#14885 test suite.
mysql-test/t/view.test:
  BUG#14885 test suite.
sql/sp_head.cc:
  The debug print statement fixed to prevent crash in case of NULL
  in m_next_cached_sp.
sql/sql_lex.h:
  Now we shall store only position (index of first character)
  of SELECT from query beginning.
sql/sql_view.cc:
  Position of the SELECT used to output it to .frm.
sql/sql_yacc.yy:
  Now we shall store only position (index of first character)
  of SELECT from query beginning.
  Correct procedure used to find beginning of the current statement
  during parsing.
parent 84da27f6
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -2424,3 +2424,15 @@ f1 sum(f2)
NULL	12
drop view v1;
drop table t1;
drop procedure if exists p1;
create procedure p1 () deterministic
begin
create view v1 as select 1;
end;
//
call p1();
show create view v1;
View	Create View
v1	CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select 1 AS `1`
drop view v1;
drop procedure p1;
+19 −0
Original line number Diff line number Diff line
@@ -2280,3 +2280,22 @@ create view v1 as select * from t1;
select f1, sum(f2) from v1 group by f1;
drop view v1;
drop table t1;

#
# BUG#14885: incorrect SOURCE in view created in a procedure
# TODO: here SOURCE string must be shown when it will be possible
#
--disable_warnings
drop procedure if exists p1;
--enable_warnings
delimiter //;
create procedure p1 () deterministic
begin
create view v1 as select 1;
end;
//
delimiter ;//
call p1();
show create view v1;
drop view v1;
drop procedure p1;
+6 −2
Original line number Diff line number Diff line
@@ -954,8 +954,12 @@ int sp_head::execute(THD *thd)
  m_first_instance->m_first_free_instance= m_next_cached_sp;
  DBUG_PRINT("info", ("first free for 0x%lx ++: 0x%lx->0x%lx, level: %lu, flags %x",
                      (ulong)m_first_instance, this, m_next_cached_sp,
                      m_next_cached_sp->m_recursion_level,
                      m_next_cached_sp->m_flags));
                      (m_next_cached_sp ?
                       m_next_cached_sp->m_recursion_level :
                       0),
                      (m_next_cached_sp ?
                       m_next_cached_sp->m_flags :
                       0)));
  /*
    Check that if there are not any instances after this one then
    pointer to the last instance points on this instance or if there are
+2 −2
Original line number Diff line number Diff line
@@ -738,8 +738,8 @@ typedef struct st_lex
  TABLE_LIST **query_tables_last;
  /* store original leaf_tables for INSERT SELECT and PS/SP */
  TABLE_LIST *leaf_tables_insert;
  char *create_view_start;
  char *create_view_select_start;
  /* Position (first character index) of SELECT of CREATE VIEW statement */
  uint create_view_select_start;

  /*
    The definer of the object being created (view, trigger, stored routine).
+2 −3
Original line number Diff line number Diff line
@@ -641,10 +641,9 @@ static int mysql_register_view(THD *thd, TABLE_LIST *view,
  /* fill structure */
  view->query.str= (char*)str.ptr();
  view->query.length= str.length()-1; // we do not need last \0
  view->source.str= thd->lex->create_view_select_start;
  view->source.str= thd->query + thd->lex->create_view_select_start;
  view->source.length= (thd->query_length -
                        (thd->lex->create_view_select_start -
                         thd->lex->create_view_start));
                        thd->lex->create_view_select_start);
  view->file_version= 1;
  view->calc_md5(md5);
  view->md5.str= md5;
Loading