patch.c
text/x-csrc
else
{
resetStringInfo(&sinfo);
appendStringInfo(&sinfo, "In function: %s", funcname);
do_text_output_oneline(tstate, sinfo.data);
for (i = 0; i < SPI_processed; i++)
{
char *query;
resetStringInfo(&sinfo);
appendStringInfo(&sinfo, "%s:%s:%s:%s:%s",
SPI_getvalue(SPI_tuptable->vals[i], SPI_tuptable->tupdesc, 8),
SPI_getvalue(SPI_tuptable->vals[i], SPI_tuptable->tupdesc, 4),
SPI_getvalue(SPI_tuptable->vals[i], SPI_tuptable->tupdesc, 2),
SPI_getvalue(SPI_tuptable->vals[i], SPI_tuptable->tupdesc, 3),
SPI_getvalue(SPI_tuptable->vals[i], SPI_tuptable->tupdesc, 5));
do_text_output_oneline(tstate, sinfo.data);
resetStringInfo(&sinfo);
query = SPI_getvalue(SPI_tuptable->vals[i], SPI_tuptable->tupdesc, 10);
if (query != NULL)
{
bool isnull;
char *query_line; /* pointer to begin of processed line */
int query_line_caret;
int caret;
bool is_first_line = true;
/*
* put any query line to separate output line. And append
* a curet, when is defined and related to processed rows.
*/
caret = SPI_getbinval(SPI_tuptable->vals[i], SPI_tuptable->tupdesc, 9, &isnull);
if (isnull)
caret = -1;
query_line = query;
query_line_caret = caret;
while (*query != '\0')
{
int len;
if (*query == '\n')
{
/* now we found end of line */
*query = '\0';
if (is_first_line)
{
appendStringInfo(&sinfo, "query:%s", query_line);
is_first_line = false;
}
else
appendStringInfo(&sinfo, " %s", query_line);
do_text_output_oneline(tstate, sinfo.data);
resetStringInfo(&sinfo);
if (query_line_caret > 0 && caret == 0)
{
appendStringInfo(&sinfo, " %*s",
query_line_caret, "^");
do_text_output_oneline(tstate, sinfo.data);
resetStringInfo(&sinfo);
query_line_caret = 0;
}
/* store caret offset for next line */
if (caret > 0)
query_line_caret = caret - 1;
/* go to next line */
query_line = query + 1;
}
len = pg_mblen(query);
query += len;
if (caret > 0)
caret--;
}
/* last line output */
if (query_line != NULL)
{
if (is_first_line)
{
appendStringInfo(&sinfo, "query:%s", query_line);
}
else
appendStringInfo(&sinfo, " %s", query_line);
do_text_output_oneline(tstate, sinfo.data);
resetStringInfo(&sinfo);
if (query_line_caret > 0 && caret == 0)
{
appendStringInfo(&sinfo, " %*s",
query_line_caret, "^");
do_text_output_oneline(tstate, sinfo.data);
resetStringInfo(&sinfo);
}
}
}
}
}