diff options
author | unknown <serg@serg.mylan> | 2004-11-02 13:55:44 +0100 |
---|---|---|
committer | unknown <serg@serg.mylan> | 2004-11-02 13:55:44 +0100 |
commit | 023314bc5f1a079c33849cd2a68f7755d3349eea (patch) | |
tree | 97b061444b51a5a8a57b8f9b1fa08cc3fb748c11 /strings | |
parent | 81ef1a41d7a3fe073831d6265e9d5491f9702f29 (diff) | |
download | mariadb-git-023314bc5f1a079c33849cd2a68f7755d3349eea.tar.gz |
different (hopefully, correct) fix for bin2decimal bug
tests added
Diffstat (limited to 'strings')
-rw-r--r-- | strings/decimal.c | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/strings/decimal.c b/strings/decimal.c index fe11f0a4d4b..d9609ec541c 100644 --- a/strings/decimal.c +++ b/strings/decimal.c @@ -113,7 +113,7 @@ typedef longlong dec2; #define ROUND_UP(X) (((X)+DIG_PER_DEC1-1)/DIG_PER_DEC1) static const dec1 powers10[DIG_PER_DEC1+1]={ 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000}; -static const int dig2bytes[DIG_PER_DEC1+1]={0, 1, 1, 2, 2, 3, 3, 3, 4, 4}; +static const int dig2bytes[DIG_PER_DEC1+1]={0, 1, 1, 2, 2, 3, 3, 4, 4, 4}; #define sanity(d) DBUG_ASSERT((d)->len >0 && ((d)->buf[0] | \ (d)->buf[(d)->len-1] | 1)) @@ -719,10 +719,10 @@ int bin2decimal(char *from, decimal *to, int precision, int scale) dec1 x; switch (i) { - case 1: x=mi_uint1korr(from); break; - case 2: x=mi_uint2korr(from); break; - case 3: x=mi_uint3korr(from); break; - case 4: x=mi_uint4korr(from); break; + case 1: x=mi_sint1korr(from); break; + case 2: x=mi_sint2korr(from); break; + case 3: x=mi_sint3korr(from); break; + case 4: x=mi_sint4korr(from); break; default: DBUG_ASSERT(0); } from+=i; @@ -735,7 +735,7 @@ int bin2decimal(char *from, decimal *to, int precision, int scale) for (stop=from+intg0*sizeof(dec1); from < stop; from+=sizeof(dec1)) { DBUG_ASSERT(sizeof(dec1) == 4); - *buf=mi_uint4korr(from) ^ mask; + *buf=mi_sint4korr(from) ^ mask; if (buf > to->buf || *buf != 0) buf++; else @@ -745,7 +745,7 @@ int bin2decimal(char *from, decimal *to, int precision, int scale) for (stop=from+frac0*sizeof(dec1); from < stop; from+=sizeof(dec1)) { DBUG_ASSERT(sizeof(dec1) == 4); - *buf=mi_uint4korr(from) ^ mask; + *buf=mi_sint4korr(from) ^ mask; buf++; } if (frac0x) @@ -754,10 +754,10 @@ int bin2decimal(char *from, decimal *to, int precision, int scale) dec1 x; switch (i) { - case 1: x=mi_uint1korr(from); break; - case 2: x=mi_uint2korr(from); break; - case 3: x=mi_uint3korr(from); break; - case 4: x=mi_uint4korr(from); break; + case 1: x=mi_sint1korr(from); break; + case 2: x=mi_sint2korr(from); break; + case 3: x=mi_sint3korr(from); break; + case 4: x=mi_sint4korr(from); break; default: DBUG_ASSERT(0); } *buf=(x ^ mask) * powers10[DIG_PER_DEC1 - frac0x]; @@ -1986,6 +1986,8 @@ main() test_md("234.567","-10.555"); printf("==== decimal2bin/bin2decimal ====\n"); + test_d2b2d("-10.55", 4, 2); + test_d2b2d("0.0123456789012345678912345", 30, 25); test_d2b2d("12345", 5, 0); test_d2b2d("12345", 10, 3); test_d2b2d("123.45", 10, 3); |