Commit cfa78c26 authored by unknown's avatar unknown

Bug #7878 with utf_general_ci, equals (=) has problem with accent insensitivity

Backporting Monty's fix for 5.0 into 4.1.

parent 5b91c5a7
...@@ -340,6 +340,7 @@ enum ha_base_keytype { ...@@ -340,6 +340,7 @@ enum ha_base_keytype {
#define HA_STATE_BUFF_SAVED 512 /* If current keybuff is info->buff */ #define HA_STATE_BUFF_SAVED 512 /* If current keybuff is info->buff */
#define HA_STATE_ROW_CHANGED 1024 /* To invalide ROW cache */ #define HA_STATE_ROW_CHANGED 1024 /* To invalide ROW cache */
#define HA_STATE_EXTEND_BLOCK 2048 #define HA_STATE_EXTEND_BLOCK 2048
#define HA_STATE_RNEXT_SAME 4096 /* rnext_same was called */
enum en_fieldtype { enum en_fieldtype {
FIELD_LAST=-1,FIELD_NORMAL,FIELD_SKIP_ENDSPACE,FIELD_SKIP_PRESPACE, FIELD_LAST=-1,FIELD_NORMAL,FIELD_SKIP_ENDSPACE,FIELD_SKIP_PRESPACE,
......
...@@ -57,7 +57,11 @@ int mi_rnext_same(MI_INFO *info, byte *buf) ...@@ -57,7 +57,11 @@ int mi_rnext_same(MI_INFO *info, byte *buf)
#endif #endif
case HA_KEY_ALG_BTREE: case HA_KEY_ALG_BTREE:
default: default:
if (!(info->update & HA_STATE_RNEXT_SAME))
{
/* First rnext_same; Store old key */
memcpy(info->lastkey2,info->lastkey,info->last_rkey_length); memcpy(info->lastkey2,info->lastkey,info->last_rkey_length);
}
for (;;) for (;;)
{ {
if ((error=_mi_search_next(info,keyinfo,info->lastkey, if ((error=_mi_search_next(info,keyinfo,info->lastkey,
...@@ -81,7 +85,7 @@ int mi_rnext_same(MI_INFO *info, byte *buf) ...@@ -81,7 +85,7 @@ int mi_rnext_same(MI_INFO *info, byte *buf)
rw_unlock(&info->s->key_root_lock[inx]); rw_unlock(&info->s->key_root_lock[inx]);
/* Don't clear if database-changed */ /* Don't clear if database-changed */
info->update&= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED); info->update&= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED);
info->update|= HA_STATE_NEXT_FOUND; info->update|= HA_STATE_NEXT_FOUND | HA_STATE_RNEXT_SAME;
if (error) if (error)
{ {
......
...@@ -326,3 +326,15 @@ latin1_german2_ci 6109 ...@@ -326,3 +326,15 @@ latin1_german2_ci 6109
latin1_german2_ci 61 latin1_german2_ci 61
latin1_german2_ci 6120 latin1_german2_ci 6120
drop table t1; drop table t1;
SET NAMES latin1;
CREATE TABLE t1 (
col1 varchar(255) NOT NULL default ''
) ENGINE=MyISAM DEFAULT CHARSET=latin1 collate latin1_german2_ci;
INSERT INTO t1 VALUES (''),('ss'),('ss');
ALTER TABLE t1 ADD KEY ifword(col1);
SELECT * FROM t1 WHERE col1='' ORDER BY col1, BINARY col1;
col1
ss
ss
DROP TABLE t1;
...@@ -116,3 +116,19 @@ SELECT FIELD('ue',s1), FIELD(' ...@@ -116,3 +116,19 @@ SELECT FIELD('ue',s1), FIELD('
DROP TABLE t1; DROP TABLE t1;
-- source include/ctype_filesort.inc -- source include/ctype_filesort.inc
#
# Bug#7878 with utf8_general_ci, equals (=) has problem with
# accent insensitivity.
# Although originally this problem was found with UTF8 character set,
# '=' behaved wrong for latin1_german2_ci as well.
# Let's check it does not work incorrect anymore.
#
SET NAMES latin1;
CREATE TABLE t1 (
col1 varchar(255) NOT NULL default ''
) ENGINE=MyISAM DEFAULT CHARSET=latin1 collate latin1_german2_ci;
INSERT INTO t1 VALUES (''),('ss'),('ss');
ALTER TABLE t1 ADD KEY ifword(col1);
SELECT * FROM t1 WHERE col1='' ORDER BY col1, BINARY col1;
DROP TABLE t1;
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