Commit 6718d3bc authored by Vlad Lesin's avatar Vlad Lesin

MDEV-21082: isnan/isinf compilation errors, isfinite warnings on MacOS

The fix consists of three commits backported from 10.3:

1) Cleanup isnan() portability checks

(cherry picked from commit 7ffd7fe9)

2) Cleanup isinf() portability checks

Original problem reported by Wlad: re-compilation of 10.3 on top of 10.2
build would cache undefined HAVE_ISINF from 10.2, whereas it is expected
to be 1 in 10.3.

std::isinf() seem to be available on all supported platforms.
(cherry picked from commit bc469a0b)

3) Use std::isfinite in C++ code

This is addition to parent revision fixing build failures.

(cherry picked from commit 54999f4e)
parent b80df9eb
...@@ -225,7 +225,6 @@ CHECK_SYMBOL_REPLACEMENT(S_IROTH _S_IREAD sys/stat.h) ...@@ -225,7 +225,6 @@ CHECK_SYMBOL_REPLACEMENT(S_IROTH _S_IREAD sys/stat.h)
CHECK_SYMBOL_REPLACEMENT(S_IFIFO _S_IFIFO sys/stat.h) CHECK_SYMBOL_REPLACEMENT(S_IFIFO _S_IFIFO sys/stat.h)
CHECK_SYMBOL_REPLACEMENT(SIGQUIT SIGTERM signal.h) CHECK_SYMBOL_REPLACEMENT(SIGQUIT SIGTERM signal.h)
CHECK_SYMBOL_REPLACEMENT(SIGPIPE SIGINT signal.h) CHECK_SYMBOL_REPLACEMENT(SIGPIPE SIGINT signal.h)
CHECK_SYMBOL_REPLACEMENT(isnan _isnan "math.h;float.h")
CHECK_SYMBOL_REPLACEMENT(finite _finite "math;float.h") CHECK_SYMBOL_REPLACEMENT(finite _finite "math;float.h")
CHECK_FUNCTION_REPLACEMENT(popen _popen) CHECK_FUNCTION_REPLACEMENT(popen _popen)
CHECK_FUNCTION_REPLACEMENT(pclose _pclose) CHECK_FUNCTION_REPLACEMENT(pclose _pclose)
......
...@@ -163,7 +163,6 @@ ...@@ -163,7 +163,6 @@
#cmakedefine HAVE_IN_ADDR_T 1 #cmakedefine HAVE_IN_ADDR_T 1
#cmakedefine HAVE_INITGROUPS 1 #cmakedefine HAVE_INITGROUPS 1
#cmakedefine HAVE_ISNAN 1 #cmakedefine HAVE_ISNAN 1
#cmakedefine HAVE_ISINF 1
#cmakedefine HAVE_LARGE_PAGE_OPTION 1 #cmakedefine HAVE_LARGE_PAGE_OPTION 1
#cmakedefine HAVE_LDIV 1 #cmakedefine HAVE_LDIV 1
#cmakedefine HAVE_LRAND48 1 #cmakedefine HAVE_LRAND48 1
...@@ -423,7 +422,6 @@ ...@@ -423,7 +422,6 @@
#cmakedefine mode_t @mode_t@ #cmakedefine mode_t @mode_t@
#cmakedefine SIGQUIT @SIGQUIT@ #cmakedefine SIGQUIT @SIGQUIT@
#cmakedefine SIGPIPE @SIGPIPE@ #cmakedefine SIGPIPE @SIGPIPE@
#cmakedefine isnan @isnan@
#cmakedefine finite @finite@ #cmakedefine finite @finite@
#cmakedefine popen @popen@ #cmakedefine popen @popen@
#cmakedefine pclose @pclose@ #cmakedefine pclose @pclose@
......
...@@ -475,19 +475,8 @@ ELSE() ...@@ -475,19 +475,8 @@ ELSE()
CHECK_SYMBOL_EXISTS(finite "ieeefp.h" HAVE_FINITE) CHECK_SYMBOL_EXISTS(finite "ieeefp.h" HAVE_FINITE)
ENDIF() ENDIF()
CHECK_SYMBOL_EXISTS(log2 math.h HAVE_LOG2) CHECK_SYMBOL_EXISTS(log2 math.h HAVE_LOG2)
CHECK_SYMBOL_EXISTS(isnan math.h HAVE_ISNAN)
CHECK_SYMBOL_EXISTS(rint math.h HAVE_RINT) CHECK_SYMBOL_EXISTS(rint math.h HAVE_RINT)
# isinf() prototype not found on Solaris
CHECK_CXX_SOURCE_COMPILES(
"#include <math.h>
int main() {
isinf(0.0);
return 0;
}" HAVE_ISINF)
# #
# Test for endianess # Test for endianess
# #
......
...@@ -811,26 +811,8 @@ inline unsigned long long my_double2ulonglong(double d) ...@@ -811,26 +811,8 @@ inline unsigned long long my_double2ulonglong(double d)
#define SIZE_T_MAX (~((size_t) 0)) #define SIZE_T_MAX (~((size_t) 0))
#endif #endif
#ifndef isfinite #ifdef __cplusplus
#ifdef HAVE_FINITE
#define isfinite(x) finite(x)
#else
#define finite(x) (1.0 / fabs(x) > 0.0)
#endif /* HAVE_FINITE */
#elif (__cplusplus >= 201103L)
#include <cmath> #include <cmath>
static inline bool isfinite(double x) { return std::isfinite(x); }
#endif /* isfinite */
#ifndef HAVE_ISNAN
#define isnan(x) ((x) != (x))
#endif
#define my_isnan(x) isnan(x)
#ifdef HAVE_ISINF
#define my_isinf(X) isinf(X)
#else /* !HAVE_ISINF */
#define my_isinf(X) (!finite(X) && !isnan(X))
#endif #endif
/* Define missing math constants. */ /* Define missing math constants. */
......
...@@ -2904,7 +2904,7 @@ int Field_decimal::store(double nr) ...@@ -2904,7 +2904,7 @@ int Field_decimal::store(double nr)
return 1; return 1;
} }
if (!isfinite(nr)) // Handle infinity as special case if (!std::isfinite(nr)) // Handle infinity as special case
{ {
overflow(nr < 0.0); overflow(nr < 0.0);
return 1; return 1;
...@@ -4821,7 +4821,7 @@ int truncate_double(double *nr, uint field_length, uint dec, ...@@ -4821,7 +4821,7 @@ int truncate_double(double *nr, uint field_length, uint dec,
int error= 0; int error= 0;
double res= *nr; double res= *nr;
if (isnan(res)) if (std::isnan(res))
{ {
*nr= 0; *nr= 0;
return -1; return -1;
...@@ -4843,7 +4843,7 @@ int truncate_double(double *nr, uint field_length, uint dec, ...@@ -4843,7 +4843,7 @@ int truncate_double(double *nr, uint field_length, uint dec,
max_value-= 1.0 / log_10[dec]; max_value-= 1.0 / log_10[dec];
/* Check for infinity so we don't get NaN in calculations */ /* Check for infinity so we don't get NaN in calculations */
if (!my_isinf(res)) if (!std::isinf(res))
{ {
double tmp= rint((res - floor(res)) * log_10[dec]) / log_10[dec]; double tmp= rint((res - floor(res)) * log_10[dec]) / log_10[dec];
res= floor(res) + tmp; res= floor(res) + tmp;
......
...@@ -2553,12 +2553,12 @@ double my_double_round(double value, longlong dec, bool dec_unsigned, ...@@ -2553,12 +2553,12 @@ double my_double_round(double value, longlong dec, bool dec_unsigned,
volatile double value_div_tmp= value / tmp; volatile double value_div_tmp= value / tmp;
volatile double value_mul_tmp= value * tmp; volatile double value_mul_tmp= value * tmp;
if (!dec_negative && my_isinf(tmp)) // "dec" is too large positive number if (!dec_negative && std::isinf(tmp)) // "dec" is too large positive number
return value; return value;
if (dec_negative && my_isinf(tmp)) if (dec_negative && std::isinf(tmp))
tmp2= 0.0; tmp2= 0.0;
else if (!dec_negative && my_isinf(value_mul_tmp)) else if (!dec_negative && std::isinf(value_mul_tmp))
tmp2= value; tmp2= value;
else if (truncate) else if (truncate)
{ {
......
...@@ -241,7 +241,7 @@ class Item_func :public Item_func_or_sum ...@@ -241,7 +241,7 @@ class Item_func :public Item_func_or_sum
*/ */
inline double check_float_overflow(double value) inline double check_float_overflow(double value)
{ {
return isfinite(value) ? value : raise_float_overflow(); return std::isfinite(value) ? value : raise_float_overflow();
} }
/** /**
Throw an error if the input BIGINT value represented by the Throw an error if the input BIGINT value represented by the
......
...@@ -2655,7 +2655,7 @@ String *Item_func_format::val_str_ascii(String *str) ...@@ -2655,7 +2655,7 @@ String *Item_func_format::val_str_ascii(String *str)
return 0; /* purecov: inspected */ return 0; /* purecov: inspected */
nr= my_double_round(nr, (longlong) dec, FALSE, FALSE); nr= my_double_round(nr, (longlong) dec, FALSE, FALSE);
str->set_real(nr, dec, &my_charset_numeric); str->set_real(nr, dec, &my_charset_numeric);
if (!isfinite(nr)) if (!std::isfinite(nr))
return str; return str;
str_length=str->length(); str_length=str->length();
} }
......
...@@ -1808,7 +1808,7 @@ double Item_sum_std::val_real() ...@@ -1808,7 +1808,7 @@ double Item_sum_std::val_real()
{ {
DBUG_ASSERT(fixed == 1); DBUG_ASSERT(fixed == 1);
double nr= Item_sum_variance::val_real(); double nr= Item_sum_variance::val_real();
if (isnan(nr)) if (std::isnan(nr))
{ {
/* /*
variance_fp_recurrence_next() can overflow in some cases and return "nan": variance_fp_recurrence_next() can overflow in some cases and return "nan":
...@@ -1820,7 +1820,7 @@ double Item_sum_std::val_real() ...@@ -1820,7 +1820,7 @@ double Item_sum_std::val_real()
null_value= true; // Convert "nan" to NULL null_value= true; // Convert "nan" to NULL
return 0; return 0;
} }
if (my_isinf(nr)) if (std::isinf(nr))
return DBL_MAX; return DBL_MAX;
DBUG_ASSERT(nr >= 0.0); DBUG_ASSERT(nr >= 0.0);
return sqrt(nr); return sqrt(nr);
......
...@@ -778,7 +778,6 @@ uint hp_rb_make_key(HP_KEYDEF *keydef, uchar *key, ...@@ -778,7 +778,6 @@ uint hp_rb_make_key(HP_KEYDEF *keydef, uchar *key,
uchar *pos= (uchar*) rec + seg->start; uchar *pos= (uchar*) rec + seg->start;
DBUG_ASSERT(seg->type != HA_KEYTYPE_BIT); DBUG_ASSERT(seg->type != HA_KEYTYPE_BIT);
#ifdef HAVE_ISNAN
if (seg->type == HA_KEYTYPE_FLOAT) if (seg->type == HA_KEYTYPE_FLOAT)
{ {
float nr; float nr;
...@@ -802,7 +801,6 @@ uint hp_rb_make_key(HP_KEYDEF *keydef, uchar *key, ...@@ -802,7 +801,6 @@ uint hp_rb_make_key(HP_KEYDEF *keydef, uchar *key,
continue; continue;
} }
} }
#endif
pos+= length; pos+= length;
while (length--) while (length--)
{ {
......
...@@ -367,7 +367,7 @@ mbr_join_square( ...@@ -367,7 +367,7 @@ mbr_join_square(
/* Check if finite (not infinity or NaN), /* Check if finite (not infinity or NaN),
so we don't get NaN in calculations */ so we don't get NaN in calculations */
if (!isfinite(square)) { if (!std::isfinite(square)) {
return DBL_MAX; return DBL_MAX;
} }
......
...@@ -1969,7 +1969,7 @@ rtr_estimate_n_rows_in_range( ...@@ -1969,7 +1969,7 @@ rtr_estimate_n_rows_in_range(
mtr_commit(&mtr); mtr_commit(&mtr);
mem_heap_free(heap); mem_heap_free(heap);
if (!isfinite(area)) { if (!std::isfinite(area)) {
return(HA_POS_ERROR); return(HA_POS_ERROR);
} }
......
...@@ -279,7 +279,6 @@ MARIA_KEY *_ma_make_key(MARIA_HA *info, MARIA_KEY *int_key, uint keynr, ...@@ -279,7 +279,6 @@ MARIA_KEY *_ma_make_key(MARIA_HA *info, MARIA_KEY *int_key, uint keynr,
} }
else if (keyseg->flag & HA_SWAP_KEY) else if (keyseg->flag & HA_SWAP_KEY)
{ /* Numerical column */ { /* Numerical column */
#ifdef HAVE_ISNAN
if (type == HA_KEYTYPE_FLOAT) if (type == HA_KEYTYPE_FLOAT)
{ {
float nr; float nr;
...@@ -303,7 +302,6 @@ MARIA_KEY *_ma_make_key(MARIA_HA *info, MARIA_KEY *int_key, uint keynr, ...@@ -303,7 +302,6 @@ MARIA_KEY *_ma_make_key(MARIA_HA *info, MARIA_KEY *int_key, uint keynr,
continue; continue;
} }
} }
#endif
pos+=length; pos+=length;
while (length--) while (length--)
{ {
......
...@@ -77,7 +77,6 @@ MARIA_KEY *_ma_sp_make_key(MARIA_HA *info, MARIA_KEY *ret_key, uint keynr, ...@@ -77,7 +77,6 @@ MARIA_KEY *_ma_sp_make_key(MARIA_HA *info, MARIA_KEY *ret_key, uint keynr,
DBUG_ASSERT(keyseg->type == HA_KEYTYPE_DOUBLE); DBUG_ASSERT(keyseg->type == HA_KEYTYPE_DOUBLE);
val= mbr[start / sizeof (double)]; val= mbr[start / sizeof (double)];
#ifdef HAVE_ISNAN
if (isnan(val)) if (isnan(val))
{ {
bzero(key, length); bzero(key, length);
...@@ -85,7 +84,6 @@ MARIA_KEY *_ma_sp_make_key(MARIA_HA *info, MARIA_KEY *ret_key, uint keynr, ...@@ -85,7 +84,6 @@ MARIA_KEY *_ma_sp_make_key(MARIA_HA *info, MARIA_KEY *ret_key, uint keynr,
len+= length; len+= length;
continue; continue;
} }
#endif
if (keyseg->flag & HA_SWAP_KEY) if (keyseg->flag & HA_SWAP_KEY)
{ {
......
...@@ -150,7 +150,6 @@ uint _mi_make_key(register MI_INFO *info, uint keynr, uchar *key, ...@@ -150,7 +150,6 @@ uint _mi_make_key(register MI_INFO *info, uint keynr, uchar *key,
} }
else if (keyseg->flag & HA_SWAP_KEY) else if (keyseg->flag & HA_SWAP_KEY)
{ /* Numerical column */ { /* Numerical column */
#ifdef HAVE_ISNAN
if (type == HA_KEYTYPE_FLOAT) if (type == HA_KEYTYPE_FLOAT)
{ {
float nr; float nr;
...@@ -174,7 +173,6 @@ uint _mi_make_key(register MI_INFO *info, uint keynr, uchar *key, ...@@ -174,7 +173,6 @@ uint _mi_make_key(register MI_INFO *info, uint keynr, uchar *key,
continue; continue;
} }
} }
#endif
pos+=length; pos+=length;
while (length--) while (length--)
{ {
......
...@@ -66,7 +66,6 @@ uint sp_make_key(register MI_INFO *info, uint keynr, uchar *key, ...@@ -66,7 +66,6 @@ uint sp_make_key(register MI_INFO *info, uint keynr, uchar *key,
DBUG_ASSERT(keyseg->type == HA_KEYTYPE_DOUBLE); DBUG_ASSERT(keyseg->type == HA_KEYTYPE_DOUBLE);
val= mbr[start / sizeof (double)]; val= mbr[start / sizeof (double)];
#ifdef HAVE_ISNAN
if (isnan(val)) if (isnan(val))
{ {
bzero(key, length); bzero(key, length);
...@@ -74,7 +73,6 @@ uint sp_make_key(register MI_INFO *info, uint keynr, uchar *key, ...@@ -74,7 +73,6 @@ uint sp_make_key(register MI_INFO *info, uint keynr, uchar *key,
len+= length; len+= length;
continue; continue;
} }
#endif
if (keyseg->flag & HA_SWAP_KEY) if (keyseg->flag & HA_SWAP_KEY)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment