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

Reply via email to