Commit 9c51a97e authored by aivanov@mysql.com's avatar aivanov@mysql.com

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

into  mysql.com:/home/alexi/mysql-5.0
parents d6398c1a ff588b47
...@@ -765,3 +765,24 @@ OPTIMIZE TABLE t1; ...@@ -765,3 +765,24 @@ OPTIMIZE TABLE t1;
RETURN 1; RETURN 1;
END| END|
ERROR 0A000: OPTIMIZE TABLE is not allowed in stored procedures ERROR 0A000: OPTIMIZE TABLE is not allowed in stored procedures
DROP FUNCTION IF EXISTS bug12995|
CREATE FUNCTION bug12995() RETURNS INT
BEGIN
HANDLER t1 OPEN;
RETURN 1;
END|
ERROR 0A000: HANDLER is not allowed in stored procedures
CREATE FUNCTION bug12995() RETURNS INT
BEGIN
HANDLER t1 READ FIRST;
RETURN 1;
END|
ERROR 0A000: HANDLER is not allowed in stored procedures
CREATE FUNCTION bug12995() RETURNS INT
BEGIN
HANDLER t1 CLOSE;
RETURN 1;
END|
ERROR 0A000: HANDLER is not allowed in stored procedures
SELECT bug12995()|
ERROR 42000: FUNCTION test.bug12995 does not exist
...@@ -2151,6 +2151,15 @@ select * from v1; ...@@ -2151,6 +2151,15 @@ select * from v1;
strcmp(f1,'a') strcmp(f1,'a')
drop view v1; drop view v1;
drop table t1; drop table t1;
create table t1 (f1 int, f2 int,f3 int);
insert into t1 values (1,10,20),(2,0,0);
create view v1 as select * from t1;
select if(sum(f1)>1,f2,f3) from v1 group by f1;
if(sum(f1)>1,f2,f3)
20
0
drop view v1;
drop table t1;
create table t1 ( create table t1 (
r_object_id char(16) NOT NULL, r_object_id char(16) NOT NULL,
group_name varchar(32) NOT NULL group_name varchar(32) NOT NULL
......
...@@ -1099,6 +1099,36 @@ BEGIN ...@@ -1099,6 +1099,36 @@ BEGIN
OPTIMIZE TABLE t1; OPTIMIZE TABLE t1;
RETURN 1; RETURN 1;
END| END|
delimiter ;|
#
# Bug##12995 "Inside function "Table 't4' was not locked with LOCK TABLES"
#
delimiter |;
--disable_warnings
DROP FUNCTION IF EXISTS bug12995|
--enable_warnings
--error ER_SP_BADSTATEMENT
CREATE FUNCTION bug12995() RETURNS INT
BEGIN
HANDLER t1 OPEN;
RETURN 1;
END|
--error ER_SP_BADSTATEMENT
CREATE FUNCTION bug12995() RETURNS INT
BEGIN
HANDLER t1 READ FIRST;
RETURN 1;
END|
--error ER_SP_BADSTATEMENT
CREATE FUNCTION bug12995() RETURNS INT
BEGIN
HANDLER t1 CLOSE;
RETURN 1;
END|
--error 1305
SELECT bug12995()|
delimiter ;|
# #
# BUG#NNNN: New bug synopsis # BUG#NNNN: New bug synopsis
......
...@@ -2020,6 +2020,14 @@ drop view v1; ...@@ -2020,6 +2020,14 @@ drop view v1;
drop table t1; drop table t1;
# #
# Bug #12922 if(sum(),...) with group from view returns wrong results
#
create table t1 (f1 int, f2 int,f3 int);
insert into t1 values (1,10,20),(2,0,0);
create view v1 as select * from t1;
select if(sum(f1)>1,f2,f3) from v1 group by f1;
drop view v1;
drop table t1;
# BUG#12941 # BUG#12941
# #
create table t1 ( create table t1 (
......
...@@ -651,7 +651,8 @@ int ha_tina::rnd_init(bool scan) ...@@ -651,7 +651,8 @@ int ha_tina::rnd_init(bool scan)
records= 0; records= 0;
chain_ptr= chain; chain_ptr= chain;
#ifdef HAVE_MADVISE #ifdef HAVE_MADVISE
(void)madvise(share->mapped_file,share->file_stat.st_size,MADV_SEQUENTIAL); if (scan)
(void)madvise(share->mapped_file,share->file_stat.st_size,MADV_SEQUENTIAL);
#endif #endif
DBUG_RETURN(0); DBUG_RETURN(0);
......
...@@ -1022,9 +1022,9 @@ void Item::split_sum_func2(THD *thd, Item **ref_pointer_array, ...@@ -1022,9 +1022,9 @@ void Item::split_sum_func2(THD *thd, Item **ref_pointer_array,
/* Will split complicated items and ignore simple ones */ /* Will split complicated items and ignore simple ones */
split_sum_func(thd, ref_pointer_array, fields); split_sum_func(thd, ref_pointer_array, fields);
} }
else if ((type() == SUM_FUNC_ITEM || else if ((type() == SUM_FUNC_ITEM || (used_tables() & ~PARAM_TABLE_BIT)) &&
(used_tables() & ~PARAM_TABLE_BIT)) && (type() != REF_ITEM ||
type() != REF_ITEM) ((Item_ref*)this)->ref_type() == Item_ref::VIEW_REF))
{ {
/* /*
Replace item with a reference so that we can easily calculate Replace item with a reference so that we can easily calculate
...@@ -1033,15 +1033,17 @@ void Item::split_sum_func2(THD *thd, Item **ref_pointer_array, ...@@ -1033,15 +1033,17 @@ void Item::split_sum_func2(THD *thd, Item **ref_pointer_array,
The test above is to ensure we don't do a reference for things The test above is to ensure we don't do a reference for things
that are constants (PARAM_TABLE_BIT is in effect a constant) that are constants (PARAM_TABLE_BIT is in effect a constant)
or already referenced (for example an item in HAVING) or already referenced (for example an item in HAVING)
Exception is Item_direct_view_ref which we need to convert to
Item_ref to allow fields from view being stored in tmp table.
*/ */
uint el= fields.elements; uint el= fields.elements;
Item *new_item; Item *new_item, *real_itm= real_item();
ref_pointer_array[el]= this;
ref_pointer_array[el]= real_itm;
if (!(new_item= new Item_ref(&thd->lex->current_select->context, if (!(new_item= new Item_ref(&thd->lex->current_select->context,
ref_pointer_array + el, 0, name))) ref_pointer_array + el, 0, name)))
return; // fatal_error is set return; // fatal_error is set
fields.push_front(this); fields.push_front(real_itm);
ref_pointer_array[el]= this;
thd->change_item_tree(ref, new_item); thd->change_item_tree(ref, new_item);
} }
} }
......
...@@ -1537,6 +1537,7 @@ class Item_ref :public Item_ident ...@@ -1537,6 +1537,7 @@ class Item_ref :public Item_ident
protected: protected:
void set_properties(); void set_properties();
public: public:
enum Ref_Type { REF, DIRECT_REF, VIEW_REF };
Field *result_field; /* Save result here */ Field *result_field; /* Save result here */
Item **ref; Item **ref;
Item_ref(Name_resolution_context *context_arg, Item_ref(Name_resolution_context *context_arg,
...@@ -1617,6 +1618,7 @@ class Item_ref :public Item_ident ...@@ -1617,6 +1618,7 @@ class Item_ref :public Item_ident
void cleanup(); void cleanup();
Item_field *filed_for_view_update() Item_field *filed_for_view_update()
{ return (*ref)->filed_for_view_update(); } { return (*ref)->filed_for_view_update(); }
virtual Ref_Type ref_type() { return REF; }
}; };
...@@ -1641,6 +1643,7 @@ class Item_direct_ref :public Item_ref ...@@ -1641,6 +1643,7 @@ class Item_direct_ref :public Item_ref
bool val_bool(); bool val_bool();
bool is_null(); bool is_null();
bool get_date(TIME *ltime,uint fuzzydate); bool get_date(TIME *ltime,uint fuzzydate);
virtual Ref_Type ref_type() { return DIRECT_REF; }
}; };
/* /*
...@@ -1660,6 +1663,7 @@ class Item_direct_view_ref :public Item_direct_ref ...@@ -1660,6 +1663,7 @@ class Item_direct_view_ref :public Item_direct_ref
bool fix_fields(THD *, Item **); bool fix_fields(THD *, Item **);
bool eq(const Item *item, bool binary_cmp) const; bool eq(const Item *item, bool binary_cmp) const;
virtual Ref_Type ref_type() { return VIEW_REF; }
}; };
......
...@@ -8163,6 +8163,11 @@ handler: ...@@ -8163,6 +8163,11 @@ handler:
HANDLER_SYM table_ident OPEN_SYM opt_table_alias HANDLER_SYM table_ident OPEN_SYM opt_table_alias
{ {
LEX *lex= Lex; LEX *lex= Lex;
if (lex->sphead)
{
my_error(ER_SP_BADSTATEMENT, MYF(0), "HANDLER");
YYABORT;
}
lex->sql_command = SQLCOM_HA_OPEN; lex->sql_command = SQLCOM_HA_OPEN;
if (!lex->current_select->add_table_to_list(lex->thd, $2, $4, 0)) if (!lex->current_select->add_table_to_list(lex->thd, $2, $4, 0))
YYABORT; YYABORT;
...@@ -8170,6 +8175,11 @@ handler: ...@@ -8170,6 +8175,11 @@ handler:
| HANDLER_SYM table_ident_nodb CLOSE_SYM | HANDLER_SYM table_ident_nodb CLOSE_SYM
{ {
LEX *lex= Lex; LEX *lex= Lex;
if (lex->sphead)
{
my_error(ER_SP_BADSTATEMENT, MYF(0), "HANDLER");
YYABORT;
}
lex->sql_command = SQLCOM_HA_CLOSE; lex->sql_command = SQLCOM_HA_CLOSE;
if (!lex->current_select->add_table_to_list(lex->thd, $2, 0, 0)) if (!lex->current_select->add_table_to_list(lex->thd, $2, 0, 0))
YYABORT; YYABORT;
...@@ -8177,6 +8187,11 @@ handler: ...@@ -8177,6 +8187,11 @@ handler:
| HANDLER_SYM table_ident_nodb READ_SYM | HANDLER_SYM table_ident_nodb READ_SYM
{ {
LEX *lex=Lex; LEX *lex=Lex;
if (lex->sphead)
{
my_error(ER_SP_BADSTATEMENT, MYF(0), "HANDLER");
YYABORT;
}
lex->sql_command = SQLCOM_HA_READ; lex->sql_command = SQLCOM_HA_READ;
lex->ha_rkey_mode= HA_READ_KEY_EXACT; /* Avoid purify warnings */ lex->ha_rkey_mode= HA_READ_KEY_EXACT; /* Avoid purify warnings */
lex->current_select->select_limit= new Item_int((int32) 1); lex->current_select->select_limit= new Item_int((int32) 1);
......
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