aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/error/elog.c
diff options
context:
space:
mode:
authorNeil Conway <neilc@samurai.com>2005-06-10 16:23:11 +0000
committerNeil Conway <neilc@samurai.com>2005-06-10 16:23:11 +0000
commitd46bc444ac0f2b4c027e624c10bc8d49ffbe2a2f (patch)
treea67d32556ae2e472c90963ee5ec63992c4e50149 /src/backend/utils/error/elog.c
parent1a61896189c54dbbb63973d45f59c73fd2f4b44c (diff)
downloadpostgresql-d46bc444ac0f2b4c027e624c10bc8d49ffbe2a2f.tar.gz
postgresql-d46bc444ac0f2b4c027e624c10bc8d49ffbe2a2f.zip
Implement two new special variables in PL/PgSQL: SQLSTATE and SQLERRM.
These contain the SQLSTATE and error message of the current exception, respectively. They are scope-local variables that are only defined in exception handlers (so attempting to reference them outside an exception handler is an error). Update the regression tests and the documentation. Also, do some minor related cleanup: export an unpack_sql_state() function from the backend and use it to unpack a SQLSTATE into a string, and add a free_var() function to pl_exec.c Original patch from Pavel Stehule, review by Neil Conway.
Diffstat (limited to 'src/backend/utils/error/elog.c')
-rw-r--r--src/backend/utils/error/elog.c38
1 files changed, 22 insertions, 16 deletions
diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index 122a0a92a55..3e883887ee8 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -42,7 +42,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.159 2005/06/09 22:29:52 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.160 2005/06/10 16:23:10 neilc Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1482,6 +1482,26 @@ log_line_prefix(StringInfo buf)
}
}
+/*
+ * Unpack MAKE_SQLSTATE code. Note that this returns a pointer to a
+ * static buffer.
+ */
+char *
+unpack_sql_state(int sql_state)
+{
+ static char buf[12];
+ int i;
+
+ for (i = 0; i < 5; i++)
+ {
+ buf[i] = PGUNSIXBIT(sql_state);
+ sql_state >>= 6;
+ }
+
+ buf[i] = '\0';
+ return buf;
+}
+
/*
* Write error report to server's log
@@ -1497,21 +1517,7 @@ send_message_to_server_log(ErrorData *edata)
appendStringInfo(&buf, "%s: ", error_severity(edata->elevel));
if (Log_error_verbosity >= PGERROR_VERBOSE)
- {
- /* unpack MAKE_SQLSTATE code */
- char tbuf[12];
- int ssval;
- int i;
-
- ssval = edata->sqlerrcode;
- for (i = 0; i < 5; i++)
- {
- tbuf[i] = PGUNSIXBIT(ssval);
- ssval >>= 6;
- }
- tbuf[i] = '\0';
- appendStringInfo(&buf, "%s: ", tbuf);
- }
+ appendStringInfo(&buf, "%s: ", unpack_sql_state(edata->sqlerrcode));
if (edata->message)
append_with_tabs(&buf, edata->message);