summaryrefslogtreecommitdiff
path: root/unittest
diff options
context:
space:
mode:
authorOleksandr Byelkin <sanja@mariadb.com>2015-12-10 11:22:53 +0100
committerOleksandr Byelkin <sanja@mariadb.com>2015-12-10 11:22:53 +0100
commitfa25921b59aacdc6be050653f6cce17df12c6937 (patch)
treecdb4e285cab06a07fe5d690c74b621589c0237e6 /unittest
parentd67aacb4fbb449ffa8db4e3d70fe8756d62b5222 (diff)
downloadmariadb-git-fa25921b59aacdc6be050653f6cce17df12c6937.tar.gz
MDEV-8407 Numeric errors, server crash with COLUMN_JSON() on DECIMAL with precision > 40
In fact it was error in decimal library (incorrect processing of buffer overflow) invisible from other server parts because of buffer allocation and precision tests.
Diffstat (limited to 'unittest')
-rw-r--r--unittest/my_decimal/my_decimal-t.cc34
1 files changed, 32 insertions, 2 deletions
diff --git a/unittest/my_decimal/my_decimal-t.cc b/unittest/my_decimal/my_decimal-t.cc
index 48d00465af9..92c4bdee8e4 100644
--- a/unittest/my_decimal/my_decimal-t.cc
+++ b/unittest/my_decimal/my_decimal-t.cc
@@ -61,12 +61,42 @@ test_copy_and_compare()
}
+static int
+test_decimal2string()
+{
+ decimal_t d1;
+ decimal_digit_t buffer[DECIMAL_BUFF_LENGTH+2];
+ char *str_end;
+ const char strnum[]= "0.1234567890123456789012345678901234567890123467";
+ char strbuff[50];
+ int len= 40;
+ int i;
+
+ bzero(strbuff, sizeof(strbuff));
+ str_end= (char *)(strnum + (sizeof(strnum) - 1));
+
+ d1.len= DECIMAL_BUFF_LENGTH + 2;
+ d1.buf= buffer;
+
+ string2decimal(strnum, &d1, &str_end);
+ decimal2string(&d1, strbuff, &len, 0, 0, 'X');
+
+ /* last digit is not checked due to possible rounding */
+ for (i= 0; i < 38 && strbuff[i] == strnum[i]; i++);
+ ok(i == 38, "Number");
+ for (i= 39; i < 50 && strbuff[i] == 0; i++);
+ ok(i == 50, "No overrun");
+
+ return 0;
+
+}
int main()
{
- plan(13);
+ plan(15);
diag("Testing my_decimal constructor and assignment operators");
test_copy_and_compare();
-
+ test_decimal2string();
+
return exit_status();
}