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 (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers