Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
MariaDB
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
301308b7
Commit
301308b7
authored
Feb 23, 2009
by
Alexey Kopytov
Browse files
Options
Browse Files
Download
Plain Diff
Automerge.
parents
73c30397
1b5d173b
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
113 additions
and
36 deletions
+113
-36
configure.in
configure.in
+2
-2
include/config-win.h
include/config-win.h
+0
-9
include/my_global.h
include/my_global.h
+33
-2
mysql-test/r/func_math.result
mysql-test/r/func_math.result
+30
-0
mysql-test/t/func_math.test
mysql-test/t/func_math.test
+20
-0
sql/mysqld.cc
sql/mysqld.cc
+28
-23
No files found.
configure.in
View file @
301308b7
...
...
@@ -825,7 +825,7 @@ AC_TYPE_SIZE_T
AC_HEADER_DIRENT
AC_HEADER_STDC
AC_HEADER_SYS_WAIT
AC_CHECK_HEADERS
(
fcntl.h float.h floatingpoint.h ieeefp.h limits.h
\
AC_CHECK_HEADERS
(
fcntl.h f
env.h f
loat.h floatingpoint.h ieeefp.h limits.h
\
memory.h pwd.h
select
.h
\
stdlib.h stddef.h
\
strings.h string.h synch.h sys/mman.h sys/socket.h netinet/in.h arpa/inet.h
\
...
...
@@ -2060,7 +2060,7 @@ AC_FUNC_UTIME_NULL
AC_FUNC_VPRINTF
AC_CHECK_FUNCS
(
alarm bcmp bfill bmove bzero chsize cuserid fchmod fcntl
\
fconvert fdatasync finite fpresetsticky fpsetmask fsync ftruncate
\
fconvert fdatasync f
esetround f
inite fpresetsticky fpsetmask fsync ftruncate
\
getcwd gethostbyaddr_r gethostbyname_r getpass getpassphrase getpwnam
\
getpwuid getrlimit getrusage getwd gmtime_r index initgroups isnan
\
localtime_r locking longjmp lrand48 madvise mallinfo memcpy memmove
\
...
...
include/config-win.h
View file @
301308b7
...
...
@@ -31,7 +31,6 @@ functions */
#include <sys/locking.h>
#include <windows.h>
#include <math.h>
/* Because of rint() */
#include <fcntl.h>
#include <io.h>
#include <malloc.h>
...
...
@@ -223,13 +222,6 @@ typedef uint rf_SetTimer;
#define inline __inline
#endif
/* __cplusplus */
inline
double
rint
(
double
nr
)
{
double
f
=
floor
(
nr
);
double
c
=
ceil
(
nr
);
return
(((
c
-
nr
)
>=
(
nr
-
f
))
?
f
:
c
);
}
#ifdef _WIN64
#define ulonglong2double(A) ((double) (ulonglong) (A))
#define my_off_t2double(A) ((double) (my_off_t) (A))
...
...
@@ -281,7 +273,6 @@ inline ulonglong double2ulonglong(double d)
#define HAVE_FLOAT_H
#define HAVE_LIMITS_H
#define HAVE_STDDEF_H
#define HAVE_RINT
/* defined in this file */
#define NO_FCNTL_NONBLOCK
/* No FCNTL */
#define HAVE_ALLOCA
#define HAVE_STRPBRK
...
...
include/my_global.h
View file @
301308b7
...
...
@@ -484,8 +484,39 @@ typedef unsigned short ushort;
#define set_bits(type, bit_count) (sizeof(type)*8 <= (bit_count) ? ~(type) 0 : ((((type) 1) << (bit_count)) - (type) 1))
#define array_elements(A) ((uint) (sizeof(A)/sizeof(A[0])))
#ifndef HAVE_RINT
#define rint(A) floor((A)+(((A) < 0)? -0.5 : 0.5))
#endif
/**
All integers up to this number can be represented exactly as double precision
values (DBL_MANT_DIG == 53 for IEEE 754 hardware).
*/
#define MAX_EXACT_INTEGER ((1LL << DBL_MANT_DIG) - 1)
/**
rint(3) implementation for platforms that do not have it.
Always rounds to the nearest integer with ties being rounded to the nearest
even integer to mimic glibc's rint() behavior in the "round-to-nearest"
FPU mode. Hardware-specific optimizations are possible (frndint on x86).
Unlike this implementation, hardware will also honor the FPU rounding mode.
*/
static
inline
double
rint
(
double
x
)
{
double
f
,
i
;
f
=
modf
(
x
,
&
i
);
/*
All doubles with absolute values > MAX_EXACT_INTEGER are even anyway,
no need to check it.
*/
if
(
x
>
0
.
0
)
i
+=
(
double
)
((
f
>
0
.
5
)
||
(
f
==
0
.
5
&&
i
<=
(
double
)
MAX_EXACT_INTEGER
&&
(
longlong
)
i
%
2
));
else
i
-=
(
double
)
((
f
<
-
0
.
5
)
||
(
f
==
-
0
.
5
&&
i
>=
(
double
)
-
MAX_EXACT_INTEGER
&&
(
longlong
)
i
%
2
));
return
i
;
}
#endif
/* HAVE_RINT */
/* Define some general constants */
#ifndef TRUE
...
...
mysql-test/r/func_math.result
View file @
301308b7
...
...
@@ -360,4 +360,34 @@ SELECT a DIV 2 FROM t1 UNION SELECT a DIV 2 FROM t1;
a DIV 2
0
DROP TABLE t1;
CREATE TABLE t1 (a DOUBLE);
INSERT INTO t1 VALUES (-1.1), (1.1),
(-1.5), (1.5),
(-1.9), (1.9),
(-2.1), (2.1),
(-2.5), (2.5),
(-2.9), (2.9),
# Check numbers with absolute values > 2^53 - 1
# (see comments for MAX_EXACT_INTEGER)
(-1e16 - 0.5), (1e16 + 0.5),
(-1e16 - 1.5), (1e16 + 1.5);
SELECT a, ROUND(a) FROM t1;
a ROUND(a)
-1.1 -1
1.1 1
-1.5 -2
1.5 2
-1.9 -2
1.9 2
-2.1 -2
2.1 2
-2.5 -2
2.5 2
-2.9 -3
2.9 3
-1e+16 -10000000000000000
1e+16 10000000000000000
-1e+16 -10000000000000002
1e+16 10000000000000002
DROP TABLE t1;
End of 5.0 tests
mysql-test/t/func_math.test
View file @
301308b7
...
...
@@ -229,5 +229,25 @@ INSERT INTO t1 VALUES ('a');
SELECT
a
DIV
2
FROM
t1
UNION
SELECT
a
DIV
2
FROM
t1
;
DROP
TABLE
t1
;
#
# Bug #15936: "round" differs on Windows to Unix
#
CREATE
TABLE
t1
(
a
DOUBLE
);
INSERT
INTO
t1
VALUES
(
-
1.1
),
(
1.1
),
(
-
1.5
),
(
1.5
),
(
-
1.9
),
(
1.9
),
(
-
2.1
),
(
2.1
),
(
-
2.5
),
(
2.5
),
(
-
2.9
),
(
2.9
),
# Check numbers with absolute values > 2^53 - 1
# (see comments for MAX_EXACT_INTEGER)
(
-
1
e16
-
0.5
),
(
1
e16
+
0.5
),
(
-
1
e16
-
1.5
),
(
1
e16
+
1.5
);
SELECT
a
,
ROUND
(
a
)
FROM
t1
;
DROP
TABLE
t1
;
--
echo
End
of
5.0
tests
sql/mysqld.cc
View file @
301308b7
...
...
@@ -186,39 +186,44 @@ int initgroups(const char *,unsigned int);
#ifdef HAVE_FP_EXCEPT // Fix type conflict
typedef
fp_except
fp_except_t
;
#endif
#endif
/* __FreeBSD__ && HAVE_IEEEFP_H */
#ifdef HAVE_FENV_H
#include <fenv.h>
#endif
#ifdef HAVE_SYS_FPU_H
/* for IRIX to use set_fpc_csr() */
#include <sys/fpu.h>
#endif
inline
void
setup_fpu
()
{
#if defined(__FreeBSD__) && defined(HAVE_IEEEFP_H)
/* We can't handle floating point exceptions with threads, so disable
this on freebsd
Don't fall for overflow, underflow,divide-by-zero or loss of precision
*/
inline
void
set_proper_floating_point_mode
()
{
/* Don't fall for overflow, underflow,divide-by-zero or loss of precision */
#if defined(__i386__)
fpsetmask
(
~
(
FP_X_INV
|
FP_X_DNML
|
FP_X_OFL
|
FP_X_UFL
|
FP_X_DZ
|
FP_X_IMP
));
#else
fpsetmask
(
~
(
FP_X_INV
|
FP_X_OFL
|
FP_X_UFL
|
FP_X_DZ
|
FP_X_IMP
));
#endif
}
#elif defined(__sgi)
/* for IRIX to use set_fpc_csr() */
#include <sys/fpu.h>
fpsetmask
(
~
(
FP_X_INV
|
FP_X_OFL
|
FP_X_UFL
|
FP_X_DZ
|
FP_X_IMP
));
#endif
/* __i386__ */
#endif
/* __FreeBSD__ && HAVE_IEEEFP_H */
inline
void
set_proper_floating_point_mode
()
{
#ifdef HAVE_FESETROUND
/* Set FPU rounding mode to "round-to-nearest" */
fesetround
(
FE_TONEAREST
);
#endif
/* HAVE_FESETROUND */
#if defined(__sgi) && defined(HAVE_SYS_FPU_H)
/* Enable denormalized DOUBLE values support for IRIX */
{
union
fpc_csr
n
;
n
.
fc_word
=
get_fpc_csr
();
n
.
fc_struct
.
flush
=
0
;
set_fpc_csr
(
n
.
fc_word
);
}
union
fpc_csr
n
;
n
.
fc_word
=
get_fpc_csr
();
n
.
fc_struct
.
flush
=
0
;
set_fpc_csr
(
n
.
fc_word
);
#endif
}
#else
#define set_proper_floating_point_mode()
#endif
/* __FreeBSD__ && HAVE_IEEEFP_H */
}
/* cplusplus */
...
...
@@ -3279,7 +3284,7 @@ static int init_server_components()
query_cache_init
();
query_cache_resize
(
query_cache_size
);
randominit
(
&
sql_rand
,(
ulong
)
server_start_time
,(
ulong
)
server_start_time
/
2
);
set
_proper_floating_point_mode
();
set
up_fpu
();
init_thr_lock
();
#ifdef HAVE_REPLICATION
init_slave_list
();
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment