Using strtol() on int8 values (input parameters or result sets) in

plpython would result in numeric overflows causing the backend to
terminate abruptly.

This patch fixes it.

Bradley McLean
REL7_2_STABLE
Bruce Momjian 24 years ago
parent a6020b396b
commit 96471bf106
  1. 15
      src/pl/plpython/plpython.c

@ -29,7 +29,7 @@
* MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/pl/plpython/plpython.c,v 1.6 2001/10/01 17:53:12 tgl Exp $ * $Header: /cvsroot/pgsql/src/pl/plpython/plpython.c,v 1.7 2001/10/04 15:45:49 momjian Exp $
* *
********************************************************************* *********************************************************************
*/ */
@ -229,6 +229,7 @@ static PyObject *PLyDict_FromTuple(PLyTypeInfo *, HeapTuple, TupleDesc);
static PyObject *PLyBool_FromString(const char *); static PyObject *PLyBool_FromString(const char *);
static PyObject *PLyFloat_FromString(const char *); static PyObject *PLyFloat_FromString(const char *);
static PyObject *PLyInt_FromString(const char *); static PyObject *PLyInt_FromString(const char *);
static PyObject *PLyLong_FromString(const char *);
static PyObject *PLyString_FromString(const char *); static PyObject *PLyString_FromString(const char *);
@ -1378,12 +1379,16 @@ PLy_input_datum_func2(PLyDatumToOb *arg, Form_pg_type typeStruct)
case 'i': case 'i':
{ {
if ((strncasecmp("int", type, 3) == 0) && if ((strncasecmp("int", type, 3) == 0) &&
((type[3] == '4') || (type[3] == '2') || (type[3] == '8')) && ((type[3] == '4') || (type[3] == '2')) &&
(type[4] == '\0')) (type[4] == '\0'))
{ {
arg->func = PLyInt_FromString; arg->func = PLyInt_FromString;
return; return;
} }
else if ( strcasecmp("int8", type) == 0 )
{
arg->func = PLyLong_FromString;
}
break; break;
} }
case 'n': case 'n':
@ -1464,6 +1469,12 @@ PLyInt_FromString(const char *src)
return PyInt_FromLong(v); return PyInt_FromLong(v);
} }
PyObject *
PLyLong_FromString(const char *src)
{
return PyLong_FromString((char *)src,NULL,0);
}
PyObject * PyObject *
PLyString_FromString(const char *src) PLyString_FromString(const char *src)
{ {

Loading…
Cancel
Save