summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/r/view.result12
-rw-r--r--mysql-test/t/view.test19
-rw-r--r--sql/sp_head.cc8
-rw-r--r--sql/sql_lex.h4
-rw-r--r--sql/sql_view.cc5
-rw-r--r--sql/sql_yacc.yy16
6 files changed, 53 insertions, 11 deletions
diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result
index ebb2c190eb1..5da6a4f95fd 100644
--- a/mysql-test/r/view.result
+++ b/mysql-test/r/view.result
@@ -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;
diff --git a/mysql-test/t/view.test b/mysql-test/t/view.test
index ac103278f08..be4fb571320 100644
--- a/mysql-test/t/view.test
+++ b/mysql-test/t/view.test
@@ -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;
diff --git a/sql/sp_head.cc b/sql/sp_head.cc
index a6e88c08789..179eebc0caf 100644
--- a/sql/sp_head.cc
+++ b/sql/sp_head.cc
@@ -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
diff --git a/sql/sql_lex.h b/sql/sql_lex.h
index 372bbc5576b..c3198beb4e9 100644
--- a/sql/sql_lex.h
+++ b/sql/sql_lex.h
@@ -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).
diff --git a/sql/sql_view.cc b/sql/sql_view.cc
index e03d3b22b89..3ca592dfd44 100644
--- a/sql/sql_view.cc
+++ b/sql/sql_view.cc
@@ -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;
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 671e2b1740d..88cc224308c 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -3374,7 +3374,6 @@ alter:
THD *thd= YYTHD;
LEX *lex= thd->lex;
lex->sql_command= SQLCOM_CREATE_VIEW;
- lex->create_view_start= thd->query;
lex->create_view_mode= VIEW_ALTER;
/* first table in list is target VIEW name */
lex->select_lex.add_table_to_list(thd, $6, NULL, 0);
@@ -8978,7 +8977,6 @@ view_tail:
THD *thd= YYTHD;
LEX *lex= thd->lex;
lex->sql_command= SQLCOM_CREATE_VIEW;
- lex->create_view_start= thd->query;
/* first table in list is target VIEW name */
if (!lex->select_lex.add_table_to_list(thd, $3, NULL, 0))
YYABORT;
@@ -9009,11 +9007,21 @@ view_list:
view_select:
SELECT_SYM remember_name select_init2
{
- Lex->create_view_select_start= $2;
+ THD *thd=YYTHD;
+ LEX *lex= thd->lex;
+ char *stmt_beg= (lex->sphead ?
+ (char *)lex->sphead->m_tmp_query :
+ thd->query);
+ lex->create_view_select_start= $2 - stmt_beg;
}
| '(' remember_name select_paren ')' union_opt
{
- Lex->create_view_select_start= $2;
+ THD *thd=YYTHD;
+ LEX *lex= thd->lex;
+ char *stmt_beg= (lex->sphead ?
+ (char *)lex->sphead->m_tmp_query :
+ thd->query);
+ lex->create_view_select_start= $2 - stmt_beg;
}
;