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
This commit is contained in:
commit
3d2d9c2259
@ -4099,4 +4099,58 @@ call bug14376(4711)|
|
||||
x
|
||||
4711
|
||||
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;
|
||||
|
@ -2424,3 +2424,30 @@ 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;
|
||||
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;
|
||||
set query_cache_wlock_invalidate=default;
|
||||
drop view v1;
|
||||
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;
|
||||
|
@ -760,7 +760,6 @@ show status like "Qcache_queries_in_cache";
|
||||
show status like "Qcache_inserts";
|
||||
show status like "Qcache_hits";
|
||||
drop table t1;
|
||||
|
||||
# SP cursors and selects with query cache (BUG#9715)
|
||||
#
|
||||
create table t1 (a int);
|
||||
|
@ -4898,7 +4898,52 @@ call bug14376(4711)|
|
||||
|
||||
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
|
||||
|
@ -2284,3 +2284,43 @@ 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;
|
||||
|
||||
#
|
||||
# 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;
|
||||
set query_cache_wlock_invalidate=default;
|
||||
drop view v1;
|
||||
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;
|
||||
|
@ -960,8 +960,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
|
||||
|
@ -996,9 +996,9 @@ Query_cache::send_result_to_client(THD *thd, char *sql, uint query_length)
|
||||
check all such queries, too.
|
||||
*/
|
||||
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 + 2]) != 'L') &&
|
||||
sql[0] != '/')
|
||||
my_toupper(system_charset_info, sql[i + 1]) != 'E' ||
|
||||
my_toupper(system_charset_info, sql[i + 2]) != 'L') &&
|
||||
sql[0] != '/')
|
||||
{
|
||||
DBUG_PRINT("qcache", ("The statement is not a SELECT; Not cached"));
|
||||
goto err;
|
||||
@ -2196,7 +2196,7 @@ Query_cache::register_tables_from_list(TABLE_LIST *tables_used,
|
||||
tables_used;
|
||||
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"));
|
||||
n--;
|
||||
|
@ -754,8 +754,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;
|
||||
/* Partition info structure filled in by PARTITION BY parse part */
|
||||
partition_info *part_info;
|
||||
|
||||
|
@ -350,15 +350,6 @@ bool mysql_create_view(THD *thd,
|
||||
*/
|
||||
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? */
|
||||
if (tbl->view &&
|
||||
strcmp(tbl->view_db.str, view->db) == 0 &&
|
||||
@ -370,11 +361,29 @@ bool mysql_create_view(THD *thd,
|
||||
}
|
||||
|
||||
/*
|
||||
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 can be NULL when tbl is a placeholder for a view
|
||||
that is indirectly referenced via a stored function from the
|
||||
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 */
|
||||
@ -641,10 +650,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;
|
||||
|
@ -3912,7 +3912,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);
|
||||
@ -9633,7 +9632,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;
|
||||
@ -9664,11 +9662,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;
|
||||
}
|
||||
;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user