Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
plpython: Code cleanup related to removal of Python 2 support.
authorAndres Freund <andres@anarazel.de>
Tue, 8 Mar 2022 02:30:28 +0000 (18:30 -0800)
committerAndres Freund <andres@anarazel.de>
Tue, 8 Mar 2022 02:30:28 +0000 (18:30 -0800)
Since 19252e8ec93 we reject Python 2 during build configuration. Now that the
dust on the buildfarm has settled, remove Python 2 specific code, including
the "Python 2/3 porting layer".

The code to detect conflicts between plpython using Python 2 and 3 is not
removed, in case somebody creates an out-of-tree version adding back support
for Python 2.

Reviewed-By: Peter Eisentraut <peter@eisentraut.org>
Reviewed-By: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/20211031184548.g4sxfe47n2kyi55r@alap3.anarazel.de

16 files changed:
contrib/hstore_plpython/hstore_plpython.c
contrib/jsonb_plpython/jsonb_plpython.c
contrib/ltree_plpython/ltree_plpython.c
src/pl/plpython/plpy_cursorobject.c
src/pl/plpython/plpy_elog.c
src/pl/plpython/plpy_exec.c
src/pl/plpython/plpy_main.c
src/pl/plpython/plpy_planobject.c
src/pl/plpython/plpy_plpymodule.c
src/pl/plpython/plpy_plpymodule.h
src/pl/plpython/plpy_resultobject.c
src/pl/plpython/plpy_spi.c
src/pl/plpython/plpy_typeio.c
src/pl/plpython/plpy_util.c
src/pl/plpython/plpy_util.h
src/pl/plpython/plpython.h

index 39bad5580232117cb4d813e2f50017d1dd4ba8dd..889ece315df8f0e7cebf611a0d804d536bfdb429 100644 (file)
@@ -12,10 +12,8 @@ extern void _PG_init(void);
 /* Linkage to functions in plpython module */
 typedef char *(*PLyObject_AsString_t) (PyObject *plrv);
 static PLyObject_AsString_t PLyObject_AsString_p;
-#if PY_MAJOR_VERSION >= 3
 typedef PyObject *(*PLyUnicode_FromStringAndSize_t) (const char *s, Py_ssize_t size);
 static PLyUnicode_FromStringAndSize_t PLyUnicode_FromStringAndSize_p;
-#endif
 
 /* Linkage to functions in hstore module */
 typedef HStore *(*hstoreUpgrade_t) (Datum orig);
@@ -41,12 +39,10 @@ _PG_init(void)
    PLyObject_AsString_p = (PLyObject_AsString_t)
        load_external_function("$libdir/" PLPYTHON_LIBNAME, "PLyObject_AsString",
                               true, NULL);
-#if PY_MAJOR_VERSION >= 3
    AssertVariableIsOfType(&PLyUnicode_FromStringAndSize, PLyUnicode_FromStringAndSize_t);
    PLyUnicode_FromStringAndSize_p = (PLyUnicode_FromStringAndSize_t)
        load_external_function("$libdir/" PLPYTHON_LIBNAME, "PLyUnicode_FromStringAndSize",
                               true, NULL);
-#endif
    AssertVariableIsOfType(&hstoreUpgrade, hstoreUpgrade_t);
    hstoreUpgrade_p = (hstoreUpgrade_t)
        load_external_function("$libdir/hstore", "hstoreUpgrade",
@@ -102,16 +98,16 @@ hstore_to_plpython(PG_FUNCTION_ARGS)
    {
        PyObject   *key;
 
-       key = PyString_FromStringAndSize(HSTORE_KEY(entries, base, i),
-                                        HSTORE_KEYLEN(entries, i));
+       key = PLyUnicode_FromStringAndSize(HSTORE_KEY(entries, base, i),
+                                         HSTORE_KEYLEN(entries, i));
        if (HSTORE_VALISNULL(entries, i))
            PyDict_SetItem(dict, key, Py_None);
        else
        {
            PyObject   *value;
 
-           value = PyString_FromStringAndSize(HSTORE_VAL(entries, base, i),
-                                              HSTORE_VALLEN(entries, i));
+           value = PLyUnicode_FromStringAndSize(HSTORE_VAL(entries, base, i),
+                                               HSTORE_VALLEN(entries, i));
            PyDict_SetItem(dict, key, value);
            Py_XDECREF(value);
        }
index 836c17877065c6d2c298bed0d7afdff249048006..03bbfa87d9a59b297632bdf5d8b8293ef06b82fe 100644 (file)
@@ -28,11 +28,9 @@ static PyObject *PLyObject_FromJsonbContainer(JsonbContainer *jsonb);
 static JsonbValue *PLyObject_ToJsonbValue(PyObject *obj,
                                          JsonbParseState **jsonb_state, bool is_elem);
 
-#if PY_MAJOR_VERSION >= 3
 typedef PyObject *(*PLyUnicode_FromStringAndSize_t)
            (const char *s, Py_ssize_t size);
 static PLyUnicode_FromStringAndSize_t PLyUnicode_FromStringAndSize_p;
-#endif
 
 /*
  * Module initialize function: fetch function pointers for cross-module calls.
@@ -45,13 +43,10 @@ _PG_init(void)
    PLyObject_AsString_p = (PLyObject_AsString_t)
        load_external_function("$libdir/" PLPYTHON_LIBNAME, "PLyObject_AsString",
                               true, NULL);
-#if PY_MAJOR_VERSION >= 3
    AssertVariableIsOfType(&PLyUnicode_FromStringAndSize, PLyUnicode_FromStringAndSize_t);
    PLyUnicode_FromStringAndSize_p = (PLyUnicode_FromStringAndSize_t)
        load_external_function("$libdir/" PLPYTHON_LIBNAME, "PLyUnicode_FromStringAndSize",
                               true, NULL);
-#endif
-
    AssertVariableIsOfType(&PLy_elog_impl, PLy_elog_impl_t);
    PLy_elog_impl_p = (PLy_elog_impl_t)
        load_external_function("$libdir/" PLPYTHON_LIBNAME, "PLy_elog_impl",
@@ -65,25 +60,25 @@ _PG_init(void)
 #define PLy_elog (PLy_elog_impl_p)
 
 /*
- * PLyString_FromJsonbValue
+ * PLyUnicode_FromJsonbValue
  *
  * Transform string JsonbValue to Python string.
  */
 static PyObject *
-PLyString_FromJsonbValue(JsonbValue *jbv)
+PLyUnicode_FromJsonbValue(JsonbValue *jbv)
 {
    Assert(jbv->type == jbvString);
 
-   return PyString_FromStringAndSize(jbv->val.string.val, jbv->val.string.len);
+   return PLyUnicode_FromStringAndSize(jbv->val.string.val, jbv->val.string.len);
 }
 
 /*
- * PLyString_ToJsonbValue
+ * PLyUnicode_ToJsonbValue
  *
  * Transform Python string to JsonbValue.
  */
 static void
-PLyString_ToJsonbValue(PyObject *obj, JsonbValue *jbvElem)
+PLyUnicode_ToJsonbValue(PyObject *obj, JsonbValue *jbvElem)
 {
    jbvElem->type = jbvString;
    jbvElem->val.string.val = PLyObject_AsString(obj);
@@ -118,7 +113,7 @@ PLyObject_FromJsonbValue(JsonbValue *jsonbValue)
            }
 
        case jbvString:
-           return PLyString_FromJsonbValue(jsonbValue);
+           return PLyUnicode_FromJsonbValue(jsonbValue);
 
        case jbvBool:
            if (jsonbValue->val.boolean)
@@ -210,7 +205,7 @@ PLyObject_FromJsonbContainer(JsonbContainer *jsonb)
                        if (r != WJB_KEY)
                            continue;
 
-                       key = PLyString_FromJsonbValue(&v);
+                       key = PLyUnicode_FromJsonbValue(&v);
                        if (!key)
                        {
                            Py_XDECREF(result_v);
@@ -298,7 +293,7 @@ PLyMapping_ToJsonbValue(PyObject *obj, JsonbParseState **jsonb_state)
            else
            {
                /* All others types of keys we serialize to string */
-               PLyString_ToJsonbValue(key, &jbvKey);
+               PLyUnicode_ToJsonbValue(key, &jbvKey);
            }
 
            (void) pushJsonbValue(jsonb_state, WJB_KEY, &jbvKey);
@@ -415,7 +410,7 @@ PLyObject_ToJsonbValue(PyObject *obj, JsonbParseState **jsonb_state, bool is_ele
 {
    JsonbValue *out;
 
-   if (!(PyString_Check(obj) || PyUnicode_Check(obj)))
+   if (!PyUnicode_Check(obj))
    {
        if (PySequence_Check(obj))
            return PLySequence_ToJsonbValue(obj, jsonb_state);
@@ -427,8 +422,8 @@ PLyObject_ToJsonbValue(PyObject *obj, JsonbParseState **jsonb_state, bool is_ele
 
    if (obj == Py_None)
        out->type = jbvNull;
-   else if (PyString_Check(obj) || PyUnicode_Check(obj))
-       PLyString_ToJsonbValue(obj, out);
+   else if (PyUnicode_Check(obj))
+       PLyUnicode_ToJsonbValue(obj, out);
 
    /*
     * PyNumber_Check() returns true for booleans, so boolean check should
index 1570e77dd9ff8bc0aac73cb0f953a98afed1a15b..7431a1150a90aba96309bc6f11adc69896eeda9a 100644 (file)
@@ -9,10 +9,8 @@ PG_MODULE_MAGIC;
 extern void _PG_init(void);
 
 /* Linkage to functions in plpython module */
-#if PY_MAJOR_VERSION >= 3
 typedef PyObject *(*PLyUnicode_FromStringAndSize_t) (const char *s, Py_ssize_t size);
 static PLyUnicode_FromStringAndSize_t PLyUnicode_FromStringAndSize_p;
-#endif
 
 
 /*
@@ -22,12 +20,10 @@ void
 _PG_init(void)
 {
    /* Asserts verify that typedefs above match original declarations */
-#if PY_MAJOR_VERSION >= 3
    AssertVariableIsOfType(&PLyUnicode_FromStringAndSize, PLyUnicode_FromStringAndSize_t);
    PLyUnicode_FromStringAndSize_p = (PLyUnicode_FromStringAndSize_t)
        load_external_function("$libdir/" PLPYTHON_LIBNAME, "PLyUnicode_FromStringAndSize",
                               true, NULL);
-#endif
 }
 
 
@@ -54,7 +50,7 @@ ltree_to_plpython(PG_FUNCTION_ARGS)
    curlevel = LTREE_FIRST(in);
    for (i = 0; i < in->numlevel; i++)
    {
-       PyList_SetItem(list, i, PyString_FromStringAndSize(curlevel->name, curlevel->len));
+       PyList_SetItem(list, i, PLyUnicode_FromStringAndSize(curlevel->name, curlevel->len));
        curlevel = LEVEL_NEXT(curlevel);
    }
 
index 08d8b607e38cc39dd2fe698602af77469808bb1a..6b6e74334531b07189685482f735c74209246bab 100644 (file)
@@ -40,7 +40,7 @@ static PyTypeObject PLy_CursorType = {
    .tp_name = "PLyCursor",
    .tp_basicsize = sizeof(PLyCursorObject),
    .tp_dealloc = PLy_cursor_dealloc,
-   .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_ITER,
+   .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
    .tp_doc = PLy_cursor_doc,
    .tp_iter = PyObject_SelfIter,
    .tp_iternext = PLy_cursor_iternext,
@@ -150,7 +150,7 @@ PLy_cursor_plan(PyObject *ob, PyObject *args)
 
    if (args)
    {
-       if (!PySequence_Check(args) || PyString_Check(args) || PyUnicode_Check(args))
+       if (!PySequence_Check(args) || PyUnicode_Check(args))
        {
            PLy_exception_set(PyExc_TypeError, "plpy.cursor takes a sequence as its second argument");
            return NULL;
@@ -169,7 +169,7 @@ PLy_cursor_plan(PyObject *ob, PyObject *args)
 
        if (!so)
            PLy_elog(ERROR, "could not execute plan");
-       sv = PyString_AsString(so);
+       sv = PLyUnicode_AsString(so);
        PLy_exception_set_plural(PyExc_TypeError,
                                 "Expected sequence of %d argument, got %d: %s",
                                 "Expected sequence of %d arguments, got %d: %s",
@@ -410,7 +410,7 @@ PLy_cursor_fetch(PyObject *self, PyObject *args)
        SPI_cursor_fetch(portal, true, count);
 
        Py_DECREF(ret->status);
-       ret->status = PyInt_FromLong(SPI_OK_FETCH);
+       ret->status = PyLong_FromLong(SPI_OK_FETCH);
 
        Py_DECREF(ret->nrows);
        ret->nrows = PyLong_FromUnsignedLongLong(SPI_processed);
index 224b8836fba90011a0f69a73efafb383c1817c15..7c627eacfbf716ddb985b46a17b396ad6fe0ce3c 100644 (file)
@@ -193,24 +193,20 @@ PLy_traceback(PyObject *e, PyObject *v, PyObject *tb,
    e_type_o = PyObject_GetAttrString(e, "__name__");
    e_module_o = PyObject_GetAttrString(e, "__module__");
    if (e_type_o)
-       e_type_s = PyString_AsString(e_type_o);
+       e_type_s = PLyUnicode_AsString(e_type_o);
    if (e_type_s)
-       e_module_s = PyString_AsString(e_module_o);
+       e_module_s = PLyUnicode_AsString(e_module_o);
 
    if (v && ((vob = PyObject_Str(v)) != NULL))
-       vstr = PyString_AsString(vob);
+       vstr = PLyUnicode_AsString(vob);
    else
        vstr = "unknown";
 
    initStringInfo(&xstr);
    if (!e_type_s || !e_module_s)
    {
-       if (PyString_Check(e))
-           /* deprecated string exceptions */
-           appendStringInfoString(&xstr, PyString_AsString(e));
-       else
-           /* shouldn't happen */
-           appendStringInfoString(&xstr, "unrecognized exception");
+       /* shouldn't happen */
+       appendStringInfoString(&xstr, "unrecognized exception");
    }
    /* mimics behavior of traceback.format_exception_only */
    else if (strcmp(e_module_s, "builtins") == 0
@@ -290,11 +286,11 @@ PLy_traceback(PyObject *e, PyObject *v, PyObject *tb,
            if (*tb_depth == 1)
                fname = "<module>";
            else
-               fname = PyString_AsString(name);
+               fname = PLyUnicode_AsString(name);
 
            proname = PLy_procedure_name(exec_ctx->curr_proc);
-           plain_filename = PyString_AsString(filename);
-           plain_lineno = PyInt_AsLong(lineno);
+           plain_filename = PLyUnicode_AsString(filename);
+           plain_lineno = PyLong_AsLong(lineno);
 
            if (proname == NULL)
                appendStringInfo(&tbstr, "\n  PL/Python anonymous code block, line %ld, in %s",
@@ -365,7 +361,7 @@ PLy_get_sqlerrcode(PyObject *exc, int *sqlerrcode)
    if (sqlstate == NULL)
        return;
 
-   buffer = PyString_AsString(sqlstate);
+   buffer = PLyUnicode_AsString(sqlstate);
    if (strlen(buffer) == 5 &&
        strspn(buffer, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ") == 5)
    {
@@ -573,7 +569,7 @@ get_string_attr(PyObject *obj, char *attrname, char **str)
    val = PyObject_GetAttrString(obj, attrname);
    if (val != NULL && val != Py_None)
    {
-       *str = pstrdup(PyString_AsString(val));
+       *str = pstrdup(PLyUnicode_AsString(val));
    }
    Py_XDECREF(val);
 }
@@ -589,7 +585,7 @@ set_string_attr(PyObject *obj, char *attrname, char *str)
 
    if (str != NULL)
    {
-       val = PyString_FromString(str);
+       val = PLyUnicode_FromString(str);
        if (!val)
            return false;
    }
index c6f6a6fbccaa61766b517f609fa2854ade7c303a..150b3a5977ff10377c39755ea0677e111274ddf8 100644 (file)
@@ -294,7 +294,7 @@ PLy_exec_function(FunctionCallInfo fcinfo, PLyProcedure *proc)
 /* trigger subhandler
  *
  * the python function is expected to return Py_None if the tuple is
- * acceptable and unmodified.  Otherwise it should return a PyString
+ * acceptable and unmodified.  Otherwise it should return a PyUnicode
  * object who's value is SKIP, or MODIFY.  SKIP means don't perform
  * this action.  MODIFY means the tuple has been modified, so update
  * tuple and perform action.  SKIP and MODIFY assume the trigger fires
@@ -360,9 +360,7 @@ PLy_exec_trigger(FunctionCallInfo fcinfo, PLyProcedure *proc)
        {
            char       *srv;
 
-           if (PyString_Check(plrv))
-               srv = PyString_AsString(plrv);
-           else if (PyUnicode_Check(plrv))
+           if (PyUnicode_Check(plrv))
                srv = PLyUnicode_AsString(plrv);
            else
            {
@@ -700,35 +698,35 @@ PLy_trigger_build_args(FunctionCallInfo fcinfo, PLyProcedure *proc, HeapTuple *r
        if (!pltdata)
            return NULL;
 
-       pltname = PyString_FromString(tdata->tg_trigger->tgname);
+       pltname = PLyUnicode_FromString(tdata->tg_trigger->tgname);
        PyDict_SetItemString(pltdata, "name", pltname);
        Py_DECREF(pltname);
 
        stroid = DatumGetCString(DirectFunctionCall1(oidout,
                                                     ObjectIdGetDatum(tdata->tg_relation->rd_id)));
-       pltrelid = PyString_FromString(stroid);
+       pltrelid = PLyUnicode_FromString(stroid);
        PyDict_SetItemString(pltdata, "relid", pltrelid);
        Py_DECREF(pltrelid);
        pfree(stroid);
 
        stroid = SPI_getrelname(tdata->tg_relation);
-       plttablename = PyString_FromString(stroid);
+       plttablename = PLyUnicode_FromString(stroid);
        PyDict_SetItemString(pltdata, "table_name", plttablename);
        Py_DECREF(plttablename);
        pfree(stroid);
 
        stroid = SPI_getnspname(tdata->tg_relation);
-       plttableschema = PyString_FromString(stroid);
+       plttableschema = PLyUnicode_FromString(stroid);
        PyDict_SetItemString(pltdata, "table_schema", plttableschema);
        Py_DECREF(plttableschema);
        pfree(stroid);
 
        if (TRIGGER_FIRED_BEFORE(tdata->tg_event))
-           pltwhen = PyString_FromString("BEFORE");
+           pltwhen = PLyUnicode_FromString("BEFORE");
        else if (TRIGGER_FIRED_AFTER(tdata->tg_event))
-           pltwhen = PyString_FromString("AFTER");
+           pltwhen = PLyUnicode_FromString("AFTER");
        else if (TRIGGER_FIRED_INSTEAD(tdata->tg_event))
-           pltwhen = PyString_FromString("INSTEAD OF");
+           pltwhen = PLyUnicode_FromString("INSTEAD OF");
        else
        {
            elog(ERROR, "unrecognized WHEN tg_event: %u", tdata->tg_event);
@@ -739,7 +737,7 @@ PLy_trigger_build_args(FunctionCallInfo fcinfo, PLyProcedure *proc, HeapTuple *r
 
        if (TRIGGER_FIRED_FOR_ROW(tdata->tg_event))
        {
-           pltlevel = PyString_FromString("ROW");
+           pltlevel = PLyUnicode_FromString("ROW");
            PyDict_SetItemString(pltdata, "level", pltlevel);
            Py_DECREF(pltlevel);
 
@@ -750,7 +748,7 @@ PLy_trigger_build_args(FunctionCallInfo fcinfo, PLyProcedure *proc, HeapTuple *r
 
            if (TRIGGER_FIRED_BY_INSERT(tdata->tg_event))
            {
-               pltevent = PyString_FromString("INSERT");
+               pltevent = PLyUnicode_FromString("INSERT");
 
                PyDict_SetItemString(pltdata, "old", Py_None);
                pytnew = PLy_input_from_tuple(&proc->result_in,
@@ -763,7 +761,7 @@ PLy_trigger_build_args(FunctionCallInfo fcinfo, PLyProcedure *proc, HeapTuple *r
            }
            else if (TRIGGER_FIRED_BY_DELETE(tdata->tg_event))
            {
-               pltevent = PyString_FromString("DELETE");
+               pltevent = PLyUnicode_FromString("DELETE");
 
                PyDict_SetItemString(pltdata, "new", Py_None);
                pytold = PLy_input_from_tuple(&proc->result_in,
@@ -776,7 +774,7 @@ PLy_trigger_build_args(FunctionCallInfo fcinfo, PLyProcedure *proc, HeapTuple *r
            }
            else if (TRIGGER_FIRED_BY_UPDATE(tdata->tg_event))
            {
-               pltevent = PyString_FromString("UPDATE");
+               pltevent = PLyUnicode_FromString("UPDATE");
 
                pytnew = PLy_input_from_tuple(&proc->result_in,
                                              tdata->tg_newtuple,
@@ -803,7 +801,7 @@ PLy_trigger_build_args(FunctionCallInfo fcinfo, PLyProcedure *proc, HeapTuple *r
        }
        else if (TRIGGER_FIRED_FOR_STATEMENT(tdata->tg_event))
        {
-           pltlevel = PyString_FromString("STATEMENT");
+           pltlevel = PLyUnicode_FromString("STATEMENT");
            PyDict_SetItemString(pltdata, "level", pltlevel);
            Py_DECREF(pltlevel);
 
@@ -812,13 +810,13 @@ PLy_trigger_build_args(FunctionCallInfo fcinfo, PLyProcedure *proc, HeapTuple *r
            *rv = NULL;
 
            if (TRIGGER_FIRED_BY_INSERT(tdata->tg_event))
-               pltevent = PyString_FromString("INSERT");
+               pltevent = PLyUnicode_FromString("INSERT");
            else if (TRIGGER_FIRED_BY_DELETE(tdata->tg_event))
-               pltevent = PyString_FromString("DELETE");
+               pltevent = PLyUnicode_FromString("DELETE");
            else if (TRIGGER_FIRED_BY_UPDATE(tdata->tg_event))
-               pltevent = PyString_FromString("UPDATE");
+               pltevent = PLyUnicode_FromString("UPDATE");
            else if (TRIGGER_FIRED_BY_TRUNCATE(tdata->tg_event))
-               pltevent = PyString_FromString("TRUNCATE");
+               pltevent = PLyUnicode_FromString("TRUNCATE");
            else
            {
                elog(ERROR, "unrecognized OP tg_event: %u", tdata->tg_event);
@@ -847,7 +845,7 @@ PLy_trigger_build_args(FunctionCallInfo fcinfo, PLyProcedure *proc, HeapTuple *r
            }
            for (i = 0; i < tdata->tg_trigger->tgnargs; i++)
            {
-               pltarg = PyString_FromString(tdata->tg_trigger->tgargs[i]);
+               pltarg = PLyUnicode_FromString(tdata->tg_trigger->tgargs[i]);
 
                /*
                 * stolen, don't Py_DECREF
@@ -931,9 +929,7 @@ PLy_modify_tuple(PLyProcedure *proc, PyObject *pltd, TriggerData *tdata,
            PLyObToDatum *att;
 
            platt = PyList_GetItem(plkeys, i);
-           if (PyString_Check(platt))
-               plattstr = PyString_AsString(platt);
-           else if (PyUnicode_Check(platt))
+           if (PyUnicode_Check(platt))
                plattstr = PLyUnicode_AsString(platt);
            else
            {
index 3eedaa80da7d4909c34ee1e01e987875c169b466..0bce10649518afffa97bae692a0afe09bd393f91 100644 (file)
  * exported functions
  */
 
-#if PY_MAJOR_VERSION >= 3
-/* Use separate names to reduce confusion */
-#define plpython_validator plpython3_validator
-#define plpython_call_handler plpython3_call_handler
-#define plpython_inline_handler plpython3_inline_handler
-#endif
-
 extern void _PG_init(void);
 
 PG_MODULE_MAGIC;
 
-PG_FUNCTION_INFO_V1(plpython_validator);
-PG_FUNCTION_INFO_V1(plpython_call_handler);
-PG_FUNCTION_INFO_V1(plpython_inline_handler);
-
-#if PY_MAJOR_VERSION < 3
-/* Define aliases plpython2_call_handler etc */
-PG_FUNCTION_INFO_V1(plpython2_validator);
-PG_FUNCTION_INFO_V1(plpython2_call_handler);
-PG_FUNCTION_INFO_V1(plpython2_inline_handler);
-#endif
+PG_FUNCTION_INFO_V1(plpython3_validator);
+PG_FUNCTION_INFO_V1(plpython3_call_handler);
+PG_FUNCTION_INFO_V1(plpython3_inline_handler);
 
 
 static bool PLy_procedure_is_trigger(Form_pg_proc procStruct);
@@ -82,6 +68,10 @@ _PG_init(void)
     * the actual failure for later, so that operations like pg_restore can
     * load more than one plpython library so long as they don't try to do
     * anything much with the language.
+    *
+    * While we only support Python 3 these days, somebody might create an
+    * out-of-tree version adding back support for Python 2. Conflicts with
+    * such an extension should be detected.
     */
    bitmask_ptr = (int **) find_rendezvous_variable("plpython_version_bitmask");
    if (!(*bitmask_ptr))        /* am I the first? */
@@ -125,13 +115,9 @@ PLy_initialize(void)
    if (inited)
        return;
 
-#if PY_MAJOR_VERSION >= 3
    PyImport_AppendInittab("plpy", PyInit_plpy);
-#endif
    Py_Initialize();
-#if PY_MAJOR_VERSION >= 3
    PyImport_ImportModule("plpy");
-#endif
    PLy_init_interp();
    PLy_init_plpy();
    if (PyErr_Occurred())
@@ -171,7 +157,7 @@ PLy_init_interp(void)
 }
 
 Datum
-plpython_validator(PG_FUNCTION_ARGS)
+plpython3_validator(PG_FUNCTION_ARGS)
 {
    Oid         funcoid = PG_GETARG_OID(0);
    HeapTuple   tuple;
@@ -203,17 +189,8 @@ plpython_validator(PG_FUNCTION_ARGS)
    PG_RETURN_VOID();
 }
 
-#if PY_MAJOR_VERSION < 3
-Datum
-plpython2_validator(PG_FUNCTION_ARGS)
-{
-   /* call plpython validator with our fcinfo so it gets our oid */
-   return plpython_validator(fcinfo);
-}
-#endif                         /* PY_MAJOR_VERSION < 3 */
-
 Datum
-plpython_call_handler(PG_FUNCTION_ARGS)
+plpython3_call_handler(PG_FUNCTION_ARGS)
 {
    bool        nonatomic;
    Datum       retval;
@@ -284,16 +261,8 @@ plpython_call_handler(PG_FUNCTION_ARGS)
    return retval;
 }
 
-#if PY_MAJOR_VERSION < 3
 Datum
-plpython2_call_handler(PG_FUNCTION_ARGS)
-{
-   return plpython_call_handler(fcinfo);
-}
-#endif                         /* PY_MAJOR_VERSION < 3 */
-
-Datum
-plpython_inline_handler(PG_FUNCTION_ARGS)
+plpython3_inline_handler(PG_FUNCTION_ARGS)
 {
    LOCAL_FCINFO(fake_fcinfo, 0);
    InlineCodeBlock *codeblock = (InlineCodeBlock *) DatumGetPointer(PG_GETARG_DATUM(0));
@@ -368,14 +337,6 @@ plpython_inline_handler(PG_FUNCTION_ARGS)
    PG_RETURN_VOID();
 }
 
-#if PY_MAJOR_VERSION < 3
-Datum
-plpython2_inline_handler(PG_FUNCTION_ARGS)
-{
-   return plpython_inline_handler(fcinfo);
-}
-#endif                         /* PY_MAJOR_VERSION < 3 */
-
 static bool
 PLy_procedure_is_trigger(Form_pg_proc procStruct)
 {
index 5951d2a6ff5f0710f928fd8eaa24d0dcbb776e03..ec2439c6a1fac3b6de523b846c69df14f7382517 100644 (file)
@@ -119,7 +119,7 @@ PLy_plan_status(PyObject *self, PyObject *args)
    {
        Py_INCREF(Py_True);
        return Py_True;
-       /* return PyInt_FromLong(self->status); */
+       /* return PyLong_FromLong(self->status); */
    }
    return NULL;
 }
index 907f89d153540fefbb5166d22095af61b515d5f2..fa08f0dbfb37ab48ea8d8bf69474764145143a74 100644 (file)
@@ -107,7 +107,6 @@ static PyMethodDef PLy_exc_methods[] = {
    {NULL, NULL, 0, NULL}
 };
 
-#if PY_MAJOR_VERSION >= 3
 static PyModuleDef PLy_module = {
    PyModuleDef_HEAD_INIT,
    .m_name = "plpy",
@@ -139,7 +138,6 @@ PyInit_plpy(void)
 
    return m;
 }
-#endif                         /* PY_MAJOR_VERSION >= 3 */
 
 void
 PLy_init_plpy(void)
@@ -148,10 +146,6 @@ PLy_init_plpy(void)
               *main_dict,
               *plpy_mod;
 
-#if PY_MAJOR_VERSION < 3
-   PyObject   *plpy;
-#endif
-
    /*
     * initialize plpy module
     */
@@ -160,13 +154,7 @@ PLy_init_plpy(void)
    PLy_subtransaction_init_type();
    PLy_cursor_init_type();
 
-#if PY_MAJOR_VERSION >= 3
    PyModule_Create(&PLy_module);
-   /* for Python 3 we initialized the exceptions in PyInit_plpy */
-#else
-   plpy = Py_InitModule("plpy", PLy_methods);
-   PLy_add_exceptions(plpy);
-#endif
 
    /* PyDict_SetItemString(plpy, "PlanType", (PyObject *) &PLy_PlanType); */
 
@@ -189,11 +177,7 @@ PLy_add_exceptions(PyObject *plpy)
    PyObject   *excmod;
    HASHCTL     hash_ctl;
 
-#if PY_MAJOR_VERSION < 3
-   excmod = Py_InitModule("spiexceptions", PLy_exc_methods);
-#else
    excmod = PyModule_Create(&PLy_exc_module);
-#endif
    if (excmod == NULL)
        PLy_elog(ERROR, "could not create the spiexceptions module");
 
@@ -268,7 +252,7 @@ PLy_generate_spi_exceptions(PyObject *mod, PyObject *base)
        if (dict == NULL)
            PLy_elog(ERROR, NULL);
 
-       sqlstate = PyString_FromString(unpack_sql_state(exception_map[i].sqlstate));
+       sqlstate = PLyUnicode_FromString(unpack_sql_state(exception_map[i].sqlstate));
        if (sqlstate == NULL)
            PLy_elog(ERROR, "could not generate SPI exceptions");
 
@@ -346,7 +330,7 @@ PLy_quote_literal(PyObject *self, PyObject *args)
        return NULL;
 
    quoted = quote_literal_cstr(str);
-   ret = PyString_FromString(quoted);
+   ret = PLyUnicode_FromString(quoted);
    pfree(quoted);
 
    return ret;
@@ -363,10 +347,10 @@ PLy_quote_nullable(PyObject *self, PyObject *args)
        return NULL;
 
    if (str == NULL)
-       return PyString_FromString("NULL");
+       return PLyUnicode_FromString("NULL");
 
    quoted = quote_literal_cstr(str);
-   ret = PyString_FromString(quoted);
+   ret = PLyUnicode_FromString(quoted);
    pfree(quoted);
 
    return ret;
@@ -383,7 +367,7 @@ PLy_quote_ident(PyObject *self, PyObject *args)
        return NULL;
 
    quoted = quote_identifier(str);
-   ret = PyString_FromString(quoted);
+   ret = PLyUnicode_FromString(quoted);
 
    return ret;
 }
@@ -400,7 +384,7 @@ object_to_string(PyObject *obj)
        {
            char       *str;
 
-           str = pstrdup(PyString_AsString(so));
+           str = pstrdup(PLyUnicode_AsString(so));
            Py_DECREF(so);
 
            return str;
@@ -444,7 +428,7 @@ PLy_output(volatile int level, PyObject *self, PyObject *args, PyObject *kw)
    else
        so = PyObject_Str(args);
 
-   if (so == NULL || ((message = PyString_AsString(so)) == NULL))
+   if (so == NULL || ((message = PLyUnicode_AsString(so)) == NULL))
    {
        level = ERROR;
        message = dgettext(TEXTDOMAIN, "could not parse error message in plpy.elog");
@@ -457,7 +441,7 @@ PLy_output(volatile int level, PyObject *self, PyObject *args, PyObject *kw)
    {
        while (PyDict_Next(kw, &pos, &key, &value))
        {
-           char       *keyword = PyString_AsString(key);
+           char       *keyword = PLyUnicode_AsString(key);
 
            if (strcmp(keyword, "message") == 0)
            {
index 54d78101ceb3f3920d9252e8d37c83c3515c8405..ad6436aca7841ad1ad92c8660ae837a0c3563fad 100644 (file)
@@ -11,9 +11,7 @@
 extern HTAB *PLy_spi_exceptions;
 
 
-#if PY_MAJOR_VERSION >= 3
 PyMODINIT_FUNC PyInit_plpy(void);
-#endif
 extern void PLy_init_plpy(void);
 
 #endif                         /* PLPY_PLPYMODULE_H */
index 54f39419c840ce74da7bc4f93ce981e3e68096c4..a8516b2db306761abfe991b414f5eada64c573e7 100644 (file)
@@ -76,7 +76,7 @@ PLy_result_new(void)
 
    Py_INCREF(Py_None);
    ob->status = Py_None;
-   ob->nrows = PyInt_FromLong(-1);
+   ob->nrows = PyLong_FromLong(-1);
    ob->rows = PyList_New(0);
    ob->tupdesc = NULL;
    if (!ob->rows)
@@ -125,7 +125,7 @@ PLy_result_colnames(PyObject *self, PyObject *unused)
    {
        Form_pg_attribute attr = TupleDescAttr(ob->tupdesc, i);
 
-       PyList_SET_ITEM(list, i, PyString_FromString(NameStr(attr->attname)));
+       PyList_SET_ITEM(list, i, PLyUnicode_FromString(NameStr(attr->attname)));
    }
 
    return list;
@@ -151,7 +151,7 @@ PLy_result_coltypes(PyObject *self, PyObject *unused)
    {
        Form_pg_attribute attr = TupleDescAttr(ob->tupdesc, i);
 
-       PyList_SET_ITEM(list, i, PyInt_FromLong(attr->atttypid));
+       PyList_SET_ITEM(list, i, PyLong_FromLong(attr->atttypid));
    }
 
    return list;
@@ -177,7 +177,7 @@ PLy_result_coltypmods(PyObject *self, PyObject *unused)
    {
        Form_pg_attribute attr = TupleDescAttr(ob->tupdesc, i);
 
-       PyList_SET_ITEM(list, i, PyInt_FromLong(attr->atttypmod));
+       PyList_SET_ITEM(list, i, PyLong_FromLong(attr->atttypmod));
    }
 
    return list;
@@ -226,19 +226,11 @@ PLy_result_str(PyObject *arg)
 {
    PLyResultObject *ob = (PLyResultObject *) arg;
 
-#if PY_MAJOR_VERSION >= 3
    return PyUnicode_FromFormat("<%s status=%S nrows=%S rows=%S>",
                                Py_TYPE(ob)->tp_name,
                                ob->status,
                                ob->nrows,
                                ob->rows);
-#else
-   return PyString_FromFormat("<%s status=%ld nrows=%ld rows=%s>",
-                              ob->ob_type->tp_name,
-                              PyInt_AsLong(ob->status),
-                              PyInt_AsLong(ob->nrows),
-                              PyString_AsString(PyObject_Str(ob->rows)));
-#endif
 }
 
 static PyObject *
index 86d70470a748263cab80f16e3f57ee7bf43734b3..9a71a42c15f2944c534cd5017186e826c23c2dab 100644 (file)
@@ -90,9 +90,7 @@ PLy_spi_prepare(PyObject *self, PyObject *args)
            int32       typmod;
 
            optr = PySequence_GetItem(list, i);
-           if (PyString_Check(optr))
-               sptr = PyString_AsString(optr);
-           else if (PyUnicode_Check(optr))
+           if (PyUnicode_Check(optr))
                sptr = PLyUnicode_AsString(optr);
            else
            {
@@ -186,7 +184,7 @@ PLy_spi_execute_plan(PyObject *ob, PyObject *list, long limit)
 
    if (list != NULL)
    {
-       if (!PySequence_Check(list) || PyString_Check(list) || PyUnicode_Check(list))
+       if (!PySequence_Check(list) || PyUnicode_Check(list))
        {
            PLy_exception_set(PyExc_TypeError, "plpy.execute takes a sequence as its second argument");
            return NULL;
@@ -205,7 +203,7 @@ PLy_spi_execute_plan(PyObject *ob, PyObject *list, long limit)
 
        if (!so)
            PLy_elog(ERROR, "could not execute plan");
-       sv = PyString_AsString(so);
+       sv = PLyUnicode_AsString(so);
        PLy_exception_set_plural(PyExc_TypeError,
                                 "Expected sequence of %d argument, got %d: %s",
                                 "Expected sequence of %d arguments, got %d: %s",
@@ -360,7 +358,7 @@ PLy_spi_execute_fetch_result(SPITupleTable *tuptable, uint64 rows, int status)
        return NULL;
    }
    Py_DECREF(result->status);
-   result->status = PyInt_FromLong(status);
+   result->status = PyLong_FromLong(status);
 
    if (status > 0 && tuptable == NULL)
    {
index 5e807b139f16d2707bfe2a41c1b98c3c11367a6d..7018c9d40456e369873af5c13a8bf05ed087d65c 100644 (file)
@@ -26,12 +26,12 @@ static PyObject *PLyBool_FromBool(PLyDatumToOb *arg, Datum d);
 static PyObject *PLyFloat_FromFloat4(PLyDatumToOb *arg, Datum d);
 static PyObject *PLyFloat_FromFloat8(PLyDatumToOb *arg, Datum d);
 static PyObject *PLyDecimal_FromNumeric(PLyDatumToOb *arg, Datum d);
-static PyObject *PLyInt_FromInt16(PLyDatumToOb *arg, Datum d);
-static PyObject *PLyInt_FromInt32(PLyDatumToOb *arg, Datum d);
+static PyObject *PLyLong_FromInt16(PLyDatumToOb *arg, Datum d);
+static PyObject *PLyLong_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_FromScalar(PLyDatumToOb *arg, Datum d);
+static PyObject *PLyUnicode_FromScalar(PLyDatumToOb *arg, Datum d);
 static PyObject *PLyObject_FromTransform(PLyDatumToOb *arg, Datum d);
 static PyObject *PLyList_FromArray(PLyDatumToOb *arg, Datum d);
 static PyObject *PLyList_FromArray_recurse(PLyDatumToOb *elm, int *dims, int ndim, int dim,
@@ -59,7 +59,7 @@ static void PLySequence_ToArray_recurse(PLyObToDatum *elm, PyObject *list,
                                        Datum *elems, bool *nulls, int *currelem);
 
 /* conversion from Python objects to composite Datums */
-static Datum PLyString_ToComposite(PLyObToDatum *arg, PyObject *string, bool inarray);
+static Datum PLyUnicode_ToComposite(PLyObToDatum *arg, PyObject *string, bool inarray);
 static Datum PLyMapping_ToComposite(PLyObToDatum *arg, TupleDesc desc, PyObject *mapping);
 static Datum PLySequence_ToComposite(PLyObToDatum *arg, TupleDesc desc, PyObject *sequence);
 static Datum PLyGenericObject_ToComposite(PLyObToDatum *arg, TupleDesc desc, PyObject *object, bool inarray);
@@ -517,10 +517,10 @@ PLy_input_setup_func(PLyDatumToOb *arg, MemoryContext arg_mcxt,
                arg->func = PLyDecimal_FromNumeric;
                break;
            case INT2OID:
-               arg->func = PLyInt_FromInt16;
+               arg->func = PLyLong_FromInt16;
                break;
            case INT4OID:
-               arg->func = PLyInt_FromInt32;
+               arg->func = PLyLong_FromInt32;
                break;
            case INT8OID:
                arg->func = PLyLong_FromInt64;
@@ -532,7 +532,7 @@ PLy_input_setup_func(PLyDatumToOb *arg, MemoryContext arg_mcxt,
                arg->func = PLyBytes_FromBytea;
                break;
            default:
-               arg->func = PLyString_FromScalar;
+               arg->func = PLyUnicode_FromScalar;
                getTypeOutputInfo(typeOid, &typoutput, &typisvarlena);
                fmgr_info_cxt(typoutput, &arg->u.scalar.typfunc, arg_mcxt);
                break;
@@ -600,15 +600,15 @@ PLyDecimal_FromNumeric(PLyDatumToOb *arg, Datum d)
 }
 
 static PyObject *
-PLyInt_FromInt16(PLyDatumToOb *arg, Datum d)
+PLyLong_FromInt16(PLyDatumToOb *arg, Datum d)
 {
-   return PyInt_FromLong(DatumGetInt16(d));
+   return PyLong_FromLong(DatumGetInt16(d));
 }
 
 static PyObject *
-PLyInt_FromInt32(PLyDatumToOb *arg, Datum d)
+PLyLong_FromInt32(PLyDatumToOb *arg, Datum d)
 {
-   return PyInt_FromLong(DatumGetInt32(d));
+   return PyLong_FromLong(DatumGetInt32(d));
 }
 
 static PyObject *
@@ -638,10 +638,10 @@ PLyBytes_FromBytea(PLyDatumToOb *arg, Datum d)
  * Generic input conversion using a SQL type's output function.
  */
 static PyObject *
-PLyString_FromScalar(PLyDatumToOb *arg, Datum d)
+PLyUnicode_FromScalar(PLyDatumToOb *arg, Datum d)
 {
    char       *x = OutputFunctionCall(&arg->u.scalar.typfunc, d);
-   PyObject   *r = PyString_FromString(x);
+   PyObject   *r = PLyUnicode_FromString(x);
 
    pfree(x);
    return r;
@@ -954,8 +954,8 @@ PLyObject_ToComposite(PLyObToDatum *arg, PyObject *plrv,
     * The string conversion case doesn't require a tupdesc, nor per-field
     * conversion data, so just go for it if that's the case to use.
     */
-   if (PyString_Check(plrv) || PyUnicode_Check(plrv))
-       return PLyString_ToComposite(arg, plrv, inarray);
+   if (PyUnicode_Check(plrv))
+       return PLyUnicode_ToComposite(arg, plrv, inarray);
 
    /*
     * If we're dealing with a named composite type, we must look up the
@@ -1032,25 +1032,17 @@ PLyObject_AsString(PyObject *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
    {
-#if PY_MAJOR_VERSION >= 3
        PyObject   *s = PyObject_Str(plrv);
 
        plrv_bo = PLyUnicode_Bytes(s);
        Py_XDECREF(s);
-#else
-       plrv_bo = PyObject_Str(plrv);
-#endif
    }
    if (!plrv_bo)
        PLy_elog(ERROR, "could not create string representation of Python object");
@@ -1299,7 +1291,7 @@ PLySequence_ToArray_recurse(PLyObToDatum *elm, PyObject *list,
  * Convert a Python string to composite, using record_in.
  */
 static Datum
-PLyString_ToComposite(PLyObToDatum *arg, PyObject *string, bool inarray)
+PLyUnicode_ToComposite(PLyObToDatum *arg, PyObject *string, bool inarray)
 {
    char       *str;
 
index 4a7d7264d79d14d66662a16b9872595c819218aa..22e2a599ad968c302e8b4327a76523227dfadadd 100644 (file)
@@ -78,12 +78,6 @@ PLyUnicode_Bytes(PyObject *unicode)
  * Convert a Python unicode object to a C string in PostgreSQL server
  * encoding.  No Python object reference is passed out of this
  * function.  The result is palloc'ed.
- *
- * Note that this function is disguised as PyString_AsString() when
- * using Python 3.  That function returns a pointer into the internal
- * memory of the argument, which isn't exactly the interface of this
- * function.  But in either case you get a rather short-lived
- * reference that you ought to better leave alone.
  */
 char *
 PLyUnicode_AsString(PyObject *unicode)
@@ -95,7 +89,6 @@ PLyUnicode_AsString(PyObject *unicode)
    return rv;
 }
 
-#if PY_MAJOR_VERSION >= 3
 /*
  * Convert a C string in the PostgreSQL server encoding to a Python
  * unicode object.  Reference ownership is passed to the caller.
@@ -126,5 +119,3 @@ PLyUnicode_FromString(const char *s)
 {
    return PLyUnicode_FromStringAndSize(s, strlen(s));
 }
-
-#endif                         /* PY_MAJOR_VERSION >= 3 */
index c9ba7edc0ec065d0661d40d919329f060421ee51..7c6577925ea5568746ded86b98eb2e6aa6de53f2 100644 (file)
@@ -11,9 +11,7 @@
 extern PyObject *PLyUnicode_Bytes(PyObject *unicode);
 extern char *PLyUnicode_AsString(PyObject *unicode);
 
-#if PY_MAJOR_VERSION >= 3
 extern PyObject *PLyUnicode_FromString(const char *s);
 extern PyObject *PLyUnicode_FromStringAndSize(const char *s, Py_ssize_t size);
-#endif
 
 #endif                         /* PLPY_UTIL_H */
index 05e4362dab9cd6ebe51b21c926103d6a259eadde..2a0c9bf036152b8a3a0bad70e407d2904457cf1e 100644 (file)
 #include <Python.h>
 #endif
 
-/*
- * Python 2/3 strings/unicode/bytes handling.  Python 2 has strings
- * and unicode, Python 3 has strings, which are unicode on the C
- * level, and bytes.  The porting convention, which is similarly used
- * in Python 2.6, is that "Unicode" is always unicode, and "Bytes" are
- * bytes in Python 3 and strings in Python 2.  Since we keep
- * supporting Python 2 and its usual strings, we provide a
- * compatibility layer for Python 3 that when asked to convert a C
- * string to a Python string it converts the C string from the
- * PostgreSQL server encoding to a Python Unicode object.
- */
-#if PY_MAJOR_VERSION >= 3
-#define PyString_Check(x) 0
-#define PyString_AsString(x) PLyUnicode_AsString(x)
-#define PyString_FromString(x) PLyUnicode_FromString(x)
-#define PyString_FromStringAndSize(x, size) PLyUnicode_FromStringAndSize(x, size)
-#endif
-
-/*
- * Python 3 only has long.
- */
-#if PY_MAJOR_VERSION >= 3
-#define PyInt_FromLong(x) PyLong_FromLong(x)
-#define PyInt_AsLong(x) PyLong_AsLong(x)
-#endif
-
-/* Python 3 removed the Py_TPFLAGS_HAVE_ITER flag */
-#if PY_MAJOR_VERSION >= 3
-#define Py_TPFLAGS_HAVE_ITER 0
-#endif
-
 /* define our text domain for translations */
 #undef TEXTDOMAIN
 #define TEXTDOMAIN PG_TEXTDOMAIN("plpython")
 #define printf(...)        pg_printf(__VA_ARGS__)
 
 /*
- * Used throughout, and also by the Python 2/3 porting layer, so it's easier to
- * just include it everywhere.
+ * Used throughout, so it's easier to just include it everywhere.
  */
 #include "plpy_util.h"