]> granicus.if.org Git - postgresql/commitdiff
Improve type conversion of SPI_processed in Python
authorPeter Eisentraut <peter_e@gmx.net>
Sat, 20 Jan 2018 13:02:01 +0000 (08:02 -0500)
committerPeter Eisentraut <peter_e@gmx.net>
Sat, 20 Jan 2018 13:02:01 +0000 (08:02 -0500)
The previous code converted SPI_processed to a Python float if it didn't
fit into a Python int.  But Python longs have unlimited precision, so
use that instead in all cases.

As in eee50a8d4c389171ad5180568a7221f7e9b28f09, we use the Python
LongLong API unconditionally for simplicity.

Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
src/pl/plpython/plpy_cursorobject.c
src/pl/plpython/plpy_spi.c

index a527585b81829eb5791f3f6e866136b72d7659f8..e32bc568bc284cd28cb188fbb8a91606c11ba256 100644 (file)
@@ -444,9 +444,7 @@ PLy_cursor_fetch(PyObject *self, PyObject *args)
                ret->status = PyInt_FromLong(SPI_OK_FETCH);
 
                Py_DECREF(ret->nrows);
-               ret->nrows = (SPI_processed > (uint64) LONG_MAX) ?
-                       PyFloat_FromDouble((double) SPI_processed) :
-                       PyInt_FromLong((long) SPI_processed);
+               ret->nrows = PyLong_FromUnsignedLongLong(SPI_processed);
 
                if (SPI_processed != 0)
                {
index 0c623a945814690d7bab2e353dd4522b28e15d73..41155fc81ec7a10390716197de1ba0fe39b954c0 100644 (file)
@@ -371,9 +371,7 @@ PLy_spi_execute_fetch_result(SPITupleTable *tuptable, uint64 rows, int status)
        if (status > 0 && tuptable == NULL)
        {
                Py_DECREF(result->nrows);
-               result->nrows = (rows > (uint64) LONG_MAX) ?
-                       PyFloat_FromDouble((double) rows) :
-                       PyInt_FromLong((long) rows);
+               result->nrows = PyLong_FromUnsignedLongLong(rows);
        }
        else if (status > 0 && tuptable != NULL)
        {
@@ -381,9 +379,7 @@ PLy_spi_execute_fetch_result(SPITupleTable *tuptable, uint64 rows, int status)
                MemoryContext cxt;
 
                Py_DECREF(result->nrows);
-               result->nrows = (rows > (uint64) LONG_MAX) ?
-                       PyFloat_FromDouble((double) rows) :
-                       PyInt_FromLong((long) rows);
+               result->nrows = PyLong_FromUnsignedLongLong(rows);
 
                cxt = AllocSetContextCreate(CurrentMemoryContext,
                                                                        "PL/Python temp context",