mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 20:42:30 +01:00
e3af3c2127
When storing a large number to a FLOAT or DOUBLE field with fixed length, it could be incorrectly truncated if the field's length was greater than 31. This patch also does some code cleanups to be able to reuse code which is common between Field_float::store() and Field_double::store(). include/m_string.h: Added declarations for log_10 and log_01 from strtod.c mysql-test/r/type_float.result: Added the testcase for bug #28121 "INSERT or UPDATE into DOUBLE(200,0) field being truncated to 31 digits" mysql-test/t/type_float.test: Added the testcase for bug #28121 "INSERT or UPDATE into DOUBLE(200,0) field being truncated to 31 digits" sql/field.cc: Moved common code from Field_float::store() and Field_double:store() to Field_real::truncate() Fixed the algorithm to not truncate large input numbers if the field length is greater than 31. Fixed rounding to not depend on FLT_MAX/DBL_MAX constants. sql/field.h: Moved not_fixed member from Field_double to Field_real to allow code reuse between Field_float::store() and Field_double::store() Added truncate() method to Field_real which is used by both Field_float and Field_double sql/init.cc: log_10[] and log_01[] are now defined as statical arrays in strtod.c, no need to pre-computed them. sql/item_cmpfunc.cc: log_01[] now starts from 1e0, not from 1e-1 for consistency. sql/mysql_priv.h: Moved log_10[] and log_01[] from mysqld.cc to libmystrings. sql/mysqld.cc: Moved log_10[] and log_01[] from mysqld.cc to libmystrings. strings/strtod.c: Define and use log_10[] and log_01[] as static arrays of constants instead of values pre-computed at startup.
41 lines
1.4 KiB
C++
41 lines
1.4 KiB
C++
/* Copyright (C) 2000-2005 MySQL AB
|
|
|
|
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
|
|
|
|
|
/* Init and dummy functions for interface with unireg */
|
|
|
|
#include "mysql_priv.h"
|
|
#include <m_ctype.h>
|
|
|
|
void unireg_init(ulong options)
|
|
{
|
|
DBUG_ENTER("unireg_init");
|
|
|
|
MYSYS_PROGRAM_DONT_USE_CURSES();
|
|
abort_loop=0;
|
|
|
|
my_disable_async_io=1; /* aioread is only in shared library */
|
|
wild_many='%'; wild_one='_'; wild_prefix='\\'; /* Change to sql syntax */
|
|
|
|
current_pid=(ulong) getpid(); /* Save for later ref */
|
|
init_time(); /* Init time-functions (read zone) */
|
|
#ifndef EMBEDDED_LIBRARY
|
|
my_abort_hook=unireg_abort; /* Abort with close of databases */
|
|
#endif
|
|
|
|
VOID(strmov(reg_ext,".frm"));
|
|
specialflag=SPECIAL_SAME_DB_NAME | options; /* Set options from argv */
|
|
DBUG_VOID_RETURN;
|
|
}
|