Commit 037d9fae authored by Bjorn Munch's avatar Bjorn Munch

merge from 5.1 main

parents 4a54e5ad a1e9be8e
...@@ -218,4 +218,10 @@ hex(a) hex(lower(a)) hex(upper(a)) ...@@ -218,4 +218,10 @@ hex(a) hex(lower(a)) hex(upper(a))
8352835E 8352835E 8352835E 8352835E 8352835E 8352835E
8372835E 8372835E 8372835E 8372835E 8372835E 8372835E
DROP TABLE t1; DROP TABLE t1;
#
# Bug#11766519 - Bug#59648: MY_STRTOLL10_MB2: ASSERTION `(*ENDPTR - S) % 2 == 0' FAILED.
#
SELECT QUOTE('ソ');
QUOTE('ソ')
'ソ'
# End of 5.1 tests # End of 5.1 tests
...@@ -990,8 +990,8 @@ old_password(name) ...@@ -990,8 +990,8 @@ old_password(name)
???????? ????????
select quote(name) from bug20536; select quote(name) from bug20536;
quote(name) quote(name)
???????? 'test1'
???????????????? '\'test\\_2\''
drop table bug20536; drop table bug20536;
set names ucs2; set names ucs2;
ERROR 42000: Variable 'character_set_client' can't be set to the value of 'ucs2' ERROR 42000: Variable 'character_set_client' can't be set to the value of 'ucs2'
...@@ -1238,4 +1238,15 @@ CREATE VIEW v1 AS SELECT 1 from t1 ...@@ -1238,4 +1238,15 @@ CREATE VIEW v1 AS SELECT 1 from t1
WHERE t1.b <=> (SELECT a FROM t1 WHERE a < SOME(SELECT '1')); WHERE t1.b <=> (SELECT a FROM t1 WHERE a < SOME(SELECT '1'));
DROP VIEW v1; DROP VIEW v1;
DROP TABLE t1; DROP TABLE t1;
#
# Bug#59648 my_strtoll10_mb2: Assertion `(*endptr - s) % 2 == 0' failed.
#
SELECT HEX(CHAR(COALESCE(NULL, CHAR(COUNT('%s') USING ucs2), 1, @@global.license, NULL) USING cp850));
HEX(CHAR(COALESCE(NULL, CHAR(COUNT('%s') USING ucs2), 1, @@global.license, NULL) USING cp850))
00
SELECT CONVERT(QUOTE(CHAR(0xf5 using ucs2)), SIGNED);
CONVERT(QUOTE(CHAR(0xf5 using ucs2)), SIGNED)
0
Warnings:
Warning 1292 Truncated incorrect INTEGER value: ''
End of 5.0 tests End of 5.0 tests
#
# Bug#59648 my_strtoll10_mb2: Assertion `(*endptr - s) % 2 == 0' failed.
#
SELECT CHAR_LENGTH(DES_ENCRYPT(0, CHAR('1' USING ucs2)));
CHAR_LENGTH(DES_ENCRYPT(0, CHAR('1' USING ucs2)))
9
SELECT CONVERT(DES_ENCRYPT(0, CHAR('1' USING ucs2)),UNSIGNED);
CONVERT(DES_ENCRYPT(0, CHAR('1' USING ucs2)),UNSIGNED)
0
Warnings:
Warning 1292 Truncated incorrect INTEGER value: '?T?iK?j??'
SELECT CHAR_LENGTH(DES_DECRYPT(0xFF0DC9FC9537CA75F4, CHAR('1' USING ucs2)));
CHAR_LENGTH(DES_DECRYPT(0xFF0DC9FC9537CA75F4, CHAR('1' USING ucs2)))
4
SELECT CONVERT(DES_DECRYPT(0xFF0DC9FC9537CA75F4, CHAR('1' using ucs2)), UNSIGNED);
CONVERT(DES_DECRYPT(0xFF0DC9FC9537CA75F4, CHAR('1' using ucs2)), UNSIGNED)
0
Warnings:
Warning 1292 Truncated incorrect INTEGER value: 'test'
...@@ -1124,4 +1124,12 @@ Warning 1525 Incorrect XML value: 'parse error at line 1 pos 2: END-OF-INPUT une ...@@ -1124,4 +1124,12 @@ Warning 1525 Incorrect XML value: 'parse error at line 1 pos 2: END-OF-INPUT une
SELECT UPDATEXML(CONVERT(_latin1'<!--' USING utf8),'1','1'); SELECT UPDATEXML(CONVERT(_latin1'<!--' USING utf8),'1','1');
UPDATEXML(CONVERT(_latin1'<!--' USING utf8),'1','1') UPDATEXML(CONVERT(_latin1'<!--' USING utf8),'1','1')
NULL NULL
#
# Bug#11766725 (bug#59901): EXTRACTVALUE STILL BROKEN AFTER FIX FOR BUG #44332
#
SELECT ExtractValue(CONVERT('<\"', BINARY(10)), 1);
ExtractValue(CONVERT('<\"', BINARY(10)), 1)
NULL
Warnings:
Warning 1525 Incorrect XML value: 'parse error at line 1 pos 11: STRING unexpected (ident or '/' wanted)'
End of 5.1 tests End of 5.1 tests
...@@ -2431,7 +2431,7 @@ c1 c2 c3 c4 ...@@ -2431,7 +2431,7 @@ c1 c2 c3 c4
2155 2155 1998-12-26 1998-12-26 11:30:45 2155 2155 1998-12-26 1998-12-26 11:30:45
SELECT count(*) as total_rows, min(c2) as min_value, max(c2) FROM t3; SELECT count(*) as total_rows, min(c2) as min_value, max(c2) FROM t3;
total_rows min_value max(c2) total_rows min_value max(c2)
21 1901 2155 21 0 2155
SELECT * FROM t3 WHERE c3 = '1998-12-11'; SELECT * FROM t3 WHERE c3 = '1998-12-11';
c1 c2 c3 c4 c1 c2 c3 c4
1990 1990 1998-12-11 1998-12-11 11:30:45 1990 1990 1998-12-11 1998-12-11 11:30:45
...@@ -2838,7 +2838,7 @@ c1 c2 c3 c4 ...@@ -2838,7 +2838,7 @@ c1 c2 c3 c4
2155 2155 1998-12-26 1998-12-26 11:30:45 2155 2155 1998-12-26 1998-12-26 11:30:45
SELECT count(*) as total_rows, min(c2) as min_value, max(c2) FROM t3; SELECT count(*) as total_rows, min(c2) as min_value, max(c2) FROM t3;
total_rows min_value max(c2) total_rows min_value max(c2)
21 1901 2155 21 0 2155
SELECT * FROM t3 WHERE c3 = '1998-12-11'; SELECT * FROM t3 WHERE c3 = '1998-12-11';
c1 c2 c3 c4 c1 c2 c3 c4
1990 1990 1998-12-11 1998-12-11 11:30:45 1990 1990 1998-12-11 1998-12-11 11:30:45
......
...@@ -92,4 +92,12 @@ INSERT INTO t1 VALUES (0x8372835E),(0x8352835E); ...@@ -92,4 +92,12 @@ INSERT INTO t1 VALUES (0x8372835E),(0x8352835E);
SELECT hex(a), hex(lower(a)), hex(upper(a)) FROM t1 ORDER BY binary(a); SELECT hex(a), hex(lower(a)), hex(upper(a)) FROM t1 ORDER BY binary(a);
DROP TABLE t1; DROP TABLE t1;
--echo #
--echo # Bug#11766519 - Bug#59648: MY_STRTOLL10_MB2: ASSERTION `(*ENDPTR - S) % 2 == 0' FAILED.
--echo #
# In the below string backslash (0x5C) is a part of a multi-byte
# character, so it should not be quoted.
SELECT QUOTE('\');
--echo # End of 5.1 tests --echo # End of 5.1 tests
...@@ -741,4 +741,10 @@ WHERE t1.b <=> (SELECT a FROM t1 WHERE a < SOME(SELECT '1')); ...@@ -741,4 +741,10 @@ WHERE t1.b <=> (SELECT a FROM t1 WHERE a < SOME(SELECT '1'));
DROP VIEW v1; DROP VIEW v1;
DROP TABLE t1; DROP TABLE t1;
--echo #
--echo # Bug#59648 my_strtoll10_mb2: Assertion `(*endptr - s) % 2 == 0' failed.
--echo #
SELECT HEX(CHAR(COALESCE(NULL, CHAR(COUNT('%s') USING ucs2), 1, @@global.license, NULL) USING cp850));
SELECT CONVERT(QUOTE(CHAR(0xf5 using ucs2)), SIGNED);
--echo End of 5.0 tests --echo End of 5.0 tests
-- source include/have_ssl.inc
-- source include/have_ucs2.inc
--echo #
--echo # Bug#59648 my_strtoll10_mb2: Assertion `(*endptr - s) % 2 == 0' failed.
--echo #
SELECT CHAR_LENGTH(DES_ENCRYPT(0, CHAR('1' USING ucs2)));
SELECT CONVERT(DES_ENCRYPT(0, CHAR('1' USING ucs2)),UNSIGNED);
SELECT CHAR_LENGTH(DES_DECRYPT(0xFF0DC9FC9537CA75F4, CHAR('1' USING ucs2)));
SELECT CONVERT(DES_DECRYPT(0xFF0DC9FC9537CA75F4, CHAR('1' using ucs2)), UNSIGNED);
...@@ -646,4 +646,9 @@ SELECT EXTRACTVALUE('', LPAD(0.1111E-15, '2011', 1)); ...@@ -646,4 +646,9 @@ SELECT EXTRACTVALUE('', LPAD(0.1111E-15, '2011', 1));
SELECT UPDATEXML(CONVERT(_latin1'<' USING utf8),'1','1'); SELECT UPDATEXML(CONVERT(_latin1'<' USING utf8),'1','1');
SELECT UPDATEXML(CONVERT(_latin1'<!--' USING utf8),'1','1'); SELECT UPDATEXML(CONVERT(_latin1'<!--' USING utf8),'1','1');
--echo #
--echo # Bug#11766725 (bug#59901): EXTRACTVALUE STILL BROKEN AFTER FIX FOR BUG #44332
--echo #
SELECT ExtractValue(CONVERT('<\"', BINARY(10)), 1);
--echo End of 5.1 tests --echo End of 5.1 tests
...@@ -840,7 +840,7 @@ longlong Item_func_numhybrid::val_int() ...@@ -840,7 +840,7 @@ longlong Item_func_numhybrid::val_int()
return 0; return 0;
char *end= (char*) res->ptr() + res->length(); char *end= (char*) res->ptr() + res->length();
CHARSET_INFO *cs= str_value.charset(); CHARSET_INFO *cs= res->charset();
return (*(cs->cset->strtoll10))(cs, res->ptr(), &end, &err_not_used); return (*(cs->cset->strtoll10))(cs, res->ptr(), &end, &err_not_used);
} }
default: default:
......
...@@ -519,6 +519,7 @@ String *Item_func_des_encrypt::val_str(String *str) ...@@ -519,6 +519,7 @@ String *Item_func_des_encrypt::val_str(String *str)
tmp_arg[res_length-1]=tail; // save extra length tmp_arg[res_length-1]=tail; // save extra length
tmp_value.realloc(res_length+1); tmp_value.realloc(res_length+1);
tmp_value.length(res_length+1); tmp_value.length(res_length+1);
tmp_value.set_charset(&my_charset_bin);
tmp_value[0]=(char) (128 | key_number); tmp_value[0]=(char) (128 | key_number);
// Real encryption // Real encryption
bzero((char*) &ivec,sizeof(ivec)); bzero((char*) &ivec,sizeof(ivec));
...@@ -606,6 +607,7 @@ String *Item_func_des_decrypt::val_str(String *str) ...@@ -606,6 +607,7 @@ String *Item_func_des_decrypt::val_str(String *str)
if ((tail=(uint) (uchar) tmp_value[length-2]) > 8) if ((tail=(uint) (uchar) tmp_value[length-2]) > 8)
goto wrong_key; // Wrong key goto wrong_key; // Wrong key
tmp_value.length(length-1-tail); tmp_value.length(length-1-tail);
tmp_value.set_charset(&my_charset_bin);
return &tmp_value; return &tmp_value;
error: error:
...@@ -3212,14 +3214,68 @@ String *Item_func_quote::val_str(String *str) ...@@ -3212,14 +3214,68 @@ String *Item_func_quote::val_str(String *str)
} }
arg_length= arg->length(); arg_length= arg->length();
new_length= arg_length+2; /* for beginning and ending ' signs */
for (from= (char*) arg->ptr(), end= from + arg_length; from < end; from++) if (collation.collation->mbmaxlen == 1)
new_length+= get_esc_bit(escmask, (uchar) *from); {
new_length= arg_length + 2; /* for beginning and ending ' signs */
for (from= (char*) arg->ptr(), end= from + arg_length; from < end; from++)
new_length+= get_esc_bit(escmask, (uchar) *from);
}
else
{
new_length= (arg_length * 2) + /* For string characters */
(2 * collation.collation->mbmaxlen); /* For quotes */
}
if (tmp_value.alloc(new_length)) if (tmp_value.alloc(new_length))
goto null; goto null;
if (collation.collation->mbmaxlen > 1)
{
CHARSET_INFO *cs= collation.collation;
int mblen;
uchar *to_end;
to= (char*) tmp_value.ptr();
to_end= (uchar*) to + new_length;
/* Put leading quote */
if ((mblen= cs->cset->wc_mb(cs, '\'', (uchar *) to, to_end)) <= 0)
goto null;
to+= mblen;
for (start= (char*) arg->ptr(), end= start + arg_length; start < end; )
{
my_wc_t wc;
bool escape;
if ((mblen= cs->cset->mb_wc(cs, &wc, (uchar*) start, (uchar*) end)) <= 0)
goto null;
start+= mblen;
switch (wc) {
case 0: escape= 1; wc= '0'; break;
case '\032': escape= 1; wc= 'Z'; break;
case '\'': escape= 1; break;
case '\\': escape= 1; break;
default: escape= 0; break;
}
if (escape)
{
if ((mblen= cs->cset->wc_mb(cs, '\\', (uchar*) to, to_end)) <= 0)
goto null;
to+= mblen;
}
if ((mblen= cs->cset->wc_mb(cs, wc, (uchar*) to, to_end)) <= 0)
goto null;
to+= mblen;
}
/* Put trailing quote */
if ((mblen= cs->cset->wc_mb(cs, '\'', (uchar *) to, to_end)) <= 0)
goto null;
to+= mblen;
new_length= to - tmp_value.ptr();
goto ret;
}
/* /*
We replace characters from the end to the beginning We replace characters from the end to the beginning
*/ */
...@@ -3251,6 +3307,8 @@ String *Item_func_quote::val_str(String *str) ...@@ -3251,6 +3307,8 @@ String *Item_func_quote::val_str(String *str)
} }
} }
*to= '\''; *to= '\'';
ret:
tmp_value.length(new_length); tmp_value.length(new_length);
tmp_value.set_charset(collation.collation); tmp_value.set_charset(collation.collation);
null_value= 0; null_value= 0;
......
...@@ -704,9 +704,10 @@ class Item_func_quote :public Item_str_func ...@@ -704,9 +704,10 @@ class Item_func_quote :public Item_str_func
String *val_str(String *); String *val_str(String *);
void fix_length_and_dec() void fix_length_and_dec()
{ {
ulonglong max_result_length= (ulonglong) args[0]->max_length * 2 + 2;
max_length= (uint32) min(max_result_length, MAX_BLOB_WIDTH);
collation.set(args[0]->collation); collation.set(args[0]->collation);
ulonglong max_result_length= (ulonglong) args[0]->max_length * 2 +
2 * collation.collation->mbmaxlen;
max_length= (uint32) min(max_result_length, MAX_BLOB_WIDTH);
} }
}; };
......
...@@ -1218,7 +1218,8 @@ bool dispatch_command(enum enum_server_command command, THD *thd, ...@@ -1218,7 +1218,8 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
We have checked charset earlier, We have checked charset earlier,
so thd_init_client_charset cannot fail. so thd_init_client_charset cannot fail.
*/ */
DBUG_ASSERT(!thd_init_client_charset(thd, cs_number)); if (thd_init_client_charset(thd, cs_number))
DBUG_ASSERT(0);
thd->update_charset(); thd->update_charset();
} }
} }
......
...@@ -165,11 +165,16 @@ static int my_xml_scan(MY_XML_PARSER *p,MY_XML_ATTR *a) ...@@ -165,11 +165,16 @@ static int my_xml_scan(MY_XML_PARSER *p,MY_XML_ATTR *a)
} }
else if ( (p->cur[0] == '"') || (p->cur[0] == '\'') ) else if ( (p->cur[0] == '"') || (p->cur[0] == '\'') )
{ {
/*
"string" or 'string' found.
Scan until the closing quote/doublequote, or until the END-OF-INPUT.
*/
p->cur++; p->cur++;
for (; ( p->cur < p->end ) && (p->cur[0] != a->beg[0]); p->cur++) for (; ( p->cur < p->end ) && (p->cur[0] != a->beg[0]); p->cur++)
{} {}
a->end=p->cur; a->end=p->cur;
if (a->beg[0] == p->cur[0])p->cur++; if (p->cur < p->end) /* Closing quote or doublequote has been found */
p->cur++;
a->beg++; a->beg++;
if (!(p->flags & MY_XML_FLAG_SKIP_TEXT_NORMALIZATION)) if (!(p->flags & MY_XML_FLAG_SKIP_TEXT_NORMALIZATION))
my_xml_norm_text(a); my_xml_norm_text(a);
......
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