Commit 749157d6 authored by kaa@kaamos.(none)'s avatar kaa@kaamos.(none)

Merge kaamos.(none):/data/src/opt/bug33305/my50-bug33305

into  kaamos.(none):/data/src/opt/mysql-5.0-opt
parents 578b3632 165dfa3e
...@@ -1407,4 +1407,16 @@ SELECT COUNT(*), a FROM t1; ...@@ -1407,4 +1407,16 @@ SELECT COUNT(*), a FROM t1;
COUNT(*) a COUNT(*) a
4 1 4 1
DROP TABLE t1; DROP TABLE t1;
set SQL_MODE=ONLY_FULL_GROUP_BY;
CREATE TABLE t1 (a INT);
INSERT INTO t1 VALUES (1),(2),(3),(4);
CREATE VIEW v1 AS SELECT a,(a + 1) AS y FROM t1;
EXPLAIN EXTENDED SELECT y FROM v1 GROUP BY v1.y;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 4 Using temporary; Using filesort
Warnings:
Note 1003 select (`test`.`t1`.`a` + 1) AS `y` from `test`.`t1` group by (`test`.`t1`.`a` + 1)
DROP VIEW v1;
DROP TABLE t1;
SET SQL_MODE=DEFAULT;
End of 5.0 tests End of 5.0 tests
...@@ -4383,4 +4383,13 @@ SELECT 2 FROM t1 WHERE EXISTS ((SELECT 1 FROM t2 WHERE t1.a=t2.a) UNION ...@@ -4383,4 +4383,13 @@ SELECT 2 FROM t1 WHERE EXISTS ((SELECT 1 FROM t2 WHERE t1.a=t2.a) UNION
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UNION ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UNION
(SELECT 1 FROM t2 WHERE t1.a = t2.a))' at line 2 (SELECT 1 FROM t2 WHERE t1.a = t2.a))' at line 2
DROP TABLE t1,t2; DROP TABLE t1,t2;
create table t1(f11 int, f12 int);
create table t2(f21 int unsigned not null, f22 int, f23 varchar(10));
insert into t1 values(1,1),(2,2), (3, 3);
set session sort_buffer_size= 33*1024;
select count(*) from t1 where f12 =
(select f22 from t2 where f22 = f12 order by f21 desc, f22, f23 limit 1);
count(*)
3
drop table t1,t2;
End of 5.0 tests. End of 5.0 tests.
...@@ -786,10 +786,6 @@ from (select 1 as s,'t' as t union select null, null ) as sub1; ...@@ -786,10 +786,6 @@ from (select 1 as s,'t' as t union select null, null ) as sub1;
select group_concat(t) from t1 group by week(date)/10; select group_concat(t) from t1 group by week(date)/10;
group_concat(t) group_concat(t)
t t
Warnings:
Warning 1292 Truncated incorrect datetime value: '0000-00-00'
Warning 1292 Truncated incorrect datetime value: '0000-00-00'
Warning 1292 Truncated incorrect datetime value: '0000-00-00'
drop table t1; drop table t1;
CREATE TABLE t1 ( CREATE TABLE t1 (
qty decimal(16,6) default NULL, qty decimal(16,6) default NULL,
......
...@@ -901,5 +901,20 @@ SELECT COUNT(*), a FROM t1; ...@@ -901,5 +901,20 @@ SELECT COUNT(*), a FROM t1;
DROP TABLE t1; DROP TABLE t1;
#
# Bug #33133: Views are not transparent
#
set SQL_MODE=ONLY_FULL_GROUP_BY;
CREATE TABLE t1 (a INT);
INSERT INTO t1 VALUES (1),(2),(3),(4);
CREATE VIEW v1 AS SELECT a,(a + 1) AS y FROM t1;
EXPLAIN EXTENDED SELECT y FROM v1 GROUP BY v1.y;
DROP VIEW v1;
DROP TABLE t1;
SET SQL_MODE=DEFAULT;
### ###
--echo End of 5.0 tests --echo End of 5.0 tests
...@@ -3230,4 +3230,26 @@ SELECT 2 FROM t1 WHERE EXISTS ((SELECT 1 FROM t2 WHERE t1.a=t2.a) UNION ...@@ -3230,4 +3230,26 @@ SELECT 2 FROM t1 WHERE EXISTS ((SELECT 1 FROM t2 WHERE t1.a=t2.a) UNION
DROP TABLE t1,t2; DROP TABLE t1,t2;
#
# Bug#33675: Usage of an uninitialized memory by filesort in a subquery
# caused server crash.
#
create table t1(f11 int, f12 int);
create table t2(f21 int unsigned not null, f22 int, f23 varchar(10));
insert into t1 values(1,1),(2,2), (3, 3);
let $i=10000;
--disable_query_log
--disable_warnings
while ($i)
{
eval insert into t2 values (-1 , $i/5000 + 1, '$i');
dec $i;
}
--enable_warnings
--enable_query_log
set session sort_buffer_size= 33*1024;
select count(*) from t1 where f12 =
(select f22 from t2 where f22 = f12 order by f21 desc, f22, f23 limit 1);
drop table t1,t2;
--echo End of 5.0 tests. --echo End of 5.0 tests.
...@@ -962,6 +962,10 @@ class Field_newdate :public Field_str { ...@@ -962,6 +962,10 @@ class Field_newdate :public Field_str {
:Field_str(ptr_arg, 10, null_ptr_arg, null_bit_arg, :Field_str(ptr_arg, 10, null_ptr_arg, null_bit_arg,
unireg_check_arg, field_name_arg, table_arg, cs) unireg_check_arg, field_name_arg, table_arg, cs)
{} {}
Field_newdate(bool maybe_null_arg, const char *field_name_arg,
struct st_table *table_arg, CHARSET_INFO *cs)
:Field_str((char*) 0,10, maybe_null_arg ? (uchar*) "": 0,0,
NONE, field_name_arg, table_arg, cs) {}
enum_field_types type() const { return FIELD_TYPE_DATE;} enum_field_types type() const { return FIELD_TYPE_DATE;}
enum_field_types real_type() const { return FIELD_TYPE_NEWDATE; } enum_field_types real_type() const { return FIELD_TYPE_NEWDATE; }
enum ha_base_keytype key_type() const { return HA_KEYTYPE_UINT24; } enum ha_base_keytype key_type() const { return HA_KEYTYPE_UINT24; }
......
...@@ -37,7 +37,8 @@ if (my_b_write((file),(byte*) (from),param->ref_length)) \ ...@@ -37,7 +37,8 @@ if (my_b_write((file),(byte*) (from),param->ref_length)) \
static char **make_char_array(char **old_pos, register uint fields, static char **make_char_array(char **old_pos, register uint fields,
uint length, myf my_flag); uint length, myf my_flag);
static BUFFPEK *read_buffpek_from_file(IO_CACHE *buffer_file, uint count); static byte *read_buffpek_from_file(IO_CACHE *buffer_file, uint count,
byte *buf);
static ha_rows find_all_keys(SORTPARAM *param,SQL_SELECT *select, static ha_rows find_all_keys(SORTPARAM *param,SQL_SELECT *select,
uchar * *sort_keys, IO_CACHE *buffer_file, uchar * *sort_keys, IO_CACHE *buffer_file,
IO_CACHE *tempfile,IO_CACHE *indexfile); IO_CACHE *tempfile,IO_CACHE *indexfile);
...@@ -238,9 +239,10 @@ ha_rows filesort(THD *thd, TABLE *table, SORT_FIELD *sortorder, uint s_length, ...@@ -238,9 +239,10 @@ ha_rows filesort(THD *thd, TABLE *table, SORT_FIELD *sortorder, uint s_length,
} }
else else
{ {
if (!table_sort.buffpek && table_sort.buffpek_len < maxbuffer && if (!(table_sort.buffpek=
!(table_sort.buffpek= read_buffpek_from_file(&buffpek_pointers, maxbuffer,
(byte *) read_buffpek_from_file(&buffpek_pointers, maxbuffer))) (table_sort.buffpek_len < maxbuffer ?
NULL : table_sort.buffpek))))
goto err; goto err;
buffpek= (BUFFPEK *) table_sort.buffpek; buffpek= (BUFFPEK *) table_sort.buffpek;
table_sort.buffpek_len= maxbuffer; table_sort.buffpek_len= maxbuffer;
...@@ -368,18 +370,20 @@ static char **make_char_array(char **old_pos, register uint fields, ...@@ -368,18 +370,20 @@ static char **make_char_array(char **old_pos, register uint fields,
/* Read 'count' number of buffer pointers into memory */ /* Read 'count' number of buffer pointers into memory */
static BUFFPEK *read_buffpek_from_file(IO_CACHE *buffpek_pointers, uint count) static byte *read_buffpek_from_file(IO_CACHE *buffpek_pointers, uint count,
byte *buf)
{ {
ulong length; ulong length= sizeof(BUFFPEK)*count;
BUFFPEK *tmp; byte *tmp= buf;
DBUG_ENTER("read_buffpek_from_file"); DBUG_ENTER("read_buffpek_from_file");
if (count > UINT_MAX/sizeof(BUFFPEK)) if (count > UINT_MAX/sizeof(BUFFPEK))
return 0; /* sizeof(BUFFPEK)*count will overflow */ return 0; /* sizeof(BUFFPEK)*count will overflow */
tmp=(BUFFPEK*) my_malloc(length=sizeof(BUFFPEK)*count, MYF(MY_WME)); if (!tmp)
tmp= (byte *)my_malloc(length, MYF(MY_WME));
if (tmp) if (tmp)
{ {
if (reinit_io_cache(buffpek_pointers,READ_CACHE,0L,0,0) || if (reinit_io_cache(buffpek_pointers,READ_CACHE,0L,0,0) ||
my_b_read(buffpek_pointers, (byte*) tmp, length)) my_b_read(buffpek_pointers, tmp, length))
{ {
my_free((char*) tmp, MYF(0)); my_free((char*) tmp, MYF(0));
tmp=0; tmp=0;
......
...@@ -4384,7 +4384,7 @@ Field *Item::tmp_table_field_from_field_type(TABLE *table) ...@@ -4384,7 +4384,7 @@ Field *Item::tmp_table_field_from_field_type(TABLE *table)
name, table, 0, unsigned_flag); name, table, 0, unsigned_flag);
case MYSQL_TYPE_NEWDATE: case MYSQL_TYPE_NEWDATE:
case MYSQL_TYPE_DATE: case MYSQL_TYPE_DATE:
return new Field_date(maybe_null, name, table, &my_charset_bin); return new Field_newdate(maybe_null, name, table, &my_charset_bin);
case MYSQL_TYPE_TIME: case MYSQL_TYPE_TIME:
return new Field_time(maybe_null, name, table, &my_charset_bin); return new Field_time(maybe_null, name, table, &my_charset_bin);
case MYSQL_TYPE_TIMESTAMP: case MYSQL_TYPE_TIMESTAMP:
......
...@@ -628,7 +628,7 @@ Field *Item_sum_hybrid::create_tmp_field(bool group, TABLE *table, ...@@ -628,7 +628,7 @@ Field *Item_sum_hybrid::create_tmp_field(bool group, TABLE *table,
*/ */
switch (args[0]->field_type()) { switch (args[0]->field_type()) {
case MYSQL_TYPE_DATE: case MYSQL_TYPE_DATE:
return new Field_date(maybe_null, name, table, collation.collation); return new Field_newdate(maybe_null, name, table, collation.collation);
case MYSQL_TYPE_TIME: case MYSQL_TYPE_TIME:
return new Field_time(maybe_null, name, table, collation.collation); return new Field_time(maybe_null, name, table, collation.collation);
case MYSQL_TYPE_TIMESTAMP: case MYSQL_TYPE_TIMESTAMP:
......
...@@ -3303,7 +3303,7 @@ Field *Item_func_str_to_date::tmp_table_field(TABLE *t_arg) ...@@ -3303,7 +3303,7 @@ Field *Item_func_str_to_date::tmp_table_field(TABLE *t_arg)
if (cached_field_type == MYSQL_TYPE_TIME) if (cached_field_type == MYSQL_TYPE_TIME)
return (new Field_time(maybe_null, name, t_arg, &my_charset_bin)); return (new Field_time(maybe_null, name, t_arg, &my_charset_bin));
if (cached_field_type == MYSQL_TYPE_DATE) if (cached_field_type == MYSQL_TYPE_DATE)
return (new Field_date(maybe_null, name, t_arg, &my_charset_bin)); return (new Field_newdate(maybe_null, name, t_arg, &my_charset_bin));
if (cached_field_type == MYSQL_TYPE_DATETIME) if (cached_field_type == MYSQL_TYPE_DATETIME)
return (new Field_datetime(maybe_null, name, t_arg, &my_charset_bin)); return (new Field_datetime(maybe_null, name, t_arg, &my_charset_bin));
return (new Field_string(max_length, maybe_null, name, t_arg, &my_charset_bin)); return (new Field_string(max_length, maybe_null, name, t_arg, &my_charset_bin));
......
...@@ -340,7 +340,7 @@ class Item_date :public Item_func ...@@ -340,7 +340,7 @@ class Item_date :public Item_func
} }
Field *tmp_table_field(TABLE *t_arg) Field *tmp_table_field(TABLE *t_arg)
{ {
return (new Field_date(maybe_null, name, t_arg, &my_charset_bin)); return (new Field_newdate(maybe_null, name, t_arg, &my_charset_bin));
} }
bool result_as_longlong() { return TRUE; } bool result_as_longlong() { return TRUE; }
my_decimal *val_decimal(my_decimal *decimal_value) my_decimal *val_decimal(my_decimal *decimal_value)
...@@ -784,7 +784,7 @@ class Item_date_typecast :public Item_typecast_maybe_null ...@@ -784,7 +784,7 @@ class Item_date_typecast :public Item_typecast_maybe_null
enum_field_types field_type() const { return MYSQL_TYPE_DATE; } enum_field_types field_type() const { return MYSQL_TYPE_DATE; }
Field *tmp_table_field(TABLE *t_arg) Field *tmp_table_field(TABLE *t_arg)
{ {
return (new Field_date(maybe_null, name, t_arg, &my_charset_bin)); return (new Field_newdate(maybe_null, name, t_arg, &my_charset_bin));
} }
void fix_length_and_dec() void fix_length_and_dec()
{ {
...@@ -884,7 +884,7 @@ class Item_func_makedate :public Item_date_func ...@@ -884,7 +884,7 @@ class Item_func_makedate :public Item_date_func
} }
Field *tmp_table_field(TABLE *t_arg) Field *tmp_table_field(TABLE *t_arg)
{ {
return (new Field_date(maybe_null, name, t_arg, &my_charset_bin)); return (new Field_newdate(maybe_null, name, t_arg, &my_charset_bin));
} }
longlong val_int(); longlong val_int();
my_decimal *val_decimal(my_decimal *decimal_value) my_decimal *val_decimal(my_decimal *decimal_value)
......
...@@ -4255,6 +4255,35 @@ find_item_in_list(Item *find, List<Item> &items, uint *counter, ...@@ -4255,6 +4255,35 @@ find_item_in_list(Item *find, List<Item> &items, uint *counter,
break; break;
} }
} }
else if (table_name && item->type() == Item::REF_ITEM &&
((Item_ref *)item)->ref_type() == Item_ref::VIEW_REF)
{
/*
TODO:Here we process prefixed view references only. What we should
really do is process all types of Item_refs. But this will currently
lead to a clash with the way references to outer SELECTs (from the
HAVING clause) are handled in e.g. :
SELECT 1 FROM t1 AS t1_o GROUP BY a
HAVING (SELECT t1_o.a FROM t1 AS t1_i GROUP BY t1_i.a LIMIT 1).
Processing all Item_refs here will cause t1_o.a to resolve to itself.
We still need to process the special case of Item_direct_view_ref
because in the context of views they have the same meaning as
Item_field for tables.
*/
Item_ident *item_ref= (Item_ident *) item;
if (item_ref->name && item_ref->table_name &&
!my_strcasecmp(system_charset_info, item_ref->name, field_name) &&
!my_strcasecmp(table_alias_charset, item_ref->table_name,
table_name) &&
(!db_name || (item_ref->db_name &&
!strcmp (item_ref->db_name, db_name))))
{
found= li.ref();
*counter= i;
*resolution= RESOLVED_IGNORING_ALIAS;
break;
}
}
} }
if (!found) if (!found)
{ {
......
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