From 45d702b45b86a0a09a34f539391e0d87a62dce33 Mon Sep 17 00:00:00 2001
From: Peter Smith <peter.b.smith@fujitsu.com>
Date: Mon, 19 Dec 2022 16:27:31 +1100
Subject: [PATCH v1] isolationtester - allow session specific conninfo

---
 src/test/isolation/isolationtester.c | 26 +++++++++++++++++++++++++-
 src/test/isolation/isolationtester.h |  1 +
 src/test/isolation/specparse.y       | 20 +++++++++++++-------
 src/test/isolation/specscanner.l     |  1 +
 4 files changed, 40 insertions(+), 8 deletions(-)

diff --git a/src/test/isolation/isolationtester.c b/src/test/isolation/isolationtester.c
index 0a66235..76edbf1 100644
--- a/src/test/isolation/isolationtester.c
+++ b/src/test/isolation/isolationtester.c
@@ -119,6 +119,8 @@ main(int argc, char **argv)
 	 * as the conninfo string; otherwise default to setting dbname=postgres
 	 * and using environment variables or defaults for all other connection
 	 * parameters.
+	 *
+	 * Note, this will be overridden by any session specific 'conninfo'.
 	 */
 	if (argc > optind)
 		conninfo = argv[optind];
@@ -153,15 +155,37 @@ main(int argc, char **argv)
 	for (i = 0; i < nconns; i++)
 	{
 		const char *sessionname;
+		const char *sessionconninfo;
 
 		if (i == 0)
+		{
 			sessionname = "control connection";
+			sessionconninfo = NULL;
+		}
 		else
+		{
 			sessionname = testspec->sessions[i - 1]->name;
+			sessionconninfo = testspec->sessions[i - 1]->conninfo;
+		}
 
 		conns[i].sessionname = sessionname;
 
-		conns[i].conn = PQconnectdb(conninfo);
+		/*
+		 * If this spec session has specified a conninfo to use then that
+		 * overrides and other conninfo (e.g. passed as an argument)
+		 *
+		 * Note - the necessary instance to connect to is assumed to exist
+		 * already manually setup by the user.
+		 */
+		if (sessionconninfo)
+		{
+			fprintf(stderr, "session '%s' specifies connection info '%s'\n", sessionname, sessionconninfo);
+			conns[i].conn = PQconnectdb(sessionconninfo);
+		}
+		else
+		{
+			conns[i].conn = PQconnectdb(conninfo);
+		}
 		if (PQstatus(conns[i].conn) != CONNECTION_OK)
 		{
 			fprintf(stderr, "Connection %d failed: %s",
diff --git a/src/test/isolation/isolationtester.h b/src/test/isolation/isolationtester.h
index 77134b0..317abcd 100644
--- a/src/test/isolation/isolationtester.h
+++ b/src/test/isolation/isolationtester.h
@@ -24,6 +24,7 @@ typedef struct Step Step;
 typedef struct
 {
 	char	   *name;
+	char 	   *conninfo;
 	char	   *setupsql;
 	char	   *teardownsql;
 	Step	  **steps;
diff --git a/src/test/isolation/specparse.y b/src/test/isolation/specparse.y
index 657285c..b927362 100644
--- a/src/test/isolation/specparse.y
+++ b/src/test/isolation/specparse.y
@@ -39,7 +39,7 @@ TestSpec		parseresult;			/* result of parsing is left here */
 }
 
 %type <ptr_list> setup_list
-%type <str>  opt_setup opt_teardown
+%type <str>  opt_conninfo opt_setup opt_teardown
 %type <str> setup
 %type <ptr_list> step_list session_list permutation_list opt_permutation_list
 %type <ptr_list> permutation_step_list blocker_list
@@ -51,7 +51,7 @@ TestSpec		parseresult;			/* result of parsing is left here */
 
 %token <str> sqlblock identifier
 %token <integer> INTEGER
-%token NOTICES PERMUTATION SESSION SETUP STEP TEARDOWN TEST
+%token NOTICES PERMUTATION SESSION CONNINFO SETUP STEP TEARDOWN TEST
 
 %%
 
@@ -86,6 +86,11 @@ setup_list:
 			}
 		;
 
+opt_conninfo:
+			/* EMPTY */				{ $$ = NULL; }
+			| CONNINFO identifier	{ $$ = $2; }
+		;
+
 opt_setup:
 			/* EMPTY */			{ $$ = NULL; }
 			| setup				{ $$ = $1; }
@@ -117,14 +122,15 @@ session_list:
 		;
 
 session:
-			SESSION identifier opt_setup step_list opt_teardown
+			SESSION identifier opt_conninfo opt_setup step_list opt_teardown
 			{
 				$$ = pg_malloc(sizeof(Session));
 				$$->name = $2;
-				$$->setupsql = $3;
-				$$->steps = (Step **) $4.elements;
-				$$->nsteps = $4.nelements;
-				$$->teardownsql = $5;
+				$$->conninfo = $3;
+				$$->setupsql = $4;
+				$$->steps = (Step **) $5.elements;
+				$$->nsteps = $5.nelements;
+				$$->teardownsql = $6;
 			}
 		;
 
diff --git a/src/test/isolation/specscanner.l b/src/test/isolation/specscanner.l
index b04696f..3174372 100644
--- a/src/test/isolation/specscanner.l
+++ b/src/test/isolation/specscanner.l
@@ -71,6 +71,7 @@ self			[,()*]
 %}
 
  /* Keywords (must appear before the {identifier} rule!) */
+conninfo		{ return CONNINFO; }
 notices			{ return NOTICES; }
 permutation		{ return PERMUTATION; }
 session			{ return SESSION; }
-- 
1.8.3.1

