21 char *
volatile *xmsg,
char *
volatile *tbmsg,
24 char **hint,
char **query,
int *position,
25 char **schema_name,
char **table_name,
char **column_name,
26 char **datatype_name,
char **constraint_name);
28 char **hint,
char **schema_name,
char **table_name,
char **column_name,
29 char **datatype_name,
char **constraint_name);
46 int save_errno = errno;
47 char *
volatile xmsg = NULL;
48 char *
volatile tbmsg = NULL;
59 PyErr_Fetch(&exc, &
val, &tb);
64 const char *primary = NULL;
70 char *schema_name = NULL;
71 char *table_name = NULL;
72 char *column_name = NULL;
73 char *datatype_name = NULL;
74 char *constraint_name = NULL;
78 PyErr_NormalizeException(&exc, &
val, &tb);
82 &detail, &hint, &query, &position,
83 &schema_name, &table_name, &column_name,
84 &datatype_name, &constraint_name);
87 &schema_name, &table_name, &column_name,
88 &datatype_name, &constraint_name);
94 &xmsg, &tbmsg, &tb_depth);
124 (
errcode(sqlerrcode ? sqlerrcode : ERRCODE_EXTERNAL_ROUTINE_EXCEPTION),
127 (tb_depth > 0 && tbmsg) ?
errcontext(
"%s", tbmsg) : 0,
128 (hint) ?
errhint(
"%s", hint) : 0,
140 constraint_name) : 0));
147 while (tb != NULL && tb != Py_None)
149 PyObject *tb_prev = tb;
151 tb = PyObject_GetAttrString(tb,
"tb_next");
174 char *
volatile *xmsg,
char *
volatile *tbmsg,
int *tb_depth)
176 PyObject *
volatile e_type_o = NULL;
177 PyObject *
volatile e_module_o = NULL;
178 PyObject *
volatile vob = NULL;
198 char *e_type_s = NULL;
199 char *e_module_s = NULL;
203 e_type_o = PyObject_GetAttrString(
e,
"__name__");
204 e_module_o = PyObject_GetAttrString(
e,
"__module__");
210 if (v && ((vob = PyObject_Str(v)) != NULL))
216 if (!e_type_s || !e_module_s)
222 else if (strcmp(e_module_s,
"builtins") == 0
223 || strcmp(e_module_s,
"__main__") == 0
224 || strcmp(e_module_s,
"exceptions") == 0)
234 Py_XDECREF(e_type_o);
235 Py_XDECREF(e_module_o);
247 while (tb != NULL && tb != Py_None)
249 PyObject *
volatile frame = NULL;
250 PyObject *
volatile code = NULL;
251 PyObject *
volatile name = NULL;
252 PyObject *
volatile lineno = NULL;
257 lineno = PyObject_GetAttrString(tb,
"tb_lineno");
259 elog(
ERROR,
"could not get line number from Python traceback");
261 frame = PyObject_GetAttrString(tb,
"tb_frame");
263 elog(
ERROR,
"could not get frame from Python traceback");
265 code = PyObject_GetAttrString(frame,
"f_code");
267 elog(
ERROR,
"could not get code object from Python frame");
269 name = PyObject_GetAttrString(code,
"co_name");
271 elog(
ERROR,
"could not get function name from Python code object");
273 filename = PyObject_GetAttrString(code,
"co_filename");
275 elog(
ERROR,
"could not get file name from Python code object");
284 char *plain_filename;
298 plain_lineno = PyLong_AsLong(lineno);
301 appendStringInfo(&tbstr,
"\n PL/Python anonymous code block, line %ld, in %s",
302 plain_lineno - 1, fname);
305 proname, plain_lineno - 1, fname);
311 if (exec_ctx->
curr_proc && plain_filename != NULL &&
312 strcmp(plain_filename,
"<string>") == 0)
343 tb = PyObject_GetAttrString(tb,
"tb_next");
345 elog(
ERROR,
"could not traverse Python traceback");
362 sqlstate = PyObject_GetAttrString(exc,
"sqlstate");
363 if (sqlstate == NULL)
367 if (strlen(buffer) == 5 &&
368 strspn(buffer,
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ") == 5)
371 buffer[3], buffer[4]);
382 char **hint,
char **query,
int *position,
383 char **schema_name,
char **table_name,
385 char **datatype_name,
char **constraint_name)
389 spidata = PyObject_GetAttrString(exc,
"spidata");
393 PyArg_ParseTuple(spidata,
"izzzizzzzz",
394 sqlerrcode, detail, hint, query, position,
395 schema_name, table_name, column_name,
396 datatype_name, constraint_name);
418 char **schema_name,
char **table_name,
char **column_name,
419 char **datatype_name,
char **constraint_name)
437 const char *s = NULL;
438 const char *
next = src;
445 while (current < lineno)
448 next = strchr(s + 1,
'\n');
454 if (current != lineno)
457 while (*s && isspace((
unsigned char) *s))
486 PyErr_SetString(exc,
buf);
492 const char *fmt_singular,
const char *fmt_plural,
504 PyErr_SetString(exc,
buf);
511 PyObject *
args = NULL;
512 PyObject *
error = NULL;
519 error = PyObject_CallObject(excclass,
args);
551 PyErr_SetObject(excclass,
error);
562 elog(
ERROR,
"could not convert error to Python exception");
571 val = PyObject_GetAttrString(obj, attrname);
572 if (
val != NULL &&
val != Py_None)
600 result = PyObject_SetAttrString(obj, attrname,
val);
#define dngettext(d, s, p, n)
int err_generic_string(int field, const char *str)
int internalerrquery(const char *query)
int internalerrposition(int cursorpos)
int errmsg_internal(const char *fmt,...)
int errdetail_internal(const char *fmt,...)
int errhint(const char *fmt,...)
int errcode(int sqlerrcode)
char * unpack_sql_state(int sql_state)
#define MAKE_SQLSTATE(ch1, ch2, ch3, ch4, ch5)
#define ereport(elevel,...)
char * pstrdup(const char *in)
void pfree(void *pointer)
char * pnstrdup(const char *in, Size len)
static void get_string_attr(PyObject *obj, char *attrname, char **str)
static bool set_string_attr(PyObject *obj, char *attrname, char *str)
static void PLy_get_error_data(PyObject *exc, int *sqlerrcode, char **detail, char **hint, char **schema_name, char **table_name, char **column_name, char **datatype_name, char **constraint_name)
void PLy_elog_impl(int elevel, const char *fmt,...)
PyObject * PLy_exc_spi_error
void PLy_exception_set_with_details(PyObject *excclass, ErrorData *edata)
static void PLy_get_spi_error_data(PyObject *exc, int *sqlerrcode, char **detail, char **hint, char **query, int *position, char **schema_name, char **table_name, char **column_name, char **datatype_name, char **constraint_name)
void PLy_exception_set(PyObject *exc, const char *fmt,...)
static char * get_source_line(const char *src, int lineno)
static void PLy_get_sqlerrcode(PyObject *exc, int *sqlerrcode)
void PLy_exception_set_plural(PyObject *exc, const char *fmt_singular, const char *fmt_plural, unsigned long n,...)
static void PLy_traceback(PyObject *e, PyObject *v, PyObject *tb, char *volatile *xmsg, char *volatile *tbmsg, int *tb_depth)
PLyExecutionContext * PLy_current_execution_context(void)
char * PLy_procedure_name(PLyProcedure *proc)
char * PLyUnicode_AsString(PyObject *unicode)
PyObject * PLyUnicode_FromString(const char *s)
#define PG_DIAG_SCHEMA_NAME
#define PG_DIAG_CONSTRAINT_NAME
#define PG_DIAG_DATATYPE_NAME
#define PG_DIAG_TABLE_NAME
#define PG_DIAG_COLUMN_NAME
int appendStringInfoVA(StringInfo str, const char *fmt, va_list args)
void appendStringInfo(StringInfo str, const char *fmt,...)
void enlargeStringInfo(StringInfo str, int needed)
void appendStringInfoString(StringInfo str, const char *s)
void initStringInfo(StringInfo str)