@@ -274,9 +274,33 @@ PyObject *query_new(PyTypeObject *cls, PyObject *args, PyObject *Py_UNUSED(kwarg
274274 PyObject * pattern =
275275 PyObject_CallFunction (state -> re_compile , "s#" , second_arg , length );
276276 if (pattern == NULL ) {
277- _PyErr_FormatFromCause (
278- state -> query_error ,
279- "Invalid predicate in pattern at row %u: regular expression error" , row );
277+ const char * msg =
278+ "Invalid predicate in pattern at row %u: regular expression error" ;
279+ #if PY_MINOR_VERSION < 12
280+ PyObject * etype , * cause , * exc , * trace ;
281+ PyErr_Fetch (& etype , & cause , & trace );
282+ PyErr_NormalizeException (& etype , & cause , & trace );
283+ if (trace != NULL ) {
284+ PyException_SetTraceback (cause , trace );
285+ Py_DECREF (trace );
286+ }
287+ Py_DECREF (etype );
288+ PyErr_Format (state -> query_error , msg , row );
289+ PyErr_Fetch (& etype , & exc , & trace );
290+ PyErr_NormalizeException (& etype , & exc , & trace );
291+ Py_INCREF (cause );
292+ PyException_SetCause (exc , cause );
293+ PyException_SetContext (exc , cause );
294+ PyErr_Restore (etype , exc , trace );
295+ #else
296+ PyObject * cause = PyErr_GetRaisedException ();
297+ PyErr_Format (state -> query_error , msg , row );
298+ PyObject * exc = PyErr_GetRaisedException ();
299+ PyException_SetCause (exc , Py_NewRef (cause ));
300+ PyException_SetContext (exc , Py_NewRef (cause ));
301+ Py_DECREF (cause );
302+ PyErr_SetRaisedException (exc );
303+ #endif
280304 goto error ;
281305 }
282306
0 commit comments