small fix of CheckFunctionById function
Regards
p.s. Alvaro, please, send your patch and I'll merge it
/*
* Connect to SPI manager
*/
if (SPI_connect() != SPI_OK_CONNECT)
elog(ERROR, "SPI_connect failed");
values[0] = ObjectIdGetDatum(funcOid);
values[1] = ObjectIdGetDatum(relid);
values[2] = PointerGetDatum(options);
values[3] = BoolGetDatum(fatal_errors);
SPI_execute_with_args(sinfo.data,
4, argtypes,
values, nulls,
true, 0);
result = SPI_processed == 0;
if (result)
{
resetStringInfo(&sinfo);
appendStringInfo(&sinfo, "Function is valid: '%s'", funcname);
do_text_output_oneline(tstate, sinfo.data);
}
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;
else
caret;
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 > 1)
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);
}
}
}
}
}
--
Sent via pgsql-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers