From: Benjamin A. Beasley Date: Thu, 20 Jun 2024 15:02:39 +0000 (-0400) Subject: SQLAlchemy 1.4: Fix building the C extension on Python 3.13 X-Git-Tag: rel_1_4_53~14 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fc66fda85e30718a384e9d214b927842cbc7d442;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git SQLAlchemy 1.4: Fix building the C extension on Python 3.13 Adjustments to the C extensions, which are specific to the SQLAlchemy 1.x series, to work under Python 3.13. Pull request courtesy Ben Beasley. Fixes: #11499 Closes: #11500 Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/11500 Pull-request-sha: 8a5888b147022b4586d30dcd7159e4fa6a31ec0e Change-Id: I1943eb387f9b075bf07e179f7a24762236e234bf --- diff --git a/doc/build/changelog/unreleased_14/11499.rst b/doc/build/changelog/unreleased_14/11499.rst new file mode 100644 index 0000000000..e03062c191 --- /dev/null +++ b/doc/build/changelog/unreleased_14/11499.rst @@ -0,0 +1,6 @@ +.. change:: + :tags: bug, engine + :tickets: 11499 + + Adjustments to the C extensions, which are specific to the SQLAlchemy 1.x + series, to work under Python 3.13. Pull request courtesy Ben Beasley. diff --git a/lib/sqlalchemy/cextension/resultproxy.c b/lib/sqlalchemy/cextension/resultproxy.c index 8e8b6f9e4f..a88af0ede9 100644 --- a/lib/sqlalchemy/cextension/resultproxy.c +++ b/lib/sqlalchemy/cextension/resultproxy.c @@ -821,6 +821,29 @@ typedef struct { static PyTypeObject tuplegetter_type; +static int +PyArg_NoKeywords(const char *funcname, PyObject *kwargs) +{ +#if PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION >= 13 + /* Based on the one in CPython, removed from the public headers in 3.13 + * (https://github.com/python/cpython/issues/110964) + */ + if (kwargs == NULL) + return 1; + if (!PyDict_CheckExact(kwargs)) { + PyErr_BadInternalCall(); + return 0; + } + if (PyDict_GET_SIZE(kwargs) == 0) + return 1; + + PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments", funcname); + return 0; +#else + return _PyArg_NoKeywords(funcname, kwargs); +#endif +} + static PyObject * tuplegetter_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { @@ -828,7 +851,7 @@ tuplegetter_new(PyTypeObject *type, PyObject *args, PyObject *kwds) PyObject *item; Py_ssize_t nitems; - if (!_PyArg_NoKeywords("tuplegetter", kwds)) + if (!PyArg_NoKeywords("tuplegetter", kwds)) return NULL; nitems = PyTuple_GET_SIZE(args);