Commit 30c343a0 authored by jimw@mysql.com's avatar jimw@mysql.com

Merge mysql.com:/home/jimw/my/mysql-5.0-clean

into  mysql.com:/home/jimw/my/mysql-5.1-clean
parents 10b96ec4 7182785f
...@@ -934,6 +934,7 @@ scripts/mysql_install_db ...@@ -934,6 +934,7 @@ scripts/mysql_install_db
scripts/mysql_secure_installation scripts/mysql_secure_installation
scripts/mysql_setpermission scripts/mysql_setpermission
scripts/mysql_tableinfo scripts/mysql_tableinfo
scripts/mysql_upgrade
scripts/mysql_zap scripts/mysql_zap
scripts/mysqlaccess scripts/mysqlaccess
scripts/mysqlbug scripts/mysqlbug
...@@ -1613,4 +1614,3 @@ vio/viotest-sslconnect.cpp ...@@ -1613,4 +1614,3 @@ vio/viotest-sslconnect.cpp
vio/viotest.cpp vio/viotest.cpp
zlib/*.ds? zlib/*.ds?
zlib/*.vcproj zlib/*.vcproj
scripts/mysql_upgrade
...@@ -1023,3 +1023,10 @@ select format(d, 2) from t1; ...@@ -1023,3 +1023,10 @@ select format(d, 2) from t1;
format(d, 2) format(d, 2)
NULL NULL
drop table t1; drop table t1;
create table t1 (c varchar(40));
insert into t1 values ('y,abc'),('y,abc');
select c, substring_index(lcase(c), @q:=',', -1) as res from t1;
c res
y,abc abc
y,abc abc
drop table t1;
...@@ -215,9 +215,9 @@ select * from t1 where t1.a=(select t2.a from t2 where t2.b=(select max(a) from ...@@ -215,9 +215,9 @@ select * from t1 where t1.a=(select t2.a from t2 where t2.b=(select max(a) from
a a
select b,(select avg(t2.a+(select min(t3.a) from t3 where t3.a >= t4.a)) from t2) from t4; select b,(select avg(t2.a+(select min(t3.a) from t3 where t3.a >= t4.a)) from t2) from t4;
b (select avg(t2.a+(select min(t3.a) from t3 where t3.a >= t4.a)) from t2) b (select avg(t2.a+(select min(t3.a) from t3 where t3.a >= t4.a)) from t2)
8 7.5 8 7.5000
8 4.5 8 4.5000
9 7.5 9 7.5000
explain extended select b,(select avg(t2.a+(select min(t3.a) from t3 where t3.a >= t4.a)) from t2) from t4; explain extended select b,(select avg(t2.a+(select min(t3.a) from t3 where t3.a >= t4.a)) from t2) from t4;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t4 ALL NULL NULL NULL NULL 3 1 PRIMARY t4 ALL NULL NULL NULL NULL 3
......
...@@ -42,7 +42,6 @@ rpl_row_basic_3innodb : Bug #17385 ...@@ -42,7 +42,6 @@ rpl_row_basic_3innodb : Bug #17385
rpl_sp : Bug#16456 rpl_sp : Bug#16456
rpl_until : Unstable test case, bug#15886 rpl_until : Unstable test case, bug#15886
sp-goto : GOTO is currently is disabled - will be fixed in the future sp-goto : GOTO is currently is disabled - will be fixed in the future
subselect : Bug#15706 (ps mode) [PATCH PENDING]
rpl_ndb_blob : Bug #17505 rpl_ndb_blob : Bug #17505
rpl_ndb_blob2 : Bug #17505 rpl_ndb_blob2 : Bug #17505
rpl_ndb_log : results are not deterministic rpl_ndb_log : results are not deterministic
...@@ -676,4 +676,12 @@ insert into t1 values (null); ...@@ -676,4 +676,12 @@ insert into t1 values (null);
select format(d, 2) from t1; select format(d, 2) from t1;
drop table t1; drop table t1;
#
# Bug #14676: substring_index() returns incorrect results
#
create table t1 (c varchar(40));
insert into t1 values ('y,abc'),('y,abc');
select c, substring_index(lcase(c), @q:=',', -1) as res from t1;
drop table t1;
# End of 5.0 tests # End of 5.0 tests
This diff is collapsed.
...@@ -1205,6 +1205,7 @@ class Item_field :public Item_ident ...@@ -1205,6 +1205,7 @@ class Item_field :public Item_ident
inline uint32 max_disp_length() { return field->max_length(); } inline uint32 max_disp_length() { return field->max_length(); }
Item_field *filed_for_view_update() { return this; } Item_field *filed_for_view_update() { return this; }
Item *safe_charset_converter(CHARSET_INFO *tocs); Item *safe_charset_converter(CHARSET_INFO *tocs);
int fix_outer_field(THD *thd, Field **field, Item **reference);
friend class Item_default_value; friend class Item_default_value;
friend class Item_insert_value; friend class Item_insert_value;
friend class st_select_lex_unit; friend class st_select_lex_unit;
......
...@@ -1128,9 +1128,9 @@ void Item_func_substr_index::fix_length_and_dec() ...@@ -1128,9 +1128,9 @@ void Item_func_substr_index::fix_length_and_dec()
String *Item_func_substr_index::val_str(String *str) String *Item_func_substr_index::val_str(String *str)
{ {
DBUG_ASSERT(fixed == 1); DBUG_ASSERT(fixed == 1);
String *res =args[0]->val_str(str); String *res= args[0]->val_str(str);
String *delimeter =args[1]->val_str(&tmp_value); String *delimiter= args[1]->val_str(&tmp_value);
int32 count = (int32) args[2]->val_int(); int32 count= (int32) args[2]->val_int();
uint offset; uint offset;
if (args[0]->null_value || args[1]->null_value || args[2]->null_value) if (args[0]->null_value || args[1]->null_value || args[2]->null_value)
...@@ -1139,8 +1139,8 @@ String *Item_func_substr_index::val_str(String *str) ...@@ -1139,8 +1139,8 @@ String *Item_func_substr_index::val_str(String *str)
return 0; return 0;
} }
null_value=0; null_value=0;
uint delimeter_length=delimeter->length(); uint delimiter_length= delimiter->length();
if (!res->length() || !delimeter_length || !count) if (!res->length() || !delimiter_length || !count)
return &my_empty_string; // Wrong parameters return &my_empty_string; // Wrong parameters
res->set_charset(collation.collation); res->set_charset(collation.collation);
...@@ -1148,11 +1148,11 @@ String *Item_func_substr_index::val_str(String *str) ...@@ -1148,11 +1148,11 @@ String *Item_func_substr_index::val_str(String *str)
#ifdef USE_MB #ifdef USE_MB
if (use_mb(res->charset())) if (use_mb(res->charset()))
{ {
const char *ptr=res->ptr(); const char *ptr= res->ptr();
const char *strend = ptr+res->length(); const char *strend= ptr+res->length();
const char *end=strend-delimeter_length+1; const char *end= strend-delimiter_length+1;
const char *search=delimeter->ptr(); const char *search= delimiter->ptr();
const char *search_end=search+delimeter_length; const char *search_end= search+delimiter_length;
int32 n=0,c=count,pass; int32 n=0,c=count,pass;
register uint32 l; register uint32 l;
for (pass=(count>0);pass<2;++pass) for (pass=(count>0);pass<2;++pass)
...@@ -1167,7 +1167,7 @@ String *Item_func_substr_index::val_str(String *str) ...@@ -1167,7 +1167,7 @@ String *Item_func_substr_index::val_str(String *str)
if (*i++ != *j++) goto skip; if (*i++ != *j++) goto skip;
if (pass==0) ++n; if (pass==0) ++n;
else if (!--c) break; else if (!--c) break;
ptr+=delimeter_length; ptr+= delimiter_length;
continue; continue;
} }
skip: skip:
...@@ -1189,7 +1189,7 @@ String *Item_func_substr_index::val_str(String *str) ...@@ -1189,7 +1189,7 @@ String *Item_func_substr_index::val_str(String *str)
} }
else /* return right part */ else /* return right part */
{ {
ptr+=delimeter_length; ptr+= delimiter_length;
tmp_value.set(*res,(ulong) (ptr-res->ptr()), (ulong) (strend-ptr)); tmp_value.set(*res,(ulong) (ptr-res->ptr()), (ulong) (strend-ptr));
} }
} }
...@@ -1200,9 +1200,9 @@ String *Item_func_substr_index::val_str(String *str) ...@@ -1200,9 +1200,9 @@ String *Item_func_substr_index::val_str(String *str)
{ {
if (count > 0) if (count > 0)
{ // start counting from the beginning { // start counting from the beginning
for (offset=0 ;; offset+=delimeter_length) for (offset=0; ; offset+= delimiter_length)
{ {
if ((int) (offset=res->strstr(*delimeter,offset)) < 0) if ((int) (offset= res->strstr(*delimiter, offset)) < 0)
return res; // Didn't find, return org string return res; // Didn't find, return org string
if (!--count) if (!--count)
{ {
...@@ -1223,7 +1223,7 @@ String *Item_func_substr_index::val_str(String *str) ...@@ -1223,7 +1223,7 @@ String *Item_func_substr_index::val_str(String *str)
address space less than where the found substring is located address space less than where the found substring is located
in res in res
*/ */
if ((int) (offset=res->strrstr(*delimeter,offset)) < 0) if ((int) (offset= res->strrstr(*delimiter, offset)) < 0)
return res; // Didn't find, return org string return res; // Didn't find, return org string
/* /*
At this point, we've searched for the substring At this point, we've searched for the substring
...@@ -1231,13 +1231,19 @@ String *Item_func_substr_index::val_str(String *str) ...@@ -1231,13 +1231,19 @@ String *Item_func_substr_index::val_str(String *str)
*/ */
if (!++count) if (!++count)
{ {
offset+=delimeter_length; offset+= delimiter_length;
tmp_value.set(*res,offset,res->length()- offset); tmp_value.set(*res,offset,res->length()- offset);
break; break;
} }
} }
} }
} }
/*
We always mark tmp_value as const so that if val_str() is called again
on this object, we don't disrupt the contents of tmp_value when it was
derived from another String.
*/
tmp_value.mark_as_const();
return (&tmp_value); return (&tmp_value);
} }
......
...@@ -125,6 +125,7 @@ class Item_subselect :public Item_result_field ...@@ -125,6 +125,7 @@ class Item_subselect :public Item_result_field
friend class select_subselect; friend class select_subselect;
friend class Item_in_optimizer; friend class Item_in_optimizer;
friend bool Item_field::fix_fields(THD *, Item **); friend bool Item_field::fix_fields(THD *, Item **);
friend int Item_field::fix_outer_field(THD *, Field **, Item **);
friend bool Item_ref::fix_fields(THD *, Item **); friend bool Item_ref::fix_fields(THD *, Item **);
friend void mark_select_range_as_dependent(THD*, friend void mark_select_range_as_dependent(THD*,
st_select_lex*, st_select_lex*, st_select_lex*, st_select_lex*,
......
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