Commit a74247bd authored by tulin@dl145c.mysql.com's avatar tulin@dl145c.mysql.com

Merge tulin@bk-internal.mysql.com:/home/bk/mysql-5.0

into dl145c.mysql.com:/home/ndbdev/tomas/mysql-5.1
parents f07c0e80 303dafc5
This diff is collapsed.
...@@ -756,4 +756,36 @@ flush query cache; ...@@ -756,4 +756,36 @@ flush query cache;
drop table t1, t2; drop table t1, t2;
#
# SP cursors and selects with query cache (BUG#9715)
#
create table t1 (a int);
insert into t1 values (1),(2);
delimiter //;
CREATE PROCEDURE `p1`()
begin
Declare c1 cursor for select a from t1;
open c1;
select * from t1;
end//
call p1()//
drop procedure p1;
create function f1() returns int
begin
Declare var1 int;
select max(a) from t1 into var1;
return var1;
end//
create procedure `p1`()
begin
select a, f1() from t1;
end//
call p1()//
drop procedure p1//
drop table t1//
delimiter ;//
set GLOBAL query_cache_size=0; set GLOBAL query_cache_size=0;
...@@ -1352,12 +1352,9 @@ public: ...@@ -1352,12 +1352,9 @@ public:
{ {
(*ref)->save_in_field(result_field, no_conversions); (*ref)->save_in_field(result_field, no_conversions);
} }
Item *real_item() { Item *real_item()
Item *item= this; {
do return (*ref)->real_item();
item= *((Item_ref *)item)->ref;
while (item->type() == Item::REF_ITEM);
return item;
} }
bool walk(Item_processor processor, byte *arg) bool walk(Item_processor processor, byte *arg)
{ return (*ref)->walk(processor, arg); } { return (*ref)->walk(processor, arg); }
......
...@@ -377,6 +377,10 @@ public: ...@@ -377,6 +377,10 @@ public:
return (uint)m_lex->sql_command; return (uint)m_lex->sql_command;
} }
void disable_query_cache()
{
m_lex->safe_to_cache_query= 0;
}
private: private:
LEX *m_lex; LEX *m_lex;
......
...@@ -169,6 +169,17 @@ sp_rcontext::pop_cursors(uint count) ...@@ -169,6 +169,17 @@ sp_rcontext::pop_cursors(uint count)
* *
*/ */
sp_cursor::sp_cursor(sp_lex_keeper *lex_keeper)
:m_lex_keeper(lex_keeper), m_prot(NULL), m_isopen(0), m_current_row(NULL)
{
/*
currsor can't be stored in QC, so we should prevent opening QC for
try to write results which are absent.
*/
lex_keeper->disable_query_cache();
}
/* /*
pre_open cursor pre_open cursor
......
...@@ -203,11 +203,7 @@ class sp_cursor : public Sql_alloc ...@@ -203,11 +203,7 @@ class sp_cursor : public Sql_alloc
{ {
public: public:
sp_cursor(sp_lex_keeper *lex_keeper) sp_cursor(sp_lex_keeper *lex_keeper);
: m_lex_keeper(lex_keeper), m_prot(NULL), m_isopen(0), m_current_row(NULL)
{
/* Empty */
}
virtual ~sp_cursor() virtual ~sp_cursor()
{ {
......
...@@ -7954,7 +7954,7 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, ...@@ -7954,7 +7954,7 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
convert_blob_length); convert_blob_length);
} }
case Item::REF_ITEM: case Item::REF_ITEM:
if ( ((Item_ref*)item)->real_item()->type() == Item::FIELD_ITEM) if ( item->real_item()->type() == Item::FIELD_ITEM)
{ {
Item_field *field= (Item_field*) *((Item_ref*)item)->ref; Item_field *field= (Item_field*) *((Item_ref*)item)->ref;
Field *new_field= create_tmp_field_from_field(thd, Field *new_field= create_tmp_field_from_field(thd,
......
...@@ -13156,14 +13156,24 @@ static void test_bug11111() ...@@ -13156,14 +13156,24 @@ static void test_bug11111()
char buf[2][20]; char buf[2][20];
long len[2]; long len[2];
int i; int i;
int rc;
const char * query = "SELECT DISTINCT f1,ff2 FROM v1"; const char * query = "SELECT DISTINCT f1,ff2 FROM v1";
myheader("test_bug11111");
mysql_query(mysql, "drop table if exists t1, t2, v1"); rc= mysql_query(mysql, "drop table if exists t1, t2, v1");
mysql_query(mysql, "create table t1 (f1 int, f2 int)"); myquery(rc);
mysql_query(mysql, "create table t2 (ff1 int, ff2 int)"); rc= mysql_query(mysql, "drop view if exists t1, t2, v1");
mysql_query(mysql, "create view v1 as select * from t1, t2 where f1=ff1"); myquery(rc);
mysql_query(mysql, "insert into t1 values (1,1), (2,2), (3,3)"); rc= mysql_query(mysql, "create table t1 (f1 int, f2 int)");
mysql_query(mysql, "insert into t2 values (1,1), (2,2), (3,3)"); myquery(rc);
rc= mysql_query(mysql, "create table t2 (ff1 int, ff2 int)");
myquery(rc);
rc= mysql_query(mysql, "create view v1 as select * from t1, t2 where f1=ff1");
myquery(rc);
rc= mysql_query(mysql, "insert into t1 values (1,1), (2,2), (3,3)");
myquery(rc);
rc= mysql_query(mysql, "insert into t2 values (1,1), (2,2), (3,3)");
myquery(rc);
stmt = mysql_stmt_init(mysql); stmt = mysql_stmt_init(mysql);
...@@ -13176,15 +13186,19 @@ static void test_bug11111() ...@@ -13176,15 +13186,19 @@ static void test_bug11111()
bind[i].buffer= (gptr *)&buf[i]; bind[i].buffer= (gptr *)&buf[i];
bind[i].buffer_length= 20; bind[i].buffer_length= 20;
bind[i].length= &len[i]; bind[i].length= &len[i];
} }
if (mysql_stmt_bind_result(stmt, bind)) if (mysql_stmt_bind_result(stmt, bind))
printf("Error: %s\n", mysql_stmt_error(stmt)); printf("Error: %s\n", mysql_stmt_error(stmt));
mysql_stmt_fetch(stmt); mysql_stmt_fetch(stmt);
DIE_UNLESS(!strcmp(buf[1],"1")); printf("return: %s", buf[1]);
DIE_UNLESS(!strcmp(buf[1],"1"));
mysql_stmt_close(stmt); mysql_stmt_close(stmt);
mysql_query(mysql, "drop table t1, t2, v1"); rc= mysql_query(mysql, "drop view v1");
myquery(rc);
rc= mysql_query(mysql, "drop table t1, t2");
myquery(rc);
} }
/* /*
......
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