errcontext.patch
text/x-diff
Filename: errcontext.patch
Type: text/x-diff
Part: 0
Patch
Format: unified
| File | + | − |
|---|---|---|
| src/backend/nodes/params.c | 11 | 7 |
| src/backend/tcop/postgres.c | 10 | 11 |
| src/include/nodes/params.h | 6 | 0 |
diff --git a/src/backend/nodes/params.c b/src/backend/nodes/params.c
index 13d90f6551..a881df578e 100644
--- a/src/backend/nodes/params.c
+++ b/src/backend/nodes/params.c
@@ -23,6 +23,7 @@
#include "utils/datum.h"
#include "utils/lsyscache.h"
#include "utils/memutils.h"
+#include "utils/portal.h"
/*
@@ -361,14 +362,17 @@ BuildParamLogString(ParamListInfo params, char **knownTextValues)
void
ParamsErrorCallback(void *arg)
{
- ParamListInfo params = (ParamListInfo) arg;
+ ParamsErrorCbData *data = (ParamsErrorCbData *) arg;
- if (params == NULL || params->paramValuesStr == NULL)
+ if (data == NULL ||
+ data->params == NULL ||
+ data->params->paramValuesStr == NULL)
return;
- /*
- * XXX this clobbers any other DETAIL line that the error callsite could
- * have had. Do we care?
- */
- errdetail("parameters: %s", params->paramValuesStr);
+ if (data->portalName && data->portalName[0] != '\0')
+ errcontext("extended query \"%s\" with parameters: %s",
+ data->portalName, data->params->paramValuesStr);
+ else
+ errcontext("extended query with parameters: %s",
+ data->params->paramValuesStr);
}
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index 9a009a5a9b..05a03ae924 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -1753,7 +1753,7 @@ exec_bind_message(StringInfo input_message)
*/
if (numParams > 0)
{
- char **knownTextValues = NULL;
+ char **knownTextValues = NULL; /* allocate on first use */
params = makeParamList(numParams);
@@ -1822,22 +1822,19 @@ exec_bind_message(StringInfo input_message)
pval = OidInputFunctionCall(typinput, pstring, typioparam, -1);
- /*
- * Save the parameter string if we need it; otherwise free it.
- */
+ /* When logging params, save a copy for later. */
if (pstring)
{
if (log_parameters_on_error)
{
- /*
- * Allocate this on first use, making sure to put it
- * in a short-lived context.
- */
if (knownTextValues == NULL)
knownTextValues =
MemoryContextAllocZero(MessageContext,
numParams * sizeof(char *));
- knownTextValues[paramno] = pstring;
+ knownTextValues[paramno] =
+ pstring == pbuf.data ?
+ MemoryContextStrdup(MessageContext, pstring) :
+ pstring;
}
else if (pstring != pbuf.data)
pfree(pstring);
@@ -1905,7 +1902,8 @@ exec_bind_message(StringInfo input_message)
/* Set the error callback so that parameters are logged, as needed */
params_errcxt.previous = error_context_stack;
params_errcxt.callback = ParamsErrorCallback;
- params_errcxt.arg = (void *) params;
+ params_errcxt.arg = (void *) &((ParamsErrorCbData)
+ { portal->name, params });
error_context_stack = ¶ms_errcxt;
/* Get the result format codes */
@@ -2145,7 +2143,8 @@ exec_execute_message(const char *portal_name, long max_rows)
*/
params_errcxt.previous = error_context_stack;
params_errcxt.callback = ParamsErrorCallback;
- params_errcxt.arg = (void *) portalParams;
+ params_errcxt.arg = (void *) &((ParamsErrorCbData)
+ { portal->name, portalParams });
error_context_stack = ¶ms_errcxt;
if (max_rows <= 0)
diff --git a/src/include/nodes/params.h b/src/include/nodes/params.h
index ba51dfe5e0..1e557ca7fd 100644
--- a/src/include/nodes/params.h
+++ b/src/include/nodes/params.h
@@ -150,6 +150,12 @@ typedef struct ParamExecData
bool isnull;
} ParamExecData;
+/* type of argument for ParamsErrorCallback */
+typedef struct ParamsErrorCbData
+{
+ const char *portalName;
+ ParamListInfo params;
+} ParamsErrorCbData;
/* Functions found in src/backend/nodes/params.c */
extern ParamListInfo makeParamList(int numParams);