From 0c903fb5c9361ca24bbcd98d420ad936fab21a80 Mon Sep 17 00:00:00 2001 From: Chaithra Gopalareddy Date: Wed, 22 May 2013 14:36:43 +0530 Subject: Bug#11766191:INVALID MEMORY READ IN DO_DIV_MOD WITH DOUBLY ASSIGNED VARIABLES Bug#12608543: CRASHES WITH DECIMALS AND STATEMENT NEEDS TO BE REPREPARED ERRORS Backporting these two fixes to 5.1 Added unittest to test my_decimal construtor and assignment operators sql/my_decimal.h: Added constructor and assignment operators for my_decimal unittest/my_decimal/my_decimal-t.cc: Added test to check constructor and assignment operators for my_decimal --- unittest/my_decimal/Makefile.am | 32 +++++++++++++++++ unittest/my_decimal/my_decimal-t.cc | 72 +++++++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 unittest/my_decimal/Makefile.am create mode 100644 unittest/my_decimal/my_decimal-t.cc (limited to 'unittest/my_decimal') diff --git a/unittest/my_decimal/Makefile.am b/unittest/my_decimal/Makefile.am new file mode 100644 index 00000000000..e40c2adb5b6 --- /dev/null +++ b/unittest/my_decimal/Makefile.am @@ -0,0 +1,32 @@ +# Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +AM_CPPFLAGS = @ZLIB_INCLUDES@ -I$(top_builddir)/include +AM_CPPFLAGS += -I$(top_srcdir)/include -I$(top_srcdir)/unittest/mytap +AM_CPPFLAGS += -I$(top_srcdir)/sql + +LDADD = $(top_builddir)/unittest/mytap/libmytap.a \ + $(top_builddir)/mysys/libmysys.a \ + $(top_builddir)/strings/libmystrings.a \ + $(top_builddir)/dbug/libdbug.a \ + $(top_builddir)/mysys/libmysys.a \ + $(top_builddir)/strings/libmystrings.a + +my_decimal_t_SOURCES = my_decimal-t.cc + +noinst_PROGRAMS = my_decimal-t + +# Don't update the files from bitkeeper +%::SCCS/s.% diff --git a/unittest/my_decimal/my_decimal-t.cc b/unittest/my_decimal/my_decimal-t.cc new file mode 100644 index 00000000000..48d00465af9 --- /dev/null +++ b/unittest/my_decimal/my_decimal-t.cc @@ -0,0 +1,72 @@ +/* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ + +#include "my_config.h" +#include "config.h" +#include +#include +#include +#include +#include +#include + + + +/* + Test my_decimal constuctor and assignement operators +*/ +static int +test_copy_and_compare() +{ + my_decimal d1,d2; + + ulonglong val= 42; + + ok(ulonglong2decimal(val,&d1) == 0, "Pass"); + d2= d1; + my_decimal d3(d1); + + ok(my_decimal_cmp(&d1, &d2) == 0, "Pass"); + ok(my_decimal_cmp(&d2, &d3) == 0, "Pass"); + ok(my_decimal_cmp(&d3, &d1) == 0,"Pass"); + + ulonglong val1, val2, val3; + ok(decimal2ulonglong(&d1, &val1) == 0, "Pass"); + ok(decimal2ulonglong(&d2, &val2) == 0,"Pass"); + ok(decimal2ulonglong(&d3, &val3) == 0,"Pass"); + + ok(val == val1,"Pass"); + ok(val == val2,"Pass"); + ok(val == val3,"Pass"); + + // The CTOR/operator=() generated by the compiler would fail here: + val= 45; + ok(ulonglong2decimal(val, &d1) == 0,"Pass"); + ok(my_decimal_cmp(&d1, &d2) == 1,"Pass"); + ok(my_decimal_cmp(&d1, &d3) == 1,"Pass"); + + return 0; + +} + +int main() +{ + plan(13); + diag("Testing my_decimal constructor and assignment operators"); + + test_copy_and_compare(); + + return exit_status(); +} -- cgit v1.2.1