From 3292747b1a534a78ca2ba8a889307ea8585b55b6 Mon Sep 17 00:00:00 2001
From: Claudio Freire <klaussfreire@gmail.com>
Date: Tue, 16 Aug 2016 23:50:52 -0300
Subject: [PATCH 1/2] pg_regress: allow ignoring some lines

Allows some lines to be selectively ignored when comparing
against expected output, something that comes up when some
output isn't fully deterministic (think stuff dependent on
physical order of tuples), and not really interesting either.
---
 src/test/regress/pg_regress.c | 74 ++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 70 insertions(+), 4 deletions(-)

diff --git a/src/test/regress/pg_regress.c b/src/test/regress/pg_regress.c
index 574f5b8..2f2e1b3 100644
--- a/src/test/regress/pg_regress.c
+++ b/src/test/regress/pg_regress.c
@@ -1300,6 +1300,65 @@ run_diff(const char *cmd, const char *filename)
 	return WEXITSTATUS(r);
 }
 
+static bool
+clean_results_file(const char *infilename, const char *outfilename)
+{
+	char		scbuf[1024];
+	char		cleanup_word[1024];
+	FILE		*infile, *outfile;
+	bool		inside_cleanup;
+	bool		inside_selective_cleanup;
+	int		i;
+
+	cleanup_word[1023] = 0;
+
+	infile = fopen(infilename, "r");
+	if (!infile)
+	{
+		fprintf(stderr, _("%s: could not open file \"%s\" for reading: %s\n"),
+				progname, infilename, strerror(errno));
+		exit(2);
+	}
+
+	outfile = fopen(outfilename, "w");
+	if (!outfile)
+	{
+		fclose(infile);
+		fprintf(stderr, _("%s: could not open file \"%s\" for reading: %s\n"),
+				progname, outfilename, strerror(errno));
+		exit(2);
+	}
+
+	inside_cleanup = false;
+	inside_selective_cleanup = false;
+	while (fgets(scbuf, sizeof(scbuf), infile) != NULL) 
+	{
+		if (strncmp(scbuf, "--end-ignore--", 14) == 0)
+			inside_cleanup = inside_selective_cleanup = false;
+		if (!inside_cleanup && (!inside_selective_cleanup || strstr(scbuf, cleanup_word) == NULL)) {
+			fwrite(scbuf, 1, strlen(scbuf), outfile);
+		}
+		if (!inside_cleanup) {
+			if (strncmp(scbuf, "--begin-ignore--", 16) == 0)
+				inside_cleanup = true;
+			else if (strncmp(scbuf, "--begin-word-ignore--", 21) == 0) {
+				inside_selective_cleanup = true;
+				strncpy(cleanup_word, scbuf+21, sizeof(cleanup_word));
+
+				/* strip trailing whitespace, especially the newline */
+				i = strlen(cleanup_word);
+				while (i > 0 && isspace((unsigned char) cleanup_word[i - 1]))
+					cleanup_word[--i] = '\0';
+			}
+		}
+	}
+
+	fclose(infile);
+	fclose(outfile);
+
+	return true;
+}
+
 /*
  * Check the actual result file for the given test against expected results
  *
@@ -1310,6 +1369,7 @@ static bool
 results_differ(const char *testname, const char *resultsfile, const char *default_expectfile)
 {
 	char		expectfile[MAXPGPATH];
+	char		cleanresultsfile[MAXPGPATH];
 	char		diff[MAXPGPATH];
 	char		cmd[MAXPGPATH * 3];
 	char		best_expect_file[MAXPGPATH];
@@ -1319,6 +1379,11 @@ results_differ(const char *testname, const char *resultsfile, const char *defaul
 	int			l;
 	const char *platform_expectfile;
 
+	snprintf(cleanresultsfile, sizeof(cleanresultsfile),
+			"%s.tmp",
+			resultsfile);
+	clean_results_file(resultsfile, cleanresultsfile);
+
 	/*
 	 * We can pass either the resultsfile or the expectfile, they should have
 	 * the same type (filename.type) anyway.
@@ -1344,7 +1409,7 @@ results_differ(const char *testname, const char *resultsfile, const char *defaul
 	/* OK, run the diff */
 	snprintf(cmd, sizeof(cmd),
 			 "diff %s \"%s\" \"%s\" > \"%s\"",
-			 basic_diff_opts, expectfile, resultsfile, diff);
+			 basic_diff_opts, expectfile, cleanresultsfile, diff);
 
 	/* Is the diff file empty? */
 	if (run_diff(cmd, diff) == 0)
@@ -1377,7 +1442,7 @@ results_differ(const char *testname, const char *resultsfile, const char *defaul
 
 		snprintf(cmd, sizeof(cmd),
 				 "diff %s \"%s\" \"%s\" > \"%s\"",
-				 basic_diff_opts, alt_expectfile, resultsfile, diff);
+				 basic_diff_opts, alt_expectfile, cleanresultsfile, diff);
 
 		if (run_diff(cmd, diff) == 0)
 		{
@@ -1405,7 +1470,7 @@ results_differ(const char *testname, const char *resultsfile, const char *defaul
 	{
 		snprintf(cmd, sizeof(cmd),
 				 "diff %s \"%s\" \"%s\" > \"%s\"",
-				 basic_diff_opts, default_expectfile, resultsfile, diff);
+				 basic_diff_opts, default_expectfile, cleanresultsfile, diff);
 
 		if (run_diff(cmd, diff) == 0)
 		{
@@ -1429,7 +1494,7 @@ results_differ(const char *testname, const char *resultsfile, const char *defaul
 	 */
 	snprintf(cmd, sizeof(cmd),
 			 "diff %s \"%s\" \"%s\" >> \"%s\"",
-			 pretty_diff_opts, best_expect_file, resultsfile, difffilename);
+			 pretty_diff_opts, best_expect_file, cleanresultsfile, difffilename);
 	run_diff(cmd, difffilename);
 
 	/* And append a separator */
@@ -1442,6 +1507,7 @@ results_differ(const char *testname, const char *resultsfile, const char *defaul
 	}
 
 	unlink(diff);
+	unlink(cleanresultsfile);
 	return true;
 }
 
-- 
2.6.6

