summaryrefslogtreecommitdiff
path: root/strings
diff options
context:
space:
mode:
authorMagne Mahre <magne.mahre@sun.com>2009-11-11 17:03:02 +0100
committerMagne Mahre <magne.mahre@sun.com>2009-11-11 17:03:02 +0100
commitbd97e771a1e6dac0aa21ffea99fc10bc48f25ba2 (patch)
treebd6c6b3dc2db4640166de7823092fdb3a6934955 /strings
parent1f3b4018f9a06a2efc63cc669d1eb316f8a392b3 (diff)
downloadmariadb-git-bd97e771a1e6dac0aa21ffea99fc10bc48f25ba2.tar.gz
Bug #14637: trim trailing spaces processes data only byte wise
(From: gkodinov) Use and int * where possible to scan for trailing space in a string instead of always iterating char-by-char. Using the attached benchmark file on a 32 bit Intel Core 2 Duo CPU I've got 43485 ms run with the fix compared to 44373 without it. Backported to 5.6.0 (next-mr-runtime) 6.0-codebase revid: 2476.1362.1
Diffstat (limited to 'strings')
-rw-r--r--strings/ctype-bin.c5
-rw-r--r--strings/ctype-latin1.c5
-rw-r--r--strings/ctype-mb.c5
-rw-r--r--strings/ctype-simple.c10
4 files changed, 8 insertions, 17 deletions
diff --git a/strings/ctype-bin.c b/strings/ctype-bin.c
index 95d97af2bfb..3b6a977e47c 100644
--- a/strings/ctype-bin.c
+++ b/strings/ctype-bin.c
@@ -278,14 +278,11 @@ void my_hash_sort_8bit_bin(CHARSET_INFO *cs __attribute__((unused)),
{
const uchar *pos = key;
- key+= len;
-
/*
Remove trailing spaces. We have to do this to be able to compare
'A ' and 'A' as identical
*/
- while (key > pos && key[-1] == ' ')
- key--;
+ key= skip_trailing_space(key, len);
for (; pos < (uchar*) key ; pos++)
{
diff --git a/strings/ctype-latin1.c b/strings/ctype-latin1.c
index e5333c4101b..dbd91c09637 100644
--- a/strings/ctype-latin1.c
+++ b/strings/ctype-latin1.c
@@ -678,13 +678,12 @@ void my_hash_sort_latin1_de(CHARSET_INFO *cs __attribute__((unused)),
const uchar *key, size_t len,
ulong *nr1, ulong *nr2)
{
- const uchar *end= key+len;
+ const uchar *end;
/*
Remove end space. We have to do this to be able to compare
'AE' and 'Ä' as identical
*/
- while (end > key && end[-1] == ' ')
- end--;
+ end= skip_trailing_space(key, len);
for (; key < end ; key++)
{
diff --git a/strings/ctype-mb.c b/strings/ctype-mb.c
index 903811e2ab9..b0f7c297260 100644
--- a/strings/ctype-mb.c
+++ b/strings/ctype-mb.c
@@ -469,14 +469,11 @@ static void my_hash_sort_mb_bin(CHARSET_INFO *cs __attribute__((unused)),
{
const uchar *pos = key;
- key+= len;
-
/*
Remove trailing spaces. We have to do this to be able to compare
'A ' and 'A' as identical
*/
- while (key > pos && key[-1] == ' ')
- key--;
+ key= skip_trailing_space(key, len);
for (; pos < (uchar*) key ; pos++)
{
diff --git a/strings/ctype-simple.c b/strings/ctype-simple.c
index 4f3aaa6f668..6ff8c83dcf7 100644
--- a/strings/ctype-simple.c
+++ b/strings/ctype-simple.c
@@ -304,14 +304,13 @@ void my_hash_sort_simple(CHARSET_INFO *cs,
ulong *nr1, ulong *nr2)
{
register uchar *sort_order=cs->sort_order;
- const uchar *end= key + len;
+ const uchar *end;
/*
Remove end space. We have to do this to be able to compare
'A ' and 'A' as identical
*/
- while (end > key && end[-1] == ' ')
- end--;
+ end= skip_trailing_space(key, len);
for (; key < (uchar*) end ; key++)
{
@@ -1165,9 +1164,8 @@ size_t my_well_formed_len_8bit(CHARSET_INFO *cs __attribute__((unused)),
size_t my_lengthsp_8bit(CHARSET_INFO *cs __attribute__((unused)),
const char *ptr, size_t length)
{
- const char *end= ptr+length;
- while (end > ptr && end[-1] == ' ')
- end--;
+ const char *end;
+ end= (const char *) skip_trailing_space((const uchar *)ptr, length);
return (size_t) (end-ptr);
}