diff options
author | unknown <bell@sanja.is.com.ua> | 2005-12-02 21:18:12 +0200 |
---|---|---|
committer | unknown <bell@sanja.is.com.ua> | 2005-12-02 21:18:12 +0200 |
commit | d65c5f103b76e08a87bdd66b44f1f4fa82e52fef (patch) | |
tree | 68ef4b9d68ef96bb3c8739f3c040c31da4baf232 | |
parent | 7453e2c21cc9491d68d82567b513bfea72d98872 (diff) | |
download | mariadb-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.result | 12 | ||||
-rw-r--r-- | mysql-test/t/view.test | 19 | ||||
-rw-r--r-- | sql/sp_head.cc | 8 | ||||
-rw-r--r-- | sql/sql_lex.h | 4 | ||||
-rw-r--r-- | sql/sql_view.cc | 5 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 16 |
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; } ; |