From 061b88c732952c59741374806e1e41c1ec845d50 Mon Sep 17 00:00:00 2001
From: Robert Haas <rhaas@postgresql.org>
Date: Tue, 12 Nov 2013 11:23:47 -0500
Subject: [PATCH] Try again to make pg_isolation_regress work its build
 directory.

We can't search for the isolationtester binary until after we've set
up the environment, because otherwise when find_other_exec() tries
to invoke it with the -V option, it might fail for inability to
locate a working libpq.  So postpone that step.

Andres Freund
---
 src/test/isolation/isolation_main.c | 33 +++++++++++++++++++++++------
 1 file changed, 26 insertions(+), 7 deletions(-)

diff --git a/src/test/isolation/isolation_main.c b/src/test/isolation/isolation_main.c
index b3a8ff0530b..94f01b81d34 100644
--- a/src/test/isolation/isolation_main.c
+++ b/src/test/isolation/isolation_main.c
@@ -12,7 +12,10 @@
 
 #include "pg_regress.h"
 
+char saved_argv0[MAXPGPATH];
 char isolation_exec[MAXPGPATH];
+bool looked_up_isolation_exec = false;
+
 #define PG_ISOLATION_VERSIONSTR "isolationtester (PostgreSQL) " PG_VERSION "\n"
 
 /*
@@ -32,6 +35,19 @@ isolation_start_test(const char *testname,
 	char		psql_cmd[MAXPGPATH * 3];
 	size_t		offset = 0;
 
+	/* need to do the path lookup here, check isolation_init() for details */
+	if (!looked_up_isolation_exec)
+	{
+		/* look for isolationtester binary */
+		if (find_other_exec(saved_argv0, "isolationtester",
+							PG_ISOLATION_VERSIONSTR, isolation_exec) != 0)
+		{
+			fprintf(stderr, _("could not find proper isolationtester binary\n"));
+			exit(2);
+		}
+		looked_up_isolation_exec = true;
+	}
+
 	/*
 	 * Look for files in the output dir first, consistent with a vpath search.
 	 * This is mainly to create more reasonable error messages if the file is
@@ -82,13 +98,16 @@ isolation_start_test(const char *testname,
 static void
 isolation_init(int argc, char **argv)
 {
-	/* look for isolationtester binary */
-	if (find_other_exec(argv[0], "isolationtester",
-						PG_ISOLATION_VERSIONSTR, isolation_exec) != 0)
-	{
-		fprintf(stderr, _("could not find proper isolationtester binary\n"));
-		exit(2);
-	}
+	/*
+	 * We unfortunately cannot do the find_other_exec() lookup to find the
+	 * "isolationtester" binary here.  regression_main() calls the
+	 * initialization functions before parsing the commandline arguments and
+	 * thus hasn't changed the library search path at this point which in turn
+	 * can cause the "isolationtester -V" invocation that find_other_exec()
+	 * does to fail since it's linked to libpq.  So we instead copy argv[0]
+	 * and do the lookup the first time through isolation_start_test().
+	 */
+	strncpy(saved_argv0, argv[0], MAXPGPATH);
 
 	/* set default regression database name */
 	add_stringlist_item(&dblist, "isolationtest");
-- 
GitLab