Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1o6diB-0004pw-Ls for pgsql-hackers@arkaria.postgresql.org; Wed, 29 Jun 2022 19:50:56 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1o6diA-00058N-10 for pgsql-hackers@arkaria.postgresql.org; Wed, 29 Jun 2022 19:50:54 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1o6di9-00058E-Iz for pgsql-hackers@lists.postgresql.org; Wed, 29 Jun 2022 19:50:53 +0000 Received: from smtp.outgoing.loopia.se ([93.188.3.37]) by magus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1o6di5-0001d7-On for pgsql-hackers@lists.postgresql.org; Wed, 29 Jun 2022 19:50:53 +0000 Received: from s807.loopia.se (localhost [127.0.0.1]) by s807.loopia.se (Postfix) with ESMTP id 204072F468FB for ; Wed, 29 Jun 2022 21:50:48 +0200 (CEST) Received: from s899.loopia.se (unknown [172.22.191.6]) by s807.loopia.se (Postfix) with ESMTP id 58A832F5D70D; Wed, 29 Jun 2022 21:50:46 +0200 (CEST) Received: from s473.loopia.se (unknown [172.22.191.5]) by s899.loopia.se (Postfix) with ESMTP id 550582C8BA41; Wed, 29 Jun 2022 21:50:46 +0200 (CEST) X-Virus-Scanned: amavisd-new at amavis.loopia.se X-Spam-Flag: NO X-Spam-Score: -1 X-Spam-Level: X-Spam-Status: No, score=-1 tagged_above=-999 required=6.2 tests=[ALL_TRUSTED=-1] autolearn=disabled Received: from s934.loopia.se ([172.22.191.6]) by s473.loopia.se (s473.loopia.se [172.22.190.13]) (amavisd-new, port 10024) with LMTP id ViqH-dLRNZF9; Wed, 29 Jun 2022 21:50:45 +0200 (CEST) X-Loopia-Auth: user X-Loopia-User: daniel@yesql.se X-Loopia-Originating-IP: 89.255.232.193 Received: from smtpclient.apple (customer-89-255-232-193.stosn.net [89.255.232.193]) (Authenticated sender: daniel@yesql.se) by s934.loopia.se (Postfix) with ESMTPSA id CF1837CEAA6; Wed, 29 Jun 2022 21:50:45 +0200 (CEST) From: Daniel Gustafsson Message-Id: <489D2B5A-B26F-4918-BC07-B426329169E3@yesql.se> Content-Type: multipart/mixed; boundary="Apple-Mail=_28E575C6-085C-4BA8-8E88-A9C502440BFE" Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3696.100.31\)) Subject: Re: TAP output format in pg_regress Date: Wed, 29 Jun 2022 21:50:45 +0200 In-Reply-To: Cc: PostgreSQL Developers To: Andres Freund References: <49A54862-C682-4B60-9155-05F178FA79DC@yesql.se> <20220321234924.kcc3q26o7sx6rnfa@alap3.anarazel.de> X-Mailer: Apple Mail (2.3696.100.31) List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --Apple-Mail=_28E575C6-085C-4BA8-8E88-A9C502440BFE Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=us-ascii Attached is a new version of this patch, which completes the TAP output = format option such that all codepaths emitting output are TAP compliant. The = verbose option is fixed to to not output extraneous newlines which the previous = PoC did. The output it made to conform to the original TAP spec since = v13/14 TAP parsers seem less common than those that can handle the original spec. = Support for the new format additions should be quite simple to add should we = want that. Running pg_regress --verbose should give the current format output. I did end up combining TAP and --verbose into a single patch, as the TAP = format sort of depends on the verbose flag as TAP has no verbose mode. I can = split it into two separate should a reviewer prefer that. -- Daniel Gustafsson https://vmware.com/ --Apple-Mail=_28E575C6-085C-4BA8-8E88-A9C502440BFE Content-Disposition: attachment; filename=v5-0001-pg_regress-TAP-output-format.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="v5-0001-pg_regress-TAP-output-format.patch" Content-Transfer-Encoding: quoted-printable =46rom=20fea1f31702bed856aa32f3e5f3cec19ace8c8bba=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Daniel=20Gustafsson=20= =0ADate:=20Wed,=2029=20Jun=202022=2021:44:52=20= +0200=0ASubject:=20[PATCH=20v5]=20pg_regress=20TAP=20output=20format=0A=0A= TAP=20is=20now=20a=20supported=20output=20format=20for=20pg_regress=20= test=20runs=20on=20top=0Aof=20the=20existing=20format=20which=20is=20= called=20regress=20in=20this=20patch.=20Format=0Ais=20selected=20via=20a=20= new=20--format=3DSTRING=20option=20to=20pg_regress=20which=20can=0Atake=20= tap=20and=20regress=20and=20parameters.=20=20Output=20formats=20are=20= implemented=0Avia=20a=20set=20of=20function=20pointers=20which=20= implements=20an=20output=20API.=20Using=0ANULL=20for=20all=20functions=20= will=20generate=20a=20silent=20mode,=20=20but=20thats=20not=20a=0Apart=20= of=20this=20commit.=0A=0AThis=20also=20brings=20a=20new=20parameter=20to=20= pg_regress=20for=20deciding=20=20verbose=0Aoutput,=20since=20TAP=20= doesn't=20have=20a=20verbose=20mode=20(and=20the=20existing=20mode=0Awas=20= deemed=20overly=20chatty).=0A=0AAs=20all=20output=20from=20pg_regress=20= had=20to=20be=20addressed,=20=20the=20frontend=20log=0Aframework=20was=20= also=20brought=20to=20use=20as=20it=20was=20already=20being=20set=20up=20= but=0Anot=20used.=0A---=0A=20src/test/regress/pg_regress.c=20|=20745=20= ++++++++++++++++++++++++----------=0A=201=20file=20changed,=20536=20= insertions(+),=20209=20deletions(-)=0A=0Adiff=20--git=20= a/src/test/regress/pg_regress.c=20b/src/test/regress/pg_regress.c=0A= index=20982801e029..265f9e6148=20100644=0A---=20= a/src/test/regress/pg_regress.c=0A+++=20b/src/test/regress/pg_regress.c=0A= @@=20-74,6=20+74,7=20@@=20const=20char=20*pretty_diff_opts=20=3D=20"-w=20= -U3";=0A=20/*=20options=20settable=20from=20command=20line=20*/=0A=20= _stringlist=20*dblist=20=3D=20NULL;=0A=20bool=09=09debug=20=3D=20false;=0A= +bool=09=09verbose=20=3D=20false;=0A=20char=09=20=20=20*inputdir=20=3D=20= ".";=0A=20char=09=20=20=20*outputdir=20=3D=20".";=0A=20char=09=20=20=20= *bindir=20=3D=20PGBINDIR;=0A@@=20-95,6=20+96,9=20@@=20static=20char=20= *dlpath=20=3D=20PKGLIBDIR;=0A=20static=20char=20*user=20=3D=20NULL;=0A=20= static=20_stringlist=20*extraroles=20=3D=20NULL;=0A=20static=20char=20= *config_auth_datadir=20=3D=20NULL;=0A+static=20char=20*format=20=3D=20= NULL;=0A+static=20char=20*psql_formatting=20=3D=20NULL;=0A+static=20bool=20= has_status=20=3D=20false;=0A=20=0A=20/*=20internal=20variables=20*/=0A=20= static=20const=20char=20*progname;=0A@@=20-120,11=20+124,96=20@@=20= static=20int=09fail_ignore_count=20=3D=200;=0A=20static=20bool=20= directory_exists(const=20char=20*dir);=0A=20static=20void=20= make_directory(const=20char=20*dir);=0A=20=0A-static=20void=20= header(const=20char=20*fmt,...)=20pg_attribute_printf(1,=202);=0A= +typedef=20enum=0A+{=0A+=09COMMENT_TEST_STATUS=20=3D=200,=0A+=09= COMMENT_DIAGNOSTIC,=0A+=09COMMENT_ERROR,=0A+=09COMMENT_VERBOSE=0A+}=09=09= =09CommentLevel;=0A+=0A+/*=0A+=20*=20Each=20supported=20output=20format=20= implements=20the=20below=20functions=20and=20supplies=0A+=20*=20a=20= filled=20out=20output_func=20structure.=20All=20output=20functions=20are=20= voluntary=20to=0A+=20*=20implement,=20using=20an=20output_func=20= structure=20with=20all=20NULLs=20will=20generate=20no=0A+=20*=20output=20= except=20for=20program=20errors.=0A+=20*/=0A+struct=20output_func=0A+{=0A= +=09void=20(*header)(const=20char=20*line);=0A+=09void=20(*footer)(const=20= char=20*difffilename,=20const=20char=20*logfilename);=0A+=09void=20= (*comment)(CommentLevel=20level,=20const=20char=20*comment);=0A+=0A+=09= void=20(*test_status_preamble)(const=20char=20*testname);=0A+=0A+=09void=20= (*test_status_ok)(const=20char=20*testname);=0A+=09void=20= (*test_status_failed)(const=20char=20*testname,=20bool=20ignore,=20char=20= *tags);=0A+=0A+=09void=20(*test_runtime)(const=20char=20*testname,=20= double=20runtime);=0A+=09void=20(*bail)(const=20char=20*message);=0A+};=0A= +=0A+/*=0A+=20*=20Main=20output=20functions=20which=20in=20turn=20= operate=20on=20the=20function=20pointers=20in=20the=0A+=20*=20= output_func=20which=20controls=20the=20format.=0A+=20*/=0A+static=20void=20= header(const=20char=20*fmt,...);=0A+static=20void=20footer(const=20char=20= *difffilename,=20const=20char=20*logfilename);=0A+static=20void=20= comment(CommentLevel=20level,=20const=20char=20*fmt,...);=0A+static=20= void=20test_status_preamble(const=20char=20*testname);=0A+static=20void=20= test_status_ok(const=20char=20*testname);=0A+static=20void=20= test_status_failed(const=20char=20*testname,=20bool=20ignore,=20char=20= *tags);=0A+static=20void=20runtime(const=20char=20*testname,=20double=20= runtime);=0A+static=20void=20bail(const=20char=20*fmt,...);=0A+=0A+/*=20= Text=20output=20format=20*/=0A+static=20void=20header_text(const=20char=20= *line);=0A+static=20void=20footer_text(const=20char=20*difffilename,=20= const=20char=20*logfilename);=0A+static=20void=20= comment_text(CommentLevel=20level,=20const=20char=20*comment);=0A+static=20= void=20test_status_preamble_text(const=20char=20*testname);=0A+static=20= void=20test_status_ok_text(const=20char=20*testname);=0A+static=20void=20= test_status_failed_text(const=20char=20*testname,=20bool=20ignore,=20= char=20*tags);=0A+static=20void=20test_runtime_text(const=20char=20= *testname,=20double=20runtime);=0A+static=20void=20bail_text(const=20= char=20*message);=0A+=0A+struct=20output_func=20output_func_text=20=3D=0A= +{=0A+=09header_text,=0A+=09footer_text,=0A+=09comment_text,=0A+=09= test_status_preamble_text,=0A+=09test_status_ok_text,=0A+=09= test_status_failed_text,=0A+=09test_runtime_text,=0A+=09bail_text=0A+};=0A= +=0A+/*=20TAP=20output=20format=20*/=0A+static=20void=20footer_tap(const=20= char=20*difffilename,=20const=20char=20*logfilename);=0A+static=20void=20= comment_tap(CommentLevel=20level,=20const=20char=20*comment);=0A+static=20= void=20test_status_ok_tap(const=20char=20*testname);=0A+static=20void=20= test_status_failed_tap(const=20char=20*testname,=20bool=20ignore,=20char=20= *tags);=0A+static=20void=20bail_tap(const=20char=20*message);=0A+=0A= +struct=20output_func=20output_func_tap=20=3D=0A+{=0A+=09NULL,=0A+=09= footer_tap,=0A+=09comment_tap,=0A+=09NULL,=0A+=09test_status_ok_tap,=0A+=09= test_status_failed_tap,=0A+=09NULL,=0A+=09bail_tap=0A+};=0A+=0A+struct=20= output_func=20*output=20=3D=20&output_func_text;=0A+=0A=20static=20void=20= status(const=20char=20*fmt,...)=20pg_attribute_printf(1,=202);=0A=20= static=20StringInfo=20psql_start_command(void);=0A=20static=20void=20= psql_add_command(StringInfo=20buf,=20const=20char=20*query,...)=20= pg_attribute_printf(2,=203);=0A=20static=20void=20= psql_end_command(StringInfo=20buf,=20const=20char=20*database);=0A= +static=20void=20status_end(void);=0A=20=0A=20/*=0A=20=20*=20allow=20= core=20files=20if=20possible.=0A@@=20-138,7=20+227,7=20@@=20= unlimit_core_size(void)=0A=20=09getrlimit(RLIMIT_CORE,=20&lim);=0A=20=09= if=20(lim.rlim_max=20=3D=3D=200)=0A=20=09{=0A-=09=09fprintf(stderr,=0A+=09= =09comment(COMMENT_VERBOSE,=0A=20=09=09=09=09_("%s:=20could=20not=20set=20= core=20size:=20disallowed=20by=20hard=20limit\n"),=0A=20=09=09=09=09= progname);=0A=20=09=09return;=0A@@=20-208,18=20+297,293=20@@=20= split_to_stringlist(const=20char=20*s,=20const=20char=20*delim,=20= _stringlist=20**listhead)=0A=20/*=0A=20=20*=20Print=20a=20progress=20= banner=20on=20stdout.=0A=20=20*/=0A+static=20void=0A+header_text(const=20= char=20*line)=0A+{=0A+=09if=20(!verbose)=0A+=09=09return;=0A+=0A+=09= fprintf(stdout,=20"=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=20%-38s=20= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D\n",=20line);=0A+=09= fflush(stdout);=0A+}=0A+=0A=20static=20void=0A=20header(const=20char=20= *fmt,...)=0A=20{=0A=20=09char=09=09tmp[64];=0A=20=09va_list=09=09ap;=0A=20= =0A+=09if=20(!output->header)=0A+=09=09return;=0A+=0A=20=09va_start(ap,=20= fmt);=0A=20=09vsnprintf(tmp,=20sizeof(tmp),=20fmt,=20ap);=0A=20=09= va_end(ap);=0A=20=0A-=09fprintf(stdout,=20"=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=20%-38s=20=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D\n",=20= tmp);=0A-=09fflush(stdout);=0A+=09output->header(tmp);=0A+}=0A+=0A= +static=20void=0A+footer_text(const=20char=20*difffilename,=20const=20= char=20*logfilename)=0A+{=0A+=09char=20buf[256];=0A+=0A+=09/*=0A+=09=20*=20= Emit=20nice-looking=20summary=20message=0A+=09=20*/=0A+=09if=20= (fail_count=20=3D=3D=200=20&&=20fail_ignore_count=20=3D=3D=200)=0A+=09=09= snprintf(buf,=20sizeof(buf),=0A+=09=09=09=09=20_("All=20%d=20tests=20= passed.=20"),=0A+=09=09=09=09=20success_count);=0A+=09else=20if=20= (fail_count=20=3D=3D=200)=09/*=20fail_count=3D0,=20fail_ignore_count>0=20= */=0A+=09=09snprintf(buf,=20sizeof(buf),=0A+=09=09=09=09=20_("%d=20of=20= %d=20tests=20passed,=20%d=20failed=20test(s)=20ignored.=20"),=0A+=09=09=09= =09=20success_count,=0A+=09=09=09=09=20success_count=20+=20= fail_ignore_count,=0A+=09=09=09=09=20fail_ignore_count);=0A+=09else=20if=20= (fail_ignore_count=20=3D=3D=200)=09/*=20fail_count>0=20&&=20= fail_ignore_count=3D0=20*/=0A+=09=09snprintf(buf,=20sizeof(buf),=0A+=09=09= =09=09=20_("%d=20of=20%d=20tests=20failed.=20"),=0A+=09=09=09=09=20= fail_count,=0A+=09=09=09=09=20success_count=20+=20fail_count);=0A+=09= else=0A+=09=09/*=20fail_count>0=20&&=20fail_ignore_count>0=20*/=0A+=09=09= snprintf(buf,=20sizeof(buf),=0A+=09=09=09=09=20_("%d=20of=20%d=20tests=20= failed,=20%d=20of=20these=20failures=20ignored.=20"),=0A+=09=09=09=09=20= fail_count=20+=20fail_ignore_count,=0A+=09=09=09=09=20success_count=20+=20= fail_count=20+=20fail_ignore_count,=0A+=09=09=09=09=20= fail_ignore_count);=0A+=0A+=09if=20(verbose)=0A+=09{=0A+=09=09= putchar('\n');=0A+=09=09for=20(int=20i=20=3D=20strlen(buf);=20i=20>=200;=20= i--)=0A+=09=09=09putchar('=3D');=0A+=09=09printf("\n=20%s\n",=20buf);=0A= +=09=09for=20(int=20i=20=3D=20strlen(buf);=20i=20>=200;=20i--)=0A+=09=09=09= putchar('=3D');=0A+=09=09putchar('\n');=0A+=09=09putchar('\n');=0A+=0A+=09= =09if=20(difffilename=20&&=20logfilename)=0A+=09=09{=0A+=09=09=09= printf(_("The=20differences=20that=20caused=20some=20tests=20to=20fail=20= can=20be=20viewed=20in=20the\n"=0A+=09=09=09=09=09=20"file=20\"%s\".=20=20= A=20copy=20of=20the=20test=20summary=20that=20you=20see\n"=0A+=09=09=09=09= =09=20"above=20is=20saved=20in=20the=20file=20\"%s\".\n\n"),=0A+=09=09=09= =09=20=20=20difffilename,=20logfilename);=0A+=09=09}=0A+=09}=0A+=09else=0A= +=09{=0A+=09=09printf("\n%s\n",=20buf);=0A+=09=09if=20(difffilename=20&&=20= logfilename)=0A+=09=09=09printf(_("Failing=20diffs:=20\"%s\"\nTest=20= summary:=20\"%s\"\n"),=0A+=09=09=09=09=09difffilename,=20logfilename);=0A= +=09}=0A+}=0A+=0A+static=20void=0A+footer_tap(const=20char=20= *difffilename,=20const=20char=20*logfilename)=0A+{=0A+=09= status("1..%i\n",=20(fail_count=20+=20fail_ignore_count=20+=20= success_count));=0A+=09status_end();=0A+}=0A+=0A+static=20void=0A= +footer(const=20char=20*difffilename,=20const=20char=20*logfilename)=0A= +{=0A+=09if=20(!output->footer)=0A+=09=09return;=0A+=0A+=09= output->footer(difffilename,=20logfilename);=0A+}=0A+=0A+static=20void=0A= +comment_text(CommentLevel=20level,=20const=20char=20*comment)=0A+{=0A+=09= if=20(level=20=3D=3D=20COMMENT_VERBOSE=20&&=20!verbose)=0A+=09=09return;=0A= +=0A+=09if=20(level=20=3D=3D=20COMMENT_ERROR)=0A+=09=09= pg_log_error("%s",=20comment);=0A+=09else=0A+=09=09status("%s",=20= comment);=0A+}=0A+=0A+static=20void=0A+comment_tap(CommentLevel=20level,=20= const=20char=20*comment)=0A+{=0A+=09/*=20The=20TAP=20format=20doesn't=20= have=20verbose=20output=20*/=0A+=09if=20(level=20=3D=3D=20= COMMENT_VERBOSE)=0A+=09=09return;=0A+=0A+=09/*=0A+=09=20*=20Diagnostic=20= comments=20are=20defined=20to=20start=20on=20a=20new=20line.=20Errors=20= are=0A+=09=20*=20treated=20as=20diagnostics=20for=20the=20current=20test=20= as=20there=20isn't=20a=20generic=0A+=09=20*=20error=20output=20defined=20= in=20the=20TAP=20specification.=0A+=09=20*/=0A+=09if=20(level=20=3D=3D=20= COMMENT_DIAGNOSTIC=20||=20level=20=3D=3D=20COMMENT_ERROR)=0A+=09=09= status("\n");=0A+=0A+=09status("#=20%s",=20comment);=0A+}=0A+=0A+static=20= void=0A+comment(CommentLevel=20level,=20const=20char=20*fmt,...)=0A+{=0A= +=09char=09=09tmp[256];=0A+=09va_list=09=09ap;=0A+=0A+=09if=20= (!output->comment)=0A+=09=09return;=0A+=0A+=09va_start(ap,=20fmt);=0A+=09= vsnprintf(tmp,=20sizeof(tmp),=20fmt,=20ap);=0A+=09va_end(ap);=0A+=0A+=09= output->comment(level,=20tmp);=0A+}=0A+=0A+/*=0A+=20*=20Bailing=20out=20= is=20for=20unrecoverable=20errors=20which=20prevents=20further=20testing=20= to=0A+=20*=20occur=20and=20after=20which=20the=20test=20run=20should=20= be=20aborted.=0A+=20*/=0A+static=20void=0A+bail(const=20char=20*fmt,...)=0A= +{=0A+=09char=09=09tmp[256];=0A+=09va_list=09=09ap;=0A+=0A+=09if=20= (output->bail)=0A+=09{=0A+=09=09va_start(ap,=20fmt);=0A+=09=09= vsnprintf(tmp,=20sizeof(tmp),=20fmt,=20ap);=0A+=09=09va_end(ap);=0A+=0A+=09= =09output->bail(tmp);=0A+=09}=0A+=0A+=09status_end();=0A+=09exit(2);=0A= +}=0A+=0A+static=20void=0A+bail_tap(const=20char=20*message)=0A+{=0A+=09= status("\nBail=20out!=20%s",=20message);=0A+}=0A+=0A+static=20void=0A= +bail_text(const=20char=20*message)=0A+{=0A+=09pg_log_error("%s",=20= message);=0A+}=0A+=0A+static=20void=0A+test_status_preamble_text(const=20= char=20*testname)=0A+{=0A+=09status(_("test=20%-28s=20...=20"),=20= testname);=0A+}=0A+=0A+static=20void=0A+test_status_preamble(const=20= char=20*testname)=0A+{=0A+=09if=20(!output->test_status_preamble)=0A+=09=09= return;=0A+=0A+=09output->test_status_preamble(testname);=0A+}=0A+=0A= +static=20void=0A+test_status_ok_tap(const=20char=20*testname)=0A+{=0A+=09= /*=20There=20is=20no=20NLS=20translation=20here=20as=20"ok"=20is=20a=20= protocol=20message=20*/=0A+=09status("ok=20%i=20-=20%s",=0A+=09=09=20=20=20= (fail_count=20+=20fail_ignore_count=20+=20success_count),=0A+=09=09=20=20= =20testname);=0A+}=0A+=0A+static=20void=0A+test_status_ok_text(const=20= char=20*testname)=0A+{=0A+=09(void)=20testname;=20/*=20unused=20*/=0A+=09= status(_("ok=20=20=20=20"));=09/*=20align=20with=20FAILED=20*/=0A+}=0A+=0A= +static=20void=0A+test_status_ok(const=20char=20*testname)=0A+{=0A+=09= success_count++;=0A+=09if=20(!output->test_status_ok)=0A+=09=09return;=0A= +=0A+=09output->test_status_ok(testname);=0A+}=0A+=0A+static=20void=0A= +test_status_failed_tap(const=20char=20*testname,=20bool=20ignore,=20= char=20*tags)=0A+{=0A+=09/*=20There=20is=20no=20NLS=20translation=20here=20= as=20"(not)=20ok"=20are=20protocol=20messages=20*/=0A+=09if=20(ignore)=0A= +=09{=0A+=09=09status("ok=20%i=20-=20%s=20",=0A+=09=09=09=20=20=20= (fail_count=20+=20fail_ignore_count=20+=20success_count),=0A+=09=09=09=20= =20=20testname);=0A+=09=09comment(COMMENT_TEST_STATUS,=20"SKIP=20= (ignored)");=0A+=09}=0A+=09else=0A+=09=09status("not=20ok=20%i=20-=20= %s",=0A+=09=09=09=20=20=20(fail_count=20+=20fail_ignore_count=20+=20= success_count),=0A+=09=09=09=20=20=20testname);=0A+=0A+=09if=20(tags=20= &&=20strlen(tags)=20>=200)=0A+=09{=0A+=09=09status("\n");=0A+=09=09= comment(COMMENT_DIAGNOSTIC,=20"tags:=20%s",=20tags);=0A+=09}=0A+}=0A+=0A= +=0A+static=20void=0A+test_status_failed_text(const=20char=20*testname,=20= bool=20ignore,=20char=20*tags)=0A+{=0A+=09if=20(tags=20&&=20strlen(tags)=20= >=200)=0A+=09=09status("%s=20",=20tags);=0A+=0A+=09if=20(ignore)=0A+=09=09= status(_("failed=20(ignored)"));=0A+=09else=0A+=09=09= status(_("FAILED"));=0A+}=0A+=0A+static=20void=0A= +test_status_failed(const=20char=20*testname,=20bool=20ignore,=20char=20= *tags)=0A+{=0A+=09if=20(ignore)=0A+=09=09fail_ignore_count++;=0A+=09else=0A= +=09=09fail_count++;=0A+=0A+=09if=20(!output->test_status_failed)=0A+=09=09= return;=0A+=0A+=09output->test_status_failed(testname,=20ignore,=20= tags);=0A+}=0A+=0A+static=20void=0A+test_runtime_text(const=20char=20= *testname,=20double=20runtime)=0A+{=0A+=09(void)testname;=0A+=09= status(_("=20%8.0f=20ms"),=20runtime);=0A+}=0A+=0A+static=20void=0A= +runtime(const=20char=20*testname,=20double=20runtime)=0A+{=0A+=09if=20= (!output->test_runtime)=0A+=09=09return;=0A+=0A+=09= output->test_runtime(testname,=20runtime);=0A=20}=0A=20=0A=20/*=0A@@=20= -230,6=20+594,7=20@@=20status(const=20char=20*fmt,...)=0A=20{=0A=20=09= va_list=09=09ap;=0A=20=0A+=09has_status=20=3D=20true;=0A=20=09= va_start(ap,=20fmt);=0A=20=09vfprintf(stdout,=20fmt,=20ap);=0A=20=09= fflush(stdout);=0A@@=20-249,6=20+614,10=20@@=20status(const=20char=20= *fmt,...)=0A=20static=20void=0A=20status_end(void)=0A=20{=0A+=09if=20= (!has_status)=0A+=09=09return;=0A+=0A+=09has_status=20=3D=20false;=0A=20=09= fprintf(stdout,=20"\n");=0A=20=09fflush(stdout);=0A=20=09if=20(logfile)=0A= @@=20-279,8=20+648,7=20@@=20stop_postmaster(void)=0A=20=09=09r=20=3D=20= system(buf);=0A=20=09=09if=20(r=20!=3D=200)=0A=20=09=09{=0A-=09=09=09= fprintf(stderr,=20_("\n%s:=20could=20not=20stop=20postmaster:=20exit=20= code=20was=20%d\n"),=0A-=09=09=09=09=09progname,=20r);=0A+=09=09=09= pg_log_error("could=20not=20stop=20postmaster:=20exit=20code=20was=20= %d",=20r);=0A=20=09=09=09_exit(2);=09=09=09/*=20not=20exit(),=20that=20= could=20be=20recursive=20*/=0A=20=09=09}=0A=20=0A@@=20-340,9=20+708,8=20= @@=20make_temp_sockdir(void)=0A=20=09temp_sockdir=20=3D=20= mkdtemp(template);=0A=20=09if=20(temp_sockdir=20=3D=3D=20NULL)=0A=20=09{=0A= -=09=09fprintf(stderr,=20_("%s:=20could=20not=20create=20directory=20= \"%s\":=20%s\n"),=0A-=09=09=09=09progname,=20template,=20= strerror(errno));=0A-=09=09exit(2);=0A+=09=09bail(_("could=20not=20= create=20directory=20\"%s\":=20%s"),=0A+=09=09=09=20template,=20= strerror(errno));=0A=20=09}=0A=20=0A=20=09/*=20Stage=20file=20names=20= for=20remove_temp().=20=20Unsafe=20in=20a=20signal=20handler.=20*/=0A@@=20= -465,9=20+832,8=20@@=20load_resultmap(void)=0A=20=09=09/*=20OK=20if=20it=20= doesn't=20exist,=20else=20complain=20*/=0A=20=09=09if=20(errno=20=3D=3D=20= ENOENT)=0A=20=09=09=09return;=0A-=09=09fprintf(stderr,=20_("%s:=20could=20= not=20open=20file=20\"%s\"=20for=20reading:=20%s\n"),=0A-=09=09=09=09= progname,=20buf,=20strerror(errno));=0A-=09=09exit(2);=0A+=09=09= bail(_("could=20not=20open=20file=20\"%s\"=20for=20reading:=20%s"),=0A+=09= =09=09=20buf,=20strerror(errno));=0A=20=09}=0A=20=0A=20=09while=20= (fgets(buf,=20sizeof(buf),=20f))=0A@@=20-486,26=20+852,20=20@@=20= load_resultmap(void)=0A=20=09=09file_type=20=3D=20strchr(buf,=20':');=0A=20= =09=09if=20(!file_type)=0A=20=09=09{=0A-=09=09=09fprintf(stderr,=20= _("incorrectly=20formatted=20resultmap=20entry:=20%s\n"),=0A-=09=09=09=09= =09buf);=0A-=09=09=09exit(2);=0A+=09=09=09bail(_("incorrectly=20= formatted=20resultmap=20entry:=20%s"),=20buf);=0A=20=09=09}=0A=20=09=09= *file_type++=20=3D=20'\0';=0A=20=0A=20=09=09platform=20=3D=20= strchr(file_type,=20':');=0A=20=09=09if=20(!platform)=0A=20=09=09{=0A-=09= =09=09fprintf(stderr,=20_("incorrectly=20formatted=20resultmap=20entry:=20= %s\n"),=0A-=09=09=09=09=09buf);=0A-=09=09=09exit(2);=0A+=09=09=09= bail(_("incorrectly=20formatted=20resultmap=20entry:=20%s"),=20buf);=0A=20= =09=09}=0A=20=09=09*platform++=20=3D=20'\0';=0A=20=09=09expected=20=3D=20= strchr(platform,=20'=3D');=0A=20=09=09if=20(!expected)=0A=20=09=09{=0A-=09= =09=09fprintf(stderr,=20_("incorrectly=20formatted=20resultmap=20entry:=20= %s\n"),=0A-=09=09=09=09=09buf);=0A-=09=09=09exit(2);=0A+=09=09=09= bail(_("incorrectly=20formatted=20resultmap=20entry:=20%s"),=20buf);=0A=20= =09=09}=0A=20=09=09*expected++=20=3D=20'\0';=0A=20=0A@@=20-758,13=20= +1118,13=20@@=20initialize_environment(void)=0A=20=09=09}=0A=20=0A=20=09=09= if=20(pghost=20&&=20pgport)=0A-=09=09=09printf(_("(using=20postmaster=20= on=20%s,=20port=20%s)\n"),=20pghost,=20pgport);=0A+=09=09=09= comment(COMMENT_VERBOSE,=20_("(using=20postmaster=20on=20%s,=20port=20= %s)\n"),=20pghost,=20pgport);=0A=20=09=09if=20(pghost=20&&=20!pgport)=0A= -=09=09=09printf(_("(using=20postmaster=20on=20%s,=20default=20= port)\n"),=20pghost);=0A+=09=09=09comment(COMMENT_VERBOSE,=20_("(using=20= postmaster=20on=20%s,=20default=20port)\n"),=20pghost);=0A=20=09=09if=20= (!pghost=20&&=20pgport)=0A-=09=09=09printf(_("(using=20postmaster=20on=20= Unix=20socket,=20port=20%s)\n"),=20pgport);=0A+=09=09=09= comment(COMMENT_VERBOSE,=20_("(using=20postmaster=20on=20Unix=20socket,=20= port=20%s)\n"),=20pgport);=0A=20=09=09if=20(!pghost=20&&=20!pgport)=0A-=09= =09=09printf(_("(using=20postmaster=20on=20Unix=20socket,=20default=20= port)\n"));=0A+=09=09=09comment(COMMENT_VERBOSE,=20_("(using=20= postmaster=20on=20Unix=20socket,=20default=20port)\n"));=0A=20=09}=0A=20=0A= =20=09load_resultmap();=0A@@=20-813,34=20+1173,30=20@@=20= current_windows_user(const=20char=20**acct,=20const=20char=20**dom)=0A=20= =0A=20=09if=20(!OpenProcessToken(GetCurrentProcess(),=20TOKEN_READ,=20= &token))=0A=20=09{=0A-=09=09fprintf(stderr,=0A-=09=09=09=09_("%s:=20= could=20not=20open=20process=20token:=20error=20code=20%lu\n"),=0A-=09=09= =09=09progname,=20GetLastError());=0A+=09=09pg_log_error("could=20not=20= open=20process=20token:=20error=20code=20%lu",=0A+=09=09=09=09=09=20= GetLastError());=0A=20=09=09exit(2);=0A=20=09}=0A=20=0A=20=09if=20= (!GetTokenInformation(token,=20TokenUser,=20NULL,=200,=20&retlen)=20&&=20= GetLastError()=20!=3D=20122)=0A=20=09{=0A-=09=09fprintf(stderr,=0A-=09=09= =09=09_("%s:=20could=20not=20get=20token=20information=20buffer=20size:=20= error=20code=20%lu\n"),=0A-=09=09=09=09progname,=20GetLastError());=0A+=09= =09pg_log_error("could=20not=20get=20token=20information=20buffer=20= size:=20error=20code=20%lu",=0A+=09=09=09=09=09=20GetLastError());=0A=20=09= =09exit(2);=0A=20=09}=0A=20=09tokenuser=20=3D=20pg_malloc(retlen);=0A=20=09= if=20(!GetTokenInformation(token,=20TokenUser,=20tokenuser,=20retlen,=20= &retlen))=0A=20=09{=0A-=09=09fprintf(stderr,=0A-=09=09=09=09_("%s:=20= could=20not=20get=20token=20information:=20error=20code=20%lu\n"),=0A-=09= =09=09=09progname,=20GetLastError());=0A+=09=09pg_log_error("could=20not=20= get=20token=20information:=20error=20code=20%lu",=0A+=09=09=09=09=09=20= GetLastError());=0A=20=09=09exit(2);=0A=20=09}=0A=20=0A=20=09if=20= (!LookupAccountSid(NULL,=20tokenuser->User.Sid,=20accountname,=20= &accountnamesize,=0A=20=09=09=09=09=09=09=20=20domainname,=20= &domainnamesize,=20&accountnameuse))=0A=20=09{=0A-=09=09fprintf(stderr,=0A= -=09=09=09=09_("%s:=20could=20not=20look=20up=20account=20SID:=20error=20= code=20%lu\n"),=0A-=09=09=09=09progname,=20GetLastError());=0A+=09=09= pg_log_error("could=20not=20look=20up=20account=20SID:=20error=20code=20= %lu",=0A+=09=09=09=09=09=20GetLastError());=0A=20=09=09exit(2);=0A=20=09= }=0A=20=0A@@=20-990,9=20+1346,10=20@@=20psql_start_command(void)=0A=20=09= StringInfo=09buf=20=3D=20makeStringInfo();=0A=20=0A=20=09= appendStringInfo(buf,=0A-=09=09=09=09=09=20"\"%s%spsql\"=20-X",=0A+=09=09= =09=09=09=20"\"%s%spsql\"=20-X=20%s",=0A=20=09=09=09=09=09=20bindir=20?=20= bindir=20:=20"",=0A-=09=09=09=09=09=20bindir=20?=20"/"=20:=20"");=0A+=09=09= =09=09=09=20bindir=20?=20"/"=20:=20"",=0A+=09=09=09=09=09=20= psql_formatting=20?=20psql_formatting=20:=20"");=0A=20=09return=20buf;=0A= =20}=0A=20=0A@@=20-1045,8=20+1402,7=20@@=20psql_end_command(StringInfo=20= buf,=20const=20char=20*database)=0A=20=09if=20(system(buf->data)=20!=3D=20= 0)=0A=20=09{=0A=20=09=09/*=20psql=20probably=20already=20reported=20the=20= error=20*/=0A-=09=09fprintf(stderr,=20_("command=20failed:=20%s\n"),=20= buf->data);=0A-=09=09exit(2);=0A+=09=09bail(_("command=20failed:=20%s"),=20= buf->data);=0A=20=09}=0A=20=0A=20=09/*=20Clean=20up=20*/=0A@@=20-1091,9=20= +1447,7=20@@=20spawn_process(const=20char=20*cmdline)=0A=20=09pid=20=3D=20= fork();=0A=20=09if=20(pid=20=3D=3D=20-1)=0A=20=09{=0A-=09=09= fprintf(stderr,=20_("%s:=20could=20not=20fork:=20%s\n"),=0A-=09=09=09=09= progname,=20strerror(errno));=0A-=09=09exit(2);=0A+=09=09bail(_("could=20= not=20fork:=20%s"),=20strerror(errno));=0A=20=09}=0A=20=09if=20(pid=20=3D=3D= =200)=0A=20=09{=0A@@=20-1108,8=20+1462,7=20@@=20spawn_process(const=20= char=20*cmdline)=0A=20=0A=20=09=09cmdline2=20=3D=20psprintf("exec=20%s",=20= cmdline);=0A=20=09=09execl(shellprog,=20shellprog,=20"-c",=20cmdline2,=20= (char=20*)=20NULL);=0A-=09=09fprintf(stderr,=20_("%s:=20could=20not=20= exec=20\"%s\":=20%s\n"),=0A-=09=09=09=09progname,=20shellprog,=20= strerror(errno));=0A+=09=09pg_log_error("could=20not=20exec=20\"%s\":=20= %s",=20shellprog,=20strerror(errno));=0A=20=09=09_exit(1);=09=09=09=09/*=20= not=20exit()=20here...=20*/=0A=20=09}=0A=20=09/*=20in=20parent=20*/=0A@@=20= -1148,8=20+1501,8=20@@=20file_size(const=20char=20*file)=0A=20=0A=20=09= if=20(!f)=0A=20=09{=0A-=09=09fprintf(stderr,=20_("%s:=20could=20not=20= open=20file=20\"%s\"=20for=20reading:=20%s\n"),=0A-=09=09=09=09progname,=20= file,=20strerror(errno));=0A+=09=09comment(COMMENT_ERROR,=20_("could=20= not=20open=20file=20\"%s\"=20for=20reading:=20%s"),=0A+=09=09=09=09file,=20= strerror(errno));=0A=20=09=09return=20-1;=0A=20=09}=0A=20=09fseek(f,=20= 0,=20SEEK_END);=0A@@=20-1170,8=20+1523,8=20@@=20file_line_count(const=20= char=20*file)=0A=20=0A=20=09if=20(!f)=0A=20=09{=0A-=09=09fprintf(stderr,=20= _("%s:=20could=20not=20open=20file=20\"%s\"=20for=20reading:=20%s\n"),=0A= -=09=09=09=09progname,=20file,=20strerror(errno));=0A+=09=09= comment(COMMENT_ERROR,=20_("could=20not=20open=20file=20\"%s\"=20for=20= reading:=20%s"),=0A+=09=09=09=09file,=20strerror(errno));=0A=20=09=09= return=20-1;=0A=20=09}=0A=20=09while=20((c=20=3D=20fgetc(f))=20!=3D=20= EOF)=0A@@=20-1212,9=20+1565,8=20@@=20make_directory(const=20char=20*dir)=0A= =20{=0A=20=09if=20(mkdir(dir,=20S_IRWXU=20|=20S_IRWXG=20|=20S_IRWXO)=20<=20= 0)=0A=20=09{=0A-=09=09fprintf(stderr,=20_("%s:=20could=20not=20create=20= directory=20\"%s\":=20%s\n"),=0A-=09=09=09=09progname,=20dir,=20= strerror(errno));=0A-=09=09exit(2);=0A+=09=09bail(_("could=20not=20= create=20directory=20\"%s\":=20%s"),=0A+=09=09=09=20dir,=20= strerror(errno));=0A=20=09}=0A=20}=0A=20=0A@@=20-1263,8=20+1615,7=20@@=20= run_diff(const=20char=20*cmd,=20const=20char=20*filename)=0A=20=09r=20=3D=20= system(cmd);=0A=20=09if=20(!WIFEXITED(r)=20||=20WEXITSTATUS(r)=20>=201)=0A= =20=09{=0A-=09=09fprintf(stderr,=20_("diff=20command=20failed=20with=20= status=20%d:=20%s\n"),=20r,=20cmd);=0A-=09=09exit(2);=0A+=09=09= bail(_("diff=20command=20failed=20with=20status=20%d:=20%s"),=20r,=20= cmd);=0A=20=09}=0A=20#ifdef=20WIN32=0A=20=0A@@=20-1274,8=20+1625,7=20@@=20= run_diff(const=20char=20*cmd,=20const=20char=20*filename)=0A=20=09=20*/=0A= =20=09if=20(WEXITSTATUS(r)=20=3D=3D=201=20&&=20file_size(filename)=20<=3D=20= 0)=0A=20=09{=0A-=09=09fprintf(stderr,=20_("diff=20command=20not=20found:=20= %s\n"),=20cmd);=0A-=09=09exit(2);=0A+=09=09bail(_("diff=20command=20not=20= found:=20%s"),=20cmd);=0A=20=09}=0A=20#endif=0A=20=0A@@=20-1346,9=20= +1696,8=20@@=20results_differ(const=20char=20*testname,=20const=20char=20= *resultsfile,=20const=20char=20*defaul=0A=20=09=09alt_expectfile=20=3D=20= get_alternative_expectfile(expectfile,=20i);=0A=20=09=09if=20= (!alt_expectfile)=0A=20=09=09{=0A-=09=09=09fprintf(stderr,=20_("Unable=20= to=20check=20secondary=20comparison=20files:=20%s\n"),=0A-=09=09=09=09=09= strerror(errno));=0A-=09=09=09exit(2);=0A+=09=09=09bail(_("Unable=20to=20= check=20secondary=20comparison=20files:=20%s"),=0A+=09=09=09=09=20= strerror(errno));=0A=20=09=09}=0A=20=0A=20=09=09if=20= (!file_exists(alt_expectfile))=0A@@=20-1463,9=20+1812,8=20@@=20= wait_for_tests(PID_TYPE=20*=20pids,=20int=20*statuses,=20instr_time=20= *stoptimes,=0A=20=0A=20=09=09if=20(p=20=3D=3D=20INVALID_PID)=0A=20=09=09= {=0A-=09=09=09fprintf(stderr,=20_("failed=20to=20wait=20for=20= subprocesses:=20%s\n"),=0A-=09=09=09=09=09strerror(errno));=0A-=09=09=09= exit(2);=0A+=09=09=09bail(_("failed=20to=20wait=20for=20subprocesses:=20= %s"),=0A+=09=09=09=09=20strerror(errno));=0A=20=09=09}=0A=20#else=0A=20=09= =09DWORD=09=09exit_status;=0A@@=20-1474,9=20+1822,8=20@@=20= wait_for_tests(PID_TYPE=20*=20pids,=20int=20*statuses,=20instr_time=20= *stoptimes,=0A=20=09=09r=20=3D=20WaitForMultipleObjects(tests_left,=20= active_pids,=20FALSE,=20INFINITE);=0A=20=09=09if=20(r=20<=20= WAIT_OBJECT_0=20||=20r=20>=3D=20WAIT_OBJECT_0=20+=20tests_left)=0A=20=09=09= {=0A-=09=09=09fprintf(stderr,=20_("failed=20to=20wait=20for=20= subprocesses:=20error=20code=20%lu\n"),=0A-=09=09=09=09=09= GetLastError());=0A-=09=09=09exit(2);=0A+=09=09=09bail(_("failed=20to=20= wait=20for=20subprocesses:=20error=20code=20%lu"),=0A+=09=09=09=09=20= GetLastError());=0A=20=09=09}=0A=20=09=09p=20=3D=20active_pids[r=20-=20= WAIT_OBJECT_0];=0A=20=09=09/*=20compact=20the=20active_pids=20array=20*/=0A= @@=20-1495,7=20+1842,7=20@@=20wait_for_tests(PID_TYPE=20*=20pids,=20int=20= *statuses,=20instr_time=20*stoptimes,=0A=20=09=09=09=09statuses[i]=20=3D=20= (int)=20exit_status;=0A=20=09=09=09=09= INSTR_TIME_SET_CURRENT(stoptimes[i]);=0A=20=09=09=09=09if=20(names)=0A-=09= =09=09=09=09status("=20%s",=20names[i]);=0A+=09=09=09=09=09= comment(COMMENT_VERBOSE,=20"=20%s",=20names[i]);=0A=20=09=09=09=09= tests_left--;=0A=20=09=09=09=09break;=0A=20=09=09=09}=0A@@=20-1514,20=20= +1861,20=20@@=20static=20void=0A=20log_child_failure(int=20exitstatus)=0A= =20{=0A=20=09if=20(WIFEXITED(exitstatus))=0A-=09=09status(_("=20(test=20= process=20exited=20with=20exit=20code=20%d)"),=0A+=09=09= comment(COMMENT_DIAGNOSTIC,=20_("=20(test=20process=20exited=20with=20= exit=20code=20%d)"),=0A=20=09=09=09=20=20=20WEXITSTATUS(exitstatus));=0A=20= =09else=20if=20(WIFSIGNALED(exitstatus))=0A=20=09{=0A=20#if=20= defined(WIN32)=0A-=09=09status(_("=20(test=20process=20was=20terminated=20= by=20exception=200x%X)"),=0A+=09=09comment(COMMENT_DIAGNOSTIC,=20_("=20= (test=20process=20was=20terminated=20by=20exception=200x%X)"),=0A=20=09=09= =09=20=20=20WTERMSIG(exitstatus));=0A=20#else=0A-=09=09status(_("=20= (test=20process=20was=20terminated=20by=20signal=20%d:=20%s)"),=0A+=09=09= comment(COMMENT_DIAGNOSTIC,=20_("=20(test=20process=20was=20terminated=20= by=20signal=20%d:=20%s)"),=0A=20=09=09=09=20=20=20WTERMSIG(exitstatus),=20= pg_strsignal(WTERMSIG(exitstatus)));=0A=20#endif=0A=20=09}=0A=20=09else=0A= -=09=09status(_("=20(test=20process=20exited=20with=20unrecognized=20= status=20%d)"),=0A+=09=09comment(COMMENT_DIAGNOSTIC,=20_("=20(test=20= process=20exited=20with=20unrecognized=20status=20%d)"),=0A=20=09=09=09=20= =20=20exitstatus);=0A=20}=0A=20=0A@@=20-1551,18=20+1898,20=20@@=20= run_schedule(const=20char=20*schedule,=20test_start_function=20= startfunc,=0A=20=09char=09=09scbuf[1024];=0A=20=09FILE=09=20=20=20*scf;=0A= =20=09int=09=09=09line_num=20=3D=200;=0A+=09StringInfoData=20tagbuf;=0A=20= =0A=20=09memset(tests,=200,=20sizeof(tests));=0A=20=09= memset(resultfiles,=200,=20sizeof(resultfiles));=0A=20=09= memset(expectfiles,=200,=20sizeof(expectfiles));=0A=20=09memset(tags,=20= 0,=20sizeof(tags));=0A=20=0A+=09initStringInfo(&tagbuf);=0A+=0A=20=09scf=20= =3D=20fopen(schedule,=20"r");=0A=20=09if=20(!scf)=0A=20=09{=0A-=09=09= fprintf(stderr,=20_("%s:=20could=20not=20open=20file=20\"%s\"=20for=20= reading:=20%s\n"),=0A-=09=09=09=09progname,=20schedule,=20= strerror(errno));=0A-=09=09exit(2);=0A+=09=09bail(_("could=20not=20open=20= file=20\"%s\"=20for=20reading:=20%s"),=0A+=09=09=09=20schedule,=20= strerror(errno));=0A=20=09}=0A=20=0A=20=09while=20(fgets(scbuf,=20= sizeof(scbuf),=20scf))=0A@@=20-1600,9=20+1949,8=20@@=20= run_schedule(const=20char=20*schedule,=20test_start_function=20= startfunc,=0A=20=09=09}=0A=20=09=09else=0A=20=09=09{=0A-=09=09=09= fprintf(stderr,=20_("syntax=20error=20in=20schedule=20file=20\"%s\"=20= line=20%d:=20%s\n"),=0A-=09=09=09=09=09schedule,=20line_num,=20scbuf);=0A= -=09=09=09exit(2);=0A+=09=09=09bail(_("syntax=20error=20in=20schedule=20= file=20\"%s\"=20line=20%d:=20%s\n"),=0A+=09=09=09=09=20schedule,=20= line_num,=20scbuf);=0A=20=09=09}=0A=20=0A=20=09=09num_tests=20=3D=200;=0A= @@=20-1618,9=20+1966,8=20@@=20run_schedule(const=20char=20*schedule,=20= test_start_function=20startfunc,=0A=20=0A=20=09=09=09=09=09if=20= (num_tests=20>=3D=20MAX_PARALLEL_TESTS)=0A=20=09=09=09=09=09{=0A-=09=09=09= =09=09=09fprintf(stderr,=20_("too=20many=20parallel=20tests=20(more=20= than=20%d)=20in=20schedule=20file=20\"%s\"=20line=20%d:=20%s\n"),=0A-=09=09= =09=09=09=09=09=09MAX_PARALLEL_TESTS,=20schedule,=20line_num,=20scbuf);=0A= -=09=09=09=09=09=09exit(2);=0A+=09=09=09=09=09=09bail(_("too=20many=20= parallel=20tests=20(more=20than=20%d)=20in=20schedule=20file=20\"%s\"=20= line=20%d:=20%s\n"),=0A+=09=09=09=09=09=09=09=20MAX_PARALLEL_TESTS,=20= schedule,=20line_num,=20scbuf);=0A=20=09=09=09=09=09}=0A=20=09=09=09=09=09= sav=20=3D=20*c;=0A=20=09=09=09=09=09*c=20=3D=20'\0';=0A@@=20-1642,14=20= +1989,13=20@@=20run_schedule(const=20char=20*schedule,=20= test_start_function=20startfunc,=0A=20=0A=20=09=09if=20(num_tests=20=3D=3D= =200)=0A=20=09=09{=0A-=09=09=09fprintf(stderr,=20_("syntax=20error=20in=20= schedule=20file=20\"%s\"=20line=20%d:=20%s\n"),=0A-=09=09=09=09=09= schedule,=20line_num,=20scbuf);=0A-=09=09=09exit(2);=0A+=09=09=09= bail(_("syntax=20error=20in=20schedule=20file=20\"%s\"=20line=20%d:=20= %s\n"),=0A+=09=09=09=09=20schedule,=20line_num,=20scbuf);=0A=20=09=09}=0A= =20=0A=20=09=09if=20(num_tests=20=3D=3D=201)=0A=20=09=09{=0A-=09=09=09= status(_("test=20%-28s=20...=20"),=20tests[0]);=0A+=09=09=09= test_status_preamble(tests[0]);=0A=20=09=09=09pids[0]=20=3D=20= (startfunc)=20(tests[0],=20&resultfiles[0],=20&expectfiles[0],=20= &tags[0]);=0A=20=09=09=09INSTR_TIME_SET_CURRENT(starttimes[0]);=0A=20=09=09= =09wait_for_tests(pids,=20statuses,=20stoptimes,=20NULL,=201);=0A@@=20= -1657,16=20+2003,15=20@@=20run_schedule(const=20char=20*schedule,=20= test_start_function=20startfunc,=0A=20=09=09}=0A=20=09=09else=20if=20= (max_concurrent_tests=20>=200=20&&=20max_concurrent_tests=20<=20= num_tests)=0A=20=09=09{=0A-=09=09=09fprintf(stderr,=20_("too=20many=20= parallel=20tests=20(more=20than=20%d)=20in=20schedule=20file=20\"%s\"=20= line=20%d:=20%s\n"),=0A-=09=09=09=09=09max_concurrent_tests,=20schedule,=20= line_num,=20scbuf);=0A-=09=09=09exit(2);=0A+=09=09=09bail(_("too=20many=20= parallel=20tests=20(more=20than=20%d)=20in=20schedule=20file=20\"%s\"=20= line=20%d:=20%s\n"),=0A+=09=09=09=09=20max_concurrent_tests,=20schedule,=20= line_num,=20scbuf);=0A=20=09=09}=0A=20=09=09else=20if=20(max_connections=20= >=200=20&&=20max_connections=20<=20num_tests)=0A=20=09=09{=0A=20=09=09=09= int=09=09=09oldest=20=3D=200;=0A=20=0A-=09=09=09status(_("parallel=20= group=20(%d=20tests,=20in=20groups=20of=20%d):=20"),=0A-=09=09=09=09=20=20= =20num_tests,=20max_connections);=0A+=09=09=09comment(COMMENT_VERBOSE,=20= _("parallel=20group=20(%d=20tests,=20in=20groups=20of=20%d):=20"),=0A+=09= =09=09=09=09=20=20num_tests,=20max_connections);=0A=20=09=09=09for=20(i=20= =3D=200;=20i=20<=20num_tests;=20i++)=0A=20=09=09=09{=0A=20=09=09=09=09if=20= (i=20-=20oldest=20>=3D=20max_connections)=0A@@=20-1686,7=20+2031,7=20@@=20= run_schedule(const=20char=20*schedule,=20test_start_function=20= startfunc,=0A=20=09=09}=0A=20=09=09else=0A=20=09=09{=0A-=09=09=09= status(_("parallel=20group=20(%d=20tests):=20"),=20num_tests);=0A+=09=09=09= comment(COMMENT_VERBOSE,=20_("parallel=20group=20(%d=20tests):=20"),=20= num_tests);=0A=20=09=09=09for=20(i=20=3D=200;=20i=20<=20num_tests;=20= i++)=0A=20=09=09=09{=0A=20=09=09=09=09pids[i]=20=3D=20(startfunc)=20= (tests[i],=20&resultfiles[i],=20&expectfiles[i],=20&tags[i]);=0A@@=20= -1704,8=20+2049,10=20@@=20run_schedule(const=20char=20*schedule,=20= test_start_function=20startfunc,=0A=20=09=09=09=09=09=20=20=20*tl;=0A=20=09= =09=09bool=09=09differ=20=3D=20false;=0A=20=0A+=09=09=09= resetStringInfo(&tagbuf);=0A+=0A=20=09=09=09if=20(num_tests=20>=201)=0A-=09= =09=09=09status(_("=20=20=20=20=20%-28s=20...=20"),=20tests[i]);=0A+=09=09= =09=09test_status_preamble(tests[i]);=0A=20=0A=20=09=09=09/*=0A=20=09=09=09= =20*=20Advance=20over=20all=20three=20lists=20simultaneously.=0A@@=20= -1726,7=20+2073,7=20@@=20run_schedule(const=20char=20*schedule,=20= test_start_function=20startfunc,=0A=20=09=09=09=09newdiff=20=3D=20= results_differ(tests[i],=20rl->str,=20el->str);=0A=20=09=09=09=09if=20= (newdiff=20&&=20tl)=0A=20=09=09=09=09{=0A-=09=09=09=09=09printf("%s=20",=20= tl->str);=0A+=09=09=09=09=09appendStringInfo(&tagbuf,=20"%s=20",=20= tl->str);=0A=20=09=09=09=09}=0A=20=09=09=09=09differ=20|=3D=20newdiff;=0A= =20=09=09=09}=0A@@=20-1744,28=20+2091,17=20@@=20run_schedule(const=20= char=20*schedule,=20test_start_function=20startfunc,=0A=20=09=09=09=09=09= =09break;=0A=20=09=09=09=09=09}=0A=20=09=09=09=09}=0A-=09=09=09=09if=20= (ignore)=0A-=09=09=09=09{=0A-=09=09=09=09=09status(_("failed=20= (ignored)"));=0A-=09=09=09=09=09fail_ignore_count++;=0A-=09=09=09=09}=0A= -=09=09=09=09else=0A-=09=09=09=09{=0A-=09=09=09=09=09= status(_("FAILED"));=0A-=09=09=09=09=09fail_count++;=0A-=09=09=09=09}=0A= +=0A+=09=09=09=09test_status_failed(tests[i],=20ignore,=20tagbuf.data);=0A= =20=09=09=09}=0A=20=09=09=09else=0A-=09=09=09{=0A-=09=09=09=09= status(_("ok=20=20=20=20"));=09/*=20align=20with=20FAILED=20*/=0A-=09=09=09= =09success_count++;=0A-=09=09=09}=0A+=09=09=09=09= test_status_ok(tests[i]);=0A=20=0A=20=09=09=09if=20(statuses[i]=20!=3D=20= 0)=0A=20=09=09=09=09log_child_failure(statuses[i]);=0A=20=0A=20=09=09=09= INSTR_TIME_SUBTRACT(stoptimes[i],=20starttimes[i]);=0A-=09=09=09= status(_("=20%8.0f=20ms"),=20INSTR_TIME_GET_MILLISEC(stoptimes[i]));=0A+=09= =09=09runtime(tests[i],=20INSTR_TIME_GET_MILLISEC(stoptimes[i]));=0A=20=0A= =20=09=09=09status_end();=0A=20=09=09}=0A@@=20-1780,6=20+2116,7=20@@=20= run_schedule(const=20char=20*schedule,=20test_start_function=20= startfunc,=0A=20=09=09}=0A=20=09}=0A=20=0A+=09pg_free(tagbuf.data);=0A=20= =09free_stringlist(&ignorelist);=0A=20=0A=20=09fclose(scf);=0A@@=20= -1803,11=20+2140,13=20@@=20run_single_test(const=20char=20*test,=20= test_start_function=20startfunc,=0A=20=09=09=09=20=20=20*el,=0A=20=09=09=09= =20=20=20*tl;=0A=20=09bool=09=09differ=20=3D=20false;=0A+=09= StringInfoData=20tagbuf;=0A=20=0A-=09status(_("test=20%-28s=20...=20"),=20= test);=0A+=09test_status_preamble(test);=0A=20=09pid=20=3D=20(startfunc)=20= (test,=20&resultfiles,=20&expectfiles,=20&tags);=0A=20=09= INSTR_TIME_SET_CURRENT(starttime);=0A=20=09wait_for_tests(&pid,=20= &exit_status,=20&stoptime,=20NULL,=201);=0A+=09initStringInfo(&tagbuf);=0A= =20=0A=20=09/*=0A=20=09=20*=20Advance=20over=20all=20three=20lists=20= simultaneously.=0A@@=20-1828,27=20+2167,23=20@@=20run_single_test(const=20= char=20*test,=20test_start_function=20startfunc,=0A=20=09=09newdiff=20=3D=20= results_differ(test,=20rl->str,=20el->str);=0A=20=09=09if=20(newdiff=20= &&=20tl)=0A=20=09=09{=0A-=09=09=09printf("%s=20",=20tl->str);=0A+=09=09=09= appendStringInfo(&tagbuf,=20"%s=20",=20tl->str);=0A=20=09=09}=0A=20=09=09= differ=20|=3D=20newdiff;=0A=20=09}=0A=20=0A=20=09if=20(differ)=0A-=09{=0A= -=09=09status(_("FAILED"));=0A-=09=09fail_count++;=0A-=09}=0A+=09=09= test_status_failed(test,=20false,=20tagbuf.data);=0A=20=09else=0A-=09{=0A= -=09=09status(_("ok=20=20=20=20"));=09/*=20align=20with=20FAILED=20*/=0A= -=09=09success_count++;=0A-=09}=0A+=09=09test_status_ok(test);=0A=20=0A=20= =09if=20(exit_status=20!=3D=200)=0A=20=09=09= log_child_failure(exit_status);=0A=20=0A=20=09= INSTR_TIME_SUBTRACT(stoptime,=20starttime);=0A-=09status(_("=20%8.0f=20= ms"),=20INSTR_TIME_GET_MILLISEC(stoptime));=0A+=09runtime(_("=20%8.0f=20= ms"),=20INSTR_TIME_GET_MILLISEC(stoptime));=0A+=0A+=09= pg_free(tagbuf.data);=0A=20=0A=20=09status_end();=0A=20}=0A@@=20-1872,9=20= +2207,8=20@@=20open_result_files(void)=0A=20=09logfile=20=3D=20= fopen(logfilename,=20"w");=0A=20=09if=20(!logfile)=0A=20=09{=0A-=09=09= fprintf(stderr,=20_("%s:=20could=20not=20open=20file=20\"%s\"=20for=20= writing:=20%s\n"),=0A-=09=09=09=09progname,=20logfilename,=20= strerror(errno));=0A-=09=09exit(2);=0A+=09=09bail(_("%s:=20could=20not=20= open=20file=20\"%s\"=20for=20writing:=20%s"),=0A+=09=09=09=20progname,=20= logfilename,=20strerror(errno));=0A=20=09}=0A=20=0A=20=09/*=20create=20= the=20diffs=20file=20as=20empty=20*/=0A@@=20-1883,9=20+2217,8=20@@=20= open_result_files(void)=0A=20=09difffile=20=3D=20fopen(difffilename,=20= "w");=0A=20=09if=20(!difffile)=0A=20=09{=0A-=09=09fprintf(stderr,=20= _("%s:=20could=20not=20open=20file=20\"%s\"=20for=20writing:=20%s\n"),=0A= -=09=09=09=09progname,=20difffilename,=20strerror(errno));=0A-=09=09= exit(2);=0A+=09=09bail(_("%s:=20could=20not=20open=20file=20\"%s\"=20for=20= writing:=20%s"),=0A+=09=09=09=20progname,=20difffilename,=20= strerror(errno));=0A=20=09}=0A=20=09/*=20we=20don't=20keep=20the=20diffs=20= file=20open=20continuously=20*/=0A=20=09fclose(difffile);=0A@@=20-1989,6=20= +2322,7=20@@=20help(void)=0A=20=09printf(_("=20=20=20=20=20=20--debug=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20turn=20on=20debug=20= mode=20in=20programs=20that=20are=20run\n"));=0A=20=09printf(_("=20=20=20= =20=20=20--dlpath=3DDIR=20=20=20=20=20=20=20=20=20=20=20=20=20=20look=20= for=20dynamic=20libraries=20in=20DIR\n"));=0A=20=09printf(_("=20=20=20=20= =20=20--encoding=3DENCODING=20=20=20=20=20=20=20use=20ENCODING=20as=20= the=20encoding\n"));=0A+=09printf(_("=20=20=20=20=20=20= --format=3D(regress|tap)=20=20=20=20output=20format=20to=20use\n"));=0A=20= =09printf(_("=20=20-h,=20--help=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20show=20this=20help,=20then=20exit\n"));=0A=20=09= printf(_("=20=20=20=20=20=20--inputdir=3DDIR=20=20=20=20=20=20=20=20=20=20= =20=20take=20input=20files=20from=20DIR=20(default=20\".\")\n"));=0A=20=09= printf(_("=20=20=20=20=20=20--launcher=3DCMD=20=20=20=20=20=20=20=20=20=20= =20=20use=20CMD=20as=20launcher=20of=20psql\n"));=0A@@=20-2003,6=20= +2337,7=20@@=20help(void)=0A=20=09printf(_("=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(can=20= be=20used=20multiple=20times=20to=20concatenate)\n"));=0A=20=09= printf(_("=20=20=20=20=20=20--temp-instance=3DDIR=20=20=20=20=20=20=20= create=20a=20temporary=20instance=20in=20DIR\n"));=0A=20=09printf(_("=20=20= =20=20=20=20--use-existing=20=20=20=20=20=20=20=20=20=20=20=20use=20an=20= existing=20installation\n"));=0A+=09printf(_("=20=20-v,=20--verbose=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20verbose=20output,=20only=20= applies=20to=20regress=20output=20format\n"));=0A=20=09printf(_("=20=20= -V,=20--version=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20output=20= version=20information,=20then=20exit\n"));=0A=20=09printf(_("\n"));=0A=20= =09printf(_("Options=20for=20\"temp-instance\"=20mode:\n"));=0A@@=20= -2031,6=20+2366,7=20@@=20regression_main(int=20argc,=20char=20*argv[],=0A= =20=09static=20struct=20option=20long_options[]=20=3D=20{=0A=20=09=09= {"help",=20no_argument,=20NULL,=20'h'},=0A=20=09=09{"version",=20= no_argument,=20NULL,=20'V'},=0A+=09=09{"verbose",=20no_argument,=20NULL,=20= 'v'},=0A=20=09=09{"dbname",=20required_argument,=20NULL,=201},=0A=20=09=09= {"debug",=20no_argument,=20NULL,=202},=0A=20=09=09{"inputdir",=20= required_argument,=20NULL,=203},=0A@@=20-2052,6=20+2388,7=20@@=20= regression_main(int=20argc,=20char=20*argv[],=0A=20=09=09= {"load-extension",=20required_argument,=20NULL,=2022},=0A=20=09=09= {"config-auth",=20required_argument,=20NULL,=2024},=0A=20=09=09= {"max-concurrent-tests",=20required_argument,=20NULL,=2025},=0A+=09=09= {"format",=20required_argument,=20NULL,=2026},=0A=20=09=09{NULL,=200,=20= NULL,=200}=0A=20=09};=0A=20=0A@@=20-2097,7=20+2434,7=20@@=20= regression_main(int=20argc,=20char=20*argv[],=0A=20=09if=20= (getenv("PG_REGRESS_DIFF_OPTS"))=0A=20=09=09pretty_diff_opts=20=3D=20= getenv("PG_REGRESS_DIFF_OPTS");=0A=20=0A-=09while=20((c=20=3D=20= getopt_long(argc,=20argv,=20"hV",=20long_options,=20&option_index))=20!=3D= =20-1)=0A+=09while=20((c=20=3D=20getopt_long(argc,=20argv,=20"hVv",=20= long_options,=20&option_index))=20!=3D=20-1)=0A=20=09{=0A=20=09=09switch=20= (c)=0A=20=09=09{=0A@@=20-2107,6=20+2444,9=20@@=20regression_main(int=20= argc,=20char=20*argv[],=0A=20=09=09=09case=20'V':=0A=20=09=09=09=09= puts("pg_regress=20(PostgreSQL)=20"=20PG_VERSION);=0A=20=09=09=09=09= exit(0);=0A+=09=09=09case=20'v':=0A+=09=09=09=09verbose=20=3D=20true;=0A= +=09=09=09=09break;=0A=20=09=09=09case=201:=0A=20=0A=20=09=09=09=09/*=0A= @@=20-2181,9=20+2521,12=20@@=20regression_main(int=20argc,=20char=20= *argv[],=0A=20=09=09=09case=2025:=0A=20=09=09=09=09max_concurrent_tests=20= =3D=20atoi(optarg);=0A=20=09=09=09=09break;=0A+=09=09=09case=2026:=0A+=09= =09=09=09format=20=3D=20pg_strdup(optarg);=0A+=09=09=09=09break;=0A=20=09= =09=09default:=0A=20=09=09=09=09/*=20getopt_long=20already=20emitted=20a=20= complaint=20*/=0A-=09=09=09=09fprintf(stderr,=20_("\nTry=20\"%s=20-h\"=20= for=20more=20information.\n"),=0A+=09=09=09=09pg_log_error_hint("Try=20= \"%s=20--help\"=20for=20more=20information.",=0A=20=09=09=09=09=09=09= progname);=0A=20=09=09=09=09exit(2);=0A=20=09=09}=0A@@=20-2207,6=20= +2550,29=20@@=20regression_main(int=20argc,=20char=20*argv[],=0A=20=09=09= exit(0);=0A=20=09}=0A=20=0A+=09if=20(!verbose)=0A+=09=09psql_formatting=20= =3D=20pg_strdup("-q");=0A+=0A+=09/*=0A+=09=20*=20text=20(regress)=20is=20= the=20default=20so=20we=20don't=20need=20to=20set=20any=20variables=20in=0A= +=09=20*=20that=20case.=0A+=09=20*/=0A+=09if=20(format)=0A+=09{=0A+=09=09= if=20(strcmp(format,=20"tap")=20=3D=3D=200)=0A+=09=09{=0A+=09=09=09= output=20=3D=20&output_func_tap;=0A+=09=09=09if=20(!psql_formatting)=0A+=09= =09=09=09psql_formatting=20=3D=20pg_strdup("-q");=0A+=09=09}=0A+=09=09= else=20if=20(strcmp(format,=20"regress")=20!=3D=200)=0A+=09=09{=0A+=09=09= =09pg_log_error("%s:=20invalid=20format=20specified:=20\"%s\".=20= Supported=20formats=20are=20\"tap\"=20and=20\"regress\"",=0A+=09=09=09=09= =09=09=20progname,=20format);=0A+=09=09=09exit(2);=0A+=09=09}=0A+=09}=0A= +=0A=20=09if=20(temp_instance=20&&=20!port_specified_by_user)=0A=20=0A=20= =09=09/*=0A@@=20-2248,9=20+2614,8=20@@=20regression_main(int=20argc,=20= char=20*argv[],=0A=20=09=09=09header(_("removing=20existing=20temp=20= instance"));=0A=20=09=09=09if=20(!rmtree(temp_instance,=20true))=0A=20=09= =09=09{=0A-=09=09=09=09fprintf(stderr,=20_("\n%s:=20could=20not=20remove=20= temp=20instance=20\"%s\"\n"),=0A-=09=09=09=09=09=09progname,=20= temp_instance);=0A-=09=09=09=09exit(2);=0A+=09=09=09=09bail(_("%s:=20= could=20not=20remove=20temp=20instance=20\"%s\""),=0A+=09=09=09=09=09=09=09= =20progname,=20temp_instance);=0A=20=09=09=09}=0A=20=09=09}=0A=20=0A@@=20= -2276,8=20+2641,8=20@@=20regression_main(int=20argc,=20char=20*argv[],=0A= =20=09=09=09=09=20outputdir);=0A=20=09=09if=20(system(buf))=0A=20=09=09{=0A= -=09=09=09fprintf(stderr,=20_("\n%s:=20initdb=20failed\nExamine=20= %s/log/initdb.log=20for=20the=20reason.\nCommand=20was:=20%s\n"),=20= progname,=20outputdir,=20buf);=0A-=09=09=09exit(2);=0A+=09=09=09= bail(_("%s:=20initdb=20failed\nExamine=20%s/log/initdb.log=20for=20the=20= reason.\nCommand=20was:=20%s"),=0A+=09=09=09=09=20progname,=20outputdir,=20= buf);=0A=20=09=09}=0A=20=0A=20=09=09/*=0A@@=20-2292,8=20+2657,8=20@@=20= regression_main(int=20argc,=20char=20*argv[],=0A=20=09=09pg_conf=20=3D=20= fopen(buf,=20"a");=0A=20=09=09if=20(pg_conf=20=3D=3D=20NULL)=0A=20=09=09= {=0A-=09=09=09fprintf(stderr,=20_("\n%s:=20could=20not=20open=20\"%s\"=20= for=20adding=20extra=20config:=20%s\n"),=20progname,=20buf,=20= strerror(errno));=0A-=09=09=09exit(2);=0A+=09=09=09bail(=20_("%s:=20= could=20not=20open=20\"%s\"=20for=20adding=20extra=20config:=20%s"),=0A+=09= =09=09=09=20progname,=20buf,=20strerror(errno));=0A=20=09=09}=0A=20=09=09= fputs("\n#=20Configuration=20added=20by=20pg_regress\n\n",=20pg_conf);=0A= =20=09=09fputs("log_autovacuum_min_duration=20=3D=200\n",=20pg_conf);=0A= @@=20-2312,8=20+2677,8=20@@=20regression_main(int=20argc,=20char=20= *argv[],=0A=20=09=09=09extra_conf=20=3D=20fopen(temp_config,=20"r");=0A=20= =09=09=09if=20(extra_conf=20=3D=3D=20NULL)=0A=20=09=09=09{=0A-=09=09=09=09= fprintf(stderr,=20_("\n%s:=20could=20not=20open=20\"%s\"=20to=20read=20= extra=20config:=20%s\n"),=20progname,=20temp_config,=20strerror(errno));=0A= -=09=09=09=09exit(2);=0A+=09=09=09=09bail(_("%s:=20could=20not=20open=20= \"%s\"=20to=20read=20extra=20config:=20%s"),=0A+=09=09=09=09=09=20= progname,=20temp_config,=20strerror(errno));=0A=20=09=09=09}=0A=20=09=09=09= while=20(fgets(line_buf,=20sizeof(line_buf),=20extra_conf)=20!=3D=20= NULL)=0A=20=09=09=09=09fputs(line_buf,=20pg_conf);=0A@@=20-2353,14=20= +2718,16=20@@=20regression_main(int=20argc,=20char=20*argv[],=0A=20=0A=20= =09=09=09=09if=20(port_specified_by_user=20||=20i=20=3D=3D=2015)=0A=20=09= =09=09=09{=0A-=09=09=09=09=09fprintf(stderr,=20_("port=20%d=20apparently=20= in=20use\n"),=20port);=0A+=09=09=09=09=09comment(COMMENT_VERBOSE,=20= _("port=20%d=20apparently=20in=20use\n"),=0A+=09=09=09=09=09=09=09port);=0A= =20=09=09=09=09=09if=20(!port_specified_by_user)=0A-=09=09=09=09=09=09= fprintf(stderr,=20_("%s:=20could=20not=20determine=20an=20available=20= port\n"),=20progname);=0A-=09=09=09=09=09fprintf(stderr,=20_("Specify=20= an=20unused=20port=20using=20the=20--port=20option=20or=20shut=20down=20= any=20conflicting=20PostgreSQL=20servers.\n"));=0A-=09=09=09=09=09= exit(2);=0A+=09=09=09=09=09=09comment(COMMENT_VERBOSE,=0A+=09=09=09=09=09= =09=09=09_("could=20not=20determine=20an=20available=20port\n"));=0A+=09=09= =09=09=09bail(_("Specify=20an=20unused=20port=20using=20the=20--port=20= option=20or=20shut=20down=20any=20conflicting=20PostgreSQL=20= servers."));=0A=20=09=09=09=09}=0A=20=0A-=09=09=09=09fprintf(stderr,=20= _("port=20%d=20apparently=20in=20use,=20trying=20%d\n"),=20port,=20port=20= +=201);=0A+=09=09=09=09comment(COMMENT_VERBOSE,=20_("port=20%d=20= apparently=20in=20use,=20trying=20%d\n"),=0A+=09=09=09=09=09=09port,=20= port=20+=201);=0A=20=09=09=09=09port++;=0A=20=09=09=09=09sprintf(s,=20= "%d",=20port);=0A=20=09=09=09=09setenv("PGPORT",=20s,=201);=0A@@=20= -2384,11=20+2751,7=20@@=20regression_main(int=20argc,=20char=20*argv[],=0A= =20=09=09=09=09=20outputdir);=0A=20=09=09postmaster_pid=20=3D=20= spawn_process(buf);=0A=20=09=09if=20(postmaster_pid=20=3D=3D=20= INVALID_PID)=0A-=09=09{=0A-=09=09=09fprintf(stderr,=20_("\n%s:=20could=20= not=20spawn=20postmaster:=20%s\n"),=0A-=09=09=09=09=09progname,=20= strerror(errno));=0A-=09=09=09exit(2);=0A-=09=09}=0A+=09=09=09= bail(_("could=20not=20spawn=20postmaster:=20%s\n"),=20strerror(errno));=0A= =20=0A=20=09=09/*=0A=20=09=09=20*=20Wait=20till=20postmaster=20is=20able=20= to=20accept=20connections;=20normally=20this=0A@@=20-2422,16=20+2785,16=20= @@=20regression_main(int=20argc,=20char=20*argv[],=0A=20=09=09=09if=20= (WaitForSingleObject(postmaster_pid,=200)=20=3D=3D=20WAIT_OBJECT_0)=0A=20= #endif=0A=20=09=09=09{=0A-=09=09=09=09fprintf(stderr,=20_("\n%s:=20= postmaster=20failed\nExamine=20%s/log/postmaster.log=20for=20the=20= reason\n"),=20progname,=20outputdir);=0A-=09=09=09=09exit(2);=0A+=09=09=09= =09bail(_("postmaster=20failed\nExamine=20%s/log/postmaster.log=20for=20= the=20reason\n"),=0A+=09=09=09=09=09=20outputdir);=0A=20=09=09=09}=0A=20=0A= =20=09=09=09pg_usleep(1000000L);=0A=20=09=09}=0A=20=09=09if=20(i=20>=3D=20= wait_seconds)=0A=20=09=09{=0A-=09=09=09fprintf(stderr,=20_("\n%s:=20= postmaster=20did=20not=20respond=20within=20%d=20seconds\nExamine=20= %s/log/postmaster.log=20for=20the=20reason\n"),=0A-=09=09=09=09=09= progname,=20wait_seconds,=20outputdir);=0A+=09=09=09= comment(COMMENT_VERBOSE,=20_("postmaster=20did=20not=20respond=20within=20= %d=20seconds\nExamine=20%s/log/postmaster.log=20for=20the=20reason\n"),=0A= +=09=09=09=09=09wait_seconds,=20outputdir);=0A=20=0A=20=09=09=09/*=0A=20=09= =09=09=20*=20If=20we=20get=20here,=20the=20postmaster=20is=20probably=20= wedged=20somewhere=20in=0A@@=20-2440,16=20+2803,13=20@@=20= regression_main(int=20argc,=20char=20*argv[],=0A=20=09=09=09=20*=20= attempts.=0A=20=09=09=09=20*/=0A=20#ifndef=20WIN32=0A-=09=09=09if=20= (kill(postmaster_pid,=20SIGKILL)=20!=3D=200=20&&=0A-=09=09=09=09errno=20= !=3D=20ESRCH)=0A-=09=09=09=09fprintf(stderr,=20_("\n%s:=20could=20not=20= kill=20failed=20postmaster:=20%s\n"),=0A-=09=09=09=09=09=09progname,=20= strerror(errno));=0A+=09=09=09if=20(kill(postmaster_pid,=20SIGKILL)=20!=3D= =200=20&&=20errno=20!=3D=20ESRCH)=0A+=09=09=09=09bail(_("could=20not=20= kill=20failed=20postmaster:=20%s"),=20strerror(errno));=0A=20#else=0A=20=09= =09=09if=20(TerminateProcess(postmaster_pid,=20255)=20=3D=3D=200)=0A-=09=09= =09=09fprintf(stderr,=20_("\n%s:=20could=20not=20kill=20failed=20= postmaster:=20error=20code=20%lu\n"),=0A-=09=09=09=09=09=09progname,=20= GetLastError());=0A+=09=09=09=09bail(_("could=20not=20kill=20failed=20= postmaster:=20error=20code=20%lu"),=0A+=09=09=09=09=09=20= GetLastError());=0A=20#endif=0A-=0A=20=09=09=09exit(2);=0A=20=09=09}=0A=20= =0A@@=20-2461,7=20+2821,7=20@@=20regression_main(int=20argc,=20char=20= *argv[],=0A=20#else=0A=20#define=20ULONGPID(x)=20(unsigned=20long)=20(x)=0A= =20#endif=0A-=09=09printf(_("running=20on=20port=20%d=20with=20PID=20= %lu\n"),=0A+=09=09comment(COMMENT_VERBOSE,=20_("running=20on=20port=20%d=20= with=20PID=20%lu\n"),=0A=20=09=09=09=20=20=20port,=20= ULONGPID(postmaster_pid));=0A=20=09}=0A=20=09else=0A@@=20-2514,6=20= +2874,23=20@@=20regression_main(int=20argc,=20char=20*argv[],=0A=20=09=09= stop_postmaster();=0A=20=09}=0A=20=0A+=09fclose(logfile);=0A+=09logfile=20= =3D=20NULL;=0A+=0A+=09if=20(file_size(difffilename)=20<=3D=200)=0A+=09{=0A= +=09=09unlink(difffilename);=0A+=09=09unlink(logfilename);=0A+=0A+=09=09= free(difffilename);=0A+=09=09difffilename=20=3D=20NULL;=0A+=09=09= free(logfilename);=0A+=09=09logfilename=20=3D=20NULL;=0A+=09}=0A+=0A+=09= footer(difffilename,=20logfilename);=0A+=09status_end();=0A+=0A=20=09/*=0A= =20=09=20*=20If=20there=20were=20no=20errors,=20remove=20the=20temp=20= instance=20immediately=20to=0A=20=09=20*=20conserve=20disk=20space.=20=20= (If=20there=20were=20errors,=20we=20leave=20the=20instance=20in=0A@@=20= -2523,58=20+2900,8=20@@=20regression_main(int=20argc,=20char=20*argv[],=0A= =20=09{=0A=20=09=09header(_("removing=20temporary=20instance"));=0A=20=09= =09if=20(!rmtree(temp_instance,=20true))=0A-=09=09=09fprintf(stderr,=20= _("\n%s:=20could=20not=20remove=20temp=20instance=20\"%s\"\n"),=0A-=09=09= =09=09=09progname,=20temp_instance);=0A-=09}=0A-=0A-=09fclose(logfile);=0A= -=0A-=09/*=0A-=09=20*=20Emit=20nice-looking=20summary=20message=0A-=09=20= */=0A-=09if=20(fail_count=20=3D=3D=200=20&&=20fail_ignore_count=20=3D=3D=20= 0)=0A-=09=09snprintf(buf,=20sizeof(buf),=0A-=09=09=09=09=20_("=20All=20= %d=20tests=20passed.=20"),=0A-=09=09=09=09=20success_count);=0A-=09else=20= if=20(fail_count=20=3D=3D=200)=09/*=20fail_count=3D0,=20= fail_ignore_count>0=20*/=0A-=09=09snprintf(buf,=20sizeof(buf),=0A-=09=09=09= =09=20_("=20%d=20of=20%d=20tests=20passed,=20%d=20failed=20test(s)=20= ignored.=20"),=0A-=09=09=09=09=20success_count,=0A-=09=09=09=09=20= success_count=20+=20fail_ignore_count,=0A-=09=09=09=09=20= fail_ignore_count);=0A-=09else=20if=20(fail_ignore_count=20=3D=3D=200)=09= /*=20fail_count>0=20&&=20fail_ignore_count=3D0=20*/=0A-=09=09= snprintf(buf,=20sizeof(buf),=0A-=09=09=09=09=20_("=20%d=20of=20%d=20= tests=20failed.=20"),=0A-=09=09=09=09=20fail_count,=0A-=09=09=09=09=20= success_count=20+=20fail_count);=0A-=09else=0A-=09=09/*=20fail_count>0=20= &&=20fail_ignore_count>0=20*/=0A-=09=09snprintf(buf,=20sizeof(buf),=0A-=09= =09=09=09=20_("=20%d=20of=20%d=20tests=20failed,=20%d=20of=20these=20= failures=20ignored.=20"),=0A-=09=09=09=09=20fail_count=20+=20= fail_ignore_count,=0A-=09=09=09=09=20success_count=20+=20fail_count=20+=20= fail_ignore_count,=0A-=09=09=09=09=20fail_ignore_count);=0A-=0A-=09= putchar('\n');=0A-=09for=20(i=20=3D=20strlen(buf);=20i=20>=200;=20i--)=0A= -=09=09putchar('=3D');=0A-=09printf("\n%s\n",=20buf);=0A-=09for=20(i=20=3D= =20strlen(buf);=20i=20>=200;=20i--)=0A-=09=09putchar('=3D');=0A-=09= putchar('\n');=0A-=09putchar('\n');=0A-=0A-=09if=20= (file_size(difffilename)=20>=200)=0A-=09{=0A-=09=09printf(_("The=20= differences=20that=20caused=20some=20tests=20to=20fail=20can=20be=20= viewed=20in=20the\n"=0A-=09=09=09=09=20"file=20\"%s\".=20=20A=20copy=20= of=20the=20test=20summary=20that=20you=20see\n"=0A-=09=09=09=09=20"above=20= is=20saved=20in=20the=20file=20\"%s\".\n\n"),=0A-=09=09=09=20=20=20= difffilename,=20logfilename);=0A-=09}=0A-=09else=0A-=09{=0A-=09=09= unlink(difffilename);=0A-=09=09unlink(logfilename);=0A+=09=09=09= pg_log_error("could=20not=20remove=20temp=20instance=20\"%s\"",=0A+=09=09= =09=09=09=09=20temp_instance);=0A=20=09}=0A=20=0A=20=09if=20(fail_count=20= !=3D=200)=0A--=20=0A2.32.1=20(Apple=20Git-133)=0A=0A= --Apple-Mail=_28E575C6-085C-4BA8-8E88-A9C502440BFE--