mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Merge tulin@bk-internal.mysql.com:/home/bk/mysql-5.0
into dl145c.mysql.com:/home/ndbdev/tomas/mysql-5.1 sql/sql_select.cc: Auto merged
This commit is contained in:
File diff suppressed because one or more lines are too long
@ -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:
|
|||||||
{
|
{
|
||||||
(*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:
|
|||||||
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)
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
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
|
|||||||
{
|
{
|
||||||
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,
|
|||||||
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()
|
|||||||
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()
|
|||||||
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Reference in New Issue
Block a user