Bug #9596 » 0001-Add-regression-tests-for-floating-point-retrieval.patch
| test/dbo/DboTest.C | ||
|---|---|---|
|
}
|
||
|
}
|
||
|
BOOST_AUTO_TEST_CASE( dbo_test48 )
|
||
|
{
|
||
|
// Test that Dbo can retrieve float values without precision loss
|
||
|
// Use a simple SELECT statement as source, so Dbo is not involved in storing data
|
||
|
DboFixture f;
|
||
|
#define FLOAT_WITH_STRING(fl) { fl ## f, #fl }
|
||
|
typedef std::tuple<float, std::string> FloatWithString;
|
||
|
std::vector<FloatWithString> fws_v = {
|
||
|
FLOAT_WITH_STRING(3.354194e-37),
|
||
|
FLOAT_WITH_STRING(0.000100000005),
|
||
|
FLOAT_WITH_STRING(0.000106811516),
|
||
|
FLOAT_WITH_STRING(0.98999995),
|
||
|
FLOAT_WITH_STRING(2.7182817)
|
||
|
};
|
||
|
#undef FLOAT_WITH_STRING
|
||
|
for (auto fws: fws_v) {
|
||
|
{
|
||
|
struct {
|
||
|
float as_float;
|
||
|
std::string as_string;
|
||
|
} in_value, out_value;
|
||
|
std::tie(in_value.as_float, in_value.as_string) = fws;
|
||
|
dbo::Transaction t(*f.session_);
|
||
|
std::tie(out_value.as_float, out_value.as_string) = f.session_->query<FloatWithString>(
|
||
|
"SELECT CAST(" + in_value.as_string + " AS FLOAT(24)), '" + in_value.as_string + "'"
|
||
|
).resultValue();
|
||
|
// Sanity check: the string version of the float should be unchanged
|
||
|
BOOST_CHECK_EQUAL(in_value.as_string, out_value.as_string);
|
||
|
// The retrieved float value should also match
|
||
|
BOOST_CHECK_EQUAL(in_value.as_float, out_value.as_float);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
BOOST_AUTO_TEST_CASE( dbo_test49 )
|
||
|
{
|
||
|
// Test that Dbo can retrieve double values without precision loss
|
||
|
// Use a simple SELECT statement as source, so Dbo is not involved in storing data
|
||
|
DboFixture f;
|
||
|
#define DOUBLE_WITH_STRING(dbl) { dbl, #dbl }
|
||
|
typedef std::tuple<double, std::string> DoubleWithString;
|
||
|
std::vector<DoubleWithString> dws_v = {
|
||
|
DOUBLE_WITH_STRING(9.999999999999999e-05),
|
||
|
DOUBLE_WITH_STRING(0.9999999999999999),
|
||
|
DOUBLE_WITH_STRING(1.0000000000000007),
|
||
|
DOUBLE_WITH_STRING(1000.0000000000001),
|
||
|
DOUBLE_WITH_STRING(99999999.99999999),
|
||
|
DOUBLE_WITH_STRING(9.999999999999999e+17),
|
||
|
DOUBLE_WITH_STRING(1.0000000000000001e+18)
|
||
|
};
|
||
|
#undef DOUBLE_WITH_STRING
|
||
|
for (auto dws: dws_v) {
|
||
|
{
|
||
|
struct {
|
||
|
double as_double;
|
||
|
std::string as_string;
|
||
|
} in_value, out_value;
|
||
|
std::tie(in_value.as_double, in_value.as_string) = dws;
|
||
|
dbo::Transaction t(*f.session_);
|
||
|
std::tie(out_value.as_double, out_value.as_string) = f.session_->query<DoubleWithString>(
|
||
|
"SELECT CAST(" + in_value.as_string + " AS FLOAT(53)), '" + in_value.as_string + "'"
|
||
|
).resultValue();
|
||
|
// Sanity check: the string version of the double should be unchanged
|
||
|
BOOST_CHECK_EQUAL(in_value.as_string, out_value.as_string);
|
||
|
// The retrieved double value should also match
|
||
|
BOOST_CHECK_EQUAL(in_value.as_double, out_value.as_double);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
BOOST_AUTO_TEST_SUITE_END()
|
||