Commit d25a6a3b authored by unknown's avatar unknown

Merge sanja.is.com.ua:/home/bell/mysql/bk/mysql-5.0

into  sanja.is.com.ua:/home/bell/mysql/bk/work-merge-5.1


configure.in:
  Auto merged
mysql-test/r/query_cache.result:
  Auto merged
mysql-test/r/sp.result:
  Auto merged
mysql-test/r/view.result:
  Auto merged
mysql-test/t/query_cache.test:
  Auto merged
mysql-test/t/view.test:
  Auto merged
sql/sp_head.cc:
  Auto merged
sql/sql_view.cc:
  Auto merged
sql/sql_yacc.yy:
  Auto merged
sql/sql_cache.cc:
  merge
sql/sql_lex.h:
  merge
parents 211dc1d4 07b81edb
...@@ -4099,4 +4099,58 @@ call bug14376(4711)| ...@@ -4099,4 +4099,58 @@ call bug14376(4711)|
x x
4711 4711
drop procedure bug14376| drop procedure bug14376|
drop procedure if exists p1|
Warnings:
Note 1305 PROCEDURE p1 does not exist
drop table if exists t1|
create table t1 (a varchar(255))|
insert into t1 (a) values ("a - table column")|
create procedure p1(a varchar(255))
begin
declare i varchar(255);
declare c cursor for select a from t1;
select a;
select a from t1 into i;
select i as 'Parameter takes precedence over table column'; open c;
fetch c into i;
close c;
select i as 'Parameter takes precedence over table column in cursors';
begin
declare a varchar(255) default 'a - local variable';
declare c1 cursor for select a from t1;
select a as 'A local variable takes precedence over parameter';
open c1;
fetch c1 into i;
close c1;
select i as 'A local variable takes precedence over parameter in cursors';
begin
declare a varchar(255) default 'a - local variable in a nested compound statement';
declare c2 cursor for select a from t1;
select a as 'A local variable in a nested compound statement takes precedence over a local variable in the outer statement';
select a from t1 into i;
select i as 'A local variable in a nested compound statement takes precedence over table column';
open c2;
fetch c2 into i;
close c2;
select i as 'A local variable in a nested compound statement takes precedence over table column in cursors';
end;
end;
end|
call p1("a - stored procedure parameter")|
a
a - stored procedure parameter
Parameter takes precedence over table column
a - stored procedure parameter
Parameter takes precedence over table column in cursors
a - stored procedure parameter
A local variable takes precedence over parameter
a - local variable
A local variable takes precedence over parameter in cursors
a - local variable
A local variable in a nested compound statement takes precedence over a local variable in the outer statement
a - local variable in a nested compound statement
A local variable in a nested compound statement takes precedence over table column
a - local variable in a nested compound statement
A local variable in a nested compound statement takes precedence over table column in cursors
a - local variable in a nested compound statement
drop table t1,t2; drop table t1,t2;
...@@ -2424,3 +2424,30 @@ f1 sum(f2) ...@@ -2424,3 +2424,30 @@ f1 sum(f2)
NULL 12 NULL 12
drop view v1; drop view v1;
drop table t1; 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;
CREATE VIEW v1 AS SELECT 42 AS Meaning;
DROP FUNCTION IF EXISTS f1;
CREATE FUNCTION f1() RETURNS INTEGER
BEGIN
DECLARE retn INTEGER;
SELECT Meaning FROM v1 INTO retn;
RETURN retn;
END
//
CREATE VIEW v2 AS SELECT f1();
select * from v2;
f1()
42
drop view v2,v1;
drop function f1;
...@@ -132,4 +132,65 @@ unlock tables; ...@@ -132,4 +132,65 @@ unlock tables;
set query_cache_wlock_invalidate=default; set query_cache_wlock_invalidate=default;
drop view v1; drop view v1;
drop table t1; drop table t1;
flush status;
create table t1 (a int, b int);
create algorithm=temptable view v1 as select * from t1;
select * from v1;
a b
show status like "Qcache_queries_in_cache";
Variable_name Value
Qcache_queries_in_cache 1
show status like "Qcache_inserts";
Variable_name Value
Qcache_inserts 1
show status like "Qcache_hits";
Variable_name Value
Qcache_hits 0
select * from v1;
a b
show status like "Qcache_queries_in_cache";
Variable_name Value
Qcache_queries_in_cache 1
show status like "Qcache_inserts";
Variable_name Value
Qcache_inserts 1
show status like "Qcache_hits";
Variable_name Value
Qcache_hits 1
insert into t1 values (1,1);
show status like "Qcache_queries_in_cache";
Variable_name Value
Qcache_queries_in_cache 0
show status like "Qcache_inserts";
Variable_name Value
Qcache_inserts 1
show status like "Qcache_hits";
Variable_name Value
Qcache_hits 1
select * from v1;
a b
1 1
select * from v1;
a b
1 1
show status like "Qcache_queries_in_cache";
Variable_name Value
Qcache_queries_in_cache 1
show status like "Qcache_inserts";
Variable_name Value
Qcache_inserts 2
show status like "Qcache_hits";
Variable_name Value
Qcache_hits 2
drop view v1;
show status like "Qcache_queries_in_cache";
Variable_name Value
Qcache_queries_in_cache 0
show status like "Qcache_inserts";
Variable_name Value
Qcache_inserts 2
show status like "Qcache_hits";
Variable_name Value
Qcache_hits 2
drop table t1;
set GLOBAL query_cache_size=default; set GLOBAL query_cache_size=default;
...@@ -760,7 +760,6 @@ show status like "Qcache_queries_in_cache"; ...@@ -760,7 +760,6 @@ show status like "Qcache_queries_in_cache";
show status like "Qcache_inserts"; show status like "Qcache_inserts";
show status like "Qcache_hits"; show status like "Qcache_hits";
drop table t1; drop table t1;
# SP cursors and selects with query cache (BUG#9715) # SP cursors and selects with query cache (BUG#9715)
# #
create table t1 (a int); create table t1 (a int);
......
...@@ -4898,7 +4898,52 @@ call bug14376(4711)| ...@@ -4898,7 +4898,52 @@ call bug14376(4711)|
drop procedure bug14376| drop procedure bug14376|
#
# Bug#5967 "Stored procedure declared variable used instead of column"
# The bug should be fixed later.
# Test precedence of names of parameters, variable declarations,
# variable declarations in nested compound statements, table columns,
# table columns in cursor declarations.
# According to the standard, table columns take precedence over
# variable declarations. In MySQL 5.0 it's vice versa.
#
drop procedure if exists p1|
drop table if exists t1|
create table t1 (a varchar(255))|
insert into t1 (a) values ("a - table column")|
create procedure p1(a varchar(255))
begin
declare i varchar(255);
declare c cursor for select a from t1;
select a;
select a from t1 into i;
select i as 'Parameter takes precedence over table column'; open c;
fetch c into i;
close c;
select i as 'Parameter takes precedence over table column in cursors';
begin
declare a varchar(255) default 'a - local variable';
declare c1 cursor for select a from t1;
select a as 'A local variable takes precedence over parameter';
open c1;
fetch c1 into i;
close c1;
select i as 'A local variable takes precedence over parameter in cursors';
begin
declare a varchar(255) default 'a - local variable in a nested compound statement';
declare c2 cursor for select a from t1;
select a as 'A local variable in a nested compound statement takes precedence over a local variable in the outer statement';
select a from t1 into i;
select i as 'A local variable in a nested compound statement takes precedence over table column';
open c2;
fetch c2 into i;
close c2;
select i as 'A local variable in a nested compound statement takes precedence over table column in cursors';
end;
end;
end|
call p1("a - stored procedure parameter")|
# #
# BUG#NNNN: New bug synopsis # BUG#NNNN: New bug synopsis
......
...@@ -2284,3 +2284,43 @@ create view v1 as select * from t1; ...@@ -2284,3 +2284,43 @@ create view v1 as select * from t1;
select f1, sum(f2) from v1 group by f1; select f1, sum(f2) from v1 group by f1;
drop view v1; drop view v1;
drop table t1; 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;
#
# BUG#15096: using function with view for view creation
#
CREATE VIEW v1 AS SELECT 42 AS Meaning;
--disable_warnings
DROP FUNCTION IF EXISTS f1;
--enable_warnings
DELIMITER //;
CREATE FUNCTION f1() RETURNS INTEGER
BEGIN
DECLARE retn INTEGER;
SELECT Meaning FROM v1 INTO retn;
RETURN retn;
END
//
DELIMITER ;//
CREATE VIEW v2 AS SELECT f1();
select * from v2;
drop view v2,v1;
drop function f1;
...@@ -96,4 +96,35 @@ unlock tables; ...@@ -96,4 +96,35 @@ unlock tables;
set query_cache_wlock_invalidate=default; set query_cache_wlock_invalidate=default;
drop view v1; drop view v1;
drop table t1; drop table t1;
#
# BUG#15119: returning temptable view from the query cache.
#
flush status;
create table t1 (a int, b int);
create algorithm=temptable view v1 as select * from t1;
select * from v1;
show status like "Qcache_queries_in_cache";
show status like "Qcache_inserts";
show status like "Qcache_hits";
select * from v1;
show status like "Qcache_queries_in_cache";
show status like "Qcache_inserts";
show status like "Qcache_hits";
insert into t1 values (1,1);
show status like "Qcache_queries_in_cache";
show status like "Qcache_inserts";
show status like "Qcache_hits";
select * from v1;
select * from v1;
show status like "Qcache_queries_in_cache";
show status like "Qcache_inserts";
show status like "Qcache_hits";
drop view v1;
show status like "Qcache_queries_in_cache";
show status like "Qcache_inserts";
show status like "Qcache_hits";
drop table t1;
# Reset default environment.
set GLOBAL query_cache_size=default; set GLOBAL query_cache_size=default;
...@@ -960,8 +960,12 @@ int sp_head::execute(THD *thd) ...@@ -960,8 +960,12 @@ int sp_head::execute(THD *thd)
m_first_instance->m_first_free_instance= m_next_cached_sp; 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", 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, (ulong)m_first_instance, this, m_next_cached_sp,
m_next_cached_sp->m_recursion_level, (m_next_cached_sp ?
m_next_cached_sp->m_flags)); 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 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 pointer to the last instance points on this instance or if there are
......
...@@ -996,9 +996,9 @@ Query_cache::send_result_to_client(THD *thd, char *sql, uint query_length) ...@@ -996,9 +996,9 @@ Query_cache::send_result_to_client(THD *thd, char *sql, uint query_length)
check all such queries, too. check all such queries, too.
*/ */
if ((my_toupper(system_charset_info, sql[i]) != 'S' || if ((my_toupper(system_charset_info, sql[i]) != 'S' ||
my_toupper(system_charset_info, sql[i + 1]) != 'E' || my_toupper(system_charset_info, sql[i + 1]) != 'E' ||
my_toupper(system_charset_info, sql[i + 2]) != 'L') && my_toupper(system_charset_info, sql[i + 2]) != 'L') &&
sql[0] != '/') sql[0] != '/')
{ {
DBUG_PRINT("qcache", ("The statement is not a SELECT; Not cached")); DBUG_PRINT("qcache", ("The statement is not a SELECT; Not cached"));
goto err; goto err;
...@@ -2196,7 +2196,7 @@ Query_cache::register_tables_from_list(TABLE_LIST *tables_used, ...@@ -2196,7 +2196,7 @@ Query_cache::register_tables_from_list(TABLE_LIST *tables_used,
tables_used; tables_used;
tables_used= tables_used->next_global, n++, block_table++) tables_used= tables_used->next_global, n++, block_table++)
{ {
if (tables_used->derived) if (tables_used->derived && !tables_used->view)
{ {
DBUG_PRINT("qcache", ("derived table skipped")); DBUG_PRINT("qcache", ("derived table skipped"));
n--; n--;
......
...@@ -754,8 +754,8 @@ typedef struct st_lex ...@@ -754,8 +754,8 @@ typedef struct st_lex
TABLE_LIST **query_tables_last; TABLE_LIST **query_tables_last;
/* store original leaf_tables for INSERT SELECT and PS/SP */ /* store original leaf_tables for INSERT SELECT and PS/SP */
TABLE_LIST *leaf_tables_insert; TABLE_LIST *leaf_tables_insert;
char *create_view_start; /* Position (first character index) of SELECT of CREATE VIEW statement */
char *create_view_select_start; uint create_view_select_start;
/* Partition info structure filled in by PARTITION BY parse part */ /* Partition info structure filled in by PARTITION BY parse part */
partition_info *part_info; partition_info *part_info;
......
...@@ -350,15 +350,6 @@ bool mysql_create_view(THD *thd, ...@@ -350,15 +350,6 @@ bool mysql_create_view(THD *thd,
*/ */
for (tbl= lex->query_tables; tbl; tbl= tbl->next_global) for (tbl= lex->query_tables; tbl; tbl= tbl->next_global)
{ {
/* is this table temporary and is not view? */
if (tbl->table->s->tmp_table != NO_TMP_TABLE && !tbl->view &&
!tbl->schema_table)
{
my_error(ER_VIEW_SELECT_TMPTABLE, MYF(0), tbl->alias);
res= TRUE;
goto err;
}
/* is this table view and the same view which we creates now? */ /* is this table view and the same view which we creates now? */
if (tbl->view && if (tbl->view &&
strcmp(tbl->view_db.str, view->db) == 0 && strcmp(tbl->view_db.str, view->db) == 0 &&
...@@ -370,11 +361,29 @@ bool mysql_create_view(THD *thd, ...@@ -370,11 +361,29 @@ bool mysql_create_view(THD *thd,
} }
/* /*
Copy the privileges of the underlying VIEWs which were filled by tbl->table can be NULL when tbl is a placeholder for a view
fill_effective_table_privileges that is indirectly referenced via a stored function from the
(they were not copied at derived tables processing) view being created. We don't check these indirectly
referenced views in CREATE VIEW so they don't have table
object.
*/ */
tbl->table->grant.privilege= tbl->grant.privilege; if (tbl->table)
{
/* is this table temporary and is not view? */
if (tbl->table->s->tmp_table != NO_TMP_TABLE && !tbl->view &&
!tbl->schema_table)
{
my_error(ER_VIEW_SELECT_TMPTABLE, MYF(0), tbl->alias);
res= TRUE;
goto err;
}
/*
Copy the privileges of the underlying VIEWs which were filled by
fill_effective_table_privileges
(they were not copied at derived tables processing)
*/
tbl->table->grant.privilege= tbl->grant.privilege;
}
} }
/* prepare select to resolve all fields */ /* prepare select to resolve all fields */
...@@ -641,10 +650,9 @@ static int mysql_register_view(THD *thd, TABLE_LIST *view, ...@@ -641,10 +650,9 @@ static int mysql_register_view(THD *thd, TABLE_LIST *view,
/* fill structure */ /* fill structure */
view->query.str= (char*)str.ptr(); view->query.str= (char*)str.ptr();
view->query.length= str.length()-1; // we do not need last \0 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 - view->source.length= (thd->query_length -
(thd->lex->create_view_select_start - thd->lex->create_view_select_start);
thd->lex->create_view_start));
view->file_version= 1; view->file_version= 1;
view->calc_md5(md5); view->calc_md5(md5);
view->md5.str= md5; view->md5.str= md5;
......
...@@ -3912,7 +3912,6 @@ alter: ...@@ -3912,7 +3912,6 @@ alter:
THD *thd= YYTHD; THD *thd= YYTHD;
LEX *lex= thd->lex; LEX *lex= thd->lex;
lex->sql_command= SQLCOM_CREATE_VIEW; lex->sql_command= SQLCOM_CREATE_VIEW;
lex->create_view_start= thd->query;
lex->create_view_mode= VIEW_ALTER; lex->create_view_mode= VIEW_ALTER;
/* first table in list is target VIEW name */ /* first table in list is target VIEW name */
lex->select_lex.add_table_to_list(thd, $6, NULL, 0); lex->select_lex.add_table_to_list(thd, $6, NULL, 0);
...@@ -9633,7 +9632,6 @@ view_tail: ...@@ -9633,7 +9632,6 @@ view_tail:
THD *thd= YYTHD; THD *thd= YYTHD;
LEX *lex= thd->lex; LEX *lex= thd->lex;
lex->sql_command= SQLCOM_CREATE_VIEW; lex->sql_command= SQLCOM_CREATE_VIEW;
lex->create_view_start= thd->query;
/* first table in list is target VIEW name */ /* first table in list is target VIEW name */
if (!lex->select_lex.add_table_to_list(thd, $3, NULL, 0)) if (!lex->select_lex.add_table_to_list(thd, $3, NULL, 0))
YYABORT; YYABORT;
...@@ -9664,11 +9662,21 @@ view_list: ...@@ -9664,11 +9662,21 @@ view_list:
view_select: view_select:
SELECT_SYM remember_name select_init2 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 | '(' 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;
} }
; ;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment