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 1nXMpp-0003Eu-QD for pgsql-hackers@arkaria.postgresql.org; Thu, 24 Mar 2022 12:45:02 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1nXMpo-0000E1-OK for pgsql-hackers@arkaria.postgresql.org; Thu, 24 Mar 2022 12:45:00 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nXMpo-0000Dr-1Y for pgsql-hackers@lists.postgresql.org; Thu, 24 Mar 2022 12:45:00 +0000 Received: from smtp.outgoing.loopia.se ([93.188.3.37]) by makus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nXMpk-000511-9p for pgsql-hackers@lists.postgresql.org; Thu, 24 Mar 2022 12:44:59 +0000 Received: from s807.loopia.se (localhost [127.0.0.1]) by s807.loopia.se (Postfix) with ESMTP id 3BB192F22DBF for ; Thu, 24 Mar 2022 13:44:53 +0100 (CET) Received: from s934.loopia.se (unknown [172.22.191.5]) by s807.loopia.se (Postfix) with ESMTP id 2C5192E2D229; Thu, 24 Mar 2022 13:44:53 +0100 (CET) Received: from s470.loopia.se (unknown [172.22.191.6]) by s934.loopia.se (Postfix) with ESMTP id 293DB7EB8EC; Thu, 24 Mar 2022 13:44:53 +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.5]) by s470.loopia.se (s470.loopia.se [172.22.190.10]) (amavisd-new, port 10024) with LMTP id dyp3lFDUYHZ3; Thu, 24 Mar 2022 13:44:52 +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 5077F13B2F71; Thu, 24 Mar 2022 13:44:52 +0100 (CET) From: Daniel Gustafsson Message-Id: Content-Type: multipart/mixed; boundary="Apple-Mail=_2D40F15D-78C8-417E-B488-6EB628C0A875" Mime-Version: 1.0 (Mac OS X Mail 13.4 \(3608.120.23.2.7\)) Subject: Re: TAP output format in pg_regress Date: Thu, 24 Mar 2022 13:44:51 +0100 In-Reply-To: <20220321234924.kcc3q26o7sx6rnfa@alap3.anarazel.de> Cc: PostgreSQL Developers To: Andres Freund References: <49A54862-C682-4B60-9155-05F178FA79DC@yesql.se> <20220321234924.kcc3q26o7sx6rnfa@alap3.anarazel.de> 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=_2D40F15D-78C8-417E-B488-6EB628C0A875 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=us-ascii > On 22 Mar 2022, at 00:49, Andres Freund wrote: > This is failing with segmentation faults on cfbot: > https://cirrus-ci.com/task/4879227009892352?logs=test_world#L21 > > Looks like something around isolationtester is broken? It could be triggered by plpgsql tests as well, and was (as usual) a silly mistake easily fixed when found. The attached survices repeated check-world for me. > Seems like we might not have energy to push this forward in the next two > weeks, so maybe the CF entry should be marked returned or moved for now? Since there is little use for this without the Meson branch, it should target the same version as that patch. I'll move the patch to the next CF for now. As we discussed off-list I extended this patchset with an attempt to minimize noise as per 20220221164736.rq3ornzjdkmwk2wo@alap3.anarazel.de, but it's not yet done. The attached has a rough draft of adding a --verbose option which gives the current output (and potentially more for debugging), but which by default is off producing minimal noise. -- Daniel Gustafsson https://vmware.com/ --Apple-Mail=_2D40F15D-78C8-417E-B488-6EB628C0A875 Content-Disposition: attachment; filename=v4-0002-Reduce-noise-in-pg_regress-default-output.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="v4-0002-Reduce-noise-in-pg_regress-default-output.patch" Content-Transfer-Encoding: quoted-printable =46rom=20a208d3f8d7ccd6dd7a012019ab13f41e61cb3ab0=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Daniel=20Gustafsson=20=0A= Date:=20Fri,=204=20Mar=202022=2011:54:00=20+0100=0ASubject:=20[PATCH=20= v4=202/2]=20Reduce=20noise=20in=20pg_regress=20default=20output=0A=0AA=20= first=20stab=20at=20adding=20a=20--verbose=20flag=20to=20pg_regress=20to=20= reduce=20the=0Aamount=20of=20noise=20printed=20during=20a=20test=20run.=0A= ---=0A=20src/test/regress/pg_regress.c=20|=20106=20= ++++++++++++++++++++++------------=0A=201=20file=20changed,=2069=20= insertions(+),=2037=20deletions(-)=0A=0Adiff=20--git=20= a/src/test/regress/pg_regress.c=20b/src/test/regress/pg_regress.c=0A= index=20dbf646d5ec..82109fed84=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-122,11=20+123,17=20@@=20static=20int=09= fail_ignore_count=20=3D=200;=0A=20static=20bool=20directory_exists(const=20= char=20*dir);=0A=20static=20void=20make_directory(const=20char=20*dir);=0A= =20=0A+typedef=20enum=0A+{=0A+=09COMMENT_DIAGNOSTIC,=0A+=09= COMMENT_VERBOSE=0A+}=09=09=09CommentLevel;=0A+=0A=20struct=20output_func=0A= =20{=0A=20=09void=20(*header)(const=20char=20*line);=0A=20=09void=20= (*footer)(const=20char=20*difffilename,=20const=20char=20*logfilename);=0A= -=09void=20(*comment)(bool=20diagnostic,=20const=20char=20*comment);=0A+=09= void=20(*comment)(CommentLevel=20level,=20const=20char=20*comment);=0A=20= =0A=20=09void=20(*test_status_preamble)(const=20char=20*testname);=0A=20=0A= @@=20-141,7=20+148,7=20@@=20void=20(*test_runtime)(const=20char=20= *testname,=20double=20runtime);=0A=20/*=20Text=20output=20format=20*/=0A=20= static=20void=20header_text(const=20char=20*line);=0A=20static=20void=20= footer_text(const=20char=20*difffilename,=20const=20char=20= *logfilename);=0A-static=20void=20comment_text(bool=20diagnostic,=20= const=20char=20*comment);=0A+static=20void=20comment_text(CommentLevel=20= level,=20const=20char=20*comment);=0A=20static=20void=20= test_status_preamble_text(const=20char=20*testname);=0A=20static=20void=20= test_status_ok_text(const=20char=20*testname);=0A=20static=20void=20= test_status_failed_text(const=20char=20*testname,=20bool=20ignore,=20= char=20*tags);=0A@@=20-160,7=20+167,7=20@@=20struct=20output_func=20= output_func_text=20=3D=0A=20=0A=20/*=20TAP=20output=20format=20*/=0A=20= static=20void=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=20comment_tap(CommentLevel=20level,=20= const=20char=20*comment);=0A=20static=20void=20test_status_ok_tap(const=20= char=20*testname);=0A=20static=20void=20test_status_failed_tap(const=20= char=20*testname,=20bool=20ignore,=20char=20*tags);=0A=20=0A@@=20-270,6=20= +277,9=20@@=20split_to_stringlist(const=20char=20*s,=20const=20char=20= *delim,=20_stringlist=20**listhead)=0A=20static=20void=0A=20= header_text(const=20char=20*line)=0A=20{=0A+=09if=20(!verbose)=0A+=09=09= return;=0A+=0A=20=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",=20line);=0A= =20=09fflush(stdout);=0A=20}=0A@@=20-305,22=20+315,25=20@@=20= footer(const=20char=20*difffilename,=20const=20char=20*logfilename)=0A=20= }=0A=20=0A=20static=20void=0A-comment_text(bool=20diagnostic,=20const=20= char=20*comment)=0A+comment_text(CommentLevel=20level,=20const=20char=20= *comment)=0A=20{=0A+=09if=20(level=20=3D=3D=20COMMENT_VERBOSE=20&&=20= !verbose)=0A+=09=09return;=0A+=0A=20=09status("%s",=20comment);=0A=20}=0A= =20=0A=20static=20void=0A-comment_tap(bool=20diagnostic,=20const=20char=20= *comment)=0A+comment_tap(CommentLevel=20level,=20const=20char=20= *comment)=0A=20{=0A-=09if=20(!diagnostic)=0A+=09if=20(level=20!=3D=20= COMMENT_DIAGNOSTIC)=0A=20=09=09return;=0A=20=0A=20=09status("#=20%s",=20= comment);=0A=20}=0A=20=0A=20static=20void=0A-comment(bool=20diagnostic,=20= const=20char=20*fmt,...)=0A+comment(CommentLevel=20level,=20const=20char=20= *fmt,...)=0A=20{=0A=20=09char=09=09tmp[256];=0A=20=09va_list=09=09ap;=0A= @@=20-332,7=20+345,7=20@@=20comment(bool=20diagnostic,=20const=20char=20= *fmt,...)=0A=20=09vsnprintf(tmp,=20sizeof(tmp),=20fmt,=20ap);=0A=20=09= va_end(ap);=0A=20=0A-=09output->comment(diagnostic,=20tmp);=0A+=09= output->comment(level,=20tmp);=0A=20}=0A=20=0A=20static=20void=0A@@=20= -380,7=20+393,7=20@@=20test_status_failed_tap(const=20char=20*testname,=20= bool=20ignore,=20char=20*tags)=0A=20=09=09status("ok=20%i=20-=20%s=20",=0A= =20=09=09=09=20=20=20(fail_count=20+=20fail_ignore_count=20+=20= success_count),=0A=20=09=09=09=20=20=20testname);=0A-=09=09comment(true,=20= "SKIP=20(ignored)");=0A+=09=09comment(COMMENT_DIAGNOSTIC,=20"SKIP=20= (ignored)");=0A=20=09}=0A=20=09else=0A=20=09=09status("not=20ok=20%i=20-=20= %s",=0A@@=20-390,7=20+403,7=20@@=20test_status_failed_tap(const=20char=20= *testname,=20bool=20ignore,=20char=20*tags)=0A=20=09if=20(tags=20&&=20= strlen(tags)=20>=200)=0A=20=09{=0A=20=09=09fprintf(stdout,=20"\n");=0A-=09= =09comment(true,=20tags);=0A+=09=09comment(COMMENT_DIAGNOSTIC,=20tags);=0A= =20=09}=0A=20}=0A=20=0A@@=20-440,42=20+453,52=20@@=20footer_text(const=20= char=20*difffilename,=20const=20char=20*logfilename)=0A=20=09=20*/=0A=20=09= if=20(fail_count=20=3D=3D=200=20&&=20fail_ignore_count=20=3D=3D=200)=0A=20= =09=09snprintf(buf,=20sizeof(buf),=0A-=09=09=09=09=20_("=20All=20%d=20= tests=20passed.=20"),=0A+=09=09=09=09=20_("All=20%d=20tests=20passed.=20= "),=0A=20=09=09=09=09=20success_count);=0A=20=09else=20if=20(fail_count=20= =3D=3D=200)=09/*=20fail_count=3D0,=20fail_ignore_count>0=20*/=0A=20=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= _("%d=20of=20%d=20tests=20passed,=20%d=20failed=20test(s)=20ignored.=20= "),=0A=20=09=09=09=09=20success_count,=0A=20=09=09=09=09=20success_count=20= +=20fail_ignore_count,=0A=20=09=09=09=09=20fail_ignore_count);=0A=20=09= else=20if=20(fail_ignore_count=20=3D=3D=200)=09/*=20fail_count>0=20&&=20= fail_ignore_count=3D0=20*/=0A=20=09=09snprintf(buf,=20sizeof(buf),=0A-=09= =09=09=09=20_("=20%d=20of=20%d=20tests=20failed.=20"),=0A+=09=09=09=09=20= _("%d=20of=20%d=20tests=20failed.=20"),=0A=20=09=09=09=09=20fail_count,=0A= =20=09=09=09=09=20success_count=20+=20fail_count);=0A=20=09else=0A=20=09=09= /*=20fail_count>0=20&&=20fail_ignore_count>0=20*/=0A=20=09=09= snprintf(buf,=20sizeof(buf),=0A-=09=09=09=09=20_("=20%d=20of=20%d=20= tests=20failed,=20%d=20of=20these=20failures=20ignored.=20"),=0A+=09=09=09= =09=20_("%d=20of=20%d=20tests=20failed,=20%d=20of=20these=20failures=20= ignored.=20"),=0A=20=09=09=09=09=20fail_count=20+=20fail_ignore_count,=0A= =20=09=09=09=09=20success_count=20+=20fail_count=20+=20= fail_ignore_count,=0A=20=09=09=09=09=20fail_ignore_count);=0A=20=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+=09if=20(verbose)=0A+=09{=0A= +=09=09putchar('\n');=0A+=09=09for=20(int=20i=20=3D=20strlen(buf);=20i=20= >=200;=20i--)=0A+=09=09=09putchar('=3D');=0A+=09=09printf("\n=20%s\n",=20= buf);=0A+=09=09for=20(int=20i=20=3D=20strlen(buf);=20i=20>=200;=20i--)=0A= +=09=09=09putchar('=3D');=0A+=09=09putchar('\n');=0A+=09=09= putchar('\n');=0A=20=0A-=09if=20(difffilename=20&&=20logfilename)=0A+=09=09= if=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= =20=09{=0A-=09=09printf(_("The=20differences=20that=20caused=20some=20= tests=20to=20fail=20can=20be=20viewed=20in=20the\n"=0A-=09=09=09=09=20= "file=20\"%s\".=20=20A=20copy=20of=20the=20test=20summary=20that=20you=20= see\n"=0A-=09=09=09=09=20"above=20is=20saved=20in=20the=20file=20= \"%s\".\n\n"),=0A-=09=09=09=20=20=20difffilename,=20logfilename);=0A+=09=09= printf("\n%s\n",=20buf);=0A+=09=09if=20(difffilename=20&&=20logfilename)=0A= +=09=09=09printf(_("Failing=20diffs:=20\"%s\"\nTest=20summary:=20= \"%s\"\n"),=0A+=09=09=09=09=09difffilename,=20logfilename);=0A=20=09}=0A=20= }=0A=20=0A@@=20-1015,13=20+1038,13=20@@=20initialize_environment(void)=0A= =20=09=09}=0A=20=0A=20=09=09if=20(pghost=20&&=20pgport)=0A-=09=09=09= comment(false,=20_("(using=20postmaster=20on=20%s,=20port=20%s)\n"),=20= pghost,=20pgport);=0A+=09=09=09comment(COMMENT_VERBOSE,=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=09comment(false,=20_("(using=20= postmaster=20on=20%s,=20default=20port)\n"),=20pghost);=0A+=09=09=09= comment(COMMENT_VERBOSE,=20_("(using=20postmaster=20on=20%s,=20default=20= port)\n"),=20pghost);=0A=20=09=09if=20(!pghost=20&&=20pgport)=0A-=09=09=09= comment(false,=20_("(using=20postmaster=20on=20Unix=20socket,=20port=20= %s)\n"),=20pgport);=0A+=09=09=09comment(COMMENT_VERBOSE,=20_("(using=20= postmaster=20on=20Unix=20socket,=20port=20%s)\n"),=20pgport);=0A=20=09=09= if=20(!pghost=20&&=20!pgport)=0A-=09=09=09comment(false,=20_("(using=20= postmaster=20on=20Unix=20socket,=20default=20port)\n"));=0A+=09=09=09= comment(COMMENT_VERBOSE,=20_("(using=20postmaster=20on=20Unix=20socket,=20= default=20port)\n"));=0A=20=09}=0A=20=0A=20=09load_resultmap();=0A@@=20= -1753,7=20+1776,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=09comment(false,=20"=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-1926,7=20= +1949,7=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=09comment(false,=20_("parallel=20group=20= (%d=20tests,=20in=20groups=20of=20%d):=20"),=0A+=09=09=09= comment(COMMENT_VERBOSE,=20_("parallel=20group=20(%d=20tests,=20in=20= groups=20of=20%d):=20"),=0A=20=09=09=09=09=09=20=20num_tests,=20= max_connections);=0A=20=09=09=09for=20(i=20=3D=200;=20i=20<=20num_tests;=20= i++)=0A=20=09=09=09{=0A@@=20-1947,7=20+1970,7=20@@=20run_schedule(const=20= char=20*schedule,=20test_start_function=20startfunc,=0A=20=09=09}=0A=20=09= =09else=0A=20=09=09{=0A-=09=09=09comment(false,=20_("parallel=20group=20= (%d=20tests):=20"),=20num_tests);=0A+=09=09=09comment(COMMENT_VERBOSE,=20= _("parallel=20group=20(%d=20tests):=20"),=20num_tests);=0A=20=09=09=09= for=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-2255,6=20+2278,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=20be=20used=20multiple=20= times=20to=20concatenate)\n"));=0A=20=09printf(_("=20=20=20=20=20=20= --temp-instance=3DDIR=20=20=20=20=20=20=20create=20a=20temporary=20= instance=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=20existing=20= installation\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=20applies=20to=20= regress=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=20version=20= information,=20then=20exit\n"));=0A=20=09printf(_("\n"));=0A=20=09= printf(_("Options=20for=20\"temp-instance\"=20mode:\n"));=0A@@=20-2283,6=20= +2307,7=20@@=20regression_main(int=20argc,=20char=20*argv[],=0A=20=09= static=20struct=20option=20long_options[]=20=3D=20{=0A=20=09=09{"help",=20= no_argument,=20NULL,=20'h'},=0A=20=09=09{"version",=20no_argument,=20= NULL,=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",=20= no_argument,=20NULL,=202},=0A=20=09=09{"inputdir",=20required_argument,=20= NULL,=203},=0A@@=20-2350,7=20+2375,7=20@@=20regression_main(int=20argc,=20= char=20*argv[],=0A=20=09if=20(getenv("PG_REGRESS_DIFF_OPTS"))=0A=20=09=09= pretty_diff_opts=20=3D=20getenv("PG_REGRESS_DIFF_OPTS");=0A=20=0A-=09= while=20((c=20=3D=20getopt_long(argc,=20argv,=20"hV",=20long_options,=20= &option_index))=20!=3D=20-1)=0A+=09while=20((c=20=3D=20getopt_long(argc,=20= argv,=20"hVv",=20long_options,=20&option_index))=20!=3D=20-1)=0A=20=09{=0A= =20=09=09switch=20(c)=0A=20=09=09{=0A@@=20-2360,6=20+2385,9=20@@=20= regression_main(int=20argc,=20char=20*argv[],=0A=20=09=09=09case=20'V':=0A= =20=09=09=09=09puts("pg_regress=20(PostgreSQL)=20"=20PG_VERSION);=0A=20=09= =09=09=09exit(0);=0A+=09=09=09case=20'v':=0A+=09=09=09=09verbose=20=3D=20= true;=0A+=09=09=09=09break;=0A=20=09=09=09case=201:=0A=20=0A=20=09=09=09=09= /*=0A@@=20-2463,6=20+2491,9=20@@=20regression_main(int=20argc,=20char=20= *argv[],=0A=20=09=09exit(0);=0A=20=09}=0A=20=0A+=09if=20(!verbose)=0A+=09= =09psql_formatting=20=3D=20pg_strdup("-q");=0A+=0A=20=09/*=0A=20=09=20*=20= text=20(regress)=20is=20the=20default=20so=20we=20don't=20need=20to=20= set=20any=20variables=20in=0A=20=09=20*=20that=20case.=0A@@=20-2472,7=20= +2503,8=20@@=20regression_main(int=20argc,=20char=20*argv[],=0A=20=09=09= if=20(strcmp(format,=20"tap")=20=3D=3D=200)=0A=20=09=09{=0A=20=09=09=09= output=20=3D=20&output_func_tap;=0A-=09=09=09psql_formatting=20=3D=20= pg_strdup("-q");=0A+=09=09=09if=20(!psql_formatting)=0A+=09=09=09=09= psql_formatting=20=3D=20pg_strdup("-q");=0A=20=09=09}=0A=20=09=09else=20= if=20(strcmp(format,=20"regress")=20!=3D=200)=0A=20=09=09{=0A@@=20= -2735,7=20+2767,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=09comment(false,=20_("running=20on=20port=20%d=20with=20= PID=20%lu\n"),=0A+=09=09comment(COMMENT_VERBOSE,=20_("running=20on=20= port=20%d=20with=20PID=20%lu\n"),=0A=20=09=09=09=20=20=20port,=20= ULONGPID(postmaster_pid));=0A=20=09}=0A=20=09else=0A--=20=0A2.24.3=20= (Apple=20Git-128)=0A=0A= --Apple-Mail=_2D40F15D-78C8-417E-B488-6EB628C0A875 Content-Disposition: attachment; filename=v4-0001-pg_regress-TAP-output-format.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="v4-0001-pg_regress-TAP-output-format.patch" Content-Transfer-Encoding: quoted-printable =46rom=206dee6ba8ae2b3917cd9e7a49676cc69dd8f9d455=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= v4=201/2]=20pg_regress=20TAP=20output=20format=0A=0A---=0A=20= src/test/regress/pg_regress.c=20|=20413=20= +++++++++++++++++++++++++++-------=0A=201=20file=20changed,=20327=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=20982801e029..dbf646d5ec=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-758,13=20+1015,13=20@@=20= initialize_environment(void)=0A=20=09=09}=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-990,9=20+1247,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-1495,7=20+1753,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-1551,12=20+1809,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= -1649,7=20+1910,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= -1665,8=20+1926,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-1686,7=20+1947,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-1704,8=20= +1965,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+1989,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+2007,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+2032,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+2056,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+2083,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-1989,6=20= +2240,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-2052,6=20= +2304,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-2181,6=20+2434,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-2207,6=20+2463,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= -2461,7=20+2735,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-2528,55=20+2802,22=20@@=20= regression_main(int=20argc,=20char=20*argv[],=0A=20=09}=0A=20=0A=20=09= fclose(logfile);=0A+=09logfile=20=3D=20NULL;=0A=20=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_("=20All=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_("=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_("=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_("=20%d=20of=20%d=20= tests=20failed,=20%d=20of=20these=20failures=20ignored.=20"),=0A-=09=09=09= =09=20fail_count=20+=20fail_ignore_count,=0A-=09=09=09=09=20= success_count=20+=20fail_count=20+=20fail_ignore_count,=0A-=09=09=09=09=20= fail_ignore_count);=0A-=0A-=09putchar('\n');=0A-=09for=20(i=20=3D=20= strlen(buf);=20i=20>=200;=20i--)=0A-=09=09putchar('=3D');=0A-=09= printf("\n%s\n",=20buf);=0A-=09for=20(i=20=3D=20strlen(buf);=20i=20>=20= 0;=20i--)=0A-=09=09putchar('=3D');=0A-=09putchar('\n');=0A-=09= putchar('\n');=0A-=0A-=09if=20(file_size(difffilename)=20>=200)=0A-=09{=0A= -=09=09printf(_("The=20differences=20that=20caused=20some=20tests=20to=20= fail=20can=20be=20viewed=20in=20the\n"=0A-=09=09=09=09=20"file=20\"%s\".=20= =20A=20copy=20of=20the=20test=20summary=20that=20you=20see\n"=0A-=09=09=09= =09=20"above=20is=20saved=20in=20the=20file=20\"%s\".\n\n"),=0A-=09=09=09= =20=20=20difffilename,=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=_2D40F15D-78C8-417E-B488-6EB628C0A875--