]> granicus.if.org Git - postgresql/commitdiff
PL/Python: Convert oid to long/int
authorPeter Eisentraut <peter_e@gmx.net>
Sat, 29 Sep 2012 16:41:00 +0000 (12:41 -0400)
committerPeter Eisentraut <peter_e@gmx.net>
Sat, 29 Sep 2012 16:41:00 +0000 (12:41 -0400)
oid is a numeric type, so transform it to the appropriate Python
numeric type like the other ones.

doc/src/sgml/plpython.sgml
src/pl/plpython/expected/plpython_types.out
src/pl/plpython/expected/plpython_types_3.out
src/pl/plpython/plpy_typeio.c
src/pl/plpython/sql/plpython_types.sql

index c15188c3e00f76dde67e34ae23d0523881b66b2e..dd50c4475da69493416a319a1ce3433b06e239d8 100644 (file)
@@ -302,7 +302,7 @@ $$ LANGUAGE plpythonu;
       <para>
        PostgreSQL <type>smallint</type> and <type>int</type> are
        converted to Python <type>int</type>.
-       PostgreSQL <type>bigint</type> is converted
+       PostgreSQL <type>bigint</type> and <type>oid</type> are converted
        to <type>long</type> in Python 2 and to <type>int</type> in
        Python 3.
       </para>
index 888161323d1cf26932c5fed9f7dffbf5c89d8c9c..46413455c8be3e226cc431564c607a455b8ec9af 100644 (file)
@@ -321,6 +321,34 @@ CONTEXT:  PL/Python function "test_type_conversion_float8"
                             
 (1 row)
 
+CREATE FUNCTION test_type_conversion_oid(x oid) RETURNS oid AS $$
+plpy.info(x, type(x))
+return x
+$$ LANGUAGE plpythonu;
+SELECT * FROM test_type_conversion_oid(100);
+INFO:  (100L, <type 'long'>)
+CONTEXT:  PL/Python function "test_type_conversion_oid"
+ test_type_conversion_oid 
+--------------------------
+                      100
+(1 row)
+
+SELECT * FROM test_type_conversion_oid(2147483649);
+INFO:  (2147483649L, <type 'long'>)
+CONTEXT:  PL/Python function "test_type_conversion_oid"
+ test_type_conversion_oid 
+--------------------------
+               2147483649
+(1 row)
+
+SELECT * FROM test_type_conversion_oid(null);
+INFO:  (None, <type 'NoneType'>)
+CONTEXT:  PL/Python function "test_type_conversion_oid"
+ test_type_conversion_oid 
+--------------------------
+                         
+(1 row)
+
 CREATE FUNCTION test_type_conversion_text(x text) RETURNS text AS $$
 plpy.info(x, type(x))
 return x
index d1ae86377bd17306cd9e834d50ba6548f67c8173..511ef5a4c9a976bddd90b5e572eb81ddbf9cf629 100644 (file)
@@ -321,6 +321,34 @@ CONTEXT:  PL/Python function "test_type_conversion_float8"
                             
 (1 row)
 
+CREATE FUNCTION test_type_conversion_oid(x oid) RETURNS oid AS $$
+plpy.info(x, type(x))
+return x
+$$ LANGUAGE plpython3u;
+SELECT * FROM test_type_conversion_oid(100);
+INFO:  (100, <class 'int'>)
+CONTEXT:  PL/Python function "test_type_conversion_oid"
+ test_type_conversion_oid 
+--------------------------
+                      100
+(1 row)
+
+SELECT * FROM test_type_conversion_oid(2147483649);
+INFO:  (2147483649, <class 'int'>)
+CONTEXT:  PL/Python function "test_type_conversion_oid"
+ test_type_conversion_oid 
+--------------------------
+               2147483649
+(1 row)
+
+SELECT * FROM test_type_conversion_oid(null);
+INFO:  (None, <class 'NoneType'>)
+CONTEXT:  PL/Python function "test_type_conversion_oid"
+ test_type_conversion_oid 
+--------------------------
+                         
+(1 row)
+
 CREATE FUNCTION test_type_conversion_text(x text) RETURNS text AS $$
 plpy.info(x, type(x))
 return x
index 2402c151a4f885c1389d0480c3c2e2c0b6fa97cd..0ad542f21e96fdbc19fb8500d20d05dd91e3ba73 100644 (file)
@@ -39,6 +39,7 @@ static PyObject *PLyFloat_FromNumeric(PLyDatumToOb *arg, Datum d);
 static PyObject *PLyInt_FromInt16(PLyDatumToOb *arg, Datum d);
 static PyObject *PLyInt_FromInt32(PLyDatumToOb *arg, Datum d);
 static PyObject *PLyLong_FromInt64(PLyDatumToOb *arg, Datum d);
+static PyObject *PLyLong_FromOid(PLyDatumToOb *arg, Datum d);
 static PyObject *PLyBytes_FromBytea(PLyDatumToOb *arg, Datum d);
 static PyObject *PLyString_FromDatum(PLyDatumToOb *arg, Datum d);
 static PyObject *PLyList_FromArray(PLyDatumToOb *arg, Datum d);
@@ -460,6 +461,9 @@ PLy_input_datum_func2(PLyDatumToOb *arg, Oid typeOid, HeapTuple typeTup)
                case INT8OID:
                        arg->func = PLyLong_FromInt64;
                        break;
+               case OIDOID:
+                       arg->func = PLyLong_FromOid;
+                       break;
                case BYTEAOID:
                        arg->func = PLyBytes_FromBytea;
                        break;
@@ -546,6 +550,12 @@ PLyLong_FromInt64(PLyDatumToOb *arg, Datum d)
                return PyLong_FromLong(DatumGetInt64(d));
 }
 
+static PyObject *
+PLyLong_FromOid(PLyDatumToOb *arg, Datum d)
+{
+       return PyLong_FromUnsignedLong(DatumGetObjectId(d));
+}
+
 static PyObject *
 PLyBytes_FromBytea(PLyDatumToOb *arg, Datum d)
 {
index 82cd9d42680733cd20e8ee17fdfecb93b6664932..6a50b4236db0fbc8d2cbdb1ea3f7a9fb8005ddea 100644 (file)
@@ -119,6 +119,16 @@ SELECT * FROM test_type_conversion_float8(5000000000.5);
 SELECT * FROM test_type_conversion_float8(null);
 
 
+CREATE FUNCTION test_type_conversion_oid(x oid) RETURNS oid AS $$
+plpy.info(x, type(x))
+return x
+$$ LANGUAGE plpythonu;
+
+SELECT * FROM test_type_conversion_oid(100);
+SELECT * FROM test_type_conversion_oid(2147483649);
+SELECT * FROM test_type_conversion_oid(null);
+
+
 CREATE FUNCTION test_type_conversion_text(x text) RETURNS text AS $$
 plpy.info(x, type(x))
 return x