diff options
48 files changed, 350 insertions, 280 deletions
diff --git a/client/mysql.cc b/client/mysql.cc index 45b0e4bf2ea..ed0c1bf102b 100644 --- a/client/mysql.cc +++ b/client/mysql.cc @@ -1085,7 +1085,7 @@ static bool add_line(String &buffer,char *line,char *in_string, out=line; } } - else if (*ml_comment && !*in_string && inchar == '*' && *(pos+1) == '/') + else if (*ml_comment && inchar == '*' && *(pos + 1) == '/') { pos++; *ml_comment= 0; @@ -1093,11 +1093,12 @@ static bool add_line(String &buffer,char *line,char *in_string, else { // Add found char to buffer if (inchar == *in_string) - *in_string=0; - else if (!*in_string && (inchar == '\'' || inchar == '"' || inchar == '`')) - *in_string=(char) inchar; - if (!(*ml_comment)) - *out++ = (char) inchar; + *in_string= 0; + else if (!*ml_comment && !*in_string && + (inchar == '\'' || inchar == '"' || inchar == '`')) + *in_string= (char) inchar; + if (!*ml_comment) + *out++= (char) inchar; } } if (out != line || !buffer.is_empty()) diff --git a/mysql-test/r/alter_table.result b/mysql-test/r/alter_table.result index cb11e680910..7fa5a0f601f 100644 --- a/mysql-test/r/alter_table.result +++ b/mysql-test/r/alter_table.result @@ -281,3 +281,42 @@ ALTER TABLE t1 DISABLE KEYS; INSERT DELAYED INTO t1 VALUES(1),(2),(3); ALTER TABLE t1 ENABLE KEYS; drop table t1; +set names koi8r; +create table t1 (a char(10) character set koi8r); +insert into t1 values ('ÔÅÓÔ'); +select a,hex(a) from t1; +a hex(a) +ÔÅÓÔ D4C5D3D4 +alter table t1 change a a char(10) character set cp1251; +select a,hex(a) from t1; +a hex(a) +ÔÅÓÔ F2E5F1F2 +alter table t1 change a a char(10) binary; +select a,hex(a) from t1; +a hex(a) +òåñò F2E5F1F2 +alter table t1 change a a char(10) character set cp1251; +select a,hex(a) from t1; +a hex(a) +ÔÅÓÔ F2E5F1F2 +alter table t1 change a a char(10) character set koi8r; +select a,hex(a) from t1; +a hex(a) +ÔÅÓÔ D4C5D3D4 +alter table t1 change a a varchar(10) character set cp1251; +select a,hex(a) from t1; +a hex(a) +ÔÅÓÔ F2E5F1F2 +alter table t1 change a a char(10) character set koi8r; +select a,hex(a) from t1; +a hex(a) +ÔÅÓÔ D4C5D3D4 +alter table t1 change a a text character set cp1251; +select a,hex(a) from t1; +a hex(a) +ÔÅÓÔ F2E5F1F2 +alter table t1 change a a char(10) character set koi8r; +select a,hex(a) from t1; +a hex(a) +ÔÅÓÔ D4C5D3D4 +drop table t1; diff --git a/mysql-test/r/case.result b/mysql-test/r/case.result index 914e05efa7a..04627a7a493 100644 --- a/mysql-test/r/case.result +++ b/mysql-test/r/case.result @@ -71,3 +71,24 @@ orange yellow green drop table t1; +SET NAMES latin1; +CREATE TABLE t1 SELECT COALESCE(_latin1'a',_latin2'a'); +ERROR HY000: Illegal mix of collations (latin1_swedish_ci,COERCIBLE) and (latin2_general_ci,COERCIBLE) for operation 'coalesce' +CREATE TABLE t1 SELECT COALESCE('a' COLLATE latin1_swedish_ci,'b' COLLATE latin1_bin); +ERROR HY000: Illegal mix of collations (latin1_swedish_ci,EXPLICIT) and (latin1_bin,EXPLICIT) for operation 'coalesce' +CREATE TABLE t1 SELECT +COALESCE(1), COALESCE(1.0),COALESCE('a'), +COALESCE(1,1.0), COALESCE(1,'1'),COALESCE(1.1,'1'), +COALESCE('a' COLLATE latin1_bin,'b'); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `COALESCE(1)` int(1) NOT NULL default '0', + `COALESCE(1.0)` double(3,1) NOT NULL default '0.0', + `COALESCE('a')` char(1) NOT NULL default '', + `COALESCE(1,1.0)` double(3,1) NOT NULL default '0.0', + `COALESCE(1,'1')` char(1) NOT NULL default '', + `COALESCE(1.1,'1')` char(3) NOT NULL default '', + `COALESCE('a' COLLATE latin1_bin,'b')` char(1) character set latin1 collate latin1_bin NOT NULL default '' +) TYPE=MyISAM CHARSET=latin1 +DROP TABLE t1; diff --git a/mysql-test/r/func_in.result b/mysql-test/r/func_in.result index 006dc8abef0..4b15c44fdb1 100644 --- a/mysql-test/r/func_in.result +++ b/mysql-test/r/func_in.result @@ -111,3 +111,35 @@ id 5 9 drop table t1; +create table t1 ( +a char(1) character set latin1 collate latin1_general_ci, +b char(1) character set latin1 collate latin1_swedish_ci, +c char(1) character set latin1 collate latin1_danish_ci +); +insert into t1 values ('A','B','C'); +insert into t1 values ('a','c','c'); +select * from t1 where a in (b); +ERROR HY000: Illegal mix of collations (latin1_general_ci,IMPLICIT) and (latin1_swedish_ci,IMPLICIT) for operation ' IN ' +select * from t1 where a in (b,c); +ERROR HY000: Illegal mix of collations (latin1_general_ci,IMPLICIT), (latin1_swedish_ci,IMPLICIT), (latin1_danish_ci,IMPLICIT) for operation ' IN ' +select * from t1 where 'a' in (a,b,c); +ERROR HY000: Illegal mix of collations for operation ' IN ' +select * from t1 where 'a' in (a); +a b c +A B C +a c c +select * from t1 where a in ('a'); +a b c +A B C +a c c +select * from t1 where 'a' collate latin1_general_ci in (a,b,c); +a b c +A B C +a c c +select * from t1 where 'a' collate latin1_bin in (a,b,c); +a b c +a c c +select * from t1 where 'a' in (a,b,c collate latin1_bin); +a b c +a c c +drop table t1; diff --git a/mysql-test/r/func_str.result b/mysql-test/r/func_str.result index c2a921e1a54..37694ad2f0a 100644 --- a/mysql-test/r/func_str.result +++ b/mysql-test/r/func_str.result @@ -297,9 +297,9 @@ select FIELD('b','A' COLLATE latin1_bin,'B'); FIELD('b','A' COLLATE latin1_bin,'B') 0 select FIELD(_latin2'b','A','B'); -ERROR HY000: Illegal mix of collations for operation 'field' +ERROR HY000: Illegal mix of collations (latin2_general_ci,COERCIBLE), (latin1_swedish_ci,COERCIBLE), (latin1_swedish_ci,COERCIBLE) for operation 'field' select FIELD('b',_latin2'A','B'); -ERROR HY000: Illegal mix of collations for operation 'field' +ERROR HY000: Illegal mix of collations (latin1_swedish_ci,COERCIBLE), (latin2_general_ci,COERCIBLE), (latin1_swedish_ci,COERCIBLE) for operation 'field' select FIELD('b',_latin2'A','B',1); FIELD('b',_latin2'A','B',1) 1 @@ -363,15 +363,15 @@ select _latin1'B' in (_latin1'a',_latin1'b' collate latin1_bin); _latin1'B' in (_latin1'a',_latin1'b' collate latin1_bin) 0 select _latin2'B' in (_latin1'a',_latin1'b'); -ERROR HY000: Illegal mix of collations for operation ' IN ' +ERROR HY000: Illegal mix of collations (latin2_general_ci,COERCIBLE), (latin1_swedish_ci,COERCIBLE), (latin1_swedish_ci,COERCIBLE) for operation ' IN ' select _latin1'B' in (_latin2'a',_latin1'b'); -ERROR HY000: Illegal mix of collations for operation ' IN ' +ERROR HY000: Illegal mix of collations (latin1_swedish_ci,COERCIBLE), (latin2_general_ci,COERCIBLE), (latin1_swedish_ci,COERCIBLE) for operation ' IN ' select _latin1'B' in (_latin1'a',_latin2'b'); -ERROR HY000: Illegal mix of collations for operation ' IN ' +ERROR HY000: Illegal mix of collations (latin1_swedish_ci,COERCIBLE), (latin1_swedish_ci,COERCIBLE), (latin2_general_ci,COERCIBLE) for operation ' IN ' select _latin1'B' COLLATE latin1_general_ci in (_latin1'a' COLLATE latin1_bin,_latin1'b'); -ERROR HY000: Illegal mix of collations for operation ' IN ' +ERROR HY000: Illegal mix of collations (latin1_general_ci,EXPLICIT), (latin1_bin,EXPLICIT), (latin1_swedish_ci,COERCIBLE) for operation ' IN ' select _latin1'B' COLLATE latin1_general_ci in (_latin1'a',_latin1'b' COLLATE latin1_bin); -ERROR HY000: Illegal mix of collations for operation ' IN ' +ERROR HY000: Illegal mix of collations (latin1_general_ci,EXPLICIT), (latin1_swedish_ci,COERCIBLE), (latin1_bin,EXPLICIT) for operation ' IN ' select collation(bin(130)), coercibility(bin(130)); collation(bin(130)) coercibility(bin(130)) latin1_swedish_ci 3 @@ -532,3 +532,24 @@ t1 CREATE TABLE `t1` ( `replace(_latin2'abcd',_latin2'b',_latin2'B')` char(4) character set latin2 NOT NULL default '' ) TYPE=MyISAM CHARSET=latin1 drop table t1; +select SUBSTR('abcdefg',3,2); +SUBSTR('abcdefg',3,2) +cd +select SUBSTRING('abcdefg',3,2); +SUBSTRING('abcdefg',3,2) +cd +select SUBSTR('abcdefg',-3,2) FROM DUAL; +SUBSTR('abcdefg',-3,2) +ef +select SUBSTR('abcdefg',-1,5) FROM DUAL; +SUBSTR('abcdefg',-1,5) +g +select SUBSTR('abcdefg',0,0) FROM DUAL; +SUBSTR('abcdefg',0,0) + +select SUBSTR('abcdefg',-1,-1) FROM DUAL; +SUBSTR('abcdefg',-1,-1) + +select SUBSTR('abcdefg',1,-1) FROM DUAL; +SUBSTR('abcdefg',1,-1) + diff --git a/mysql-test/r/openssl_1.result b/mysql-test/r/openssl_1.result index 65b882c0a9b..afc4b12a341 100644 --- a/mysql-test/r/openssl_1.result +++ b/mysql-test/r/openssl_1.result @@ -10,22 +10,22 @@ select * from t1; f1 5 delete from t1; -Access denied for user: 'ssl_user1@localhost' to database 'test' +ERROR 42000: Access denied for user: 'ssl_user1@localhost' to database 'test' select * from t1; f1 5 delete from t1; -Access denied for user: 'ssl_user2@localhost' to database 'test' +ERROR 42000: Access denied for user: 'ssl_user2@localhost' to database 'test' select * from t1; f1 5 delete from t1; -Access denied for user: 'ssl_user3@localhost' to database 'test' +ERROR 42000: Access denied for user: 'ssl_user3@localhost' to database 'test' select * from t1; f1 5 delete from t1; -Access denied for user: 'ssl_user4@localhost' to database 'test' +ERROR 42000: Access denied for user: 'ssl_user4@localhost' to database 'test' delete from mysql.user where user='ssl_user%'; delete from mysql.db where user='ssl_user%'; flush privileges; diff --git a/mysql-test/t/alter_table.test b/mysql-test/t/alter_table.test index 04229bd1882..346ad8fe80e 100644 --- a/mysql-test/t/alter_table.test +++ b/mysql-test/t/alter_table.test @@ -144,3 +144,30 @@ ALTER TABLE t1 DISABLE KEYS; INSERT DELAYED INTO t1 VALUES(1),(2),(3); ALTER TABLE t1 ENABLE KEYS; drop table t1; + +# +# Test that data get converted when character set is changed +# Test that data doesn't get converted when src or dst is BINARY/BLOB +# +set names koi8r; +create table t1 (a char(10) character set koi8r); +insert into t1 values ('ÔÅÓÔ'); +select a,hex(a) from t1; +alter table t1 change a a char(10) character set cp1251; +select a,hex(a) from t1; +alter table t1 change a a char(10) binary; +select a,hex(a) from t1; +alter table t1 change a a char(10) character set cp1251; +select a,hex(a) from t1; +alter table t1 change a a char(10) character set koi8r; +select a,hex(a) from t1; +alter table t1 change a a varchar(10) character set cp1251; +select a,hex(a) from t1; +alter table t1 change a a char(10) character set koi8r; +select a,hex(a) from t1; +alter table t1 change a a text character set cp1251; +select a,hex(a) from t1; +alter table t1 change a a char(10) character set koi8r; +select a,hex(a) from t1; + +drop table t1; diff --git a/mysql-test/t/case.test b/mysql-test/t/case.test index 6131d1500de..0249a8eefba 100644 --- a/mysql-test/t/case.test +++ b/mysql-test/t/case.test @@ -41,3 +41,25 @@ create table t1 (row int not null, col int not null, val varchar(255) not null); insert into t1 values (1,1,'orange'),(1,2,'large'),(2,1,'yellow'),(2,2,'medium'),(3,1,'green'),(3,2,'small'); select max(case col when 1 then val else null end) as color from t1 group by row; drop table t1; + +# +# COALESCE is a CASE abbrevation: +# +# COALESCE(v1,v2) == CASE WHEN v1 IS NOT NULL THEN v1 ELSE v2 END +# +# COALESCE(V1, V2, . . . ,Vn ) = +# CASE WHEN V1 IS NOT NULL THEN V1 ELSE COALESCE (V2, . . . ,Vn) END +# +# Check COALESCE argument types aggregation + +SET NAMES latin1; +--error 1265 +CREATE TABLE t1 SELECT COALESCE(_latin1'a',_latin2'a'); +--error 1265 +CREATE TABLE t1 SELECT COALESCE('a' COLLATE latin1_swedish_ci,'b' COLLATE latin1_bin); +CREATE TABLE t1 SELECT + COALESCE(1), COALESCE(1.0),COALESCE('a'), + COALESCE(1,1.0), COALESCE(1,'1'),COALESCE(1.1,'1'), + COALESCE('a' COLLATE latin1_bin,'b'); +SHOW CREATE TABLE t1; +DROP TABLE t1; diff --git a/mysql-test/t/func_in.test b/mysql-test/t/func_in.test index 723f1707a42..dca068f368a 100644 --- a/mysql-test/t/func_in.test +++ b/mysql-test/t/func_in.test @@ -54,3 +54,22 @@ insert into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9); select * from t1 where id in (2,5,9); drop table t1; +create table t1 ( +a char(1) character set latin1 collate latin1_general_ci, +b char(1) character set latin1 collate latin1_swedish_ci, +c char(1) character set latin1 collate latin1_danish_ci +); +insert into t1 values ('A','B','C'); +insert into t1 values ('a','c','c'); +--error 1265 +select * from t1 where a in (b); +--error 1268 +select * from t1 where a in (b,c); +--error 1269 +select * from t1 where 'a' in (a,b,c); +select * from t1 where 'a' in (a); +select * from t1 where a in ('a'); +select * from t1 where 'a' collate latin1_general_ci in (a,b,c); +select * from t1 where 'a' collate latin1_bin in (a,b,c); +select * from t1 where 'a' in (a,b,c collate latin1_bin); +drop table t1; diff --git a/mysql-test/t/func_str.test b/mysql-test/t/func_str.test index c9e7b1a529d..f158eaa3764 100644 --- a/mysql-test/t/func_str.test +++ b/mysql-test/t/func_str.test @@ -167,9 +167,9 @@ select FIELD('b','A','B'); select FIELD('B','A','B'); select FIELD('b' COLLATE latin1_bin,'A','B'); select FIELD('b','A' COLLATE latin1_bin,'B'); ---error 1269 +--error 1268 select FIELD(_latin2'b','A','B'); ---error 1269 +--error 1268 select FIELD('b',_latin2'A','B'); select FIELD('b',_latin2'A','B',1); @@ -217,15 +217,15 @@ select _latin1'B' in (_latin1'a',_latin1'b'); select _latin1'B' collate latin1_bin in (_latin1'a',_latin1'b'); select _latin1'B' in (_latin1'a' collate latin1_bin,_latin1'b'); select _latin1'B' in (_latin1'a',_latin1'b' collate latin1_bin); ---error 1269 +--error 1268 select _latin2'B' in (_latin1'a',_latin1'b'); ---error 1269 +--error 1268 select _latin1'B' in (_latin2'a',_latin1'b'); ---error 1269 +--error 1268 select _latin1'B' in (_latin1'a',_latin2'b'); ---error 1269 +--error 1268 select _latin1'B' COLLATE latin1_general_ci in (_latin1'a' COLLATE latin1_bin,_latin1'b'); ---error 1269 +--error 1268 select _latin1'B' COLLATE latin1_general_ci in (_latin1'a',_latin1'b' COLLATE latin1_bin); select collation(bin(130)), coercibility(bin(130)); @@ -294,3 +294,14 @@ select ; show create table t1; drop table t1; + +# +# test for SUBSTR +# +select SUBSTR('abcdefg',3,2); +select SUBSTRING('abcdefg',3,2); +select SUBSTR('abcdefg',-3,2) FROM DUAL; +select SUBSTR('abcdefg',-1,5) FROM DUAL; +select SUBSTR('abcdefg',0,0) FROM DUAL; +select SUBSTR('abcdefg',-1,-1) FROM DUAL; +select SUBSTR('abcdefg',1,-1) FROM DUAL; diff --git a/mysql-test/t/openssl_1.test b/mysql-test/t/openssl_1.test index 3af7406cef3..c1c818efb70 100644 --- a/mysql-test/t/openssl_1.test +++ b/mysql-test/t/openssl_1.test @@ -2,7 +2,9 @@ # Use mysql-test-run with --with-openssl option. -- source include/have_openssl_1.inc +--disable_warnings drop table if exists t1; +--enable_warnings create table t1(f1 int); insert into t1 values (5); diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index 0026f500ef5..08ae7e2063a 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -1154,7 +1154,13 @@ void Item_func_coalesce::fix_length_and_dec() { set_if_bigger(max_length,args[i]->max_length); set_if_bigger(decimals,args[i]->decimals); + cached_result_type=item_store_type(cached_result_type, + args[i]->result_type()); } + if (cached_result_type == STRING_RESULT) + agg_arg_collations(collation, args, arg_count); + else if (cached_result_type != REAL_RESULT) + decimals= 0; } /**************************************************************************** @@ -1419,7 +1425,7 @@ int cmp_item_row::compare(cmp_item *c) bool Item_func_in::nulls_in_row() { Item **arg,**arg_end; - for (arg= args, arg_end= args+arg_count; arg != arg_end ; arg++) + for (arg= args+1, arg_end= args+arg_count; arg != arg_end ; arg++) { if ((*arg)->null_inside()) return 1; @@ -1436,42 +1442,43 @@ static int srtcmp_in(CHARSET_INFO *cs, const String *x,const String *y) void Item_func_in::fix_length_and_dec() { + Item **arg, **arg_end; + uint const_itm= 1; + + if ((args[0]->result_type() == STRING_RESULT) && + (agg_arg_collations_for_comparison(cmp_collation, args, arg_count))) + return; + + for (arg=args+1, arg_end=args+arg_count; arg != arg_end ; arg++) + const_itm&= arg[0]->const_item(); + /* Row item with NULLs inside can return NULL or FALSE => they can't be processed as static */ - if (const_item() && !nulls_in_row()) + if (const_itm && !nulls_in_row()) { - switch (item->result_type()) { + switch (args[0]->result_type()) { case STRING_RESULT: uint i; - cmp_collation.set(item->collation); - for (i=0 ; i<arg_count; i++) - if (cmp_collation.aggregate(args[i]->collation)) - break; - if (cmp_collation.derivation == DERIVATION_NONE) - { - my_error(ER_CANT_AGGREGATE_NCOLLATIONS,MYF(0),func_name()); - return; - } - array=new in_string(arg_count,(qsort2_cmp) srtcmp_in, + array=new in_string(arg_count-1,(qsort2_cmp) srtcmp_in, cmp_collation.collation); break; case INT_RESULT: - array= new in_longlong(arg_count); + array= new in_longlong(arg_count-1); break; case REAL_RESULT: - array= new in_double(arg_count); + array= new in_double(arg_count-1); break; case ROW_RESULT: - array= new in_row(arg_count, item); + array= new in_row(arg_count-1, args[0]); break; default: DBUG_ASSERT(0); return; } uint j=0; - for (uint i=0 ; i < arg_count ; i++) + for (uint i=1 ; i < arg_count ; i++) { array->set(j,args[i]); if (!args[i]->null_value) // Skip NULL values @@ -1484,19 +1491,19 @@ void Item_func_in::fix_length_and_dec() } else { - in_item= cmp_item::get_comparator(item); + in_item= cmp_item::get_comparator(args[0]); + if (args[0]->result_type() == STRING_RESULT) + in_item->cmp_charset= cmp_collation.collation; } - maybe_null= item->maybe_null; + maybe_null= args[0]->maybe_null; max_length= 1; - used_tables_cache|=item->used_tables(); - const_item_cache&=item->const_item(); + const_item_cache&=args[0]->const_item(); } void Item_func_in::print(String *str) { str->append('('); - item->print(str); Item_func::print(str); str->append(')'); } @@ -1506,15 +1513,15 @@ longlong Item_func_in::val_int() { if (array) { - int tmp=array->find(item); - null_value=item->null_value || (!tmp && have_null); + int tmp=array->find(args[0]); + null_value=args[0]->null_value || (!tmp && have_null); return tmp; } - in_item->store_value(item); - if ((null_value=item->null_value)) + in_item->store_value(args[0]); + if ((null_value=args[0]->null_value)) return 0; have_null= 0; - for (uint i=0 ; i < arg_count ; i++) + for (uint i=1 ; i < arg_count ; i++) { if (!in_item->cmp(args[i]) && !args[i]->null_value) return 1; // Would maybe be nice with i ? @@ -1525,29 +1532,6 @@ longlong Item_func_in::val_int() } -void Item_func_in::update_used_tables() -{ - Item_func::update_used_tables(); - item->update_used_tables(); - used_tables_cache|=item->used_tables(); - const_item_cache&=item->const_item(); -} - -void Item_func_in::split_sum_func(Item **ref_pointer_array, List<Item> &fields) -{ - if (item->with_sum_func && item->type() != SUM_FUNC_ITEM) - item->split_sum_func(ref_pointer_array, fields); - else if (item->used_tables() || item->type() == SUM_FUNC_ITEM) - { - uint el= fields.elements; - fields.push_front(item); - ref_pointer_array[el]= item; - item= new Item_ref(ref_pointer_array + el, 0, item->name); - } - Item_func::split_sum_func(ref_pointer_array, fields); -} - - longlong Item_func_bit_or::val_int() { ulonglong arg1= (ulonglong) args[0]->val_int(); diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h index c867de893dd..03775bbf375 100644 --- a/sql/item_cmpfunc.h +++ b/sql/item_cmpfunc.h @@ -600,42 +600,26 @@ public: class Item_func_in :public Item_int_func { - Item *item; in_vector *array; cmp_item *in_item; bool have_null; DTCollation cmp_collation; public: - Item_func_in(Item *a,List<Item> &list) - :Item_int_func(list), item(a), array(0), in_item(0), have_null(0) + Item_func_in(List<Item> &list) + :Item_int_func(list), array(0), in_item(0), have_null(0) { - allowed_arg_cols= item->cols(); + allowed_arg_cols= args[0]->cols(); } longlong val_int(); - bool fix_fields(THD *thd, struct st_table_list *tlist, Item **ref) - { - // We do not check item->cols(), because allowed_arg_cols assigned from it - bool res=(item->fix_fields(thd, tlist, &item) || - Item_func::fix_fields(thd, tlist, ref)); - with_sum_func= with_sum_func || item->with_sum_func; - return res; - } void fix_length_and_dec(); - ~Item_func_in() { delete item; delete array; delete in_item; } + ~Item_func_in() { delete array; delete in_item; } optimize_type select_optimize() const { return array ? OPTIMIZE_KEY : OPTIMIZE_NONE; } - Item *key_item() const { return item; } + Item *key_item() const { return args[0]; } void print(String *str); enum Functype functype() const { return IN_FUNC; } const char *func_name() const { return " IN "; } - void update_used_tables(); - void split_sum_func(Item **ref_pointer_array, List<Item> &fields); bool nulls_in_row(); - bool walk(Item_processor processor, byte *arg) - { - return item->walk(processor, arg) || - Item_int_func::walk(processor, arg); - } }; /* Functions used by where clause */ diff --git a/sql/item_func.cc b/sql/item_func.cc index 9832c9fd3a6..9373c2323b6 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -1174,32 +1174,32 @@ longlong Item_func_field::val_int() if (cmp_type == STRING_RESULT) { String *field; - if (!(field=item->val_str(&value))) + if (!(field=args[0]->val_str(&value))) return 0; // -1 if null ? - for (uint i=0 ; i < arg_count ; i++) + for (uint i=1 ; i < arg_count ; i++) { String *tmp_value=args[i]->val_str(&tmp); if (tmp_value && field->length() == tmp_value->length() && !sortcmp(field,tmp_value,cmp_collation.collation)) - return (longlong) (i+1); + return (longlong) (i); } } else if (cmp_type == INT_RESULT) { - longlong val= item->val_int(); - for (uint i=0; i < arg_count ; i++) + longlong val= args[0]->val_int(); + for (uint i=1; i < arg_count ; i++) { if (val == args[i]->val_int()) - return (longlong) (i+1); + return (longlong) (i); } } else { - double val= item->val(); - for (uint i=0; i < arg_count ; i++) + double val= args[0]->val(); + for (uint i=1; i < arg_count ; i++) { if (val == args[i]->val()) - return (longlong) (i+1); + return (longlong) (i); } } return 0; @@ -1208,42 +1208,11 @@ longlong Item_func_field::val_int() void Item_func_field::fix_length_and_dec() { maybe_null=0; max_length=3; - used_tables_cache|= item->used_tables(); - const_item_cache&= item->const_item(); - with_sum_func= with_sum_func || item->with_sum_func; - - cmp_type= item->result_type(); - for (uint i=0; i < arg_count ; i++) + cmp_type= args[0]->result_type(); + for (uint i=1; i < arg_count ; i++) cmp_type= item_cmp_type(cmp_type, args[i]->result_type()); - if (cmp_type == STRING_RESULT) - { - cmp_collation.set(item->collation); - for (uint i=0 ; i < arg_count ; i++) - { - if (cmp_collation.aggregate(args[i]->collation)) - { - my_error(ER_CANT_AGGREGATE_NCOLLATIONS,MYF(0),func_name()); - return; - } - } - } -} - - -void Item_func_field::split_sum_func(Item **ref_pointer_array, - List<Item> &fields) -{ - if (item->with_sum_func && item->type() != SUM_FUNC_ITEM) - item->split_sum_func(ref_pointer_array, fields); - else if (item->used_tables() || item->type() == SUM_FUNC_ITEM) - { - uint el= fields.elements; - fields.push_front(item); - ref_pointer_array[el]= item; - item= new Item_ref(ref_pointer_array + el, 0, item->name); - } - Item_func::split_sum_func(ref_pointer_array, fields); + agg_arg_collations_for_comparison(cmp_collation, args, arg_count); } diff --git a/sql/item_func.h b/sql/item_func.h index cc10a628adb..30a499c2a52 100644 --- a/sql/item_func.h +++ b/sql/item_func.h @@ -626,33 +626,14 @@ public: class Item_func_field :public Item_int_func { - Item *item; String value,tmp; Item_result cmp_type; DTCollation cmp_collation; public: - Item_func_field(Item *a,List<Item> &list) :Item_int_func(list),item(a) {} - ~Item_func_field() { delete item; } + Item_func_field(List<Item> &list) :Item_int_func(list) {} longlong val_int(); - bool fix_fields(THD *thd,struct st_table_list *tlist, Item **ref) - { - return (item->fix_fields(thd, tlist, &item) || item->check_cols(1) || - Item_func::fix_fields(thd, tlist, ref)); - } - void split_sum_func(Item **ref_pointer_array, List<Item> &fields); - void update_used_tables() - { - item->update_used_tables() ; Item_func::update_used_tables(); - used_tables_cache|= item->used_tables(); - const_item_cache&= item->const_item(); - } const char *func_name() const { return "field"; } void fix_length_and_dec(); - bool walk(Item_processor processor, byte *arg) - { - return item->walk(processor, arg) || - Item_int_func::walk(processor, arg); - } }; diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index f5cc88e2e4e..4e35e90b429 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -979,13 +979,14 @@ void Item_func_right::fix_length_and_dec() String *Item_func_substr::val_str(String *str) { String *res = args[0]->val_str(str); - int32 start = (int32) args[1]->val_int()-1; + int32 start = (int32) args[1]->val_int(); int32 length = arg_count == 3 ? (int32) args[2]->val_int() : INT_MAX32; int32 tmp_length; if ((null_value=(args[0]->null_value || args[1]->null_value || (arg_count == 3 && args[2]->null_value)))) return 0; /* purecov: inspected */ + start= (int32)((start < 0) ? res->length() + start : start -1); start=res->charpos(start); length=res->charpos(length,start); if (start < 0 || (uint) start+1 > res->length() || length <= 0) @@ -1659,81 +1660,53 @@ void Item_func_elt::fix_length_and_dec() max_length=0; decimals=0; - if (agg_arg_collations(collation, args, arg_count)) + if (agg_arg_collations(collation, args+1, arg_count-1)) return; - for (uint i=0 ; i < arg_count ; i++) + for (uint i=1 ; i < arg_count ; i++) { set_if_bigger(max_length,args[i]->max_length); set_if_bigger(decimals,args[i]->decimals); } maybe_null=1; // NULL if wrong first arg - with_sum_func= with_sum_func || item->with_sum_func; - used_tables_cache|=item->used_tables(); - const_item_cache&=item->const_item(); -} - - -void Item_func_elt::split_sum_func(Item **ref_pointer_array, - List<Item> &fields) -{ - if (item->with_sum_func && item->type() != SUM_FUNC_ITEM) - item->split_sum_func(ref_pointer_array, fields); - else if (item->used_tables() || item->type() == SUM_FUNC_ITEM) - { - uint el= fields.elements; - fields.push_front(item); - ref_pointer_array[el]= item; - item= new Item_ref(ref_pointer_array + el, 0, item->name); - } - Item_str_func::split_sum_func(ref_pointer_array, fields); -} - - -void Item_func_elt::update_used_tables() -{ - Item_func::update_used_tables(); - item->update_used_tables(); - used_tables_cache|=item->used_tables(); - const_item_cache&=item->const_item(); } double Item_func_elt::val() { uint tmp; - if ((tmp=(uint) item->val_int()) == 0 || tmp > arg_count) + if ((tmp=(uint) args[0]->val_int()) == 0 || tmp >= arg_count) { null_value=1; return 0.0; } null_value=0; - return args[tmp-1]->val(); + return args[tmp]->val(); } longlong Item_func_elt::val_int() { uint tmp; - if ((tmp=(uint) item->val_int()) == 0 || tmp > arg_count) + if ((tmp=(uint) args[0]->val_int()) == 0 || tmp >= arg_count) { null_value=1; return 0; } null_value=0; - return args[tmp-1]->val_int(); + return args[tmp]->val_int(); } String *Item_func_elt::val_str(String *str) { uint tmp; String *res; - if ((tmp=(uint) item->val_int()) == 0 || tmp > arg_count) + if ((tmp=(uint) args[0]->val_int()) == 0 || tmp >= arg_count) { null_value=1; return NULL; } null_value=0; - res= args[tmp-1]->val_str(str); + res= args[tmp]->val_str(str); res->set_charset(charset()); return res; } diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h index b38c7df4755..4225dd43b12 100644 --- a/sql/item_strfunc.h +++ b/sql/item_strfunc.h @@ -372,29 +372,13 @@ public: class Item_func_elt :public Item_str_func { - Item *item; - public: - Item_func_elt(Item *a,List<Item> &list) :Item_str_func(list),item(a) {} - ~Item_func_elt() { delete item; } + Item_func_elt(List<Item> &list) :Item_str_func(list) {} double val(); longlong val_int(); String *val_str(String *str); - bool fix_fields(THD *thd, TABLE_LIST *tlist, Item **ref) - { - return (item->fix_fields(thd, tlist, &item) || - item->check_cols(1) || - Item_func::fix_fields(thd, tlist, ref)); - } - void split_sum_func(Item **ref_pointer_array, List<Item> &fields); void fix_length_and_dec(); - void update_used_tables(); const char *func_name() const { return "elt"; } - bool walk(Item_processor processor, byte *arg) - { - return item->walk(processor, arg) || - Item_str_func::walk(processor, arg); - } }; diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc index 4fdb1b13d24..c2d1504e94a 100644 --- a/sql/item_timefunc.cc +++ b/sql/item_timefunc.cc @@ -380,7 +380,7 @@ longlong Item_func_time_to_sec::val_int() static bool get_interval_value(Item *args,interval_type int_type, String *str_value, INTERVAL *t) { - long array[4],value; + long array[5],value; const char *str; uint32 length; LINT_INIT(value); LINT_INIT(str); LINT_INIT(length); diff --git a/sql/lex.h b/sql/lex.h index a148baad07f..c2860f4551a 100644 --- a/sql/lex.h +++ b/sql/lex.h @@ -627,6 +627,7 @@ static SYMBOL sql_functions[] = { { "STD", SYM(STD_SYM),0,0}, { "STDDEV", SYM(STD_SYM),0,0}, { "STRCMP", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_strcmp)}, + { "SUBSTR", SYM(SUBSTRING),0,0}, { "SUBSTRING", SYM(SUBSTRING),0,0}, { "SUBSTRING_INDEX", SYM(SUBSTRING_INDEX),0,0}, { "SUBTIME", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_subtime)}, diff --git a/sql/net_serv.cc b/sql/net_serv.cc index eb4d76bbf6e..fd5e4f1d71a 100644 --- a/sql/net_serv.cc +++ b/sql/net_serv.cc @@ -959,5 +959,5 @@ my_net_read(NET *net) return len; } -#endif /* EMBEDDED_LIBRARY */ +#endif /* #ifndef EMBEDDED_LIBRARY */ diff --git a/sql/opt_range.cc b/sql/opt_range.cc index 7eb66c4e30f..18c465ffde3 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -832,10 +832,10 @@ static SEL_TREE *get_mm_tree(PARAM *param,COND *cond) Field *field=((Item_field*) (func->key_item()))->field; Item_result cmp_type=field->cmp_type(); tree= get_mm_parts(param,field,Item_func::EQ_FUNC, - func->arguments()[0],cmp_type); + func->arguments()[1],cmp_type); if (!tree) DBUG_RETURN(tree); // Not key field - for (uint i=1 ; i < func->argument_count(); i++) + for (uint i=2 ; i < func->argument_count(); i++) { SEL_TREE *new_tree=get_mm_parts(param,field,Item_func::EQ_FUNC, func->arguments()[i],cmp_type); diff --git a/sql/share/czech/errmsg.txt b/sql/share/czech/errmsg.txt index 30516e8dad1..5ed743962eb 100644 --- a/sql/share/czech/errmsg.txt +++ b/sql/share/czech/errmsg.txt @@ -16,7 +16,7 @@ v/* "ANO", "Nemohu vytvo-Bøit soubor '%-.64s' (chybový kód: %d)", "Nemohu vytvo-Bøit tabulku '%-.64s' (chybový kód: %d)", -"Nemohu vytvo-Bøit databázi '%-.64s', chyba %d", +"Nemohu vytvo-Bøit databázi '%-.64s' (chybový kód: %d)", "Nemohu vytvo-Bøit databázi '%-.64s'; databáze ji¾ existuje", "Nemohu zru-B¹it databázi '%-.64s', databáze neexistuje", "Chyba p-Bøi ru¹ení databáze (nemohu vymazat '%-.64s', chyba %d)", @@ -222,7 +222,7 @@ v/* "CREATE DATABASE not allowed while thread is holding global read lock", "Wrong arguments to %s", "%-.32s@%-.64s is not allowed to create new users", -"Incorrect table definition; All MERGE tables must be in the same database", +"Incorrect table definition; all MERGE tables must be in the same database", "Deadlock found when trying to get lock; Try restarting transaction", "The used table type doesn't support FULLTEXT indexes", "Cannot add foreign key constraint", diff --git a/sql/share/danish/errmsg.txt b/sql/share/danish/errmsg.txt index 289f70c79ed..224b168e15b 100644 --- a/sql/share/danish/errmsg.txt +++ b/sql/share/danish/errmsg.txt @@ -10,7 +10,7 @@ "JA", "Kan ikke oprette filen '%-.64s' (Fejlkode: %d)", "Kan ikke oprette tabellen '%-.64s' (Fejlkode: %d)", -"Kan ikke oprette databasen '%-.64s'. Fejl %d", +"Kan ikke oprette databasen '%-.64s' (Fejlkode: %d)", "Kan ikke oprette databasen '%-.64s'; databasen eksisterer", "Kan ikke slette (droppe) '%-.64s'; databasen eksisterer ikke", "Fejl ved sletning (drop) af databasen (kan ikke slette '%-.64s', Fejl %d)", @@ -216,7 +216,7 @@ "CREATE DATABASE er ikke tilladt mens en tråd holder på globalt read lock", "Wrong arguments to %s", "%-.32s@%-.64s is not allowed to create new users", -"Incorrect table definition; All MERGE tables must be in the same database", +"Incorrect table definition; all MERGE tables must be in the same database", "Deadlock found when trying to get lock; Try restarting transaction", "The used table type doesn't support FULLTEXT indexes", "Cannot add foreign key constraint", diff --git a/sql/share/dutch/errmsg.txt b/sql/share/dutch/errmsg.txt index 8cf926554a4..ad843ae2e4e 100644 --- a/sql/share/dutch/errmsg.txt +++ b/sql/share/dutch/errmsg.txt @@ -224,7 +224,7 @@ "CREATE DATABASE niet toegestaan terwijl thread een globale 'read lock' bezit", "Foutieve parameters voor %s", "%-.32s@%-.64s mag geen nieuwe gebruikers creeren", -"Incorrecte tabel definitie; Alle MERGE tabellen moeten tot dezelfde database behoren", +"Incorrecte tabel definitie; alle MERGE tabellen moeten tot dezelfde database behoren", "Deadlock gevonden tijdens lock-aanvraag poging; Probeer herstart van de transactie", "Het gebruikte tabel type ondersteund geen FULLTEXT indexen", "Kan foreign key beperking niet toevoegen", diff --git a/sql/share/english/errmsg.txt b/sql/share/english/errmsg.txt index 6f0de413a47..778854c820b 100644 --- a/sql/share/english/errmsg.txt +++ b/sql/share/english/errmsg.txt @@ -7,7 +7,7 @@ "YES", "Can't create file '%-.64s' (errno: %d)", "Can't create table '%-.64s' (errno: %d)", -"Can't create database '%-.64s'. (errno: %d)", +"Can't create database '%-.64s' (errno: %d)", "Can't create database '%-.64s'; database exists", "Can't drop database '%-.64s'; database doesn't exist", "Error dropping database (can't delete '%-.64s', errno: %d)", @@ -213,7 +213,7 @@ "CREATE DATABASE not allowed while thread is holding global read lock", "Wrong arguments to %s", "%-.32s@%-.64s is not allowed to create new users", -"Incorrect table definition; All MERGE tables must be in the same database", +"Incorrect table definition; all MERGE tables must be in the same database", "Deadlock found when trying to get lock; Try restarting transaction", "The used table type doesn't support FULLTEXT indexes", "Cannot add foreign key constraint", diff --git a/sql/share/estonian/errmsg.txt b/sql/share/estonian/errmsg.txt index f4107e91d5b..0ac668ce01c 100644 --- a/sql/share/estonian/errmsg.txt +++ b/sql/share/estonian/errmsg.txt @@ -12,7 +12,7 @@ "JAH", "Ei suuda luua faili '%-.64s' (veakood: %d)", "Ei suuda luua tabelit '%-.64s' (veakood: %d)", -"Ei suuda luua andmebaasi '%-.64s'. (veakood: %d)", +"Ei suuda luua andmebaasi '%-.64s' (veakood: %d)", "Ei suuda luua andmebaasi '%-.64s': andmebaas juba eksisteerib", "Ei suuda kustutada andmebaasi '%-.64s': andmebaasi ei eksisteeri", "Viga andmebaasi kustutamisel (ei suuda kustutada faili '%-.64s', veakood: %d)", diff --git a/sql/share/french/errmsg.txt b/sql/share/french/errmsg.txt index 5d82eebefda..51053dc5632 100644 --- a/sql/share/french/errmsg.txt +++ b/sql/share/french/errmsg.txt @@ -7,7 +7,7 @@ "OUI", "Ne peut créer le fichier '%-.64s' (Errcode: %d)", "Ne peut créer la table '%-.64s' (Errcode: %d)", -"Ne peut créer la base '%-.64s'. Erreur %d", +"Ne peut créer la base '%-.64s' (Erreur %d)", "Ne peut créer la base '%-.64s'; elle existe déjà", "Ne peut effacer la base '%-.64s'; elle n'existe pas", "Ne peut effacer la base '%-.64s' (erreur %d)", @@ -213,7 +213,7 @@ "CREATE DATABASE n'est pas autorisée pendant qu'une tâche possède un verrou global en lecture", "Mauvais arguments à %s", "%-.32s@%-.64s n'est pas autorisé à créer de nouveaux utilisateurs", -"Définition de table incorrecte : toutes les tables MERGE doivent être dans la même base de donnée", +"Définition de table incorrecte; toutes les tables MERGE doivent être dans la même base de donnée", "Deadlock découvert en essayant d'obtenir les verrous : essayez de redémarrer la transaction", "Le type de table utilisé ne supporte pas les index FULLTEXT", "Impossible d'ajouter des contraintes d'index externe", diff --git a/sql/share/german/errmsg.txt b/sql/share/german/errmsg.txt index 4512cd1e0cb..49615c08223 100644 --- a/sql/share/german/errmsg.txt +++ b/sql/share/german/errmsg.txt @@ -14,9 +14,9 @@ "isamchk", "Nein", "Ja", -"Kann Datei '%-.64s' nicht erzeugen. (Fehler: %d)", -"Kann Tabelle '%-.64s' nicht erzeugen. (Fehler: %d)", -"Kann Datenbank '%-.64s' nicht erzeugen. (Fehler: %d)", +"Kann Datei '%-.64s' nicht erzeugen (Fehler: %d)", +"Kann Tabelle '%-.64s' nicht erzeugen (Fehler: %d)", +"Kann Datenbank '%-.64s' nicht erzeugen (Fehler: %d)", "Kann Datenbank '%-.64s' nicht erzeugen; datenbank '%-.64s' existiert bereits.", "Kann Datenbank '%-.64s' nicht löschen; keine Datenbank '%-.64s' vorhanden.", "Fehler beim Löschen der Datenbank. ('%-.64s' kann nicht gelöscht werden, Fehlernuumer: %d)", @@ -222,7 +222,7 @@ "Solange ein globaler Read LOCK gesetzt ist, ist CREATE DATABASE nicht zulässig.", "Falsche Argumente für %s", "%-.32s@%-.64s is nicht berechtigt neue Benutzer hinzuzufügen.", -"Falsche Tabellendefinition: Sämtliche MERGE-Tabellen müssen in derselben Datenbank sein.", +"Falsche Tabellendefinition; sämtliche MERGE-Tabellen müssen in derselben Datenbank sein.", "Beim Versuch einen Lock anzufordern ist ein Deadlock aufgetreten. Es wird versucht die Transaktion erneut zu starten.", "Der verwendete Tabellentyp unterstützt keinen FULLTEXT-Index.", "Foreign_Key Beschränkung konnte nicht hinzugefügt werden.", diff --git a/sql/share/greek/errmsg.txt b/sql/share/greek/errmsg.txt index 873f8385462..d49e80135e3 100644 --- a/sql/share/greek/errmsg.txt +++ b/sql/share/greek/errmsg.txt @@ -7,8 +7,8 @@ "ÍÁÉ", "Áäýíáôç ç äçìéïõñãßá ôïõ áñ÷åßïõ '%-.64s' (êùäéêüò ëÜèïõò: %d)", "Áäýíáôç ç äçìéïõñãßá ôïõ ðßíáêá '%-.64s' (êùäéêüò ëÜèïõò: %d)", -"Áäýíáôç ç äçìéïõñãßá ôçò âÜóçò äåäïìÝíùí '%-.64s'. (êùäéêüò ëÜèïõò: %d)", -"Áäýíáôç ç äçìéïõñãßá ôçò âÜóçò äåäïìÝíùí '%-.64s'. Ç âÜóç äåäïìÝíùí õðÜñ÷åé Þäç", +"Áäýíáôç ç äçìéïõñãßá ôçò âÜóçò äåäïìÝíùí '%-.64s' (êùäéêüò ëÜèïõò: %d)", +"Áäýíáôç ç äçìéïõñãßá ôçò âÜóçò äåäïìÝíùí '%-.64s'; Ç âÜóç äåäïìÝíùí õðÜñ÷åé Þäç", "Áäýíáôç ç äéáãñáöÞ ôçò âÜóçò äåäïìÝíùí '%-.64s'. Ç âÜóç äåäïìÝíùí äåí õðÜñ÷åé", "ÐáñïõóéÜóôçêå ðñüâëçìá êáôÜ ôç äéáãñáöÞ ôçò âÜóçò äåäïìÝíùí (áäýíáôç ç äéáãñáöÞ '%-.64s', êùäéêüò ëÜèïõò: %d)", "ÐáñïõóéÜóôçêå ðñüâëçìá êáôÜ ôç äéáãñáöÞ ôçò âÜóçò äåäïìÝíùí (áäýíáôç ç äéáãñáöÞ ôïõ öáêÝëëïõ '%-.64s', êùäéêüò ëÜèïõò: %d)", @@ -213,7 +213,7 @@ "CREATE DATABASE not allowed while thread is holding global read lock", "Wrong arguments to %s", "%-.32s@%-.64s is not allowed to create new users", -"Incorrect table definition; All MERGE tables must be in the same database", +"Incorrect table definition; all MERGE tables must be in the same database", "Deadlock found when trying to get lock; Try restarting transaction", "The used table type doesn't support FULLTEXT indexes", "Cannot add foreign key constraint", diff --git a/sql/share/hungarian/errmsg.txt b/sql/share/hungarian/errmsg.txt index 93ab550b60f..8fc12da1f00 100644 --- a/sql/share/hungarian/errmsg.txt +++ b/sql/share/hungarian/errmsg.txt @@ -215,7 +215,7 @@ "CREATE DATABASE not allowed while thread is holding global read lock", "Wrong arguments to %s", "%-.32s@%-.64s is not allowed to create new users", -"Incorrect table definition; All MERGE tables must be in the same database", +"Incorrect table definition; all MERGE tables must be in the same database", "Deadlock found when trying to get lock; Try restarting transaction", "The used table type doesn't support FULLTEXT indexes", "Cannot add foreign key constraint", diff --git a/sql/share/italian/errmsg.txt b/sql/share/italian/errmsg.txt index cc21f7cf42a..18ce664e7fd 100644 --- a/sql/share/italian/errmsg.txt +++ b/sql/share/italian/errmsg.txt @@ -7,7 +7,7 @@ "SI", "Impossibile creare il file '%-.64s' (errno: %d)", "Impossibile creare la tabella '%-.64s' (errno: %d)", -"Impossibile creare il database '%-.64s'. (errno: %d)", +"Impossibile creare il database '%-.64s' (errno: %d)", "Impossibile creare il database '%-.64s'; il database esiste", "Impossibile cancellare '%-.64s'; il database non esiste", "Errore durante la cancellazione del database (impossibile cancellare '%-.64s', errno: %d)", diff --git a/sql/share/japanese/errmsg.txt b/sql/share/japanese/errmsg.txt index b8bc6e1d761..fedf0fd8e9c 100644 --- a/sql/share/japanese/errmsg.txt +++ b/sql/share/japanese/errmsg.txt @@ -215,7 +215,7 @@ "CREATE DATABASE not allowed while thread is holding global read lock", "Wrong arguments to %s", "%-.32s@%-.64s is not allowed to create new users", -"Incorrect table definition; All MERGE tables must be in the same database", +"Incorrect table definition; all MERGE tables must be in the same database", "Deadlock found when trying to get lock; Try restarting transaction", "The used table type doesn't support FULLTEXT indexes", "Cannot add foreign key constraint", diff --git a/sql/share/korean/errmsg.txt b/sql/share/korean/errmsg.txt index 9bbcaa16076..8c37b824342 100644 --- a/sql/share/korean/errmsg.txt +++ b/sql/share/korean/errmsg.txt @@ -213,7 +213,7 @@ "CREATE DATABASE not allowed while thread is holding global read lock", "Wrong arguments to %s", "%-.32s@%-.64s is not allowed to create new users", -"Incorrect table definition; All MERGE tables must be in the same database", +"Incorrect table definition; all MERGE tables must be in the same database", "Deadlock found when trying to get lock; Try restarting transaction", "The used table type doesn't support FULLTEXT indexes", "Cannot add foreign key constraint", diff --git a/sql/share/norwegian-ny/errmsg.txt b/sql/share/norwegian-ny/errmsg.txt index f562553e40a..4e5bed92916 100644 --- a/sql/share/norwegian-ny/errmsg.txt +++ b/sql/share/norwegian-ny/errmsg.txt @@ -9,7 +9,7 @@ "JA", "Kan ikkje opprette fila '%-.64s' (Feilkode: %d)", "Kan ikkje opprette tabellen '%-.64s' (Feilkode: %d)", -"Kan ikkje opprette databasen '%-.64s'. Feil %d", +"Kan ikkje opprette databasen '%-.64s' (Feilkode: %d)", "Kan ikkje opprette databasen '%-.64s'; databasen eksisterer", "Kan ikkje fjerne (drop) '%-.64s'; databasen eksisterer ikkje", "Feil ved fjerning (drop) av databasen (kan ikkje slette '%-.64s', feil %d)", @@ -215,7 +215,7 @@ "CREATE DATABASE not allowed while thread is holding global read lock", "Wrong arguments to %s", "%-.32s@%-.64s is not allowed to create new users", -"Incorrect table definition; All MERGE tables must be in the same database", +"Incorrect table definition; all MERGE tables must be in the same database", "Deadlock found when trying to get lock; Try restarting transaction", "The used table type doesn't support FULLTEXT indexes", "Cannot add foreign key constraint", diff --git a/sql/share/norwegian/errmsg.txt b/sql/share/norwegian/errmsg.txt index dcb7be9a053..4b4f4e6a1f3 100644 --- a/sql/share/norwegian/errmsg.txt +++ b/sql/share/norwegian/errmsg.txt @@ -9,7 +9,7 @@ "JA", "Kan ikke opprette fila '%-.64s' (Feilkode: %d)", "Kan ikke opprette tabellen '%-.64s' (Feilkode: %d)", -"Kan ikke opprette databasen '%-.64s'. Feil %d", +"Kan ikke opprette databasen '%-.64s' (Feilkode: %d)", "Kan ikke opprette databasen '%-.64s'; databasen eksisterer", "Kan ikke fjerne (drop) '%-.64s'; databasen eksisterer ikke", "Feil ved fjerning (drop) av databasen (kan ikke slette '%-.64s', feil %d)", @@ -215,7 +215,7 @@ "CREATE DATABASE not allowed while thread is holding global read lock", "Wrong arguments to %s", "%-.32s@%-.64s is not allowed to create new users", -"Incorrect table definition; All MERGE tables must be in the same database", +"Incorrect table definition; all MERGE tables must be in the same database", "Deadlock found when trying to get lock; Try restarting transaction", "The used table type doesn't support FULLTEXT indexes", "Cannot add foreign key constraint", diff --git a/sql/share/polish/errmsg.txt b/sql/share/polish/errmsg.txt index 9cd63dfc009..cc710376052 100644 --- a/sql/share/polish/errmsg.txt +++ b/sql/share/polish/errmsg.txt @@ -11,7 +11,7 @@ "TAK", "Nie mo¿na stworzyæ pliku '%-.64s' (Kod b³êdu: %d)", "Nie mo¿na stworzyæ tabeli '%-.64s' (Kod b³êdu: %d)", -"Nie mo¿na stworzyæ bazy danych '%-.64s'. B³?d %d", +"Nie mo¿na stworzyæ bazy danych '%-.64s' (Kod b³êdu: %d)", "Nie mo¿na stworzyæ bazy danych '%-.64s'; baza danych ju¿ istnieje", "Nie mo¿na usun?æ bazy danych '%-.64s'; baza danych nie istnieje", "B³?d podczas usuwania bazy danych (nie mo¿na usun?æ '%-.64s', b³?d %d)", @@ -217,7 +217,7 @@ "CREATE DATABASE not allowed while thread is holding global read lock", "Wrong arguments to %s", "%-.32s@%-.64s is not allowed to create new users", -"Incorrect table definition; All MERGE tables must be in the same database", +"Incorrect table definition; all MERGE tables must be in the same database", "Deadlock found when trying to get lock; Try restarting transaction", "The used table type doesn't support FULLTEXT indexes", "Cannot add foreign key constraint", diff --git a/sql/share/romanian/errmsg.txt b/sql/share/romanian/errmsg.txt index c5be6e5df8d..f8bbba75a9f 100644 --- a/sql/share/romanian/errmsg.txt +++ b/sql/share/romanian/errmsg.txt @@ -11,7 +11,7 @@ "DA", "Nu pot sa creez fisierul '%-.64s' (Eroare: %d)", "Nu pot sa creez tabla '%-.64s' (Eroare: %d)", -"Nu pot sa creez baza de date '%-.64s'. (Eroare: %d)", +"Nu pot sa creez baza de date '%-.64s' (Eroare: %d)", "Nu pot sa creez baza de date '%-.64s'; baza de date exista deja", "Nu pot sa drop baza de date '%-.64s'; baza da date este inexistenta", "Eroare dropuind baza de date (nu pot sa sterg '%-.64s', Eroare: %d)", @@ -217,7 +217,7 @@ "CREATE DATABASE not allowed while thread is holding global read lock", "Wrong arguments to %s", "%-.32s@%-.64s is not allowed to create new users", -"Incorrect table definition; All MERGE tables must be in the same database", +"Incorrect table definition; all MERGE tables must be in the same database", "Deadlock found when trying to get lock; Try restarting transaction", "The used table type doesn't support FULLTEXT indexes", "Cannot add foreign key constraint", diff --git a/sql/share/russian/errmsg.txt b/sql/share/russian/errmsg.txt index e193eac6793..1981e7e7a5a 100644 --- a/sql/share/russian/errmsg.txt +++ b/sql/share/russian/errmsg.txt @@ -9,7 +9,7 @@ "äá", "îÅ×ÏÚÍÏÖÎÏ ÓÏÚÄÁÔØ ÆÁÊÌ '%-.64s' (ÏÛÉÂËÁ: %d)", "îÅ×ÏÚÍÏÖÎÏ ÓÏÚÄÁÔØ ÔÁÂÌÉÃÕ '%-.64s' (ÏÛÉÂËÁ: %d)", -"îÅ×ÏÚÍÏÖÎÏ ÓÏÚÄÁÔØ ÂÁÚÕ ÄÁÎÎÙÈ '%-.64s'. (ÏÛÉÂËÁ: %d)", +"îÅ×ÏÚÍÏÖÎÏ ÓÏÚÄÁÔØ ÂÁÚÕ ÄÁÎÎÙÈ '%-.64s' (ÏÛÉÂËÁ: %d)", "îÅ×ÏÚÍÏÖÎÏ ÓÏÚÄÁÔØ ÂÁÚÕ ÄÁÎÎÙÈ '%-.64s'. âÁÚÁ ÄÁÎÎÙÈ ÕÖÅ ÓÕÝÅÓÔ×ÕÅÔ", "îÅ×ÏÚÍÏÖÎÏ ÕÄÁÌÉÔØ ÂÁÚÕ ÄÁÎÎÙÈ '%-.64s'. ôÁËÏÊ ÂÁÚÙ ÄÁÎÎÙÈ ÎÅÔ", "ïÛÉÂËÁ ÐÒÉ ÕÄÁÌÅÎÉÉ ÂÁÚÙ ÄÁÎÎÙÈ (ÎÅ×ÏÚÍÏÖÎÏ ÕÄÁÌÉÔØ '%-.64s', ÏÛÉÂËÁ: %d)", diff --git a/sql/share/serbian/errmsg.txt b/sql/share/serbian/errmsg.txt index e413097a997..e1583bbb791 100644 --- a/sql/share/serbian/errmsg.txt +++ b/sql/share/serbian/errmsg.txt @@ -13,7 +13,7 @@ "DA", "Ne mogu da kreiram file '%-.64s' (errno: %d)", "Ne mogu da kreiram tabelu '%-.64s' (errno: %d)", -"Ne mogu da kreiram bazu '%-.64s'. (errno: %d)", +"Ne mogu da kreiram bazu '%-.64s' (errno: %d)", "Ne mogu da kreiram bazu '%-.64s'; baza veæ postoji.", "Ne mogu da izbrišem bazu '%-.64s'; baza ne postoji.", "Ne mogu da izbrišem bazu (ne mogu da izbrišem '%-.64s', errno: %d)", @@ -219,7 +219,7 @@ "Komanda 'CREATE DATABASE' nije dozvoljena dok thread globalno zakljuèava èitanje podataka", "Pogrešni argumenti prosleðeni na %s", "Korisniku %-.32s@%-.64s nije dozvoljeno da kreira nove korisnike", -"Pogrešna definicija tabele; Sve 'MERGE' tabele moraju biti u istoj bazi podataka", +"Pogrešna definicija tabele; sve 'MERGE' tabele moraju biti u istoj bazi podataka", "Unakrsno zakljuèavanje pronaðeno kada sam pokušao da dobijem pravo na zakljuèavanje; Probajte da restartujete transakciju", "Upotrebljeni tip tabele ne podržava 'FULLTEXT' indekse", "Ne mogu da dodam proveru spoljnog kljuèa", diff --git a/sql/share/slovak/errmsg.txt b/sql/share/slovak/errmsg.txt index a3e34b8b41a..c6fad79e15a 100644 --- a/sql/share/slovak/errmsg.txt +++ b/sql/share/slovak/errmsg.txt @@ -15,7 +15,7 @@ "Áno", "Nemô¾em vytvori» súbor '%-.64s' (chybový kód: %d)", "Nemô¾em vytvori» tabuµku '%-.64s' (chybový kód: %d)", -"Nemô¾em vytvori» databázu '%-.64s'. (chybový kód: %d)", +"Nemô¾em vytvori» databázu '%-.64s' (chybový kód: %d)", "Nemô¾em vytvori» databázu '%-.64s'; databáza existuje", "Nemô¾em zmaza» databázu '%-.64s'; databáza neexistuje", "Chyba pri mazaní databázy (nemô¾em zmaza» '%-.64s', chybový kód: %d)", @@ -221,7 +221,7 @@ "CREATE DATABASE not allowed while thread is holding global read lock", "Wrong arguments to %s", "%-.32s@%-.64s is not allowed to create new users", -"Incorrect table definition; All MERGE tables must be in the same database", +"Incorrect table definition; all MERGE tables must be in the same database", "Deadlock found when trying to get lock; Try restarting transaction", "The used table type doesn't support FULLTEXT indexes", "Cannot add foreign key constraint", diff --git a/sql/share/spanish/errmsg.txt b/sql/share/spanish/errmsg.txt index c1b3f19da4f..731e576fafd 100644 --- a/sql/share/spanish/errmsg.txt +++ b/sql/share/spanish/errmsg.txt @@ -8,7 +8,7 @@ "SI", "No puedo crear archivo '%-.64s' (Error: %d)", "No puedo crear tabla '%-.64s' (Error: %d)", -"No puedo crear base de datos '%-.64s'. Error %d", +"No puedo crear base de datos '%-.64s' (Error: %d)", "No puedo crear base de datos '%-.64s'; la base de datos ya existe", "No puedo eliminar base de datos '%-.64s'; la base de datos no existe", "Error eliminando la base de datos(no puedo borrar '%-.64s', error %d)", @@ -214,7 +214,7 @@ "CREATE DATABASE no permitido mientras un thread está ejerciendo un bloqueo de lectura global", "Wrong arguments to %s", "%-.32s@%-.64s is not allowed to create new users", -"Incorrect table definition; All MERGE tables must be in the same database", +"Incorrect table definition; all MERGE tables must be in the same database", "Deadlock found when trying to get lock; Try restarting transaction", "The used table type doesn't support FULLTEXT indexes", "Cannot add foreign key constraint", diff --git a/sql/share/swedish/errmsg.txt b/sql/share/swedish/errmsg.txt index b1153c83504..9e34dbb138a 100644 --- a/sql/share/swedish/errmsg.txt +++ b/sql/share/swedish/errmsg.txt @@ -7,7 +7,7 @@ "YES", "Kan inte skapa filen '%-.64s' (Felkod: %d)", "Kan inte skapa tabellen '%-.64s' (Felkod: %d)", -"Kan inte skapa databasen '%-.64s'. (Felkod: %d)", +"Kan inte skapa databasen '%-.64s' (Felkod: %d)", "Databasen '%-.64s' existerar redan", "Kan inte radera databasen '%-.64s'; databasen finns inte", "Fel vid radering av databasen (Kan inte radera '%-.64s'. Felkod: %d)", @@ -213,7 +213,7 @@ "CREATE DATABASE är inte tillåtet när man har ett globalt läslås", "Felaktiga argument till %s", "%-.32s@%-.64s har inte rättighet att skapa nya användare", -"Felaktig tabelldefinition. Alla tabeller i en MERGE-tabell måste vara i samma databas", +"Felaktig tabelldefinition; alla tabeller i en MERGE-tabell måste vara i samma databas", "Fick 'DEADLOCK' vid låsförsök av block/rad. Försök att starta om transaktionen", "Tabelltypen har inte hantering av FULLTEXT-index", "Kan inte lägga till 'FOREIGN KEY constraint'", diff --git a/sql/share/ukrainian/errmsg.txt b/sql/share/ukrainian/errmsg.txt index 2fc14372f54..adbb35dc7c0 100644 --- a/sql/share/ukrainian/errmsg.txt +++ b/sql/share/ukrainian/errmsg.txt @@ -12,7 +12,7 @@ "ôáë", "îÅ ÍÏÖÕ ÓÔ×ÏÒÉÔÉ ÆÁÊÌ '%-.64s' (ÐÏÍÉÌËÁ: %d)", "îÅ ÍÏÖÕ ÓÔ×ÏÒÉÔÉ ÔÁÂÌÉÃÀ '%-.64s' (ÐÏÍÉÌËÁ: %d)", -"îÅ ÍÏÖÕ ÓÔ×ÏÒÉÔÉ ÂÁÚÕ ÄÁÎÎÉÈ '%-.64s'. (ÐÏÍÉÌËÁ: %d)", +"îÅ ÍÏÖÕ ÓÔ×ÏÒÉÔÉ ÂÁÚÕ ÄÁÎÎÉÈ '%-.64s' (ÐÏÍÉÌËÁ: %d)", "îÅ ÍÏÖÕ ÓÔ×ÏÒÉÔÉ ÂÁÚÕ ÄÁÎÎÉÈ '%-.64s'. âÁÚÁ ÄÁÎÎÉÈ ¦ÓÎÕ¤", "îÅ ÍÏÖÕ ×ÉÄÁÌÉÔÉ ÂÁÚÕ ÄÁÎÎÉÈ '%-.64s'. âÁÚÁ ÄÁÎÎÉÈ ÎÅ ¦ÓÎÕ¤", "îÅ ÍÏÖÕ ×ÉÄÁÌÉÔÉ ÂÁÚÕ ÄÁÎÎÉÈ (îÅ ÍÏÖÕ ×ÉÄÁÌÉÔÉ '%-.64s', ÐÏÍÉÌËÁ: %d)", @@ -218,7 +218,7 @@ "CREATE DATABASE ÎÅ ÄÏÚ×ÏÌÅÎÏ ÄÏËÉ Ç¦ÌËÁ ÐÅÒÅÂÕ×Á¤ Ð¦Ä ÚÁÇÁÌØÎÉÍ ÂÌÏËÕ×ÁÎÎÑÍ ÞÉÔÁÎÎÑ", "èÉÂÎÉÊ ÁÒÇÕÍÅÎÔ ÄÌÑ %s", "ëÏÒÉÓÔÕ×ÁÞÕ %-.32s@%-.64s ÎÅ ÄÏÚ×ÏÌÅÎÏ ÓÔ×ÏÒÀ×ÁÔÉ ÎÏ×ÉÈ ËÏÒÉÓÔÕ×ÁÞ¦×", -"Incorrect table definition; All MERGE tables must be in the same database", +"Incorrect table definition; all MERGE tables must be in the same database", "Deadlock found when trying to get lock; Try restarting transaction", "÷ÉËÏÒÉÓÔÁÎÉÊ ÔÉÐ ÔÁÂÌÉæ ΊЦÄÔÒÉÍÕ¤ FULLTEXT ¦ÎÄÅËÓ¦×", "Cannot add foreign key constraint", diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index 091de9d406f..947205949f1 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -404,13 +404,12 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list, { char buff[160]; if (duplic == DUP_IGNORE) - sprintf(buff,ER(ER_INSERT_INFO),info.records, - (lock_type == TL_WRITE_DELAYED) ? 0 : - info.records-info.copied, - thd->cuted_fields); + sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records, + (lock_type == TL_WRITE_DELAYED) ? (ulong) 0 : + (ulong) (info.records - info.copied), (ulong) thd->cuted_fields); else - sprintf(buff,ER(ER_INSERT_INFO),info.records,info.deleted, - thd->cuted_fields); + sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records, + (ulong) info.deleted, (ulong) thd->cuted_fields); ::send_ok(thd,info.copied+info.deleted,(ulonglong)id,buff); } free_underlaid_joins(thd, &thd->lex.select_lex); @@ -1494,11 +1493,11 @@ bool select_insert::send_eof() { char buff[160]; if (info.handle_duplicates == DUP_IGNORE) - sprintf(buff,ER(ER_INSERT_INFO),info.records,info.records-info.copied, - thd->cuted_fields); + sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records, + (ulong) (info.records - info.copied), (ulong) thd->cuted_fields); else - sprintf(buff,ER(ER_INSERT_INFO),info.records,info.deleted, - thd->cuted_fields); + sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records, + (ulong) info.deleted, (ulong) thd->cuted_fields); ::send_ok(thd,info.copied+info.deleted,last_insert_id,buff); return 0; } diff --git a/sql/sql_load.cc b/sql/sql_load.cc index 12acfb9b5df..d030eaf617c 100644 --- a/sql/sql_load.cc +++ b/sql/sql_load.cc @@ -318,8 +318,8 @@ int mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list, error= -1; // Error on read goto err; } - sprintf(name,ER(ER_LOAD_INFO),info.records,info.deleted, - info.records-info.copied,thd->cuted_fields); + sprintf(name, ER(ER_LOAD_INFO), (ulong) info.records, (ulong) info.deleted, + (ulong) (info.records - info.copied), (ulong) thd->cuted_fields); send_ok(thd,info.copied+info.deleted,0L,name); // on the slave thd->query is never initialized if (!thd->slave_thread) diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 33a59e540f8..2e6585583ba 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -2416,8 +2416,8 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, query_cache_invalidate3(thd, table_list, 0); end_temporary: - sprintf(tmp_name,ER(ER_INSERT_INFO),(ulong) (copied+deleted), - (ulong) deleted, thd->cuted_fields); + sprintf(tmp_name, ER(ER_INSERT_INFO), (ulong) (copied + deleted), + (ulong) deleted, (ulong) thd->cuted_fields); send_ok(thd,copied+deleted,0L,tmp_name); thd->some_tables_deleted=0; DBUG_RETURN(0); diff --git a/sql/sql_update.cc b/sql/sql_update.cc index 989d17b006b..e1c28dd0e4d 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -373,8 +373,8 @@ int mysql_update(THD *thd, else { char buff[80]; - sprintf(buff,ER(ER_UPDATE_INFO), (long) found, (long) updated, - (long) thd->cuted_fields); + sprintf(buff, ER(ER_UPDATE_INFO), (ulong) found, (ulong) updated, + (ulong) thd->cuted_fields); send_ok(thd, (thd->client_capabilities & CLIENT_FOUND_ROWS) ? found : updated, thd->insert_id_used ? thd->insert_id() : 0L,buff); @@ -993,8 +993,8 @@ bool multi_update::send_eof() } - sprintf(buff,ER(ER_UPDATE_INFO), (long) found, (long) updated, - (long) thd->cuted_fields); + sprintf(buff, ER(ER_UPDATE_INFO), (ulong) found, (ulong) updated, + (ulong) thd->cuted_fields); ::send_ok(thd, (thd->client_capabilities & CLIENT_FOUND_ROWS) ? found : updated, thd->insert_id_used ? thd->insert_id() : 0L,buff); diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 768386b1a53..77ae455a8c5 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -2109,9 +2109,9 @@ all_or_any: ALL { $$ = 1; } /* expressions that begin with 'expr' */ expr_expr: expr IN_SYM '(' expr_list ')' - { $$= new Item_func_in($1,*$4); } + { $4->push_front($1); $$= new Item_func_in(*$4); } | expr NOT IN_SYM '(' expr_list ')' - { $$= new Item_func_not(new Item_func_in($1,*$5)); } + { $5->push_front($1); $$= new Item_func_not(new Item_func_in(*$5)); } | expr IN_SYM in_subselect { $$= new Item_in_subselect(YYTHD, $1, $3); } | expr NOT IN_SYM in_subselect @@ -2211,9 +2211,9 @@ no_in_expr: /* expressions that begin with 'expr' that does NOT follow AND */ no_and_expr: no_and_expr IN_SYM '(' expr_list ')' - { $$= new Item_func_in($1,*$4); } + { $4->push_front($1); $$= new Item_func_in(*$4); } | no_and_expr NOT IN_SYM '(' expr_list ')' - { $$= new Item_func_not(new Item_func_in($1,*$5)); } + { $5->push_front($1); $$= new Item_func_not(new Item_func_in(*$5)); } | no_and_expr IN_SYM in_subselect { $$= new Item_in_subselect(YYTHD, $1, $3); } | no_and_expr NOT IN_SYM in_subselect @@ -2389,7 +2389,7 @@ simple_expr: | DAY_SYM '(' expr ')' { $$= new Item_func_dayofmonth($3); } | ELT_FUNC '(' expr ',' expr_list ')' - { $$= new Item_func_elt($3, *$5); } + { $5->push_front($3); $$= new Item_func_elt(*$5); } | MAKE_SET_SYM '(' expr ',' expr_list ')' { $$= new Item_func_make_set($3, *$5); } | ENCRYPT '(' expr ')' @@ -2427,7 +2427,7 @@ simple_expr: $$= new Item_func_date_format (new Item_func_from_unixtime($3),$5,0); } | FIELD_FUNC '(' expr ',' expr_list ')' - { $$= new Item_func_field($3, *$5); } + { $5->push_front($3); $$= new Item_func_field(*$5); } | GEOMFROMTEXT '(' expr ')' { $$= new Item_func_geometry_from_text($3); } | GEOMFROMTEXT '(' expr ',' expr ')' |