summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <bell@sanja.is.com.ua>2005-12-02 21:18:12 +0200
committerunknown <bell@sanja.is.com.ua>2005-12-02 21:18:12 +0200
commitd65c5f103b76e08a87bdd66b44f1f4fa82e52fef (patch)
tree68ef4b9d68ef96bb3c8739f3c040c31da4baf232
parent7453e2c21cc9491d68d82567b513bfea72d98872 (diff)
downloadmariadb-git-d65c5f103b76e08a87bdd66b44f1f4fa82e52fef.tar.gz
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.
-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;
}
;