From 38f71761308da491de747ccf0ed2f9387ee25f8d Mon Sep 17 00:00:00 2001 From: olszewst <tomasz.olszewski@sabre.com> Date: Wed, 10 Apr 2013 16:12:32 +0200 Subject: [PATCH] Correct binding to NUMBER in Oracle backend. On platforms where std::numeric_limits<int>::digits10 == 9, NUMBER(9,0) can be represented losslessly using C++ type int. Oracle data type NUMBER(precision,scale) is bound to C++ int if scale is 0 and precision < std::numeric_limits<int>::digits10. This comparison prevents conversion of NUMBER(9,0) to int, thus it is corrected using weaker form: precision <= std::numeric_limits<int>::digits10. Fixes #126 Close #128 (Original commit message amended by Mateusz Loskot) --- doc/backends/oracle.html | 2 +- src/backends/oracle/statement.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/backends/oracle.html b/doc/backends/oracle.html index 44b1e09a..48bd41c7 100644 --- a/doc/backends/oracle.html +++ b/doc/backends/oracle.html @@ -121,7 +121,7 @@ sql << "select count(*) from user_tables", into(count); <td><code>double</code></td> </tr> <tr> - <td>number<br /><i>(where scale = 0 and precision < std::numeric_limits<int>::digits10)</i></td> + <td>number<br /><i>(where scale = 0 and precision ≤ std::numeric_limits<int>::digits10)</i></td> <td><code>dt_integer</code></td> <td><code>int</code></td> </tr> diff --git a/src/backends/oracle/statement.cpp b/src/backends/oracle/statement.cpp index 7cd296dc..0b3d7093 100644 --- a/src/backends/oracle/statement.cpp +++ b/src/backends/oracle/statement.cpp @@ -283,7 +283,7 @@ void oracle_statement_backend::describe_column(int colNum, data_type &type, else type = dt_double; } - else if (precision < std::numeric_limits<int>::digits10) + else if (precision <= std::numeric_limits<int>::digits10) { type = dt_integer; } -- GitLab