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 1nMVru-0001QR-D2 for pgsql-hackers@arkaria.postgresql.org; Tue, 22 Feb 2022 14:10:18 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1nMVrs-0007iP-Lb for pgsql-hackers@arkaria.postgresql.org; Tue, 22 Feb 2022 14:10:16 +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 1nMVrs-0007iF-9Y for pgsql-hackers@lists.postgresql.org; Tue, 22 Feb 2022 14:10:16 +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 1nMVrp-00035u-B6 for pgsql-hackers@lists.postgresql.org; Tue, 22 Feb 2022 14:10:15 +0000 Received: from s807.loopia.se (localhost [127.0.0.1]) by s807.loopia.se (Postfix) with ESMTP id E90EF2F1B4F4 for ; Tue, 22 Feb 2022 15:10:11 +0100 (CET) Received: from s934.loopia.se (unknown [172.22.191.6]) by s807.loopia.se (Postfix) with ESMTP id D9DE52E287D8; Tue, 22 Feb 2022 15:10:11 +0100 (CET) Received: from s474.loopia.se (unknown [172.22.191.6]) by s934.loopia.se (Postfix) with ESMTP id D689D7E7E1E; Tue, 22 Feb 2022 15:10:11 +0100 (CET) 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 s630.loopia.se ([172.22.191.6]) by s474.loopia.se (s474.loopia.se [172.22.190.14]) (amavisd-new, port 10024) with UTF8LMTP id Fv0VU4FbuHYT; Tue, 22 Feb 2022 15:10:11 +0100 (CET) X-Loopia-Auth: user X-Loopia-User: daniel@yesql.se X-Loopia-Originating-IP: 89.255.232.193 Received: from [192.168.72.144] (customer-89-255-232-193.stosn.net [89.255.232.193]) (Authenticated sender: daniel@yesql.se) by s630.loopia.se (Postfix) with ESMTPSA id 5F68913ACE4E; Tue, 22 Feb 2022 15:10:11 +0100 (CET) From: Daniel Gustafsson Content-Type: multipart/mixed; boundary="Apple-Mail=_56A90C5D-B29D-4A2F-BD90-CD559B8C3495" Mime-Version: 1.0 (Mac OS X Mail 13.4 \(3608.120.23.2.7\)) Subject: Re: TAP output format in pg_regress Date: Tue, 22 Feb 2022 15:10:11 +0100 References: To: PostgreSQL Developers , Andres Freund In-Reply-To: Message-Id: <49A54862-C682-4B60-9155-05F178FA79DC@yesql.se> X-Mailer: Apple Mail (2.3608.120.23.2.7) List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --Apple-Mail=_56A90C5D-B29D-4A2F-BD90-CD559B8C3495 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=us-ascii > On 22 Feb 2022, at 00:08, Daniel Gustafsson wrote: > I'll fix that. The attached v3 fixes that thinko, and cleans up a lot of the output = which isn't diagnostic per the TAP spec to make it less noisy. It also fixes = tag support used in the ECPG tests and a few small cleanups. There is a = blank line printed which needs to be fixed, but I'm running out of time and wanted = to get a non-broken version on the list before putting it aside for today. The errorpaths that exit(2) the testrun should be converted to "bail = out" lines when running with TAP output, but apart from that I think it's fairly = spec compliant. -- Daniel Gustafsson https://vmware.com/ --Apple-Mail=_56A90C5D-B29D-4A2F-BD90-CD559B8C3495 Content-Disposition: attachment; filename=v3-0001-pg_regress-TAP-output-format.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="v3-0001-pg_regress-TAP-output-format.patch" Content-Transfer-Encoding: quoted-printable =46rom=20800f96a6c50f2b75184c42e417d8cd440b473766=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Daniel=20Gustafsson=20=0A= Date:=20Fri,=2018=20Feb=202022=2015:13:54=20+0100=0ASubject:=20[PATCH=20= v3]=20pg_regress=20TAP=20output=20format=0A=0A---=0A=20= src/test/regress/pg_regress.c=20|=20412=20= +++++++++++++++++++++++++++-------=0A=201=20file=20changed,=20326=20= insertions(+),=2086=20deletions(-)=0A=0Adiff=20--git=20= a/src/test/regress/pg_regress.c=20b/src/test/regress/pg_regress.c=0A= index=20e6f71c7582..5853c3668f=20100644=0A---=20= a/src/test/regress/pg_regress.c=0A+++=20b/src/test/regress/pg_regress.c=0A= @@=20-95,6=20+95,8=20@@=20static=20char=20*dlpath=20=3D=20PKGLIBDIR;=0A=20= static=20char=20*user=20=3D=20NULL;=0A=20static=20_stringlist=20= *extraroles=20=3D=20NULL;=0A=20static=20char=20*config_auth_datadir=20=3D=20= NULL;=0A+static=20char=20*format=20=3D=20NULL;=0A+static=20char=20= *psql_formatting=20=3D=20NULL;=0A=20=0A=20/*=20internal=20variables=20*/=0A= =20static=20const=20char=20*progname;=0A@@=20-120,11=20+122,68=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+struct=20= output_func=0A+{=0A+=09void=20(*header)(const=20char=20*line);=0A+=09= void=20(*footer)(const=20char=20*difffilename,=20const=20char=20= *logfilename);=0A+=09void=20(*comment)(bool=20diagnostic,=20const=20char=20= *comment);=0A+=0A+=09void=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,=20= bool=20ignore,=20char=20*tags);=0A+=0A+=09void=20(*test_runtime)(const=20= char=20*testname,=20double=20runtime);=0A+};=0A+=0A+=0A+void=20= (*test_runtime)(const=20char=20*testname,=20double=20runtime);=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=20comment_text(bool=20= diagnostic,=20const=20char=20*comment);=0A+static=20void=20= test_status_preamble_text(const=20char=20*testname);=0A+static=20void=20= test_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+=0A+struct=20output_func=20= output_func_text=20=3D=0A+{=0A+=09header_text,=0A+=09footer_text,=0A+=09= comment_text,=0A+=09test_status_preamble_text,=0A+=09= test_status_ok_text,=0A+=09test_status_failed_text,=0A+=09= test_runtime_text=0A+};=0A+=0A+/*=20TAP=20output=20format=20*/=0A+static=20= void=20footer_tap(const=20char=20*difffilename,=20const=20char=20= *logfilename);=0A+static=20void=20comment_tap(bool=20diagnostic,=20const=20= char=20*comment);=0A+static=20void=20test_status_ok_tap(const=20char=20= *testname);=0A+static=20void=20test_status_failed_tap(const=20char=20= *testname,=20bool=20ignore,=20char=20*tags);=0A+=0A+struct=20output_func=20= output_func_tap=20=3D=0A+{=0A+=09NULL,=0A+=09footer_tap,=0A+=09= comment_tap,=0A+=09NULL,=0A+=09test_status_ok_tap,=0A+=09= test_status_failed_tap,=0A+=09NULL=0A+};=0A+=0A+struct=20output_func=20= *output=20=3D=20&output_func_text;=0A+=0A+static=20void=20= test_status_ok(const=20char=20*testname);=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-208,18=20+267,216=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+=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= line);=0A+=09fflush(stdout);=0A+}=0A+=0A=20static=20void=0A=20= header(const=20char=20*fmt,...)=0A=20{=0A=20=09char=09=09tmp[64];=0A=20=09= va_list=09=09ap;=0A=20=0A+=09if=20(!output->header)=0A+=09=09return;=0A+=0A= =20=09va_start(ap,=20fmt);=0A=20=09vsnprintf(tmp,=20sizeof(tmp),=20fmt,=20= ap);=0A=20=09va_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",=20tmp);=0A-=09fflush(stdout);=0A+=09output->header(tmp);=0A+}=0A= +=0A+static=20void=0A+footer_tap(const=20char=20*difffilename,=20const=20= char=20*logfilename)=0A+{=0A+=09status("1..%i\n",=20(fail_count=20+=20= fail_ignore_count=20+=20success_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=09= output->footer(difffilename,=20logfilename);=0A+}=0A+=0A+static=20void=0A= +comment_text(bool=20diagnostic,=20const=20char=20*comment)=0A+{=0A+=09= status("%s",=20comment);=0A+}=0A+=0A+static=20void=0A+comment_tap(bool=20= diagnostic,=20const=20char=20*comment)=0A+{=0A+=09if=20(!diagnostic)=0A+=09= =09return;=0A+=0A+=09status("#=20%s",=20comment);=0A+}=0A+=0A+static=20= void=0A+comment(bool=20diagnostic,=20const=20char=20*fmt,...)=0A+{=0A+=09= char=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(diagnostic,=20tmp);=0A+}=0A+=0A+static=20void=0A= +test_status_preamble_text(const=20char=20*testname)=0A+{=0A+=09= status(_("test=20%-28s=20...=20"),=20testname);=0A+}=0A+=0A+static=20= void=0A+test_status_preamble(const=20char=20*testname)=0A+{=0A+=09if=20= (output->test_status_preamble)=0A+=09=09= output->test_status_preamble(testname);=0A+}=0A+=0A+static=20void=0A= +test_status_ok_tap(const=20char=20*testname)=0A+{=0A+=09/*=20There=20is=20= no=20NLS=20translation=20here=20as=20"ok"=20is=20a=20protocol=20message=20= */=0A+=09status("ok=20%i=20-=20%s",=0A+=09=09=20=20=20(fail_count=20+=20= fail_ignore_count=20+=20success_count),=0A+=09=09=20=20=20testname);=0A= +}=0A+=0A+static=20void=0A+test_status_ok_text(const=20char=20*testname)=0A= +{=0A+=09(void)=20testname;=20/*=20unused=20*/=0A+=09status(_("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+=09success_count++;=0A= +=09if=20(output->test_status_ok)=0A+=09=09= output->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+=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+=20= success_count),=0A+=09=09=09=20=20=20testname);=0A+=09=09comment(true,=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=09fprintf(stdout,=20"\n");=0A+=09= =09comment(true,=20tags);=0A+=09}=0A+}=0A+=0A+=0A+static=20void=0A= +test_status_failed_text(const=20char=20*testname,=20bool=20ignore,=20= char=20*tags)=0A+{=0A+=09if=20(ignore)=0A+=09=09status(_("%s=20failed=20= (ignored)"),=20tags);=0A+=09else=0A+=09=09status(_("%s=20FAILED"),=20= tags);=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= output->test_status_failed(testname,=20ignore,=20tags);=0A+}=0A+=0A= +static=20void=0A+test_runtime_text(const=20char=20*testname,=20double=20= runtime)=0A+{=0A+=09(void)testname;=0A+=09status(_("=20%8.0f=20ms"),=20= runtime);=0A+}=0A+=0A+static=20void=0A+runtime(const=20char=20*testname,=20= double=20runtime)=0A+{=0A+=09if=20(output->test_runtime)=0A+=09=09= output->test_runtime(testname,=20runtime);=0A+}=0A+=0A+static=20void=0A= +footer_text(const=20char=20*difffilename,=20const=20char=20= *logfilename)=0A+{=0A+=09char=20buf[256];=0A+=0A+=09/*=0A+=09=20*=20Emit=20= nice-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=09snprintf(buf,=20= sizeof(buf),=0A+=09=09=09=09=20_("=20All=20%d=20tests=20passed.=20"),=0A= +=09=09=09=09=20success_count);=0A+=09else=20if=20(fail_count=20=3D=3D=20= 0)=09/*=20fail_count=3D0,=20fail_ignore_count>0=20*/=0A+=09=09= snprintf(buf,=20sizeof(buf),=0A+=09=09=09=09=20_("=20%d=20of=20%d=20= tests=20passed,=20%d=20failed=20test(s)=20ignored.=20"),=0A+=09=09=09=09=20= success_count,=0A+=09=09=09=09=20success_count=20+=20fail_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&&=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(int=20i=20=3D=20strlen(buf);=20i=20>=200;=20= i--)=0A+=09=09putchar('=3D');=0A+=09printf("\n%s\n",=20buf);=0A+=09for=20= (int=20i=20=3D=20strlen(buf);=20i=20>=200;=20i--)=0A+=09=09putchar('=3D');= =0A+=09putchar('\n');=0A+=09putchar('\n');=0A+=0A+=09if=20(difffilename=20= &&=20logfilename)=0A+=09{=0A+=09=09printf(_("The=20differences=20that=20= caused=20some=20tests=20to=20fail=20can=20be=20viewed=20in=20the\n"=0A+=09= =09=09=09=20"file=20\"%s\".=20=20A=20copy=20of=20the=20test=20summary=20= that=20you=20see\n"=0A+=09=09=09=09=20"above=20is=20saved=20in=20the=20= file=20\"%s\".\n\n"),=0A+=09=09=09=20=20=20difffilename,=20logfilename);=0A= +=09}=0A=20}=0A=20=0A=20/*=0A@@=20-752,13=20+1009,13=20@@=20= initialize_environment(void)=0A=20#endif=0A=20=0A=20=09=09if=20(pghost=20= &&=20pgport)=0A-=09=09=09printf(_("(using=20postmaster=20on=20%s,=20port=20= %s)\n"),=20pghost,=20pgport);=0A+=09=09=09comment(false,=20_("(using=20= postmaster=20on=20%s,=20port=20%s)\n"),=20pghost,=20pgport);=0A=20=09=09= if=20(pghost=20&&=20!pgport)=0A-=09=09=09printf(_("(using=20postmaster=20= on=20%s,=20default=20port)\n"),=20pghost);=0A+=09=09=09comment(false,=20= _("(using=20postmaster=20on=20%s,=20default=20port)\n"),=20pghost);=0A=20= =09=09if=20(!pghost=20&&=20pgport)=0A-=09=09=09printf(_("(using=20= postmaster=20on=20Unix=20socket,=20port=20%s)\n"),=20pgport);=0A+=09=09=09= comment(false,=20_("(using=20postmaster=20on=20Unix=20socket,=20port=20= %s)\n"),=20pgport);=0A=20=09=09if=20(!pghost=20&&=20!pgport)=0A-=09=09=09= printf(_("(using=20postmaster=20on=20Unix=20socket,=20default=20= port)\n"));=0A+=09=09=09comment(false,=20_("(using=20postmaster=20on=20= Unix=20socket,=20default=20port)\n"));=0A=20=09}=0A=20=0A=20=09= load_resultmap();=0A@@=20-984,9=20+1241,10=20@@=20= psql_start_command(void)=0A=20=09StringInfo=09buf=20=3D=20= makeStringInfo();=0A=20=0A=20=09appendStringInfo(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?=20bindir=20:=20"",=0A-=09=09=09=09=09=20= bindir=20?=20"/"=20:=20"");=0A+=09=09=09=09=09=20bindir=20?=20"/"=20:=20= "",=0A+=09=09=09=09=09=20psql_formatting=20?=20psql_formatting=20:=20= "");=0A=20=09return=20buf;=0A=20}=0A=20=0A@@=20-1489,7=20+1747,7=20@@=20= wait_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=09INSTR_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(false,=20"=20%s",=20names[i]);=0A=20=09=09=09=09tests_left--;=0A=20= =09=09=09=09break;=0A=20=09=09=09}=0A@@=20-1545,12=20+1803,15=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@@=20= -1643,7=20+1904,7=20@@=20run_schedule(const=20char=20*schedule,=20= test_start_function=20startfunc,=0A=20=0A=20=09=09if=20(num_tests=20=3D=3D= =201)=0A=20=09=09{=0A-=09=09=09status(_("test=20%-28s=20...=20"),=20= tests[0]);=0A+=09=09=09test_status_preamble(tests[0]);=0A=20=09=09=09= pids[0]=20=3D=20(startfunc)=20(tests[0],=20&resultfiles[0],=20= &expectfiles[0],=20&tags[0]);=0A=20=09=09=09= INSTR_TIME_SET_CURRENT(starttimes[0]);=0A=20=09=09=09= wait_for_tests(pids,=20statuses,=20stoptimes,=20NULL,=201);=0A@@=20= -1659,8=20+1920,8=20@@=20run_schedule(const=20char=20*schedule,=20= test_start_function=20startfunc,=0A=20=09=09{=0A=20=09=09=09int=09=09=09= oldest=20=3D=200;=0A=20=0A-=09=09=09status(_("parallel=20group=20(%d=20= tests,=20in=20groups=20of=20%d):=20"),=0A-=09=09=09=09=20=20=20= num_tests,=20max_connections);=0A+=09=09=09comment(false,=20_("parallel=20= group=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-=20= oldest=20>=3D=20max_connections)=0A@@=20-1680,7=20+1941,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(false,=20_("parallel=20group=20(%d=20tests):=20"),=20num_tests);=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=09pids[i]=20=3D=20(startfunc)=20(tests[i],=20= &resultfiles[i],=20&expectfiles[i],=20&tags[i]);=0A@@=20-1698,8=20= +1959,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= -1720,7=20+1983,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-1738,28=20+2001,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-1774,6=20+2026,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= -1797,11=20+2050,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-1822,27=20+2077,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-1983,6=20= +2234,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-2046,6=20= +2298,7=20@@=20regression_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+=20=09=09= {"format",=20required_argument,=20NULL,=2026},=0A=20=09=09{NULL,=200,=20= NULL,=200}=0A=20=09};=0A=20=0A@@=20-2175,6=20+2428,9=20@@=20= regression_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=09= break;=0A+=09=09=09case=2026:=0A+=09=09=09=09format=20=3D=20= pg_strdup(optarg);=0A+=09=09=09=09break;=0A=20=09=09=09default:=0A=20=09=09= =09=09/*=20getopt_long=20already=20emitted=20a=20complaint=20*/=0A=20=09=09= =09=09fprintf(stderr,=20_("\nTry=20\"%s=20-h\"=20for=20more=20= information.\n"),=0A@@=20-2201,6=20+2457,24=20@@=20regression_main(int=20= argc,=20char=20*argv[],=0A=20=09=09exit(0);=0A=20=09}=0A=20=0A+=09/*=0A+=09= =20*=20text=20(regress)=20is=20the=20default=20so=20we=20don't=20need=20= to=20set=20any=20variables=20in=0A+=09=20*=20that=20case.=0A+=09=20*/=0A= +=09if=20(format)=0A+=09{=0A+=09=09if=20(strcmp(format,=20"tap")=20=3D=3D=20= 0)=0A+=09=09{=0A+=09=09=09output=20=3D=20&output_func_tap;=0A+=09=09=09= psql_formatting=20=3D=20pg_strdup("-q");=0A+=09=09}=0A+=09=09else=20if=20= (strcmp(format,=20"regress")=20!=3D=200)=0A+=09=09{=0A+=09=09=09= fprintf(stderr,=20_("\n%s:=20invalid=20format=20specified:=20\"%s\".=20= Supported=20formats=20are=20\"tap\"=20and=20\"regress\"\n"),=20progname,=20= format);=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= -2455,7=20+2729,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(false,=20_("running=20on=20port=20%d=20with=20= PID=20%lu\n"),=0A=20=09=09=09=20=20=20port,=20ULONGPID(postmaster_pid));=0A= =20=09}=0A=20=09else=0A@@=20-2523,54=20+2797,20=20@@=20= regression_main(int=20argc,=20char=20*argv[],=0A=20=0A=20=09= fclose(logfile);=0A=20=0A-=09/*=0A-=09=20*=20Emit=20nice-looking=20= summary=20message=0A-=09=20*/=0A-=09if=20(fail_count=20=3D=3D=200=20&&=20= fail_ignore_count=20=3D=3D=200)=0A-=09=09snprintf(buf,=20sizeof(buf),=0A= -=09=09=09=09=20_("=20All=20%d=20tests=20passed.=20"),=0A-=09=09=09=09=20= success_count);=0A-=09else=20if=20(fail_count=20=3D=3D=200)=09/*=20= fail_count=3D0,=20fail_ignore_count>0=20*/=0A-=09=09snprintf(buf,=20= sizeof(buf),=0A-=09=09=09=09=20_("=20%d=20of=20%d=20tests=20passed,=20%d=20= failed=20test(s)=20ignored.=20"),=0A-=09=09=09=09=20success_count,=0A-=09= =09=09=09=20success_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+=09if=20= (file_size(difffilename)=20<=3D=200)=0A=20=09{=0A=20=09=09= unlink(difffilename);=0A=20=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=20=09}=0A=20=0A= +=09footer(difffilename,=20logfilename);=0A+=09status_end();=0A+=0A=20=09= if=20(fail_count=20!=3D=200)=0A=20=09=09exit(1);=0A=20=0A--=20=0A2.24.3=20= (Apple=20Git-128)=0A=0A= --Apple-Mail=_56A90C5D-B29D-4A2F-BD90-CD559B8C3495--