Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wF57j-004j7Y-2Y for pgsql-hackers@arkaria.postgresql.org; Tue, 21 Apr 2026 07:02:20 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wF57i-0072kr-2f for pgsql-hackers@arkaria.postgresql.org; Tue, 21 Apr 2026 07:02:18 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wF57h-0072ki-2e for pgsql-hackers@lists.postgresql.org; Tue, 21 Apr 2026 07:02:18 +0000 Received: from mail-pf1-x42b.google.com ([2607:f8b0:4864:20::42b]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wF57e-000000022ti-0PTG for pgsql-hackers@lists.postgresql.org; Tue, 21 Apr 2026 07:02:16 +0000 Received: by mail-pf1-x42b.google.com with SMTP id d2e1a72fcca58-82418b0178cso2405569b3a.1 for ; Tue, 21 Apr 2026 00:02:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776754933; x=1777359733; darn=lists.postgresql.org; h=references:to:cc:in-reply-to:date:subject:mime-version:message-id :from:from:to:cc:subject:date:message-id:reply-to; bh=TPsj2acycHNzj/FErV1b3phUgu+l3ve52RgXrVDISX8=; b=DqiWmPR7RCcjofQtkbe+vdwZlBtNIbO4g+/mor85JyRb6rK7cEwXsiLEAx3ArlcZEb 69Vpb7RWBFQBRe5ZxskapZ+uaDQHseEBT8s4VE1rSr1AU/S2U9j9VPc2vIkhxMKbdU+O GM9zbiql+eJuD0QOPwcQNtWA3Dl3p+Twibu40LLfr5Eacm73cdD04QlaJDuANNRYJkvO VbgVYVoSFS9f8CPHMeyl+Xx2JuczmymFlFRPZ3BZV2stMntUIiiufZoZ20wS5JLGDVfM BDcXmFxFTQDpLlYB/14DvwOkVCZ+980lIgg+9NjryLqXJhC3NNNf9QSyTWM4uvG2Al9n 69jQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776754933; x=1777359733; h=references:to:cc:in-reply-to:date:subject:mime-version:message-id :from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=TPsj2acycHNzj/FErV1b3phUgu+l3ve52RgXrVDISX8=; b=U+VE99ahJBtqBOQHTgiVQHm9xoqLAStH/HmAUCoSMNhZRVZDzgJVfG4dJOgmgNKPs+ mUVd/c2uRKDpmoyUMC0+ZvCYJSHFK1vcEElsVLFlL81ZSzokuA+G0I9qypzRvTMdSXxn nbXotxyZuTvksYxOy70HB2rvxNPkpKpWU90eitdMTgNuRdZJrqv/3Fw3yjdNThggiDk7 8yQY066Zury7ClWpm5898tb/1R/xmFzkZ5dvmt7TQgi5xHVv0QNYISlHOwMXw+K7wPwX v4iEw4+XkFiYek39fQkyqZFh9otLIrRHNg2ZzVr5uleo7Cusn0uwISusedCn2J1ruah2 9ojg== X-Gm-Message-State: AOJu0YyvSGtCBqiNUY9e3fRPsGiHQZHlpRk/bev0Yf7Hnlp/7vfiP4FF FRWJmfUoOoNKzYq/c9fnonWw5KAriWXiRIdUseaoH9KP9BMWtDqelryW X-Gm-Gg: AeBDietCvrUOuN/2f2RPKruhakhAqE9eRxy60pIZgft252gDoY+TUEIRyp+EvZLIr4l JeoMzgtZ+I/OupDUP9pMfXP50VmHiId4RAHlPblDF6x+HFkDWv3ERrMVzhd16fYo+htCWl5WmrR su7kMsGq5xGyLKAzmkimaT/afcNvYDe6qfDwqwTvMRooa+60C8pewsj0PBbddXACLi2RVM9818L pzvSld4sd9/uxObhYmkWbRi6R1wkqQwKa1M2I+OBIVtXcnjIOHsm1vsy2yUBW/ji4GkiFcSR9Ms GYkABakna+gcrHTSZZHb+8fIrv2iS80hVzzu9NADA4IcnEFma/u9HmKHAXI1xL83XYwIy32CHzf NDXEze2JcTP0ma6du2TudZUWgfP2XRyjz/URpgH7dJ4Nd9k00uIj7vAklM0Ogh4P+MFQ4UypG+G XGKVnbRRNoknLh+7+tPfY24m67lc4o0uSij/YYbvtngg== X-Received: by 2002:a05:6a00:17a1:b0:82f:6e7:152d with SMTP id d2e1a72fcca58-82f8c850ea1mr17407257b3a.21.1776754933281; Tue, 21 Apr 2026 00:02:13 -0700 (PDT) Received: from smtpclient.apple ([45.32.121.103]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82f8ebe41cfsm13543370b3a.43.2026.04.21.00.02.09 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 21 Apr 2026 00:02:12 -0700 (PDT) From: Chao Li Message-Id: <43421A9F-BA0D-4BB8-B9DB-61EB5C2D686F@gmail.com> Content-Type: multipart/mixed; boundary="Apple-Mail=_B830DCCB-64C7-4AD6-938E-E4A843BDEE74" Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3864.400.21\)) Subject: Re: Cleanup shadows variable warnings, round 1 Date: Tue, 21 Apr 2026 15:01:31 +0800 In-Reply-To: Cc: Postgres hackers , Peter Eisentraut , Peter Smith To: =?utf-8?Q?=C3=81lvaro_Herrera?= References: <202603031015.s6lmrgi7x67r@alvherre.pgsql> X-Mailer: Apple Mail (2.3864.400.21) List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --Apple-Mail=_B830DCCB-64C7-4AD6-938E-E4A843BDEE74 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 > On Mar 4, 2026, at 14:17, Chao Li wrote: >=20 >=20 >=20 >> On Mar 3, 2026, at 18:26, =C3=81lvaro Herrera = wrote: >>=20 >> 1. if you rename a function argument, then the function declaration >> should match the new name as well. >=20 > Fully addressed. >=20 >> 2. xlogrecovery.c has far too many global variables. Can we use this >> opportunity to try to get rid of some of them? Especially one called >> "xlogreader" is I think quite bug-prone. >=20 > I looked into this. There are quite a few file-scope static variables = and global variables, and getting rid of them would likely require a = fairly large refactoring. >=20 > For now, I worked out an approach that wraps the file-scope static = variables into a structure. I moved this change to the last commit and = marked it as WIP. I plan to spend more time on the refactoring. >=20 > In the meantime, I wonder if it would make sense to handle this = refactoring in a separate patch. >=20 >>=20 >> 3. I disagree with some of the choices made; for instance rather than >> rename the local "progname" variables in all those places, I would >> rename the global to logging_progname in logging.c; >=20 > The progname conflicts are not caused by logging.c. Instead, it is = declared in postmaster.h: > ``` > extern PGDLLIMPORT const char *progname; > ``` >=20 > I hesitate to rename this global since it is exported, and doing so = might lead to additional changes elsewhere. For now, I moved this commit = to the second last one, and I may spend more time investigating it. >=20 >=20 >> in bringetbitmap >> (0002) I would rename the outer "tmp" to "sizecheck" or something = like >> that. I guess this is mostly matter of mostly arbitrary judgment ... >>=20 >=20 > I updated bringetbitmap to rename the outer variable. >=20 > I also went through the whole patch and tuned a few other names. = Please let me know if you disagree with any of the other renamings. >=20 > PFA v7. Each commit is independent, so they do not need to be pushed = in the same order as in this patch. >=20 > Best regards, > -- > Chao Li (Evan) > HighGo Software Co., Ltd. > https://www.highgo.com/ >=20 >=20 >=20 >=20 > = PFA v8 - rebased and fixed a few new occurrences. Best regards, -- Chao Li (Evan) HighGo Software Co., Ltd. https://www.highgo.com/ --Apple-Mail=_B830DCCB-64C7-4AD6-938E-E4A843BDEE74 Content-Disposition: attachment; filename=v8-0001-cleanup-rename-inner-variables-to-avoid-shadowing.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="v8-0001-cleanup-rename-inner-variables-to-avoid-shadowing.patch" Content-Transfer-Encoding: quoted-printable =46rom=2074774c0aa98563d09127d97c1373c0ef105295de=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20"Chao=20Li=20(Evan)"=20=0A= Date:=20Tue,=202=20Dec=202025=2009:32:58=20+0800=0ASubject:=20[PATCH=20= v8=2001/12]=20cleanup:=20rename=20inner=20variables=20to=20avoid=20= shadowing=0A=20by=20outer=20locals=0A=0AThis=20commit=20fixes=20several=20= cases=20where=20a=20variable=20declared=20in=20an=20inner=0Ascope=20was=20= shadowed=20by=20an=20existing=20local=20variable=20in=20the=20outer=20= scope.=20The=0Achanges=20rename=20the=20inner=20variables=20so=20each=20= identifier=20is=20distinct=20within=0Aits=20respective=20block.=0A=0A= Author:=20Chao=20Li=20=0AReviewed-by:=20Peter=20Smith=20= =0ADiscussion:=20= https://postgr.es/m/CAEoWx2kQ2x5gMaj8tHLJ3=3DjfC+p5YXHkJyHrDTiQw2nn2FJTmQ@= mail.gmail.com=0A---=0A=20src/backend/access/gist/gistbuild.c=20=20=20=20= =20=20=20=20=20|=2013=20++---=0A=20src/backend/commands/extension.c=20=20= =20=20=20=20=20=20=20=20=20=20|=20=208=20+--=0A=20= src/backend/commands/schemacmds.c=20=20=20=20=20=20=20=20=20=20=20|=20=20= 6=20+--=0A=20src/backend/commands/statscmds.c=20=20=20=20=20=20=20=20=20=20= =20=20|=20=206=20+--=0A=20src/backend/commands/tablecmds.c=20=20=20=20=20= =20=20=20=20=20=20=20|=2056=20++++++++++-----------=0A=20= src/backend/commands/trigger.c=20=20=20=20=20=20=20=20=20=20=20=20=20=20= |=2014=20+++---=0A=20src/backend/commands/wait.c=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20|=2012=20++---=0A=20= src/backend/executor/nodeAgg.c=20=20=20=20=20=20=20=20=20=20=20=20=20=20= |=2016=20+++---=0A=20src/backend/executor/nodeValuesscan.c=20=20=20=20=20= =20=20|=20=206=20+--=0A=20src/backend/optimizer/plan/createplan.c=20=20=20= =20=20|=2044=20++++++++--------=0A=20= src/backend/postmaster/datachecksum_state.c=20|=20=208=20+--=0A=20= src/backend/statistics/dependencies.c=20=20=20=20=20=20=20|=2026=20= +++++-----=0A=20src/backend/storage/buffer/bufmgr.c=20=20=20=20=20=20=20=20= =20|=20=206=20+--=0A=20src/backend/utils/adt/jsonpath_exec.c=20=20=20=20=20= =20=20|=2028=20+++++------=0A=20= src/backend/utils/adt/pg_upgrade_support.c=20=20|=20=204=20+-=0A=20= src/backend/utils/adt/ruleutils.c=20=20=20=20=20=20=20=20=20=20=20|=20=20= 6=20+--=0A=20src/backend/utils/adt/varlena.c=20=20=20=20=20=20=20=20=20=20= =20=20=20|=2020=20++++----=0A=20src/backend/utils/mmgr/freepage.c=20=20=20= =20=20=20=20=20=20=20=20|=20=206=20+--=0A=20src/bin/pgbench/pgbench.c=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20|=20=206=20+--=0A=20= src/bin/psql/describe.c=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20|=2030=20+++++------=0A=20src/bin/psql/prompt.c=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20|=2013=20+++--=0A=20= src/fe_utils/print.c=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20|=2010=20++--=0A=20src/interfaces/libpq/fe-connect.c=20= =20=20=20=20=20=20=20=20=20=20|=20=208=20+--=0A=2023=20files=20changed,=20= 172=20insertions(+),=20180=20deletions(-)=0A=0Adiff=20--git=20= a/src/backend/access/gist/gistbuild.c=20= b/src/backend/access/gist/gistbuild.c=0Aindex=207f57c787f4c..4dba76be23d=20= 100644=0A---=20a/src/backend/access/gist/gistbuild.c=0A+++=20= b/src/backend/access/gist/gistbuild.c=0A@@=20-1129,7=20+1129,6=20@@=20= gistbufferinginserttuples(GISTBuildState=20*buildstate,=20Buffer=20= buffer,=20int=20level,=0A=20=09=09int=09=09=09ndownlinks,=0A=20=09=09=09=09= =09i;=0A=20=09=09Buffer=09=09parentBuffer;=0A-=09=09ListCell=20=20=20= *lc;=0A=20=0A=20=09=09/*=20Parent=20may=20have=20changed=20since=20we=20= memorized=20this=20path.=20*/=0A=20=09=09parentBuffer=20=3D=0A@@=20= -1156,10=20+1155,8=20@@=20gistbufferinginserttuples(GISTBuildState=20= *buildstate,=20Buffer=20buffer,=20int=20level,=0A=20=09=09ndownlinks=20=3D= =20list_length(splitinfo);=0A=20=09=09downlinks=20=3D=20= palloc_array(IndexTuple,=20ndownlinks);=0A=20=09=09i=20=3D=200;=0A-=09=09= foreach(lc,=20splitinfo)=0A+=09=09foreach_ptr(GISTPageSplitInfo,=20si,=20= splitinfo)=0A=20=09=09{=0A-=09=09=09GISTPageSplitInfo=20*splitinfo=20=3D=20= lfirst(lc);=0A-=0A=20=09=09=09/*=0A=20=09=09=09=20*=20Remember=20the=20= parent=20of=20each=20new=20child=20page=20in=20our=20parent=20map.=0A=20=09= =09=09=20*=20This=20assumes=20that=20the=20downlinks=20fit=20on=20the=20= parent=20page.=20If=20the=0A@@=20-1169,7=20+1166,7=20@@=20= gistbufferinginserttuples(GISTBuildState=20*buildstate,=20Buffer=20= buffer,=20int=20level,=0A=20=09=09=09=20*/=0A=20=09=09=09if=20(level=20>=20= 0)=0A=20=09=09=09=09gistMemorizeParent(buildstate,=0A-=09=09=09=09=09=09=09= =09=20=20=20BufferGetBlockNumber(splitinfo->buf),=0A+=09=09=09=09=09=09=09= =09=20=20=20BufferGetBlockNumber(si->buf),=0A=20=09=09=09=09=09=09=09=09=20= =20=20BufferGetBlockNumber(parentBuffer));=0A=20=0A=20=09=09=09/*=0A@@=20= -1179,14=20+1176,14=20@@=20gistbufferinginserttuples(GISTBuildState=20= *buildstate,=20Buffer=20buffer,=20int=20level,=0A=20=09=09=09=20*=20= harm).=0A=20=09=09=09=20*/=0A=20=09=09=09if=20(level=20>=201)=0A-=09=09=09= =09gistMemorizeAllDownlinks(buildstate,=20splitinfo->buf);=0A+=09=09=09=09= gistMemorizeAllDownlinks(buildstate,=20si->buf);=0A=20=0A=20=09=09=09/*=0A= =20=09=09=09=20*=20Since=20there's=20no=20concurrent=20access,=20we=20= can=20release=20the=20lower=0A=20=09=09=09=20*=20level=20buffers=20= immediately.=20This=20includes=20the=20original=20page.=0A=20=09=09=09=20= */=0A-=09=09=09UnlockReleaseBuffer(splitinfo->buf);=0A-=09=09=09= downlinks[i++]=20=3D=20splitinfo->downlink;=0A+=09=09=09= UnlockReleaseBuffer(si->buf);=0A+=09=09=09downlinks[i++]=20=3D=20= si->downlink;=0A=20=09=09}=0A=20=0A=20=09=09/*=20Insert=20them=20into=20= parent.=20*/=0Adiff=20--git=20a/src/backend/commands/extension.c=20= b/src/backend/commands/extension.c=0Aindex=20a330b5fd6ce..88e14c075b9=20= 100644=0A---=20a/src/backend/commands/extension.c=0A+++=20= b/src/backend/commands/extension.c=0A@@=20-1453,8=20+1453,8=20@@=20= execute_extension_script(Oid=20extensionOid,=20ExtensionControlFile=20= *control,=0A=20=09=09=09Datum=09=09old=20=3D=20t_sql;=0A=20=09=09=09char=09= =20=20=20*reqextname=20=3D=20(char=20*)=20lfirst(lc);=0A=20=09=09=09Oid=09= =09=09reqschema=20=3D=20lfirst_oid(lc2);=0A-=09=09=09char=09=20=20=20= *schemaName=20=3D=20get_namespace_name(reqschema);=0A-=09=09=09const=20= char=20*qSchemaName=20=3D=20quote_identifier(schemaName);=0A+=09=09=09= char=09=20=20=20*reqSchemaName=20=3D=20get_namespace_name(reqschema);=0A= +=09=09=09const=20char=20*qReqSchemaName=20=3D=20= quote_identifier(reqSchemaName);=0A=20=09=09=09char=09=20=20=20= *repltoken;=0A=20=0A=20=09=09=09repltoken=20=3D=20= psprintf("@extschema:%s@",=20reqextname);=0A@@=20-1462,8=20+1462,8=20@@=20= execute_extension_script(Oid=20extensionOid,=20ExtensionControlFile=20= *control,=0A=20=09=09=09=09=09=09=09=09=09=09=09C_COLLATION_OID,=0A=20=09= =09=09=09=09=09=09=09=09=09=09t_sql,=0A=20=09=09=09=09=09=09=09=09=09=09=09= CStringGetTextDatum(repltoken),=0A-=09=09=09=09=09=09=09=09=09=09=09= CStringGetTextDatum(qSchemaName));=0A-=09=09=09if=20(t_sql=20!=3D=20old=20= &&=20strpbrk(schemaName,=20quoting_relevant_chars))=0A+=09=09=09=09=09=09= =09=09=09=09=09CStringGetTextDatum(qReqSchemaName));=0A+=09=09=09if=20= (t_sql=20!=3D=20old=20&&=20strpbrk(reqSchemaName,=20= quoting_relevant_chars))=0A=20=09=09=09=09ereport(ERROR,=0A=20=09=09=09=09= =09=09(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),=0A=20=09=09=09=09=09= =09=20errmsg("invalid=20character=20in=20extension=20\"%s\"=20schema:=20= must=20not=20contain=20any=20of=20\"%s\"",=0Adiff=20--git=20= a/src/backend/commands/schemacmds.c=20= b/src/backend/commands/schemacmds.c=0Aindex=20bfaa4743cd8..38adb2b0504=20= 100644=0A---=20a/src/backend/commands/schemacmds.c=0A+++=20= b/src/backend/commands/schemacmds.c=0A@@=20-55,7=20+55,6=20@@=20= CreateSchemaCommand(ParseState=20*pstate,=20CreateSchemaStmt=20*stmt,=0A=20= =09const=20char=20*schemaName=20=3D=20stmt->schemaname;=0A=20=09Oid=09=09= =09namespaceId;=0A=20=09List=09=20=20=20*parsetree_list;=0A-=09ListCell=20= =20=20*parsetree_item;=0A=20=09Oid=09=09=09owner_uid;=0A=20=09Oid=09=09=09= saved_uid;=0A=20=09int=09=09=09save_sec_context;=0A@@=20-203,16=20= +202,15=20@@=20CreateSchemaCommand(ParseState=20*pstate,=20= CreateSchemaStmt=20*stmt,=0A=20=09=20*=20them=20through=20= parse_analyze_*()=20or=20the=20rewriter;=20we=20can=20just=20hand=20them=0A= =20=09=20*=20straight=20to=20ProcessUtility.=0A=20=09=20*/=0A-=09= foreach(parsetree_item,=20parsetree_list)=0A+=09foreach_ptr(Node,=20= substmt,=20parsetree_list)=0A=20=09{=0A-=09=09Node=09=20=20=20*stmt=20=3D=20= (Node=20*)=20lfirst(parsetree_item);=0A=20=09=09PlannedStmt=20*wrapper;=0A= =20=0A=20=09=09/*=20need=20to=20make=20a=20wrapper=20PlannedStmt=20*/=0A=20= =09=09wrapper=20=3D=20makeNode(PlannedStmt);=0A=20=09=09= wrapper->commandType=20=3D=20CMD_UTILITY;=0A=20=09=09wrapper->canSetTag=20= =3D=20false;=0A-=09=09wrapper->utilityStmt=20=3D=20stmt;=0A+=09=09= wrapper->utilityStmt=20=3D=20substmt;=0A=20=09=09wrapper->stmt_location=20= =3D=20stmt_location;=0A=20=09=09wrapper->stmt_len=20=3D=20stmt_len;=0A=20= =09=09wrapper->planOrigin=20=3D=20PLAN_STMT_INTERNAL;=0Adiff=20--git=20= a/src/backend/commands/statscmds.c=20b/src/backend/commands/statscmds.c=0A= index=20b354723be44..1dd22dbd583=20100644=0A---=20= a/src/backend/commands/statscmds.c=0A+++=20= b/src/backend/commands/statscmds.c=0A@@=20-349,15=20+349,15=20@@=20= CreateStatistics(CreateStatsStmt=20*stmt,=20bool=20check_rights)=0A=20=09= =09=09Node=09=20=20=20*expr=20=3D=20selem->expr;=0A=20=09=09=09Oid=09=09=09= atttype;=0A=20=09=09=09TypeCacheEntry=20*type;=0A-=09=09=09Bitmapset=20=20= *attnums=20=3D=20NULL;=0A+=09=09=09Bitmapset=20=20*attnums_bms=20=3D=20= NULL;=0A=20=09=09=09int=09=09=09k;=0A=20=0A=20=09=09=09Assert(expr=20!=3D=20= NULL);=0A=20=0A-=09=09=09pull_varattnos(expr,=201,=20&attnums);=0A+=09=09= =09pull_varattnos(expr,=201,=20&attnums_bms);=0A=20=0A=20=09=09=09k=20=3D=20= -1;=0A-=09=09=09while=20((k=20=3D=20bms_next_member(attnums,=20k))=20>=3D=20= 0)=0A+=09=09=09while=20((k=20=3D=20bms_next_member(attnums_bms,=20k))=20= >=3D=200)=0A=20=09=09=09{=0A=20=09=09=09=09AttrNumber=09attnum=20=3D=20k=20= +=20FirstLowInvalidHeapAttributeNumber;=0A=20=0Adiff=20--git=20= a/src/backend/commands/tablecmds.c=20b/src/backend/commands/tablecmds.c=0A= index=20eec09ba1ded..7b3bb4a211a=20100644=0A---=20= a/src/backend/commands/tablecmds.c=0A+++=20= b/src/backend/commands/tablecmds.c=0A@@=20-15962,14=20+15962,14=20@@=20= ATPostAlterTypeParse(Oid=20oldId,=20Oid=20oldRelId,=20Oid=20refRelId,=20= char=20*cmd,=0A=20=0A=20=09=09=09foreach(lcmd,=20stmt->cmds)=0A=20=09=09=09= {=0A-=09=09=09=09AlterTableCmd=20*cmd=20=3D=20lfirst_node(AlterTableCmd,=20= lcmd);=0A+=09=09=09=09AlterTableCmd=20*subcmd=20=3D=20= lfirst_node(AlterTableCmd,=20lcmd);=0A=20=0A-=09=09=09=09if=20= (cmd->subtype=20=3D=3D=20AT_AddIndex)=0A+=09=09=09=09if=20= (subcmd->subtype=20=3D=3D=20AT_AddIndex)=0A=20=09=09=09=09{=0A=20=09=09=09= =09=09IndexStmt=20=20*indstmt;=0A=20=09=09=09=09=09Oid=09=09=09indoid;=0A= =20=0A-=09=09=09=09=09indstmt=20=3D=20castNode(IndexStmt,=20cmd->def);=0A= +=09=09=09=09=09indstmt=20=3D=20castNode(IndexStmt,=20subcmd->def);=0A=20= =09=09=09=09=09indoid=20=3D=20get_constraint_index(oldId);=0A=20=0A=20=09= =09=09=09=09if=20(!rewrite)=0A@@=20-15979,9=20+15979,9=20@@=20= ATPostAlterTypeParse(Oid=20oldId,=20Oid=20oldRelId,=20Oid=20refRelId,=20= char=20*cmd,=0A=20=09=09=09=09=09=09=09=09=09=09=09=09=09=20= RelationRelationId,=200);=0A=20=09=09=09=09=09= indstmt->reset_default_tblspc=20=3D=20true;=0A=20=0A-=09=09=09=09=09= cmd->subtype=20=3D=20AT_ReAddIndex;=0A+=09=09=09=09=09subcmd->subtype=20= =3D=20AT_ReAddIndex;=0A=20=09=09=09=09=09tab->subcmds[AT_PASS_OLD_INDEX]=20= =3D=0A-=09=09=09=09=09=09lappend(tab->subcmds[AT_PASS_OLD_INDEX],=20= cmd);=0A+=09=09=09=09=09=09lappend(tab->subcmds[AT_PASS_OLD_INDEX],=20= subcmd);=0A=20=0A=20=09=09=09=09=09/*=20recreate=20any=20comment=20on=20= the=20constraint=20*/=0A=20=09=09=09=09=09RebuildConstraintComment(tab,=0A= @@=20-15991,9=20+15991,9=20@@=20ATPostAlterTypeParse(Oid=20oldId,=20Oid=20= oldRelId,=20Oid=20refRelId,=20char=20*cmd,=0A=20=09=09=09=09=09=09=09=09=09= =09=09=20NIL,=0A=20=09=09=09=09=09=09=09=09=09=09=09=20= indstmt->idxname);=0A=20=09=09=09=09}=0A-=09=09=09=09else=20if=20= (cmd->subtype=20=3D=3D=20AT_AddConstraint)=0A+=09=09=09=09else=20if=20= (subcmd->subtype=20=3D=3D=20AT_AddConstraint)=0A=20=09=09=09=09{=0A-=09=09= =09=09=09Constraint=20*con=20=3D=20castNode(Constraint,=20cmd->def);=0A+=09= =09=09=09=09Constraint=20*con=20=3D=20castNode(Constraint,=20= subcmd->def);=0A=20=0A=20=09=09=09=09=09con->old_pktable_oid=20=3D=20= refRelId;=0A=20=09=09=09=09=09/*=20rewriting=20neither=20side=20of=20a=20= FK=20*/=0A@@=20-16001,9=20+16001,9=20@@=20ATPostAlterTypeParse(Oid=20= oldId,=20Oid=20oldRelId,=20Oid=20refRelId,=20char=20*cmd,=0A=20=09=09=09=09= =09=09!rewrite=20&&=20tab->rewrite=20=3D=3D=200)=0A=20=09=09=09=09=09=09= TryReuseForeignKey(oldId,=20con);=0A=20=09=09=09=09=09= con->reset_default_tblspc=20=3D=20true;=0A-=09=09=09=09=09cmd->subtype=20= =3D=20AT_ReAddConstraint;=0A+=09=09=09=09=09subcmd->subtype=20=3D=20= AT_ReAddConstraint;=0A=20=09=09=09=09=09tab->subcmds[AT_PASS_OLD_CONSTR]=20= =3D=0A-=09=09=09=09=09=09lappend(tab->subcmds[AT_PASS_OLD_CONSTR],=20= cmd);=0A+=09=09=09=09=09=09lappend(tab->subcmds[AT_PASS_OLD_CONSTR],=20= subcmd);=0A=20=0A=20=09=09=09=09=09/*=0A=20=09=09=09=09=09=20*=20= Recreate=20any=20comment=20on=20the=20constraint.=20=20If=20we=20have=0A= @@=20-16023,7=20+16023,7=20@@=20ATPostAlterTypeParse(Oid=20oldId,=20Oid=20= oldRelId,=20Oid=20refRelId,=20char=20*cmd,=0A=20=09=09=09=09}=0A=20=09=09= =09=09else=0A=20=09=09=09=09=09elog(ERROR,=20"unexpected=20statement=20= subtype:=20%d",=0A-=09=09=09=09=09=09=20(int)=20cmd->subtype);=0A+=09=09=09= =09=09=09=20(int)=20subcmd->subtype);=0A=20=09=09=09}=0A=20=09=09}=0A=20=09= =09else=20if=20(IsA(stm,=20AlterDomainStmt))=0A@@=20-16033,12=20= +16033,12=20@@=20ATPostAlterTypeParse(Oid=20oldId,=20Oid=20oldRelId,=20= Oid=20refRelId,=20char=20*cmd,=0A=20=09=09=09if=20(stmt->subtype=20=3D=3D=20= AD_AddConstraint)=0A=20=09=09=09{=0A=20=09=09=09=09Constraint=20*con=20=3D= =20castNode(Constraint,=20stmt->def);=0A-=09=09=09=09AlterTableCmd=20= *cmd=20=3D=20makeNode(AlterTableCmd);=0A+=09=09=09=09AlterTableCmd=20= *subcmd=20=3D=20makeNode(AlterTableCmd);=0A=20=0A-=09=09=09=09= cmd->subtype=20=3D=20AT_ReAddDomainConstraint;=0A-=09=09=09=09cmd->def=20= =3D=20(Node=20*)=20stmt;=0A+=09=09=09=09subcmd->subtype=20=3D=20= AT_ReAddDomainConstraint;=0A+=09=09=09=09subcmd->def=20=3D=20(Node=20*)=20= stmt;=0A=20=09=09=09=09tab->subcmds[AT_PASS_OLD_CONSTR]=20=3D=0A-=09=09=09= =09=09lappend(tab->subcmds[AT_PASS_OLD_CONSTR],=20cmd);=0A+=09=09=09=09=09= lappend(tab->subcmds[AT_PASS_OLD_CONSTR],=20subcmd);=0A=20=0A=20=09=09=09= =09/*=20recreate=20any=20comment=20on=20the=20constraint=20*/=0A=20=09=09= =09=09RebuildConstraintComment(tab,=0A@@=20-22599,7=20+22599,7=20@@=20= createTableConstraints(List=20**wqueue,=20AlteredTableInfo=20*tab,=0A=20=09= =09bool=09=09ccvalid=20=3D=20constr->check[ccnum].ccvalid;=0A=20=09=09= Node=09=20=20=20*ccbin_node;=0A=20=09=09bool=09=09found_whole_row;=0A-=09= =09Constraint=20*constr;=0A+=09=09Constraint=20*cons;=0A=20=0A=20=09=09= /*=0A=20=09=09=20*=20The=20partitioned=20table=20can=20not=20have=20a=20= NO=20INHERIT=20check=20constraint=0A@@=20-22621,19=20+22621,19=20@@=20= createTableConstraints(List=20**wqueue,=20AlteredTableInfo=20*tab,=0A=20=09= =09=09=09=20ccname,=0A=20=09=09=09=09=20= RelationGetRelationName(parent_rel));=0A=20=0A-=09=09constr=20=3D=20= makeNode(Constraint);=0A-=09=09constr->contype=20=3D=20CONSTR_CHECK;=0A-=09= =09constr->conname=20=3D=20pstrdup(ccname);=0A-=09=09constr->deferrable=20= =3D=20false;=0A-=09=09constr->initdeferred=20=3D=20false;=0A-=09=09= constr->is_enforced=20=3D=20ccenforced;=0A-=09=09constr->skip_validation=20= =3D=20!ccvalid;=0A-=09=09constr->initially_valid=20=3D=20ccvalid;=0A-=09=09= constr->is_no_inherit=20=3D=20ccnoinherit;=0A-=09=09constr->raw_expr=20=3D= =20NULL;=0A-=09=09constr->cooked_expr=20=3D=20nodeToString(ccbin_node);=0A= -=09=09constr->location=20=3D=20-1;=0A-=09=09constraints=20=3D=20= lappend(constraints,=20constr);=0A+=09=09cons=20=3D=20= makeNode(Constraint);=0A+=09=09cons->contype=20=3D=20CONSTR_CHECK;=0A+=09= =09cons->conname=20=3D=20pstrdup(ccname);=0A+=09=09cons->deferrable=20=3D=20= false;=0A+=09=09cons->initdeferred=20=3D=20false;=0A+=09=09= cons->is_enforced=20=3D=20ccenforced;=0A+=09=09cons->skip_validation=20=3D= =20!ccvalid;=0A+=09=09cons->initially_valid=20=3D=20ccvalid;=0A+=09=09= cons->is_no_inherit=20=3D=20ccnoinherit;=0A+=09=09cons->raw_expr=20=3D=20= NULL;=0A+=09=09cons->cooked_expr=20=3D=20nodeToString(ccbin_node);=0A+=09= =09cons->location=20=3D=20-1;=0A+=09=09constraints=20=3D=20= lappend(constraints,=20cons);=0A=20=09}=0A=20=0A=20=09/*=20Install=20all=20= CHECK=20constraints.=20*/=0Adiff=20--git=20= a/src/backend/commands/trigger.c=20b/src/backend/commands/trigger.c=0A= index=20da0d1ba6791..38f42c6f706=20100644=0A---=20= a/src/backend/commands/trigger.c=0A+++=20= b/src/backend/commands/trigger.c=0A@@=20-1167,7=20+1167,7=20@@=20= CreateTriggerFiringOn(const=20CreateTrigStmt=20*stmt,=20const=20char=20= *queryString,=0A=20=09=09{=0A=20=09=09=09CreateTrigStmt=20*childStmt;=0A=20= =09=09=09Relation=09childTbl;=0A-=09=09=09Node=09=20=20=20*qual;=0A+=09=09= =09Node=09=20=20=20*partqual;=0A=20=0A=20=09=09=09childTbl=20=3D=20= table_open(partdesc->oids[i],=20ShareRowExclusiveLock);=0A=20=0A@@=20= -1180,18=20+1180,18=20@@=20CreateTriggerFiringOn(const=20CreateTrigStmt=20= *stmt,=20const=20char=20*queryString,=0A=20=09=09=09= childStmt->whenClause=20=3D=20NULL;=0A=20=0A=20=09=09=09/*=20If=20there=20= is=20a=20WHEN=20clause,=20create=20a=20modified=20copy=20of=20it=20*/=0A= -=09=09=09qual=20=3D=20copyObject(whenClause);=0A-=09=09=09qual=20=3D=20= (Node=20*)=0A-=09=09=09=09map_partition_varattnos((List=20*)=20qual,=20= PRS2_OLD_VARNO,=0A+=09=09=09partqual=20=3D=20copyObject(whenClause);=0A+=09= =09=09partqual=20=3D=20(Node=20*)=0A+=09=09=09=09= map_partition_varattnos((List=20*)=20partqual,=20PRS2_OLD_VARNO,=0A=20=09= =09=09=09=09=09=09=09=09=09childTbl,=20rel);=0A-=09=09=09qual=20=3D=20= (Node=20*)=0A-=09=09=09=09map_partition_varattnos((List=20*)=20qual,=20= PRS2_NEW_VARNO,=0A+=09=09=09partqual=20=3D=20(Node=20*)=0A+=09=09=09=09= map_partition_varattnos((List=20*)=20partqual,=20PRS2_NEW_VARNO,=0A=20=09= =09=09=09=09=09=09=09=09=09childTbl,=20rel);=0A=20=0A=20=09=09=09= CreateTriggerFiringOn(childStmt,=20queryString,=0A=20=09=09=09=09=09=09=09= =09=20=20partdesc->oids[i],=20refRelOid,=0A=20=09=09=09=09=09=09=09=09=20= =20InvalidOid,=20InvalidOid,=0A-=09=09=09=09=09=09=09=09=20=20funcoid,=20= trigoid,=20qual,=0A+=09=09=09=09=09=09=09=09=20=20funcoid,=20trigoid,=20= partqual,=0A=20=09=09=09=09=09=09=09=09=20=20isInternal,=20true,=20= trigger_fires_when);=0A=20=0A=20=09=09=09table_close(childTbl,=20= NoLock);=0Adiff=20--git=20a/src/backend/commands/wait.c=20= b/src/backend/commands/wait.c=0Aindex=20382d5c2d44f..2fa65a22632=20= 100644=0A---=20a/src/backend/commands/wait.c=0A+++=20= b/src/backend/commands/wait.c=0A@@=20-92,7=20+92,7=20@@=20= ExecWaitStmt(ParseState=20*pstate,=20WaitStmt=20*stmt,=20bool=20= isTopLevel,=0A=20=09=09{=0A=20=09=09=09char=09=20=20=20*timeout_str;=0A=20= =09=09=09const=20char=20*hintmsg;=0A-=09=09=09double=09=09result;=0A+=09=09= =09double=09=09timeout_val;=0A=20=0A=20=09=09=09if=20(timeout_specified)=0A= =20=09=09=09=09errorConflictingDefElem(defel,=20pstate);=0A@@=20-100,7=20= +100,7=20@@=20ExecWaitStmt(ParseState=20*pstate,=20WaitStmt=20*stmt,=20= bool=20isTopLevel,=0A=20=0A=20=09=09=09timeout_str=20=3D=20= defGetString(defel);=0A=20=0A-=09=09=09if=20(!parse_real(timeout_str,=20= &result,=20GUC_UNIT_MS,=20&hintmsg))=0A+=09=09=09if=20= (!parse_real(timeout_str,=20&timeout_val,=20GUC_UNIT_MS,=20&hintmsg))=0A=20= =09=09=09{=0A=20=09=09=09=09ereport(ERROR,=0A=20=09=09=09=09=09=09= errcode(ERRCODE_INVALID_PARAMETER_VALUE),=0A@@=20-113,20=20+113,20=20@@=20= ExecWaitStmt(ParseState=20*pstate,=20WaitStmt=20*stmt,=20bool=20= isTopLevel,=0A=20=09=09=09=20*=20don't=20fail=20on=20just-out-of-range=20= values=20that=20would=20round=20into=0A=20=09=09=09=20*=20range.=0A=20=09= =09=09=20*/=0A-=09=09=09result=20=3D=20rint(result);=0A+=09=09=09= timeout_val=20=3D=20rint(timeout_val);=0A=20=0A=20=09=09=09/*=20Range=20= check=20*/=0A-=09=09=09if=20(unlikely(isnan(result)=20||=20= !FLOAT8_FITS_IN_INT64(result)))=0A+=09=09=09if=20= (unlikely(isnan(timeout_val)=20||=20!FLOAT8_FITS_IN_INT64(timeout_val)))=0A= =20=09=09=09=09ereport(ERROR,=0A=20=09=09=09=09=09=09= errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),=0A=20=09=09=09=09=09=09= errmsg("timeout=20value=20is=20out=20of=20range"));=0A=20=0A-=09=09=09if=20= (result=20<=200)=0A+=09=09=09if=20(timeout_val=20<=200)=0A=20=09=09=09=09= ereport(ERROR,=0A=20=09=09=09=09=09=09= errcode(ERRCODE_INVALID_PARAMETER_VALUE),=0A=20=09=09=09=09=09=09= errmsg("timeout=20cannot=20be=20negative"));=0A=20=0A-=09=09=09timeout=20= =3D=20(int64)=20result;=0A+=09=09=09timeout=20=3D=20(int64)=20= timeout_val;=0A=20=09=09}=0A=20=09=09else=20if=20(strcmp(defel->defname,=20= "no_throw")=20=3D=3D=200)=0A=20=09=09{=0Adiff=20--git=20= a/src/backend/executor/nodeAgg.c=20b/src/backend/executor/nodeAgg.c=0A= index=20925caadd2ce..103dee7ec8e=20100644=0A---=20= a/src/backend/executor/nodeAgg.c=0A+++=20= b/src/backend/executor/nodeAgg.c=0A@@=20-4067,12=20+4067,12=20@@=20= ExecInitAgg(Agg=20*node,=20EState=20*estate,=20int=20eflags)=0A=20=09=20= */=0A=20=09for=20(phaseidx=20=3D=200;=20phaseidx=20<=20= aggstate->numphases;=20phaseidx++)=0A=20=09{=0A-=09=09AggStatePerPhase=20= phase=20=3D=20&aggstate->phases[phaseidx];=0A+=09=09AggStatePerPhase=20= curphase=20=3D=20&aggstate->phases[phaseidx];=0A=20=09=09bool=09=09= dohash=20=3D=20false;=0A=20=09=09bool=09=09dosort=20=3D=20false;=0A=20=0A= =20=09=09/*=20phase=200=20doesn't=20necessarily=20exist=20*/=0A-=09=09if=20= (!phase->aggnode)=0A+=09=09if=20(!curphase->aggnode)=0A=20=09=09=09= continue;=0A=20=0A=20=09=09if=20(aggstate->aggstrategy=20=3D=3D=20= AGG_MIXED=20&&=20phaseidx=20=3D=3D=201)=0A@@=20-4093,13=20+4093,13=20@@=20= ExecInitAgg(Agg=20*node,=20EState=20*estate,=20int=20eflags)=0A=20=09=09=09= =20*/=0A=20=09=09=09continue;=0A=20=09=09}=0A-=09=09else=20if=20= (phase->aggstrategy=20=3D=3D=20AGG_PLAIN=20||=0A-=09=09=09=09=20= phase->aggstrategy=20=3D=3D=20AGG_SORTED)=0A+=09=09else=20if=20= (curphase->aggstrategy=20=3D=3D=20AGG_PLAIN=20||=0A+=09=09=09=09=20= curphase->aggstrategy=20=3D=3D=20AGG_SORTED)=0A=20=09=09{=0A=20=09=09=09= dohash=20=3D=20false;=0A=20=09=09=09dosort=20=3D=20true;=0A=20=09=09}=0A= -=09=09else=20if=20(phase->aggstrategy=20=3D=3D=20AGG_HASHED)=0A+=09=09= else=20if=20(curphase->aggstrategy=20=3D=3D=20AGG_HASHED)=0A=20=09=09{=0A= =20=09=09=09dohash=20=3D=20true;=0A=20=09=09=09dosort=20=3D=20false;=0A= @@=20-4107,11=20+4107,11=20@@=20ExecInitAgg(Agg=20*node,=20EState=20= *estate,=20int=20eflags)=0A=20=09=09else=0A=20=09=09=09Assert(false);=0A=20= =0A-=09=09phase->evaltrans=20=3D=20ExecBuildAggTrans(aggstate,=20phase,=20= dosort,=20dohash,=0A-=09=09=09=09=09=09=09=09=09=09=09=20false);=0A+=09=09= curphase->evaltrans=20=3D=20ExecBuildAggTrans(aggstate,=20curphase,=20= dosort,=20dohash,=0A+=09=09=09=09=09=09=09=09=09=09=09=09false);=0A=20=0A= =20=09=09/*=20cache=20compiled=20expression=20for=20outer=20slot=20= without=20NULL=20check=20*/=0A-=09=09phase->evaltrans_cache[0][0]=20=3D=20= phase->evaltrans;=0A+=09=09curphase->evaltrans_cache[0][0]=20=3D=20= curphase->evaltrans;=0A=20=09}=0A=20=0A=20=09return=20aggstate;=0Adiff=20= --git=20a/src/backend/executor/nodeValuesscan.c=20= b/src/backend/executor/nodeValuesscan.c=0Aindex=20= effc896ea1c..6d38fc5d26b=20100644=0A---=20= a/src/backend/executor/nodeValuesscan.c=0A+++=20= b/src/backend/executor/nodeValuesscan.c=0A@@=20-90,7=20+90,6=20@@=20= ValuesNext(ValuesScanState=20*node)=0A=20=09=09MemoryContext=20= oldContext;=0A=20=09=09Datum=09=20=20=20*values;=0A=20=09=09bool=09=20=20= =20*isnull;=0A-=09=09ListCell=20=20=20*lc;=0A=20=09=09int=09=09=09= resind;=0A=20=0A=20=09=09/*=0A@@=20-139,13=20+138,12=20@@=20= ValuesNext(ValuesScanState=20*node)=0A=20=09=09isnull=20=3D=20= slot->tts_isnull;=0A=20=0A=20=09=09resind=20=3D=200;=0A-=09=09= foreach(lc,=20exprstatelist)=0A+=09=09foreach_ptr(ExprState,=20= exprstate,=20exprstatelist)=0A=20=09=09{=0A-=09=09=09ExprState=20=20= *estate=20=3D=20(ExprState=20*)=20lfirst(lc);=0A=20=09=09=09= CompactAttribute=20*attr=20=3D=20= TupleDescCompactAttr(slot->tts_tupleDescriptor,=0A=20=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=20=20resind);=0A=20=0A-=09=09=09values[resind]=20=3D= =20ExecEvalExpr(estate,=0A+=09=09=09values[resind]=20=3D=20= ExecEvalExpr(exprstate,=0A=20=09=09=09=09=09=09=09=09=09=09=20=20= econtext,=0A=20=09=09=09=09=09=09=09=09=09=09=20=20&isnull[resind]);=0A=20= =0Adiff=20--git=20a/src/backend/optimizer/plan/createplan.c=20= b/src/backend/optimizer/plan/createplan.c=0Aindex=20= de6a183da79..fd41fc84113=20100644=0A---=20= a/src/backend/optimizer/plan/createplan.c=0A+++=20= b/src/backend/optimizer/plan/createplan.c=0A@@=20-1235,16=20+1235,16=20= @@=20create_append_plan(PlannerInfo=20*root,=20AppendPath=20*best_path,=20= int=20flags)=0A=20=09if=20(best_path->subpaths=20=3D=3D=20NIL)=0A=20=09{=0A= =20=09=09/*=20Generate=20a=20Result=20plan=20with=20constant-FALSE=20= gating=20qual=20*/=0A-=09=09Plan=09=20=20=20*plan;=0A+=09=09Plan=09=20=20= =20*resplan;=0A=20=0A-=09=09plan=20=3D=20(Plan=20*)=20= make_one_row_result(tlist,=0A-=09=09=09=09=09=09=09=09=09=09=09(Node=20= *)=20list_make1(makeBoolConst(false,=0A-=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=20=20false)),=0A-=09=09=09=09=09=09=09=09=09=09=09= best_path->path.parent);=0A+=09=09resplan=20=3D=20(Plan=20*)=20= make_one_row_result(tlist,=0A+=09=09=09=09=09=09=09=09=09=09=09=20=20=20= (Node=20*)=20list_make1(makeBoolConst(false,=0A+=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=20false)),=0A+=09=09=09=09=09=09=09=09=09= =09=09=20=20=20best_path->path.parent);=0A=20=0A-=09=09= copy_generic_path_info(plan,=20(Path=20*)=20best_path);=0A+=09=09= copy_generic_path_info(resplan,=20(Path=20*)=20best_path);=0A=20=0A-=09=09= return=20plan;=0A+=09=09return=20resplan;=0A=20=09}=0A=20=0A=20=09/*=0A= @@=20-2407,7=20+2407,7=20@@=20create_minmaxagg_plan(PlannerInfo=20*root,=20= MinMaxAggPath=20*best_path)=0A=20=09=09MinMaxAggInfo=20*mminfo=20=3D=20= (MinMaxAggInfo=20*)=20lfirst(lc);=0A=20=09=09PlannerInfo=20*subroot=20=3D=20= mminfo->subroot;=0A=20=09=09Query=09=20=20=20*subparse=20=3D=20= subroot->parse;=0A-=09=09Plan=09=20=20=20*plan;=0A+=09=09Plan=09=20=20=20= *initplan;=0A=20=0A=20=09=09/*=0A=20=09=09=20*=20Generate=20the=20plan=20= for=20the=20subquery.=20We=20already=20have=20a=20Path,=20but=20we=0A@@=20= -2415,25=20+2415,25=20@@=20create_minmaxagg_plan(PlannerInfo=20*root,=20= MinMaxAggPath=20*best_path)=0A=20=09=09=20*=20Since=20we=20are=20= entering=20a=20different=20planner=20context=20(subroot),=0A=20=09=09=20= *=20recurse=20to=20create_plan=20not=20create_plan_recurse.=0A=20=09=09=20= */=0A-=09=09plan=20=3D=20create_plan(subroot,=20mminfo->path);=0A+=09=09= initplan=20=3D=20create_plan(subroot,=20mminfo->path);=0A=20=0A-=09=09= plan=20=3D=20(Plan=20*)=20make_limit(plan,=0A-=09=09=09=09=09=09=09=09=20= =20=20subparse->limitOffset,=0A-=09=09=09=09=09=09=09=09=20=20=20= subparse->limitCount,=0A-=09=09=09=09=09=09=09=09=20=20=20= subparse->limitOption,=0A-=09=09=09=09=09=09=09=09=20=20=200,=20NULL,=20= NULL,=20NULL);=0A+=09=09initplan=20=3D=20(Plan=20*)=20= make_limit(initplan,=0A+=09=09=09=09=09=09=09=09=09=20=20=20= subparse->limitOffset,=0A+=09=09=09=09=09=09=09=09=09=20=20=20= subparse->limitCount,=0A+=09=09=09=09=09=09=09=09=09=20=20=20= subparse->limitOption,=0A+=09=09=09=09=09=09=09=09=09=20=20=200,=20NULL,=20= NULL,=20NULL);=0A=20=0A=20=09=09/*=20Must=20apply=20correct=20cost/width=20= data=20to=20Limit=20node=20*/=0A-=09=09plan->disabled_nodes=20=3D=20= mminfo->path->disabled_nodes;=0A-=09=09plan->startup_cost=20=3D=20= mminfo->path->startup_cost;=0A-=09=09plan->total_cost=20=3D=20= mminfo->pathcost;=0A-=09=09plan->plan_rows=20=3D=201;=0A-=09=09= plan->plan_width=20=3D=20mminfo->path->pathtarget->width;=0A-=09=09= plan->parallel_aware=20=3D=20false;=0A-=09=09plan->parallel_safe=20=3D=20= mminfo->path->parallel_safe;=0A+=09=09initplan->disabled_nodes=20=3D=20= mminfo->path->disabled_nodes;=0A+=09=09initplan->startup_cost=20=3D=20= mminfo->path->startup_cost;=0A+=09=09initplan->total_cost=20=3D=20= mminfo->pathcost;=0A+=09=09initplan->plan_rows=20=3D=201;=0A+=09=09= initplan->plan_width=20=3D=20mminfo->path->pathtarget->width;=0A+=09=09= initplan->parallel_aware=20=3D=20false;=0A+=09=09initplan->parallel_safe=20= =3D=20mminfo->path->parallel_safe;=0A=20=0A=20=09=09/*=20Convert=20the=20= plan=20into=20an=20InitPlan=20in=20the=20outer=20query.=20*/=0A-=09=09= SS_make_initplan_from_plan(root,=20subroot,=20plan,=20mminfo->param);=0A= +=09=09SS_make_initplan_from_plan(root,=20subroot,=20initplan,=20= mminfo->param);=0A=20=09}=0A=20=0A=20=09/*=20Generate=20the=20output=20= plan=20---=20basically=20just=20a=20Result=20*/=0Adiff=20--git=20= a/src/backend/postmaster/datachecksum_state.c=20= b/src/backend/postmaster/datachecksum_state.c=0Aindex=20= 213a909aa92..f897ff60145=20100644=0A---=20= a/src/backend/postmaster/datachecksum_state.c=0A+++=20= b/src/backend/postmaster/datachecksum_state.c=0A@@=20-546,7=20+546,7=20= @@=20StartDataChecksumsWorkerLauncher(DataChecksumsWorkerOperation=20op,=0A= =20{=0A=20=09BackgroundWorker=20bgw;=0A=20=09BackgroundWorkerHandle=20= *bgw_handle;=0A-=09bool=09=09launcher_running;=0A+=09bool=09=09= worker_launcher_running;=0A=20=09DataChecksumsWorkerOperation=20= launcher_running_op;=0A=20=0A=20#ifdef=20USE_ASSERT_CHECKING=0A@@=20= -565,8=20+565,8=20@@=20= StartDataChecksumsWorkerLauncher(DataChecksumsWorkerOperation=20op,=0A=20= =09DataChecksumState->launch_cost_limit=20=3D=20cost_limit;=0A=20=0A=20=09= /*=20Is=20the=20launcher=20already=20running?=20If=20so,=20what=20is=20= it=20doing?=20*/=0A-=09launcher_running=20=3D=20= DataChecksumState->launcher_running;=0A-=09if=20(launcher_running)=0A+=09= worker_launcher_running=20=3D=20DataChecksumState->launcher_running;=0A+=09= if=20(worker_launcher_running)=0A=20=09=09launcher_running_op=20=3D=20= DataChecksumState->operation;=0A=20=0A=20=09= LWLockRelease(DataChecksumsWorkerLock);=0A@@=20-589,7=20+589,7=20@@=20= StartDataChecksumsWorkerLauncher(DataChecksumsWorkerOperation=20op,=0A=20= =09=20*=20already=20in=20the=20desired=20state,=20i.e.=20if=20the=20= checksums=20are=20already=20enabled=0A=20=09=20*=20and=20you=20call=20= pg_enable_data_checksums().=0A=20=09=20*/=0A-=09if=20(!launcher_running)=0A= +=09if=20(!worker_launcher_running)=0A=20=09{=0A=20=09=09/*=0A=20=09=09=20= *=20Prepare=20the=20BackgroundWorker=20and=20launch=20it.=0Adiff=20--git=20= a/src/backend/statistics/dependencies.c=20= b/src/backend/statistics/dependencies.c=0Aindex=20= e3a2f5817e0..62e2ea122e9=20100644=0A---=20= a/src/backend/statistics/dependencies.c=0A+++=20= b/src/backend/statistics/dependencies.c=0A@@=20-1173,17=20+1173,17=20@@=20= dependency_is_compatible_expression(Node=20*clause,=20Index=20relid,=20= List=20*statlist,=20N=0A=20=09if=20(is_opclause(clause))=0A=20=09{=0A=20=09= =09/*=20If=20it's=20an=20opclause,=20check=20for=20Var=20=3D=20Const=20= or=20Const=20=3D=20Var.=20*/=0A-=09=09OpExpr=09=20=20=20*expr=20=3D=20= (OpExpr=20*)=20clause;=0A+=09=09OpExpr=09=20=20=20*op_expr=20=3D=20= (OpExpr=20*)=20clause;=0A=20=0A=20=09=09/*=20Only=20expressions=20with=20= two=20arguments=20are=20candidates.=20*/=0A-=09=09if=20= (list_length(expr->args)=20!=3D=202)=0A+=09=09if=20= (list_length(op_expr->args)=20!=3D=202)=0A=20=09=09=09return=20false;=0A=20= =0A=20=09=09/*=20Make=20sure=20non-selected=20argument=20is=20a=20= pseudoconstant.=20*/=0A-=09=09if=20= (is_pseudo_constant_clause(lsecond(expr->args)))=0A-=09=09=09clause_expr=20= =3D=20linitial(expr->args);=0A-=09=09else=20if=20= (is_pseudo_constant_clause(linitial(expr->args)))=0A-=09=09=09= clause_expr=20=3D=20lsecond(expr->args);=0A+=09=09if=20= (is_pseudo_constant_clause(lsecond(op_expr->args)))=0A+=09=09=09= clause_expr=20=3D=20linitial(op_expr->args);=0A+=09=09else=20if=20= (is_pseudo_constant_clause(linitial(op_expr->args)))=0A+=09=09=09= clause_expr=20=3D=20lsecond(op_expr->args);=0A=20=09=09else=0A=20=09=09=09= return=20false;=0A=20=0A@@=20-1199,7=20+1199,7=20@@=20= dependency_is_compatible_expression(Node=20*clause,=20Index=20relid,=20= List=20*statlist,=20N=0A=20=09=09=20*=20selectivity=20functions,=20and=20= to=20be=20more=20consistent=20with=20decisions=0A=20=09=09=20*=20= elsewhere=20in=20the=20planner.=0A=20=09=09=20*/=0A-=09=09if=20= (get_oprrest(expr->opno)=20!=3D=20F_EQSEL)=0A+=09=09if=20= (get_oprrest(op_expr->opno)=20!=3D=20F_EQSEL)=0A=20=09=09=09return=20= false;=0A=20=0A=20=09=09/*=20OK=20to=20proceed=20with=20checking=20"var"=20= */=0A@@=20-1207,7=20+1207,7=20@@=20= dependency_is_compatible_expression(Node=20*clause,=20Index=20relid,=20= List=20*statlist,=20N=0A=20=09else=20if=20(IsA(clause,=20= ScalarArrayOpExpr))=0A=20=09{=0A=20=09=09/*=20If=20it's=20a=20scalar=20= array=20operator,=20check=20for=20Var=20IN=20Const.=20*/=0A-=09=09= ScalarArrayOpExpr=20*expr=20=3D=20(ScalarArrayOpExpr=20*)=20clause;=0A+=09= =09ScalarArrayOpExpr=20*op_expr=20=3D=20(ScalarArrayOpExpr=20*)=20= clause;=0A=20=0A=20=09=09/*=0A=20=09=09=20*=20Reject=20ALL()=20variant,=20= we=20only=20care=20about=20ANY/IN.=0A@@=20-1215,21=20+1215,21=20@@=20= dependency_is_compatible_expression(Node=20*clause,=20Index=20relid,=20= List=20*statlist,=20N=0A=20=09=09=20*=20FIXME=20Maybe=20we=20should=20= check=20if=20all=20the=20values=20are=20the=20same,=20and=0A=20=09=09=20= *=20allow=20ALL=20in=20that=20case?=20Doesn't=20seem=20very=20practical,=20= though.=0A=20=09=09=20*/=0A-=09=09if=20(!expr->useOr)=0A+=09=09if=20= (!op_expr->useOr)=0A=20=09=09=09return=20false;=0A=20=0A=20=09=09/*=20= Only=20expressions=20with=20two=20arguments=20are=20candidates.=20*/=0A-=09= =09if=20(list_length(expr->args)=20!=3D=202)=0A+=09=09if=20= (list_length(op_expr->args)=20!=3D=202)=0A=20=09=09=09return=20false;=0A=20= =0A=20=09=09/*=0A=20=09=09=20*=20We=20know=20it's=20always=20(Var=20IN=20= Const),=20so=20we=20assume=20the=20var=20is=20the=0A=20=09=09=20*=20= first=20argument,=20and=20pseudoconstant=20is=20the=20second=20one.=0A=20= =09=09=20*/=0A-=09=09if=20= (!is_pseudo_constant_clause(lsecond(expr->args)))=0A+=09=09if=20= (!is_pseudo_constant_clause(lsecond(op_expr->args)))=0A=20=09=09=09= return=20false;=0A=20=0A-=09=09clause_expr=20=3D=20linitial(expr->args);=0A= +=09=09clause_expr=20=3D=20linitial(op_expr->args);=0A=20=0A=20=09=09/*=0A= =20=09=09=20*=20If=20it's=20not=20an=20"=3D"=20operator,=20just=20ignore=20= the=20clause,=20as=20it's=20not=0A@@=20-1238,7=20+1238,7=20@@=20= dependency_is_compatible_expression(Node=20*clause,=20Index=20relid,=20= List=20*statlist,=20N=0A=20=09=09=20*=20selectivity.=20That's=20a=20bit=20= strange,=20but=20it's=20what=20other=20similar=0A=20=09=09=20*=20places=20= do.=0A=20=09=09=20*/=0A-=09=09if=20(get_oprrest(expr->opno)=20!=3D=20= F_EQSEL)=0A+=09=09if=20(get_oprrest(op_expr->opno)=20!=3D=20F_EQSEL)=0A=20= =09=09=09return=20false;=0A=20=0A=20=09=09/*=20OK=20to=20proceed=20with=20= checking=20"var"=20*/=0Adiff=20--git=20= a/src/backend/storage/buffer/bufmgr.c=20= b/src/backend/storage/buffer/bufmgr.c=0Aindex=203cc0b0bdd92..24b24e01807=20= 100644=0A---=20a/src/backend/storage/buffer/bufmgr.c=0A+++=20= b/src/backend/storage/buffer/bufmgr.c=0A@@=20-1299,7=20+1299,7=20@@=20= ReadBuffer_common(Relation=20rel,=20SMgrRelation=20smgr,=20char=20= smgr_persistence,=0A=20=09=20*/=0A=20=09if=20(unlikely(blockNum=20=3D=3D=20= P_NEW))=0A=20=09{=0A-=09=09uint32=09=09flags=20=3D=20= EB_SKIP_EXTENSION_LOCK;=0A+=09=09uint32=09=09uflags=20=3D=20= EB_SKIP_EXTENSION_LOCK;=0A=20=0A=20=09=09/*=0A=20=09=09=20*=20Since=20= no-one=20else=20can=20be=20looking=20at=20the=20page=20contents=20yet,=20= there=20is=0A@@=20-1307,9=20+1307,9=20@@=20ReadBuffer_common(Relation=20= rel,=20SMgrRelation=20smgr,=20char=20smgr_persistence,=0A=20=09=09=20*=20= lock.=0A=20=09=09=20*/=0A=20=09=09if=20(mode=20=3D=3D=20= RBM_ZERO_AND_LOCK=20||=20mode=20=3D=3D=20RBM_ZERO_AND_CLEANUP_LOCK)=0A-=09= =09=09flags=20|=3D=20EB_LOCK_FIRST;=0A+=09=09=09uflags=20|=3D=20= EB_LOCK_FIRST;=0A=20=0A-=09=09return=20ExtendBufferedRel(BMR_REL(rel),=20= forkNum,=20strategy,=20flags);=0A+=09=09return=20= ExtendBufferedRel(BMR_REL(rel),=20forkNum,=20strategy,=20uflags);=0A=20=09= }=0A=20=0A=20=09if=20(rel)=0Adiff=20--git=20= a/src/backend/utils/adt/jsonpath_exec.c=20= b/src/backend/utils/adt/jsonpath_exec.c=0Aindex=20= 0ec9b4df2ef..f01a20502a3=20100644=0A---=20= a/src/backend/utils/adt/jsonpath_exec.c=0A+++=20= b/src/backend/utils/adt/jsonpath_exec.c=0A@@=20-1925,32=20+1925,32=20@@=20= executeBoolItem(JsonPathExecContext=20*cxt,=20JsonPathItem=20*jsp,=0A=20=09= =09=09=09=20*=20check=20that=20there=20are=20no=20errors=20at=20all.=0A=20= =09=09=09=09=20*/=0A=20=09=09=09=09JsonValueList=20vals;=0A-=09=09=09=09= JsonPathExecResult=20res;=0A+=09=09=09=09JsonPathExecResult=20execres;=0A= =20=09=09=09=09bool=09=09isempty;=0A=20=0A=20=09=09=09=09= JsonValueListInit(&vals);=0A=20=0A-=09=09=09=09res=20=3D=20= executeItemOptUnwrapResultNoThrow(cxt,=20&larg,=20jb,=0A-=09=09=09=09=09=09= =09=09=09=09=09=09=09=09false,=20&vals);=0A+=09=09=09=09execres=20=3D=20= executeItemOptUnwrapResultNoThrow(cxt,=20&larg,=20jb,=0A+=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09false,=20&vals);=0A=20=0A=20=09=09=09=09= isempty=20=3D=20JsonValueListIsEmpty(&vals);=0A=20=09=09=09=09= JsonValueListClear(&vals);=0A=20=0A-=09=09=09=09if=20(jperIsError(res))=0A= +=09=09=09=09if=20(jperIsError(execres))=0A=20=09=09=09=09=09return=20= jpbUnknown;=0A=20=0A=20=09=09=09=09return=20isempty=20?=20jpbFalse=20:=20= jpbTrue;=0A=20=09=09=09}=0A=20=09=09=09else=0A=20=09=09=09{=0A-=09=09=09=09= JsonPathExecResult=20res=20=3D=0A+=09=09=09=09JsonPathExecResult=20= execres=20=3D=0A=20=09=09=09=09=09executeItemOptUnwrapResultNoThrow(cxt,=20= &larg,=20jb,=0A=20=09=09=09=09=09=09=09=09=09=09=09=09=09=20=20false,=20= NULL);=0A=20=0A-=09=09=09=09if=20(jperIsError(res))=0A+=09=09=09=09if=20= (jperIsError(execres))=0A=20=09=09=09=09=09return=20jpbUnknown;=0A=20=0A= -=09=09=09=09return=20res=20=3D=3D=20jperOk=20?=20jpbTrue=20:=20= jpbFalse;=0A+=09=09=09=09return=20execres=20=3D=3D=20jperOk=20?=20= jpbTrue=20:=20jpbFalse;=0A=20=09=09=09}=0A=20=0A=20=09=09default:=0A@@=20= -2128,9=20+2128,9=20@@=20executePredicate(JsonPathExecContext=20*cxt,=20= JsonPathItem=20*pred,=0A=20=09=09/*=20Loop=20over=20right=20arg=20= sequence=20or=20do=20single=20pass=20otherwise=20*/=0A=20=09=09while=20= (rarg=20?=20(rval=20!=3D=20NULL)=20:=20first)=0A=20=09=09{=0A-=09=09=09= JsonPathBool=20res=20=3D=20exec(pred,=20lval,=20rval,=20param);=0A+=09=09= =09JsonPathBool=20boolres=20=3D=20exec(pred,=20lval,=20rval,=20param);=0A= =20=0A-=09=09=09if=20(res=20=3D=3D=20jpbUnknown)=0A+=09=09=09if=20= (boolres=20=3D=3D=20jpbUnknown)=0A=20=09=09=09{=0A=20=09=09=09=09error=20= =3D=20true;=0A=20=09=09=09=09if=20(jspStrictAbsenceOfErrors(cxt))=0A@@=20= -2139,7=20+2139,7=20@@=20executePredicate(JsonPathExecContext=20*cxt,=20= JsonPathItem=20*pred,=0A=20=09=09=09=09=09goto=20exit;=0A=20=09=09=09=09= }=0A=20=09=09=09}=0A-=09=09=09else=20if=20(res=20=3D=3D=20jpbTrue)=0A+=09= =09=09else=20if=20(boolres=20=3D=3D=20jpbTrue)=0A=20=09=09=09{=0A=20=09=09= =09=09found=20=3D=20true;=0A=20=09=09=09=09if=20= (!jspStrictAbsenceOfErrors(cxt))=0A@@=20-4444,20=20+4444,20=20@@=20= JsonTableInitOpaque(TableFuncScanState=20*state,=20int=20natts)=0A=20=09=09= forboth(exprlc,=20state->passingvalexprs,=0A=20=09=09=09=09namelc,=20= je->passing_names)=0A=20=09=09{=0A-=09=09=09ExprState=20=20*state=20=3D=20= lfirst_node(ExprState,=20exprlc);=0A+=09=09=09ExprState=20=20*exprstate=20= =3D=20lfirst_node(ExprState,=20exprlc);=0A=20=09=09=09String=09=20=20=20= *name=20=3D=20lfirst_node(String,=20namelc);=0A=20=09=09=09= JsonPathVariable=20*var=20=3D=20palloc_object(JsonPathVariable);=0A=20=0A= =20=09=09=09var->name=20=3D=20pstrdup(name->sval);=0A=20=09=09=09= var->namelen=20=3D=20strlen(var->name);=0A-=09=09=09var->typid=20=3D=20= exprType((Node=20*)=20state->expr);=0A-=09=09=09var->typmod=20=3D=20= exprTypmod((Node=20*)=20state->expr);=0A+=09=09=09var->typid=20=3D=20= exprType((Node=20*)=20exprstate->expr);=0A+=09=09=09var->typmod=20=3D=20= exprTypmod((Node=20*)=20exprstate->expr);=0A=20=0A=20=09=09=09/*=0A=20=09= =09=09=20*=20Evaluate=20the=20expression=20and=20save=20the=20value=20to=20= be=20returned=20by=0A=20=09=09=09=20*=20GetJsonPathVar().=0A=20=09=09=09=20= */=0A-=09=09=09var->value=20=3D=20ExecEvalExpr(state,=20= ps->ps_ExprContext,=0A+=09=09=09var->value=20=3D=20= ExecEvalExpr(exprstate,=20ps->ps_ExprContext,=0A=20=09=09=09=09=09=09=09=09= =09=20=20&var->isnull);=0A=20=0A=20=09=09=09args=20=3D=20lappend(args,=20= var);=0Adiff=20--git=20a/src/backend/utils/adt/pg_upgrade_support.c=20= b/src/backend/utils/adt/pg_upgrade_support.c=0Aindex=20= b505a6b4fee..b813e65746a=20100644=0A---=20= a/src/backend/utils/adt/pg_upgrade_support.c=0A+++=20= b/src/backend/utils/adt/pg_upgrade_support.c=0A@@=20-227,8=20+227,8=20@@=20= binary_upgrade_create_empty_extension(PG_FUNCTION_ARGS)=0A=20=09=09= deconstruct_array_builtin(textArray,=20TEXTOID,=20&textDatums,=20NULL,=20= &ndatums);=0A=20=09=09for=20(i=20=3D=200;=20i=20<=20ndatums;=20i++)=0A=20= =09=09{=0A-=09=09=09char=09=20=20=20*extName=20=3D=20= TextDatumGetCString(textDatums[i]);=0A-=09=09=09Oid=09=09=09extOid=20=3D=20= get_extension_oid(extName,=20false);=0A+=09=09=09char=09=20=20=20= *extNameStr=20=3D=20TextDatumGetCString(textDatums[i]);=0A+=09=09=09Oid=09= =09=09extOid=20=3D=20get_extension_oid(extNameStr,=20false);=0A=20=0A=20=09= =09=09requiredExtensions=20=3D=20lappend_oid(requiredExtensions,=20= extOid);=0A=20=09=09}=0Adiff=20--git=20= a/src/backend/utils/adt/ruleutils.c=20= b/src/backend/utils/adt/ruleutils.c=0Aindex=20090e8cc28c1..0b098cf469c=20= 100644=0A---=20a/src/backend/utils/adt/ruleutils.c=0A+++=20= b/src/backend/utils/adt/ruleutils.c=0A@@=20-13097,16=20+13097,16=20@@=20= get_from_clause_item(Node=20*jtnode,=20Query=20*query,=20deparse_context=20= *context)=0A=20=09=09=09=09=09foreach(lc,=20rte->graph_table_columns)=0A=20= =09=09=09=09=09{=0A=20=09=09=09=09=09=09TargetEntry=20*te=20=3D=20= lfirst_node(TargetEntry,=20lc);=0A-=09=09=09=09=09=09deparse_context=20= context=20=3D=20{0};=0A+=09=09=09=09=09=09deparse_context=20dpcontext=20= =3D=20{0};=0A=20=0A=20=09=09=09=09=09=09if=20(!first)=0A=20=09=09=09=09=09= =09=09appendStringInfoString(buf,=20",=20");=0A=20=09=09=09=09=09=09else=0A= =20=09=09=09=09=09=09=09first=20=3D=20false;=0A=20=0A-=09=09=09=09=09=09= context.buf=20=3D=20buf;=0A+=09=09=09=09=09=09dpcontext.buf=20=3D=20buf;=0A= =20=0A-=09=09=09=09=09=09get_rule_expr((Node=20*)=20te->expr,=20= &context,=20false);=0A+=09=09=09=09=09=09get_rule_expr((Node=20*)=20= te->expr,=20&dpcontext,=20false);=0A=20=09=09=09=09=09=09= appendStringInfoString(buf,=20"=20AS=20");=0A=20=09=09=09=09=09=09= appendStringInfoString(buf,=20quote_identifier(te->resname));=0A=20=09=09= =09=09=09}=0Adiff=20--git=20a/src/backend/utils/adt/varlena.c=20= b/src/backend/utils/adt/varlena.c=0Aindex=20c0ff51bd2fc..1dde98d96d2=20= 100644=0A---=20a/src/backend/utils/adt/varlena.c=0A+++=20= b/src/backend/utils/adt/varlena.c=0A@@=20-3315,14=20+3315,14=20@@=20= appendStringInfoRegexpSubstr(StringInfo=20str,=20text=20*replace_text,=0A= =20=09=09=09=20*=20Copy=20the=20text=20that=20is=20back=20reference=20of=20= regexp.=20=20Note=20so=20and=20eo=0A=20=09=09=09=20*=20are=20counted=20= in=20characters=20not=20bytes.=0A=20=09=09=09=20*/=0A-=09=09=09char=09=20= =20=20*chunk_start;=0A-=09=09=09int=09=09=09chunk_len;=0A+=09=09=09char=09= =20=20=20*start;=0A+=09=09=09int=09=09=09len;=0A=20=0A=20=09=09=09= Assert(so=20>=3D=20data_pos);=0A-=09=09=09chunk_start=20=3D=20start_ptr;=0A= -=09=09=09chunk_start=20+=3D=20charlen_to_bytelen(chunk_start,=20so=20-=20= data_pos);=0A-=09=09=09chunk_len=20=3D=20charlen_to_bytelen(chunk_start,=20= eo=20-=20so);=0A-=09=09=09appendBinaryStringInfo(str,=20chunk_start,=20= chunk_len);=0A+=09=09=09start=20=3D=20start_ptr;=0A+=09=09=09start=20+=3D=20= charlen_to_bytelen(start,=20so=20-=20data_pos);=0A+=09=09=09len=20=3D=20= charlen_to_bytelen(start,=20eo=20-=20so);=0A+=09=09=09= appendBinaryStringInfo(str,=20start,=20len);=0A=20=09=09}=0A=20=09}=0A=20= }=0A@@=20-4946,7=20+4946,7=20@@=20text_format(PG_FUNCTION_ARGS)=0A=20=09=09= =09else=0A=20=09=09=09{=0A=20=09=09=09=09/*=20For=20less-usual=20= datatypes,=20convert=20to=20text=20then=20to=20int=20*/=0A-=09=09=09=09= char=09=20=20=20*str;=0A+=09=09=09=09char=09=20=20=20*s;=0A=20=0A=20=09=09= =09=09if=20(typid=20!=3D=20prev_width_type)=0A=20=09=09=09=09{=0A@@=20= -4958,12=20+4958,12=20@@=20text_format(PG_FUNCTION_ARGS)=0A=20=09=09=09=09= =09prev_width_type=20=3D=20typid;=0A=20=09=09=09=09}=0A=20=0A-=09=09=09=09= str=20=3D=20OutputFunctionCall(&typoutputinfo_width,=20value);=0A+=09=09=09= =09s=20=3D=20OutputFunctionCall(&typoutputinfo_width,=20value);=0A=20=0A=20= =09=09=09=09/*=20pg_strtoint32=20will=20complain=20about=20bad=20data=20= or=20overflow=20*/=0A-=09=09=09=09width=20=3D=20pg_strtoint32(str);=0A+=09= =09=09=09width=20=3D=20pg_strtoint32(s);=0A=20=0A-=09=09=09=09= pfree(str);=0A+=09=09=09=09pfree(s);=0A=20=09=09=09}=0A=20=09=09}=0A=20=0A= diff=20--git=20a/src/backend/utils/mmgr/freepage.c=20= b/src/backend/utils/mmgr/freepage.c=0Aindex=20d7195685f69..7488a3d547a=20= 100644=0A---=20a/src/backend/utils/mmgr/freepage.c=0A+++=20= b/src/backend/utils/mmgr/freepage.c=0A@@=20-1586,7=20+1586,7=20@@=20= FreePageManagerPutInternal(FreePageManager=20*fpm,=20Size=20first_page,=20= Size=20npages,=0A=20=09if=20(prevkey=20!=3D=20NULL=20&&=20= prevkey->first_page=20+=20prevkey->npages=20>=3D=20first_page)=0A=20=09{=0A= =20=09=09bool=09=09remove_next=20=3D=20false;=0A-=09=09Size=09=09result;=0A= +=09=09Size=09=09nprevpages;=0A=20=0A=20=09=09Assert(prevkey->first_page=20= +=20prevkey->npages=20=3D=3D=20first_page);=0A=20=09=09prevkey->npages=20= =3D=20(first_page=20-=20prevkey->first_page)=20+=20npages;=0A@@=20= -1606,7=20+1606,7=20@@=20FreePageManagerPutInternal(FreePageManager=20= *fpm,=20Size=20first_page,=20Size=20npages,=0A=20=09=09/*=20Put=20the=20= span=20on=20the=20correct=20freelist=20and=20save=20size.=20*/=0A=20=09=09= FreePagePopSpanLeader(fpm,=20prevkey->first_page);=0A=20=09=09= FreePagePushSpanLeader(fpm,=20prevkey->first_page,=20prevkey->npages);=0A= -=09=09result=20=3D=20prevkey->npages;=0A+=09=09nprevpages=20=3D=20= prevkey->npages;=0A=20=0A=20=09=09/*=0A=20=09=09=20*=20If=20we=20= consolidated=20with=20both=20the=20preceding=20and=20following=20= entries,=0A@@=20-1621,7=20+1621,7=20@@=20= FreePageManagerPutInternal(FreePageManager=20*fpm,=20Size=20first_page,=20= Size=20npages,=0A=20=09=09if=20(remove_next)=0A=20=09=09=09= FreePageBtreeRemove(fpm,=20np,=20nindex);=0A=20=0A-=09=09return=20= result;=0A+=09=09return=20nprevpages;=0A=20=09}=0A=20=0A=20=09/*=20= Consolidate=20with=20the=20next=20entry=20if=20possible.=20*/=0Adiff=20= --git=20a/src/bin/pgbench/pgbench.c=20b/src/bin/pgbench/pgbench.c=0A= index=20c969afab3a5..0dd9600a043=20100644=0A---=20= a/src/bin/pgbench/pgbench.c=0A+++=20b/src/bin/pgbench/pgbench.c=0A@@=20= -4661,7=20+4661,7=20@@=20doLog(TState=20*thread,=20CState=20*st,=0A=20=09= =09=09double=09=09lag_sum2=20=3D=200.0;=0A=20=09=09=09double=09=09= lag_min=20=3D=200.0;=0A=20=09=09=09double=09=09lag_max=20=3D=200.0;=0A-=09= =09=09int64=09=09skipped=20=3D=200;=0A+=09=09=09int64=09=09skips=20=3D=20= 0;=0A=20=09=09=09int64=09=09serialization_failures=20=3D=200;=0A=20=09=09= =09int64=09=09deadlock_failures=20=3D=200;=0A=20=09=09=09int64=09=09= other_sql_failures=20=3D=200;=0A@@=20-4691,8=20+4691,8=20@@=20= doLog(TState=20*thread,=20CState=20*st,=0A=20=09=09=09=09=09lag_max);=0A=20= =0A=20=09=09=09if=20(latency_limit)=0A-=09=09=09=09skipped=20=3D=20= agg->skipped;=0A-=09=09=09fprintf(logfile,=20"=20"=20INT64_FORMAT,=20= skipped);=0A+=09=09=09=09skips=20=3D=20agg->skipped;=0A+=09=09=09= fprintf(logfile,=20"=20"=20INT64_FORMAT,=20skips);=0A=20=0A=20=09=09=09= if=20(max_tries=20!=3D=201)=0A=20=09=09=09{=0Adiff=20--git=20= a/src/bin/psql/describe.c=20b/src/bin/psql/describe.c=0Aindex=20= dd1179ef927..7d0762556de=20100644=0A---=20a/src/bin/psql/describe.c=0A= +++=20b/src/bin/psql/describe.c=0A@@=20-1777,7=20+1777,7=20@@=20= describeOneTableDetails(const=20char=20*schemaname,=0A=20=09if=20= (tableinfo.relkind=20=3D=3D=20RELKIND_SEQUENCE)=0A=20=09{=0A=20=09=09= PGresult=20=20=20*result=20=3D=20NULL;=0A-=09=09printQueryOpt=20myopt=20= =3D=20pset.popt;=0A+=09=09printQueryOpt=20popt=20=3D=20pset.popt;=0A=20=09= =09char=09=20=20=20*footers[3]=20=3D=20{NULL,=20NULL,=20NULL};=0A=20=0A=20= =09=09printfPQExpBuffer(&buf,=20"/*=20%s=20*/\n",=20_("Get=20sequence=20= information"));=0A@@=20-1919,12=20+1919,12=20@@=20= describeOneTableDetails(const=20char=20*schemaname,=0A=20=09=09=09= printfPQExpBuffer(&title,=20_("Sequence=20\"%s.%s\""),=0A=20=09=09=09=09=09= =09=09=20=20schemaname,=20relationname);=0A=20=0A-=09=09myopt.footers=20= =3D=20footers;=0A-=09=09myopt.topt.default_footer=20=3D=20false;=0A-=09=09= myopt.title=20=3D=20title.data;=0A-=09=09myopt.translate_header=20=3D=20= true;=0A+=09=09popt.footers=20=3D=20footers;=0A+=09=09= popt.topt.default_footer=20=3D=20false;=0A+=09=09popt.title=20=3D=20= title.data;=0A+=09=09popt.translate_header=20=3D=20true;=0A=20=0A-=09=09= printQuery(res,=20&myopt,=20pset.queryFout,=20false,=20pset.logfile);=0A= +=09=09printQuery(res,=20&popt,=20pset.queryFout,=20false,=20= pset.logfile);=0A=20=0A=20=09=09free(footers[0]);=0A=20=09=09= free(footers[1]);=0A@@=20-1938,7=20+1938,7=20@@=20= describeOneTableDetails(const=20char=20*schemaname,=0A=20=09=20*/=0A=20=09= if=20(tableinfo.relkind=20=3D=3D=20RELKIND_PROPGRAPH)=0A=20=09{=0A-=09=09= printQueryOpt=20myopt=20=3D=20pset.popt;=0A+=09=09printQueryOpt=20popt=20= =3D=20pset.popt;=0A=20=09=09char=09=20=20=20*footers[3]=20=3D=20{NULL,=20= NULL,=20NULL};=0A=20=0A=20=09=09printfPQExpBuffer(&buf,=20"/*=20%s=20= */\n",=20_("Get=20property=20graph=20information"));=0A@@=20-1993,12=20= +1993,12=20@@=20describeOneTableDetails(const=20char=20*schemaname,=0A=20= =09=09=09}=0A=20=09=09}=0A=20=0A-=09=09myopt.footers=20=3D=20footers;=0A= -=09=09myopt.topt.default_footer=20=3D=20false;=0A-=09=09myopt.title=20=3D= =20title.data;=0A-=09=09myopt.translate_header=20=3D=20true;=0A+=09=09= popt.footers=20=3D=20footers;=0A+=09=09popt.topt.default_footer=20=3D=20= false;=0A+=09=09popt.title=20=3D=20title.data;=0A+=09=09= popt.translate_header=20=3D=20true;=0A=20=0A-=09=09printQuery(res,=20= &myopt,=20pset.queryFout,=20false,=20pset.logfile);=0A+=09=09= printQuery(res,=20&popt,=20pset.queryFout,=20false,=20pset.logfile);=0A=20= =0A=20=09=09free(footers[0]);=0A=20=09=09free(footers[1]);=0A@@=20= -2424,11=20+2424,11=20@@=20describeOneTableDetails(const=20char=20= *schemaname,=0A=20=0A=20=09=09if=20(PQntuples(result)=20=3D=3D=201)=0A=20= =09=09{=0A-=09=09=09char=09=20=20=20*schemaname=20=3D=20= PQgetvalue(result,=200,=200);=0A-=09=09=09char=09=20=20=20*relname=20=3D=20= PQgetvalue(result,=200,=201);=0A+=09=09=09const=20char=20*schema=20=3D=20= PQgetvalue(result,=200,=200);=0A+=09=09=09const=20char=20*relname=20=3D=20= PQgetvalue(result,=200,=201);=0A=20=0A=20=09=09=09= printfPQExpBuffer(&tmpbuf,=20_("Owning=20table:=20\"%s.%s\""),=0A-=09=09=09= =09=09=09=09=20=20schemaname,=20relname);=0A+=09=09=09=09=09=09=09=20=20= schema,=20relname);=0A=20=09=09=09printTableAddFooter(&cont,=20= tmpbuf.data);=0A=20=09=09}=0A=20=09=09PQclear(result);=0Adiff=20--git=20= a/src/bin/psql/prompt.c=20b/src/bin/psql/prompt.c=0Aindex=20= 9725d53dfe7..a5882b914a3=20100644=0A---=20a/src/bin/psql/prompt.c=0A+++=20= b/src/bin/psql/prompt.c=0A@@=20-74,7=20+74,6=20@@=20= get_prompt(promptStatus_t=20status,=20ConditionalStack=20cstack)=0A=20=09= static=20char=20destination[MAX_PROMPT_SIZE=20+=201];=0A=20=09char=09=09= buf[MAX_PROMPT_SIZE=20+=201];=0A=20=09bool=09=09esc=20=3D=20false;=0A-=09= const=20char=20*p;=0A=20=09const=20char=20*prompt_string=20=3D=20"?=20";=0A= =20=09static=20size_t=20last_prompt1_width=20=3D=200;=0A=20=0A@@=20= -100,7=20+99,7=20@@=20get_prompt(promptStatus_t=20status,=20= ConditionalStack=20cstack)=0A=20=0A=20=09destination[0]=20=3D=20'\0';=0A=20= =0A-=09for=20(p=20=3D=20prompt_string;=0A+=09for=20(const=20char=20*p=20= =3D=20prompt_string;=0A=20=09=09=20*p=20&&=20strlen(destination)=20<=20= sizeof(destination)=20-=201;=0A=20=09=09=20p++)=0A=20=09{=0A@@=20-203,11=20= +202,11=20@@=20get_prompt(promptStatus_t=20status,=20ConditionalStack=20= cstack)=0A=20=09=09=09=09case=20'P':=0A=20=09=09=09=09=09if=20(pset.db)=0A= =20=09=09=09=09=09{=0A-=09=09=09=09=09=09PGpipelineStatus=20status=20=3D=20= PQpipelineStatus(pset.db);=0A+=09=09=09=09=09=09PGpipelineStatus=20= pipelinestatus=20=3D=20PQpipelineStatus(pset.db);=0A=20=0A-=09=09=09=09=09= =09if=20(status=20=3D=3D=20PQ_PIPELINE_ON)=0A+=09=09=09=09=09=09if=20= (pipelinestatus=20=3D=3D=20PQ_PIPELINE_ON)=0A=20=09=09=09=09=09=09=09= strlcpy(buf,=20"on",=20sizeof(buf));=0A-=09=09=09=09=09=09else=20if=20= (status=20=3D=3D=20PQ_PIPELINE_ABORTED)=0A+=09=09=09=09=09=09else=20if=20= (pipelinestatus=20=3D=3D=20PQ_PIPELINE_ABORTED)=0A=20=09=09=09=09=09=09=09= strlcpy(buf,=20"abort",=20sizeof(buf));=0A=20=09=09=09=09=09=09else=0A=20= =09=09=09=09=09=09=09strlcpy(buf,=20"off",=20sizeof(buf));=0A@@=20-390,8=20= +389,8=20@@=20get_prompt(promptStatus_t=20status,=20ConditionalStack=20= cstack)=0A=20=09/*=20Compute=20the=20visible=20width=20of=20PROMPT1,=20= for=20PROMPT2's=20%w=20*/=0A=20=09if=20(prompt_string=20=3D=3D=20= pset.prompt1)=0A=20=09{=0A-=09=09char=09=20=20=20*p=20=3D=20destination;=0A= -=09=09char=09=20=20=20*end=20=3D=20p=20+=20strlen(p);=0A+=09=09const=20= char=20*p=20=3D=20(const=20char=20*)=20destination;=0A+=09=09const=20= char=20*end=20=3D=20p=20+=20strlen(p);=0A=20=09=09bool=09=09visible=20=3D=20= true;=0A=20=0A=20=09=09last_prompt1_width=20=3D=200;=0Adiff=20--git=20= a/src/fe_utils/print.c=20b/src/fe_utils/print.c=0Aindex=20= f2dd52003c1..6194bfe3e28=20100644=0A---=20a/src/fe_utils/print.c=0A+++=20= b/src/fe_utils/print.c=0A@@=20-933,7=20+933,7=20@@=20= print_aligned_text(const=20printTableContent=20*cont,=20FILE=20*fout,=20= bool=20is_pager)=0A=20=09=09if=20(!opt_tuples_only)=0A=20=09=09{=0A=20=09= =09=09int=09=09=09more_col_wrapping;=0A-=09=09=09int=09=09=09= curr_nl_line;=0A+=09=09=09int=09=09=09curr_line;=0A=20=0A=20=09=09=09if=20= (opt_border=20=3D=3D=202)=0A=20=09=09=09=09= _print_horizontal_line(col_count,=20width_wrap,=20opt_border,=0A@@=20= -945,7=20+945,7=20@@=20print_aligned_text(const=20printTableContent=20= *cont,=20FILE=20*fout,=20bool=20is_pager)=0A=20=09=09=09=09=09=09=09=20= col_lineptrs[i],=20max_nl_lines[i]);=0A=20=0A=20=09=09=09= more_col_wrapping=20=3D=20col_count;=0A-=09=09=09curr_nl_line=20=3D=200;=0A= +=09=09=09curr_line=20=3D=200;=0A=20=09=09=09if=20(col_count=20>=200)=0A=20= =09=09=09=09memset(header_done,=20false,=20col_count=20*=20= sizeof(bool));=0A=20=09=09=09while=20(more_col_wrapping)=0A@@=20-955,12=20= +955,12=20@@=20print_aligned_text(const=20printTableContent=20*cont,=20= FILE=20*fout,=20bool=20is_pager)=0A=20=0A=20=09=09=09=09for=20(i=20=3D=20= 0;=20i=20<=20cont->ncolumns;=20i++)=0A=20=09=09=09=09{=0A-=09=09=09=09=09= struct=20lineptr=20*this_line=20=3D=20col_lineptrs[i]=20+=20= curr_nl_line;=0A+=09=09=09=09=09struct=20lineptr=20*this_line=20=3D=20= col_lineptrs[i]=20+=20curr_line;=0A=20=09=09=09=09=09unsigned=20int=20= nbspace;=0A=20=0A=20=09=09=09=09=09if=20(opt_border=20!=3D=200=20||=0A=20= =09=09=09=09=09=09(!format->wrap_right_border=20&&=20i=20>=200))=0A-=09=09= =09=09=09=09fputs(curr_nl_line=20?=20format->header_nl_left=20:=20"=20",=0A= +=09=09=09=09=09=09fputs(curr_line=20?=20format->header_nl_left=20:=20"=20= ",=0A=20=09=09=09=09=09=09=09=20=20fout);=0A=20=0A=20=09=09=09=09=09if=20= (!header_done[i])=0A@@=20-987,7=20+987,7=20@@=20print_aligned_text(const=20= printTableContent=20*cont,=20FILE=20*fout,=20bool=20is_pager)=0A=20=09=09= =09=09=09if=20(opt_border=20!=3D=200=20&&=20col_count=20>=200=20&&=20i=20= <=20col_count=20-=201)=0A=20=09=09=09=09=09=09fputs(dformat->midvrule,=20= fout);=0A=20=09=09=09=09}=0A-=09=09=09=09curr_nl_line++;=0A+=09=09=09=09= curr_line++;=0A=20=0A=20=09=09=09=09if=20(opt_border=20=3D=3D=202)=0A=20=09= =09=09=09=09fputs(dformat->rightvrule,=20fout);=0Adiff=20--git=20= a/src/interfaces/libpq/fe-connect.c=20= b/src/interfaces/libpq/fe-connect.c=0Aindex=204272d386e64..e6ec29906a9=20= 100644=0A---=20a/src/interfaces/libpq/fe-connect.c=0A+++=20= b/src/interfaces/libpq/fe-connect.c=0A@@=20-4002,7=20+4002,7=20@@=20= keep_going:=09=09=09=09=09=09/*=20We=20will=20come=20back=20to=20here=20= until=20there=20is=0A=20=09=09=09=09int=09=09=09msgLength;=0A=20=09=09=09= =09int=09=09=09avail;=0A=20=09=09=09=09AuthRequest=20areq;=0A-=09=09=09=09= int=09=09=09res;=0A+=09=09=09=09int=09=09=09status;=0A=20=09=09=09=09= bool=09=09async;=0A=20=0A=20=09=09=09=09/*=0A@@=20-4227,9=20+4227,9=20@@=20= keep_going:=09=09=09=09=09=09/*=20We=20will=20come=20back=20to=20here=20= until=20there=20is=0A=20=09=09=09=09=20*=20Note=20that=20conn->pghost=20= must=20be=20non-NULL=20if=20we=20are=20going=20to=0A=20=09=09=09=09=20*=20= avoid=20the=20Kerberos=20code=20doing=20a=20hostname=20look-up.=0A=20=09=09= =09=09=20*/=0A-=09=09=09=09res=20=3D=20pg_fe_sendauth(areq,=20msgLength,=20= conn,=20&async);=0A+=09=09=09=09status=20=3D=20pg_fe_sendauth(areq,=20= msgLength,=20conn,=20&async);=0A=20=0A-=09=09=09=09if=20(async=20&&=20= (res=20=3D=3D=20STATUS_OK))=0A+=09=09=09=09if=20(async=20&&=20(status=20= =3D=3D=20STATUS_OK))=0A=20=09=09=09=09{=0A=20=09=09=09=09=09/*=0A=20=09=09= =09=09=09=20*=20We'll=20come=20back=20later=20once=20we're=20ready=20to=20= respond.=0A@@=20-4246,7=20+4246,7=20@@=20keep_going:=09=09=09=09=09=09/*=20= We=20will=20come=20back=20to=20here=20until=20there=20is=0A=20=09=09=09=09= =20*/=0A=20=09=09=09=09conn->inStart=20=3D=20conn->inCursor;=0A=20=0A-=09= =09=09=09if=20(res=20!=3D=20STATUS_OK)=0A+=09=09=09=09if=20(status=20!=3D=20= STATUS_OK)=0A=20=09=09=09=09{=0A=20=09=09=09=09=09/*=0A=20=09=09=09=09=09= =20*=20OAuth=20connections=20may=20perform=20two-step=20discovery,=20= where=0A--=20=0A2.50.1=20(Apple=20Git-155)=0A=0A= --Apple-Mail=_B830DCCB-64C7-4AD6-938E-E4A843BDEE74 Content-Disposition: attachment; filename=v8-0002-cleanup-rename-outer-variables-to-avoid-shadowing.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="v8-0002-cleanup-rename-outer-variables-to-avoid-shadowing.patch" Content-Transfer-Encoding: quoted-printable =46rom=205541f1773ce229f08da3c6a44c2cc3e524e99076=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20"Chao=20Li=20(Evan)"=20=0A= Date:=20Tue,=202=20Dec=202025=2011:51:01=20+0800=0ASubject:=20[PATCH=20= v8=2002/12]=20cleanup:=20rename=20outer=20variables=20to=20avoid=20= shadowing=0A=20inner=20locals=0A=0AThis=20commit=20resolves=20several=20= cases=20where=20an=20outer-scope=20variable=20shared=0Aa=20name=20with=20= a=20more=20frequently=20used=20inner=20variable.=20The=20fixes=20rename=20= the=0Aouter=20variables=20so=20each=20identifier=20remains=20distinct=20= within=20its=20scope.=0A=0AAuthor:=20Chao=20Li=20=0A= Reviewed-by:=20Peter=20Smith=20=0ADiscussion:=20= https://postgr.es/m/CAEoWx2kQ2x5gMaj8tHLJ3=3DjfC+p5YXHkJyHrDTiQw2nn2FJTmQ@= mail.gmail.com=0A---=0A=20src/backend/access/brin/brin.c=20=20=20=20=20=20= =20=20=20=20|=2010=20+++++++---=0A=20src/backend/catalog/objectaddress.c=20= =20=20=20=20|=2010=20+++++-----=0A=20src/backend/catalog/pg_constraint.c=20= =20=20=20=20|=20=204=20++--=0A=20src/backend/optimizer/path/equivclass.c=20= |=20=206=20+++---=0A=20src/backend/partitioning/partdesc.c=20=20=20=20=20= |=20=206=20+++---=0A=20src/backend/statistics/extended_stats.c=20|=20=20= 6=20+++---=0A=20src/backend/storage/aio/read_stream.c=20=20=20|=20=206=20= +++---=0A=20src/bin/pg_basebackup/pg_receivewal.c=20=20=20|=20=206=20= +++---=0A=20src/include/catalog/pg_constraint.h=20=20=20=20=20|=20=202=20= +-=0A=20src/include/optimizer/paths.h=20=20=20=20=20=20=20=20=20=20=20|=20= =202=20+-=0A=20src/include/storage/read_stream.h=20=20=20=20=20=20=20|=20= =202=20+-=0A=2011=20files=20changed,=2032=20insertions(+),=2028=20= deletions(-)=0A=0Adiff=20--git=20a/src/backend/access/brin/brin.c=20= b/src/backend/access/brin/brin.c=0Aindex=20bdb30752e09..8e67c7c923d=20= 100644=0A---=20a/src/backend/access/brin/brin.c=0A+++=20= b/src/backend/access/brin/brin.c=0A@@=20-591,7=20+591,9=20@@=20= bringetbitmap(IndexScanDesc=20scan,=20TIDBitmap=20*tbm)=0A=20=09=09=09=20= =20=20*nnullkeys;=0A=20=09char=09=20=20=20*ptr;=0A=20=09Size=09=09len;=0A= -=09char=09=20=20=20*tmp=20PG_USED_FOR_ASSERTS_ONLY;=0A+#if=20= defined(USE_ASSERT_CHECKING)=0A+=09char=09=20=20=20*savePtr=20= PG_USED_FOR_ASSERTS_ONLY;=0A+#endif=0A=20=0A=20=09opaque=20=3D=20= (BrinOpaque=20*)=20scan->opaque;=0A=20=09bdesc=20=3D=20opaque->bo_bdesc;=0A= @@=20-642,7=20+644,9=20@@=20bringetbitmap(IndexScanDesc=20scan,=20= TIDBitmap=20*tbm)=0A=20=09=09MAXALIGN(sizeof(int)=20*=20= bdesc->bd_tupdesc->natts);=0A=20=0A=20=09ptr=20=3D=20palloc(len);=0A-=09= tmp=20=3D=20ptr;=0A+#if=20defined(USE_ASSERT_CHECKING)=0A+=09savePtr=20=3D= =20ptr;=0A+#endif=0A=20=0A=20=09keys=20=3D=20(ScanKey=20**)=20ptr;=0A=20=09= ptr=20+=3D=20MAXALIGN(sizeof(ScanKey=20*)=20*=20= bdesc->bd_tupdesc->natts);=0A@@=20-665,7=20+669,7=20@@=20= bringetbitmap(IndexScanDesc=20scan,=20TIDBitmap=20*tbm)=0A=20=09=09ptr=20= +=3D=20MAXALIGN(sizeof(ScanKey)=20*=20scan->numberOfKeys);=0A=20=09}=0A=20= =0A-=09Assert(tmp=20+=20len=20=3D=3D=20ptr);=0A+=09Assert(savePtr=20+=20= len=20=3D=3D=20ptr);=0A=20=0A=20=09/*=20zero=20the=20number=20of=20keys=20= */=0A=20=09memset(nkeys,=200,=20sizeof(int)=20*=20= bdesc->bd_tupdesc->natts);=0Adiff=20--git=20= a/src/backend/catalog/objectaddress.c=20= b/src/backend/catalog/objectaddress.c=0Aindex=20c1862809577..3eb5b82e8ae=20= 100644=0A---=20a/src/backend/catalog/objectaddress.c=0A+++=20= b/src/backend/catalog/objectaddress.c=0A@@=20-2215,7=20+2215,7=20@@=20= pg_get_object_address(PG_FUNCTION_ARGS)=0A=20=09ObjectAddress=20addr;=0A=20= =09TupleDesc=09tupdesc;=0A=20=09Datum=09=09values[3];=0A-=09bool=09=09= nulls[3];=0A+=09bool=09=09isnulls[3];=0A=20=09HeapTuple=09htup;=0A=20=09= Relation=09relation;=0A=20=0A@@=20-2471,11=20+2471,11=20@@=20= pg_get_object_address(PG_FUNCTION_ARGS)=0A=20=09values[0]=20=3D=20= ObjectIdGetDatum(addr.classId);=0A=20=09values[1]=20=3D=20= ObjectIdGetDatum(addr.objectId);=0A=20=09values[2]=20=3D=20= Int32GetDatum(addr.objectSubId);=0A-=09nulls[0]=20=3D=20false;=0A-=09= nulls[1]=20=3D=20false;=0A-=09nulls[2]=20=3D=20false;=0A+=09isnulls[0]=20= =3D=20false;=0A+=09isnulls[1]=20=3D=20false;=0A+=09isnulls[2]=20=3D=20= false;=0A=20=0A-=09htup=20=3D=20heap_form_tuple(tupdesc,=20values,=20= nulls);=0A+=09htup=20=3D=20heap_form_tuple(tupdesc,=20values,=20= isnulls);=0A=20=0A=20=09PG_RETURN_DATUM(HeapTupleGetDatum(htup));=0A=20}=0A= diff=20--git=20a/src/backend/catalog/pg_constraint.c=20= b/src/backend/catalog/pg_constraint.c=0Aindex=20b12765ae691..48171c0f7d5=20= 100644=0A---=20a/src/backend/catalog/pg_constraint.c=0A+++=20= b/src/backend/catalog/pg_constraint.c=0A@@=20-831,7=20+831,7=20@@=20= AdjustNotNullInheritance(Oid=20relid,=20AttrNumber=20attnum,=20const=20= char=20*new_conname,=0A=20=20*=20'include_noinh'=20determines=20whether=20= to=20include=20NO=20INHERIT=20constraints=20or=20not.=0A=20=20*/=0A=20= List=20*=0A-RelationGetNotNullConstraints(Oid=20relid,=20bool=20cooked,=20= bool=20include_noinh)=0A+RelationGetNotNullConstraints(Oid=20relid,=20= bool=20want_cooked,=20bool=20include_noinh)=0A=20{=0A=20=09List=09=20=20=20= *notnulls=20=3D=20NIL;=0A=20=09Relation=09constrRel;=0A@@=20-859,7=20= +859,7=20@@=20RelationGetNotNullConstraints(Oid=20relid,=20bool=20= cooked,=20bool=20include_noinh)=0A=20=0A=20=09=09colnum=20=3D=20= extractNotNullColumn(htup);=0A=20=0A-=09=09if=20(cooked)=0A+=09=09if=20= (want_cooked)=0A=20=09=09{=0A=20=09=09=09CookedConstraint=20*cooked;=0A=20= =0Adiff=20--git=20a/src/backend/optimizer/path/equivclass.c=20= b/src/backend/optimizer/path/equivclass.c=0Aindex=20= e3697df51a2..d273288c28f=20100644=0A---=20= a/src/backend/optimizer/path/equivclass.c=0A+++=20= b/src/backend/optimizer/path/equivclass.c=0A@@=20-739,7=20+739,7=20@@=20= get_eclass_for_sort_expr(PlannerInfo=20*root,=0A=20=09=09=09=09=09=09=20= Oid=20opcintype,=0A=20=09=09=09=09=09=09=20Oid=20collation,=0A=20=09=09=09= =09=09=09=20Index=20sortref,=0A-=09=09=09=09=09=09=20Relids=20rel,=0A+=09= =09=09=09=09=09=20Relids=20relids,=0A=20=09=09=09=09=09=09=20bool=20= create_it)=0A=20{=0A=20=09JoinDomain=20*jdomain;=0A@@=20-782,14=20= +782,14=20@@=20get_eclass_for_sort_expr(PlannerInfo=20*root,=0A=20=09=09= if=20(!equal(opfamilies,=20cur_ec->ec_opfamilies))=0A=20=09=09=09= continue;=0A=20=0A-=09=09setup_eclass_member_iterator(&it,=20cur_ec,=20= rel);=0A+=09=09setup_eclass_member_iterator(&it,=20cur_ec,=20relids);=0A=20= =09=09while=20((cur_em=20=3D=20eclass_member_iterator_next(&it))=20!=3D=20= NULL)=0A=20=09=09{=0A=20=09=09=09/*=0A=20=09=09=09=20*=20Ignore=20child=20= members=20unless=20they=20match=20the=20request.=0A=20=09=09=09=20*/=0A=20= =09=09=09if=20(cur_em->em_is_child=20&&=0A-=09=09=09=09= !bms_equal(cur_em->em_relids,=20rel))=0A+=09=09=09=09= !bms_equal(cur_em->em_relids,=20relids))=0A=20=09=09=09=09continue;=0A=20= =0A=20=09=09=09/*=0Adiff=20--git=20a/src/backend/partitioning/partdesc.c=20= b/src/backend/partitioning/partdesc.c=0Aindex=20c3d275f8726..44297278756=20= 100644=0A---=20a/src/backend/partitioning/partdesc.c=0A+++=20= b/src/backend/partitioning/partdesc.c=0A@@=20-146,7=20+146,7=20@@=20= RelationBuildPartitionDesc(Relation=20rel,=20bool=20omit_detached)=0A=20=09= int=09=09=09i,=0A=20=09=09=09=09nparts;=0A=20=09bool=09=09retried=20=3D=20= false;=0A-=09PartitionKey=20key=20=3D=20RelationGetPartitionKey(rel);=0A= +=09PartitionKey=20partkey=20=3D=20RelationGetPartitionKey(rel);=0A=20=09= MemoryContext=20new_pdcxt;=0A=20=09MemoryContext=20oldcxt;=0A=20=09int=09= =09=20=20=20*mapping;=0A@@=20-308,7=20+308,7=20@@=20retry:=0A=20=09=20*=20= This=20could=20fail,=20but=20we=20haven't=20done=20any=20damage=20if=20= so.=0A=20=09=20*/=0A=20=09if=20(nparts=20>=200)=0A-=09=09boundinfo=20=3D=20= partition_bounds_create(boundspecs,=20nparts,=20key,=20&mapping);=0A+=09=09= boundinfo=20=3D=20partition_bounds_create(boundspecs,=20nparts,=20= partkey,=20&mapping);=0A=20=0A=20=09/*=0A=20=09=20*=20Now=20build=20the=20= actual=20relcache=20partition=20descriptor,=20copying=20all=20the=0A@@=20= -329,7=20+329,7=20@@=20retry:=0A=20=09if=20(nparts=20>=200)=0A=20=09{=0A=20= =09=09oldcxt=20=3D=20MemoryContextSwitchTo(new_pdcxt);=0A-=09=09= partdesc->boundinfo=20=3D=20partition_bounds_copy(boundinfo,=20key);=0A+=09= =09partdesc->boundinfo=20=3D=20partition_bounds_copy(boundinfo,=20= partkey);=0A=20=0A=20=09=09/*=20Initialize=20caching=20fields=20for=20= speeding=20up=20ExecFindPartition=20*/=0A=20=09=09= partdesc->last_found_datum_index=20=3D=20-1;=0Adiff=20--git=20= a/src/backend/statistics/extended_stats.c=20= b/src/backend/statistics/extended_stats.c=0Aindex=20= 2b83355d26e..a6990db04be=20100644=0A---=20= a/src/backend/statistics/extended_stats.c=0A+++=20= b/src/backend/statistics/extended_stats.c=0A@@=20-1040,7=20+1040,7=20@@=20= build_sorted_items(StatsBuildData=20*data,=20int=20*nitems,=0A=20=09Size=09= =09len;=0A=20=09SortItem=20=20=20*items;=0A=20=09Datum=09=20=20=20= *values;=0A-=09bool=09=20=20=20*isnull;=0A+=09bool=09=20=20=20*isnulls;=0A= =20=09char=09=20=20=20*ptr;=0A=20=09int=09=09=20=20=20*typlen;=0A=20=0A= @@=20-1060,7=20+1060,7=20@@=20build_sorted_items(StatsBuildData=20*data,=20= int=20*nitems,=0A=20=09values=20=3D=20(Datum=20*)=20ptr;=0A=20=09ptr=20= +=3D=20nvalues=20*=20sizeof(Datum);=0A=20=0A-=09isnull=20=3D=20(bool=20= *)=20ptr;=0A+=09isnulls=20=3D=20(bool=20*)=20ptr;=0A=20=09ptr=20+=3D=20= nvalues=20*=20sizeof(bool);=0A=20=0A=20=09/*=20make=20sure=20we=20= consumed=20the=20whole=20buffer=20exactly=20*/=0A@@=20-1071,7=20+1071,7=20= @@=20build_sorted_items(StatsBuildData=20*data,=20int=20*nitems,=0A=20=09= for=20(i=20=3D=200;=20i=20<=20data->numrows;=20i++)=0A=20=09{=0A=20=09=09= items[nrows].values=20=3D=20&values[nrows=20*=20numattrs];=0A-=09=09= items[nrows].isnull=20=3D=20&isnull[nrows=20*=20numattrs];=0A+=09=09= items[nrows].isnull=20=3D=20&isnulls[nrows=20*=20numattrs];=0A=20=0A=20=09= =09nrows++;=0A=20=09}=0Adiff=20--git=20= a/src/backend/storage/aio/read_stream.c=20= b/src/backend/storage/aio/read_stream.c=0Aindex=20= 2374b4cd507..5e26fb64afe=20100644=0A---=20= a/src/backend/storage/aio/read_stream.c=0A+++=20= b/src/backend/storage/aio/read_stream.c=0A@@=20-1017,7=20+1017,7=20@@=20= read_stream_begin_smgr_relation(int=20flags,=0A=20=20*=20the=20stream=20= early=20at=20any=20time=20by=20calling=20read_stream_end().=0A=20=20*/=0A= =20Buffer=0A-read_stream_next_buffer(ReadStream=20*stream,=20void=20= **per_buffer_data)=0A+read_stream_next_buffer(ReadStream=20*stream,=20= void=20**pper_buffer_data)=0A=20{=0A=20=09Buffer=09=09buffer;=0A=20=09= int16=09=09oldest_buffer_index;=0A@@=20-1162,8=20+1162,8=20@@=20= read_stream_next_buffer(ReadStream=20*stream,=20void=20= **per_buffer_data)=0A=20=09Assert(oldest_buffer_index=20>=3D=200=20&&=0A=20= =09=09=20=20=20oldest_buffer_index=20<=20stream->queue_size);=0A=20=09= buffer=20=3D=20stream->buffers[oldest_buffer_index];=0A-=09if=20= (per_buffer_data)=0A-=09=09*per_buffer_data=20=3D=20= get_per_buffer_data(stream,=20oldest_buffer_index);=0A+=09if=20= (pper_buffer_data)=0A+=09=09*pper_buffer_data=20=3D=20= get_per_buffer_data(stream,=20oldest_buffer_index);=0A=20=0A=20=09= Assert(BufferIsValid(buffer));=0A=20=0Adiff=20--git=20= a/src/bin/pg_basebackup/pg_receivewal.c=20= b/src/bin/pg_basebackup/pg_receivewal.c=0Aindex=20= ddfec298fb7..681cdb5f3f1=20100644=0A---=20= a/src/bin/pg_basebackup/pg_receivewal.c=0A+++=20= b/src/bin/pg_basebackup/pg_receivewal.c=0A@@=20-59,7=20+59,7=20@@=20= static=20XLogRecPtr=20endpos=20=3D=20InvalidXLogRecPtr;=0A=20static=20= void=20usage(void);=0A=20static=20DIR=20*get_destination_dir(char=20= *dest_folder);=0A=20static=20void=20close_destination_dir(DIR=20= *dest_dir,=20char=20*dest_folder);=0A-static=20XLogRecPtr=20= FindStreamingStart(uint32=20*tli);=0A+static=20XLogRecPtr=20= FindStreamingStart(uint32=20*ptli);=0A=20static=20void=20= StreamLog(void);=0A=20static=20bool=20stop_streaming(XLogRecPtr=20= xlogpos,=20uint32=20timeline,=0A=20=09=09=09=09=09=09=20=20=20bool=20= segment_finished);=0A@@=20-265,7=20+265,7=20@@=20= close_destination_dir(DIR=20*dest_dir,=20char=20*dest_folder)=0A=20=20*=20= If=20there=20are=20no=20WAL=20files=20in=20the=20directory,=20returns=20= InvalidXLogRecPtr.=0A=20=20*/=0A=20static=20XLogRecPtr=0A= -FindStreamingStart(uint32=20*tli)=0A+FindStreamingStart(uint32=20*ptli)=0A= =20{=0A=20=09DIR=09=09=20=20=20*dir;=0A=20=09struct=20dirent=20*dirent;=0A= @@=20-486,7=20+486,7=20@@=20FindStreamingStart(uint32=20*tli)=0A=20=0A=20= =09=09XLogSegNoOffsetToRecPtr(high_segno,=200,=20WalSegSz,=20high_ptr);=0A= =20=0A-=09=09*tli=20=3D=20high_tli;=0A+=09=09*ptli=20=3D=20high_tli;=0A=20= =09=09return=20high_ptr;=0A=20=09}=0A=20=09else=0Adiff=20--git=20= a/src/include/catalog/pg_constraint.h=20= b/src/include/catalog/pg_constraint.h=0Aindex=201b7fedf1750..51ccda7fe52=20= 100644=0A---=20a/src/include/catalog/pg_constraint.h=0A+++=20= b/src/include/catalog/pg_constraint.h=0A@@=20-269,7=20+269,7=20@@=20= extern=20HeapTuple=20findDomainNotNullConstraint(Oid=20typid);=0A=20= extern=20AttrNumber=20extractNotNullColumn(HeapTuple=20constrTup);=0A=20= extern=20bool=20AdjustNotNullInheritance(Oid=20relid,=20AttrNumber=20= attnum,=20const=20char=20*new_conname,=0A=20=09=09=09=09=09=09=09=09=09=20= bool=20is_local,=20bool=20is_no_inherit,=20bool=20is_notvalid);=0A= -extern=20List=20*RelationGetNotNullConstraints(Oid=20relid,=20bool=20= cooked,=0A+extern=20List=20*RelationGetNotNullConstraints(Oid=20relid,=20= bool=20want_cooked,=0A=20=09=09=09=09=09=09=09=09=09=09=20=20=20bool=20= include_noinh);=0A=20=0A=20extern=20void=20RemoveConstraintById(Oid=20= conId);=0Adiff=20--git=20a/src/include/optimizer/paths.h=20= b/src/include/optimizer/paths.h=0Aindex=2017f2099ec3b..d8eceb66610=20= 100644=0A---=20a/src/include/optimizer/paths.h=0A+++=20= b/src/include/optimizer/paths.h=0A@@=20-144,7=20+144,7=20@@=20extern=20= EquivalenceClass=20*get_eclass_for_sort_expr(PlannerInfo=20*root,=0A=20=09= =09=09=09=09=09=09=09=09=09=09=09=20=20Oid=20opcintype,=0A=20=09=09=09=09= =09=09=09=09=09=09=09=09=20=20Oid=20collation,=0A=20=09=09=09=09=09=09=09= =09=09=09=09=09=20=20Index=20sortref,=0A-=09=09=09=09=09=09=09=09=09=09=09= =09=20=20Relids=20rel,=0A+=09=09=09=09=09=09=09=09=09=09=09=09=20=20= Relids=20relids,=0A=20=09=09=09=09=09=09=09=09=09=09=09=09=20=20bool=20= create_it);=0A=20extern=20EquivalenceMember=20= *find_ec_member_matching_expr(EquivalenceClass=20*ec,=0A=20=09=09=09=09=09= =09=09=09=09=09=09=09=09=20=20=20Expr=20*expr,=0Adiff=20--git=20= a/src/include/storage/read_stream.h=20= b/src/include/storage/read_stream.h=0Aindex=2048995c6d534..f89b16bca5a=20= 100644=0A---=20a/src/include/storage/read_stream.h=0A+++=20= b/src/include/storage/read_stream.h=0A@@=20-89,7=20+89,7=20@@=20extern=20= ReadStream=20*read_stream_begin_relation(int=20flags,=0A=20=09=09=09=09=09= =09=09=09=09=09=09=20=20ReadStreamBlockNumberCB=20callback,=0A=20=09=09=09= =09=09=09=09=09=09=09=09=20=20void=20*callback_private_data,=0A=20=09=09=09= =09=09=09=09=09=09=09=09=20=20size_t=20per_buffer_data_size);=0A-extern=20= Buffer=20read_stream_next_buffer(ReadStream=20*stream,=20void=20= **per_buffer_data);=0A+extern=20Buffer=20= read_stream_next_buffer(ReadStream=20*stream,=20void=20= **pper_buffer_data);=0A=20extern=20BlockNumber=20= read_stream_next_block(ReadStream=20*stream,=0A=20=09=09=09=09=09=09=09=09= =09=09=20=20BufferAccessStrategy=20*strategy);=0A=20extern=20ReadStream=20= *read_stream_begin_smgr_relation(int=20flags,=0A--=20=0A2.50.1=20(Apple=20= Git-155)=0A=0A= --Apple-Mail=_B830DCCB-64C7-4AD6-938E-E4A843BDEE74 Content-Disposition: attachment; filename=v8-0003-cleanup-fix-macro-induced-variable-shadowing-in-i.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="v8-0003-cleanup-fix-macro-induced-variable-shadowing-in-i.patch" Content-Transfer-Encoding: quoted-printable =46rom=2057aa9eafddc4b553bda4b77ecea159713e91261d=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20"Chao=20Li=20(Evan)"=20=0A= Date:=20Tue,=202=20Dec=202025=2012:08:03=20+0800=0ASubject:=20[PATCH=20= v8=2003/12]=20cleanup:=20fix=20macro-induced=20variable=20shadowing=20in=0A= =20inval.c=0A=0AThis=20commit=20resolves=20a=20shadowing=20issue=20in=20= inval.c=20where=20variables=20defined=0Ainside=20the=20= ProcessMessageSubGroup=20and=20ProcessMessageSubGroupMulti=20macros=0A= conflicted=20with=20an=20existing=20local=20name.=20The=20fix=20renames=20= the=20macro-scoped=0Avariable=20so=20it=20no=20longer=20shadows=20the=20= local=20variable=20at=20the=20call=20site.=0A=0AAuthor:=20Chao=20Li=20= =0ADiscussion:=20= https://postgr.es/m/CAEoWx2kQ2x5gMaj8tHLJ3=3DjfC+p5YXHkJyHrDTiQw2nn2FJTmQ@= mail.gmail.com=0A---=0A=20src/backend/utils/cache/inval.c=20|=2044=20= ++++++++++++++++-----------------=0A=201=20file=20changed,=2022=20= insertions(+),=2022=20deletions(-)=0A=0Adiff=20--git=20= a/src/backend/utils/cache/inval.c=20b/src/backend/utils/cache/inval.c=0A= index=20d59216b28f1..4072aa06703=20100644=0A---=20= a/src/backend/utils/cache/inval.c=0A+++=20= b/src/backend/utils/cache/inval.c=0A@@=20-387,7=20+387,7=20@@=20= AppendInvalidationMessageSubGroup(InvalidationMsgsGroup=20*dest,=0A=20=09= =09int=09=09_endmsg=20=3D=20(group)->nextmsg[subgroup];=20\=0A=20=09=09= for=20(;=20_msgindex=20<=20_endmsg;=20_msgindex++)=20\=0A=20=09=09{=20\=0A= -=09=09=09SharedInvalidationMessage=20*msg=20=3D=20\=0A+=09=09=09= SharedInvalidationMessage=20*_msg=20=3D=20\=0A=20=09=09=09=09= &InvalMessageArrays[subgroup].msgs[_msgindex];=20\=0A=20=09=09=09= codeFragment;=20\=0A=20=09=09}=20\=0A@@=20-403,7=20+403,7=20@@=20= AppendInvalidationMessageSubGroup(InvalidationMsgsGroup=20*dest,=0A=20=09= do=20{=20\=0A=20=09=09int=09=09n=20=3D=20NumMessagesInSubGroup(group,=20= subgroup);=20\=0A=20=09=09if=20(n=20>=200)=20{=20\=0A-=09=09=09= SharedInvalidationMessage=20*msgs=20=3D=20\=0A+=09=09=09= SharedInvalidationMessage=20*_msgs=20=3D=20\=0A=20=09=09=09=09= &InvalMessageArrays[subgroup].msgs[(group)->firstmsg[subgroup]];=20\=0A=20= =09=09=09codeFragment;=20\=0A=20=09=09}=20\=0A@@=20-479,9=20+479,9=20@@=20= AddRelcacheInvalidationMessage(InvalidationMsgsGroup=20*group,=0A=20=09=20= *=20don't=20need=20to=20add=20individual=20ones=20when=20it=20is=20= present.=0A=20=09=20*/=0A=20=09ProcessMessageSubGroup(group,=20= RelCacheMsgs,=0A-=09=09=09=09=09=09=20=20=20if=20(msg->rc.id=20=3D=3D=20= SHAREDINVALRELCACHE_ID=20&&=0A-=09=09=09=09=09=09=09=20=20=20= (msg->rc.relId=20=3D=3D=20relId=20||=0A-=09=09=09=09=09=09=09=09= msg->rc.relId=20=3D=3D=20InvalidOid))=0A+=09=09=09=09=09=09=20=20=20if=20= (_msg->rc.id=20=3D=3D=20SHAREDINVALRELCACHE_ID=20&&=0A+=09=09=09=09=09=09= =09=20=20=20(_msg->rc.relId=20=3D=3D=20relId=20||=0A+=09=09=09=09=09=09=09= =09_msg->rc.relId=20=3D=3D=20InvalidOid))=0A=20=09=09=09=09=09=09=20=20=20= return);=0A=20=0A=20=09/*=20OK,=20add=20the=20item=20*/=0A@@=20-509,9=20= +509,9=20@@=20AddRelsyncInvalidationMessage(InvalidationMsgsGroup=20= *group,=0A=20=0A=20=09/*=20Don't=20add=20a=20duplicate=20item.=20*/=0A=20= =09ProcessMessageSubGroup(group,=20RelCacheMsgs,=0A-=09=09=09=09=09=09=20= =20=20if=20(msg->rc.id=20=3D=3D=20SHAREDINVALRELSYNC_ID=20&&=0A-=09=09=09= =09=09=09=09=20=20=20(msg->rc.relId=20=3D=3D=20relId=20||=0A-=09=09=09=09= =09=09=09=09msg->rc.relId=20=3D=3D=20InvalidOid))=0A+=09=09=09=09=09=09=20= =20=20if=20(_msg->rc.id=20=3D=3D=20SHAREDINVALRELSYNC_ID=20&&=0A+=09=09=09= =09=09=09=09=20=20=20(_msg->rc.relId=20=3D=3D=20relId=20||=0A+=09=09=09=09= =09=09=09=09_msg->rc.relId=20=3D=3D=20InvalidOid))=0A=20=09=09=09=09=09=09= =20=20=20return);=0A=20=0A=20=09/*=20OK,=20add=20the=20item=20*/=0A@@=20= -538,8=20+538,8=20@@=20= AddSnapshotInvalidationMessage(InvalidationMsgsGroup=20*group,=0A=20=09= /*=20Don't=20add=20a=20duplicate=20item=20*/=0A=20=09/*=20We=20assume=20= dbId=20need=20not=20be=20checked=20because=20it=20will=20never=20change=20= */=0A=20=09ProcessMessageSubGroup(group,=20RelCacheMsgs,=0A-=09=09=09=09=09= =09=20=20=20if=20(msg->sn.id=20=3D=3D=20SHAREDINVALSNAPSHOT_ID=20&&=0A-=09= =09=09=09=09=09=09=20=20=20msg->sn.relId=20=3D=3D=20relId)=0A+=09=09=09=09= =09=09=20=20=20if=20(_msg->sn.id=20=3D=3D=20SHAREDINVALSNAPSHOT_ID=20&&=0A= +=09=09=09=09=09=09=09=20=20=20_msg->sn.relId=20=3D=3D=20relId)=0A=20=09=09= =09=09=09=09=20=20=20return);=0A=20=0A=20=09/*=20OK,=20add=20the=20item=20= */=0A@@=20-574,8=20+574,8=20@@=20static=20void=0A=20= ProcessInvalidationMessages(InvalidationMsgsGroup=20*group,=0A=20=09=09=09= =09=09=09=09void=20(*func)=20(SharedInvalidationMessage=20*msg))=0A=20{=0A= -=09ProcessMessageSubGroup(group,=20CatCacheMsgs,=20func(msg));=0A-=09= ProcessMessageSubGroup(group,=20RelCacheMsgs,=20func(msg));=0A+=09= ProcessMessageSubGroup(group,=20CatCacheMsgs,=20func(_msg));=0A+=09= ProcessMessageSubGroup(group,=20RelCacheMsgs,=20func(_msg));=0A=20}=0A=20= =0A=20/*=0A@@=20-586,8=20+586,8=20@@=20static=20void=0A=20= ProcessInvalidationMessagesMulti(InvalidationMsgsGroup=20*group,=0A=20=09= =09=09=09=09=09=09=09=20void=20(*func)=20(const=20= SharedInvalidationMessage=20*msgs,=20int=20n))=0A=20{=0A-=09= ProcessMessageSubGroupMulti(group,=20CatCacheMsgs,=20func(msgs,=20n));=0A= -=09ProcessMessageSubGroupMulti(group,=20RelCacheMsgs,=20func(msgs,=20= n));=0A+=09ProcessMessageSubGroupMulti(group,=20CatCacheMsgs,=20= func(_msgs,=20n));=0A+=09ProcessMessageSubGroupMulti(group,=20= RelCacheMsgs,=20func(_msgs,=20n));=0A=20}=0A=20=0A=20/*=20= ----------------------------------------------------------------=0A@@=20= -1053,25=20+1053,25=20@@=20= xactGetCommittedInvalidationMessages(SharedInvalidationMessage=20**msgs,=0A= =20=09ProcessMessageSubGroupMulti(&transInvalInfo->PriorCmdInvalidMsgs,=0A= =20=09=09=09=09=09=09=09=09CatCacheMsgs,=0A=20=09=09=09=09=09=09=09=09= (memcpy(msgarray=20+=20nmsgs,=0A-=09=09=09=09=09=09=09=09=09=09msgs,=0A+=09= =09=09=09=09=09=09=09=09=09_msgs,=0A=20=09=09=09=09=09=09=09=09=09=09n=20= *=20sizeof(SharedInvalidationMessage)),=0A=20=09=09=09=09=09=09=09=09=20= nmsgs=20+=3D=20n));=0A=20=09= ProcessMessageSubGroupMulti(&transInvalInfo->ii.CurrentCmdInvalidMsgs,=0A= =20=09=09=09=09=09=09=09=09CatCacheMsgs,=0A=20=09=09=09=09=09=09=09=09= (memcpy(msgarray=20+=20nmsgs,=0A-=09=09=09=09=09=09=09=09=09=09msgs,=0A+=09= =09=09=09=09=09=09=09=09=09_msgs,=0A=20=09=09=09=09=09=09=09=09=09=09n=20= *=20sizeof(SharedInvalidationMessage)),=0A=20=09=09=09=09=09=09=09=09=20= nmsgs=20+=3D=20n));=0A=20=09= ProcessMessageSubGroupMulti(&transInvalInfo->PriorCmdInvalidMsgs,=0A=20=09= =09=09=09=09=09=09=09RelCacheMsgs,=0A=20=09=09=09=09=09=09=09=09= (memcpy(msgarray=20+=20nmsgs,=0A-=09=09=09=09=09=09=09=09=09=09msgs,=0A+=09= =09=09=09=09=09=09=09=09=09_msgs,=0A=20=09=09=09=09=09=09=09=09=09=09n=20= *=20sizeof(SharedInvalidationMessage)),=0A=20=09=09=09=09=09=09=09=09=20= nmsgs=20+=3D=20n));=0A=20=09= ProcessMessageSubGroupMulti(&transInvalInfo->ii.CurrentCmdInvalidMsgs,=0A= =20=09=09=09=09=09=09=09=09RelCacheMsgs,=0A=20=09=09=09=09=09=09=09=09= (memcpy(msgarray=20+=20nmsgs,=0A-=09=09=09=09=09=09=09=09=09=09msgs,=0A+=09= =09=09=09=09=09=09=09=09=09_msgs,=0A=20=09=09=09=09=09=09=09=09=09=09n=20= *=20sizeof(SharedInvalidationMessage)),=0A=20=09=09=09=09=09=09=09=09=20= nmsgs=20+=3D=20n));=0A=20=09Assert(nmsgs=20=3D=3D=20nummsgs);=0A@@=20= -1109,13=20+1109,13=20@@=20= inplaceGetInvalidationMessages(SharedInvalidationMessage=20**msgs,=0A=20=09= ProcessMessageSubGroupMulti(&inplaceInvalInfo->CurrentCmdInvalidMsgs,=0A=20= =09=09=09=09=09=09=09=09CatCacheMsgs,=0A=20=09=09=09=09=09=09=09=09= (memcpy(msgarray=20+=20nmsgs,=0A-=09=09=09=09=09=09=09=09=09=09msgs,=0A+=09= =09=09=09=09=09=09=09=09=09_msgs,=0A=20=09=09=09=09=09=09=09=09=09=09n=20= *=20sizeof(SharedInvalidationMessage)),=0A=20=09=09=09=09=09=09=09=09=20= nmsgs=20+=3D=20n));=0A=20=09= ProcessMessageSubGroupMulti(&inplaceInvalInfo->CurrentCmdInvalidMsgs,=0A=20= =09=09=09=09=09=09=09=09RelCacheMsgs,=0A=20=09=09=09=09=09=09=09=09= (memcpy(msgarray=20+=20nmsgs,=0A-=09=09=09=09=09=09=09=09=09=09msgs,=0A+=09= =09=09=09=09=09=09=09=09=09_msgs,=0A=20=09=09=09=09=09=09=09=09=09=09n=20= *=20sizeof(SharedInvalidationMessage)),=0A=20=09=09=09=09=09=09=09=09=20= nmsgs=20+=3D=20n));=0A=20=09Assert(nmsgs=20=3D=3D=20nummsgs);=0A@@=20= -1959,10=20+1959,10=20@@=20LogLogicalInvalidations(void)=0A=20=09=09= XLogBeginInsert();=0A=20=09=09XLogRegisterData(&xlrec,=20= MinSizeOfXactInvals);=0A=20=09=09ProcessMessageSubGroupMulti(group,=20= CatCacheMsgs,=0A-=09=09=09=09=09=09=09=09=09XLogRegisterData(msgs,=0A+=09= =09=09=09=09=09=09=09=09XLogRegisterData(_msgs,=0A=20=09=09=09=09=09=09=09= =09=09=09=09=09=09=20n=20*=20sizeof(SharedInvalidationMessage)));=0A=20=09= =09ProcessMessageSubGroupMulti(group,=20RelCacheMsgs,=0A-=09=09=09=09=09=09= =09=09=09XLogRegisterData(msgs,=0A+=09=09=09=09=09=09=09=09=09= XLogRegisterData(_msgs,=0A=20=09=09=09=09=09=09=09=09=09=09=09=09=09=20n=20= *=20sizeof(SharedInvalidationMessage)));=0A=20=09=09= XLogInsert(RM_XACT_ID,=20XLOG_XACT_INVALIDATIONS);=0A=20=09}=0A--=20=0A= 2.50.1=20(Apple=20Git-155)=0A=0A= --Apple-Mail=_B830DCCB-64C7-4AD6-938E-E4A843BDEE74 Content-Disposition: attachment; filename=v8-0004-cleanup-avoid-local-wal_level-and-wal_segment_siz.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="v8-0004-cleanup-avoid-local-wal_level-and-wal_segment_siz.patch" Content-Transfer-Encoding: quoted-printable =46rom=20cf97f39017f97ad17636f3ccb12f5e5ce318e9ed=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20"Chao=20Li=20(Evan)"=20=0A= Date:=20Tue,=202=20Dec=202025=2013:45:05=20+0800=0ASubject:=20[PATCH=20= v8=2004/12]=20cleanup:=20avoid=20local=20wal_level=20and=20= wal_segment_size=0A=20being=20shadowed=20by=20globals=0A=0AThis=20commit=20= fixes=20cases=20where=20local=20variables=20named=20wal_level=20and=0A= wal_segment_size=20were=20shadowed=20by=20global=20identifiers=20of=20= the=20same=20names.=0AThe=20local=20variables=20are=20renamed=20so=20= they=20are=20no=20longer=20shadowed=20by=20the=0Aglobals.=0A=0AAuthor:=20= Chao=20Li=20=0AReviewed-by:=20Andres=20Freund=20= =0ADiscussion:=20= https://postgr.es/m/CAEoWx2kQ2x5gMaj8tHLJ3=3DjfC+p5YXHkJyHrDTiQw2nn2FJTmQ@= mail.gmail.com=0A---=0A=20src/backend/access/rmgrdesc/xlogdesc.c=20=20|=20= 6=20+++---=0A=20src/backend/access/transam/xlogreader.c=20|=204=20++--=0A= =20src/bin/pg_controldata/pg_controldata.c=20|=204=20++--=0A=20= src/include/access/xlogreader.h=20=20=20=20=20=20=20=20=20|=202=20+-=0A=20= 4=20files=20changed,=208=20insertions(+),=208=20deletions(-)=0A=0Adiff=20= --git=20a/src/backend/access/rmgrdesc/xlogdesc.c=20= b/src/backend/access/rmgrdesc/xlogdesc.c=0Aindex=20= 2468a7d2578..9af5b42b347=20100644=0A---=20= a/src/backend/access/rmgrdesc/xlogdesc.c=0A+++=20= b/src/backend/access/rmgrdesc/xlogdesc.c=0A@@=20-35,17=20+35,17=20@@=20= const=20struct=20config_enum_entry=20wal_level_options[]=20=3D=20{=0A=20= };=0A=20=0A=20/*=0A-=20*=20Find=20a=20string=20representation=20for=20= wal_level=0A+=20*=20Find=20a=20string=20representation=20for=20wal=20= level=0A=20=20*/=0A=20static=20const=20char=20*=0A= -get_wal_level_string(int=20wal_level)=0A+get_wal_level_string(int=20= level)=0A=20{=0A=20=09const=20struct=20config_enum_entry=20*entry;=0A=20=09= const=20char=20*wal_level_str=20=3D=20"?";=0A=20=0A=20=09for=20(entry=20= =3D=20wal_level_options;=20entry->name;=20entry++)=0A=20=09{=0A-=09=09if=20= (entry->val=20=3D=3D=20wal_level)=0A+=09=09if=20(entry->val=20=3D=3D=20= level)=0A=20=09=09{=0A=20=09=09=09wal_level_str=20=3D=20entry->name;=0A=20= =09=09=09break;=0Adiff=20--git=20= a/src/backend/access/transam/xlogreader.c=20= b/src/backend/access/transam/xlogreader.c=0Aindex=20= 8849610db00..f3360698278=20100644=0A---=20= a/src/backend/access/transam/xlogreader.c=0A+++=20= b/src/backend/access/transam/xlogreader.c=0A@@=20-105,7=20+105,7=20@@=20= XLogReaderSetDecodeBuffer(XLogReaderState=20*state,=20void=20*buffer,=20= size_t=20size)=0A=20=20*=20Returns=20NULL=20if=20the=20xlogreader=20= couldn't=20be=20allocated.=0A=20=20*/=0A=20XLogReaderState=20*=0A= -XLogReaderAllocate(int=20wal_segment_size,=20const=20char=20*waldir,=0A= +XLogReaderAllocate(int=20wal_seg_size,=20const=20char=20*waldir,=0A=20=09= =09=09=09=20=20=20XLogReaderRoutine=20*routine,=20void=20*private_data)=0A= =20{=0A=20=09XLogReaderState=20*state;=0A@@=20-135,7=20+135,7=20@@=20= XLogReaderAllocate(int=20wal_segment_size,=20const=20char=20*waldir,=0A=20= =09}=0A=20=0A=20=09/*=20Initialize=20segment=20info.=20*/=0A-=09= WALOpenSegmentInit(&state->seg,=20&state->segcxt,=20wal_segment_size,=0A= +=09WALOpenSegmentInit(&state->seg,=20&state->segcxt,=20wal_seg_size,=0A=20= =09=09=09=09=09=20=20=20waldir);=0A=20=0A=20=09/*=20system_identifier=20= initialized=20to=20zeroes=20above=20*/=0Adiff=20--git=20= a/src/bin/pg_controldata/pg_controldata.c=20= b/src/bin/pg_controldata/pg_controldata.c=0Aindex=20= fe5fc5ec133..1d2577bb2c0=20100644=0A---=20= a/src/bin/pg_controldata/pg_controldata.c=0A+++=20= b/src/bin/pg_controldata/pg_controldata.c=0A@@=20-70,9=20+70,9=20@@=20= dbState(DBState=20state)=0A=20}=0A=20=0A=20static=20const=20char=20*=0A= -wal_level_str(WalLevel=20wal_level)=0A+wal_level_str(WalLevel=20level)=0A= =20{=0A-=09switch=20(wal_level)=0A+=09switch=20(level)=0A=20=09{=0A=20=09= =09case=20WAL_LEVEL_MINIMAL:=0A=20=09=09=09return=20"minimal";=0Adiff=20= --git=20a/src/include/access/xlogreader.h=20= b/src/include/access/xlogreader.h=0Aindex=2097eae2c1dab..73d35144dff=20= 100644=0A---=20a/src/include/access/xlogreader.h=0A+++=20= b/src/include/access/xlogreader.h=0A@@=20-327,7=20+327,7=20@@=20= XLogReaderHasQueuedRecordOrError(XLogReaderState=20*state)=0A=20}=0A=20=0A= =20/*=20Get=20a=20new=20XLogReader=20*/=0A-extern=20XLogReaderState=20= *XLogReaderAllocate(int=20wal_segment_size,=0A+extern=20XLogReaderState=20= *XLogReaderAllocate(int=20wal_seg_size,=0A=20=09=09=09=09=09=09=09=09=09=09= =20=20=20const=20char=20*waldir,=0A=20=09=09=09=09=09=09=09=09=09=09=20=20= =20XLogReaderRoutine=20*routine,=0A=20=09=09=09=09=09=09=09=09=09=09=20=20= =20void=20*private_data);=0A--=20=0A2.50.1=20(Apple=20Git-155)=0A=0A= --Apple-Mail=_B830DCCB-64C7-4AD6-938E-E4A843BDEE74 Content-Disposition: attachment; filename=v8-0005-cleanup-avoid-local-variables-shadowed-by-static-.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="v8-0005-cleanup-avoid-local-variables-shadowed-by-static-.patch" Content-Transfer-Encoding: quoted-printable =46rom=20a34e341962d8f181c5e9f3c509f2bcf0b3e66c43=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20"Chao=20Li=20(Evan)"=20=0A= Date:=20Tue,=202=20Dec=202025=2014:59:53=20+0800=0ASubject:=20[PATCH=20= v8=2005/12]=20cleanup:=20avoid=20local=20variables=20shadowed=20by=20= static=0A=20file-scope=20ones=20in=20file_ops.c=0A=0AThis=20commit=20= fixes=20several=20cases=20in=20file_ops.c=20where=20local=20variables=20= used=0Anames=20that=20conflicted=20with=20static=20variables=20defined=20= at=20file=20scope.=20The=0Alocal=20identifiers=20are=20renamed=20so=20= they=20are=20no=20longer=20shadowed=20by=20the=20file-=0Ascope=20= variables=20and=20remain=20unambiguous=20within=20their=20respective=20= blocks.=0A=0AAuthor:=20Chao=20Li=20=0ADiscussion:=20= https://postgr.es/m/CAEoWx2kQ2x5gMaj8tHLJ3=3DjfC+p5YXHkJyHrDTiQw2nn2FJTmQ@= mail.gmail.com=0A---=0A=20src/bin/pg_rewind/file_ops.c=20|=2050=20= ++++++++++++++++++------------------=0A=201=20file=20changed,=2025=20= insertions(+),=2025=20deletions(-)=0A=0Adiff=20--git=20= a/src/bin/pg_rewind/file_ops.c=20b/src/bin/pg_rewind/file_ops.c=0Aindex=20= 5cfb676f41f..3279a56f531=20100644=0A---=20a/src/bin/pg_rewind/file_ops.c=0A= +++=20b/src/bin/pg_rewind/file_ops.c=0A@@=20-186,41=20+186,41=20@@=20= create_target(file_entry_t=20*entry)=0A=20void=0A=20= remove_target_file(const=20char=20*path,=20bool=20missing_ok)=0A=20{=0A-=09= char=09=09dstpath[MAXPGPATH];=0A+=09char=09=09pathbuf[MAXPGPATH];=0A=20=0A= =20=09if=20(dry_run)=0A=20=09=09return;=0A=20=0A-=09snprintf(dstpath,=20= sizeof(dstpath),=20"%s/%s",=20datadir_target,=20path);=0A-=09if=20= (unlink(dstpath)=20!=3D=200)=0A+=09snprintf(pathbuf,=20sizeof(pathbuf),=20= "%s/%s",=20datadir_target,=20path);=0A+=09if=20(unlink(pathbuf)=20!=3D=20= 0)=0A=20=09{=0A=20=09=09if=20(errno=20=3D=3D=20ENOENT=20&&=20missing_ok)=0A= =20=09=09=09return;=0A=20=0A=20=09=09pg_fatal("could=20not=20remove=20= file=20\"%s\":=20%m",=0A-=09=09=09=09=20dstpath);=0A+=09=09=09=09=20= pathbuf);=0A=20=09}=0A=20}=0A=20=0A=20void=0A=20= truncate_target_file(const=20char=20*path,=20off_t=20newsize)=0A=20{=0A-=09= char=09=09dstpath[MAXPGPATH];=0A+=09char=09=09pathbuf[MAXPGPATH];=0A=20=09= int=09=09=09fd;=0A=20=0A=20=09if=20(dry_run)=0A=20=09=09return;=0A=20=0A= -=09snprintf(dstpath,=20sizeof(dstpath),=20"%s/%s",=20datadir_target,=20= path);=0A+=09snprintf(pathbuf,=20sizeof(pathbuf),=20"%s/%s",=20= datadir_target,=20path);=0A=20=0A-=09fd=20=3D=20open(dstpath,=20= O_WRONLY,=20pg_file_create_mode);=0A+=09fd=20=3D=20open(pathbuf,=20= O_WRONLY,=20pg_file_create_mode);=0A=20=09if=20(fd=20<=200)=0A=20=09=09= pg_fatal("could=20not=20open=20file=20\"%s\"=20for=20truncation:=20%m",=0A= -=09=09=09=09=20dstpath);=0A+=09=09=09=09=20pathbuf);=0A=20=0A=20=09if=20= (ftruncate(fd,=20newsize)=20!=3D=200)=0A=20=09=09pg_fatal("could=20not=20= truncate=20file=20\"%s\"=20to=20%u:=20%m",=0A-=09=09=09=09=20dstpath,=20= (unsigned=20int)=20newsize);=0A+=09=09=09=09=20pathbuf,=20(unsigned=20= int)=20newsize);=0A=20=0A=20=09close(fd);=0A=20}=0A@@=20-228,57=20= +228,57=20@@=20truncate_target_file(const=20char=20*path,=20off_t=20= newsize)=0A=20static=20void=0A=20create_target_dir(const=20char=20*path)=0A= =20{=0A-=09char=09=09dstpath[MAXPGPATH];=0A+=09char=09=09= pathbuf[MAXPGPATH];=0A=20=0A=20=09if=20(dry_run)=0A=20=09=09return;=0A=20= =0A-=09snprintf(dstpath,=20sizeof(dstpath),=20"%s/%s",=20datadir_target,=20= path);=0A-=09if=20(mkdir(dstpath,=20pg_dir_create_mode)=20!=3D=200)=0A+=09= snprintf(pathbuf,=20sizeof(pathbuf),=20"%s/%s",=20datadir_target,=20= path);=0A+=09if=20(mkdir(pathbuf,=20pg_dir_create_mode)=20!=3D=200)=0A=20= =09=09pg_fatal("could=20not=20create=20directory=20\"%s\":=20%m",=0A-=09=09= =09=09=20dstpath);=0A+=09=09=09=09=20pathbuf);=0A=20}=0A=20=0A=20static=20= void=0A=20remove_target_dir(const=20char=20*path)=0A=20{=0A-=09char=09=09= dstpath[MAXPGPATH];=0A+=09char=09=09pathbuf[MAXPGPATH];=0A=20=0A=20=09if=20= (dry_run)=0A=20=09=09return;=0A=20=0A-=09snprintf(dstpath,=20= sizeof(dstpath),=20"%s/%s",=20datadir_target,=20path);=0A-=09if=20= (rmdir(dstpath)=20!=3D=200)=0A+=09snprintf(pathbuf,=20sizeof(pathbuf),=20= "%s/%s",=20datadir_target,=20path);=0A+=09if=20(rmdir(pathbuf)=20!=3D=20= 0)=0A=20=09=09pg_fatal("could=20not=20remove=20directory=20\"%s\":=20= %m",=0A-=09=09=09=09=20dstpath);=0A+=09=09=09=09=20pathbuf);=0A=20}=0A=20= =0A=20static=20void=0A=20create_target_symlink(const=20char=20*path,=20= const=20char=20*link)=0A=20{=0A-=09char=09=09dstpath[MAXPGPATH];=0A+=09= char=09=09pathbuf[MAXPGPATH];=0A=20=0A=20=09if=20(dry_run)=0A=20=09=09= return;=0A=20=0A-=09snprintf(dstpath,=20sizeof(dstpath),=20"%s/%s",=20= datadir_target,=20path);=0A-=09if=20(symlink(link,=20dstpath)=20!=3D=20= 0)=0A+=09snprintf(pathbuf,=20sizeof(pathbuf),=20"%s/%s",=20= datadir_target,=20path);=0A+=09if=20(symlink(link,=20pathbuf)=20!=3D=20= 0)=0A=20=09=09pg_fatal("could=20not=20create=20symbolic=20link=20at=20= \"%s\":=20%m",=0A-=09=09=09=09=20dstpath);=0A+=09=09=09=09=20pathbuf);=0A= =20}=0A=20=0A=20static=20void=0A=20remove_target_symlink(const=20char=20= *path)=0A=20{=0A-=09char=09=09dstpath[MAXPGPATH];=0A+=09char=09=09= pathbuf[MAXPGPATH];=0A=20=0A=20=09if=20(dry_run)=0A=20=09=09return;=0A=20= =0A-=09snprintf(dstpath,=20sizeof(dstpath),=20"%s/%s",=20datadir_target,=20= path);=0A-=09if=20(unlink(dstpath)=20!=3D=200)=0A+=09snprintf(pathbuf,=20= sizeof(pathbuf),=20"%s/%s",=20datadir_target,=20path);=0A+=09if=20= (unlink(pathbuf)=20!=3D=200)=0A=20=09=09pg_fatal("could=20not=20remove=20= symbolic=20link=20\"%s\":=20%m",=0A-=09=09=09=09=20dstpath);=0A+=09=09=09= =09=20pathbuf);=0A=20}=0A=20=0A=20/*=0A--=20=0A2.50.1=20(Apple=20= Git-155)=0A=0A= --Apple-Mail=_B830DCCB-64C7-4AD6-938E-E4A843BDEE74 Content-Disposition: attachment; filename=v8-0006-cleanup-avoid-local-variables-shadowed-by-globals.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="v8-0006-cleanup-avoid-local-variables-shadowed-by-globals.patch" Content-Transfer-Encoding: quoted-printable =46rom=2048745ffcc7f2e0c48a9a697f0bfba6cefc02d855=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20"Chao=20Li=20(Evan)"=20=0A= Date:=20Tue,=202=20Dec=202025=2015:05:05=20+0800=0ASubject:=20[PATCH=20= v8=2006/12]=20cleanup:=20avoid=20local=20variables=20shadowed=20by=20= globals=0A=20across=20several=20files=0A=0AThis=20commit=20fixes=20= multiple=20instances=20where=20local=20variables=20used=20the=20same=0A= names=20as=20global=20identifiers=20in=20various=20modules.=20The=20= affected=20locals=20are=0Arenamed=20so=20they=20are=20no=20longer=20= shadowed=20by=20the=20globals=20and=20remain=20clear=0Awithin=20their=20= respective=20scopes.=0A=0AAuthor:=20Chao=20Li=20=0A= Discussion:=20= https://postgr.es/m/CAEoWx2kQ2x5gMaj8tHLJ3=3DjfC+p5YXHkJyHrDTiQw2nn2FJTmQ@= mail.gmail.com=0A---=0A=20src/backend/libpq/be-secure-common.c=20=20=20=20= =20=20=20=20=20|=2012=20+++----=0A=20src/common/controldata_utils.c=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20|=20=208=20++---=0A=20= src/include/common/controldata_utils.h=20=20=20=20=20=20=20|=20=204=20= +--=0A=20src/include/libpq/libpq.h=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20|=20=202=20+-=0A=20= src/interfaces/ecpg/preproc/descriptor.c=20=20=20=20=20|=2034=20= ++++++++++----------=0A=20src/interfaces/ecpg/preproc/preproc_extern.h=20= |=20=206=20++--=0A=206=20files=20changed,=2033=20insertions(+),=2033=20= deletions(-)=0A=0Adiff=20--git=20a/src/backend/libpq/be-secure-common.c=20= b/src/backend/libpq/be-secure-common.c=0Aindex=20= ad04bedaa1d..ee59b77c938=20100644=0A---=20= a/src/backend/libpq/be-secure-common.c=0A+++=20= b/src/backend/libpq/be-secure-common.c=0A@@=20-118,17=20+118,17=20@@=20= error:=0A=20=20*=20Check=20permissions=20for=20SSL=20key=20files.=0A=20=20= */=0A=20bool=0A-check_ssl_key_file_permissions(const=20char=20= *ssl_key_file,=20bool=20isServerStart)=0A= +check_ssl_key_file_permissions(const=20char=20*sslKeyFile,=20bool=20= isServerStart)=0A=20{=0A=20=09int=09=09=09loglevel=20=3D=20isServerStart=20= ?=20FATAL=20:=20LOG;=0A=20=09struct=20stat=20buf;=0A=20=0A-=09if=20= (stat(ssl_key_file,=20&buf)=20!=3D=200)=0A+=09if=20(stat(sslKeyFile,=20= &buf)=20!=3D=200)=0A=20=09{=0A=20=09=09ereport(loglevel,=0A=20=09=09=09=09= (errcode_for_file_access(),=0A=20=09=09=09=09=20errmsg("could=20not=20= access=20private=20key=20file=20\"%s\":=20%m",=0A-=09=09=09=09=09=09= ssl_key_file)));=0A+=09=09=09=09=09=09sslKeyFile)));=0A=20=09=09return=20= false;=0A=20=09}=0A=20=0A@@=20-138,7=20+138,7=20@@=20= check_ssl_key_file_permissions(const=20char=20*ssl_key_file,=20bool=20= isServerStart)=0A=20=09=09ereport(loglevel,=0A=20=09=09=09=09= (errcode(ERRCODE_CONFIG_FILE_ERROR),=0A=20=09=09=09=09=20errmsg("private=20= key=20file=20\"%s\"=20is=20not=20a=20regular=20file",=0A-=09=09=09=09=09=09= ssl_key_file)));=0A+=09=09=09=09=09=09sslKeyFile)));=0A=20=09=09return=20= false;=0A=20=09}=0A=20=0A@@=20-164,7=20+164,7=20@@=20= check_ssl_key_file_permissions(const=20char=20*ssl_key_file,=20bool=20= isServerStart)=0A=20=09=09ereport(loglevel,=0A=20=09=09=09=09= (errcode(ERRCODE_CONFIG_FILE_ERROR),=0A=20=09=09=09=09=20errmsg("private=20= key=20file=20\"%s\"=20must=20be=20owned=20by=20the=20database=20user=20= or=20root",=0A-=09=09=09=09=09=09ssl_key_file)));=0A+=09=09=09=09=09=09= sslKeyFile)));=0A=20=09=09return=20false;=0A=20=09}=0A=20=0A@@=20-174,7=20= +174,7=20@@=20check_ssl_key_file_permissions(const=20char=20= *ssl_key_file,=20bool=20isServerStart)=0A=20=09=09ereport(loglevel,=0A=20= =09=09=09=09(errcode(ERRCODE_CONFIG_FILE_ERROR),=0A=20=09=09=09=09=20= errmsg("private=20key=20file=20\"%s\"=20has=20group=20or=20world=20= access",=0A-=09=09=09=09=09=09ssl_key_file),=0A+=09=09=09=09=09=09= sslKeyFile),=0A=20=09=09=09=09=20errdetail("File=20must=20have=20= permissions=20u=3Drw=20(0600)=20or=20less=20if=20owned=20by=20the=20= database=20user,=20or=20permissions=20u=3Drw,g=3Dr=20(0640)=20or=20less=20= if=20owned=20by=20root.")));=0A=20=09=09return=20false;=0A=20=09}=0Adiff=20= --git=20a/src/common/controldata_utils.c=20= b/src/common/controldata_utils.c=0Aindex=204ab116afcde..4b4a35fc01c=20= 100644=0A---=20a/src/common/controldata_utils.c=0A+++=20= b/src/common/controldata_utils.c=0A@@=20-50,11=20+50,11=20@@=0A=20=20*=20= file=20data=20is=20correct.=0A=20=20*/=0A=20ControlFileData=20*=0A= -get_controlfile(const=20char=20*DataDir,=20bool=20*crc_ok_p)=0A= +get_controlfile(const=20char=20*data_dir,=20bool=20*crc_ok_p)=0A=20{=0A=20= =09char=09=09ControlFilePath[MAXPGPATH];=0A=20=0A-=09= snprintf(ControlFilePath,=20MAXPGPATH,=20"%s/%s",=20DataDir,=20= XLOG_CONTROL_FILE);=0A+=09snprintf(ControlFilePath,=20MAXPGPATH,=20= "%s/%s",=20data_dir,=20XLOG_CONTROL_FILE);=0A=20=0A=20=09return=20= get_controlfile_by_exact_path(ControlFilePath,=20crc_ok_p);=0A=20}=0A@@=20= -187,7=20+187,7=20@@=20retry:=0A=20=20*=20routine=20in=20the=20backend.=0A= =20=20*/=0A=20void=0A-update_controlfile(const=20char=20*DataDir,=0A= +update_controlfile(const=20char=20*data_dir,=0A=20=09=09=09=09=20=20=20= ControlFileData=20*ControlFile,=20bool=20do_sync)=0A=20{=0A=20=09int=09=09= =09fd;=0A@@=20-212,7=20+212,7=20@@=20update_controlfile(const=20char=20= *DataDir,=0A=20=09memset(buffer,=200,=20PG_CONTROL_FILE_SIZE);=0A=20=09= memcpy(buffer,=20ControlFile,=20sizeof(ControlFileData));=0A=20=0A-=09= snprintf(ControlFilePath,=20sizeof(ControlFilePath),=20"%s/%s",=20= DataDir,=20XLOG_CONTROL_FILE);=0A+=09snprintf(ControlFilePath,=20= sizeof(ControlFilePath),=20"%s/%s",=20data_dir,=20XLOG_CONTROL_FILE);=0A=20= =0A=20#ifndef=20FRONTEND=0A=20=0Adiff=20--git=20= a/src/include/common/controldata_utils.h=20= b/src/include/common/controldata_utils.h=0Aindex=20= 6dd0999f805..a9d52cd4410=20100644=0A---=20= a/src/include/common/controldata_utils.h=0A+++=20= b/src/include/common/controldata_utils.h=0A@@=20-12,10=20+12,10=20@@=0A=20= =0A=20#include=20"catalog/pg_control.h"=0A=20=0A-extern=20= ControlFileData=20*get_controlfile(const=20char=20*DataDir,=20bool=20= *crc_ok_p);=0A+extern=20ControlFileData=20*get_controlfile(const=20char=20= *data_dir,=20bool=20*crc_ok_p);=0A=20extern=20ControlFileData=20= *get_controlfile_by_exact_path(const=20char=20*ControlFilePath,=0A=20=09=09= =09=09=09=09=09=09=09=09=09=09=09=20=20bool=20*crc_ok_p);=0A-extern=20= void=20update_controlfile(const=20char=20*DataDir,=0A+extern=20void=20= update_controlfile(const=20char=20*data_dir,=0A=20=09=09=09=09=09=09=09=20= =20=20ControlFileData=20*ControlFile,=20bool=20do_sync);=0A=20=0A=20= #endif=09=09=09=09=09=09=09/*=20COMMON_CONTROLDATA_UTILS_H=20*/=0Adiff=20= --git=20a/src/include/libpq/libpq.h=20b/src/include/libpq/libpq.h=0A= index=20c9b934d2321..a948e246078=20100644=0A---=20= a/src/include/libpq/libpq.h=0A+++=20b/src/include/libpq/libpq.h=0A@@=20= -162,7=20+162,7=20@@=20enum=20ssl_protocol_versions=0A=20extern=20int=09= run_ssl_passphrase_command(const=20char=20*cmd,=20const=20char=20= *prompt,=0A=20=09=09=09=09=09=09=09=09=09=20=20=20bool=20= is_server_start,=0A=20=09=09=09=09=09=09=09=09=09=20=20=20char=20*buf,=20= int=20size);=0A-extern=20bool=20check_ssl_key_file_permissions(const=20= char=20*ssl_key_file,=0A+extern=20bool=20= check_ssl_key_file_permissions(const=20char=20*sslKeyFile,=0A=20=09=09=09= =09=09=09=09=09=09=09=20=20=20bool=20isServerStart);=0A=20extern=20int=09= load_hosts(List=20**hosts,=20char=20**err_msg);=0A=20=0Adiff=20--git=20= a/src/interfaces/ecpg/preproc/descriptor.c=20= b/src/interfaces/ecpg/preproc/descriptor.c=0Aindex=20= e8c7016bdc1..9dac761e393=20100644=0A---=20= a/src/interfaces/ecpg/preproc/descriptor.c=0A+++=20= b/src/interfaces/ecpg/preproc/descriptor.c=0A@@=20-72,7=20+72,7=20@@=20= ECPGnumeric_lvalue(char=20*name)=0A=20static=20struct=20descriptor=20= *descriptors;=0A=20=0A=20void=0A-add_descriptor(const=20char=20*name,=20= const=20char=20*connection)=0A+add_descriptor(const=20char=20*name,=20= const=20char=20*conn_str)=0A=20{=0A=20=09struct=20descriptor=20*new;=0A=20= =0A@@=20-83,15=20+83,15=20@@=20add_descriptor(const=20char=20*name,=20= const=20char=20*connection)=0A=20=0A=20=09new->next=20=3D=20descriptors;=0A= =20=09new->name=20=3D=20mm_strdup(name);=0A-=09if=20(connection)=0A-=09=09= new->connection=20=3D=20mm_strdup(connection);=0A+=09if=20(conn_str)=0A+=09= =09new->connection=20=3D=20mm_strdup(conn_str);=0A=20=09else=0A=20=09=09= new->connection=20=3D=20NULL;=0A=20=09descriptors=20=3D=20new;=0A=20}=0A=20= =0A=20void=0A-drop_descriptor(const=20char=20*name,=20const=20char=20= *connection)=0A+drop_descriptor(const=20char=20*name,=20const=20char=20= *conn_str)=0A=20{=0A=20=09struct=20descriptor=20*i;=0A=20=09struct=20= descriptor=20**lastptr=20=3D=20&descriptors;=0A@@=20-103,9=20+103,9=20@@=20= drop_descriptor(const=20char=20*name,=20const=20char=20*connection)=0A=20= =09{=0A=20=09=09if=20(strcmp(name,=20i->name)=20=3D=3D=200)=0A=20=09=09{=0A= -=09=09=09if=20((!connection=20&&=20!i->connection)=0A-=09=09=09=09||=20= (connection=20&&=20i->connection=0A-=09=09=09=09=09&&=20= strcmp(connection,=20i->connection)=20=3D=3D=200))=0A+=09=09=09if=20= ((!conn_str=20&&=20!i->connection)=0A+=09=09=09=09||=20(conn_str=20&&=20= i->connection=0A+=09=09=09=09=09&&=20strcmp(conn_str,=20i->connection)=20= =3D=3D=200))=0A=20=09=09=09{=0A=20=09=09=09=09*lastptr=20=3D=20i->next;=0A= =20=09=09=09=09free(i->connection);=0A@@=20-115,14=20+115,14=20@@=20= drop_descriptor(const=20char=20*name,=20const=20char=20*connection)=0A=20= =09=09=09}=0A=20=09=09}=0A=20=09}=0A-=09if=20(connection)=0A-=09=09= mmerror(PARSE_ERROR,=20ET_WARNING,=20"descriptor=20%s=20bound=20to=20= connection=20%s=20does=20not=20exist",=20name,=20connection);=0A+=09if=20= (conn_str)=0A+=09=09mmerror(PARSE_ERROR,=20ET_WARNING,=20"descriptor=20= %s=20bound=20to=20connection=20%s=20does=20not=20exist",=20name,=20= conn_str);=0A=20=09else=0A=20=09=09mmerror(PARSE_ERROR,=20ET_WARNING,=20= "descriptor=20%s=20bound=20to=20the=20default=20connection=20does=20not=20= exist",=20name);=0A=20}=0A=20=0A=20struct=20descriptor=20*=0A= -lookup_descriptor(const=20char=20*name,=20const=20char=20*connection)=0A= +lookup_descriptor(const=20char=20*name,=20const=20char=20*conn_str)=0A=20= {=0A=20=09struct=20descriptor=20*i;=0A=20=0A@@=20-133,20=20+133,20=20@@=20= lookup_descriptor(const=20char=20*name,=20const=20char=20*connection)=0A=20= =09{=0A=20=09=09if=20(strcmp(name,=20i->name)=20=3D=3D=200)=0A=20=09=09{=0A= -=09=09=09if=20((!connection=20&&=20!i->connection)=0A-=09=09=09=09||=20= (connection=20&&=20i->connection=0A-=09=09=09=09=09&&=20= strcmp(connection,=20i->connection)=20=3D=3D=200))=0A+=09=09=09if=20= ((!conn_str=20&&=20!i->connection)=0A+=09=09=09=09||=20(conn_str=20&&=20= i->connection=0A+=09=09=09=09=09&&=20strcmp(conn_str,=20i->connection)=20= =3D=3D=200))=0A=20=09=09=09=09return=20i;=0A-=09=09=09if=20(connection=20= &&=20!i->connection)=0A+=09=09=09if=20(conn_str=20&&=20!i->connection)=0A= =20=09=09=09{=0A=20=09=09=09=09/*=20overwrite=20descriptor's=20= connection=20*/=0A-=09=09=09=09i->connection=20=3D=20= mm_strdup(connection);=0A+=09=09=09=09i->connection=20=3D=20= mm_strdup(conn_str);=0A=20=09=09=09=09return=20i;=0A=20=09=09=09}=0A=20=09= =09}=0A=20=09}=0A-=09if=20(connection)=0A-=09=09mmerror(PARSE_ERROR,=20= ET_WARNING,=20"descriptor=20%s=20bound=20to=20connection=20%s=20does=20= not=20exist",=20name,=20connection);=0A+=09if=20(conn_str)=0A+=09=09= mmerror(PARSE_ERROR,=20ET_WARNING,=20"descriptor=20%s=20bound=20to=20= connection=20%s=20does=20not=20exist",=20name,=20conn_str);=0A=20=09else=0A= =20=09=09mmerror(PARSE_ERROR,=20ET_WARNING,=20"descriptor=20%s=20bound=20= to=20the=20default=20connection=20does=20not=20exist",=20name);=0A=20=09= return=20NULL;=0Adiff=20--git=20= a/src/interfaces/ecpg/preproc/preproc_extern.h=20= b/src/interfaces/ecpg/preproc/preproc_extern.h=0Aindex=20= 2c89e30621e..337b406380a=20100644=0A---=20= a/src/interfaces/ecpg/preproc/preproc_extern.h=0A+++=20= b/src/interfaces/ecpg/preproc/preproc_extern.h=0A@@=20-97,9=20+97,9=20@@=20= extern=20void=20output_set_descr(const=20char=20*desc_name,=20const=20= char=20*index);=0A=20extern=20void=20push_assignment(const=20char=20= *var,=20enum=20ECPGdtype=20value);=0A=20extern=20struct=20variable=20= *find_variable(const=20char=20*name);=0A=20extern=20void=20= whenever_action(int=20mode);=0A-extern=20void=20add_descriptor(const=20= char=20*name,=20const=20char=20*connection);=0A-extern=20void=20= drop_descriptor(const=20char=20*name,=20const=20char=20*connection);=0A= -extern=20struct=20descriptor=20*lookup_descriptor(const=20char=20*name,=20= const=20char=20*connection);=0A+extern=20void=20add_descriptor(const=20= char=20*name,=20const=20char=20*conn_str);=0A+extern=20void=20= drop_descriptor(const=20char=20*name,=20const=20char=20*conn_str);=0A= +extern=20struct=20descriptor=20*lookup_descriptor(const=20char=20*name,=20= const=20char=20*conn_str);=0A=20extern=20struct=20variable=20= *descriptor_variable(const=20char=20*name,=20int=20input);=0A=20extern=20= struct=20variable=20*sqlda_variable(const=20char=20*name);=0A=20extern=20= void=20add_variable_to_head(struct=20arguments=20**list,=0A--=20=0A= 2.50.1=20(Apple=20Git-155)=0A=0A= --Apple-Mail=_B830DCCB-64C7-4AD6-938E-E4A843BDEE74 Content-Disposition: attachment; filename=v8-0007-cleanup-avoid-local-variables-shadowed-by-static-.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="v8-0007-cleanup-avoid-local-variables-shadowed-by-static-.patch" Content-Transfer-Encoding: quoted-printable =46rom=20070a6408c55818093641d3c1fb4399c4f71ba703=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20"Chao=20Li=20(Evan)"=20=0A= Date:=20Tue,=202=20Dec=202025=2015:26:51=20+0800=0ASubject:=20[PATCH=20= v8=2007/12]=20cleanup:=20avoid=20local=20variables=20shadowed=20by=20= static=0A=20file-scope=20ones=20in=20several=20files=0A=0AThis=20commit=20= fixes=20multiple=20cases=20where=20local=20variables=20used=20names=20= that=0Aconflicted=20with=20static=20variables=20defined=20at=20file=20= scope.=20The=20affected=0Alocals=20are=20renamed=20so=20they=20are=20no=20= longer=20shadowed=20by=20the=20file-scope=0Aidentifiers=20and=20remain=20= unambiguous=20within=20their=20respective=20scopes.=0A=0AAuthor:=20Chao=20= Li=20=0ADiscussion:=20= https://postgr.es/m/CAEoWx2kQ2x5gMaj8tHLJ3=3DjfC+p5YXHkJyHrDTiQw2nn2FJTmQ@= mail.gmail.com=0A---=0A=20src/backend/executor/execExprInterp.c=20|=20=20= 6=20++---=0A=20src/bin/pg_ctl/pg_ctl.c=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20|=20=206=20++---=0A=20src/bin/pg_dump/pg_dumpall.c=20=20=20=20=20= =20=20=20=20=20|=2034=20+++++++++++++--------------=0A=20= src/bin/pg_resetwal/pg_resetwal.c=20=20=20=20=20|=20=208=20+++----=0A=20= src/bin/pg_test_fsync/pg_test_fsync.c=20|=20=208=20+++----=0A=205=20= files=20changed,=2031=20insertions(+),=2031=20deletions(-)=0A=0Adiff=20= --git=20a/src/backend/executor/execExprInterp.c=20= b/src/backend/executor/execExprInterp.c=0Aindex=20= 3c4843cde86..e0f4761d729=20100644=0A---=20= a/src/backend/executor/execExprInterp.c=0A+++=20= b/src/backend/executor/execExprInterp.c=0A@@=20-473,7=20+473,7=20@@=20= ExecInterpExpr(ExprState=20*state,=20ExprContext=20*econtext,=20bool=20= *isnull)=0A=20=09=20*=20This=20array=20has=20to=20be=20in=20the=20same=20= order=20as=20enum=20ExprEvalOp.=0A=20=09=20*/=0A=20#if=20= defined(EEO_USE_COMPUTED_GOTO)=0A-=09static=20const=20void=20*const=20= dispatch_table[]=20=3D=20{=0A+=09static=20const=20void=20*const=20= _dispatch_table[]=20=3D=20{=0A=20=09=09&&CASE_EEOP_DONE_RETURN,=0A=20=09=09= &&CASE_EEOP_DONE_NO_RETURN,=0A=20=09=09&&CASE_EEOP_INNER_FETCHSOME,=0A@@=20= -597,11=20+597,11=20@@=20ExecInterpExpr(ExprState=20*state,=20= ExprContext=20*econtext,=20bool=20*isnull)=0A=20=09=09&&CASE_EEOP_LAST=0A= =20=09};=0A=20=0A-=09StaticAssertDecl(lengthof(dispatch_table)=20=3D=3D=20= EEOP_LAST=20+=201,=0A+=09StaticAssertDecl(lengthof(_dispatch_table)=20=3D=3D= =20EEOP_LAST=20+=201,=0A=20=09=09=09=09=09=20"dispatch_table=20out=20of=20= whack=20with=20ExprEvalOp");=0A=20=0A=20=09if=20(unlikely(state=20=3D=3D=20= NULL))=0A-=09=09return=20PointerGetDatum(dispatch_table);=0A+=09=09= return=20PointerGetDatum(_dispatch_table);=0A=20#else=0A=20=09= Assert(state=20!=3D=20NULL);=0A=20#endif=09=09=09=09=09=09=09/*=20= EEO_USE_COMPUTED_GOTO=20*/=0Adiff=20--git=20a/src/bin/pg_ctl/pg_ctl.c=20= b/src/bin/pg_ctl/pg_ctl.c=0Aindex=205539eb8ebef..be5dd81cb8f=20100644=0A= ---=20a/src/bin/pg_ctl/pg_ctl.c=0A+++=20b/src/bin/pg_ctl/pg_ctl.c=0A@@=20= -873,18=20+873,18=20@@=20trap_sigint_during_startup(SIGNAL_ARGS)=0A=20}=0A= =20=0A=20static=20char=20*=0A-find_other_exec_or_die(const=20char=20= *argv0,=20const=20char=20*target,=20const=20char=20*versionstr)=0A= +find_other_exec_or_die(const=20char=20*myargv0,=20const=20char=20= *target,=20const=20char=20*versionstr)=0A=20{=0A=20=09int=09=09=09ret;=0A= =20=09char=09=20=20=20*found_path;=0A=20=0A=20=09found_path=20=3D=20= pg_malloc(MAXPGPATH);=0A=20=0A-=09if=20((ret=20=3D=20= find_other_exec(argv0,=20target,=20versionstr,=20found_path))=20<=200)=0A= +=09if=20((ret=20=3D=20find_other_exec(myargv0,=20target,=20versionstr,=20= found_path))=20<=200)=0A=20=09{=0A=20=09=09char=09=09= full_path[MAXPGPATH];=0A=20=0A-=09=09if=20(find_my_exec(argv0,=20= full_path)=20<=200)=0A+=09=09if=20(find_my_exec(myargv0,=20full_path)=20= <=200)=0A=20=09=09=09strlcpy(full_path,=20progname,=20= sizeof(full_path));=0A=20=0A=20=09=09if=20(ret=20=3D=3D=20-1)=0Adiff=20= --git=20a/src/bin/pg_dump/pg_dumpall.c=20b/src/bin/pg_dump/pg_dumpall.c=0A= index=209e904f76baa..fa713f4e753=20100644=0A---=20= a/src/bin/pg_dump/pg_dumpall.c=0A+++=20b/src/bin/pg_dump/pg_dumpall.c=0A= @@=20-83,10=20+83,10=20@@=20static=20void=20buildShSecLabels(PGconn=20= *conn,=0A=20=09=09=09=09=09=09=09=20PQExpBuffer=20buffer);=0A=20static=20= void=20executeCommand(PGconn=20*conn,=20const=20char=20*query);=0A=20= static=20void=20check_for_invalid_global_names(PGconn=20*conn,=0A-=09=09=09= =09=09=09=09=09=09=09=20=20=20SimpleStringList=20= *database_exclude_names);=0A+=09=09=09=09=09=09=09=09=09=09=20=20=20= SimpleStringList=20*db_exclude_names);=0A=20static=20void=20= expand_dbname_patterns(PGconn=20*conn,=20SimpleStringList=20*patterns,=0A= =20=09=09=09=09=09=09=09=09=20=20=20SimpleStringList=20*names);=0A= -static=20void=20read_dumpall_filters(const=20char=20*filename,=20= SimpleStringList=20*pattern);=0A+static=20void=20= read_dumpall_filters(const=20char=20*fname,=20SimpleStringList=20= *pattern);=0A=20static=20ArchiveFormat=20parseDumpFormat(const=20char=20= *format);=0A=20static=20int=09createDumpId(void);=0A=20=0A@@=20-2269,7=20= +2269,7=20@@=20executeCommand(PGconn=20*conn,=20const=20char=20*query)=0A= =20=20*/=0A=20static=20void=0A=20check_for_invalid_global_names(PGconn=20= *conn,=0A-=09=09=09=09=09=09=09=20=20=20SimpleStringList=20= *database_exclude_names)=0A+=09=09=09=09=09=09=09=20=20=20= SimpleStringList=20*db_exclude_names)=0A=20{=0A=20=09PGresult=20=20=20= *res;=0A=20=09int=09=09=09i;=0A@@=20-2296,7=20+2296,7=20@@=20= check_for_invalid_global_names(PGconn=20*conn,=0A=20=0A=20=09=09/*=20= Skip=20excluded=20databases=20since=20they=20won't=20be=20in=20map.dat=20= */=0A=20=09=09if=20(strcmp(objtype,=20"database")=20=3D=3D=200=20&&=0A-=09= =09=09simple_string_list_member(database_exclude_names,=20objname))=0A+=09= =09=09simple_string_list_member(db_exclude_names,=20objname))=0A=20=09=09= =09continue;=0A=20=0A=20=09=09if=20(strpbrk(objname,=20"\n\r"))=0A@@=20= -2343,20=20+2343,20=20@@=20dumpTimestamp(const=20char=20*msg)=0A=20=20*=20= read_dumpall_filters=20-=20retrieve=20database=20identifier=20patterns=20= from=20file=0A=20=20*=0A=20=20*=20Parse=20the=20specified=20filter=20= file=20for=20include=20and=20exclude=20patterns,=20and=20add=0A-=20*=20= them=20to=20the=20relevant=20lists.=20=20If=20the=20filename=20is=20"-"=20= then=20filters=20will=20be=0A+=20*=20them=20to=20the=20relevant=20lists.=20= =20If=20the=20fname=20is=20"-"=20then=20filters=20will=20be=0A=20=20*=20= read=20from=20STDIN=20rather=20than=20a=20file.=0A=20=20*=0A=20=20*=20At=20= the=20moment,=20the=20only=20allowed=20filter=20is=20for=20database=20= exclusion.=0A=20=20*/=0A=20static=20void=0A-read_dumpall_filters(const=20= char=20*filename,=20SimpleStringList=20*pattern)=0A= +read_dumpall_filters(const=20char=20*fname,=20SimpleStringList=20= *pattern)=0A=20{=0A=20=09FilterStateData=20fstate;=0A=20=09char=09=20=20=20= *objname;=0A=20=09FilterCommandType=20comtype;=0A=20=09FilterObjectType=20= objtype;=0A=20=0A-=09filter_init(&fstate,=20filename,=20exit);=0A+=09= filter_init(&fstate,=20fname,=20exit);=0A=20=0A=20=09while=20= (filter_read_item(&fstate,=20&objname,=20&comtype,=20&objtype))=0A=20=09= {=0A@@=20-2406,29=20+2406,29=20@@=20read_dumpall_filters(const=20char=20= *filename,=20SimpleStringList=20*pattern)=0A=20static=20ArchiveFormat=0A=20= parseDumpFormat(const=20char=20*format)=0A=20{=0A-=09ArchiveFormat=20= archDumpFormat;=0A+=09ArchiveFormat=20archFormat;=0A=20=0A=20=09if=20= (pg_strcasecmp(format,=20"c")=20=3D=3D=200)=0A-=09=09archDumpFormat=20=3D=20= archCustom;=0A+=09=09archFormat=20=3D=20archCustom;=0A=20=09else=20if=20= (pg_strcasecmp(format,=20"custom")=20=3D=3D=200)=0A-=09=09archDumpFormat=20= =3D=20archCustom;=0A+=09=09archFormat=20=3D=20archCustom;=0A=20=09else=20= if=20(pg_strcasecmp(format,=20"d")=20=3D=3D=200)=0A-=09=09archDumpFormat=20= =3D=20archDirectory;=0A+=09=09archFormat=20=3D=20archDirectory;=0A=20=09= else=20if=20(pg_strcasecmp(format,=20"directory")=20=3D=3D=200)=0A-=09=09= archDumpFormat=20=3D=20archDirectory;=0A+=09=09archFormat=20=3D=20= archDirectory;=0A=20=09else=20if=20(pg_strcasecmp(format,=20"p")=20=3D=3D=20= 0)=0A-=09=09archDumpFormat=20=3D=20archNull;=0A+=09=09archFormat=20=3D=20= archNull;=0A=20=09else=20if=20(pg_strcasecmp(format,=20"plain")=20=3D=3D=20= 0)=0A-=09=09archDumpFormat=20=3D=20archNull;=0A+=09=09archFormat=20=3D=20= archNull;=0A=20=09else=20if=20(pg_strcasecmp(format,=20"t")=20=3D=3D=20= 0)=0A-=09=09archDumpFormat=20=3D=20archTar;=0A+=09=09archFormat=20=3D=20= archTar;=0A=20=09else=20if=20(pg_strcasecmp(format,=20"tar")=20=3D=3D=20= 0)=0A-=09=09archDumpFormat=20=3D=20archTar;=0A+=09=09archFormat=20=3D=20= archTar;=0A=20=09else=0A=20=09=09pg_fatal("unrecognized=20output=20= format=20\"%s\";=20please=20specify=20\"c\",=20\"d\",=20\"p\",=20or=20= \"t\"",=0A=20=09=09=09=09=20format);=0A=20=0A-=09return=20= archDumpFormat;=0A+=09return=20archFormat;=0A=20}=0A=20=0A=20/*=0Adiff=20= --git=20a/src/bin/pg_resetwal/pg_resetwal.c=20= b/src/bin/pg_resetwal/pg_resetwal.c=0Aindex=2044f2b446e5d..e087729072c=20= 100644=0A---=20a/src/bin/pg_resetwal/pg_resetwal.c=0A+++=20= b/src/bin/pg_resetwal/pg_resetwal.c=0A@@=20-105,7=20+105,7=20@@=20static=20= int=09WalSegSz;=0A=20static=20void=20CheckDataVersion(void);=0A=20static=20= bool=20read_controlfile(void);=0A=20static=20void=20= GuessControlValues(void);=0A-static=20void=20PrintControlValues(bool=20= guessed);=0A+static=20void=20PrintControlValues(bool=20bGuessed);=0A=20= static=20void=20PrintNewControlValues(void);=0A=20static=20void=20= RewriteControlFile(void);=0A=20static=20void=20FindEndOfXLOG(void);=0A@@=20= -745,15=20+745,15=20@@=20GuessControlValues(void)=0A=20=0A=20=0A=20/*=0A= -=20*=20Print=20the=20guessed=20pg_control=20values=20when=20we=20had=20= to=20guess.=0A+=20*=20Print=20the=20bGuessed=20pg_control=20values=20= when=20we=20had=20to=20guess.=0A=20=20*=0A=20=20*=20NB:=20this=20display=20= should=20be=20just=20those=20fields=20that=20will=20not=20be=0A=20=20*=20= reset=20by=20RewriteControlFile().=0A=20=20*/=0A=20static=20void=0A= -PrintControlValues(bool=20guessed)=0A+PrintControlValues(bool=20= bGuessed)=0A=20{=0A-=09if=20(guessed)=0A+=09if=20(bGuessed)=0A=20=09=09= printf(_("Guessed=20pg_control=20values:\n\n"));=0A=20=09else=0A=20=09=09= printf(_("Current=20pg_control=20values:\n\n"));=0Adiff=20--git=20= a/src/bin/pg_test_fsync/pg_test_fsync.c=20= b/src/bin/pg_test_fsync/pg_test_fsync.c=0Aindex=20= 4b84f86e7d7..8b18b53e80e=20100644=0A---=20= a/src/bin/pg_test_fsync/pg_test_fsync.c=0A+++=20= b/src/bin/pg_test_fsync/pg_test_fsync.c=0A@@=20-94,7=20+94,7=20@@=20= static=20void=20signal_cleanup(SIGNAL_ARGS);=0A=20#ifdef=20= HAVE_FSYNC_WRITETHROUGH=0A=20static=20int=09pg_fsync_writethrough(int=20= fd);=0A=20#endif=0A-static=20void=20print_elapse(struct=20timeval=20= start_t,=20struct=20timeval=20stop_t,=20int=20ops);=0A+static=20void=20= print_elapse(struct=20timeval=20start_time,=20struct=20timeval=20= stop_time,=20int=20ops);=0A=20=0A=20#define=20die(msg)=20pg_fatal("%s:=20= %m",=20_(msg))=0A=20=0A@@=20-622,10=20+622,10=20@@=20= pg_fsync_writethrough(int=20fd)=0A=20=20*=20print=20out=20the=20writes=20= per=20second=20for=20tests=0A=20=20*/=0A=20static=20void=0A= -print_elapse(struct=20timeval=20start_t,=20struct=20timeval=20stop_t,=20= int=20ops)=0A+print_elapse(struct=20timeval=20start_time,=20struct=20= timeval=20stop_time,=20int=20ops)=0A=20{=0A-=09double=09=09total_time=20= =3D=20(stop_t.tv_sec=20-=20start_t.tv_sec)=20+=0A-=09=09(stop_t.tv_usec=20= -=20start_t.tv_usec)=20*=200.000001;=0A+=09double=09=09total_time=20=3D=20= (stop_time.tv_sec=20-=20start_time.tv_sec)=20+=0A+=09=09= (stop_time.tv_usec=20-=20start_time.tv_usec)=20*=200.000001;=0A=20=09= double=09=09per_second=20=3D=20ops=20/=20total_time;=0A=20=09double=09=09= avg_op_time_us=20=3D=20(total_time=20/=20ops)=20*=20USECS_SEC;=0A=20=0A= --=20=0A2.50.1=20(Apple=20Git-155)=0A=0A= --Apple-Mail=_B830DCCB-64C7-4AD6-938E-E4A843BDEE74 Content-Disposition: attachment; filename=v8-0008-cleanup-rename-local-conn-variables-to-avoid-shad.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="v8-0008-cleanup-rename-local-conn-variables-to-avoid-shad.patch" Content-Transfer-Encoding: quoted-printable =46rom=209a58b41ad589d2716b65eb8fd953bc00ec4d2760=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20"Chao=20Li=20(Evan)"=20=0A= Date:=20Tue,=202=20Dec=202025=2016:03:19=20+0800=0ASubject:=20[PATCH=20= v8=2008/12]=20cleanup:=20rename=20local=20conn=20variables=20to=20avoid=0A= =20shadowing=20the=20global=0A=0AThis=20commit=20renames=20all=20local=20= variables=20named=20'conn'=20to=20'myconn'=20to=20avoid=0Ashadowing=20= the=20global=20connection=20variable.=20This=20ensures=20the=20local=20= and=0Aglobal=20identifiers=20remain=20clearly=20distinct=20within=20each=20= scope.=0A=0AA=20few=20additional=20shadowing=20fixes=20in=20the=20same=20= code=20areas=20are=20included=20as=0Awell.=20These=20are=20unrelated=20= to=20the=20conn=20renaming=20but=20occur=20in=20the=20same=0Afiles,=20so=20= they=20are=20bundled=20here=20to=20keep=20the=20commit=20self-contained.=0A= =0AAuthor:=20Chao=20Li=20=0ADiscussion:=20= https://postgr.es/m/CAEoWx2kQ2x5gMaj8tHLJ3=3DjfC+p5YXHkJyHrDTiQw2nn2FJTmQ@= mail.gmail.com=0A---=0A=20src/bin/pg_basebackup/pg_basebackup.c=20=20|=20= =2032=20++++----=0A=20src/bin/pg_basebackup/pg_recvlogical.c=20|=20=2024=20= +++---=0A=20src/bin/pg_basebackup/receivelog.c=20=20=20=20=20|=20108=20= ++++++++++++-------------=0A=20src/bin/pg_basebackup/receivelog.h=20=20=20= =20=20|=20=20=204=20+-=0A=20src/bin/pg_basebackup/streamutil.c=20=20=20=20= =20|=20=2058=20++++++-------=0A=20src/bin/pg_basebackup/streamutil.h=20=20= =20=20=20|=20=2010=20+--=0A=206=20files=20changed,=20118=20= insertions(+),=20118=20deletions(-)=0A=0Adiff=20--git=20= a/src/bin/pg_basebackup/pg_basebackup.c=20= b/src/bin/pg_basebackup/pg_basebackup.c=0Aindex=20= c1a4672aa6f..e653c91355b=20100644=0A---=20= a/src/bin/pg_basebackup/pg_basebackup.c=0A+++=20= b/src/bin/pg_basebackup/pg_basebackup.c=0A@@=20-1013,16=20+1013,16=20@@=20= backup_parse_compress_options(char=20*option,=20char=20**algorithm,=20= char=20**detail,=0A=20=20*=20chunk.=0A=20=20*/=0A=20static=20void=0A= -ReceiveCopyData(PGconn=20*conn,=20WriteDataCallback=20callback,=0A= +ReceiveCopyData(PGconn=20*myconn,=20WriteDataCallback=20callback,=0A=20=09= =09=09=09void=20*callback_data)=0A=20{=0A=20=09PGresult=20=20=20*res;=0A=20= =0A=20=09/*=20Get=20the=20COPY=20data=20stream.=20*/=0A-=09res=20=3D=20= PQgetResult(conn);=0A+=09res=20=3D=20PQgetResult(myconn);=0A=20=09if=20= (PQresultStatus(res)=20!=3D=20PGRES_COPY_OUT)=0A=20=09=09pg_fatal("could=20= not=20get=20COPY=20data=20stream:=20%s",=0A-=09=09=09=09=20= PQerrorMessage(conn));=0A+=09=09=09=09=20PQerrorMessage(myconn));=0A=20=09= PQclear(res);=0A=20=0A=20=09/*=20Loop=20over=20chunks=20until=20done.=20= */=0A@@=20-1031,7=20+1031,7=20@@=20ReceiveCopyData(PGconn=20*conn,=20= WriteDataCallback=20callback,=0A=20=09=09int=09=09=09r;=0A=20=09=09char=09= =20=20=20*copybuf;=0A=20=0A-=09=09r=20=3D=20PQgetCopyData(conn,=20= ©buf,=200);=0A+=09=09r=20=3D=20PQgetCopyData(myconn,=20©buf,=20= 0);=0A=20=09=09if=20(r=20=3D=3D=20-1)=0A=20=09=09{=0A=20=09=09=09/*=20= End=20of=20chunk.=20*/=0A@@=20-1039,7=20+1039,7=20@@=20= ReceiveCopyData(PGconn=20*conn,=20WriteDataCallback=20callback,=0A=20=09=09= }=0A=20=09=09else=20if=20(r=20=3D=3D=20-2)=0A=20=09=09=09pg_fatal("could=20= not=20read=20COPY=20data:=20%s",=0A-=09=09=09=09=09=20= PQerrorMessage(conn));=0A+=09=09=09=09=09=20PQerrorMessage(myconn));=0A=20= =0A=20=09=09if=20(bgchild_exited)=0A=20=09=09=09pg_fatal("background=20= process=20terminated=20unexpectedly");=0A@@=20-1269,7=20+1269,7=20@@=20= CreateBackupStreamer(char=20*archive_name,=20char=20*spclocation,=0A=20=20= *=20manifest=20if=20present=20-=20as=20a=20single=20COPY=20stream.=0A=20=20= */=0A=20static=20void=0A-ReceiveArchiveStream(PGconn=20*conn,=20= pg_compress_specification=20*compress)=0A+ReceiveArchiveStream(PGconn=20= *myconn,=20pg_compress_specification=20*compress)=0A=20{=0A=20=09= ArchiveStreamState=20state;=0A=20=0A@@=20-1279,7=20+1279,7=20@@=20= ReceiveArchiveStream(PGconn=20*conn,=20pg_compress_specification=20= *compress)=0A=20=09state.compress=20=3D=20compress;=0A=20=0A=20=09/*=20= All=20the=20real=20work=20happens=20in=20ReceiveArchiveStreamChunk.=20*/=0A= -=09ReceiveCopyData(conn,=20ReceiveArchiveStreamChunk,=20&state);=0A+=09= ReceiveCopyData(myconn,=20ReceiveArchiveStreamChunk,=20&state);=0A=20=0A=20= =09/*=20If=20we=20wrote=20the=20backup=20manifest=20to=20a=20file,=20= close=20the=20file.=20*/=0A=20=09if=20(state.manifest_file=20!=3DNULL)=0A= @@=20-1584,7=20+1584,7=20@@=20ReportCopyDataParseError(size_t=20r,=20= char=20*copybuf)=0A=20=20*=20receive=20the=20backup=20manifest=20and=20= inject=20it=20into=20that=20tarfile.=0A=20=20*/=0A=20static=20void=0A= -ReceiveTarFile(PGconn=20*conn,=20char=20*archive_name,=20char=20= *spclocation,=0A+ReceiveTarFile(PGconn=20*myconn,=20char=20= *archive_name,=20char=20*spclocation,=0A=20=09=09=09=20=20=20bool=20= tablespacenum,=20pg_compress_specification=20*compress)=0A=20{=0A=20=09= WriteTarState=20state;=0A@@=20-1595,16=20+1595,16=20@@=20= ReceiveTarFile(PGconn=20*conn,=20char=20*archive_name,=20char=20= *spclocation,=0A=20=09/*=20Pass=20all=20COPY=20data=20through=20to=20the=20= backup=20streamer.=20*/=0A=20=09memset(&state,=200,=20sizeof(state));=0A=20= =09is_recovery_guc_supported=20=3D=0A-=09=09PQserverVersion(conn)=20>=3D=20= MINIMUM_VERSION_FOR_RECOVERY_GUC;=0A+=09=09PQserverVersion(myconn)=20>=3D=20= MINIMUM_VERSION_FOR_RECOVERY_GUC;=0A=20=09expect_unterminated_tarfile=20= =3D=0A-=09=09PQserverVersion(conn)=20<=20= MINIMUM_VERSION_FOR_TERMINATED_TARFILE;=0A+=09=09PQserverVersion(myconn)=20= <=20MINIMUM_VERSION_FOR_TERMINATED_TARFILE;=0A=20=09state.streamer=20=3D=20= CreateBackupStreamer(archive_name,=20spclocation,=0A=20=09=09=09=09=09=09= =09=09=09=09=20=20&manifest_inject_streamer,=0A=20=09=09=09=09=09=09=09=09= =09=09=20=20is_recovery_guc_supported,=0A=20=09=09=09=09=09=09=09=09=09=09= =20=20expect_unterminated_tarfile,=0A=20=09=09=09=09=09=09=09=09=09=09=20= =20compress);=0A=20=09state.tablespacenum=20=3D=20tablespacenum;=0A-=09= ReceiveCopyData(conn,=20ReceiveTarCopyChunk,=20&state);=0A+=09= ReceiveCopyData(myconn,=20ReceiveTarCopyChunk,=20&state);=0A=20=09= progress_update_filename(NULL);=0A=20=0A=20=09/*=0A@@=20-1619,7=20= +1619,7=20@@=20ReceiveTarFile(PGconn=20*conn,=20char=20*archive_name,=20= char=20*spclocation,=0A=20=0A=20=09=09/*=20Slurp=20the=20entire=20backup=20= manifest=20into=20a=20buffer.=20*/=0A=20=09=09initPQExpBuffer(&buf);=0A-=09= =09ReceiveBackupManifestInMemory(conn,=20&buf);=0A+=09=09= ReceiveBackupManifestInMemory(myconn,=20&buf);=0A=20=09=09if=20= (PQExpBufferDataBroken(buf))=0A=20=09=09=09pg_fatal("out=20of=20= memory");=0A=20=0A@@=20-1683,7=20+1683,7=20@@=20= get_tablespace_mapping(const=20char=20*dir)=0A=20=20*=20Receive=20the=20= backup=20manifest=20file=20and=20write=20it=20out=20to=20a=20file.=0A=20=20= */=0A=20static=20void=0A-ReceiveBackupManifest(PGconn=20*conn)=0A= +ReceiveBackupManifest(PGconn=20*myconn)=0A=20{=0A=20=09= WriteManifestState=20state;=0A=20=0A@@=20-1693,7=20+1693,7=20@@=20= ReceiveBackupManifest(PGconn=20*conn)=0A=20=09if=20(state.file=20=3D=3D=20= NULL)=0A=20=09=09pg_fatal("could=20not=20create=20file=20\"%s\":=20%m",=20= state.filename);=0A=20=0A-=09ReceiveCopyData(conn,=20= ReceiveBackupManifestChunk,=20&state);=0A+=09ReceiveCopyData(myconn,=20= ReceiveBackupManifestChunk,=20&state);=0A=20=0A=20=09fclose(state.file);=0A= =20}=0A@@=20-1720,9=20+1720,9=20@@=20ReceiveBackupManifestChunk(size_t=20= r,=20char=20*copybuf,=20void=20*callback_data)=0A=20=20*=20Receive=20the=20= backup=20manifest=20file=20and=20write=20it=20out=20to=20a=20file.=0A=20=20= */=0A=20static=20void=0A-ReceiveBackupManifestInMemory(PGconn=20*conn,=20= PQExpBuffer=20buf)=0A+ReceiveBackupManifestInMemory(PGconn=20*myconn,=20= PQExpBuffer=20buf)=0A=20{=0A-=09ReceiveCopyData(conn,=20= ReceiveBackupManifestInMemoryChunk,=20buf);=0A+=09= ReceiveCopyData(myconn,=20ReceiveBackupManifestInMemoryChunk,=20buf);=0A=20= }=0A=20=0A=20/*=0Adiff=20--git=20= a/src/bin/pg_basebackup/pg_recvlogical.c=20= b/src/bin/pg_basebackup/pg_recvlogical.c=0Aindex=20= be71783b370..9c2e606a363=20100644=0A---=20= a/src/bin/pg_basebackup/pg_recvlogical.c=0A+++=20= b/src/bin/pg_basebackup/pg_recvlogical.c=0A@@=20-73,8=20+73,8=20@@=20= static=20XLogRecPtr=20output_fsync_lsn=20=3D=20InvalidXLogRecPtr;=0A=20=0A= =20static=20void=20usage(void);=0A=20static=20void=20= StreamLogicalLog(void);=0A-static=20bool=20flushAndSendFeedback(PGconn=20= *conn,=20TimestampTz=20*now);=0A-static=20void=20= prepareToTerminate(PGconn=20*conn,=20XLogRecPtr=20endpos,=0A+static=20= bool=20flushAndSendFeedback(PGconn=20*myconn,=20TimestampTz=20*now);=0A= +static=20void=20prepareToTerminate(PGconn=20*myconn,=20XLogRecPtr=20= endpos,=0A=20=09=09=09=09=09=09=09=20=20=20StreamStopReason=20reason,=0A=20= =09=09=09=09=09=09=09=20=20=20XLogRecPtr=20lsn);=0A=20=0A@@=20-126,7=20= +126,7=20@@=20usage(void)=0A=20=20*=20Send=20a=20Standby=20Status=20= Update=20message=20to=20server.=0A=20=20*/=0A=20static=20bool=0A= -sendFeedback(PGconn=20*conn,=20TimestampTz=20now,=20bool=20force,=20= bool=20replyRequested)=0A+sendFeedback(PGconn=20*myconn,=20TimestampTz=20= now,=20bool=20force,=20bool=20replyRequested)=0A=20{=0A=20=09static=20= XLogRecPtr=20last_written_lsn=20=3D=20InvalidXLogRecPtr;=0A=20=09static=20= XLogRecPtr=20last_fsync_lsn=20=3D=20InvalidXLogRecPtr;=0A@@=20-167,10=20= +167,10=20@@=20sendFeedback(PGconn=20*conn,=20TimestampTz=20now,=20bool=20= force,=20bool=20replyRequested)=0A=20=09last_written_lsn=20=3D=20= output_written_lsn;=0A=20=09last_fsync_lsn=20=3D=20output_fsync_lsn;=0A=20= =0A-=09if=20(PQputCopyData(conn,=20replybuf,=20len)=20<=3D=200=20||=20= PQflush(conn))=0A+=09if=20(PQputCopyData(myconn,=20replybuf,=20len)=20<=3D= =200=20||=20PQflush(myconn))=0A=20=09{=0A=20=09=09pg_log_error("could=20= not=20send=20feedback=20packet:=20%s",=0A-=09=09=09=09=09=20= PQerrorMessage(conn));=0A+=09=09=09=09=09=20PQerrorMessage(myconn));=0A=20= =09=09return=20false;=0A=20=09}=0A=20=0A@@=20-1052,12=20+1052,12=20@@=20= main(int=20argc,=20char=20**argv)=0A=20=20*=20feedback.=0A=20=20*/=0A=20= static=20bool=0A-flushAndSendFeedback(PGconn=20*conn,=20TimestampTz=20= *now)=0A+flushAndSendFeedback(PGconn=20*myconn,=20TimestampTz=20*now)=0A=20= {=0A=20=09/*=20flush=20data=20to=20disk,=20so=20that=20we=20send=20a=20= recent=20flush=20pointer=20*/=0A=20=09OutputFsync(*now);=0A=20=09*now=20= =3D=20feGetCurrentTimestamp();=0A-=09if=20(!sendFeedback(conn,=20*now,=20= true,=20false))=0A+=09if=20(!sendFeedback(myconn,=20*now,=20true,=20= false))=0A=20=09=09return=20false;=0A=20=0A=20=09return=20true;=0A@@=20= -1068,11=20+1068,11=20@@=20flushAndSendFeedback(PGconn=20*conn,=20= TimestampTz=20*now)=0A=20=20*=20retry=20on=20failure.=0A=20=20*/=0A=20= static=20void=0A-prepareToTerminate(PGconn=20*conn,=20XLogRecPtr=20= endpos,=20StreamStopReason=20reason,=0A+prepareToTerminate(PGconn=20= *myconn,=20XLogRecPtr=20end_pos,=20StreamStopReason=20reason,=0A=20=09=09= =09=09=20=20=20XLogRecPtr=20lsn)=0A=20{=0A-=09(void)=20= PQputCopyEnd(conn,=20NULL);=0A-=09(void)=20PQflush(conn);=0A+=09(void)=20= PQputCopyEnd(myconn,=20NULL);=0A+=09(void)=20PQflush(myconn);=0A=20=0A=20= =09if=20(verbose)=0A=20=09{=0A@@=20-1083,12=20+1083,12=20@@=20= prepareToTerminate(PGconn=20*conn,=20XLogRecPtr=20endpos,=20= StreamStopReason=20reason,=0A=20=09=09=09=09break;=0A=20=09=09=09case=20= STREAM_STOP_KEEPALIVE:=0A=20=09=09=09=09pg_log_info("end=20position=20= %X/%08X=20reached=20by=20keepalive",=0A-=09=09=09=09=09=09=09= LSN_FORMAT_ARGS(endpos));=0A+=09=09=09=09=09=09=09= LSN_FORMAT_ARGS(end_pos));=0A=20=09=09=09=09break;=0A=20=09=09=09case=20= STREAM_STOP_END_OF_WAL:=0A=20=09=09=09=09Assert(XLogRecPtrIsValid(lsn));=0A= =20=09=09=09=09pg_log_info("end=20position=20%X/%08X=20reached=20by=20= WAL=20record=20at=20%X/%08X",=0A-=09=09=09=09=09=09=09= LSN_FORMAT_ARGS(endpos),=20LSN_FORMAT_ARGS(lsn));=0A+=09=09=09=09=09=09=09= LSN_FORMAT_ARGS(end_pos),=20LSN_FORMAT_ARGS(lsn));=0A=20=09=09=09=09= break;=0A=20=09=09=09case=20STREAM_STOP_NONE:=0A=20=09=09=09=09= Assert(false);=0Adiff=20--git=20a/src/bin/pg_basebackup/receivelog.c=20= b/src/bin/pg_basebackup/receivelog.c=0Aindex=205ce8f2ba287..220f78e3073=20= 100644=0A---=20a/src/bin/pg_basebackup/receivelog.c=0A+++=20= b/src/bin/pg_basebackup/receivelog.c=0A@@=20-32,18=20+32,18=20@@=20= static=20XLogRecPtr=20lastFlushPosition=20=3D=20InvalidXLogRecPtr;=0A=20=0A= =20static=20bool=20still_sending=20=3D=20true;=09/*=20feedback=20still=20= needs=20to=20be=20sent?=20*/=0A=20=0A-static=20PGresult=20= *HandleCopyStream(PGconn=20*conn,=20StreamCtl=20*stream,=0A+static=20= PGresult=20*HandleCopyStream(PGconn=20*myconn,=20StreamCtl=20*stream,=0A=20= =09=09=09=09=09=09=09=09=20=20XLogRecPtr=20*stoppos);=0A-static=20int=09= CopyStreamPoll(PGconn=20*conn,=20long=20timeout_ms,=20pgsocket=20= stop_socket);=0A-static=20int=09CopyStreamReceive(PGconn=20*conn,=20long=20= timeout,=20pgsocket=20stop_socket,=0A+static=20int=09= CopyStreamPoll(PGconn=20*myconn,=20long=20timeout_ms,=20pgsocket=20= stop_socket);=0A+static=20int=09CopyStreamReceive(PGconn=20*myconn,=20= long=20timeout,=20pgsocket=20stop_socket,=0A=20=09=09=09=09=09=09=09=20=20= char=20**buffer);=0A-static=20bool=20ProcessKeepaliveMsg(PGconn=20*conn,=20= StreamCtl=20*stream,=20char=20*copybuf,=0A+static=20bool=20= ProcessKeepaliveMsg(PGconn=20*myconn,=20StreamCtl=20*stream,=20char=20= *copybuf,=0A=20=09=09=09=09=09=09=09=09int=20len,=20XLogRecPtr=20= blockpos,=20TimestampTz=20*last_status);=0A-static=20bool=20= ProcessWALDataMsg(PGconn=20*conn,=20StreamCtl=20*stream,=20char=20= *copybuf,=20int=20len,=0A+static=20bool=20ProcessWALDataMsg(PGconn=20= *myconn,=20StreamCtl=20*stream,=20char=20*copybuf,=20int=20len,=0A=20=09=09= =09=09=09=09=09=20=20XLogRecPtr=20*blockpos);=0A-static=20PGresult=20= *HandleEndOfCopyStream(PGconn=20*conn,=20StreamCtl=20*stream,=20char=20= *copybuf,=0A+static=20PGresult=20*HandleEndOfCopyStream(PGconn=20= *myconn,=20StreamCtl=20*stream,=20char=20*copybuf,=0A=20=09=09=09=09=09=09= =09=09=09=20=20=20XLogRecPtr=20blockpos,=20XLogRecPtr=20*stoppos);=0A= -static=20bool=20CheckCopyStreamStop(PGconn=20*conn,=20StreamCtl=20= *stream,=20XLogRecPtr=20blockpos);=0A+static=20bool=20= CheckCopyStreamStop(PGconn=20*myconn,=20StreamCtl=20*stream,=20= XLogRecPtr=20blockpos);=0A=20static=20long=20= CalculateCopyStreamSleeptime(TimestampTz=20now,=20int=20= standby_message_timeout,=0A=20=09=09=09=09=09=09=09=09=09=09=20= TimestampTz=20last_status);=0A=20=0A@@=20-334,7=20+334,7=20@@=20= writeTimeLineHistoryFile(StreamCtl=20*stream,=20char=20*filename,=20char=20= *content)=0A=20=20*=20Send=20a=20Standby=20Status=20Update=20message=20= to=20server.=0A=20=20*/=0A=20static=20bool=0A-sendFeedback(PGconn=20= *conn,=20XLogRecPtr=20blockpos,=20TimestampTz=20now,=20bool=20= replyRequested)=0A+sendFeedback(PGconn=20*myconn,=20XLogRecPtr=20= blockpos,=20TimestampTz=20now,=20bool=20replyRequested)=0A=20{=0A=20=09= char=09=09replybuf[1=20+=208=20+=208=20+=208=20+=208=20+=201];=0A=20=09= int=09=09=09len=20=3D=200;=0A@@=20-355,10=20+355,10=20@@=20= sendFeedback(PGconn=20*conn,=20XLogRecPtr=20blockpos,=20TimestampTz=20= now,=20bool=20replyReque=0A=20=09replybuf[len]=20=3D=20replyRequested=20= ?=201=20:=200;=20/*=20replyRequested=20*/=0A=20=09len=20+=3D=201;=0A=20=0A= -=09if=20(PQputCopyData(conn,=20replybuf,=20len)=20<=3D=200=20||=20= PQflush(conn))=0A+=09if=20(PQputCopyData(myconn,=20replybuf,=20len)=20<=3D= =200=20||=20PQflush(myconn))=0A=20=09{=0A=20=09=09pg_log_error("could=20= not=20send=20feedback=20packet:=20%s",=0A-=09=09=09=09=09=20= PQerrorMessage(conn));=0A+=09=09=09=09=09=20PQerrorMessage(myconn));=0A=20= =09=09return=20false;=0A=20=09}=0A=20=0A@@=20-372,7=20+372,7=20@@=20= sendFeedback(PGconn=20*conn,=20XLogRecPtr=20blockpos,=20TimestampTz=20= now,=20bool=20replyReque=0A=20=20*=20If=20it's=20not,=20an=20error=20= message=20is=20printed=20to=20stderr,=20and=20false=20is=20returned.=0A=20= =20*/=0A=20bool=0A-CheckServerVersionForStreaming(PGconn=20*conn)=0A= +CheckServerVersionForStreaming(PGconn=20*myconn)=0A=20{=0A=20=09int=09=09= =09minServerMajor,=0A=20=09=09=09=09maxServerMajor;=0A@@=20-386,10=20= +386,10=20@@=20CheckServerVersionForStreaming(PGconn=20*conn)=0A=20=09=20= */=0A=20=09minServerMajor=20=3D=20903;=0A=20=09maxServerMajor=20=3D=20= PG_VERSION_NUM=20/=20100;=0A-=09serverMajor=20=3D=20= PQserverVersion(conn)=20/=20100;=0A+=09serverMajor=20=3D=20= PQserverVersion(myconn)=20/=20100;=0A=20=09if=20(serverMajor=20<=20= minServerMajor)=0A=20=09{=0A-=09=09const=20char=20*serverver=20=3D=20= PQparameterStatus(conn,=20"server_version");=0A+=09=09const=20char=20= *serverver=20=3D=20PQparameterStatus(myconn,=20"server_version");=0A=20=0A= =20=09=09pg_log_error("incompatible=20server=20version=20%s;=20client=20= does=20not=20support=20streaming=20from=20server=20versions=20older=20= than=20%s",=0A=20=09=09=09=09=09=20serverver=20?=20serverver=20:=20= "'unknown'",=0A@@=20-398,7=20+398,7=20@@=20= CheckServerVersionForStreaming(PGconn=20*conn)=0A=20=09}=0A=20=09else=20= if=20(serverMajor=20>=20maxServerMajor)=0A=20=09{=0A-=09=09const=20char=20= *serverver=20=3D=20PQparameterStatus(conn,=20"server_version");=0A+=09=09= const=20char=20*serverver=20=3D=20PQparameterStatus(myconn,=20= "server_version");=0A=20=0A=20=09=09pg_log_error("incompatible=20server=20= version=20%s;=20client=20does=20not=20support=20streaming=20from=20= server=20versions=20newer=20than=20%s",=0A=20=09=09=09=09=09=20serverver=20= ?=20serverver=20:=20"'unknown'",=0A@@=20-450,7=20+450,7=20@@=20= CheckServerVersionForStreaming(PGconn=20*conn)=0A=20=20*=20Note:=20The=20= WAL=20location=20*must*=20be=20at=20a=20log=20segment=20start!=0A=20=20= */=0A=20bool=0A-ReceiveXlogStream(PGconn=20*conn,=20StreamCtl=20*stream)=0A= +ReceiveXlogStream(PGconn=20*myconn,=20StreamCtl=20*stream)=0A=20{=0A=20=09= char=09=09query[128];=0A=20=09char=09=09slotcmd[128];=0A@@=20-461,7=20= +461,7=20@@=20ReceiveXlogStream(PGconn=20*conn,=20StreamCtl=20*stream)=0A= =20=09=20*=20The=20caller=20should've=20checked=20the=20server=20version=20= already,=20but=20doesn't=20do=0A=20=09=20*=20any=20harm=20to=20check=20= it=20here=20too.=0A=20=09=20*/=0A-=09if=20= (!CheckServerVersionForStreaming(conn))=0A+=09if=20= (!CheckServerVersionForStreaming(myconn))=0A=20=09=09return=20false;=0A=20= =0A=20=09/*=0A@@=20-497,7=20+497,7=20@@=20ReceiveXlogStream(PGconn=20= *conn,=20StreamCtl=20*stream)=0A=20=09=09/*=0A=20=09=09=20*=20Get=20the=20= server=20system=20identifier=20and=20timeline,=20and=20validate=20them.=0A= =20=09=09=20*/=0A-=09=09if=20(!RunIdentifySystem(conn,=20&sysidentifier,=20= &servertli,=20NULL,=20NULL))=0A+=09=09if=20(!RunIdentifySystem(myconn,=20= &sysidentifier,=20&servertli,=20NULL,=20NULL))=0A=20=09=09{=0A=20=09=09=09= pg_free(sysidentifier);=0A=20=09=09=09return=20false;=0A@@=20-536,7=20= +536,7=20@@=20ReceiveXlogStream(PGconn=20*conn,=20StreamCtl=20*stream)=0A= =20=09=09if=20(!existsTimeLineHistoryFile(stream))=0A=20=09=09{=0A=20=09=09= =09snprintf(query,=20sizeof(query),=20"TIMELINE_HISTORY=20%u",=20= stream->timeline);=0A-=09=09=09res=20=3D=20PQexec(conn,=20query);=0A+=09=09= =09res=20=3D=20PQexec(myconn,=20query);=0A=20=09=09=09if=20= (PQresultStatus(res)=20!=3D=20PGRES_TUPLES_OK)=0A=20=09=09=09{=0A=20=09=09= =09=09/*=20FIXME:=20we=20might=20send=20it=20ok,=20but=20get=20an=20= error=20*/=0A@@=20-576,7=20+576,7=20@@=20ReceiveXlogStream(PGconn=20= *conn,=20StreamCtl=20*stream)=0A=20=09=09=09=09=20slotcmd,=0A=20=09=09=09= =09=20LSN_FORMAT_ARGS(stream->startpos),=0A=20=09=09=09=09=20= stream->timeline);=0A-=09=09res=20=3D=20PQexec(conn,=20query);=0A+=09=09= res=20=3D=20PQexec(myconn,=20query);=0A=20=09=09if=20= (PQresultStatus(res)=20!=3D=20PGRES_COPY_BOTH)=0A=20=09=09{=0A=20=09=09=09= pg_log_error("could=20not=20send=20replication=20command=20\"%s\":=20= %s",=0A@@=20-587,7=20+587,7=20@@=20ReceiveXlogStream(PGconn=20*conn,=20= StreamCtl=20*stream)=0A=20=09=09PQclear(res);=0A=20=0A=20=09=09/*=20= Stream=20the=20WAL=20*/=0A-=09=09res=20=3D=20HandleCopyStream(conn,=20= stream,=20&stoppos);=0A+=09=09res=20=3D=20HandleCopyStream(myconn,=20= stream,=20&stoppos);=0A=20=09=09if=20(res=20=3D=3D=20NULL)=0A=20=09=09=09= goto=20error;=0A=20=0A@@=20-636,7=20+636,7=20@@=20= ReceiveXlogStream(PGconn=20*conn,=20StreamCtl=20*stream)=0A=20=09=09=09}=0A= =20=0A=20=09=09=09/*=20Read=20the=20final=20result,=20which=20should=20= be=20CommandComplete.=20*/=0A-=09=09=09res=20=3D=20PQgetResult(conn);=0A= +=09=09=09res=20=3D=20PQgetResult(myconn);=0A=20=09=09=09if=20= (PQresultStatus(res)=20!=3D=20PGRES_COMMAND_OK)=0A=20=09=09=09{=0A=20=09=09= =09=09pg_log_error("unexpected=20termination=20of=20replication=20= stream:=20%s",=0A@@=20-742,7=20+742,7=20@@=20= ReadEndOfStreamingResult(PGresult=20*res,=20XLogRecPtr=20*startpos,=20= uint32=20*timeline)=0A=20=20*=20On=20any=20other=20sort=20of=20error,=20= returns=20NULL.=0A=20=20*/=0A=20static=20PGresult=20*=0A= -HandleCopyStream(PGconn=20*conn,=20StreamCtl=20*stream,=0A= +HandleCopyStream(PGconn=20*myconn,=20StreamCtl=20*stream,=0A=20=09=09=09= =09=20XLogRecPtr=20*stoppos)=0A=20{=0A=20=09char=09=20=20=20*copybuf=20=3D= =20NULL;=0A@@=20-760,7=20+760,7=20@@=20HandleCopyStream(PGconn=20*conn,=20= StreamCtl=20*stream,=0A=20=09=09/*=0A=20=09=09=20*=20Check=20if=20we=20= should=20continue=20streaming,=20or=20abort=20at=20this=20point.=0A=20=09= =09=20*/=0A-=09=09if=20(!CheckCopyStreamStop(conn,=20stream,=20= blockpos))=0A+=09=09if=20(!CheckCopyStreamStop(myconn,=20stream,=20= blockpos))=0A=20=09=09=09goto=20error;=0A=20=0A=20=09=09now=20=3D=20= feGetCurrentTimestamp();=0A@@=20-780,7=20+780,7=20@@=20= HandleCopyStream(PGconn=20*conn,=20StreamCtl=20*stream,=0A=20=09=09=09=20= *=20Send=20feedback=20so=20that=20the=20server=20sees=20the=20latest=20= WAL=20locations=0A=20=09=09=09=20*=20immediately.=0A=20=09=09=09=20*/=0A= -=09=09=09if=20(!sendFeedback(conn,=20blockpos,=20now,=20false))=0A+=09=09= =09if=20(!sendFeedback(myconn,=20blockpos,=20now,=20false))=0A=20=09=09=09= =09goto=20error;=0A=20=09=09=09last_status=20=3D=20now;=0A=20=09=09}=0A= @@=20-793,7=20+793,7=20@@=20HandleCopyStream(PGconn=20*conn,=20StreamCtl=20= *stream,=0A=20=09=09=09=09=09=09=09=09=09=09=20= stream->standby_message_timeout))=0A=20=09=09{=0A=20=09=09=09/*=20Time=20= to=20send=20feedback!=20*/=0A-=09=09=09if=20(!sendFeedback(conn,=20= blockpos,=20now,=20false))=0A+=09=09=09if=20(!sendFeedback(myconn,=20= blockpos,=20now,=20false))=0A=20=09=09=09=09goto=20error;=0A=20=09=09=09= last_status=20=3D=20now;=0A=20=09=09}=0A@@=20-808,14=20+808,14=20@@=20= HandleCopyStream(PGconn=20*conn,=20StreamCtl=20*stream,=0A=20=09=09= PQfreemem(copybuf);=0A=20=09=09copybuf=20=3D=20NULL;=0A=20=0A-=09=09r=20= =3D=20CopyStreamReceive(conn,=20sleeptime,=20stream->stop_socket,=20= ©buf);=0A+=09=09r=20=3D=20CopyStreamReceive(myconn,=20sleeptime,=20= stream->stop_socket,=20©buf);=0A=20=09=09while=20(r=20!=3D=200)=0A=20= =09=09{=0A=20=09=09=09if=20(r=20=3D=3D=20-1)=0A=20=09=09=09=09goto=20= error;=0A=20=09=09=09if=20(r=20=3D=3D=20-2)=0A=20=09=09=09{=0A-=09=09=09=09= PGresult=20=20=20*res=20=3D=20HandleEndOfCopyStream(conn,=20stream,=20= copybuf,=20blockpos,=20stoppos);=0A+=09=09=09=09PGresult=20=20=20*res=20= =3D=20HandleEndOfCopyStream(myconn,=20stream,=20copybuf,=20blockpos,=20= stoppos);=0A=20=0A=20=09=09=09=09if=20(res=20=3D=3D=20NULL)=0A=20=09=09=09= =09=09goto=20error;=0A@@=20-826,20=20+826,20=20@@=20= HandleCopyStream(PGconn=20*conn,=20StreamCtl=20*stream,=0A=20=09=09=09/*=20= Check=20the=20message=20type.=20*/=0A=20=09=09=09if=20(copybuf[0]=20=3D=3D= =20PqReplMsg_Keepalive)=0A=20=09=09=09{=0A-=09=09=09=09if=20= (!ProcessKeepaliveMsg(conn,=20stream,=20copybuf,=20r,=20blockpos,=0A+=09=09= =09=09if=20(!ProcessKeepaliveMsg(myconn,=20stream,=20copybuf,=20r,=20= blockpos,=0A=20=09=09=09=09=09=09=09=09=09=09=20&last_status))=0A=20=09=09= =09=09=09goto=20error;=0A=20=09=09=09}=0A=20=09=09=09else=20if=20= (copybuf[0]=20=3D=3D=20PqReplMsg_WALData)=0A=20=09=09=09{=0A-=09=09=09=09= if=20(!ProcessWALDataMsg(conn,=20stream,=20copybuf,=20r,=20&blockpos))=0A= +=09=09=09=09if=20(!ProcessWALDataMsg(myconn,=20stream,=20copybuf,=20r,=20= &blockpos))=0A=20=09=09=09=09=09goto=20error;=0A=20=0A=20=09=09=09=09/*=0A= =20=09=09=09=09=20*=20Check=20if=20we=20should=20continue=20streaming,=20= or=20abort=20at=20this=0A=20=09=09=09=09=20*=20point.=0A=20=09=09=09=09=20= */=0A-=09=09=09=09if=20(!CheckCopyStreamStop(conn,=20stream,=20= blockpos))=0A+=09=09=09=09if=20(!CheckCopyStreamStop(myconn,=20stream,=20= blockpos))=0A=20=09=09=09=09=09goto=20error;=0A=20=09=09=09}=0A=20=09=09=09= else=0A@@=20-857,7=20+857,7=20@@=20HandleCopyStream(PGconn=20*conn,=20= StreamCtl=20*stream,=0A=20=09=09=09=20*=20Process=20the=20received=20= data,=20and=20any=20subsequent=20data=20we=20can=20read=0A=20=09=09=09=20= *=20without=20blocking.=0A=20=09=09=09=20*/=0A-=09=09=09r=20=3D=20= CopyStreamReceive(conn,=200,=20stream->stop_socket,=20©buf);=0A+=09=09= =09r=20=3D=20CopyStreamReceive(myconn,=200,=20stream->stop_socket,=20= ©buf);=0A=20=09=09}=0A=20=09}=0A=20=0A@@=20-875,7=20+875,7=20@@=20= error:=0A=20=20*=20or=20interrupted=20by=20signal=20or=20stop_socket=20= input,=20and=20-1=20on=20an=20error.=0A=20=20*/=0A=20static=20int=0A= -CopyStreamPoll(PGconn=20*conn,=20long=20timeout_ms,=20pgsocket=20= stop_socket)=0A+CopyStreamPoll(PGconn=20*myconn,=20long=20timeout_ms,=20= pgsocket=20stop_socket)=0A=20{=0A=20=09int=09=09=09ret;=0A=20=09fd_set=09= =09input_mask;=0A@@=20-884,10=20+884,10=20@@=20CopyStreamPoll(PGconn=20= *conn,=20long=20timeout_ms,=20pgsocket=20stop_socket)=0A=20=09struct=20= timeval=20timeout;=0A=20=09struct=20timeval=20*timeoutptr;=0A=20=0A-=09= connsocket=20=3D=20PQsocket(conn);=0A+=09connsocket=20=3D=20= PQsocket(myconn);=0A=20=09if=20(connsocket=20<=200)=0A=20=09{=0A-=09=09= pg_log_error("invalid=20socket:=20%s",=20PQerrorMessage(conn));=0A+=09=09= pg_log_error("invalid=20socket:=20%s",=20PQerrorMessage(myconn));=0A=20=09= =09return=20-1;=0A=20=09}=0A=20=0A@@=20-937,7=20+937,7=20@@=20= CopyStreamPoll(PGconn=20*conn,=20long=20timeout_ms,=20pgsocket=20= stop_socket)=0A=20=20*=20-1=20on=20error.=20-2=20if=20the=20server=20= ended=20the=20COPY.=0A=20=20*/=0A=20static=20int=0A= -CopyStreamReceive(PGconn=20*conn,=20long=20timeout,=20pgsocket=20= stop_socket,=0A+CopyStreamReceive(PGconn=20*myconn,=20long=20timeout,=20= pgsocket=20stop_socket,=0A=20=09=09=09=09=20=20char=20**buffer)=0A=20{=0A= =20=09char=09=20=20=20*copybuf=20=3D=20NULL;=0A@@=20-947,7=20+947,7=20@@=20= CopyStreamReceive(PGconn=20*conn,=20long=20timeout,=20pgsocket=20= stop_socket,=0A=20=09Assert(*buffer=20=3D=3D=20NULL);=0A=20=0A=20=09/*=20= Try=20to=20receive=20a=20CopyData=20message=20*/=0A-=09rawlen=20=3D=20= PQgetCopyData(conn,=20©buf,=201);=0A+=09rawlen=20=3D=20= PQgetCopyData(myconn,=20©buf,=201);=0A=20=09if=20(rawlen=20=3D=3D=20= 0)=0A=20=09{=0A=20=09=09int=09=09=09ret;=0A@@=20-957,20=20+957,20=20@@=20= CopyStreamReceive(PGconn=20*conn,=20long=20timeout,=20pgsocket=20= stop_socket,=0A=20=09=09=20*=20the=20specified=20timeout,=20so=20that=20= we=20can=20ping=20the=20server.=20=20Also=20stop=0A=20=09=09=20*=20= waiting=20if=20input=20appears=20on=20stop_socket.=0A=20=09=09=20*/=0A-=09= =09ret=20=3D=20CopyStreamPoll(conn,=20timeout,=20stop_socket);=0A+=09=09= ret=20=3D=20CopyStreamPoll(myconn,=20timeout,=20stop_socket);=0A=20=09=09= if=20(ret=20<=3D=200)=0A=20=09=09=09return=20ret;=0A=20=0A=20=09=09/*=20= Now=20there=20is=20actually=20data=20on=20the=20socket=20*/=0A-=09=09if=20= (PQconsumeInput(conn)=20=3D=3D=200)=0A+=09=09if=20= (PQconsumeInput(myconn)=20=3D=3D=200)=0A=20=09=09{=0A=20=09=09=09= pg_log_error("could=20not=20receive=20data=20from=20WAL=20stream:=20%s",=0A= -=09=09=09=09=09=09=20PQerrorMessage(conn));=0A+=09=09=09=09=09=09=20= PQerrorMessage(myconn));=0A=20=09=09=09return=20-1;=0A=20=09=09}=0A=20=0A= =20=09=09/*=20Now=20that=20we've=20consumed=20some=20input,=20try=20= again=20*/=0A-=09=09rawlen=20=3D=20PQgetCopyData(conn,=20©buf,=201);=0A= +=09=09rawlen=20=3D=20PQgetCopyData(myconn,=20©buf,=201);=0A=20=09=09= if=20(rawlen=20=3D=3D=200)=0A=20=09=09=09return=200;=0A=20=09}=0A@@=20= -978,7=20+978,7=20@@=20CopyStreamReceive(PGconn=20*conn,=20long=20= timeout,=20pgsocket=20stop_socket,=0A=20=09=09return=20-2;=0A=20=09if=20= (rawlen=20=3D=3D=20-2)=0A=20=09{=0A-=09=09pg_log_error("could=20not=20= read=20COPY=20data:=20%s",=20PQerrorMessage(conn));=0A+=09=09= pg_log_error("could=20not=20read=20COPY=20data:=20%s",=20= PQerrorMessage(myconn));=0A=20=09=09return=20-1;=0A=20=09}=0A=20=0A@@=20= -991,7=20+991,7=20@@=20CopyStreamReceive(PGconn=20*conn,=20long=20= timeout,=20pgsocket=20stop_socket,=0A=20=20*=20Process=20the=20keepalive=20= message.=0A=20=20*/=0A=20static=20bool=0A-ProcessKeepaliveMsg(PGconn=20= *conn,=20StreamCtl=20*stream,=20char=20*copybuf,=20int=20len,=0A= +ProcessKeepaliveMsg(PGconn=20*myconn,=20StreamCtl=20*stream,=20char=20= *copybuf,=20int=20len,=0A=20=09=09=09=09=09XLogRecPtr=20blockpos,=20= TimestampTz=20*last_status)=0A=20{=0A=20=09int=09=09=09pos;=0A@@=20= -1033,7=20+1033,7=20@@=20ProcessKeepaliveMsg(PGconn=20*conn,=20StreamCtl=20= *stream,=20char=20*copybuf,=20int=20len,=0A=20=09=09}=0A=20=0A=20=09=09= now=20=3D=20feGetCurrentTimestamp();=0A-=09=09if=20(!sendFeedback(conn,=20= blockpos,=20now,=20false))=0A+=09=09if=20(!sendFeedback(myconn,=20= blockpos,=20now,=20false))=0A=20=09=09=09return=20false;=0A=20=09=09= *last_status=20=3D=20now;=0A=20=09}=0A@@=20-1045,7=20+1045,7=20@@=20= ProcessKeepaliveMsg(PGconn=20*conn,=20StreamCtl=20*stream,=20char=20= *copybuf,=20int=20len,=0A=20=20*=20Process=20WALData=20message.=0A=20=20= */=0A=20static=20bool=0A-ProcessWALDataMsg(PGconn=20*conn,=20StreamCtl=20= *stream,=20char=20*copybuf,=20int=20len,=0A+ProcessWALDataMsg(PGconn=20= *myconn,=20StreamCtl=20*stream,=20char=20*copybuf,=20int=20len,=0A=20=09=09= =09=09=20=20XLogRecPtr=20*blockpos)=0A=20{=0A=20=09int=09=09=09xlogoff;=0A= @@=20-1156,10=20+1156,10=20@@=20ProcessWALDataMsg(PGconn=20*conn,=20= StreamCtl=20*stream,=20char=20*copybuf,=20int=20len,=0A=20=0A=20=09=09=09= if=20(still_sending=20&&=20stream->stream_stop(*blockpos,=20= stream->timeline,=20true))=0A=20=09=09=09{=0A-=09=09=09=09if=20= (PQputCopyEnd(conn,=20NULL)=20<=3D=200=20||=20PQflush(conn))=0A+=09=09=09= =09if=20(PQputCopyEnd(myconn,=20NULL)=20<=3D=200=20||=20PQflush(myconn))=0A= =20=09=09=09=09{=0A=20=09=09=09=09=09pg_log_error("could=20not=20send=20= copy-end=20packet:=20%s",=0A-=09=09=09=09=09=09=09=09=20= PQerrorMessage(conn));=0A+=09=09=09=09=09=09=09=09=20= PQerrorMessage(myconn));=0A=20=09=09=09=09=09return=20false;=0A=20=09=09=09= =09}=0A=20=09=09=09=09still_sending=20=3D=20false;=0A@@=20-1176,10=20= +1176,10=20@@=20ProcessWALDataMsg(PGconn=20*conn,=20StreamCtl=20*stream,=20= char=20*copybuf,=20int=20len,=0A=20=20*=20Handle=20end=20of=20the=20copy=20= stream.=0A=20=20*/=0A=20static=20PGresult=20*=0A= -HandleEndOfCopyStream(PGconn=20*conn,=20StreamCtl=20*stream,=20char=20= *copybuf,=0A+HandleEndOfCopyStream(PGconn=20*myconn,=20StreamCtl=20= *stream,=20char=20*copybuf,=0A=20=09=09=09=09=09=20=20XLogRecPtr=20= blockpos,=20XLogRecPtr=20*stoppos)=0A=20{=0A-=09PGresult=20=20=20*res=20= =3D=20PQgetResult(conn);=0A+=09PGresult=20=20=20*res=20=3D=20= PQgetResult(myconn);=0A=20=0A=20=09/*=0A=20=09=20*=20The=20server=20= closed=20its=20end=20of=20the=20copy=20stream.=20=20If=20we=20haven't=20= closed=0A@@=20-1196,14=20+1196,14=20@@=20HandleEndOfCopyStream(PGconn=20= *conn,=20StreamCtl=20*stream,=20char=20*copybuf,=0A=20=09=09}=0A=20=09=09= if=20(PQresultStatus(res)=20=3D=3D=20PGRES_COPY_IN)=0A=20=09=09{=0A-=09=09= =09if=20(PQputCopyEnd(conn,=20NULL)=20<=3D=200=20||=20PQflush(conn))=0A+=09= =09=09if=20(PQputCopyEnd(myconn,=20NULL)=20<=3D=200=20||=20= PQflush(myconn))=0A=20=09=09=09{=0A=20=09=09=09=09pg_log_error("could=20= not=20send=20copy-end=20packet:=20%s",=0A-=09=09=09=09=09=09=09=20= PQerrorMessage(conn));=0A+=09=09=09=09=09=09=09=20= PQerrorMessage(myconn));=0A=20=09=09=09=09PQclear(res);=0A=20=09=09=09=09= return=20NULL;=0A=20=09=09=09}=0A-=09=09=09res=20=3D=20= PQgetResult(conn);=0A+=09=09=09res=20=3D=20PQgetResult(myconn);=0A=20=09=09= }=0A=20=09=09still_sending=20=3D=20false;=0A=20=09}=0A@@=20-1215,7=20= +1215,7=20@@=20HandleEndOfCopyStream(PGconn=20*conn,=20StreamCtl=20= *stream,=20char=20*copybuf,=0A=20=20*=20Check=20if=20we=20should=20= continue=20streaming,=20or=20abort=20at=20this=20point.=0A=20=20*/=0A=20= static=20bool=0A-CheckCopyStreamStop(PGconn=20*conn,=20StreamCtl=20= *stream,=20XLogRecPtr=20blockpos)=0A+CheckCopyStreamStop(PGconn=20= *myconn,=20StreamCtl=20*stream,=20XLogRecPtr=20blockpos)=0A=20{=0A=20=09= if=20(still_sending=20&&=20stream->stream_stop(blockpos,=20= stream->timeline,=20false))=0A=20=09{=0A@@=20-1224,10=20+1224,10=20@@=20= CheckCopyStreamStop(PGconn=20*conn,=20StreamCtl=20*stream,=20XLogRecPtr=20= blockpos)=0A=20=09=09=09/*=20Potential=20error=20message=20is=20written=20= by=20close_walfile=20*/=0A=20=09=09=09return=20false;=0A=20=09=09}=0A-=09= =09if=20(PQputCopyEnd(conn,=20NULL)=20<=3D=200=20||=20PQflush(conn))=0A+=09= =09if=20(PQputCopyEnd(myconn,=20NULL)=20<=3D=200=20||=20PQflush(myconn))=0A= =20=09=09{=0A=20=09=09=09pg_log_error("could=20not=20send=20copy-end=20= packet:=20%s",=0A-=09=09=09=09=09=09=20PQerrorMessage(conn));=0A+=09=09=09= =09=09=09=20PQerrorMessage(myconn));=0A=20=09=09=09return=20false;=0A=20=09= =09}=0A=20=09=09still_sending=20=3D=20false;=0Adiff=20--git=20= a/src/bin/pg_basebackup/receivelog.h=20= b/src/bin/pg_basebackup/receivelog.h=0Aindex=200caa904da6a..0378e4c20c8=20= 100644=0A---=20a/src/bin/pg_basebackup/receivelog.h=0A+++=20= b/src/bin/pg_basebackup/receivelog.h=0A@@=20-50,8=20+50,8=20@@=20typedef=20= struct=20StreamCtl=0A=20=0A=20=0A=20=0A-extern=20bool=20= CheckServerVersionForStreaming(PGconn=20*conn);=0A-extern=20bool=20= ReceiveXlogStream(PGconn=20*conn,=0A+extern=20bool=20= CheckServerVersionForStreaming(PGconn=20*myconn);=0A+extern=20bool=20= ReceiveXlogStream(PGconn=20*myconn,=0A=20=09=09=09=09=09=09=09=20=20= StreamCtl=20*stream);=0A=20=0A=20#endif=09=09=09=09=09=09=09/*=20= RECEIVELOG_H=20*/=0Adiff=20--git=20a/src/bin/pg_basebackup/streamutil.c=20= b/src/bin/pg_basebackup/streamutil.c=0Aindex=2076abdfa2ae6..31da309d587=20= 100644=0A---=20a/src/bin/pg_basebackup/streamutil.c=0A+++=20= b/src/bin/pg_basebackup/streamutil.c=0A@@=20-31,7=20+31,7=20@@=0A=20=0A=20= int=09=09=09WalSegSz;=0A=20=0A-static=20bool=20= RetrieveDataDirCreatePerm(PGconn=20*conn);=0A+static=20bool=20= RetrieveDataDirCreatePerm(PGconn=20*myconn);=0A=20=0A=20/*=20SHOW=20= command=20for=20replication=20connection=20was=20introduced=20in=20= version=2010=20*/=0A=20#define=20MINIMUM_VERSION_FOR_SHOW_CMD=20100000=0A= @@=20-273,7=20+273,7=20@@=20GetConnection(void)=0A=20=20*=20since=20= ControlFile=20is=20not=20accessible=20here.=0A=20=20*/=0A=20bool=0A= -RetrieveWalSegSize(PGconn=20*conn)=0A+RetrieveWalSegSize(PGconn=20= *myconn)=0A=20{=0A=20=09PGresult=20=20=20*res;=0A=20=09char=09=09= xlog_unit[3];=0A@@=20-281,20=20+281,20=20@@=20RetrieveWalSegSize(PGconn=20= *conn)=0A=20=09=09=09=09multiplier=20=3D=201;=0A=20=0A=20=09/*=20check=20= connection=20existence=20*/=0A-=09Assert(conn=20!=3D=20NULL);=0A+=09= Assert(myconn=20!=3D=20NULL);=0A=20=0A=20=09/*=20for=20previous=20= versions=20set=20the=20default=20xlog=20seg=20size=20*/=0A-=09if=20= (PQserverVersion(conn)=20<=20MINIMUM_VERSION_FOR_SHOW_CMD)=0A+=09if=20= (PQserverVersion(myconn)=20<=20MINIMUM_VERSION_FOR_SHOW_CMD)=0A=20=09{=0A= =20=09=09WalSegSz=20=3D=20DEFAULT_XLOG_SEG_SIZE;=0A=20=09=09return=20= true;=0A=20=09}=0A=20=0A-=09res=20=3D=20PQexec(conn,=20"SHOW=20= wal_segment_size");=0A+=09res=20=3D=20PQexec(myconn,=20"SHOW=20= wal_segment_size");=0A=20=09if=20(PQresultStatus(res)=20!=3D=20= PGRES_TUPLES_OK)=0A=20=09{=0A=20=09=09pg_log_error("could=20not=20send=20= replication=20command=20\"%s\":=20%s",=0A-=09=09=09=09=09=20"SHOW=20= wal_segment_size",=20PQerrorMessage(conn));=0A+=09=09=09=09=09=20"SHOW=20= wal_segment_size",=20PQerrorMessage(myconn));=0A=20=0A=20=09=09= PQclear(res);=0A=20=09=09return=20false;=0A@@=20-352,23=20+352,23=20@@=20= RetrieveWalSegSize(PGconn=20*conn)=0A=20=20*=20on=20the=20data=20= directory.=0A=20=20*/=0A=20static=20bool=0A= -RetrieveDataDirCreatePerm(PGconn=20*conn)=0A= +RetrieveDataDirCreatePerm(PGconn=20*myconn)=0A=20{=0A=20=09PGresult=20=20= =20*res;=0A=20=09int=09=09=09data_directory_mode;=0A=20=0A=20=09/*=20= check=20connection=20existence=20*/=0A-=09Assert(conn=20!=3D=20NULL);=0A= +=09Assert(myconn=20!=3D=20NULL);=0A=20=0A=20=09/*=20for=20previous=20= versions=20leave=20the=20default=20group=20access=20*/=0A-=09if=20= (PQserverVersion(conn)=20<=20MINIMUM_VERSION_FOR_GROUP_ACCESS)=0A+=09if=20= (PQserverVersion(myconn)=20<=20MINIMUM_VERSION_FOR_GROUP_ACCESS)=0A=20=09= =09return=20true;=0A=20=0A-=09res=20=3D=20PQexec(conn,=20"SHOW=20= data_directory_mode");=0A+=09res=20=3D=20PQexec(myconn,=20"SHOW=20= data_directory_mode");=0A=20=09if=20(PQresultStatus(res)=20!=3D=20= PGRES_TUPLES_OK)=0A=20=09{=0A=20=09=09pg_log_error("could=20not=20send=20= replication=20command=20\"%s\":=20%s",=0A-=09=09=09=09=09=20"SHOW=20= data_directory_mode",=20PQerrorMessage(conn));=0A+=09=09=09=09=09=20= "SHOW=20data_directory_mode",=20PQerrorMessage(myconn));=0A=20=0A=20=09=09= PQclear(res);=0A=20=09=09return=20false;=0A@@=20-406,7=20+406,7=20@@=20= RetrieveDataDirCreatePerm(PGconn=20*conn)=0A=20=20*=20-=20Database=20= name=20(NULL=20in=20servers=20prior=20to=209.4)=0A=20=20*/=0A=20bool=0A= -RunIdentifySystem(PGconn=20*conn,=20char=20**sysid,=20TimeLineID=20= *starttli,=0A+RunIdentifySystem(PGconn=20*myconn,=20char=20**sysid,=20= TimeLineID=20*starttli,=0A=20=09=09=09=09=20=20XLogRecPtr=20*startpos,=20= char=20**db_name)=0A=20{=0A=20=09PGresult=20=20=20*res;=0A@@=20-414,13=20= +414,13=20@@=20RunIdentifySystem(PGconn=20*conn,=20char=20**sysid,=20= TimeLineID=20*starttli,=0A=20=09=09=09=09lo;=0A=20=0A=20=09/*=20Check=20= connection=20existence=20*/=0A-=09Assert(conn=20!=3D=20NULL);=0A+=09= Assert(myconn=20!=3D=20NULL);=0A=20=0A-=09res=20=3D=20PQexec(conn,=20= "IDENTIFY_SYSTEM");=0A+=09res=20=3D=20PQexec(myconn,=20= "IDENTIFY_SYSTEM");=0A=20=09if=20(PQresultStatus(res)=20!=3D=20= PGRES_TUPLES_OK)=0A=20=09{=0A=20=09=09pg_log_error("could=20not=20send=20= replication=20command=20\"%s\":=20%s",=0A-=09=09=09=09=09=20= "IDENTIFY_SYSTEM",=20PQerrorMessage(conn));=0A+=09=09=09=09=09=20= "IDENTIFY_SYSTEM",=20PQerrorMessage(myconn));=0A=20=0A=20=09=09= PQclear(res);=0A=20=09=09return=20false;=0A@@=20-460,7=20+460,7=20@@=20= RunIdentifySystem(PGconn=20*conn,=20char=20**sysid,=20TimeLineID=20= *starttli,=0A=20=09if=20(db_name=20!=3D=20NULL)=0A=20=09{=0A=20=09=09= *db_name=20=3D=20NULL;=0A-=09=09if=20(PQserverVersion(conn)=20>=3D=20= 90400)=0A+=09=09if=20(PQserverVersion(myconn)=20>=3D=2090400)=0A=20=09=09= {=0A=20=09=09=09if=20(PQnfields(res)=20<=204)=0A=20=09=09=09{=0A@@=20= -487,7=20+487,7=20@@=20RunIdentifySystem(PGconn=20*conn,=20char=20= **sysid,=20TimeLineID=20*starttli,=0A=20=20*=20Returns=20false=20on=20= failure,=20and=20true=20otherwise.=0A=20=20*/=0A=20bool=0A= -GetSlotInformation(PGconn=20*conn,=20const=20char=20*slot_name,=0A= +GetSlotInformation(PGconn=20*myconn,=20const=20char=20*slot_name,=0A=20=09= =09=09=09=20=20=20XLogRecPtr=20*restart_lsn,=20TimeLineID=20= *restart_tli)=0A=20{=0A=20=09PGresult=20=20=20*res;=0A@@=20-502,13=20= +502,13=20@@=20GetSlotInformation(PGconn=20*conn,=20const=20char=20= *slot_name,=0A=20=0A=20=09query=20=3D=20createPQExpBuffer();=0A=20=09= appendPQExpBuffer(query,=20"READ_REPLICATION_SLOT=20%s",=20slot_name);=0A= -=09res=20=3D=20PQexec(conn,=20query->data);=0A+=09res=20=3D=20= PQexec(myconn,=20query->data);=0A=20=09destroyPQExpBuffer(query);=0A=20=0A= =20=09if=20(PQresultStatus(res)=20!=3D=20PGRES_TUPLES_OK)=0A=20=09{=0A=20= =09=09pg_log_error("could=20not=20send=20replication=20command=20\"%s\":=20= %s",=0A-=09=09=09=09=09=20"READ_REPLICATION_SLOT",=20= PQerrorMessage(conn));=0A+=09=09=09=09=09=20"READ_REPLICATION_SLOT",=20= PQerrorMessage(myconn));=0A=20=09=09PQclear(res);=0A=20=09=09return=20= false;=0A=20=09}=0A@@=20-581,13=20+581,13=20@@=20= GetSlotInformation(PGconn=20*conn,=20const=20char=20*slot_name,=0A=20=20= *=20returns=20true=20in=20case=20of=20success.=0A=20=20*/=0A=20bool=0A= -CreateReplicationSlot(PGconn=20*conn,=20const=20char=20*slot_name,=20= const=20char=20*plugin,=0A+CreateReplicationSlot(PGconn=20*myconn,=20= const=20char=20*slot_name,=20const=20char=20*plugin,=0A=20=09=09=09=09=09= =20=20bool=20is_temporary,=20bool=20is_physical,=20bool=20reserve_wal,=0A= =20=09=09=09=09=09=20=20bool=20slot_exists_ok,=20bool=20two_phase,=20= bool=20failover)=0A=20{=0A=20=09PQExpBuffer=20query;=0A=20=09PGresult=20=20= =20*res;=0A-=09bool=09=09use_new_option_syntax=20=3D=20= (PQserverVersion(conn)=20>=3D=20150000);=0A+=09bool=09=09= use_new_option_syntax=20=3D=20(PQserverVersion(myconn)=20>=3D=20150000);=0A= =20=0A=20=09query=20=3D=20createPQExpBuffer();=0A=20=0A@@=20-617,15=20= +617,15=20@@=20CreateReplicationSlot(PGconn=20*conn,=20const=20char=20= *slot_name,=20const=20char=20*plugin,=0A=20=09}=0A=20=09else=0A=20=09{=0A= -=09=09if=20(failover=20&&=20PQserverVersion(conn)=20>=3D=20170000)=0A+=09= =09if=20(failover=20&&=20PQserverVersion(myconn)=20>=3D=20170000)=0A=20=09= =09=09AppendPlainCommandOption(query,=20use_new_option_syntax,=0A=20=09=09= =09=09=09=09=09=09=09=20"FAILOVER");=0A=20=0A-=09=09if=20(two_phase=20&&=20= PQserverVersion(conn)=20>=3D=20150000)=0A+=09=09if=20(two_phase=20&&=20= PQserverVersion(myconn)=20>=3D=20150000)=0A=20=09=09=09= AppendPlainCommandOption(query,=20use_new_option_syntax,=0A=20=09=09=09=09= =09=09=09=09=09=20"TWO_PHASE");=0A=20=0A-=09=09if=20= (PQserverVersion(conn)=20>=3D=20100000)=0A+=09=09if=20= (PQserverVersion(myconn)=20>=3D=20100000)=0A=20=09=09{=0A=20=09=09=09/*=20= pg_recvlogical=20doesn't=20use=20an=20exported=20snapshot,=20so=20= suppress=20*/=0A=20=09=09=09if=20(use_new_option_syntax)=0A@@=20-649,7=20= +649,7=20@@=20CreateReplicationSlot(PGconn=20*conn,=20const=20char=20= *slot_name,=20const=20char=20*plugin,=0A=20=09}=0A=20=0A=20=09/*=20Now=20= run=20the=20query=20*/=0A-=09res=20=3D=20PQexec(conn,=20query->data);=0A= +=09res=20=3D=20PQexec(myconn,=20query->data);=0A=20=09if=20= (PQresultStatus(res)=20!=3D=20PGRES_TUPLES_OK)=0A=20=09{=0A=20=09=09= const=20char=20*sqlstate=20=3D=20PQresultErrorField(res,=20= PG_DIAG_SQLSTATE);=0A@@=20-665,7=20+665,7=20@@=20= CreateReplicationSlot(PGconn=20*conn,=20const=20char=20*slot_name,=20= const=20char=20*plugin,=0A=20=09=09else=0A=20=09=09{=0A=20=09=09=09= pg_log_error("could=20not=20send=20replication=20command=20\"%s\":=20= %s",=0A-=09=09=09=09=09=09=20query->data,=20PQerrorMessage(conn));=0A+=09= =09=09=09=09=09=20query->data,=20PQerrorMessage(myconn));=0A=20=0A=20=09=09= =09destroyPQExpBuffer(query);=0A=20=09=09=09PQclear(res);=0A@@=20-694,7=20= +694,7=20@@=20CreateReplicationSlot(PGconn=20*conn,=20const=20char=20= *slot_name,=20const=20char=20*plugin,=0A=20=20*=20returns=20true=20in=20= case=20of=20success.=0A=20=20*/=0A=20bool=0A-DropReplicationSlot(PGconn=20= *conn,=20const=20char=20*slot_name)=0A+DropReplicationSlot(PGconn=20= *myconn,=20const=20char=20*slot_name)=0A=20{=0A=20=09PQExpBuffer=20= query;=0A=20=09PGresult=20=20=20*res;=0A@@=20-706,11=20+706,11=20@@=20= DropReplicationSlot(PGconn=20*conn,=20const=20char=20*slot_name)=0A=20=09= /*=20Build=20query=20*/=0A=20=09appendPQExpBuffer(query,=20= "DROP_REPLICATION_SLOT=20\"%s\"",=0A=20=09=09=09=09=09=20=20slot_name);=0A= -=09res=20=3D=20PQexec(conn,=20query->data);=0A+=09res=20=3D=20= PQexec(myconn,=20query->data);=0A=20=09if=20(PQresultStatus(res)=20!=3D=20= PGRES_COMMAND_OK)=0A=20=09{=0A=20=09=09pg_log_error("could=20not=20send=20= replication=20command=20\"%s\":=20%s",=0A-=09=09=09=09=09=20query->data,=20= PQerrorMessage(conn));=0A+=09=09=09=09=09=20query->data,=20= PQerrorMessage(myconn));=0A=20=0A=20=09=09destroyPQExpBuffer(query);=0A=20= =09=09PQclear(res);=0Adiff=20--git=20= a/src/bin/pg_basebackup/streamutil.h=20= b/src/bin/pg_basebackup/streamutil.h=0Aindex=2015afef3a9c8..69ae24f94ed=20= 100644=0A---=20a/src/bin/pg_basebackup/streamutil.h=0A+++=20= b/src/bin/pg_basebackup/streamutil.h=0A@@=20-32,13=20+32,13=20@@=20= extern=20PGconn=20*conn;=0A=20extern=20PGconn=20*GetConnection(void);=0A=20= =0A=20/*=20Replication=20commands=20*/=0A-extern=20bool=20= CreateReplicationSlot(PGconn=20*conn,=20const=20char=20*slot_name,=0A= +extern=20bool=20CreateReplicationSlot(PGconn=20*myconn,=20const=20char=20= *slot_name,=0A=20=09=09=09=09=09=09=09=09=20=20const=20char=20*plugin,=20= bool=20is_temporary,=0A=20=09=09=09=09=09=09=09=09=20=20bool=20= is_physical,=20bool=20reserve_wal,=0A=20=09=09=09=09=09=09=09=09=20=20= bool=20slot_exists_ok,=20bool=20two_phase,=0A=20=09=09=09=09=09=09=09=09=20= =20bool=20failover);=0A-extern=20bool=20DropReplicationSlot(PGconn=20= *conn,=20const=20char=20*slot_name);=0A-extern=20bool=20= RunIdentifySystem(PGconn=20*conn,=20char=20**sysid,=0A+extern=20bool=20= DropReplicationSlot(PGconn=20*myconn,=20const=20char=20*slot_name);=0A= +extern=20bool=20RunIdentifySystem(PGconn=20*myconn,=20char=20**sysid,=0A= =20=09=09=09=09=09=09=09=20=20TimeLineID=20*starttli,=0A=20=09=09=09=09=09= =09=09=20=20XLogRecPtr=20*startpos,=0A=20=09=09=09=09=09=09=09=20=20char=20= **db_name);=0A@@=20-53,10=20+53,10=20@@=20extern=20void=20= AppendIntegerCommandOption(PQExpBuffer=20buf,=0A=20=09=09=09=09=09=09=09=09= =09=20=20=20bool=20use_new_option_syntax,=0A=20=09=09=09=09=09=09=09=09=09= =20=20=20char=20*option_name,=20int32=20option_value);=0A=20=0A-extern=20= bool=20GetSlotInformation(PGconn=20*conn,=20const=20char=20*slot_name,=0A= +extern=20bool=20GetSlotInformation(PGconn=20*myconn,=20const=20char=20= *slot_name,=0A=20=09=09=09=09=09=09=09=20=20=20XLogRecPtr=20= *restart_lsn,=0A=20=09=09=09=09=09=09=09=20=20=20TimeLineID=20= *restart_tli);=0A-extern=20bool=20RetrieveWalSegSize(PGconn=20*conn);=0A= +extern=20bool=20RetrieveWalSegSize(PGconn=20*myconn);=0A=20extern=20= TimestampTz=20feGetCurrentTimestamp(void);=0A=20extern=20void=20= feTimestampDifference(TimestampTz=20start_time,=20TimestampTz=20= stop_time,=0A=20=09=09=09=09=09=09=09=09=20=20long=20*secs,=20int=20= *microsecs);=0A--=20=0A2.50.1=20(Apple=20Git-155)=0A=0A= --Apple-Mail=_B830DCCB-64C7-4AD6-938E-E4A843BDEE74 Content-Disposition: attachment; filename=v8-0009-cleanup-avoid-local-variables-shadowed-by-globals.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="v8-0009-cleanup-avoid-local-variables-shadowed-by-globals.patch" Content-Transfer-Encoding: quoted-printable =46rom=20581fc3abe5896c19b278827f433dd9b072098794=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20"Chao=20Li=20(Evan)"=20=0A= Date:=20Wed,=203=20Dec=202025=2007:40:26=20+0800=0ASubject:=20[PATCH=20= v8=2009/12]=20cleanup:=20avoid=20local=20variables=20shadowed=20by=20= globals=0A=20in=20ecpg.header=0A=0AThis=20commit=20renames=20local=20= variables=20in=20ecpg.header=20that=20were=20shadowed=20by=0Aglobal=20= identifiers=20of=20the=20same=20names.=20The=20updated=20local=20names=20= ensure=20the=0Aidentifiers=20remain=20distinct=20and=20unambiguous=20= within=20the=20file.=0A=0AAuthor:=20Chao=20Li=20=0A= Discussion:=20= https://postgr.es/m/CAEoWx2kQ2x5gMaj8tHLJ3=3DjfC+p5YXHkJyHrDTiQw2nn2FJTmQ@= mail.gmail.com=0A---=0A=20src/interfaces/ecpg/preproc/ecpg.header=20|=20= 12=20++++++------=0A=201=20file=20changed,=206=20insertions(+),=206=20= deletions(-)=0A=0Adiff=20--git=20= a/src/interfaces/ecpg/preproc/ecpg.header=20= b/src/interfaces/ecpg/preproc/ecpg.header=0Aindex=20= dde69a39695..a58dda32f48=20100644=0A---=20= a/src/interfaces/ecpg/preproc/ecpg.header=0A+++=20= b/src/interfaces/ecpg/preproc/ecpg.header=0A@@=20-178,7=20+178,7=20@@=20= create_questionmarks(const=20char=20*name,=20bool=20array)=0A=20}=0A=20=0A= =20static=20char=20*=0A-adjust_outofscope_cursor_vars(struct=20cursor=20= *cur)=0A+adjust_outofscope_cursor_vars(struct=20cursor=20*pcur)=0A=20{=0A= =20=09/*=0A=20=09=20*=20Informix=20accepts=20DECLARE=20with=20variables=20= that=20are=20out=20of=20scope=20when=20OPEN=0A@@=20-203,7=20+203,7=20@@=20= adjust_outofscope_cursor_vars(struct=20cursor=20*cur)=0A=20=09=09struct=20= variable=20*newvar,=0A=20=09=09=09=09=20=20=20*newind;=0A=20=0A-=09=09= list=20=3D=20(insert=20?=20cur->argsinsert=20:=20cur->argsresult);=0A+=09= =09list=20=3D=20(insert=20?=20pcur->argsinsert=20:=20pcur->argsresult);=0A= =20=0A=20=09=09for=20(ptr=20=3D=20list;=20ptr=20!=3D=20NULL;=20ptr=20=3D=20= ptr->next)=0A=20=09=09{=0A@@=20-434,9=20+434,9=20@@=20= adjust_outofscope_cursor_vars(struct=20cursor=20*cur)=0A=20=09=09}=0A=20=0A= =20=09=09if=20(insert)=0A-=09=09=09cur->argsinsert_oos=20=3D=20newlist;=0A= +=09=09=09pcur->argsinsert_oos=20=3D=20newlist;=0A=20=09=09else=0A-=09=09= =09cur->argsresult_oos=20=3D=20newlist;=0A+=09=09=09pcur->argsresult_oos=20= =3D=20newlist;=0A=20=09}=0A=20=0A=20=09return=20result;=0A@@=20-490,7=20= +490,7=20@@=20static=20void=0A=20add_typedef(const=20char=20*name,=20= const=20char=20*dimension,=20const=20char=20*length,=0A=20=09=09=09enum=20= ECPGttype=20type_enum,=0A=20=09=09=09const=20char=20*type_dimension,=20= const=20char=20*type_index,=0A-=09=09=09int=20initializer,=20int=20= array)=0A+=09=09=09int=20initial_value,=20int=20array)=0A=20{=0A=20=09/*=20= add=20entry=20to=20list=20*/=0A=20=09struct=20typedefs=20*ptr,=0A@@=20= -498,7=20+498,7=20@@=20add_typedef(const=20char=20*name,=20const=20char=20= *dimension,=20const=20char=20*length,=0A=20=0A=20=09if=20((type_enum=20= =3D=3D=20ECPGt_struct=20||=0A=20=09=09=20type_enum=20=3D=3D=20= ECPGt_union)=20&&=0A-=09=09initializer=20=3D=3D=201)=0A+=09=09= initial_value=20=3D=3D=201)=0A=20=09=09mmerror(PARSE_ERROR,=20ET_ERROR,=20= "initializer=20not=20allowed=20in=20type=20definition");=0A=20=09else=20= if=20(INFORMIX_MODE=20&&=20strcmp(name,=20"string")=20=3D=3D=200)=0A=20=09= =09mmerror(PARSE_ERROR,=20ET_ERROR,=20"type=20name=20\"string\"=20is=20= reserved=20in=20Informix=20mode");=0A--=20=0A2.50.1=20(Apple=20Git-155)=0A= =0A= --Apple-Mail=_B830DCCB-64C7-4AD6-938E-E4A843BDEE74 Content-Disposition: attachment; filename=v8-0010-cleanup-avoid-local-variables-shadowed-by-globals.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="v8-0010-cleanup-avoid-local-variables-shadowed-by-globals.patch" Content-Transfer-Encoding: quoted-printable =46rom=20aca8c2042a2113b16e29b3d75859e479811505a0=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20"Chao=20Li=20(Evan)"=20=0A= Date:=20Wed,=203=20Dec=202025=2008:44:46=20+0800=0ASubject:=20[PATCH=20= v8=2010/12]=20cleanup:=20avoid=20local=20variables=20shadowed=20by=20= globals=0A=20across=20time-related=20modules=0A=0AThis=20commit=20= renames=20several=20local=20variables=20in=20date/time=20and=20timezone=0A= code=20that=20were=20shadowed=20by=20global=20identifiers=20of=20the=20= same=20names.=20The=0Aupdated=20local=20identifiers=20ensure=20clearer=20= separation=20of=20scope=20throughout=0Athe=20affected=20modules.=0A=0AA=20= few=20additional=20shadowing=20fixes=20in=20the=20same=20code=20areas=20= are=20included=20as=0Awell.=20These=20are=20unrelated=20to=20the=20conn=20= renaming=20but=20occur=20in=20the=20same=0Afiles,=20so=20they=20are=20= bundled=20here=20to=20keep=20the=20commit=20self-contained.=0A=0AAuthor:=20= Chao=20Li=20=0ADiscussion:=20= https://postgr.es/m/CAEoWx2kQ2x5gMaj8tHLJ3=3DjfC+p5YXHkJyHrDTiQw2nn2FJTmQ@= mail.gmail.com=0A---=0A=20src/backend/utils/adt/date.c=20=20=20=20=20=20=20= |=2020=20+++----=0A=20src/backend/utils/adt/datetime.c=20=20=20|=2020=20= +++----=0A=20src/backend/utils/adt/formatting.c=20|=20=208=20+--=0A=20= src/backend/utils/adt/timestamp.c=20=20|=2092=20= +++++++++++++++---------------=0A=20src/bin/initdb/findtimezone.c=20=20=20= =20=20=20|=2038=20++++++------=0A=20src/include/pgtime.h=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20|=20=202=20+-=0A=20= src/include/utils/datetime.h=20=20=20=20=20=20=20|=20=204=20+-=0A=20= src/timezone/pgtz.c=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20|=20= 16=20+++---=0A=208=20files=20changed,=20100=20insertions(+),=20100=20= deletions(-)=0A=0Adiff=20--git=20a/src/backend/utils/adt/date.c=20= b/src/backend/utils/adt/date.c=0Aindex=20c3327440380..2534dba55bb=20= 100644=0A---=20a/src/backend/utils/adt/date.c=0A+++=20= b/src/backend/utils/adt/date.c=0A@@=20-562,16=20+562,16=20@@=20Datum=0A=20= date_pli(PG_FUNCTION_ARGS)=0A=20{=0A=20=09DateADT=09=09dateVal=20=3D=20= PG_GETARG_DATEADT(0);=0A-=09int32=09=09days=20=3D=20PG_GETARG_INT32(1);=0A= +=09int32=09=09dayVal=20=3D=20PG_GETARG_INT32(1);=0A=20=09DateADT=09=09= result;=0A=20=0A=20=09if=20(DATE_NOT_FINITE(dateVal))=0A=20=09=09= PG_RETURN_DATEADT(dateVal);=20/*=20can't=20change=20infinity=20*/=0A=20=0A= -=09result=20=3D=20dateVal=20+=20days;=0A+=09result=20=3D=20dateVal=20+=20= dayVal;=0A=20=0A=20=09/*=20Check=20for=20integer=20overflow=20and=20= out-of-allowed-range=20*/=0A-=09if=20((days=20>=3D=200=20?=20(result=20<=20= dateVal)=20:=20(result=20>=20dateVal))=20||=0A+=09if=20((dayVal=20>=3D=20= 0=20?=20(result=20<=20dateVal)=20:=20(result=20>=20dateVal))=20||=0A=20=09= =09!IS_VALID_DATE(result))=0A=20=09=09ereport(ERROR,=0A=20=09=09=09=09= (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),=0A@@=20-586,16=20+586,16=20= @@=20Datum=0A=20date_mii(PG_FUNCTION_ARGS)=0A=20{=0A=20=09DateADT=09=09= dateVal=20=3D=20PG_GETARG_DATEADT(0);=0A-=09int32=09=09days=20=3D=20= PG_GETARG_INT32(1);=0A+=09int32=09=09dayVal=20=3D=20PG_GETARG_INT32(1);=0A= =20=09DateADT=09=09result;=0A=20=0A=20=09if=20(DATE_NOT_FINITE(dateVal))=0A= =20=09=09PG_RETURN_DATEADT(dateVal);=20/*=20can't=20change=20infinity=20= */=0A=20=0A-=09result=20=3D=20dateVal=20-=20days;=0A+=09result=20=3D=20= dateVal=20-=20dayVal;=0A=20=0A=20=09/*=20Check=20for=20integer=20= overflow=20and=20out-of-allowed-range=20*/=0A-=09if=20((days=20>=3D=200=20= ?=20(result=20>=20dateVal)=20:=20(result=20<=20dateVal))=20||=0A+=09if=20= ((dayVal=20>=3D=200=20?=20(result=20>=20dateVal)=20:=20(result=20<=20= dateVal))=20||=0A=20=09=09!IS_VALID_DATE(result))=0A=20=09=09= ereport(ERROR,=0A=20=09=09=09=09= (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),=0A@@=20-3152,7=20+3152,7=20= @@=20timetz_zone(PG_FUNCTION_ARGS)=0A=20=09TimeTzADT=20=20*t=20=3D=20= PG_GETARG_TIMETZADT_P(1);=0A=20=09TimeTzADT=20=20*result;=0A=20=09int=09=09= =09tz;=0A-=09char=09=09tzname[TZ_STRLEN_MAX=20+=201];=0A+=09char=09=09= tz_name[TZ_STRLEN_MAX=20+=201];=0A=20=09int=09=09=09type,=0A=20=09=09=09=09= val;=0A=20=09pg_tz=09=20=20=20*tzp;=0A@@=20-3160,9=20+3160,9=20@@=20= timetz_zone(PG_FUNCTION_ARGS)=0A=20=09/*=0A=20=09=20*=20Look=20up=20the=20= requested=20timezone.=0A=20=09=20*/=0A-=09text_to_cstring_buffer(zone,=20= tzname,=20sizeof(tzname));=0A+=09text_to_cstring_buffer(zone,=20tz_name,=20= sizeof(tz_name));=0A=20=0A-=09type=20=3D=20DecodeTimezoneName(tzname,=20= &val,=20&tzp);=0A+=09type=20=3D=20DecodeTimezoneName(tz_name,=20&val,=20= &tzp);=0A=20=0A=20=09if=20(type=20=3D=3D=20TZNAME_FIXED_OFFSET)=0A=20=09= {=0A@@=20-3175,7=20+3175,7=20@@=20timetz_zone(PG_FUNCTION_ARGS)=0A=20=09=09= TimestampTz=20now=20=3D=20GetCurrentTransactionStartTimestamp();=0A=20=09= =09int=09=09=09isdst;=0A=20=0A-=09=09tz=20=3D=20= DetermineTimeZoneAbbrevOffsetTS(now,=20tzname,=20tzp,=20&isdst);=0A+=09=09= tz=20=3D=20DetermineTimeZoneAbbrevOffsetTS(now,=20tz_name,=20tzp,=20= &isdst);=0A=20=09}=0A=20=09else=0A=20=09{=0Adiff=20--git=20= a/src/backend/utils/adt/datetime.c=20b/src/backend/utils/adt/datetime.c=0A= index=208f25c15fcfc..072eda02900=20100644=0A---=20= a/src/backend/utils/adt/datetime.c=0A+++=20= b/src/backend/utils/adt/datetime.c=0A@@=20-643,12=20+643,12=20@@=20= AdjustMicroseconds(int64=20val,=20double=20fval,=20int64=20scale,=0A=20= static=20bool=0A=20AdjustDays(int64=20val,=20int=20scale,=20struct=20= pg_itm_in=20*itm_in)=0A=20{=0A-=09int=09=09=09days;=0A+=09int=09=09=09= dayVal;=0A=20=0A=20=09if=20(val=20<=20INT_MIN=20||=20val=20>=20INT_MAX)=0A= =20=09=09return=20false;=0A-=09return=20!pg_mul_s32_overflow((int32)=20= val,=20scale,=20&days)=20&&=0A-=09=09= !pg_add_s32_overflow(itm_in->tm_mday,=20days,=20&itm_in->tm_mday);=0A+=09= return=20!pg_mul_s32_overflow((int32)=20val,=20scale,=20&dayVal)=20&&=0A= +=09=09!pg_add_s32_overflow(itm_in->tm_mday,=20dayVal,=20= &itm_in->tm_mday);=0A=20}=0A=20=0A=20/*=0A@@=20-3286,7=20+3286,7=20@@=20= DecodeSpecial(int=20field,=20const=20char=20*lowtoken,=20int=20*val)=0A=20= =20*=20the=20zone=20name=20or=20the=20abbreviation's=20underlying=20= zone.=0A=20=20*/=0A=20int=0A-DecodeTimezoneName(const=20char=20*tzname,=20= int=20*offset,=20pg_tz=20**tz)=0A+DecodeTimezoneName(const=20char=20= *tz_name,=20int=20*offset,=20pg_tz=20**tz)=0A=20{=0A=20=09char=09=20=20=20= *lowzone;=0A=20=09int=09=09=09dterr,=0A@@=20-3303,8=20+3303,8=20@@=20= DecodeTimezoneName(const=20char=20*tzname,=20int=20*offset,=20pg_tz=20= **tz)=0A=20=09=20*/=0A=20=0A=20=09/*=20DecodeTimezoneAbbrev=20requires=20= lowercase=20input=20*/=0A-=09lowzone=20=3D=20= downcase_truncate_identifier(tzname,=0A-=09=09=09=09=09=09=09=09=09=09=20= =20=20strlen(tzname),=0A+=09lowzone=20=3D=20= downcase_truncate_identifier(tz_name,=0A+=09=09=09=09=09=09=09=09=09=09=20= =20=20strlen(tz_name),=0A=20=09=09=09=09=09=09=09=09=09=09=20=20=20= false);=0A=20=0A=20=09dterr=20=3D=20DecodeTimezoneAbbrev(0,=20lowzone,=20= &type,=20offset,=20tz,=20&extra);=0A@@=20-3324,11=20+3324,11=20@@=20= DecodeTimezoneName(const=20char=20*tzname,=20int=20*offset,=20pg_tz=20= **tz)=0A=20=09else=0A=20=09{=0A=20=09=09/*=20try=20it=20as=20a=20full=20= zone=20name=20*/=0A-=09=09*tz=20=3D=20pg_tzset(tzname);=0A+=09=09*tz=20=3D= =20pg_tzset(tz_name);=0A=20=09=09if=20(*tz=20=3D=3D=20NULL)=0A=20=09=09=09= ereport(ERROR,=0A=20=09=09=09=09=09= (errcode(ERRCODE_INVALID_PARAMETER_VALUE),=0A-=09=09=09=09=09=20= errmsg("time=20zone=20\"%s\"=20not=20recognized",=20tzname)));=0A+=09=09=09= =09=09=20errmsg("time=20zone=20\"%s\"=20not=20recognized",=20tz_name)));=0A= =20=09=09return=20TZNAME_ZONE;=0A=20=09}=0A=20}=0A@@=20-3341,12=20= +3341,12=20@@=20DecodeTimezoneName(const=20char=20*tzname,=20int=20= *offset,=20pg_tz=20**tz)=0A=20=20*=20result=20in=20all=20cases.=0A=20=20= */=0A=20pg_tz=20*=0A-DecodeTimezoneNameToTz(const=20char=20*tzname)=0A= +DecodeTimezoneNameToTz(const=20char=20*tz_name)=0A=20{=0A=20=09pg_tz=09=20= =20=20*result;=0A=20=09int=09=09=09offset;=0A=20=0A-=09if=20= (DecodeTimezoneName(tzname,=20&offset,=20&result)=20=3D=3D=20= TZNAME_FIXED_OFFSET)=0A+=09if=20(DecodeTimezoneName(tz_name,=20&offset,=20= &result)=20=3D=3D=20TZNAME_FIXED_OFFSET)=0A=20=09{=0A=20=09=09/*=20= fixed-offset=20abbreviation,=20get=20a=20pg_tz=20descriptor=20for=20that=20= */=0A=20=09=09result=20=3D=20pg_tzset_offset(-offset);=09/*=20flip=20to=20= POSIX=20sign=20convention=20*/=0Adiff=20--git=20= a/src/backend/utils/adt/formatting.c=20= b/src/backend/utils/adt/formatting.c=0Aindex=200716aff22b6..1c0e5566301=20= 100644=0A---=20a/src/backend/utils/adt/formatting.c=0A+++=20= b/src/backend/utils/adt/formatting.c=0A@@=20-3034,12=20+3034,12=20@@=20= DCH_to_char(FormatNode=20*node,=20bool=20is_interval,=20TmToChar=20*in,=20= char=20*out,=20Oid=20col=0A=20=09=09=09=09else=0A=20=09=09=09=09{=0A=20=09= =09=09=09=09int=09=09=09mon=20=3D=200;=0A-=09=09=09=09=09const=20char=20= *const=20*months;=0A+=09=09=09=09=09const=20char=20*const=20*pmonths;=0A=20= =0A=20=09=09=09=09=09if=20(n->key->id=20=3D=3D=20DCH_RM)=0A-=09=09=09=09=09= =09months=20=3D=20rm_months_upper;=0A+=09=09=09=09=09=09pmonths=20=3D=20= rm_months_upper;=0A=20=09=09=09=09=09else=0A-=09=09=09=09=09=09months=20= =3D=20rm_months_lower;=0A+=09=09=09=09=09=09pmonths=20=3D=20= rm_months_lower;=0A=20=0A=20=09=09=09=09=09/*=0A=20=09=09=09=09=09=20*=20= Compute=20the=20position=20in=20the=20roman-numeral=20array.=20=20Note=0A= @@=20-3074,7=20+3074,7=20@@=20DCH_to_char(FormatNode=20*node,=20bool=20= is_interval,=20TmToChar=20*in,=20char=20*out,=20Oid=20col=0A=20=09=09=09=09= =09}=0A=20=0A=20=09=09=09=09=09sprintf(s,=20"%*s",=20= IS_SUFFIX_FM(n->suffix)=20?=200=20:=20-4,=0A-=09=09=09=09=09=09=09= months[mon]);=0A+=09=09=09=09=09=09=09pmonths[mon]);=0A=20=09=09=09=09=09= s=20+=3D=20strlen(s);=0A=20=09=09=09=09}=0A=20=09=09=09=09break;=0Adiff=20= --git=20a/src/backend/utils/adt/timestamp.c=20= b/src/backend/utils/adt/timestamp.c=0Aindex=20288d696be77..0cd37997014=20= 100644=0A---=20a/src/backend/utils/adt/timestamp.c=0A+++=20= b/src/backend/utils/adt/timestamp.c=0A@@=20-482,11=20+482,11=20@@=20= timestamptz_in(PG_FUNCTION_ARGS)=0A=20static=20int=0A=20= parse_sane_timezone(struct=20pg_tm=20*tm,=20text=20*zone)=0A=20{=0A-=09= char=09=09tzname[TZ_STRLEN_MAX=20+=201];=0A+=09char=09=09= tz_name[TZ_STRLEN_MAX=20+=201];=0A=20=09int=09=09=09dterr;=0A=20=09int=09= =09=09tz;=0A=20=0A-=09text_to_cstring_buffer(zone,=20tzname,=20= sizeof(tzname));=0A+=09text_to_cstring_buffer(zone,=20tz_name,=20= sizeof(tz_name));=0A=20=0A=20=09/*=0A=20=09=20*=20Look=20up=20the=20= requested=20timezone.=20=20First=20we=20try=20to=20interpret=20it=20as=20= a=0A@@=20-498,14=20+498,14=20@@=20parse_sane_timezone(struct=20pg_tm=20= *tm,=20text=20*zone)=0A=20=09=20*=20as=20invalid,=20it's=20enough=20to=20= disallow=20having=20a=20digit=20in=20the=20first=0A=20=09=20*=20position=20= of=20our=20input=20string.=0A=20=09=20*/=0A-=09if=20(isdigit((unsigned=20= char)=20*tzname))=0A+=09if=20(isdigit((unsigned=20char)=20*tz_name))=0A=20= =09=09ereport(ERROR,=0A=20=09=09=09=09= (errcode(ERRCODE_INVALID_PARAMETER_VALUE),=0A=20=09=09=09=09=20= errmsg("invalid=20input=20syntax=20for=20type=20%s:=20\"%s\"",=0A-=09=09=09= =09=09=09"numeric=20time=20zone",=20tzname),=0A+=09=09=09=09=09=09= "numeric=20time=20zone",=20tz_name),=0A=20=09=09=09=09=20= errhint("Numeric=20time=20zones=20must=20have=20\"-\"=20or=20\"+\"=20as=20= first=20character.")));=0A=20=0A-=09dterr=20=3D=20DecodeTimezone(tzname,=20= &tz);=0A+=09dterr=20=3D=20DecodeTimezone(tz_name,=20&tz);=0A=20=09if=20= (dterr=20!=3D=200)=0A=20=09{=0A=20=09=09int=09=09=09type,=0A@@=20-515,13=20= +515,13=20@@=20parse_sane_timezone(struct=20pg_tm=20*tm,=20text=20*zone)=0A= =20=09=09if=20(dterr=20=3D=3D=20DTERR_TZDISP_OVERFLOW)=0A=20=09=09=09= ereport(ERROR,=0A=20=09=09=09=09=09= (errcode(ERRCODE_INVALID_PARAMETER_VALUE),=0A-=09=09=09=09=09=20= errmsg("numeric=20time=20zone=20\"%s\"=20out=20of=20range",=20tzname)));=0A= +=09=09=09=09=09=20errmsg("numeric=20time=20zone=20\"%s\"=20out=20of=20= range",=20tz_name)));=0A=20=09=09else=20if=20(dterr=20!=3D=20= DTERR_BAD_FORMAT)=0A=20=09=09=09ereport(ERROR,=0A=20=09=09=09=09=09= (errcode(ERRCODE_INVALID_PARAMETER_VALUE),=0A-=09=09=09=09=09=20= errmsg("time=20zone=20\"%s\"=20not=20recognized",=20tzname)));=0A+=09=09=09= =09=09=20errmsg("time=20zone=20\"%s\"=20not=20recognized",=20tz_name)));=0A= =20=0A-=09=09type=20=3D=20DecodeTimezoneName(tzname,=20&val,=20&tzp);=0A= +=09=09type=20=3D=20DecodeTimezoneName(tz_name,=20&val,=20&tzp);=0A=20=0A= =20=09=09if=20(type=20=3D=3D=20TZNAME_FIXED_OFFSET)=0A=20=09=09{=0A@@=20= -531,7=20+531,7=20@@=20parse_sane_timezone(struct=20pg_tm=20*tm,=20text=20= *zone)=0A=20=09=09else=20if=20(type=20=3D=3D=20TZNAME_DYNTZ)=0A=20=09=09= {=0A=20=09=09=09/*=20dynamic-offset=20abbreviation,=20resolve=20using=20= specified=20time=20*/=0A-=09=09=09tz=20=3D=20= DetermineTimeZoneAbbrevOffset(tm,=20tzname,=20tzp);=0A+=09=09=09tz=20=3D=20= DetermineTimeZoneAbbrevOffset(tm,=20tz_name,=20tzp);=0A=20=09=09}=0A=20=09= =09else=0A=20=09=09{=0A@@=20-551,11=20+551,11=20@@=20= parse_sane_timezone(struct=20pg_tm=20*tm,=20text=20*zone)=0A=20static=20= pg_tz=20*=0A=20lookup_timezone(text=20*zone)=0A=20{=0A-=09char=09=09= tzname[TZ_STRLEN_MAX=20+=201];=0A+=09char=09=09tz_name[TZ_STRLEN_MAX=20+=20= 1];=0A=20=0A-=09text_to_cstring_buffer(zone,=20tzname,=20= sizeof(tzname));=0A+=09text_to_cstring_buffer(zone,=20tz_name,=20= sizeof(tz_name));=0A=20=0A-=09return=20DecodeTimezoneNameToTz(tzname);=0A= +=09return=20DecodeTimezoneNameToTz(tz_name);=0A=20}=0A=20=0A=20/*=0A@@=20= -1523,41=20+1523,41=20@@=20AdjustIntervalForTypmod(Interval=20*interval,=20= int32=20typmod,=0A=20Datum=0A=20make_interval(PG_FUNCTION_ARGS)=0A=20{=0A= -=09int32=09=09years=20=3D=20PG_GETARG_INT32(0);=0A-=09int32=09=09months=20= =3D=20PG_GETARG_INT32(1);=0A-=09int32=09=09weeks=20=3D=20= PG_GETARG_INT32(2);=0A-=09int32=09=09days=20=3D=20PG_GETARG_INT32(3);=0A= -=09int32=09=09hours=20=3D=20PG_GETARG_INT32(4);=0A-=09int32=09=09mins=20= =3D=20PG_GETARG_INT32(5);=0A-=09double=09=09secs=20=3D=20= PG_GETARG_FLOAT8(6);=0A+=09int32=09=09yearVal=20=3D=20= PG_GETARG_INT32(0);=0A+=09int32=09=09monthVal=20=3D=20= PG_GETARG_INT32(1);=0A+=09int32=09=09weekVal=20=3D=20PG_GETARG_INT32(2);=0A= +=09int32=09=09dayVal=20=3D=20PG_GETARG_INT32(3);=0A+=09int32=09=09= hourVal=20=3D=20PG_GETARG_INT32(4);=0A+=09int32=09=09minVal=20=3D=20= PG_GETARG_INT32(5);=0A+=09double=09=09secVal=20=3D=20= PG_GETARG_FLOAT8(6);=0A=20=09Interval=20=20=20*result;=0A=20=0A=20=09/*=0A= =20=09=20*=20Reject=20out-of-range=20inputs.=20=20We=20reject=20any=20= input=20values=20that=20cause=0A=20=09=20*=20integer=20overflow=20of=20= the=20corresponding=20interval=20fields.=0A=20=09=20*/=0A-=09if=20= (isinf(secs)=20||=20isnan(secs))=0A+=09if=20(isinf(secVal)=20||=20= isnan(secVal))=0A=20=09=09goto=20out_of_range;=0A=20=0A=20=09result=20=3D=20= palloc_object(Interval);=0A=20=0A=20=09/*=20years=20and=20months=20->=20= months=20*/=0A-=09if=20(pg_mul_s32_overflow(years,=20MONTHS_PER_YEAR,=20= &result->month)=20||=0A-=09=09pg_add_s32_overflow(result->month,=20= months,=20&result->month))=0A+=09if=20(pg_mul_s32_overflow(yearVal,=20= MONTHS_PER_YEAR,=20&result->month)=20||=0A+=09=09= pg_add_s32_overflow(result->month,=20monthVal,=20&result->month))=0A=20=09= =09goto=20out_of_range;=0A=20=0A=20=09/*=20weeks=20and=20days=20->=20= days=20*/=0A-=09if=20(pg_mul_s32_overflow(weeks,=20DAYS_PER_WEEK,=20= &result->day)=20||=0A-=09=09pg_add_s32_overflow(result->day,=20days,=20= &result->day))=0A+=09if=20(pg_mul_s32_overflow(weekVal,=20DAYS_PER_WEEK,=20= &result->day)=20||=0A+=09=09pg_add_s32_overflow(result->day,=20dayVal,=20= &result->day))=0A=20=09=09goto=20out_of_range;=0A=20=0A=20=09/*=20hours=20= and=20mins=20->=20usecs=20(cannot=20overflow=2064-bit)=20*/=0A-=09= result->time=20=3D=20hours=20*=20USECS_PER_HOUR=20+=20mins=20*=20= USECS_PER_MINUTE;=0A+=09result->time=20=3D=20hourVal=20*=20= USECS_PER_HOUR=20+=20minVal=20*=20USECS_PER_MINUTE;=0A=20=0A=20=09/*=20= secs=20->=20usecs=20*/=0A-=09secs=20=3D=20rint(float8_mul(secs,=20= USECS_PER_SEC));=0A-=09if=20(!FLOAT8_FITS_IN_INT64(secs)=20||=0A-=09=09= pg_add_s64_overflow(result->time,=20(int64)=20secs,=20&result->time))=0A= +=09secVal=20=3D=20rint(float8_mul(secVal,=20USECS_PER_SEC));=0A+=09if=20= (!FLOAT8_FITS_IN_INT64(secVal)=20||=0A+=09=09= pg_add_s64_overflow(result->time,=20(int64)=20secVal,=20&result->time))=0A= =20=09=09goto=20out_of_range;=0A=20=0A=20=09/*=20make=20sure=20that=20= the=20result=20is=20finite=20*/=0A@@=20-2125,9=20+2125,9=20@@=20= time2t(const=20int=20hour,=20const=20int=20min,=20const=20int=20sec,=20= const=20fsec_t=20fsec)=0A=20}=0A=20=0A=20static=20Timestamp=0A= -dt2local(Timestamp=20dt,=20int=20timezone)=0A+dt2local(Timestamp=20dt,=20= int=20tz)=0A=20{=0A-=09dt=20-=3D=20(timezone=20*=20USECS_PER_SEC);=0A+=09= dt=20-=3D=20(tz=20*=20USECS_PER_SEC);=0A=20=09return=20dt;=0A=20}=0A=20=0A= @@=20-2518,20=20+2518,20=20@@=20static=20inline=20INT128=0A=20= interval_cmp_value(const=20Interval=20*interval)=0A=20{=0A=20=09INT128=09= =09span;=0A-=09int64=09=09days;=0A+=09int64=09=09dayVal;=0A=20=0A=20=09= /*=0A=20=09=20*=20Combine=20the=20month=20and=20day=20fields=20into=20an=20= integral=20number=20of=20days.=0A=20=09=20*=20Because=20the=20inputs=20= are=20int32,=20int64=20arithmetic=20suffices=20here.=0A=20=09=20*/=0A-=09= days=20=3D=20interval->month=20*=20INT64CONST(30);=0A-=09days=20+=3D=20= interval->day;=0A+=09dayVal=20=3D=20interval->month=20*=20= INT64CONST(30);=0A+=09dayVal=20+=3D=20interval->day;=0A=20=0A=20=09/*=20= Widen=20time=20field=20to=20128=20bits=20*/=0A=20=09span=20=3D=20= int64_to_int128(interval->time);=0A=20=0A=20=09/*=20Scale=20up=20days=20= to=20microseconds,=20forming=20a=20128-bit=20product=20*/=0A-=09= int128_add_int64_mul_int64(&span,=20days,=20USECS_PER_DAY);=0A+=09= int128_add_int64_mul_int64(&span,=20dayVal,=20USECS_PER_DAY);=0A=20=0A=20= =09return=20span;=0A=20}=0A@@=20-6216,7=20+6216,7=20@@=20= interval_part_common(PG_FUNCTION_ARGS,=20bool=20retnumeric)=0A=20=09=09{=0A= =20=09=09=09Numeric=09=09result;=0A=20=09=09=09int64=09=09= secs_from_day_month;=0A-=09=09=09int64=09=09val;=0A+=09=09=09int64=09=09= value;=0A=20=0A=20=09=09=09/*=0A=20=09=09=09=20*=20To=20do=20this=20= calculation=20in=20integer=20arithmetic=20even=20though=0A@@=20-6239,9=20= +6239,9=20@@=20interval_part_common(PG_FUNCTION_ARGS,=20bool=20= retnumeric)=0A=20=09=09=09=20*=20numeric=20(slower).=20=20This=20= overflow=20happens=20around=2010^9=20days,=20so=0A=20=09=09=09=20*=20not=20= common=20in=20practice.=0A=20=09=09=09=20*/=0A-=09=09=09if=20= (!pg_mul_s64_overflow(secs_from_day_month,=201000000,=20&val)=20&&=0A-=09= =09=09=09!pg_add_s64_overflow(val,=20interval->time,=20&val))=0A-=09=09=09= =09result=20=3D=20int64_div_fast_to_numeric(val,=206);=0A+=09=09=09if=20= (!pg_mul_s64_overflow(secs_from_day_month,=201000000,=20&value)=20&&=0A+=09= =09=09=09!pg_add_s64_overflow(value,=20interval->time,=20&value))=0A+=09=09= =09=09result=20=3D=20int64_div_fast_to_numeric(value,=206);=0A=20=09=09=09= else=0A=20=09=09=09=09result=20=3D=0A=20=09=09=09=09=09= numeric_add_safe(int64_div_fast_to_numeric(interval->time,=206),=0A@@=20= -6305,7=20+6305,7=20@@=20timestamp_zone(PG_FUNCTION_ARGS)=0A=20=09= Timestamp=09timestamp=20=3D=20PG_GETARG_TIMESTAMP(1);=0A=20=09= TimestampTz=20result;=0A=20=09int=09=09=09tz;=0A-=09char=09=09= tzname[TZ_STRLEN_MAX=20+=201];=0A+=09char=09=09tz_name[TZ_STRLEN_MAX=20+=20= 1];=0A=20=09int=09=09=09type,=0A=20=09=09=09=09val;=0A=20=09pg_tz=09=20=20= =20*tzp;=0A@@=20-6318,9=20+6318,9=20@@=20= timestamp_zone(PG_FUNCTION_ARGS)=0A=20=09/*=0A=20=09=20*=20Look=20up=20= the=20requested=20timezone.=0A=20=09=20*/=0A-=09= text_to_cstring_buffer(zone,=20tzname,=20sizeof(tzname));=0A+=09= text_to_cstring_buffer(zone,=20tz_name,=20sizeof(tz_name));=0A=20=0A-=09= type=20=3D=20DecodeTimezoneName(tzname,=20&val,=20&tzp);=0A+=09type=20=3D=20= DecodeTimezoneName(tz_name,=20&val,=20&tzp);=0A=20=0A=20=09if=20(type=20= =3D=3D=20TZNAME_FIXED_OFFSET)=0A=20=09{=0A@@=20-6335,7=20+6335,7=20@@=20= timestamp_zone(PG_FUNCTION_ARGS)=0A=20=09=09=09ereport(ERROR,=0A=20=09=09= =09=09=09(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),=0A=20=09=09=09=09= =09=20errmsg("timestamp=20out=20of=20range")));=0A-=09=09tz=20=3D=20= -DetermineTimeZoneAbbrevOffset(&tm,=20tzname,=20tzp);=0A+=09=09tz=20=3D=20= -DetermineTimeZoneAbbrevOffset(&tm,=20tz_name,=20tzp);=0A=20=09=09result=20= =3D=20dt2local(timestamp,=20tz);=0A=20=09}=0A=20=09else=0A@@=20-6570,7=20= +6570,7=20@@=20timestamptz_zone(PG_FUNCTION_ARGS)=0A=20=09TimestampTz=20= timestamp=20=3D=20PG_GETARG_TIMESTAMPTZ(1);=0A=20=09Timestamp=09result;=0A= =20=09int=09=09=09tz;=0A-=09char=09=09tzname[TZ_STRLEN_MAX=20+=201];=0A+=09= char=09=09tz_name[TZ_STRLEN_MAX=20+=201];=0A=20=09int=09=09=09type,=0A=20= =09=09=09=09val;=0A=20=09pg_tz=09=20=20=20*tzp;=0A@@=20-6581,9=20+6581,9=20= @@=20timestamptz_zone(PG_FUNCTION_ARGS)=0A=20=09/*=0A=20=09=20*=20Look=20= up=20the=20requested=20timezone.=0A=20=09=20*/=0A-=09= text_to_cstring_buffer(zone,=20tzname,=20sizeof(tzname));=0A+=09= text_to_cstring_buffer(zone,=20tz_name,=20sizeof(tz_name));=0A=20=0A-=09= type=20=3D=20DecodeTimezoneName(tzname,=20&val,=20&tzp);=0A+=09type=20=3D=20= DecodeTimezoneName(tz_name,=20&val,=20&tzp);=0A=20=0A=20=09if=20(type=20= =3D=3D=20TZNAME_FIXED_OFFSET)=0A=20=09{=0A@@=20-6596,7=20+6596,7=20@@=20= timestamptz_zone(PG_FUNCTION_ARGS)=0A=20=09=09/*=20dynamic-offset=20= abbreviation,=20resolve=20using=20specified=20time=20*/=0A=20=09=09int=09= =09=09isdst;=0A=20=0A-=09=09tz=20=3D=20= DetermineTimeZoneAbbrevOffsetTS(timestamp,=20tzname,=20tzp,=20&isdst);=0A= +=09=09tz=20=3D=20DetermineTimeZoneAbbrevOffsetTS(timestamp,=20tz_name,=20= tzp,=20&isdst);=0A=20=09=09result=20=3D=20dt2local(timestamp,=20tz);=0A=20= =09}=0A=20=09else=0Adiff=20--git=20a/src/bin/initdb/findtimezone.c=20= b/src/bin/initdb/findtimezone.c=0Aindex=20910b97a570b..1c45a4ecd38=20= 100644=0A---=20a/src/bin/initdb/findtimezone.c=0A+++=20= b/src/bin/initdb/findtimezone.c=0A@@=20-231,7=20+231,7=20@@=20= compare_tm(struct=20tm=20*s,=20struct=20pg_tm=20*p)=0A=20=20*=20test=20= time.=0A=20=20*/=0A=20static=20int=0A-score_timezone(const=20char=20= *tzname,=20struct=20tztry=20*tt)=0A+score_timezone(const=20char=20= *tz_name,=20struct=20tztry=20*tt)=0A=20{=0A=20=09int=09=09=09i;=0A=20=09= pg_time_t=09pgtt;=0A@@=20-241,7=20+241,7=20@@=20score_timezone(const=20= char=20*tzname,=20struct=20tztry=20*tt)=0A=20=09pg_tz=09=20=20=20*tz;=0A=20= =0A=20=09/*=20Load=20timezone=20definition=20*/=0A-=09tz=20=3D=20= pg_load_tz(tzname);=0A+=09tz=20=3D=20pg_load_tz(tz_name);=0A=20=09if=20= (!tz)=0A=20=09=09return=20-1;=09=09=09=09/*=20unrecognized=20zone=20name=20= */=0A=20=0A@@=20-249,7=20+249,7=20@@=20score_timezone(const=20char=20= *tzname,=20struct=20tztry=20*tt)=0A=20=09if=20(!pg_tz_acceptable(tz))=0A=20= =09{=0A=20#ifdef=20DEBUG_IDENTIFY_TIMEZONE=0A-=09=09fprintf(stderr,=20= "Reject=20TZ=20\"%s\":=20uses=20leap=20seconds\n",=20tzname);=0A+=09=09= fprintf(stderr,=20"Reject=20TZ=20\"%s\":=20uses=20leap=20seconds\n",=20= tz_name);=0A=20#endif=0A=20=09=09return=20-1;=0A=20=09}=0A@@=20-266,7=20= +266,7=20@@=20score_timezone(const=20char=20*tzname,=20struct=20tztry=20= *tt)=0A=20=09=09{=0A=20#ifdef=20DEBUG_IDENTIFY_TIMEZONE=0A=20=09=09=09= fprintf(stderr,=20"TZ=20\"%s\"=20scores=20%d:=20at=20%ld=20= %04d-%02d-%02d=20%02d:%02d:%02d=20%s,=20system=20had=20no=20data\n",=0A-=09= =09=09=09=09tzname,=20i,=20(long)=20pgtt,=0A+=09=09=09=09=09tz_name,=20= i,=20(long)=20pgtt,=0A=20=09=09=09=09=09pgtm->tm_year=20+=201900,=20= pgtm->tm_mon=20+=201,=20pgtm->tm_mday,=0A=20=09=09=09=09=09= pgtm->tm_hour,=20pgtm->tm_min,=20pgtm->tm_sec,=0A=20=09=09=09=09=09= pgtm->tm_isdst=20?=20"dst"=20:=20"std");=0A@@=20-277,7=20+277,7=20@@=20= score_timezone(const=20char=20*tzname,=20struct=20tztry=20*tt)=0A=20=09=09= {=0A=20#ifdef=20DEBUG_IDENTIFY_TIMEZONE=0A=20=09=09=09fprintf(stderr,=20= "TZ=20\"%s\"=20scores=20%d:=20at=20%ld=20%04d-%02d-%02d=20%02d:%02d:%02d=20= %s=20versus=20%04d-%02d-%02d=20%02d:%02d:%02d=20%s\n",=0A-=09=09=09=09=09= tzname,=20i,=20(long)=20pgtt,=0A+=09=09=09=09=09tz_name,=20i,=20(long)=20= pgtt,=0A=20=09=09=09=09=09pgtm->tm_year=20+=201900,=20pgtm->tm_mon=20+=20= 1,=20pgtm->tm_mday,=0A=20=09=09=09=09=09pgtm->tm_hour,=20pgtm->tm_min,=20= pgtm->tm_sec,=0A=20=09=09=09=09=09pgtm->tm_isdst=20?=20"dst"=20:=20= "std",=0A@@=20-298,7=20+298,7=20@@=20score_timezone(const=20char=20= *tzname,=20struct=20tztry=20*tt)=0A=20=09=09=09{=0A=20#ifdef=20= DEBUG_IDENTIFY_TIMEZONE=0A=20=09=09=09=09fprintf(stderr,=20"TZ=20\"%s\"=20= scores=20%d:=20at=20%ld=20\"%s\"=20versus=20\"%s\"\n",=0A-=09=09=09=09=09= =09tzname,=20i,=20(long)=20pgtt,=0A+=09=09=09=09=09=09tz_name,=20i,=20= (long)=20pgtt,=0A=20=09=09=09=09=09=09pgtm->tm_zone,=20cbuf);=0A=20= #endif=0A=20=09=09=09=09return=20i;=0A@@=20-307,7=20+307,7=20@@=20= score_timezone(const=20char=20*tzname,=20struct=20tztry=20*tt)=0A=20=09}=0A= =20=0A=20#ifdef=20DEBUG_IDENTIFY_TIMEZONE=0A-=09fprintf(stderr,=20"TZ=20= \"%s\"=20gets=20max=20score=20%d\n",=20tzname,=20i);=0A+=09= fprintf(stderr,=20"TZ=20\"%s\"=20gets=20max=20score=20%d\n",=20tz_name,=20= i);=0A=20#endif=0A=20=0A=20=09return=20i;=0A@@=20-317,9=20+317,9=20@@=20= score_timezone(const=20char=20*tzname,=20struct=20tztry=20*tt)=0A=20=20*=20= Test=20whether=20given=20zone=20name=20is=20a=20perfect=20match=20to=20= localtime()=20behavior=0A=20=20*/=0A=20static=20bool=0A= -perfect_timezone_match(const=20char=20*tzname,=20struct=20tztry=20*tt)=0A= +perfect_timezone_match(const=20char=20*tz_name,=20struct=20tztry=20*tt)=0A= =20{=0A-=09return=20(score_timezone(tzname,=20tt)=20=3D=3D=20= tt->n_test_times);=0A+=09return=20(score_timezone(tz_name,=20tt)=20=3D=3D=20= tt->n_test_times);=0A=20}=0A=20=0A=20=0A@@=20-1725,14=20+1725,14=20@@=20= identify_system_timezone(void)=0A=20=20*=20Return=20true=20if=20the=20= given=20zone=20name=20is=20valid=20and=20is=20an=20"acceptable"=20zone.=0A= =20=20*/=0A=20static=20bool=0A-validate_zone(const=20char=20*tzname)=0A= +validate_zone(const=20char=20*zone)=0A=20{=0A=20=09pg_tz=09=20=20=20= *tz;=0A=20=0A-=09if=20(!tzname=20||=20!tzname[0])=0A+=09if=20(!zone=20||=20= !zone[0])=0A=20=09=09return=20false;=0A=20=0A-=09tz=20=3D=20= pg_load_tz(tzname);=0A+=09tz=20=3D=20pg_load_tz(zone);=0A=20=09if=20= (!tz)=0A=20=09=09return=20false;=0A=20=0A@@=20-1756,7=20+1756,7=20@@=20= validate_zone(const=20char=20*tzname)=0A=20const=20char=20*=0A=20= select_default_timezone(const=20char=20*share_path)=0A=20{=0A-=09const=20= char=20*tzname;=0A+=09const=20char=20*tz;=0A=20=0A=20=09/*=20Initialize=20= timezone=20directory=20path,=20if=20needed=20*/=0A=20#ifndef=20= SYSTEMTZDIR=0A@@=20-1764,14=20+1764,14=20@@=20= select_default_timezone(const=20char=20*share_path)=0A=20#endif=0A=20=0A=20= =09/*=20Check=20TZ=20environment=20variable=20*/=0A-=09tzname=20=3D=20= getenv("TZ");=0A-=09if=20(validate_zone(tzname))=0A-=09=09return=20= tzname;=0A+=09tz=20=3D=20getenv("TZ");=0A+=09if=20(validate_zone(tz))=0A= +=09=09return=20tz;=0A=20=0A=20=09/*=20Nope,=20so=20try=20to=20identify=20= the=20system=20timezone=20*/=0A-=09tzname=20=3D=20= identify_system_timezone();=0A-=09if=20(validate_zone(tzname))=0A-=09=09= return=20tzname;=0A+=09tz=20=3D=20identify_system_timezone();=0A+=09if=20= (validate_zone(tz))=0A+=09=09return=20tz;=0A=20=0A=20=09return=20NULL;=0A= =20}=0Adiff=20--git=20a/src/include/pgtime.h=20b/src/include/pgtime.h=0A= index=20ba6705f71bd..458b4300a63=20100644=0A---=20a/src/include/pgtime.h=0A= +++=20b/src/include/pgtime.h=0A@@=20-91,7=20+91,7=20@@=20extern=20= PGDLLIMPORT=20pg_tz=20*session_timezone;=0A=20extern=20PGDLLIMPORT=20= pg_tz=20*log_timezone;=0A=20=0A=20extern=20void=20= pg_timezone_initialize(void);=0A-extern=20pg_tz=20*pg_tzset(const=20char=20= *tzname);=0A+extern=20pg_tz=20*pg_tzset(const=20char=20*zone);=0A=20= extern=20pg_tz=20*pg_tzset_offset(long=20gmtoffset);=0A=20=0A=20extern=20= pg_tzenum=20*pg_tzenumerate_start(void);=0Adiff=20--git=20= a/src/include/utils/datetime.h=20b/src/include/utils/datetime.h=0Aindex=20= f77c6acd8b6..abdaaaccb45=20100644=0A---=20a/src/include/utils/datetime.h=0A= +++=20b/src/include/utils/datetime.h=0A@@=20-345,8=20+345,8=20@@=20= extern=20int=09DecodeTimezoneAbbrev(int=20field,=20const=20char=20= *lowtoken,=0A=20extern=20int=09DecodeSpecial(int=20field,=20const=20char=20= *lowtoken,=20int=20*val);=0A=20extern=20int=09DecodeUnits(int=20field,=20= const=20char=20*lowtoken,=20int=20*val);=0A=20=0A-extern=20int=09= DecodeTimezoneName(const=20char=20*tzname,=20int=20*offset,=20pg_tz=20= **tz);=0A-extern=20pg_tz=20*DecodeTimezoneNameToTz(const=20char=20= *tzname);=0A+extern=20int=09DecodeTimezoneName(const=20char=20*tz_name,=20= int=20*offset,=20pg_tz=20**tz);=0A+extern=20pg_tz=20= *DecodeTimezoneNameToTz(const=20char=20*tz_name);=0A=20=0A=20extern=20= int=09DecodeTimezoneAbbrevPrefix(const=20char=20*str,=0A=20=09=09=09=09=09= =09=09=09=09=20=20=20int=20*offset,=20pg_tz=20**tz);=0Adiff=20--git=20= a/src/timezone/pgtz.c=20b/src/timezone/pgtz.c=0Aindex=20= eac988c21e7..72f41ea42d8=20100644=0A---=20a/src/timezone/pgtz.c=0A+++=20= b/src/timezone/pgtz.c=0A@@=20-231,7=20+231,7=20@@=20= init_timezone_hashtable(void)=0A=20=20*=20default=20timezone=20setting=20= is=20later=20overridden=20from=20postgresql.conf.=0A=20=20*/=0A=20pg_tz=20= *=0A-pg_tzset(const=20char=20*tzname)=0A+pg_tzset(const=20char=20*zone)=0A= =20{=0A=20=09pg_tz_cache=20*tzp;=0A=20=09struct=20state=20tzstate;=0A@@=20= -239,7=20+239,7=20@@=20pg_tzset(const=20char=20*tzname)=0A=20=09char=09=09= canonname[TZ_STRLEN_MAX=20+=201];=0A=20=09char=09=20=20=20*p;=0A=20=0A-=09= if=20(strlen(tzname)=20>=20TZ_STRLEN_MAX)=0A+=09if=20(strlen(zone)=20>=20= TZ_STRLEN_MAX)=0A=20=09=09return=20NULL;=09=09=09/*=20not=20going=20to=20= fit=20*/=0A=20=0A=20=09if=20(!timezone_cache)=0A@@=20-253,8=20+253,8=20= @@=20pg_tzset(const=20char=20*tzname)=0A=20=09=20*=20a=20POSIX-style=20= timezone=20spec.)=0A=20=09=20*/=0A=20=09p=20=3D=20uppername;=0A-=09while=20= (*tzname)=0A-=09=09*p++=20=3D=20pg_toupper((unsigned=20char)=20= *tzname++);=0A+=09while=20(*zone)=0A+=09=09*p++=20=3D=20= pg_toupper((unsigned=20char)=20*zone++);=0A=20=09*p=20=3D=20'\0';=0A=20=0A= =20=09tzp=20=3D=20(pg_tz_cache=20*)=20hash_search(timezone_cache,=0A@@=20= -321,7=20+321,7=20@@=20pg_tzset_offset(long=20gmtoffset)=0A=20{=0A=20=09= long=09=09absoffset=20=3D=20(gmtoffset=20<=200)=20?=20-gmtoffset=20:=20= gmtoffset;=0A=20=09char=09=09offsetstr[64];=0A-=09char=09=09tzname[128];=0A= +=09char=09=09zone[128];=0A=20=0A=20=09snprintf(offsetstr,=20= sizeof(offsetstr),=0A=20=09=09=09=20"%02ld",=20absoffset=20/=20= SECS_PER_HOUR);=0A@@=20-338,13=20+338,13=20@@=20pg_tzset_offset(long=20= gmtoffset)=0A=20=09=09=09=09=09=20":%02ld",=20absoffset);=0A=20=09}=0A=20= =09if=20(gmtoffset=20>=200)=0A-=09=09snprintf(tzname,=20sizeof(tzname),=20= "<-%s>+%s",=0A+=09=09snprintf(zone,=20sizeof(zone),=20"<-%s>+%s",=0A=20=09= =09=09=09=20offsetstr,=20offsetstr);=0A=20=09else=0A-=09=09= snprintf(tzname,=20sizeof(tzname),=20"<+%s>-%s",=0A+=09=09snprintf(zone,=20= sizeof(zone),=20"<+%s>-%s",=0A=20=09=09=09=09=20offsetstr,=20offsetstr);=0A= =20=0A-=09return=20pg_tzset(tzname);=0A+=09return=20pg_tzset(zone);=0A=20= }=0A=20=0A=20=0A--=20=0A2.50.1=20(Apple=20Git-155)=0A=0A= --Apple-Mail=_B830DCCB-64C7-4AD6-938E-E4A843BDEE74 Content-Disposition: attachment; filename=v8-0011-cleanup-rename-local-progname-variables-to-avoid-.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="v8-0011-cleanup-rename-local-progname-variables-to-avoid-.patch" Content-Transfer-Encoding: quoted-printable =46rom=204b2fdbf960aa406685b2d053de9b43315b539b1f=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20"Chao=20Li=20(Evan)"=20=0A= Date:=20Tue,=202=20Dec=202025=2014:59:43=20+0800=0ASubject:=20[PATCH=20= v8=2011/12]=20cleanup:=20rename=20local=20progname=20variables=20to=20= avoid=0A=20shadowing=20the=20global=0A=0AThis=20commit=20updates=20all=20= functions=20that=20declared=20a=20local=20variable=20named=0A'progname',=20= renaming=20each=20to=20'myprogname'.=20The=20change=20prevents=20= shadowing=0Aof=20the=20global=20progname=20variable=20and=20keeps=20= identifier=20usage=20unambiguous=0Awithin=20each=20scope.=0A=0AA=20few=20= additional=20shadowing=20fixes=20in=20the=20same=20files=20are=20= included=20as=20well.=0AThese=20unrelated=20cases=20are=20addressed=20= here=20only=20because=20they=20occur=20in=20the=0Asame=20code=20= locations=20touched=20by=20the=20progname=20change,=20and=20bundling=20= them=0Akeeps=20the=20commit=20self-contained.=0A=0AAuthor:=20Chao=20Li=20= =0ADiscussion:=20= https://postgr.es/m/CAEoWx2kQ2x5gMaj8tHLJ3=3DjfC+p5YXHkJyHrDTiQw2nn2FJTmQ@= mail.gmail.com=0A---=0A=20src/backend/bootstrap/bootstrap.c=20=20=20=20=20= =20=20=20=20=20=20|=20=208=20+-=0A=20src/backend/main/main.c=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20|=2014=20++--=0A=20= src/bin/initdb/initdb.c=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20|=2060=20+++++++-------=0A=20src/bin/pg_amcheck/pg_amcheck.c=20= =20=20=20=20=20=20=20=20=20=20=20=20|=20=206=20+-=0A=20= src/bin/pg_basebackup/pg_createsubscriber.c=20|=2014=20++--=0A=20= src/bin/pg_dump/connectdb.c=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20|=20=204=20+-=0A=20src/bin/pg_dump/pg_dump.c=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20|=2090=20++++++++++-----------=0A=20= src/bin/pg_dump/pg_restore.c=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20|=20=204=20+-=0A=20src/bin/pg_rewind/pg_rewind.c=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20|=2022=20++---=0A=20= src/interfaces/ecpg/preproc/ecpg.c=20=20=20=20=20=20=20=20=20=20|=20=206=20= +-=0A=2010=20files=20changed,=20114=20insertions(+),=20114=20= deletions(-)=0A=0Adiff=20--git=20a/src/backend/bootstrap/bootstrap.c=20= b/src/backend/bootstrap/bootstrap.c=0Aindex=20b0dcd9876c5..4a4dde82655=20= 100644=0A---=20a/src/backend/bootstrap/bootstrap.c=0A+++=20= b/src/backend/bootstrap/bootstrap.c=0A@@=20-237,7=20+237,7=20@@=20void=0A= =20BootstrapModeMain(int=20argc,=20char=20*argv[],=20bool=20check_only)=0A= =20{=0A=20=09int=09=09=09i;=0A-=09char=09=20=20=20*progname=20=3D=20= argv[0];=0A+=09char=09=20=20=20*myprogname=20=3D=20argv[0];=0A=20=09= pg_getopt_ctx=20optctx;=0A=20=09int=09=09=09flag;=0A=20=09char=09=20=20=20= *userDoption=20=3D=20NULL;=0A@@=20-335,7=20+335,7=20@@=20= BootstrapModeMain(int=20argc,=20char=20*argv[],=20bool=20check_only)=0A=20= =09=09=09=09break;=0A=20=09=09=09default:=0A=20=09=09=09=09= write_stderr("Try=20\"%s=20--help\"=20for=20more=20information.\n",=0A-=09= =09=09=09=09=09=09=20progname);=0A+=09=09=09=09=09=09=09=20myprogname);=0A= =20=09=09=09=09proc_exit(1);=0A=20=09=09=09=09break;=0A=20=09=09}=0A@@=20= -343,12=20+343,12=20@@=20BootstrapModeMain(int=20argc,=20char=20*argv[],=20= bool=20check_only)=0A=20=0A=20=09if=20(argc=20!=3D=20optctx.optind)=0A=20= =09{=0A-=09=09write_stderr("%s:=20invalid=20command-line=20arguments\n",=20= progname);=0A+=09=09write_stderr("%s:=20invalid=20command-line=20= arguments\n",=20myprogname);=0A=20=09=09proc_exit(1);=0A=20=09}=0A=20=0A=20= =09/*=20Acquire=20configuration=20parameters=20*/=0A-=09if=20= (!SelectConfigFiles(userDoption,=20progname))=0A+=09if=20= (!SelectConfigFiles(userDoption,=20myprogname))=0A=20=09=09proc_exit(1);=0A= =20=0A=20=09/*=0Adiff=20--git=20a/src/backend/main/main.c=20= b/src/backend/main/main.c=0Aindex=207b9b602f3c4..5bf4c4f4774=20100644=0A= ---=20a/src/backend/main/main.c=0A+++=20b/src/backend/main/main.c=0A@@=20= -281,7=20+281,7=20@@=20parse_dispatch_option(const=20char=20*name)=0A=20=20= *=20without=20help.=20=20Avoid=20adding=20more=20here,=20if=20you=20can.=0A= =20=20*/=0A=20static=20void=0A-startup_hacks(const=20char=20*progname)=0A= +startup_hacks(const=20char=20*myprogname)=0A=20{=0A=20=09/*=0A=20=09=20= *=20Windows-specific=20execution=20environment=20hacking.=0A@@=20-300,7=20= +300,7=20@@=20startup_hacks(const=20char=20*progname)=0A=20=09=09if=20= (err=20!=3D=200)=0A=20=09=09{=0A=20=09=09=09write_stderr("%s:=20= WSAStartup=20failed:=20%d\n",=0A-=09=09=09=09=09=09=20progname,=20err);=0A= +=09=09=09=09=09=09=20myprogname,=20err);=0A=20=09=09=09exit(1);=0A=20=09= =09}=0A=20=0A@@=20-385,10=20+385,10=20@@=20init_locale(const=20char=20= *categoryname,=20int=20category,=20const=20char=20*locale)=0A=20=20*=20= Messages=20emitted=20in=20write_console()=20do=20not=20exhibit=20this=20= problem.=0A=20=20*/=0A=20static=20void=0A-help(const=20char=20*progname)=0A= +help(const=20char=20*myprogname)=0A=20{=0A-=09printf(_("%s=20is=20the=20= PostgreSQL=20server.\n\n"),=20progname);=0A-=09printf(_("Usage:\n=20=20= %s=20[OPTION]...\n\n"),=20progname);=0A+=09printf(_("%s=20is=20the=20= PostgreSQL=20server.\n\n"),=20myprogname);=0A+=09printf(_("Usage:\n=20=20= %s=20[OPTION]...\n\n"),=20myprogname);=0A=20=09printf(_("Options:\n"));=0A= =20=09printf(_("=20=20-B=20NBUFFERS=20=20=20=20=20=20=20=20number=20of=20= shared=20buffers\n"));=0A=20=09printf(_("=20=20-c=20NAME=3DVALUE=20=20=20= =20=20=20set=20run-time=20parameter\n"));=0A@@=20-444,7=20+444,7=20@@=20= help(const=20char=20*progname)=0A=20=0A=20=0A=20static=20void=0A= -check_root(const=20char=20*progname)=0A+check_root(const=20char=20= *myprogname)=0A=20{=0A=20#ifndef=20WIN32=0A=20=09if=20(geteuid()=20=3D=3D=20= 0)=0A@@=20-467,7=20+467,7=20@@=20check_root(const=20char=20*progname)=0A=20= =09if=20(getuid()=20!=3D=20geteuid())=0A=20=09{=0A=20=09=09= write_stderr("%s:=20real=20and=20effective=20user=20IDs=20must=20= match\n",=0A-=09=09=09=09=09=20progname);=0A+=09=09=09=09=09=20= myprogname);=0A=20=09=09exit(1);=0A=20=09}=0A=20#else=09=09=09=09=09=09=09= /*=20WIN32=20*/=0Adiff=20--git=20a/src/bin/initdb/initdb.c=20= b/src/bin/initdb/initdb.c=0Aindex=2014cb79c26be..158e6a2d005=20100644=0A= ---=20a/src/bin/initdb/initdb.c=0A+++=20b/src/bin/initdb/initdb.c=0A@@=20= -828,7=20+828,7=20@@=20cleanup_directories_atexit(void)=0A=20static=20= char=20*=0A=20get_id(void)=0A=20{=0A-=09const=20char=20*username;=0A+=09= const=20char=20*user;=0A=20=0A=20#ifndef=20WIN32=0A=20=09if=20(geteuid()=20= =3D=3D=200)=09=09=09/*=200=20is=20root's=20uid=20*/=0A@@=20-839,9=20= +839,9=20@@=20get_id(void)=0A=20=09}=0A=20#endif=0A=20=0A-=09username=20= =3D=20get_user_name_or_exit(progname);=0A+=09user=20=3D=20= get_user_name_or_exit(progname);=0A=20=0A-=09return=20= pg_strdup(username);=0A+=09return=20pg_strdup(user);=0A=20}=0A=20=0A=20= static=20char=20*=0A@@=20-1062,14=20+1062,14=20@@=20= write_version_file(const=20char=20*extrapath)=0A=20static=20void=0A=20= set_null_conf(void)=0A=20{=0A-=09FILE=09=20=20=20*conf_file;=0A+=09FILE=09= =20=20=20*file;=0A=20=09char=09=20=20=20*path;=0A=20=0A=20=09path=20=3D=20= psprintf("%s/postgresql.conf",=20pg_data);=0A-=09conf_file=20=3D=20= fopen(path,=20PG_BINARY_W);=0A-=09if=20(conf_file=20=3D=3D=20NULL)=0A+=09= file=20=3D=20fopen(path,=20PG_BINARY_W);=0A+=09if=20(file=20=3D=3D=20= NULL)=0A=20=09=09pg_fatal("could=20not=20open=20file=20\"%s\"=20for=20= writing:=20%m",=20path);=0A-=09if=20(fclose(conf_file))=0A+=09if=20= (fclose(file))=0A=20=09=09pg_fatal("could=20not=20write=20file=20\"%s\":=20= %m",=20path);=0A=20=09free(path);=0A=20}=0A@@=20-2163,7=20+2163,7=20@@=20= my_strftime(char=20*s,=20size_t=20max,=20const=20char=20*fmt,=20const=20= struct=20tm=20*tm)=0A=20=20*=20Determine=20likely=20date=20order=20from=20= locale=0A=20=20*/=0A=20static=20int=0A-locale_date_order(const=20char=20= *locale)=0A+locale_date_order(const=20char=20*mylocale)=0A=20{=0A=20=09= struct=20tm=09testtime;=0A=20=09char=09=09buf[128];=0A@@=20-2178,7=20= +2178,7=20@@=20locale_date_order(const=20char=20*locale)=0A=20=0A=20=09= save=20=3D=20save_global_locale(LC_TIME);=0A=20=0A-=09setlocale(LC_TIME,=20= locale);=0A+=09setlocale(LC_TIME,=20mylocale);=0A=20=0A=20=09= memset(&testtime,=200,=20sizeof(testtime));=0A=20=09testtime.tm_mday=20=3D= =2022;=0A@@=20-2222,14=20+2222,14=20@@=20locale_date_order(const=20char=20= *locale)=0A=20=20*=20this=20should=20match=20the=20backend's=20= check_locale()=20function=0A=20=20*/=0A=20static=20void=0A= -check_locale_name(int=20category,=20const=20char=20*locale,=20char=20= **canonname)=0A+check_locale_name(int=20category,=20const=20char=20= *mylocale,=20char=20**canonname)=0A=20{=0A=20=09save_locale_t=20save;=0A=20= =09char=09=20=20=20*res;=0A=20=0A=20=09/*=20Don't=20let=20Windows'=20= non-ASCII=20locale=20names=20in.=20*/=0A-=09if=20(locale=20&&=20= !pg_is_ascii(locale))=0A-=09=09pg_fatal("locale=20name=20\"%s\"=20= contains=20non-ASCII=20characters",=20locale);=0A+=09if=20(mylocale=20&&=20= !pg_is_ascii(mylocale))=0A+=09=09pg_fatal("locale=20name=20\"%s\"=20= contains=20non-ASCII=20characters",=20mylocale);=0A=20=0A=20=09if=20= (canonname)=0A=20=09=09*canonname=20=3D=20NULL;=09=09/*=20in=20case=20of=20= failure=20*/=0A@@=20-2237,11=20+2237,11=20@@=20check_locale_name(int=20= category,=20const=20char=20*locale,=20char=20**canonname)=0A=20=09save=20= =3D=20save_global_locale(category);=0A=20=0A=20=09/*=20for=20setlocale()=20= call=20*/=0A-=09if=20(!locale)=0A-=09=09locale=20=3D=20"";=0A+=09if=20= (!mylocale)=0A+=09=09mylocale=20=3D=20"";=0A=20=0A=20=09/*=20set=20the=20= locale=20with=20setlocale,=20to=20see=20if=20it=20accepts=20it.=20*/=0A-=09= res=20=3D=20setlocale(category,=20locale);=0A+=09res=20=3D=20= setlocale(category,=20mylocale);=0A=20=0A=20=09/*=20save=20canonical=20= name=20if=20requested.=20*/=0A=20=09if=20(res=20&&=20canonname)=0A@@=20= -2253,9=20+2253,9=20@@=20check_locale_name(int=20category,=20const=20= char=20*locale,=20char=20**canonname)=0A=20=09/*=20complain=20if=20= locale=20wasn't=20valid=20*/=0A=20=09if=20(res=20=3D=3D=20NULL)=0A=20=09= {=0A-=09=09if=20(*locale)=0A+=09=09if=20(*mylocale)=0A=20=09=09{=0A-=09=09= =09pg_log_error("invalid=20locale=20name=20\"%s\"",=20locale);=0A+=09=09=09= pg_log_error("invalid=20locale=20name=20\"%s\"",=20mylocale);=0A=20=09=09= =09pg_log_error_hint("If=20the=20locale=20name=20is=20specific=20to=20= ICU,=20use=20--icu-locale.");=0A=20=09=09=09exit(1);=0A=20=09=09}=0A@@=20= -2285,11=20+2285,11=20@@=20check_locale_name(int=20category,=20const=20= char=20*locale,=20char=20**canonname)=0A=20=20*=20this=20should=20match=20= the=20similar=20check=20in=20the=20backend=20createdb()=20function=0A=20=20= */=0A=20static=20bool=0A-check_locale_encoding(const=20char=20*locale,=20= int=20user_enc)=0A+check_locale_encoding(const=20char=20*mylocale,=20int=20= user_enc)=0A=20{=0A=20=09int=09=09=09locale_enc;=0A=20=0A-=09locale_enc=20= =3D=20pg_get_encoding_from_locale(locale,=20true);=0A+=09locale_enc=20=3D=20= pg_get_encoding_from_locale(mylocale,=20true);=0A=20=0A=20=09/*=20See=20= notes=20in=20createdb()=20to=20understand=20these=20tests=20*/=0A=20=09= if=20(!(locale_enc=20=3D=3D=20user_enc=20||=0A@@=20-2537,11=20+2537,11=20= @@=20setlocales(void)=0A=20=20*=20print=20help=20text=0A=20=20*/=0A=20= static=20void=0A-usage(const=20char=20*progname)=0A+usage(const=20char=20= *myprogname)=0A=20{=0A-=09printf(_("%s=20initializes=20a=20PostgreSQL=20= database=20cluster.\n\n"),=20progname);=0A+=09printf(_("%s=20initializes=20= a=20PostgreSQL=20database=20cluster.\n\n"),=20myprogname);=0A=20=09= printf(_("Usage:\n"));=0A-=09printf(_("=20=20%s=20[OPTION]...=20= [DATADIR]\n"),=20progname);=0A+=09printf(_("=20=20%s=20[OPTION]...=20= [DATADIR]\n"),=20myprogname);=0A=20=09printf(_("\nOptions:\n"));=0A=20=09= printf(_("=20=20-A,=20--auth=3DMETHOD=20=20=20=20=20=20=20=20=20default=20= authentication=20method=20for=20local=20connections\n"));=0A=20=09= printf(_("=20=20=20=20=20=20--auth-host=3DMETHOD=20=20=20=20default=20= authentication=20method=20for=20local=20TCP/IP=20connections\n"));=0A@@=20= -2617,14=20+2617,14=20@@=20check_authmethod_valid(const=20char=20= *authmethod,=20const=20char=20*const=20*valid_methods,=0A=20}=0A=20=0A=20= static=20void=0A-check_need_password(const=20char=20*authmethodlocal,=20= const=20char=20*authmethodhost)=0A-{=0A-=09if=20= ((strcmp(authmethodlocal,=20"md5")=20=3D=3D=200=20||=0A-=09=09=20= strcmp(authmethodlocal,=20"password")=20=3D=3D=200=20||=0A-=09=09=20= strcmp(authmethodlocal,=20"scram-sha-256")=20=3D=3D=200)=20&&=0A-=09=09= (strcmp(authmethodhost,=20"md5")=20=3D=3D=200=20||=0A-=09=09=20= strcmp(authmethodhost,=20"password")=20=3D=3D=200=20||=0A-=09=09=20= strcmp(authmethodhost,=20"scram-sha-256")=20=3D=3D=200)=20&&=0A= +check_need_password(const=20char=20*myauthmethodlocal,=20const=20char=20= *myauthmethodhost)=0A+{=0A+=09if=20((strcmp(myauthmethodlocal,=20"md5")=20= =3D=3D=200=20||=0A+=09=09=20strcmp(myauthmethodlocal,=20"password")=20=3D=3D= =200=20||=0A+=09=09=20strcmp(myauthmethodlocal,=20"scram-sha-256")=20=3D=3D= =200)=20&&=0A+=09=09(strcmp(myauthmethodhost,=20"md5")=20=3D=3D=200=20||=0A= +=09=09=20strcmp(myauthmethodhost,=20"password")=20=3D=3D=200=20||=0A+=09= =09=20strcmp(myauthmethodhost,=20"scram-sha-256")=20=3D=3D=200)=20&&=0A=20= =09=09!(pwprompt=20||=20pwfilename))=0A=20=09=09pg_fatal("must=20specify=20= a=20password=20for=20the=20superuser=20to=20enable=20password=20= authentication");=0A=20}=0Adiff=20--git=20= a/src/bin/pg_amcheck/pg_amcheck.c=20b/src/bin/pg_amcheck/pg_amcheck.c=0A= index=2009ba0596400..22bf0fa9dcb=20100644=0A---=20= a/src/bin/pg_amcheck/pg_amcheck.c=0A+++=20= b/src/bin/pg_amcheck/pg_amcheck.c=0A@@=20-1180,11=20+1180,11=20@@=20= verify_btree_slot_handler(PGresult=20*res,=20PGconn=20*conn,=20void=20= *context)=0A=20=20*=20progname:=20the=20name=20of=20the=20executed=20= program,=20such=20as=20"pg_amcheck"=0A=20=20*/=0A=20static=20void=0A= -help(const=20char=20*progname)=0A+help(const=20char=20*myprogname)=0A=20= {=0A-=09printf(_("%s=20checks=20objects=20in=20a=20PostgreSQL=20database=20= for=20corruption.\n\n"),=20progname);=0A+=09printf(_("%s=20checks=20= objects=20in=20a=20PostgreSQL=20database=20for=20corruption.\n\n"),=20= myprogname);=0A=20=09printf(_("Usage:\n"));=0A-=09printf(_("=20=20%s=20= [OPTION]...=20[DBNAME]\n"),=20progname);=0A+=09printf(_("=20=20%s=20= [OPTION]...=20[DBNAME]\n"),=20myprogname);=0A=20=09printf(_("\nTarget=20= options:\n"));=0A=20=09printf(_("=20=20-a,=20--all=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20check=20all=20= databases\n"));=0A=20=09printf(_("=20=20-d,=20--database=3DPATTERN=20=20=20= =20=20=20=20=20=20=20check=20matching=20database(s)\n"));=0Adiff=20--git=20= a/src/bin/pg_basebackup/pg_createsubscriber.c=20= b/src/bin/pg_basebackup/pg_createsubscriber.c=0Aindex=20= 15e06e5686e..0676944f9cd=20100644=0A---=20= a/src/bin/pg_basebackup/pg_createsubscriber.c=0A+++=20= b/src/bin/pg_basebackup/pg_createsubscriber.c=0A@@=20-411,32=20+411,32=20= @@=20get_sub_conninfo(const=20struct=20CreateSubscriberOptions=20*opt)=0A= =20=20*=20path=20of=20the=20progname.=0A=20=20*/=0A=20static=20char=20*=0A= -get_exec_path(const=20char=20*argv0,=20const=20char=20*progname)=0A= +get_exec_path(const=20char=20*argv0,=20const=20char=20*myprogname)=0A=20= {=0A=20=09char=09=20=20=20*versionstr;=0A=20=09char=09=20=20=20= *exec_path;=0A=20=09int=09=09=09ret;=0A=20=0A-=09versionstr=20=3D=20= psprintf("%s=20(PostgreSQL)=20%s\n",=20progname,=20PG_VERSION);=0A+=09= versionstr=20=3D=20psprintf("%s=20(PostgreSQL)=20%s\n",=20myprogname,=20= PG_VERSION);=0A=20=09exec_path=20=3D=20pg_malloc(MAXPGPATH);=0A-=09ret=20= =3D=20find_other_exec(argv0,=20progname,=20versionstr,=20exec_path);=0A+=09= ret=20=3D=20find_other_exec(argv0,=20myprogname,=20versionstr,=20= exec_path);=0A=20=0A=20=09if=20(ret=20<=200)=0A=20=09{=0A=20=09=09char=09= =09full_path[MAXPGPATH];=0A=20=0A=20=09=09if=20(find_my_exec(argv0,=20= full_path)=20<=200)=0A-=09=09=09strlcpy(full_path,=20progname,=20= sizeof(full_path));=0A+=09=09=09strlcpy(full_path,=20myprogname,=20= sizeof(full_path));=0A=20=0A=20=09=09if=20(ret=20=3D=3D=20-1)=0A=20=09=09= =09pg_fatal("program=20\"%s\"=20is=20needed=20by=20%s=20but=20was=20not=20= found=20in=20the=20same=20directory=20as=20\"%s\"",=0A-=09=09=09=09=09=20= progname,=20"pg_createsubscriber",=20full_path);=0A+=09=09=09=09=09=20= myprogname,=20"pg_createsubscriber",=20full_path);=0A=20=09=09else=0A=20=09= =09=09pg_fatal("program=20\"%s\"=20was=20found=20by=20\"%s\"=20but=20was=20= not=20the=20same=20version=20as=20%s",=0A-=09=09=09=09=09=20progname,=20= full_path,=20"pg_createsubscriber");=0A+=09=09=09=09=09=20myprogname,=20= full_path,=20"pg_createsubscriber");=0A=20=09}=0A=20=0A-=09= pg_log_debug("%s=20path=20is:=20=20%s",=20progname,=20exec_path);=0A+=09= pg_log_debug("%s=20path=20is:=20=20%s",=20myprogname,=20exec_path);=0A=20= =0A=20=09return=20exec_path;=0A=20}=0Adiff=20--git=20= a/src/bin/pg_dump/connectdb.c=20b/src/bin/pg_dump/connectdb.c=0Aindex=20= f3ce8b1cfb1..f2833fb9b25=20100644=0A---=20a/src/bin/pg_dump/connectdb.c=0A= +++=20b/src/bin/pg_dump/connectdb.c=0A@@=20-39,7=20+39,7=20@@=20static=20= char=20*constructConnStr(const=20char=20**keywords,=20const=20char=20= **values);=0A=20PGconn=20*=0A=20ConnectDatabase(const=20char=20*dbname,=20= const=20char=20*connection_string,=0A=20=09=09=09=09const=20char=20= *pghost,=20const=20char=20*pgport,=20const=20char=20*pguser,=0A-=09=09=09= =09trivalue=20prompt_password,=20bool=20fail_on_error,=20const=20char=20= *progname,=0A+=09=09=09=09trivalue=20prompt_password,=20bool=20= fail_on_error,=20const=20char=20*myprogname,=0A=20=09=09=09=09const=20= char=20**connstr,=20int=20*server_version,=20char=20*password,=0A=20=09=09= =09=09char=20*override_dbname)=0A=20{=0A@@=20-221,7=20+221,7=20@@=20= ConnectDatabase(const=20char=20*dbname,=20const=20char=20= *connection_string,=0A=20=09{=0A=20=09=09pg_log_error("aborting=20= because=20of=20server=20version=20mismatch");=0A=20=09=09= pg_log_error_detail("server=20version:=20%s;=20%s=20version:=20%s",=0A-=09= =09=09=09=09=09=09remoteversion_str,=20progname,=20PG_VERSION);=0A+=09=09= =09=09=09=09=09remoteversion_str,=20myprogname,=20PG_VERSION);=0A=20=09=09= exit_nicely(1);=0A=20=09}=0A=20=0Adiff=20--git=20= a/src/bin/pg_dump/pg_dump.c=20b/src/bin/pg_dump/pg_dump.c=0Aindex=20= 1ca03d6b278..4c892b9fcc4=20100644=0A---=20a/src/bin/pg_dump/pg_dump.c=0A= +++=20b/src/bin/pg_dump/pg_dump.c=0A@@=20-1288,11=20+1288,11=20@@=20= main(int=20argc,=20char=20**argv)=0A=20=0A=20=0A=20static=20void=0A= -help(const=20char=20*progname)=0A+help(const=20char=20*myprogname)=0A=20= {=0A-=09printf(_("%s=20exports=20a=20PostgreSQL=20database=20as=20an=20= SQL=20script=20or=20to=20other=20formats.\n\n"),=20progname);=0A+=09= printf(_("%s=20exports=20a=20PostgreSQL=20database=20as=20an=20SQL=20= script=20or=20to=20other=20formats.\n\n"),=20myprogname);=0A=20=09= printf(_("Usage:\n"));=0A-=09printf(_("=20=20%s=20[OPTION]...=20= [DBNAME]\n"),=20progname);=0A+=09printf(_("=20=20%s=20[OPTION]...=20= [DBNAME]\n"),=20myprogname);=0A=20=0A=20=09printf(_("\nGeneral=20= options:\n"));=0A=20=09printf(_("=20=20-f,=20--file=3DFILENAME=20=20=20=20= =20=20=20=20=20=20output=20file=20or=20directory=20name\n"));=0A@@=20= -1647,7=20+1647,7=20@@=20static=20void=0A=20= expand_schema_name_patterns(Archive=20*fout,=0A=20=09=09=09=09=09=09=09= SimpleStringList=20*patterns,=0A=20=09=09=09=09=09=09=09SimpleOidList=20= *oids,=0A-=09=09=09=09=09=09=09bool=20strict_names)=0A+=09=09=09=09=09=09= =09bool=20strict)=0A=20{=0A=20=09PQExpBuffer=20query;=0A=20=09PGresult=20= =20=20*res;=0A@@=20-1683,7=20+1683,7=20@@=20= expand_schema_name_patterns(Archive=20*fout,=0A=20=09=09= termPQExpBuffer(&dbbuf);=0A=20=0A=20=09=09res=20=3D=20= ExecuteSqlQuery(fout,=20query->data,=20PGRES_TUPLES_OK);=0A-=09=09if=20= (strict_names=20&&=20PQntuples(res)=20=3D=3D=200)=0A+=09=09if=20(strict=20= &&=20PQntuples(res)=20=3D=3D=200)=0A=20=09=09=09pg_fatal("no=20matching=20= schemas=20were=20found=20for=20pattern=20\"%s\"",=20cell->val);=0A=20=0A=20= =09=09for=20(i=20=3D=200;=20i=20<=20PQntuples(res);=20i++)=0A@@=20= -1706,7=20+1706,7=20@@=20static=20void=0A=20= expand_extension_name_patterns(Archive=20*fout,=0A=20=09=09=09=09=09=09=09= =20=20=20SimpleStringList=20*patterns,=0A=20=09=09=09=09=09=09=09=20=20=20= SimpleOidList=20*oids,=0A-=09=09=09=09=09=09=09=20=20=20bool=20= strict_names)=0A+=09=09=09=09=09=09=09=20=20=20bool=20strict)=0A=20{=0A=20= =09PQExpBuffer=20query;=0A=20=09PGresult=20=20=20*res;=0A@@=20-1736,7=20= +1736,7=20@@=20expand_extension_name_patterns(Archive=20*fout,=0A=20=09=09= =09=09=09=20cell->val);=0A=20=0A=20=09=09res=20=3D=20= ExecuteSqlQuery(fout,=20query->data,=20PGRES_TUPLES_OK);=0A-=09=09if=20= (strict_names=20&&=20PQntuples(res)=20=3D=3D=200)=0A+=09=09if=20(strict=20= &&=20PQntuples(res)=20=3D=3D=200)=0A=20=09=09=09pg_fatal("no=20matching=20= extensions=20were=20found=20for=20pattern=20\"%s\"",=20cell->val);=0A=20=0A= =20=09=09for=20(i=20=3D=200;=20i=20<=20PQntuples(res);=20i++)=0A@@=20= -1810,7=20+1810,7=20@@=20expand_foreign_server_name_patterns(Archive=20= *fout,=0A=20static=20void=0A=20expand_table_name_patterns(Archive=20= *fout,=0A=20=09=09=09=09=09=09=20=20=20SimpleStringList=20*patterns,=20= SimpleOidList=20*oids,=0A-=09=09=09=09=09=09=20=20=20bool=20= strict_names,=20bool=20with_child_tables)=0A+=09=09=09=09=09=09=20=20=20= bool=20strict,=20bool=20with_child_tables)=0A=20{=0A=20=09PQExpBuffer=20= query;=0A=20=09PGresult=20=20=20*res;=0A@@=20-1882,7=20+1882,7=20@@=20= expand_table_name_patterns(Archive=20*fout,=0A=20=09=09res=20=3D=20= ExecuteSqlQuery(fout,=20query->data,=20PGRES_TUPLES_OK);=0A=20=09=09= PQclear(ExecuteSqlQueryForSingleRow(fout,=0A=20=09=09=09=09=09=09=09=09=09= =09=09ALWAYS_SECURE_SEARCH_PATH_SQL));=0A-=09=09if=20(strict_names=20&&=20= PQntuples(res)=20=3D=3D=200)=0A+=09=09if=20(strict=20&&=20PQntuples(res)=20= =3D=3D=200)=0A=20=09=09=09pg_fatal("no=20matching=20tables=20were=20= found=20for=20pattern=20\"%s\"",=20cell->val);=0A=20=0A=20=09=09for=20(i=20= =3D=200;=20i=20<=20PQntuples(res);=20i++)=0A@@=20-11002,8=20+11002,8=20= @@=20dumpCommentExtended(Archive=20*fout,=20const=20char=20*type,=0A=20=09= =09=09=09=09const=20char=20*initdb_comment)=0A=20{=0A=20=09DumpOptions=20= *dopt=20=3D=20fout->dopt;=0A-=09CommentItem=20*comments;=0A-=09int=09=09=09= ncomments;=0A+=09CommentItem=20*comment_items;=0A+=09int=09=09=09= n_comment_items;=0A=20=0A=20=09/*=20do=20nothing,=20if=20--no-comments=20= is=20supplied=20*/=0A=20=09if=20(dopt->no_comments)=0A@@=20-11023,16=20= +11023,16=20@@=20dumpCommentExtended(Archive=20*fout,=20const=20char=20= *type,=0A=20=09}=0A=20=0A=20=09/*=20Search=20for=20comments=20associated=20= with=20catalogId,=20using=20table=20*/=0A-=09ncomments=20=3D=20= findComments(catalogId.tableoid,=20catalogId.oid,=0A-=09=09=09=09=09=09=09= =20&comments);=0A+=09n_comment_items=20=3D=20= findComments(catalogId.tableoid,=20catalogId.oid,=0A+=09=09=09=09=09=09=09= =09=20=20=20&comment_items);=0A=20=0A=20=09/*=20Is=20there=20one=20= matching=20the=20subid?=20*/=0A-=09while=20(ncomments=20>=200)=0A+=09= while=20(n_comment_items=20>=200)=0A=20=09{=0A-=09=09if=20= (comments->objsubid=20=3D=3D=20subid)=0A+=09=09if=20= (comment_items->objsubid=20=3D=3D=20subid)=0A=20=09=09=09break;=0A-=09=09= comments++;=0A-=09=09ncomments--;=0A+=09=09comment_items++;=0A+=09=09= n_comment_items--;=0A=20=09}=0A=20=0A=20=09if=20(initdb_comment=20!=3D=20= NULL)=0A@@=20-11045,17=20+11045,17=20@@=20dumpCommentExtended(Archive=20= *fout,=20const=20char=20*type,=0A=20=09=09=20*=20non-superuser=20use=20= of=20pg_dump.=20=20When=20the=20DBA=20has=20removed=20initdb's=0A=20=09=09= =20*=20comment,=20replicate=20that.=0A=20=09=09=20*/=0A-=09=09if=20= (ncomments=20=3D=3D=200)=0A+=09=09if=20(n_comment_items=20=3D=3D=200)=0A=20= =09=09{=0A-=09=09=09comments=20=3D=20&empty_comment;=0A-=09=09=09= ncomments=20=3D=201;=0A+=09=09=09comment_items=20=3D=20&empty_comment;=0A= +=09=09=09n_comment_items=20=3D=201;=0A=20=09=09}=0A-=09=09else=20if=20= (strcmp(comments->descr,=20initdb_comment)=20=3D=3D=200)=0A-=09=09=09= ncomments=20=3D=200;=0A+=09=09else=20if=20(strcmp(comment_items->descr,=20= initdb_comment)=20=3D=3D=200)=0A+=09=09=09n_comment_items=20=3D=200;=0A=20= =09}=0A=20=0A=20=09/*=20If=20a=20comment=20exists,=20build=20COMMENT=20= ON=20statement=20*/=0A-=09if=20(ncomments=20>=200)=0A+=09if=20= (n_comment_items=20>=200)=0A=20=09{=0A=20=09=09PQExpBuffer=20query=20=3D=20= createPQExpBuffer();=0A=20=09=09PQExpBuffer=20tag=20=3D=20= createPQExpBuffer();=0A@@=20-11064,7=20+11064,7=20@@=20= dumpCommentExtended(Archive=20*fout,=20const=20char=20*type,=0A=20=09=09= if=20(namespace=20&&=20*namespace)=0A=20=09=09=09= appendPQExpBuffer(query,=20"%s.",=20fmtId(namespace));=0A=20=09=09= appendPQExpBuffer(query,=20"%s=20IS=20",=20name);=0A-=09=09= appendStringLiteralAH(query,=20comments->descr,=20fout);=0A+=09=09= appendStringLiteralAH(query,=20comment_items->descr,=20fout);=0A=20=09=09= appendPQExpBufferStr(query,=20";\n");=0A=20=0A=20=09=09= appendPQExpBuffer(tag,=20"%s=20%s",=20type,=20name);=0A@@=20-11560,8=20= +11560,8=20@@=20dumpTableComment(Archive=20*fout,=20const=20TableInfo=20= *tbinfo,=0A=20=09=09=09=09=20const=20char=20*reltypename)=0A=20{=0A=20=09= DumpOptions=20*dopt=20=3D=20fout->dopt;=0A-=09CommentItem=20*comments;=0A= -=09int=09=09=09ncomments;=0A+=09CommentItem=20*comment_items;=0A+=09int=09= =09=09n_comment_items;=0A=20=09PQExpBuffer=20query;=0A=20=09PQExpBuffer=20= tag;=0A=20=0A@@=20-11574,21=20+11574,21=20@@=20dumpTableComment(Archive=20= *fout,=20const=20TableInfo=20*tbinfo,=0A=20=09=09return;=0A=20=0A=20=09= /*=20Search=20for=20comments=20associated=20with=20relation,=20using=20= table=20*/=0A-=09ncomments=20=3D=20= findComments(tbinfo->dobj.catId.tableoid,=0A-=09=09=09=09=09=09=09=20= tbinfo->dobj.catId.oid,=0A-=09=09=09=09=09=09=09=20&comments);=0A+=09= n_comment_items=20=3D=20findComments(tbinfo->dobj.catId.tableoid,=0A+=09=09= =09=09=09=09=09=09=20=20=20tbinfo->dobj.catId.oid,=0A+=09=09=09=09=09=09=09= =09=20=20=20&comment_items);=0A=20=0A=20=09/*=20If=20comments=20exist,=20= build=20COMMENT=20ON=20statements=20*/=0A-=09if=20(ncomments=20<=3D=200)=0A= +=09if=20(n_comment_items=20<=3D=200)=0A=20=09=09return;=0A=20=0A=20=09= query=20=3D=20createPQExpBuffer();=0A=20=09tag=20=3D=20= createPQExpBuffer();=0A=20=0A-=09while=20(ncomments=20>=200)=0A+=09while=20= (n_comment_items=20>=200)=0A=20=09{=0A-=09=09const=20char=20*descr=20=3D=20= comments->descr;=0A-=09=09int=09=09=09objsubid=20=3D=20= comments->objsubid;=0A+=09=09const=20char=20*descr=20=3D=20= comment_items->descr;=0A+=09=09int=09=09=09objsubid=20=3D=20= comment_items->objsubid;=0A=20=0A=20=09=09if=20(objsubid=20=3D=3D=200)=0A= =20=09=09{=0A@@=20-11638,8=20+11638,8=20@@=20dumpTableComment(Archive=20= *fout,=20const=20TableInfo=20*tbinfo,=0A=20=09=09=09=09=09=09=09=09=09=20= =20.nDeps=20=3D=201));=0A=20=09=09}=0A=20=0A-=09=09comments++;=0A-=09=09= ncomments--;=0A+=09=09comment_items++;=0A+=09=09n_comment_items--;=0A=20=09= }=0A=20=0A=20=09destroyPQExpBuffer(query);=0A@@=20-13289,8=20+13289,8=20= @@=20static=20void=0A=20dumpCompositeTypeColComments(Archive=20*fout,=20= const=20TypeInfo=20*tyinfo,=0A=20=09=09=09=09=09=09=09=20PGresult=20= *res)=0A=20{=0A-=09CommentItem=20*comments;=0A-=09int=09=09=09ncomments;=0A= +=09CommentItem=20*comment_items;=0A+=09int=09=09=09n_comment_items;=0A=20= =09PQExpBuffer=20query;=0A=20=09PQExpBuffer=20target;=0A=20=09int=09=09=09= i;=0A@@=20-13304,11=20+13304,11=20@@=20= dumpCompositeTypeColComments(Archive=20*fout,=20const=20TypeInfo=20= *tyinfo,=0A=20=09=09return;=0A=20=0A=20=09/*=20Search=20for=20comments=20= associated=20with=20type's=20pg_class=20OID=20*/=0A-=09ncomments=20=3D=20= findComments(RelationRelationId,=20tyinfo->typrelid,=0A-=09=09=09=09=09=09= =09=20&comments);=0A+=09n_comment_items=20=3D=20= findComments(RelationRelationId,=20tyinfo->typrelid,=0A+=09=09=09=09=09=09= =09=09=20=20=20&comment_items);=0A=20=0A=20=09/*=20If=20no=20comments=20= exist,=20we're=20done=20*/=0A-=09if=20(ncomments=20<=3D=200)=0A+=09if=20= (n_comment_items=20<=3D=200)=0A=20=09=09return;=0A=20=0A=20=09/*=20Build=20= COMMENT=20ON=20statements=20*/=0A@@=20-13319,14=20+13319,14=20@@=20= dumpCompositeTypeColComments(Archive=20*fout,=20const=20TypeInfo=20= *tyinfo,=0A=20=09i_attnum=20=3D=20PQfnumber(res,=20"attnum");=0A=20=09= i_attname=20=3D=20PQfnumber(res,=20"attname");=0A=20=09i_attisdropped=20= =3D=20PQfnumber(res,=20"attisdropped");=0A-=09while=20(ncomments=20>=20= 0)=0A+=09while=20(n_comment_items=20>=200)=0A=20=09{=0A=20=09=09const=20= char=20*attname;=0A=20=0A=20=09=09attname=20=3D=20NULL;=0A=20=09=09for=20= (i=20=3D=200;=20i=20<=20ntups;=20i++)=0A=20=09=09{=0A-=09=09=09if=20= (atoi(PQgetvalue(res,=20i,=20i_attnum))=20=3D=3D=20comments->objsubid=20= &&=0A+=09=09=09if=20(atoi(PQgetvalue(res,=20i,=20i_attnum))=20=3D=3D=20= comment_items->objsubid=20&&=0A=20=09=09=09=09PQgetvalue(res,=20i,=20= i_attisdropped)[0]=20!=3D=20't')=0A=20=09=09=09{=0A=20=09=09=09=09= attname=20=3D=20PQgetvalue(res,=20i,=20i_attname);=0A@@=20-13335,7=20= +13335,7=20@@=20dumpCompositeTypeColComments(Archive=20*fout,=20const=20= TypeInfo=20*tyinfo,=0A=20=09=09}=0A=20=09=09if=20(attname)=09=09=09/*=20= just=20in=20case=20we=20don't=20find=20it=20*/=0A=20=09=09{=0A-=09=09=09= const=20char=20*descr=20=3D=20comments->descr;=0A+=09=09=09const=20char=20= *descr=20=3D=20comment_items->descr;=0A=20=0A=20=09=09=09= resetPQExpBuffer(target);=0A=20=09=09=09appendPQExpBuffer(target,=20= "COLUMN=20%s.",=0A@@=20-13360,8=20+13360,8=20@@=20= dumpCompositeTypeColComments(Archive=20*fout,=20const=20TypeInfo=20= *tyinfo,=0A=20=09=09=09=09=09=09=09=09=09=20=20.nDeps=20=3D=201));=0A=20=09= =09}=0A=20=0A-=09=09comments++;=0A-=09=09ncomments--;=0A+=09=09= comment_items++;=0A+=09=09n_comment_items--;=0A=20=09}=0A=20=0A=20=09= destroyPQExpBuffer(query);=0Adiff=20--git=20= a/src/bin/pg_dump/pg_restore.c=20b/src/bin/pg_dump/pg_restore.c=0Aindex=20= f016b336308..327ce8053b0=20100644=0A---=20a/src/bin/pg_dump/pg_restore.c=0A= +++=20b/src/bin/pg_dump/pg_restore.c=0A@@=20-743,11=20+743,11=20@@=20= restore_one_database(const=20char=20*inputFileSpec,=20RestoreOptions=20= *opts,=0A=20}=0A=20=0A=20static=20void=0A-usage(const=20char=20= *progname)=0A+usage(const=20char=20*myprogname)=0A=20{=0A=20=09= printf(_("%s=20restores=20PostgreSQL=20databases=20from=20archives=20= created=20by=20pg_dump=20or=20pg_dumpall.\n\n"),=20progname);=0A=20=09= printf(_("Usage:\n"));=0A-=09printf(_("=20=20%s=20[OPTION]...=20= [FILE]\n"),=20progname);=0A+=09printf(_("=20=20%s=20[OPTION]...=20= [FILE]\n"),=20myprogname);=0A=20=0A=20=09printf(_("\nGeneral=20= options:\n"));=0A=20=09printf(_("=20=20-d,=20--dbname=3DNAME=20=20=20=20=20= =20=20=20connect=20to=20database=20name\n"));=0Adiff=20--git=20= a/src/bin/pg_rewind/pg_rewind.c=20b/src/bin/pg_rewind/pg_rewind.c=0A= index=209d745d4b25b..c3bdec41526=20100644=0A---=20= a/src/bin/pg_rewind/pg_rewind.c=0A+++=20b/src/bin/pg_rewind/pg_rewind.c=0A= @@=20-89,9=20+89,9=20@@=20static=20PGconn=20*conn;=0A=20static=20= rewind_source=20*source;=0A=20=0A=20static=20void=0A-usage(const=20char=20= *progname)=0A+usage(const=20char=20*myprogname)=0A=20{=0A-=09= printf(_("%s=20resynchronizes=20a=20PostgreSQL=20cluster=20with=20= another=20copy=20of=20the=20cluster.\n\n"),=20progname);=0A+=09= printf(_("%s=20resynchronizes=20a=20PostgreSQL=20cluster=20with=20= another=20copy=20of=20the=20cluster.\n\n"),=20myprogname);=0A=20=09= printf(_("Usage:\n=20=20%s=20[OPTION]...\n\n"),=20progname);=0A=20=09= printf(_("Options:\n"));=0A=20=09printf(_("=20=20-c,=20= --restore-target-wal=20=20=20=20=20=20=20use=20\"restore_command\"=20in=20= target=20configuration=20to\n"=0A@@=20-561,7=20+561,7=20@@=20main(int=20= argc,=20char=20**argv)=0A=20=20*=20target=20and=20the=20source.=0A=20=20= */=0A=20static=20void=0A-perform_rewind(filemap_t=20*filemap,=20= rewind_source=20*source,=0A+perform_rewind(filemap_t=20*filemap,=20= rewind_source=20*rewindsource,=0A=20=09=09=09=20=20=20XLogRecPtr=20= chkptrec,=0A=20=09=09=09=20=20=20TimeLineID=20chkpttli,=0A=20=09=09=09=20= =20=20XLogRecPtr=20chkptredo)=0A@@=20-595,7=20+595,7=20@@=20= perform_rewind(filemap_t=20*filemap,=20rewind_source=20*source,=0A=20=09=09= =09while=20(datapagemap_next(iter,=20&blkno))=0A=20=09=09=09{=0A=20=09=09= =09=09offset=20=3D=20blkno=20*=20BLCKSZ;=0A-=09=09=09=09= source->queue_fetch_range(source,=20entry->path,=20offset,=20BLCKSZ);=0A= +=09=09=09=09rewindsource->queue_fetch_range(rewindsource,=20= entry->path,=20offset,=20BLCKSZ);=0A=20=09=09=09}=0A=20=09=09=09= pg_free(iter);=0A=20=09=09}=0A@@=20-607,7=20+607,7=20@@=20= perform_rewind(filemap_t=20*filemap,=20rewind_source=20*source,=0A=20=09=09= =09=09break;=0A=20=0A=20=09=09=09case=20FILE_ACTION_COPY:=0A-=09=09=09=09= source->queue_fetch_file(source,=20entry->path,=20entry->source_size);=0A= +=09=09=09=09rewindsource->queue_fetch_file(rewindsource,=20entry->path,=20= entry->source_size);=0A=20=09=09=09=09break;=0A=20=0A=20=09=09=09case=20= FILE_ACTION_TRUNCATE:=0A@@=20-615,9=20+615,9=20@@=20= perform_rewind(filemap_t=20*filemap,=20rewind_source=20*source,=0A=20=09=09= =09=09break;=0A=20=0A=20=09=09=09case=20FILE_ACTION_COPY_TAIL:=0A-=09=09=09= =09source->queue_fetch_range(source,=20entry->path,=0A-=09=09=09=09=09=09= =09=09=09=09=20=20entry->target_size,=0A-=09=09=09=09=09=09=09=09=09=09=20= =20entry->source_size=20-=20entry->target_size);=0A+=09=09=09=09= rewindsource->queue_fetch_range(rewindsource,=20entry->path,=0A+=09=09=09= =09=09=09=09=09=09=09=09=09entry->target_size,=0A+=09=09=09=09=09=09=09=09= =09=09=09=09entry->source_size=20-=20entry->target_size);=0A=20=09=09=09=09= break;=0A=20=0A=20=09=09=09case=20FILE_ACTION_REMOVE:=0A@@=20-635,7=20= +635,7=20@@=20perform_rewind(filemap_t=20*filemap,=20rewind_source=20= *source,=0A=20=09}=0A=20=0A=20=09/*=20Complete=20any=20remaining=20= range-fetches=20that=20we=20queued=20up=20above.=20*/=0A-=09= source->finish_fetch(source);=0A+=09= rewindsource->finish_fetch(rewindsource);=0A=20=0A=20=09= close_target_file();=0A=20=0A@@=20-645,7=20+645,7=20@@=20= perform_rewind(filemap_t=20*filemap,=20rewind_source=20*source,=0A=20=09=20= *=20Fetch=20the=20control=20file=20from=20the=20source=20last.=20This=20= ensures=20that=20the=0A=20=09=20*=20minRecoveryPoint=20is=20up-to-date.=0A= =20=09=20*/=0A-=09buffer=20=3D=20source->fetch_file(source,=20= XLOG_CONTROL_FILE,=20&size);=0A+=09buffer=20=3D=20= rewindsource->fetch_file(rewindsource,=20XLOG_CONTROL_FILE,=20&size);=0A=20= =09digestControlFile(&ControlFile_source_after,=20buffer,=20size);=0A=20=09= pg_free(buffer);=0A=20=0A@@=20-717,7=20+717,7=20@@=20= perform_rewind(filemap_t=20*filemap,=20rewind_source=20*source,=0A=20=09=09= =09if=20(ControlFile_source_after.state=20!=3D=20DB_IN_PRODUCTION)=0A=20=09= =09=09=09pg_fatal("source=20system=20was=20in=20unexpected=20state=20at=20= end=20of=20rewind");=0A=20=0A-=09=09=09endrec=20=3D=20= source->get_current_wal_insert_lsn(source);=0A+=09=09=09endrec=20=3D=20= rewindsource->get_current_wal_insert_lsn(rewindsource);=0A=20=09=09=09= endtli=20=3D=20= Max(ControlFile_source_after.checkPointCopy.ThisTimeLineID,=0A=20=09=09=09= =09=09=09=20ControlFile_source_after.minRecoveryPointTLI);=0A=20=09=09}=0A= diff=20--git=20a/src/interfaces/ecpg/preproc/ecpg.c=20= b/src/interfaces/ecpg/preproc/ecpg.c=0Aindex=201db55be473f..77b3599e1d6=20= 100644=0A---=20a/src/interfaces/ecpg/preproc/ecpg.c=0A+++=20= b/src/interfaces/ecpg/preproc/ecpg.c=0A@@=20-32,13=20+32,13=20@@=20= struct=20_defines=20*defines=20=3D=20NULL;=0A=20struct=20declared_list=20= *g_declared_list=20=3D=20NULL;=0A=20=0A=20static=20void=0A-help(const=20= char=20*progname)=0A+help(const=20char=20*myprogname)=0A=20{=0A=20=09= printf(_("%s=20is=20the=20PostgreSQL=20embedded=20SQL=20preprocessor=20= for=20C=20programs.\n\n"),=0A-=09=09=20=20=20progname);=0A+=09=09=20=20=20= myprogname);=0A=20=09printf(_("Usage:\n"=0A=20=09=09=09=20"=20=20%s=20= [OPTION]...=20FILE...\n\n"),=0A-=09=09=20=20=20progname);=0A+=09=09=20=20= =20myprogname);=0A=20=09printf(_("Options:\n"));=0A=20=09printf(_("=20=20= -c=20=20=20=20=20=20=20=20=20=20=20=20=20automatically=20generate=20C=20= code=20from=20embedded=20SQL=20code;\n"=0A=20=09=09=09=20"=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20this=20affects=20EXEC=20SQL=20= TYPE\n"));=0A--=20=0A2.50.1=20(Apple=20Git-155)=0A=0A= --Apple-Mail=_B830DCCB-64C7-4AD6-938E-E4A843BDEE74 Content-Disposition: attachment; filename=v8-0012-WIP-xlogrecovery-consolidate-file-local-mutable-s.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="v8-0012-WIP-xlogrecovery-consolidate-file-local-mutable-s.patch" Content-Transfer-Encoding: quoted-printable =46rom=201e6a069f444280afed133b532449125be7cb2008=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20"Chao=20Li=20(Evan)"=20=0A= Date:=20Wed,=204=20Mar=202026=2012:42:12=20+0800=0ASubject:=20[PATCH=20= v8=2012/12]=20WIP:=20xlogrecovery:=20consolidate=20file-local=20mutable=0A= =20state=0A=0A---=0A=20src/backend/access/transam/xlogrecovery.c=20|=20= 390=20++++++++++++++--------=0A=201=20file=20changed,=20253=20= insertions(+),=20137=20deletions(-)=0A=0Adiff=20--git=20= a/src/backend/access/transam/xlogrecovery.c=20= b/src/backend/access/transam/xlogrecovery.c=0Aindex=20= c236e2b7969..f17d6558b90=20100644=0A---=20= a/src/backend/access/transam/xlogrecovery.c=0A+++=20= b/src/backend/access/transam/xlogrecovery.c=0A@@=20-107,25=20+107,10=20= @@=20bool=09=09wal_receiver_create_temp_slot=20=3D=20false;=0A=20=20*=20= recoveryTargetTLIRequested:=20numeric=20value=20of=20requested=20= timeline,=20if=20constant=0A=20=20*=0A=20=20*=20recoveryTargetTLI:=20the=20= currently=20understood=20target=20timeline;=20changes=0A-=20*=0A-=20*=20= expectedTLEs:=20a=20list=20of=20TimeLineHistoryEntries=20for=20= recoveryTargetTLI=20and=0A-=20*=20the=20timelines=20of=20its=20known=20= parents,=20newest=20first=20(so=20recoveryTargetTLI=20is=0A-=20*=20= always=20the=20first=20list=20member).=20=20Only=20these=20TLIs=20are=20= expected=20to=20be=20seen=20in=0A-=20*=20the=20WAL=20segments=20we=20= read,=20and=20indeed=20only=20these=20TLIs=20will=20be=20considered=20as=0A= -=20*=20candidate=20WAL=20files=20to=20open=20at=20all.=0A-=20*=0A-=20*=20= curFileTLI:=20the=20TLI=20appearing=20in=20the=20name=20of=20the=20= current=20input=20WAL=20file.=0A-=20*=20(This=20is=20not=20necessarily=20= the=20same=20as=20the=20timeline=20from=20which=20we=20are=0A-=20*=20= replaying=20WAL,=20which=20StartupXLOG=20calls=20replayTLI,=20because=20= we=20could=20be=0A-=20*=20scanning=20data=20that=20was=20copied=20from=20= an=20ancestor=20timeline=20when=20the=20current=0A-=20*=20file=20was=20= created.)=20=20During=20a=20sequential=20scan=20we=20do=20not=20allow=20= this=20value=0A-=20*=20to=20decrease.=0A=20=20*/=0A=20= RecoveryTargetTimeLineGoal=20recoveryTargetTimeLineGoal=20=3D=20= RECOVERY_TARGET_TIMELINE_LATEST;=0A=20TimeLineID=09= recoveryTargetTLIRequested=20=3D=200;=0A=20TimeLineID=09= recoveryTargetTLI=20=3D=200;=0A-static=20List=20*expectedTLEs;=0A-static=20= TimeLineID=20curFileTLI;=0A=20=0A=20/*=0A=20=20*=20When=20= ArchiveRecoveryRequested=20is=20set,=20archive=20recovery=20was=20= requested,=0A@@=20-147,53=20+132,12=20@@=20bool=09=09InArchiveRecovery=20= =3D=20false;=0A=20=20*=20in=20standby=20mode.=20=20These=20variables=20= are=20only=20valid=20in=20the=20startup=20process.=0A=20=20*=20They=20= work=20similarly=20to=20ArchiveRecoveryRequested=20and=20= InArchiveRecovery.=0A=20=20*/=0A-static=20bool=20StandbyModeRequested=20= =3D=20false;=0A=20bool=09=09StandbyMode=20=3D=20false;=0A=20=0A=20/*=20= was=20a=20signal=20file=20present=20at=20startup?=20*/=0A=20static=20= bool=20standby_signal_file_found=20=3D=20false;=0A=20static=20bool=20= recovery_signal_file_found=20=3D=20false;=0A=20=0A-/*=0A-=20*=20= CheckPointLoc=20is=20the=20position=20of=20the=20checkpoint=20record=20= that=20determines=0A-=20*=20where=20to=20start=20the=20replay.=20=20It=20= comes=20from=20the=20backup=20label=20file=20or=20the=0A-=20*=20control=20= file.=0A-=20*=0A-=20*=20RedoStartLSN=20is=20the=20checkpoint's=20REDO=20= location,=20also=20from=20the=20backup=20label=0A-=20*=20file=20or=20the=20= control=20file.=20=20In=20standby=20mode,=20XLOG=20streaming=20usually=20= starts=0A-=20*=20from=20the=20position=20where=20an=20invalid=20record=20= was=20found.=20=20But=20if=20we=20fail=20to=0A-=20*=20read=20even=20the=20= initial=20checkpoint=20record,=20we=20use=20the=20REDO=20location=20= instead=0A-=20*=20of=20the=20checkpoint=20location=20as=20the=20start=20= position=20of=20XLOG=20streaming.=0A-=20*=20Otherwise=20we=20would=20= have=20to=20jump=20backwards=20to=20the=20REDO=20location=20after=0A-=20= *=20reading=20the=20checkpoint=20record,=20because=20the=20REDO=20record=20= can=20precede=20the=0A-=20*=20checkpoint=20record.=0A-=20*/=0A-static=20= XLogRecPtr=20CheckPointLoc=20=3D=20InvalidXLogRecPtr;=0A-static=20= TimeLineID=20CheckPointTLI=20=3D=200;=0A-static=20XLogRecPtr=20= RedoStartLSN=20=3D=20InvalidXLogRecPtr;=0A-static=20TimeLineID=20= RedoStartTLI=20=3D=200;=0A-=0A-/*=0A-=20*=20Local=20copy=20of=20= SharedHotStandbyActive=20variable.=20False=20actually=20means=20"not=0A-=20= *=20known,=20need=20to=20check=20the=20shared=20state".=0A-=20*/=0A= -static=20bool=20LocalHotStandbyActive=20=3D=20false;=0A-=0A-/*=0A-=20*=20= Local=20copy=20of=20SharedPromoteIsTriggered=20variable.=20False=20= actually=20means=20"not=0A-=20*=20known,=20need=20to=20check=20the=20= shared=20state".=0A-=20*/=0A-static=20bool=20LocalPromoteIsTriggered=20=3D= =20false;=0A-=0A-/*=20Has=20the=20recovery=20code=20requested=20a=20= walreceiver=20wakeup?=20*/=0A-static=20bool=20doRequestWalReceiverReply;=0A= -=0A-/*=20XLogReader=20object=20used=20to=20parse=20the=20WAL=20records=20= */=0A-static=20XLogReaderState=20*xlogreader=20=3D=20NULL;=0A-=0A-/*=20= XLogPrefetcher=20object=20used=20to=20consume=20WAL=20records=20with=20= read-ahead=20*/=0A-static=20XLogPrefetcher=20*xlogprefetcher=20=3D=20= NULL;=0A-=0A=20/*=20Parameters=20passed=20down=20from=20ReadRecord=20to=20= the=20XLogPageRead=20callback.=20*/=0A=20typedef=20struct=20= XLogPageReadPrivate=0A=20{=0A@@=20-203,9=20+147,6=20@@=20typedef=20= struct=20XLogPageReadPrivate=0A=20=09TimeLineID=09replayTLI;=0A=20}=20= XLogPageReadPrivate;=0A=20=0A-/*=20flag=20to=20tell=20XLogPageRead=20= that=20we=20have=20started=20replaying=20*/=0A-static=20bool=20InRedo=20= =3D=20false;=0A-=0A=20/*=0A=20=20*=20Codes=20indicating=20where=20we=20= got=20a=20WAL=20file=20from=20during=20recovery,=20or=20where=0A=20=20*=20= to=20attempt=20to=20get=20one.=0A@@=20-221,6=20+162,201=20@@=20typedef=20= enum=0A=20/*=20human-readable=20names=20for=20XLogSources,=20for=20= debugging=20output=20*/=0A=20static=20const=20char=20*const=20= xlogSourceNames[]=20=3D=20{"any",=20"archive",=20"pg_wal",=20"stream"};=0A= =20=0A+/*=0A+=20*=20Forward=20declaration=20for=20state=20field=20= holding=20shared-memory=20recovery=20control=0A+=20*=20pointer.=0A+=20*/=0A= +typedef=20struct=20XLogRecoveryCtlData=20XLogRecoveryCtlData;=0A+=0A+/*=0A= +=20*=20File-local=20mutable=20state=20for=20WAL=20recovery.=0A+=20*=0A+=20= *=20Keep=20state=20in=20a=20single=20object=20to=20avoid=20a=20broad=20= set=20of=20independent=20static=0A+=20*=20globals=20and=20make=20it=20= easier=20to=20evolve=20recovery=20internals.=0A+=20*/=0A+typedef=20= struct=20XLogRecoveryLocalState=0A+{=0A+=09/*=0A+=09=20*=20A=20list=20of=20= TimeLineHistoryEntries=20for=20recoveryTargetTLI=20and=20the=0A+=09=20*=20= timelines=20of=20its=20known=20parents,=20newest=20first=20(so=20= recoveryTargetTLI=20is=0A+=09=20*=20always=20the=20first=20list=20= member).=20=20Only=20these=20TLIs=20are=20expected=20to=20be=20seen=0A+=09= =20*=20in=20the=20WAL=20segments=20we=20read,=20and=20indeed=20only=20= these=20TLIs=20will=20be=0A+=09=20*=20considered=20as=20candidate=20WAL=20= files=20to=20open=20at=20all.=0A+=09=20*/=0A+=09List=09=20=20=20= *expectedTLEs;=0A+=0A+=09/*=0A+=09=20*=20The=20TLI=20appearing=20in=20= the=20name=20of=20the=20current=20input=20WAL=20file.=20(This=20is=0A+=09= =20*=20not=20necessarily=20the=20same=20as=20the=20timeline=20from=20= which=20we=20are=20replaying=0A+=09=20*=20WAL,=20which=20StartupXLOG=20= calls=20replayTLI,=20because=20we=20could=20be=20scanning=0A+=09=20*=20= data=20that=20was=20copied=20from=20an=20ancestor=20timeline=20when=20= the=20current=20file=0A+=09=20*=20was=20created.)=20=20During=20a=20= sequential=20scan=20we=20do=20not=20allow=20this=20value=20to=0A+=09=20*=20= decrease.=0A+=09=20*/=0A+=09TimeLineID=09curFileTLI;=0A+=0A+=09/*=0A+=09=20= *=20When=20StandbyModeRequested=20is=20set,=20standby=20mode=20was=20= requested,=20i.e.=0A+=09=20*=20standby.signal=20file=20was=20present.=20= It=20is=20only=20valid=20in=20the=20startup=0A+=09=20*=20process.=0A+=09=20= */=0A+=09bool=09=09standbyModeRequested;=0A+=0A+=09/*=0A+=09=20*=20= CheckPointLoc=20is=20the=20position=20of=20the=20checkpoint=20record=20= that=20determines=0A+=09=20*=20where=20to=20start=20the=20replay.=20=20= It=20comes=20from=20the=20backup=20label=20file=20or=20the=0A+=09=20*=20= control=20file.=0A+=09=20*=0A+=09=20*=20RedoStartLSN=20is=20the=20= checkpoint's=20REDO=20location,=20also=20from=20the=20backup=0A+=09=20*=20= label=20file=20or=20the=20control=20file.=20=20In=20standby=20mode,=20= XLOG=20streaming=0A+=09=20*=20usually=20starts=20from=20the=20position=20= where=20an=20invalid=20record=20was=20found.=20But=0A+=09=20*=20if=20we=20= fail=20to=20read=20even=20the=20initial=20checkpoint=20record,=20we=20= use=20the=20REDO=0A+=09=20*=20location=20instead=20of=20the=20checkpoint=20= location=20as=20the=20start=20position=20of=0A+=09=20*=20XLOG=20= streaming.=20Otherwise=20we=20would=20have=20to=20jump=20backwards=20to=20= the=20REDO=0A+=09=20*=20location=20after=20reading=20the=20checkpoint=20= record,=20because=20the=20REDO=20record=0A+=09=20*=20can=20precede=20the=20= checkpoint=20record.=0A+=09=20*/=0A+=09XLogRecPtr=09checkPointLoc;=0A+=09= TimeLineID=09checkPointTLI;=0A+=09XLogRecPtr=09redoStartLSN;=0A+=09= TimeLineID=09redoStartTLI;=0A+=0A+=09/*=0A+=09=20*=20Local=20copy=20of=20= SharedHotStandbyActive=20variable.=20False=20actually=20means=0A+=09=20*=20= "not=20known,=20need=20to=20check=20the=20shared=20state".=0A+=09=20*/=0A= +=09bool=09=09localHotStandbyActive;=0A+=0A+=09/*=0A+=09=20*=20Local=20= copy=20of=20SharedPromoteIsTriggered=20variable.=20False=20actually=20= means=0A+=09=20*=20"not=20known,=20need=20to=20check=20the=20shared=20= state".=0A+=09=20*/=0A+=09bool=09=09localPromoteIsTriggered;=0A+=0A+=09= /*=20Has=20the=20recovery=20code=20requested=20a=20walreceiver=20wakeup?=20= */=0A+=09bool=09=09doRequestWalReceiverReply;=0A+=0A+=09/*=20XLogReader=20= object=20used=20to=20parse=20the=20WAL=20records=20*/=0A+=09= XLogReaderState=20*xlogReader;=0A+=0A+=09/*=20XLogPrefetcher=20object=20= used=20to=20consume=20WAL=20records=20with=20read-ahead=20*/=0A+=09= XLogPrefetcher=20*xlogPrefetcher;=0A+=0A+=09/*=20flag=20to=20tell=20= XLogPageRead=20that=20we=20have=20started=20replaying=20*/=0A+=09bool=09=09= inRedo;=0A+=0A+=09/*=0A+=09=20*=20readFile=20is=20-1=20or=20a=20kernel=20= FD=20for=20the=20log=20file=20segment=20that's=20currently=0A+=09=20*=20= open=20for=20reading.=20=20readSegNo=20identifies=20the=20segment.=20=20= readOff=20is=20the=0A+=09=20*=20offset=20of=20the=20page=20just=20read,=20= readLen=20indicates=20how=20much=20of=20it=20has=20been=0A+=09=20*=20= read=20into=20readBuf,=20and=20readSource=20indicates=20where=20we=20got=20= the=20currently=0A+=09=20*=20open=20file=20from.=0A+=09=20*=0A+=09=20*=20= Note:=20we=20could=20use=20Reserve/ReleaseExternalFD=20to=20track=20= consumption=20of=0A+=09=20*=20this=20FD=20too=20(like=20for=20= openLogFile=20in=20xlog.c);=20but=20it=20doesn't=20currently=0A+=09=20*=20= seem=20worthwhile,=20since=20the=20XLOG=20is=20not=20read=20by=20= general-purpose=0A+=09=20*=20sessions.=0A+=09=20*/=0A+=09int=09=09=09= readFile;=0A+=09XLogSegNo=09readSegNo;=0A+=09uint32=09=09readOff;=0A+=09= uint32=09=09readLen;=0A+=09XLogSource=09readSource;=0A+=0A+=09/*=0A+=09=20= *=20Keeps=20track=20of=20which=20source=20we're=20currently=20reading=20= from.=20This=20is=0A+=09=20*=20different=20from=20readSource=20in=20that=20= this=20is=20always=20set,=20even=20when=20we=0A+=09=20*=20don't=20= currently=20have=20a=20WAL=20file=20open.=20If=20lastSourceFailed=20is=20= set,=20our=0A+=09=20*=20last=20attempt=20to=20read=20from=20= currentSource=20failed,=20and=20we=20should=20try=0A+=09=20*=20another=20= source=20next.=0A+=09=20*=0A+=09=20*=20pendingWalRcvRestart=20is=20set=20= when=20a=20config=20change=20occurs=20that=20requires=20a=0A+=09=20*=20= walreceiver=20restart.=20=20This=20is=20only=20valid=20in=20= XLOG_FROM_STREAM=20state.=0A+=09=20*/=0A+=09XLogSource=09currentSource;=0A= +=09bool=09=09lastSourceFailed;=0A+=09bool=09=09pendingWalRcvRestart;=0A= +=0A+=09/*=0A+=09=20*=20These=20variables=20track=20when=20we=20last=20= obtained=20some=20WAL=20data=20to=20process,=0A+=09=20*=20and=20where=20= we=20got=20it=20from.=20=20(XLogReceiptSource=20is=20initially=20the=20= same=20as=0A+=09=20*=20readSource,=20but=20readSource=20gets=20reset=20= to=20zero=20when=20we=20don't=20have=20data=0A+=09=20*=20to=20process=20= right=20now.=20=20It=20is=20also=20different=20from=20currentSource,=20= which=0A+=09=20*=20also=20changes=20when=20we=20try=20to=20read=20from=20= a=20source=20and=20fail,=20while=0A+=09=20*=20XLogReceiptSource=20tracks=20= where=20we=20last=20successfully=20read=20some=20WAL.)=0A+=09=20*/=0A+=09= TimestampTz=20xlogReceiptTime;=0A+=09XLogSource=09xlogReceiptSource;=0A+=0A= +=09/*=20Local=20copy=20of=20WalRcv->flushedUpto=20*/=0A+=09XLogRecPtr=09= flushedUpto;=0A+=09TimeLineID=09receiveTLI;=0A+=0A+=09/*=20Copy=20of=20= backupEndRequired=20from=20the=20control=20file=20*/=0A+=09bool=09=09= backupEndRequired;=0A+=0A+=09/*=20Buffers=20dedicated=20to=20consistency=20= checks=20of=20size=20BLCKSZ=20*/=0A+=09char=09=20=20=20= *replayImageMasked;=0A+=09char=09=20=20=20*primaryImageMasked;=0A+=0A+=09= /*=0A+=09=20*=20if=20recoveryStopsBefore/After=20returns=20true,=20it=20= saves=20information=20of=20the=0A+=09=20*=20stop=20point=20here=0A+=09=20= */=0A+=09TransactionId=20recoveryStopXid;=0A+=09TimestampTz=20= recoveryStopTime;=0A+=09XLogRecPtr=09recoveryStopLSN;=0A+=09char=09=09= recoveryStopName[MAXFNAMELEN];=0A+=09bool=09=09recoveryStopAfter;=0A+}=09= =09=09XLogRecoveryLocalState;=0A+=0A+static=20XLogRecoveryLocalState=20= XLogRecoveryState=20=3D=0A+{=0A+=09.checkPointLoc=20=3D=20= InvalidXLogRecPtr,=0A+=09.redoStartLSN=20=3D=20InvalidXLogRecPtr,=0A+=09= .readFile=20=3D=20-1,=0A+=09.readSource=20=3D=20XLOG_FROM_ANY,=0A+=09= .currentSource=20=3D=20XLOG_FROM_ANY,=0A+=09.xlogReceiptSource=20=3D=20= XLOG_FROM_ANY,=0A+=09.flushedUpto=20=3D=20InvalidXLogRecPtr,=0A+=09= .xlogReader=20=3D=20NULL,=0A+=09.xlogPrefetcher=20=3D=20NULL=0A+};=0A+=0A= +#define=20expectedTLEs=20(XLogRecoveryState.expectedTLEs)=0A+#define=20= curFileTLI=20(XLogRecoveryState.curFileTLI)=0A+#define=20= StandbyModeRequested=20(XLogRecoveryState.standbyModeRequested)=0A= +#define=20CheckPointLoc=20(XLogRecoveryState.checkPointLoc)=0A+#define=20= CheckPointTLI=20(XLogRecoveryState.checkPointTLI)=0A+#define=20= RedoStartLSN=20(XLogRecoveryState.redoStartLSN)=0A+#define=20= RedoStartTLI=20(XLogRecoveryState.redoStartTLI)=0A+#define=20= LocalHotStandbyActive=20(XLogRecoveryState.localHotStandbyActive)=0A= +#define=20LocalPromoteIsTriggered=20= (XLogRecoveryState.localPromoteIsTriggered)=0A+#define=20= doRequestWalReceiverReply=20= (XLogRecoveryState.doRequestWalReceiverReply)=0A+#define=20InRedo=20= (XLogRecoveryState.inRedo)=0A+#define=20readFile=20= (XLogRecoveryState.readFile)=0A+#define=20readSegNo=20= (XLogRecoveryState.readSegNo)=0A+#define=20readOff=20= (XLogRecoveryState.readOff)=0A+#define=20readLen=20= (XLogRecoveryState.readLen)=0A+#define=20readSource=20= (XLogRecoveryState.readSource)=0A+#define=20currentSource=20= (XLogRecoveryState.currentSource)=0A+#define=20lastSourceFailed=20= (XLogRecoveryState.lastSourceFailed)=0A+#define=20pendingWalRcvRestart=20= (XLogRecoveryState.pendingWalRcvRestart)=0A+#define=20XLogReceiptTime=20= (XLogRecoveryState.xlogReceiptTime)=0A+#define=20XLogReceiptSource=20= (XLogRecoveryState.xlogReceiptSource)=0A+#define=20flushedUpto=20= (XLogRecoveryState.flushedUpto)=0A+#define=20receiveTLI=20= (XLogRecoveryState.receiveTLI)=0A+#define=20xlogreader=20= (XLogRecoveryState.xlogReader)=0A+#define=20xlogprefetcher=20= (XLogRecoveryState.xlogPrefetcher)=0A+#define=20BackupEndRequired=20= (XLogRecoveryState.backupEndRequired)=0A+#define=20replay_image_masked=20= (XLogRecoveryState.replayImageMasked)=0A+#define=20primary_image_masked=20= (XLogRecoveryState.primaryImageMasked)=0A+#define=20recoveryStopXid=20= (XLogRecoveryState.recoveryStopXid)=0A+#define=20recoveryStopTime=20= (XLogRecoveryState.recoveryStopTime)=0A+#define=20recoveryStopLSN=20= (XLogRecoveryState.recoveryStopLSN)=0A+#define=20recoveryStopName=20= (XLogRecoveryState.recoveryStopName)=0A+#define=20recoveryStopAfter=20= (XLogRecoveryState.recoveryStopAfter)=0A+=0A=20/*=0A=20=20*=20readFile=20= is=20-1=20or=20a=20kernel=20FD=20for=20the=20log=20file=20segment=20= that's=20currently=0A=20=20*=20open=20for=20reading.=20=20readSegNo=20= identifies=20the=20segment.=20=20readOff=20is=20the=20offset=0A@@=20= -231,11=20+367,6=20@@=20static=20const=20char=20*const=20= xlogSourceNames[]=20=3D=20{"any",=20"archive",=20"pg_wal",=20"strea=0A=20= =20*=20FD=20too=20(like=20for=20openLogFile=20in=20xlog.c);=20but=20it=20= doesn't=20currently=20seem=0A=20=20*=20worthwhile,=20since=20the=20XLOG=20= is=20not=20read=20by=20general-purpose=20sessions.=0A=20=20*/=0A-static=20= int=09readFile=20=3D=20-1;=0A-static=20XLogSegNo=20readSegNo=20=3D=200;=0A= -static=20uint32=20readOff=20=3D=200;=0A-static=20uint32=20readLen=20=3D=20= 0;=0A-static=20XLogSource=20readSource=20=3D=20XLOG_FROM_ANY;=0A=20=0A=20= /*=0A=20=20*=20Keeps=20track=20of=20which=20source=20we're=20currently=20= reading=20from.=20This=20is=0A@@=20-247,9=20+378,6=20@@=20static=20= XLogSource=20readSource=20=3D=20XLOG_FROM_ANY;=0A=20=20*=20= pendingWalRcvRestart=20is=20set=20when=20a=20config=20change=20occurs=20= that=20requires=20a=0A=20=20*=20walreceiver=20restart.=20=20This=20is=20= only=20valid=20in=20XLOG_FROM_STREAM=20state.=0A=20=20*/=0A-static=20= XLogSource=20currentSource=20=3D=20XLOG_FROM_ANY;=0A-static=20bool=20= lastSourceFailed=20=3D=20false;=0A-static=20bool=20pendingWalRcvRestart=20= =3D=20false;=0A=20=0A=20/*=0A=20=20*=20These=20variables=20track=20when=20= we=20last=20obtained=20some=20WAL=20data=20to=20process,=0A@@=20-259,12=20= +387,8=20@@=20static=20bool=20pendingWalRcvRestart=20=3D=20false;=0A=20=20= *=20also=20changes=20when=20we=20try=20to=20read=20from=20a=20source=20= and=20fail,=20while=0A=20=20*=20XLogReceiptSource=20tracks=20where=20we=20= last=20successfully=20read=20some=20WAL.)=0A=20=20*/=0A-static=20= TimestampTz=20XLogReceiptTime=20=3D=200;=0A-static=20XLogSource=20= XLogReceiptSource=20=3D=20XLOG_FROM_ANY;=0A=20=0A=20/*=20Local=20copy=20= of=20WalRcv->flushedUpto=20*/=0A-static=20XLogRecPtr=20flushedUpto=20=3D=20= InvalidXLogRecPtr;=0A-static=20TimeLineID=20receiveTLI=20=3D=200;=0A=20=0A= =20/*=0A=20=20*=20Copy=20of=20minRecoveryPoint=20and=20backupEndPoint=20= from=20the=20control=20file.=0A@@=20-284,7=20+408,6=20@@=20static=20= TimeLineID=20minRecoveryPointTLI;=0A=20=0A=20static=20XLogRecPtr=20= backupStartPoint;=0A=20static=20XLogRecPtr=20backupEndPoint;=0A-static=20= bool=20backupEndRequired=20=3D=20false;=0A=20=0A=20/*=0A=20=20*=20Have=20= we=20reached=20a=20consistent=20database=20state?=20=20In=20crash=20= recovery,=20we=20have=0A@@=20-303,8=20+426,6=20@@=20static=20bool=20= backupEndRequired=20=3D=20false;=0A=20bool=09=09reachedConsistency=20=3D=20= false;=0A=20=0A=20/*=20Buffers=20dedicated=20to=20consistency=20checks=20= of=20size=20BLCKSZ=20*/=0A-static=20char=20*replay_image_masked=20=3D=20= NULL;=0A-static=20char=20*primary_image_masked=20=3D=20NULL;=0A=20=0A=20= XLogRecoveryCtlData=20*XLogRecoveryCtl=20=3D=20NULL;=0A=20=0A@@=20= -329,21=20+450,16=20@@=20static=20XLogRecPtr=20missingContrecPtr;=0A=20=20= *=20if=20recoveryStopsBefore/After=20returns=20true,=20it=20saves=20= information=20of=20the=20stop=0A=20=20*=20point=20here=0A=20=20*/=0A= -static=20TransactionId=20recoveryStopXid;=0A-static=20TimestampTz=20= recoveryStopTime;=0A-static=20XLogRecPtr=20recoveryStopLSN;=0A-static=20= char=20recoveryStopName[MAXFNAMELEN];=0A-static=20bool=20= recoveryStopAfter;=0A=20=0A=20/*=20prototypes=20for=20local=20functions=20= */=0A-static=20void=20ApplyWalRecord(XLogReaderState=20*xlogreader,=20= XLogRecord=20*record,=20TimeLineID=20*replayTLI);=0A+static=20void=20= ApplyWalRecord(XLogReaderState=20*reader,=20XLogRecord=20*record,=20= TimeLineID=20*replayTLI);=0A=20=0A=20static=20void=20= EnableStandbyMode(void);=0A=20static=20void=20= readRecoverySignalFile(void);=0A=20static=20void=20= validateRecoveryParameters(void);=0A=20static=20bool=20= read_backup_label(XLogRecPtr=20*checkPointLoc,=0A=20=09=09=09=09=09=09=09= =20=20TimeLineID=20*backupLabelTLI,=0A-=09=09=09=09=09=09=09=20=20bool=20= *backupEndRequired,=20bool=20*backupFromStandby);=0A+=09=09=09=09=09=09=09= =20=20bool=20*backupEndRequiredPtr,=20bool=20*backupFromStandby);=0A=20= static=20bool=20read_tablespace_map(List=20**tablespaces);=0A=20=0A=20= static=20void=20xlogrecovery_redo(XLogReaderState=20*record,=20= TimeLineID=20replayTLI);=0A@@=20-365,11=20+481,11=20@@=20static=20void=20= recoveryPausesHere(bool=20endOfRecovery);=0A=20static=20bool=20= recoveryApplyDelay(XLogReaderState=20*record);=0A=20static=20void=20= ConfirmRecoveryPaused(void);=0A=20=0A-static=20XLogRecord=20= *ReadRecord(XLogPrefetcher=20*xlogprefetcher,=0A+static=20XLogRecord=20= *ReadRecord(XLogPrefetcher=20*prefetcher,=0A=20=09=09=09=09=09=09=09=20=20= int=20emode,=20bool=20fetching_ckpt,=0A=20=09=09=09=09=09=09=09=20=20= TimeLineID=20replayTLI);=0A=20=0A-static=20int=09= XLogPageRead(XLogReaderState=20*xlogreader,=20XLogRecPtr=20= targetPagePtr,=0A+static=20int=09XLogPageRead(XLogReaderState=20*reader,=20= XLogRecPtr=20targetPagePtr,=0A=20=09=09=09=09=09=09=20int=20reqLen,=20= XLogRecPtr=20targetRecPtr,=20char=20*readBuf);=0A=20static=20= XLogPageReadResult=20WaitForWALToBecomeAvailable(XLogRecPtr=20RecPtr,=0A=20= =09=09=09=09=09=09=09=09=09=09=09=09=09=20=20bool=20randAccess,=0A@@=20= -379,7=20+495,7=20@@=20static=20XLogPageReadResult=20= WaitForWALToBecomeAvailable(XLogRecPtr=20RecPtr,=0A=20=09=09=09=09=09=09=09= =09=09=09=09=09=09=20=20XLogRecPtr=20replayLSN,=0A=20=09=09=09=09=09=09=09= =09=09=09=09=09=09=20=20bool=20nonblocking);=0A=20static=20int=09= emode_for_corrupt_record(int=20emode,=20XLogRecPtr=20RecPtr);=0A-static=20= XLogRecord=20*ReadCheckpointRecord(XLogPrefetcher=20*xlogprefetcher,=0A= +static=20XLogRecord=20*ReadCheckpointRecord(XLogPrefetcher=20= *prefetcher,=0A=20=09=09=09=09=09=09=09=09=09=09XLogRecPtr=20RecPtr,=20= TimeLineID=20replayTLI);=0A=20static=20bool=20= rescanLatestTimeLine(TimeLineID=20replayTLI,=20XLogRecPtr=20replayLSN);=0A= =20static=20int=09XLogFileRead(XLogSegNo=20segno,=20TimeLineID=20tli,=0A= @@=20-534,7=20+650,7=20@@=20InitWalRecovery(ControlFileData=20= *ControlFile,=20bool=20*wasShutdown_ptr,=0A=20=09=20*=20process=20after=20= checking=20for=20signal=20files=20and=20after=20performing=20validation=0A= =20=09=20*=20of=20the=20recovery=20parameters.=0A=20=09=20*/=0A-=09if=20= (read_backup_label(&CheckPointLoc,=20&CheckPointTLI,=20= &backupEndRequired,=0A+=09if=20(read_backup_label(&CheckPointLoc,=20= &CheckPointTLI,=20&BackupEndRequired,=0A=20=09=09=09=09=09=09=20=20= &backupFromStandby))=0A=20=09{=0A=20=09=09List=09=20=20=20*tablespaces=20= =3D=20NIL;=0A@@=20-932,7=20+1048,7=20@@=20= InitWalRecovery(ControlFileData=20*ControlFile,=20bool=20= *wasShutdown_ptr,=0A=20=09=09if=20(haveBackupLabel)=0A=20=09=09{=0A=20=09= =09=09ControlFile->backupStartPoint=20=3D=20checkPoint.redo;=0A-=09=09=09= ControlFile->backupEndRequired=20=3D=20backupEndRequired;=0A+=09=09=09= ControlFile->backupEndRequired=20=3D=20BackupEndRequired;=0A=20=0A=20=09=09= =09if=20(backupFromStandby)=0A=20=09=09=09{=0A@@=20-949,7=20+1065,7=20@@=20= InitWalRecovery(ControlFileData=20*ControlFile,=20bool=20= *wasShutdown_ptr,=0A=20=0A=20=09/*=20remember=20these,=20so=20that=20we=20= know=20when=20we=20have=20reached=20consistency=20*/=0A=20=09= backupStartPoint=20=3D=20ControlFile->backupStartPoint;=0A-=09= backupEndRequired=20=3D=20ControlFile->backupEndRequired;=0A+=09= BackupEndRequired=20=3D=20ControlFile->backupEndRequired;=0A=20=09= backupEndPoint=20=3D=20ControlFile->backupEndPoint;=0A=20=09if=20= (InArchiveRecovery)=0A=20=09{=0A@@=20-1165,7=20+1281,7=20@@=20= validateRecoveryParameters(void)=0A=20=20*/=0A=20static=20bool=0A=20= read_backup_label(XLogRecPtr=20*checkPointLoc,=20TimeLineID=20= *backupLabelTLI,=0A-=09=09=09=09=20=20bool=20*backupEndRequired,=20bool=20= *backupFromStandby)=0A+=09=09=09=09=20=20bool=20*backupEndRequiredPtr,=20= bool=20*backupFromStandby)=0A=20{=0A=20=09char=09=09= startxlogfilename[MAXFNAMELEN];=0A=20=09TimeLineID=09tli_from_walseg,=0A= @@=20-1182,7=20+1298,7=20@@=20read_backup_label(XLogRecPtr=20= *checkPointLoc,=20TimeLineID=20*backupLabelTLI,=0A=20=09/*=20suppress=20= possible=20uninitialized-variable=20warnings=20*/=0A=20=09*checkPointLoc=20= =3D=20InvalidXLogRecPtr;=0A=20=09*backupLabelTLI=20=3D=200;=0A-=09= *backupEndRequired=20=3D=20false;=0A+=09*backupEndRequiredPtr=20=3D=20= false;=0A=20=09*backupFromStandby=20=3D=20false;=0A=20=0A=20=09/*=0A@@=20= -1232,7=20+1348,7=20@@=20read_backup_label(XLogRecPtr=20*checkPointLoc,=20= TimeLineID=20*backupLabelTLI,=0A=20=09if=20(fscanf(lfp,=20"BACKUP=20= METHOD:=20%19s\n",=20backuptype)=20=3D=3D=201)=0A=20=09{=0A=20=09=09if=20= (strcmp(backuptype,=20"streamed")=20=3D=3D=200)=0A-=09=09=09= *backupEndRequired=20=3D=20true;=0A+=09=09=09*backupEndRequiredPtr=20=3D=20= true;=0A=20=09}=0A=20=0A=20=09/*=0A@@=20-1877,14=20+1993,14=20@@=20= PerformWalRecovery(void)=0A=20=20*=20Subroutine=20of=20= PerformWalRecovery,=20to=20apply=20one=20WAL=20record.=0A=20=20*/=0A=20= static=20void=0A-ApplyWalRecord(XLogReaderState=20*xlogreader,=20= XLogRecord=20*record,=20TimeLineID=20*replayTLI)=0A= +ApplyWalRecord(XLogReaderState=20*reader,=20XLogRecord=20*record,=20= TimeLineID=20*replayTLI)=0A=20{=0A=20=09ErrorContextCallback=20= errcallback;=0A=20=09bool=09=09switchedTLI=20=3D=20false;=0A=20=0A=20=09= /*=20Setup=20error=20traceback=20support=20for=20ereport()=20*/=0A=20=09= errcallback.callback=20=3D=20rm_redo_error_callback;=0A-=09= errcallback.arg=20=3D=20xlogreader;=0A+=09errcallback.arg=20=3D=20= reader;=0A=20=09errcallback.previous=20=3D=20error_context_stack;=0A=20=09= error_context_stack=20=3D=20&errcallback;=0A=20=0A@@=20-1911,7=20+2027,7=20= @@=20ApplyWalRecord(XLogReaderState=20*xlogreader,=20XLogRecord=20= *record,=20TimeLineID=20*repl=0A=20=09=09{=0A=20=09=09=09CheckPoint=09= checkPoint;=0A=20=0A-=09=09=09memcpy(&checkPoint,=20= XLogRecGetData(xlogreader),=20sizeof(CheckPoint));=0A+=09=09=09= memcpy(&checkPoint,=20XLogRecGetData(reader),=20sizeof(CheckPoint));=0A=20= =09=09=09newReplayTLI=20=3D=20checkPoint.ThisTimeLineID;=0A=20=09=09=09= prevReplayTLI=20=3D=20checkPoint.PrevTimeLineID;=0A=20=09=09}=0A@@=20= -1919,7=20+2035,7=20@@=20ApplyWalRecord(XLogReaderState=20*xlogreader,=20= XLogRecord=20*record,=20TimeLineID=20*repl=0A=20=09=09{=0A=20=09=09=09= xl_end_of_recovery=20xlrec;=0A=20=0A-=09=09=09memcpy(&xlrec,=20= XLogRecGetData(xlogreader),=20sizeof(xl_end_of_recovery));=0A+=09=09=09= memcpy(&xlrec,=20XLogRecGetData(reader),=20sizeof(xl_end_of_recovery));=0A= =20=09=09=09newReplayTLI=20=3D=20xlrec.ThisTimeLineID;=0A=20=09=09=09= prevReplayTLI=20=3D=20xlrec.PrevTimeLineID;=0A=20=09=09}=0A@@=20-1927,7=20= +2043,7=20@@=20ApplyWalRecord(XLogReaderState=20*xlogreader,=20= XLogRecord=20*record,=20TimeLineID=20*repl=0A=20=09=09if=20(newReplayTLI=20= !=3D=20*replayTLI)=0A=20=09=09{=0A=20=09=09=09/*=20Check=20that=20it's=20= OK=20to=20switch=20to=20this=20TLI=20*/=0A-=09=09=09= checkTimeLineSwitch(xlogreader->EndRecPtr,=0A+=09=09=09= checkTimeLineSwitch(reader->EndRecPtr,=0A=20=09=09=09=09=09=09=09=09= newReplayTLI,=20prevReplayTLI,=20*replayTLI);=0A=20=0A=20=09=09=09/*=20= Following=20WAL=20records=20should=20be=20run=20with=20new=20TLI=20*/=0A= @@=20-1941,7=20+2057,7=20@@=20ApplyWalRecord(XLogReaderState=20= *xlogreader,=20XLogRecord=20*record,=20TimeLineID=20*repl=0A=20=09=20*=20= XLogFlush=20will=20update=20minRecoveryPoint=20correctly.=0A=20=09=20*/=0A= =20=09SpinLockAcquire(&XLogRecoveryCtl->info_lck);=0A-=09= XLogRecoveryCtl->replayEndRecPtr=20=3D=20xlogreader->EndRecPtr;=0A+=09= XLogRecoveryCtl->replayEndRecPtr=20=3D=20reader->EndRecPtr;=0A=20=09= XLogRecoveryCtl->replayEndTLI=20=3D=20*replayTLI;=0A=20=09= SpinLockRelease(&XLogRecoveryCtl->info_lck);=0A=20=0A@@=20-1957,10=20= +2073,10=20@@=20ApplyWalRecord(XLogReaderState=20*xlogreader,=20= XLogRecord=20*record,=20TimeLineID=20*repl=0A=20=09=20*=20directly=20= here,=20rather=20than=20in=20xlog_redo()=0A=20=09=20*/=0A=20=09if=20= (record->xl_rmid=20=3D=3D=20RM_XLOG_ID)=0A-=09=09= xlogrecovery_redo(xlogreader,=20*replayTLI);=0A+=09=09= xlogrecovery_redo(reader,=20*replayTLI);=0A=20=0A=20=09/*=20Now=20apply=20= the=20WAL=20record=20itself=20*/=0A-=09= GetRmgr(record->xl_rmid).rm_redo(xlogreader);=0A+=09= GetRmgr(record->xl_rmid).rm_redo(reader);=0A=20=0A=20=09/*=0A=20=09=20*=20= After=20redo,=20check=20whether=20the=20backup=20pages=20associated=20= with=20the=20WAL=0A@@=20-1968,7=20+2084,7=20@@=20= ApplyWalRecord(XLogReaderState=20*xlogreader,=20XLogRecord=20*record,=20= TimeLineID=20*repl=0A=20=09=20*=20if=20consistency=20check=20is=20= enabled=20for=20this=20record.=0A=20=09=20*/=0A=20=09if=20= ((record->xl_info=20&=20XLR_CHECK_CONSISTENCY)=20!=3D=200)=0A-=09=09= verifyBackupPageConsistency(xlogreader);=0A+=09=09= verifyBackupPageConsistency(reader);=0A=20=0A=20=09/*=20Pop=20the=20= error=20context=20stack=20*/=0A=20=09error_context_stack=20=3D=20= errcallback.previous;=0A@@=20-1978,8=20+2094,8=20@@=20= ApplyWalRecord(XLogReaderState=20*xlogreader,=20XLogRecord=20*record,=20= TimeLineID=20*repl=0A=20=09=20*=20replayed.=0A=20=09=20*/=0A=20=09= SpinLockAcquire(&XLogRecoveryCtl->info_lck);=0A-=09= XLogRecoveryCtl->lastReplayedReadRecPtr=20=3D=20xlogreader->ReadRecPtr;=0A= -=09XLogRecoveryCtl->lastReplayedEndRecPtr=20=3D=20= xlogreader->EndRecPtr;=0A+=09XLogRecoveryCtl->lastReplayedReadRecPtr=20=3D= =20reader->ReadRecPtr;=0A+=09XLogRecoveryCtl->lastReplayedEndRecPtr=20=3D=20= reader->EndRecPtr;=0A=20=09XLogRecoveryCtl->lastReplayedTLI=20=3D=20= *replayTLI;=0A=20=09SpinLockRelease(&XLogRecoveryCtl->info_lck);=0A=20=0A= @@=20-2029,7=20+2145,7=20@@=20ApplyWalRecord(XLogReaderState=20= *xlogreader,=20XLogRecord=20*record,=20TimeLineID=20*repl=0A=20=09=09=20= *=20Before=20we=20continue=20on=20the=20new=20timeline,=20clean=20up=20= any=20(possibly=0A=20=09=09=20*=20bogus)=20future=20WAL=20segments=20on=20= the=20old=20timeline.=0A=20=09=09=20*/=0A-=09=09= RemoveNonParentXlogFiles(xlogreader->EndRecPtr,=20*replayTLI);=0A+=09=09= RemoveNonParentXlogFiles(reader->EndRecPtr,=20*replayTLI);=0A=20=0A=20=09= =09/*=20Reset=20the=20prefetcher.=20*/=0A=20=09=09= XLogPrefetchReconfigure();=0A@@=20-2184,7=20+2300,7=20@@=20= CheckRecoveryConsistency(void)=0A=20=09=09= ReachedEndOfBackup(lastReplayedEndRecPtr,=20lastReplayedTLI);=0A=20=09=09= backupStartPoint=20=3D=20InvalidXLogRecPtr;=0A=20=09=09backupEndPoint=20= =3D=20InvalidXLogRecPtr;=0A-=09=09backupEndRequired=20=3D=20false;=0A+=09= =09BackupEndRequired=20=3D=20false;=0A=20=0A=20=09=09ereport(LOG,=0A=20=09= =09=09=09errmsg("completed=20backup=20recovery=20with=20redo=20LSN=20= %X/%08X=20and=20end=20LSN=20%X/%08X",=0A@@=20-2198,7=20+2314,7=20@@=20= CheckRecoveryConsistency(void)=0A=20=09=20*=20XLOG_BACKUP_END=20arrives=20= to=20advise=20us=20of=20the=20correct=20minRecoveryPoint.=0A=20=09=20*=20= All=20we=20know=20prior=20to=20that=20is=20that=20we're=20not=20= consistent=20yet.=0A=20=09=20*/=0A-=09if=20(!reachedConsistency=20&&=20= !backupEndRequired=20&&=0A+=09if=20(!reachedConsistency=20&&=20= !BackupEndRequired=20&&=0A=20=09=09minRecoveryPoint=20<=3D=20= lastReplayedEndRecPtr)=0A=20=09{=0A=20=09=09/*=0A@@=20-3102,19=20= +3218,19=20@@=20ConfirmRecoveryPaused(void)=0A=20=20*=20record=20is=20= available.=0A=20=20*/=0A=20static=20XLogRecord=20*=0A= -ReadRecord(XLogPrefetcher=20*xlogprefetcher,=20int=20emode,=0A= +ReadRecord(XLogPrefetcher=20*prefetcher,=20int=20emode,=0A=20=09=09=20=20= =20bool=20fetching_ckpt,=20TimeLineID=20replayTLI)=0A=20{=0A=20=09= XLogRecord=20*record;=0A-=09XLogReaderState=20*xlogreader=20=3D=20= XLogPrefetcherGetReader(xlogprefetcher);=0A-=09XLogPageReadPrivate=20= *private=20=3D=20(XLogPageReadPrivate=20*)=20xlogreader->private_data;=0A= +=09XLogReaderState=20*reader=20=3D=20= XLogPrefetcherGetReader(prefetcher);=0A+=09XLogPageReadPrivate=20= *private=20=3D=20(XLogPageReadPrivate=20*)=20reader->private_data;=0A=20=0A= =20=09Assert(AmStartupProcess()=20||=20!IsUnderPostmaster);=0A=20=0A=20=09= /*=20Pass=20through=20parameters=20to=20XLogPageRead=20*/=0A=20=09= private->fetching_ckpt=20=3D=20fetching_ckpt;=0A=20=09private->emode=20=3D= =20emode;=0A-=09private->randAccess=20=3D=20= !XLogRecPtrIsValid(xlogreader->ReadRecPtr);=0A+=09private->randAccess=20= =3D=20!XLogRecPtrIsValid(reader->ReadRecPtr);=0A=20=09private->replayTLI=20= =3D=20replayTLI;=0A=20=0A=20=09/*=20This=20is=20the=20first=20attempt=20= to=20read=20this=20page.=20*/=0A@@=20-3124,7=20+3240,7=20@@=20= ReadRecord(XLogPrefetcher=20*xlogprefetcher,=20int=20emode,=0A=20=09{=0A=20= =09=09char=09=20=20=20*errormsg;=0A=20=0A-=09=09record=20=3D=20= XLogPrefetcherReadRecord(xlogprefetcher,=20&errormsg);=0A+=09=09record=20= =3D=20XLogPrefetcherReadRecord(prefetcher,=20&errormsg);=0A=20=09=09if=20= (record=20=3D=3D=20NULL)=0A=20=09=09{=0A=20=09=09=09/*=0A@@=20-3140,10=20= +3256,10=20@@=20ReadRecord(XLogPrefetcher=20*xlogprefetcher,=20int=20= emode,=0A=20=09=09=09=20*=20overwrite=20contrecord=20in=20the=20wrong=20= place,=20breaking=20everything.=0A=20=09=09=09=20*/=0A=20=09=09=09if=20= (!ArchiveRecoveryRequested=20&&=0A-=09=09=09=09= XLogRecPtrIsValid(xlogreader->abortedRecPtr))=0A+=09=09=09=09= XLogRecPtrIsValid(reader->abortedRecPtr))=0A=20=09=09=09{=0A-=09=09=09=09= abortedRecPtr=20=3D=20xlogreader->abortedRecPtr;=0A-=09=09=09=09= missingContrecPtr=20=3D=20xlogreader->missingContrecPtr;=0A+=09=09=09=09= abortedRecPtr=20=3D=20reader->abortedRecPtr;=0A+=09=09=09=09= missingContrecPtr=20=3D=20reader->missingContrecPtr;=0A=20=09=09=09}=0A=20= =0A=20=09=09=09if=20(readFile=20>=3D=200)=0A@@=20-3159,29=20+3275,29=20= @@=20ReadRecord(XLogPrefetcher=20*xlogprefetcher,=20int=20emode,=0A=20=09= =09=09=20*=20shouldn't=20loop=20anymore=20in=20that=20case.=0A=20=09=09=09= =20*/=0A=20=09=09=09if=20(errormsg)=0A-=09=09=09=09= ereport(emode_for_corrupt_record(emode,=20xlogreader->EndRecPtr),=0A+=09=09= =09=09ereport(emode_for_corrupt_record(emode,=20reader->EndRecPtr),=0A=20= =09=09=09=09=09=09(errmsg_internal("%s",=20errormsg)=20/*=20already=20= translated=20*/=20));=0A=20=09=09}=0A=20=0A=20=09=09/*=0A=20=09=09=20*=20= Check=20page=20TLI=20is=20one=20of=20the=20expected=20values.=0A=20=09=09= =20*/=0A-=09=09else=20if=20(!tliInHistory(xlogreader->latestPageTLI,=20= expectedTLEs))=0A+=09=09else=20if=20= (!tliInHistory(reader->latestPageTLI,=20expectedTLEs))=0A=20=09=09{=0A=20= =09=09=09char=09=09fname[MAXFNAMELEN];=0A=20=09=09=09XLogSegNo=09segno;=0A= =20=09=09=09int32=09=09offset;=0A=20=0A-=09=09=09= XLByteToSeg(xlogreader->latestPagePtr,=20segno,=20wal_segment_size);=0A-=09= =09=09offset=20=3D=20XLogSegmentOffset(xlogreader->latestPagePtr,=0A+=09=09= =09XLByteToSeg(reader->latestPagePtr,=20segno,=20wal_segment_size);=0A+=09= =09=09offset=20=3D=20XLogSegmentOffset(reader->latestPagePtr,=0A=20=09=09= =09=09=09=09=09=09=09=20=20=20wal_segment_size);=0A-=09=09=09= XLogFileName(fname,=20xlogreader->seg.ws_tli,=20segno,=0A+=09=09=09= XLogFileName(fname,=20reader->seg.ws_tli,=20segno,=0A=20=09=09=09=09=09=09= =20wal_segment_size);=0A-=09=09=09= ereport(emode_for_corrupt_record(emode,=20xlogreader->EndRecPtr),=0A+=09=09= =09ereport(emode_for_corrupt_record(emode,=20reader->EndRecPtr),=0A=20=09= =09=09=09=09errmsg("unexpected=20timeline=20ID=20%u=20in=20WAL=20segment=20= %s,=20LSN=20%X/%08X,=20offset=20%u",=0A-=09=09=09=09=09=09=20=20=20= xlogreader->latestPageTLI,=0A+=09=09=09=09=09=09=20=20=20= reader->latestPageTLI,=0A=20=09=09=09=09=09=09=20=20=20fname,=0A-=09=09=09= =09=09=09=20=20=20LSN_FORMAT_ARGS(xlogreader->latestPagePtr),=0A+=09=09=09= =09=09=09=20=20=20LSN_FORMAT_ARGS(reader->latestPagePtr),=0A=20=09=09=09=09= =09=09=20=20=20offset));=0A=20=09=09=09record=20=3D=20NULL;=0A=20=09=09}=0A= @@=20-3217,8=20+3333,8=20@@=20ReadRecord(XLogPrefetcher=20= *xlogprefetcher,=20int=20emode,=0A=20=09=09=09=09if=20= (StandbyModeRequested)=0A=20=09=09=09=09=09EnableStandbyMode();=0A=20=0A= -=09=09=09=09SwitchIntoArchiveRecovery(xlogreader->EndRecPtr,=20= replayTLI);=0A-=09=09=09=09minRecoveryPoint=20=3D=20= xlogreader->EndRecPtr;=0A+=09=09=09=09= SwitchIntoArchiveRecovery(reader->EndRecPtr,=20replayTLI);=0A+=09=09=09=09= minRecoveryPoint=20=3D=20reader->EndRecPtr;=0A=20=09=09=09=09= minRecoveryPointTLI=20=3D=20replayTLI;=0A=20=0A=20=09=09=09=09= CheckRecoveryConsistency();=0A@@=20-3271,11=20+3387,11=20@@=20= ReadRecord(XLogPrefetcher=20*xlogprefetcher,=20int=20emode,=0A=20=20*=20= sleep=20and=20retry.=0A=20=20*/=0A=20static=20int=0A= -XLogPageRead(XLogReaderState=20*xlogreader,=20XLogRecPtr=20= targetPagePtr,=20int=20reqLen,=0A+XLogPageRead(XLogReaderState=20= *reader,=20XLogRecPtr=20targetPagePtr,=20int=20reqLen,=0A=20=09=09=09=20= XLogRecPtr=20targetRecPtr,=20char=20*readBuf)=0A=20{=0A=20=09= XLogPageReadPrivate=20*private=20=3D=0A-=09=09(XLogPageReadPrivate=20*)=20= xlogreader->private_data;=0A+=09=09(XLogPageReadPrivate=20*)=20= reader->private_data;=0A=20=09int=09=09=09emode=20=3D=20private->emode;=0A= =20=09uint32=09=09targetPageOff;=0A=20=09XLogSegNo=09targetSegNo=20= PG_USED_FOR_ASSERTS_ONLY;=0A@@=20-3322,7=20+3438,7=20@@=20retry:=0A=20=09= =09=20flushedUpto=20<=20targetPagePtr=20+=20reqLen))=0A=20=09{=0A=20=09=09= if=20(readFile=20>=3D=200=20&&=0A-=09=09=09xlogreader->nonblocking=20&&=0A= +=09=09=09reader->nonblocking=20&&=0A=20=09=09=09readSource=20=3D=3D=20= XLOG_FROM_STREAM=20&&=0A=20=09=09=09flushedUpto=20<=20targetPagePtr=20+=20= reqLen)=0A=20=09=09=09return=20XLREAD_WOULDBLOCK;=0A@@=20-3332,8=20= +3448,8=20@@=20retry:=0A=20=09=09=09=09=09=09=09=09=09=09=09= private->fetching_ckpt,=0A=20=09=09=09=09=09=09=09=09=09=09=09= targetRecPtr,=0A=20=09=09=09=09=09=09=09=09=09=09=09private->replayTLI,=0A= -=09=09=09=09=09=09=09=09=09=09=09xlogreader->EndRecPtr,=0A-=09=09=09=09=09= =09=09=09=09=09=09xlogreader->nonblocking))=0A+=09=09=09=09=09=09=09=09=09= =09=09reader->EndRecPtr,=0A+=09=09=09=09=09=09=09=09=09=09=09= reader->nonblocking))=0A=20=09=09{=0A=20=09=09=09case=20= XLREAD_WOULDBLOCK:=0A=20=09=09=09=09return=20XLREAD_WOULDBLOCK;=0A@@=20= -3417,7=20+3533,7=20@@=20retry:=0A=20=09Assert(targetPageOff=20=3D=3D=20= readOff);=0A=20=09Assert(reqLen=20<=3D=20readLen);=0A=20=0A-=09= xlogreader->seg.ws_tli=20=3D=20curFileTLI;=0A+=09reader->seg.ws_tli=20=3D=20= curFileTLI;=0A=20=0A=20=09/*=0A=20=09=20*=20Check=20the=20page=20header=20= immediately,=20so=20that=20we=20can=20retry=20immediately=20if=0A@@=20= -3453,18=20+3569,18=20@@=20retry:=0A=20=09=20*/=0A=20=09if=20= (StandbyMode=20&&=0A=20=09=09(targetPagePtr=20%=20wal_segment_size)=20=3D=3D= =200=20&&=0A-=09=09!XLogReaderValidatePageHeader(xlogreader,=20= targetPagePtr,=20readBuf))=0A+=09=09= !XLogReaderValidatePageHeader(reader,=20targetPagePtr,=20readBuf))=0A=20=09= {=0A=20=09=09/*=0A=20=09=09=20*=20Emit=20this=20error=20right=20now=20= then=20retry=20this=20page=20immediately.=20Use=0A=20=09=09=20*=20= errmsg_internal()=20because=20the=20message=20was=20already=20= translated.=0A=20=09=09=20*/=0A-=09=09if=20(xlogreader->errormsg_buf[0])=0A= -=09=09=09ereport(emode_for_corrupt_record(emode,=20= xlogreader->EndRecPtr),=0A-=09=09=09=09=09(errmsg_internal("%s",=20= xlogreader->errormsg_buf)));=0A+=09=09if=20(reader->errormsg_buf[0])=0A+=09= =09=09ereport(emode_for_corrupt_record(emode,=20reader->EndRecPtr),=0A+=09= =09=09=09=09(errmsg_internal("%s",=20reader->errormsg_buf)));=0A=20=0A=20= =09=09/*=20reset=20any=20error=20XLogReaderValidatePageHeader()=20might=20= have=20set=20*/=0A-=09=09XLogReaderResetError(xlogreader);=0A+=09=09= XLogReaderResetError(reader);=0A=20=09=09goto=20next_record_is_invalid;=0A= =20=09}=0A=20=0A@@=20-3476,7=20+3592,7=20@@=20next_record_is_invalid:=0A=20= =09=20*=20If=20we're=20reading=20ahead,=20give=20up=20fast.=20=20Retries=20= and=20error=20reporting=20will=0A=20=09=20*=20be=20handled=20by=20a=20= later=20read=20when=20recovery=20catches=20up=20to=20this=20point.=0A=20=09= =20*/=0A-=09if=20(xlogreader->nonblocking)=0A+=09if=20= (reader->nonblocking)=0A=20=09=09return=20XLREAD_WOULDBLOCK;=0A=20=0A=20=09= lastSourceFailed=20=3D=20true;=0A@@=20-4054,7=20+4170,7=20@@=20= emode_for_corrupt_record(int=20emode,=20XLogRecPtr=20RecPtr)=0A=20=20*=20= Subroutine=20to=20try=20to=20fetch=20and=20validate=20a=20prior=20= checkpoint=20record.=0A=20=20*/=0A=20static=20XLogRecord=20*=0A= -ReadCheckpointRecord(XLogPrefetcher=20*xlogprefetcher,=20XLogRecPtr=20= RecPtr,=0A+ReadCheckpointRecord(XLogPrefetcher=20*prefetcher,=20= XLogRecPtr=20RecPtr,=0A=20=09=09=09=09=09=20TimeLineID=20replayTLI)=0A=20= {=0A=20=09XLogRecord=20*record;=0A@@=20-4069,8=20+4185,8=20@@=20= ReadCheckpointRecord(XLogPrefetcher=20*xlogprefetcher,=20XLogRecPtr=20= RecPtr,=0A=20=09=09return=20NULL;=0A=20=09}=0A=20=0A-=09= XLogPrefetcherBeginRead(xlogprefetcher,=20RecPtr);=0A-=09record=20=3D=20= ReadRecord(xlogprefetcher,=20LOG,=20true,=20replayTLI);=0A+=09= XLogPrefetcherBeginRead(prefetcher,=20RecPtr);=0A+=09record=20=3D=20= ReadRecord(prefetcher,=20LOG,=20true,=20replayTLI);=0A=20=0A=20=09if=20= (record=20=3D=3D=20NULL)=0A=20=09{=0A--=20=0A2.50.1=20(Apple=20Git-155)=0A= =0A= --Apple-Mail=_B830DCCB-64C7-4AD6-938E-E4A843BDEE74--