mirror of
https://github.com/postgres/postgres.git
synced 2025-05-06 19:59:18 +03:00
PL/Python: Avoid lossiness in float conversion
PL/Python uses str() to convert Python values back to PostgreSQL, but str() is lossy for float values, so use repr() instead in that case. Author: Marko Kreen <markokr@gmail.com>
This commit is contained in:
parent
bc93ac12c2
commit
1ce7a57ca6
@ -354,6 +354,14 @@ CONTEXT: PL/Python function "test_type_conversion_float8"
|
|||||||
|
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
|
SELECT * FROM test_type_conversion_float8(100100100.654321);
|
||||||
|
INFO: (100100100.654321, <type 'float'>)
|
||||||
|
CONTEXT: PL/Python function "test_type_conversion_float8"
|
||||||
|
test_type_conversion_float8
|
||||||
|
-----------------------------
|
||||||
|
100100100.654321
|
||||||
|
(1 row)
|
||||||
|
|
||||||
CREATE FUNCTION test_type_conversion_oid(x oid) RETURNS oid AS $$
|
CREATE FUNCTION test_type_conversion_oid(x oid) RETURNS oid AS $$
|
||||||
plpy.info(x, type(x))
|
plpy.info(x, type(x))
|
||||||
return x
|
return x
|
||||||
|
@ -760,6 +760,18 @@ PLyObject_ToDatum(PLyObToDatum *arg, int32 typmod, PyObject *plrv)
|
|||||||
|
|
||||||
if (PyUnicode_Check(plrv))
|
if (PyUnicode_Check(plrv))
|
||||||
plrv_bo = PLyUnicode_Bytes(plrv);
|
plrv_bo = PLyUnicode_Bytes(plrv);
|
||||||
|
else if (PyFloat_Check(plrv))
|
||||||
|
{
|
||||||
|
/* use repr() for floats, str() is lossy */
|
||||||
|
#if PY_MAJOR_VERSION >= 3
|
||||||
|
PyObject *s = PyObject_Repr(plrv);
|
||||||
|
|
||||||
|
plrv_bo = PLyUnicode_Bytes(s);
|
||||||
|
Py_XDECREF(s);
|
||||||
|
#else
|
||||||
|
plrv_bo = PyObject_Repr(plrv);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
#if PY_MAJOR_VERSION >= 3
|
#if PY_MAJOR_VERSION >= 3
|
||||||
|
@ -122,6 +122,7 @@ SELECT * FROM test_type_conversion_float8(100);
|
|||||||
SELECT * FROM test_type_conversion_float8(-100);
|
SELECT * FROM test_type_conversion_float8(-100);
|
||||||
SELECT * FROM test_type_conversion_float8(5000000000.5);
|
SELECT * FROM test_type_conversion_float8(5000000000.5);
|
||||||
SELECT * FROM test_type_conversion_float8(null);
|
SELECT * FROM test_type_conversion_float8(null);
|
||||||
|
SELECT * FROM test_type_conversion_float8(100100100.654321);
|
||||||
|
|
||||||
|
|
||||||
CREATE FUNCTION test_type_conversion_oid(x oid) RETURNS oid AS $$
|
CREATE FUNCTION test_type_conversion_oid(x oid) RETURNS oid AS $$
|
||||||
|
Loading…
x
Reference in New Issue
Block a user