Michael Paquier [Wed, 10 Feb 2021 07:59:04 +0000 (16:59 +0900)]     Fix ORDER BY clause in new regression test of REINDEX CONCURRENTLY
  Oversight in 
bd12080.  
Reported-by: Justin Pryzby Discussion: https://postgr.es/m/
20210210065805.GG20012@telsasoft.com
 Backpatch-through: 12  
  Michael Paquier [Wed, 10 Feb 2021 06:28:19 +0000 (15:28 +0900)]     Simplify code related to compilation of SSL and OpenSSL
  This commit makes more generic some comments and code related to the
 compilation with OpenSSL and SSL in general to ease the addition of more
 SSL implementations in the future.  In libpq, some OpenSSL-only code is
 moved under USE_OPENSSL and not USE_SSL. 
 While on it, make a comment more consistent in libpq-fe.h. 
 Author: Daniel Gustafsson
 Discussion: https://postgr.es/m/
5382CB4A-9CF3-4145-BA46-
C802615935E0@yesql.se  
  Michael Paquier [Wed, 10 Feb 2021 04:06:48 +0000 (13:06 +0900)]     Preserve pg_attribute.attstattarget across REINDEX CONCURRENTLY
  For an index, attstattarget can be updated using ALTER INDEX SET
 STATISTICS.  This data was lost on the new index after REINDEX
 CONCURRENTLY. 
 The update of this field is done when the old and new indexes are
 swapped to make the fix back-patchable.  Another approach we could look
 after in the long-term is to change index_create() to pass the wanted
 values of attstattarget when creating the new relation, but, as this
 would cause an ABI breakage this can be done only on HEAD.  
Reported-by: Ronan Dunklau Author: Michael Paquier 
Reviewed-by: Ronan Dunklau, Tomas Vondra Discussion: https://postgr.es/m/
16628084.uLZWGnKmhe@laptop-ronand
 Backpatch-through: 12  
  Amit Kapila [Wed, 10 Feb 2021 01:47:09 +0000 (07:17 +0530)]     Make pg_replication_origin_drop safe against concurrent drops.
 
 Currently, we get the origin id from the name and then drop the origin by
 taking ExclusiveLock on ReplicationOriginRelationId. So, two concurrent
 sessions can get the id from the name at the same time and then when they
 try to drop the origin, one of the sessions will get the either
 "tuple concurrently deleted" or "cache lookup failed for replication
 origin ..".
 
 To prevent this race condition we do the entire operation under lock. This
 obviates the need for replorigin_drop() API and we have removed it so if
 any extension authors are using it they need to instead use
 replorigin_drop_by_name. See it's usage in pg_replication_origin_drop().
 
 Author: Peter Smith
 Reviewed-by: Amit Kapila, Euler Taveira, Petr Jelinek, and Alvaro
 Herrera
 Discussion: https://www.postgresql.org/message-id/CAHut%2BPuW8DWV5fskkMWWMqzt-x7RPcNQOtJQBp6SdwyRghCk7A%40mail.gmail.com
 
 
    Peter Geoghegan [Tue, 9 Feb 2021 19:36:51 +0000 (11:36 -0800)]     Fix obsolete FSM remarks in nbtree README.
 
 The free space map has used a dedicated relation fork rather than shared
 memory segments for over a decade.
 
 
    Fujii Masao [Tue, 9 Feb 2021 09:30:40 +0000 (18:30 +0900)]     Revert "Display the time when the process started waiting for the lock, in pg_locks."
  This reverts commit 
3b733fcd04195399db56f73f0616b4f5c6828e18. 
 Per buildfarm members prion and rorqual.  
  Fujii Masao [Tue, 9 Feb 2021 09:10:19 +0000 (18:10 +0900)]     Display the time when the process started waiting for the lock, in pg_locks.
  This commit adds new column "waitstart" into pg_locks view. This column
 reports the time when the server process started waiting for the lock
 if the lock is not held. This information is useful, for example, when
 examining the amount of time to wait on a lock by subtracting
 "waitstart" in pg_locks from the current time, and identify the lock
 that the processes are waiting for very long. 
 This feature uses the current time obtained for the deadlock timeout
 timer as "waitstart" (i.e., the time when this process started waiting
 for the lock). Since getting the current time newly can cause overhead,
 we reuse the already-obtained time to avoid that overhead. 
 Note that "waitstart" is updated without holding the lock table's
 partition lock, to avoid the overhead by additional lock acquisition.
 This can cause "waitstart" in pg_locks to become NULL for a very short
 period of time after the wait started even though "granted" is false.
 This is OK in practice because we can assume that users are likely to
 look at "waitstart" when waiting for the lock for a long time. 
 Bump catalog version. 
 Author: Atsushi Torikoshi 
Reviewed-by: Ian Lawrence Barwick, Robert Haas, Justin Pryzby, Fujii Masao Discussion: https://postgr.es/m/
a96013dc51cdc56b2a2b84fa8a16a993@oss.nttdata.com  
  Michael Paquier [Tue, 9 Feb 2021 05:13:57 +0000 (14:13 +0900)]     Add option PROCESS_TOAST to VACUUM
  This option controls if toast tables associated with a relation are
 vacuumed or not when running a manual VACUUM.  It was already possible
 to trigger a manual VACUUM on a toast relation without processing its
 main relation, but a manual vacuum on a main relation always forced a
 vacuum on its toast table.  This is useful in scenarios where the level
 of bloat or transaction age of the main and toast relations differs a
 lot. 
 This option is an extension of the existing VACOPT_SKIPTOAST that was
 used by autovacuum to control if toast relations should be skipped or
 not.  This internal flag is renamed to VACOPT_PROCESS_TOAST for
 consistency with the new option. 
 A new option switch, called --no-process-toast, is added to vacuumdb. 
 Author: Nathan Bossart 
Reviewed-by: Kirk Jamison, Michael Paquier, Justin Pryzby Discussion: https://postgr.es/m/
BA8951E9-1524-48C5-94AF-
73B1F0D7857F@amazon.com  
  Peter Geoghegan [Mon, 8 Feb 2021 23:20:08 +0000 (15:20 -0800)]     Correct pgstattuple B-Tree page comments.
 
 
    Tom Lane [Mon, 8 Feb 2021 15:14:09 +0000 (10:14 -0500)]     Fix mishandling of column-level SELECT privileges for join aliases.
  scanNSItemForColumn, expandNSItemAttrs, and ExpandSingleTable would
 pass the wrong RTE to markVarForSelectPriv when dealing with a join
 ParseNamespaceItem: they'd pass the join RTE, when what we need to
 mark is the base table that the join column came from.  The end
 result was to not fill the base table's selectedCols bitmap correctly,
 resulting in an understatement of the set of columns that are read
 by the query.  The executor would still insist on there being at
 least one selectable column; but with a correctly crafted query,
 a user having SELECT privilege on just one column of a table would
 nonetheless be allowed to read all its columns. 
 To fix, make markRTEForSelectPriv fetch the correct RTE for itself,
 ignoring the possibly-mismatched RTE passed by the caller.  Later,
 we'll get rid of some now-unused RTE arguments, but that risks
 API breaks so we won't do it in released branches. 
 This problem was introduced by commit 
9ce77d75c, so back-patch
 to v13 where that came in.  Thanks to Sven Klemm for reporting
 the problem. 
 Security: CVE-2021-20229  
  Heikki Linnakangas [Mon, 8 Feb 2021 09:01:51 +0000 (11:01 +0200)]     Fix permission checks on constraint violation errors on partitions.
  If a cross-partition UPDATE violates a constraint on the target partition,
 and the columns in the new partition are in different physical order than
 in the parent, the error message can reveal columns that the user does not
 have SELECT permission on. A similar bug was fixed earlier in commit 
804b6b6db4. 
 The cause of the bug is that the callers of the
 ExecBuildSlotValueDescription() function got confused when constructing
 the list of modified columns. If the tuple was routed from a parent, we
 converted the tuple to the parent's format, but the list of modified
 columns was grabbed directly from the child's RTE entry. 
 ExecUpdateLockMode() had a similar issue. That lead to confusion on which
 columns are key columns, leading to wrong tuple lock being taken on tables
 referenced by foreign keys, when a row is updated with INSERT ON CONFLICT
 UPDATE. A new isolation test is added for that corner case. 
 With this patch, the ri_RangeTableIndex field is no longer set for
 partitions that don't have an entry in the range table. Previously, it was
 set to the RTE entry of the parent relation, but that was confusing. 
 NOTE: This modifies the ResultRelInfo struct, replacing the
 ri_PartitionRoot field with ri_RootResultRelInfo. That's a bit risky to
 backpatch, because it breaks any extensions accessing the field. The
 change that ri_RangeTableIndex is not set for partitions could potentially
 break extensions, too. The ResultRelInfos are visible to FDWs at least,
 and this patch required small changes to postgres_fdw. Nevertheless, this
 seem like the least bad option. I don't think these fields widely used in
 extensions; I don't think there are FDWs out there that uses the FDW
 "direct update" API, other than postgres_fdw. If there is, you will get a
 compilation error, so hopefully it is caught quickly. 
 Backpatch to 11, where support for both cross-partition UPDATEs, and unique
 indexes on partitioned tables, were added.  
Reviewed-by: Amit Langote Security: CVE-2021-3393  
  Peter Geoghegan [Sun, 7 Feb 2021 18:11:14 +0000 (10:11 -0800)]     Rename removable xid function for consistency.
  GlobalVisIsRemovableFullXid() is now GlobalVisCheckRemovableFullXid().
 This is consistent with the general convention for FullTransactionId
 equivalents of functions that deal with TransactionId values.  It now
 matches the nearby GlobalVisCheckRemovableXid() function, which performs
 the same check for callers that use TransactionId values. 
 Oversight in commit 
dc7420c2c92. 
 Discussion: https://postgr.es/m/CAH2-Wzmes12jFNDcVgpU89Vp=r6uLFrE-MT0fjSWGsE70UiNaA@mail.gmail.com  
  Tom Lane [Sun, 7 Feb 2021 17:54:08 +0000 (12:54 -0500)]     Revert "Propagate CTE property flags when copying a CTE list into a rule."
  This reverts commit 
ed290896335414c6c069b9ccae1f3dcdd2fac6ba and
 equivalent back-branch commits.  The issue is subtler than I thought,
 and it's far from new, so just before a release deadline is no time
 to be fooling with it.  We'll consider what to do at a bit more
 leisure. 
 Discussion: https://postgr.es/m/CAJcOf-fAdj=nDKMsRhQzndm-O13NY4dL6xGcEvdX5Xvbbi0V7g@mail.gmail.com  
  Tatsuo Ishii [Sun, 7 Feb 2021 04:43:50 +0000 (13:43 +0900)]     Docs: fix pg_wal_lsn_diff manual.
  The manual did not mention whether its return value is (first arg -
 second arg) or (second arg - first arg). The order matters because the
 return value could have a sign. Fix the manual so that it mentions the
 function returns (first arg - second arg). 
 Patch reviewed by Tom Lane. 
 Back-patch through v13. Older version's doc format is difficult to add
 more description.
 Discussion: https://postgr.es/m/flat/
20210206.151125.
960423226279810864.t-ishii%40sraoss.co.jp  
  Tom Lane [Sun, 7 Feb 2021 00:28:39 +0000 (19:28 -0500)]     Propagate CTE property flags when copying a CTE list into a rule.
 
 rewriteRuleAction() neglected this step, although it was careful to
 propagate other similar flags such as hasSubLinks or hasRowSecurity.
 Omitting to transfer hasRecursive is just cosmetic at the moment,
 but omitting hasModifyingCTE is a live bug, since the executor
 certainly looks at that.
 
 The proposed test case only fails back to v10, but since the executor
 examines hasModifyingCTE in 9.x as well, I suspect that a test case
 could be devised that fails in older branches.  Given the nearness
 of the release deadline, though, I'm not going to spend time looking
 for a better test.
 
 Report and patch by Greg Nancarrow, cosmetic changes by me
 
 Discussion: https://postgr.es/m/CAJcOf-fAdj=nDKMsRhQzndm-O13NY4dL6xGcEvdX5Xvbbi0V7g@mail.gmail.com
 
 
    Tom Lane [Sat, 6 Feb 2021 20:17:01 +0000 (15:17 -0500)]     Disallow converting an inheritance child table to a view.
  Generally, members of inheritance trees must be plain tables (or,
 in more recent versions, foreign tables).  ALTER TABLE INHERIT
 rejects creating an inheritance relationship that has a view at
 either end.  When DefineQueryRewrite attempts to convert a relation
 to a view, it already had checks prohibiting doing so for partitioning
 parents or children as well as traditional-inheritance parents ...
 but it neglected to check that a traditional-inheritance child wasn't
 being converted.  Since the planner assumes that any inheritance
 child is a table, this led to making plans that tried to do a physical
 scan on a view, causing failures (or even crashes, in recent versions). 
 One could imagine trying to support such a case by expanding the view
 normally, but since the rewriter runs before the planner does
 inheritance expansion, it would take some very fundamental refactoring
 to make that possible.  There are probably a lot of other parts of the
 system that don't cope well with such a situation, too.  For now,
 just forbid it. 
 Per bug #16856 from Yang Lin.  Back-patch to all supported branches.
 (In versions before v10, this includes back-patching the portion of
 commit 
501ed02cf that added has_superclass().  Perhaps the lack of
 that infrastructure partially explains the missing check.) 
 Discussion: https://postgr.es/m/16856-
0363e05c6e1612fd@postgresql.org  
  Michael Paquier [Sat, 6 Feb 2021 01:27:55 +0000 (10:27 +0900)]     Clarify some comments around SharedRecoveryState in xlog.c
  SharedRecoveryState has been switched from a boolean to an enum as of
 commit 
4e87c48, but some comments still referred to it as a boolean. 
 Author: Amul Sul 
Reviewed-by: Dilip Kumar, Kyotaro Horiguchi Discussion: https://postgr.es/m/CAAJ_b97Hf+1SXnm8jySpO+Fhm+-VKFAAce1T_cupUYtnE3Nxig  
  Robert Haas [Fri, 5 Feb 2021 21:08:45 +0000 (16:08 -0500)]     Generalize parallel slot result handling.
  Instead of having a hard-coded behavior that we ignore missing
 tables and report all other errors, let the caller decide what
 to do by setting a callback. 
 Mark Dilger, reviewed and somewhat revised by me. The larger patch
 series of which this is a part has also had review from Peter
 Geoghegan, Andres Freund, Álvaro Herrera, Michael Paquier, and Amul
 Sul, but I don't know whether any of them have reviewed this bit
 specifically. 
 Discussion: http://postgr.es/m/
12ED3DA8-25F0-4B68-937D-
D907CFBF08E7@enterprisedb.com
 Discussion: http://postgr.es/m/
5F743835-3399-419C-8324-
2D424237E999@enterprisedb.com
 Discussion: http://postgr.es/m/
70655DF3-33CE-4527-9A4D-
DDEB582B6BA0@enterprisedb.com  
  Robert Haas [Fri, 5 Feb 2021 18:33:38 +0000 (13:33 -0500)]     Move some code from src/bin/scripts to src/fe_utils to permit reuse.
  The parallel slots infrastructure (which implements client-side
 multiplexing of server connections doing similar things, not
 threading or multiple processes or anything like that) are moved from
 src/bin/scripts/scripts_parallel.c to src/fe_utils/parallel_slot.c. 
 The functions consumeQueryResult() and processQueryResult() which were
 previously part of src/bin/scripts/common.c are now moved into that
 file as well, becoming static helper functions. This might need to be
 changed in the future, but currently they're not used for anything
 else. 
 Some other functions from src/bin/scripts/common.c are moved to to
 src/fe_utils and are split up among several files.  connectDatabase(),
 connectMaintenanceDatabase(), and disconnectDatabase() are moved to
 connect_utils.c.  executeQuery(), executeCommand(), and
 executeMaintenanceCommand() are move to query_utils.c.
 handle_help_version_opts() is moved to option_utils.c. 
 Mark Dilger, reviewed by me. The larger patch series of which this is
 a part has also had review from Peter Geoghegan, Andres Freund, Álvaro
 Herrera, Michael Paquier, and Amul Sul, but I don't know whether any
 of them have reviewed this bit specifically. 
 Discussion: http://postgr.es/m/
12ED3DA8-25F0-4B68-937D-
D907CFBF08E7@enterprisedb.com
 Discussion: http://postgr.es/m/
5F743835-3399-419C-8324-
2D424237E999@enterprisedb.com
 Discussion: http://postgr.es/m/
70655DF3-33CE-4527-9A4D-
DDEB582B6BA0@enterprisedb.com  
  Heikki Linnakangas [Fri, 5 Feb 2021 09:14:56 +0000 (11:14 +0200)]     Fix backslash-escaping multibyte chars in COPY FROM.
  If a multi-byte character is escaped with a backslash in TEXT mode input,
 and the encoding is one of the client-only encodings where the bytes after
 the first one can have an ASCII byte "embedded" in the char, we didn't
 skip the character correctly. After a backslash, we only skipped the first
 byte of the next character, so if it was a multi-byte character, we would
 try to process its second byte as if it was a separate character. If it
 was one of the characters with special meaning, like '\n', '\r', or
 another '\\', that would cause trouble. 
 One such exmple is the byte sequence '\x5ca45c2e666f6f' in Big5 encoding.
 That's supposed to be [backslash][two-byte character][.][f][o][o], but
 because the second byte of the two-byte character is 0x5c, we incorrectly
 treat it as another backslash. And because the next character is a dot, we
 parse it as end-of-copy marker, and throw an "end-of-copy marker corrupt"
 error. 
 Backpatch to all supported versions.  
Reviewed-by: John Naylor, Kyotaro Horiguchi Discussion: https://www.postgresql.org/message-id/
a897f84f-8dca-8798-3139-
07da5bb38728%40iki.fi  
  Etsuro Fujita [Fri, 5 Feb 2021 06:30:00 +0000 (15:30 +0900)]     postgres_fdw: Fix assertion in estimate_path_cost_size().
  Commit 
08d2d58a2 added an assertion assuming that the retrieved_rows
 estimate for a foreign relation, which is re-used to cost pre-sorted
 foreign paths with local stats, is set to at least one row in
 estimate_path_cost_size(), which isn't correct because if the relation
 is a foreign table with tuples=0, the estimate would be set to 0 there
 when not using remote estimates. 
 Per bug #16807 from Alexander Lakhin.  Back-patch to v13 where the
 aforementioned commit went in. 
 Author: Etsuro Fujita 
Reviewed-by: Kyotaro Horiguchi Discussion: https://postgr.es/m/16807-
9fe4e08fbaa5c7ce%40postgresql.org  
  Tom Lane [Fri, 5 Feb 2021 04:01:33 +0000 (23:01 -0500)]     Fix bug in HashAgg's selective-column-spilling logic.
  Commit 
230230223 taught nodeAgg.c that, when spilling tuples from
 memory in an oversized hash aggregation, it only needed to spill
 input columns referenced in the node's tlist and quals.  Unfortunately,
 that's wrong: we also have to save the grouping columns.  The error
 is masked in common cases because the grouping columns also appear
 in the tlist, but that's not necessarily true.  The main category
 of plans where it's not true seem to come from semijoins ("WHERE
 outercol IN (SELECT innercol FROM innertable)") where the innercol
 needs an implicit promotion to make it comparable to the outercol.
 The grouping column will be "innercol::promotedtype", but that
 expression appears nowhere in the Agg node's own tlist and quals;
 only the bare "innercol" is found in the tlist. 
 I spent quite a bit of time looking for a suitable regression test
 case for this, without much success.  If the number of distinct
 values of the innercol is large enough to make spilling happen,
 the planner tends to prefer a non-HashAgg plan, at least for
 problem sizes that are reasonable to use in the regression tests.
 So, no new regression test.  However, this patch does demonstrably
 fix the originally-reported test case. 
 Per report from s.p.e (at) gmx-topmail.de.  Backpatch to v13
 where the troublesome code came in. 
 Discussion: https://postgr.es/m/trinity-
1c565d44-159f-488b-a518-
caf13883134f-
1611835701633@3c-app-gmx-bap78  
  Thomas Munro [Fri, 5 Feb 2021 02:30:56 +0000 (15:30 +1300)]     Tab-complete CREATE DATABASE ... LOCALE.
 
 Author: Ian Lawrence Barwick <barwick@gmail.com>
 Discussion: https://postgr.es/m/CAB8KJ%3Dh0XO2CB4QbLBc1Tm9Bg5wzSGQtT-eunaCmrghJp4nqdA%40mail.gmail.com
 
 
    Tom Lane [Fri, 5 Feb 2021 00:12:09 +0000 (19:12 -0500)]     Fix YA incremental sort bug.
  switchToPresortedPrefixMode() did the wrong thing if it detected
 a batch boundary just at the last tuple of a fullsort group. 
 The initially-reported symptom was a "retrieved too many tuples in a
 bounded sort" error, but the test case added here just silently gives
 the wrong answer without this patch. 
 I (tgl) am not really happy about committing this patch without review
 from the incremental-sort authors, but they seem AWOL and we are hard
 against a release deadline.  This does demonstrably make some cases
 better, anyway. 
 Per bug #16846 from Yoran Heling.  Back-patch to v13 where incremental
 sort was introduced. 
 Neil Chen 
 Discussion: https://postgr.es/m/16846-
ae49f51ac379a4cb@postgresql.org  
  Peter Geoghegan [Thu, 4 Feb 2021 23:42:36 +0000 (15:42 -0800)]     Harden nbtree page deletion.
  Add some additional defensive checks in the second phase of index
 deletion to detect and report index corruption during VACUUM, and to
 avoid having VACUUM become stuck in more cases.  The code is still not
 robust in the presence of a circular chain of sibling links, though it's
 not clear whether that really matters.  This is follow-up work to commit 
3a01f68e. 
 The new defensive checks rely on the assumption that there can be no
 more than one VACUUM operation running for an index at any given time.
 Remove an old comment suggesting that multiple concurrent VACUUMs need
 to be considered here.  This concern now seems highly unlikely to have
 any real validity, since we clearly rely on the same assumption in
 several other places.  For example, there are much more recent comments
 that appear in the same function (added by commit 
efada2b8e92) that make
 the same assumption. 
 Also add a CHECK_FOR_INTERRUPTS() to the relevant code path.  Contrary
 to comments added by commit 
3a01f68e, it is actually possible to handle
 interrupts here, at least in the common case where processing takes
 place at the leaf level.  We only hold a pin on leafbuf/target page when
 stepping right at the leaf level. 
 No backpatch due to the lack of complaints following hardening added to
 the same area by commit 
3a01f68e.  
  Heikki Linnakangas [Thu, 4 Feb 2021 15:40:33 +0000 (17:40 +0200)]     Fix small error in COPY FROM progress reporting.
 
 The # of bytes processed was accumulated slightly incorrectly. After
 loading more data to the input buffer, we added the number of bytes in
 the buffer to the sum. But in case of multi-byte characters or escapes,
 there can be a few unprocessed bytes left over from previous load in the
 buffer. Those bytes got counted twice.
 
 
    Peter Eisentraut [Thu, 4 Feb 2021 12:31:13 +0000 (13:31 +0100)]     Refactor Windows error message for easier translation
 
 In the error messages referring to the user right "Lock pages in
 memory", this is a term from the Windows OS, so it should be
 translated in accordance with the OS localization.  Refactor the error
 messages so this is easier and clearer.  Also fix the capitalization
 to match the existing capitalization in the OS.
 
 
    Michael Paquier [Thu, 4 Feb 2021 08:16:47 +0000 (17:16 +0900)]     Ensure unlinking of old index file with REINDEX (TABLESPACE)
  The original versions of the patch included this part, but a mismerge
 from my side has made this piece go missing.  Oversight in 
c5b28604.  
  Michael Paquier [Thu, 4 Feb 2021 07:02:31 +0000 (16:02 +0900)]     Clarify comment in tablesync.c
 
 Author: Peter Smith
 Reviewed-by: Amit Kapila, Michael Paquier, Euler Taveira
 Discussion: https://postgr.es/m/CAHut+Pt9_T6pWar0FLtPsygNmme8HPWPdGUyZ_8mE1Yvjdf0ZA@mail.gmail.com
 
 
    Michael Paquier [Thu, 4 Feb 2021 05:34:20 +0000 (14:34 +0900)]     Add TABLESPACE option to REINDEX
  This patch adds the possibility to move indexes to a new tablespace
 while rebuilding them.  Both the concurrent and the non-concurrent cases
 are supported, and the following set of restrictions apply:
 - When using TABLESPACE with a REINDEX command that targets a
 partitioned table or index, all the indexes of the leaf partitions are
 moved to the new tablespace.  The tablespace references of the non-leaf,
 partitioned tables in pg_class.reltablespace are not changed. This
 requires an extra ALTER TABLE SET TABLESPACE.
 - Any index on a toast table rebuilt as part of a parent table is kept
 in its original tablespace.
 - The operation is forbidden on system catalogs, including trying to
 directly move a toast relation with REINDEX.  This results in an error
 if doing REINDEX on a single object.  REINDEX SCHEMA, DATABASE and
 SYSTEM skip system relations when TABLESPACE is used. 
 Author: Alexey Kondratov, Michael Paquier, Justin Pryzby 
Reviewed-by: Álvaro Herrera, Michael Paquier Discussion: https://postgr.es/m/
8a8f5f73-00d3-55f8-7583-
1375ca8f6a91@postgrespro.ru  
  Tom Lane [Thu, 4 Feb 2021 00:38:29 +0000 (19:38 -0500)]     Avoid crash when rolling back within a prepared statement.
  If a portal is used to run a prepared CALL or DO statement that
 contains a ROLLBACK, PortalRunMulti fails because the portal's
 statement list gets cleared by the rollback.  (Since the grammar
 doesn't allow CALL/DO in PREPARE, the only easy way to get to this is
 via extended query protocol, which treats all inputs as prepared
 statements.)  It's difficult to avoid resetting the portal early
 because of resource-management issues, so work around this by teaching
 PortalRunMulti to be wary of portal->stmts having suddenly become NIL. 
 The crash has only been seen to occur in v13 and HEAD (as a
 consequence of commit 
1cff1b95a having added an extra touch of
 portal->stmts).  But even before that, the code involved touching a
 List that the portal no longer has any claim on.  In the test case at
 hand, the List will still exist because of another refcount on the
 cached plan; but I'm far from convinced that it's impossible for the
 cached plan to have been dropped by the time control gets back to
 PortalRunMulti.  Hence, backpatch to v11 where nested transactions
 were added. 
 Thomas Munro and Tom Lane, per bug #16811 from James Inform 
 Discussion: https://postgr.es/m/16811-
c1b599b2c6c2d622@postgresql.org  
  Robert Haas [Wed, 3 Feb 2021 18:19:41 +0000 (13:19 -0500)]     Factor pattern-construction logic out of processSQLNamePattern.
  The logic for converting the shell-glob-like syntax supported by
 utilities like psql and pg_dump to regular expression is
 extracted into a new function patternToSQLRegex. The existing
 function processSQLNamePattern now uses this function as a
 subroutine. 
 patternToSQLRegex is a little more general than what is required
 by processSQLNamePattern. That function is only interested in
 patterns that can have up to 2 parts, a schema and a relation;
 but patternToSQLRegex can limit the maximum number of parts to
 between 1 and 3, so that patterns can look like either
 "database.schema.relation", "schema.relation", or "relation"
 depending on how it's invoked and what the user specifies. 
 processSQLNamePattern only passes two buffers, so works exactly
 the same as before, always interpreting the pattern as either
 a "schema.relation" pattern or a "relation" pattern. But,
 future callers can use this function in other ways. 
 Mark Dilger, reviewed by me. The larger patch series of which this is
 a part has also had review from Peter Geoghegan, Andres Freund, Álvaro
 Herrera, Michael Paquier, and Amul Sul, but I don't know whether
 any of them have reviewed this bit specifically. 
 Discussion: http://postgr.es/m/
12ED3DA8-25F0-4B68-937D-
D907CFBF08E7@enterprisedb.com
 Discussion: http://postgr.es/m/
5F743835-3399-419C-8324-
2D424237E999@enterprisedb.com
 Discussion: http://postgr.es/m/
70655DF3-33CE-4527-9A4D-
DDEB582B6BA0@enterprisedb.com  
  Tom Lane [Wed, 3 Feb 2021 17:01:48 +0000 (12:01 -0500)]     Remove special BKI_LOOKUP magic for namespace and role OIDs.
  Now that commit 
62f34097c attached BKI_LOOKUP annotation to all the
 namespace and role OID columns in the catalogs, there's no real reason
 to have the magic PGNSP and PGUID symbols.  Get rid of them in favor
 of implementing those lookups according to genbki.pl's normal pattern. 
 This means that in the catalog headers, BKI_DEFAULT(PGNSP) becomes
 BKI_DEFAULT(pg_catalog), which seems a lot more transparent.
 BKI_DEFAULT(PGUID) becomes BKI_DEFAULT(POSTGRES), which is perhaps
 less so; but you can look into pg_authid.dat to discover that
 POSTGRES is the nonce name for the bootstrap superuser. 
 This change also means that if we ever need cross-references in the
 initial catalog data to any of the other built-in roles besides
 POSTGRES, or to some other built-in schema besides pg_catalog,
 we can just do it. 
 No catversion bump here, as there's no actual change in the contents
 of postgres.bki. 
 Discussion: https://postgr.es/m/
3240355.
1612129197@sss.pgh.pa.us  
  Peter Eisentraut [Wed, 3 Feb 2021 10:27:13 +0000 (11:27 +0100)]     pg_dump: Fix dumping of inherited generated columns
  Generation expressions of generated columns are always inherited, so
 there is no need to set them separately in child tables, and there is
 no syntax to do so either.  The code previously used the code paths
 for the handling of default values, for which different rules apply;
 in particular it might want to set a default value explicitly for an
 inherited column.  This resulted in unrestorable dumps.  For generated
 columns, just skip them in inherited tables.  
Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us> Discussion: https://www.postgresql.org/message-id/flat/15830.
1575468847%40sss.pgh.pa.us  
  Tom Lane [Tue, 2 Feb 2021 22:21:37 +0000 (17:21 -0500)]     Retire findoidjoins.
  In the wake of commit 
62f34097c, we no longer need this tool. 
 Discussion: https://postgr.es/m/
3240355.
1612129197@sss.pgh.pa.us  
  Tom Lane [Tue, 2 Feb 2021 22:11:55 +0000 (17:11 -0500)]     Build in some knowledge about foreign-key relationships in the catalogs.
  This follows in the spirit of commit 
dfb75e478, which created primary
 key and uniqueness constraints to improve the visibility of constraints
 imposed on the system catalogs.  While our catalogs contain many
 foreign-key-like relationships, they don't quite follow SQL semantics,
 in that the convention for an omitted reference is to write zero not
 NULL.  Plus, we have some cases in which there are arrays each of whose
 elements is supposed to be an FK reference; SQL has no way to model that.
 So we can't create actual foreign key constraints to describe the
 situation.  Nonetheless, we can collect and use knowledge about these
 relationships. 
 This patch therefore adds annotations to the catalog header files to
 declare foreign-key relationships.  (The BKI_LOOKUP annotations cover
 simple cases, but we weren't previously distinguishing which such
 columns are allowed to contain zeroes; we also need new markings for
 multi-column FK references.)  Then, Catalog.pm and genbki.pl are
 taught to collect this information into a table in a new generated
 header "system_fk_info.h".  The only user of that at the moment is
 a new SQL function pg_get_catalog_foreign_keys(), which exposes the
 table to SQL.  The oidjoins regression test is rewritten to use
 pg_get_catalog_foreign_keys() to find out which columns to check.
 Aside from removing the need for manual maintenance of that test
 script, this allows it to cover numerous relationships that were not
 checked by the old implementation based on findoidjoins.  (As of this
 commit, 217 relationships are checked by the test, versus 181 before.) 
 Discussion: https://postgr.es/m/
3240355.
1612129197@sss.pgh.pa.us  
  Tom Lane [Tue, 2 Feb 2021 21:15:29 +0000 (16:15 -0500)]     Doc: consistently identify OID catalog columns that can be zero.
  Not all OID-reference columns that can contain zeroes (indicating
 "no reference") were explicitly marked in catalogs.sgml.  Fix that,
 and try to make the style a little more consistent while at it ---
 for example, consistently write "zero" not "0" for these cases. 
 Joel Jacobson and Tom Lane 
 Discussion: https://postgr.es/m/
4ed9a372-7bf9-479a-926c-
ae8e774717a8@www.fastmail.com  
  Tom Lane [Tue, 2 Feb 2021 19:35:12 +0000 (14:35 -0500)]     Remove extra increment of plpgsql's statement counter for FOR loops.
  This left gaps in the internal statement numbering, which is not
 terribly harmful (else we'd have noticed sooner), but it's not
 great either. 
 Oversight in 
bbd5c207b; backpatch to v12 where that came in. 
 Pavel Stehule 
 Discussion: https://postgr.es/m/CAFj8pRDXyQaJmpotNTQVc-t-WxdWZC35V2PnmwOaV1-taidFWA@mail.gmail.com  
  Tom Lane [Tue, 2 Feb 2021 18:49:08 +0000 (13:49 -0500)]     Fix ancient memory leak in contrib/auto_explain.
 
 The ExecutorEnd hook is invoked in a context that could be quite
 long-lived, not the executor's own per-query context as I think
 we were sort of assuming.  Thus, any cruft generated while producing
 the EXPLAIN output could accumulate over multiple queries.  This can
 result in spectacular leakage if log_nested_statements is on, and
 even without that I'm surprised nobody complained before.
 
 To fix, just switch into the executor's context so that anything we
 allocate will be released when standard_ExecutorEnd frees the executor
 state.  We might as well nuke the code's retail pfree of the explain
 output string, too; that's laughably inadequate to the need.
 
 Japin Li, per report from Jeff Janes.  This bug is old, so
 back-patch to all supported branches.
 
 Discussion: https://postgr.es/m/CAMkU=1wCVtbeRn0s9gt12KwQ7PLXovbpM8eg25SYocKW3BT4hg@mail.gmail.com
 
 
    Peter Eisentraut [Tue, 2 Feb 2021 08:20:22 +0000 (09:20 +0100)]     Improve confusing variable names
 
 The prototype calls the second argument of
 pgstat_progress_update_multi_param() "index", and some callers name
 their local variable that way.  But when the surrounding code deals
 with index relations, this is confusing, and in at least one case
 shadowed another variable that is referring to an index relation.
 Adjust those call sites to have clearer local variable naming, similar
 to existing callers in indexcmds.c.
 
 
    Michael Paquier [Tue, 2 Feb 2021 04:59:23 +0000 (13:59 +0900)]     Remove unused column atttypmod from initial tablesync query
  The initial tablesync done by logical replication used a query to fetch
 the information of a relation's columns that included atttypmod, but it
 was left unused.  This was added by 
7c4f524. 
 Author: Euler Taveira 
Reviewed-by: Önder Kalacı, Amit Langote, Japin Li Discussion: https://postgr.es/m/CAHE3wggb715X+mK_DitLXF25B=jE6xyNCH4YOwM860JR7HarGQ@mail.gmail.com  
  Tom Lane [Mon, 1 Feb 2021 21:38:52 +0000 (16:38 -0500)]     Doc: work a little harder on the initial examples for regex matching.
  Writing unnecessary '.*' at start and end of a POSIX regex doesn't
 do much except confuse the reader about whether that might be
 necessary after all.  Make the examples in table 9.16 a tad more
 realistic, and try to turn the next group of examples into something
 self-contained. 
 Per gripe from rmzgrimes.  Back-patch to v13 because it's easy. 
 Discussion: https://postgr.es/m/
161215841824.14653.
8969016349304314299@wrigleys.postgresql.org  
  Tom Lane [Mon, 1 Feb 2021 19:43:54 +0000 (14:43 -0500)]     Remove [Merge]AppendPath.partitioned_rels.
  It turns out that the calculation of [Merge]AppendPath.partitioned_rels
 in allpaths.c is faulty and sometimes omits relevant non-leaf partitions,
 allowing an assertion added by commit 
a929e17e5a8 to trigger.  Rather
 than fix that, it seems better to get rid of those fields altogether.
 We don't really need the info until create_plan time, and calculating
 it once for the selected plan should be cheaper than calculating it
 for each append path we consider. 
 The preceding two commits did away with all use of the partitioned_rels
 values; this commit just mechanically removes the fields and the code
 that calculated them. 
 Discussion: https://postgr.es/m/87sg8tqhsl.fsf@aurora.ydns.eu
 Discussion: https://postgr.es/m/CAJKUy5gCXDSmFs2c=R+VGgn7FiYcLCsEFEuDNNLGfoha=pBE_g@mail.gmail.com  
  Tom Lane [Mon, 1 Feb 2021 19:34:59 +0000 (14:34 -0500)]     Remove incidental dependencies on partitioned_rels lists.
  It turns out that the calculation of [Merge]AppendPath.partitioned_rels
 in allpaths.c is faulty and sometimes omits relevant non-leaf partitions,
 allowing an assertion added by commit 
a929e17e5a8 to trigger.  Rather
 than fix that, it seems better to get rid of those fields altogether.
 We don't really need the info until create_plan time, and calculating
 it once for the selected plan should be cheaper than calculating it
 for each append path we consider. 
 This patch undoes a couple of very minor uses of the partitioned_rels
 values. 
 createplan.c was testing for nil-ness to optimize away the preparatory
 work for make_partition_pruneinfo().  That is worth doing if the check
 is nigh free, but it's not worth going to any great lengths to avoid. 
 create_append_path() was testing for nil-ness as part of deciding how
 to set up ParamPathInfo for an AppendPath.  I replaced that with a
 check for the appendrel's parent rel being partitioned.  That's not
 quite the same thing but should cover most cases.  If we note any
 interesting loss of optimizations, we can dumb this down to just
 always use the more expensive method when the parent is a baserel. 
 Discussion: https://postgr.es/m/87sg8tqhsl.fsf@aurora.ydns.eu
 Discussion: https://postgr.es/m/CAJKUy5gCXDSmFs2c=R+VGgn7FiYcLCsEFEuDNNLGfoha=pBE_g@mail.gmail.com  
  Tom Lane [Mon, 1 Feb 2021 19:05:51 +0000 (14:05 -0500)]     Revise make_partition_pruneinfo to not use its partitioned_rels input.
  It turns out that the calculation of [Merge]AppendPath.partitioned_rels
 in allpaths.c is faulty and sometimes omits relevant non-leaf partitions,
 allowing an assertion added by commit 
a929e17e5a8 to trigger.  Rather
 than fix that, it seems better to get rid of those fields altogether.
 We don't really need the info until create_plan time, and calculating
 it once for the selected plan should be cheaper than calculating it
 for each append path we consider. 
 As a first step, teach make_partition_pruneinfo to collect the relevant
 partitioned tables for itself.  It's not hard to do so by traversing
 from child tables up to parents using the AppendRelInfo links. 
 While here, make some minor stylistic improvements; mainly, don't use
 the "Relids" alias for bitmapsets that are not identities of any
 relation considered by the planner.  Try to document the logic better,
 too. 
 No backpatch, as there does not seem to be a live problem before 
a929e17e5a8.  Also no new regression test; the code where the bug
 was will be gone at the end of this patch series, so it seems a
 bit pointless to memorialize the issue. 
 Tom Lane and David Rowley, per reports from Andreas Seltenreich
 and Jaime Casanova. 
 Discussion: https://postgr.es/m/87sg8tqhsl.fsf@aurora.ydns.eu
 Discussion: https://postgr.es/m/CAJKUy5gCXDSmFs2c=R+VGgn7FiYcLCsEFEuDNNLGfoha=pBE_g@mail.gmail.com  
  Peter Eisentraut [Mon, 1 Feb 2021 12:54:59 +0000 (13:54 +0100)]     SEARCH and CYCLE clauses
  This adds the SQL standard feature that adds the SEARCH and CYCLE
 clauses to recursive queries to be able to do produce breadth- or
 depth-first search orders and detect cycles.  These clauses can be
 rewritten into queries using existing syntax, and that is what this
 patch does in the rewriter.  
Reviewed-by: Vik Fearing <vik@postgresfriends.org> Reviewed-by: Pavel Stehule <pavel.stehule@gmail.com> Discussion: https://www.postgresql.org/message-id/flat/
db80ceee-6f97-9b4a-8ee8-
3ba0c58e5be2@2ndquadrant.com  
  Alexander Korotkov [Mon, 1 Feb 2021 11:06:02 +0000 (14:06 +0300)]     Get rid of unnecessary memory allocation in jsonb_subscript_assign()
 
 Current code allocates memory for JsonbValue, but it could be placed locally.
 
 
    Michael Paquier [Mon, 1 Feb 2021 10:19:44 +0000 (19:19 +0900)]     Introduce --with-ssl={openssl} as a configure option
  This is a replacement for the existing --with-openssl, extending the
 logic to make easier the addition of new SSL libraries.  The grammar is
 chosen to be similar to --with-uuid, where multiple values can be
 chosen, with "openssl" as the only supported value for now. 
 The original switch, --with-openssl, is kept for compatibility. 
 Author: Daniel Gustafsson, Michael Paquier 
Reviewed-by: Jacob Champion Discussion: https://postgr.es/m/
FAB21FC8-0F62-434F-AA78-
6BD9336D630A@yesql.se  
  Tom Lane [Mon, 1 Feb 2021 07:03:59 +0000 (02:03 -0500)]     Fix portability issue in new jsonbsubs code.
 
 On machines where sizeof(Datum) > sizeof(Oid) (that is, any 64-bit
 platform), the previous coding would compute a misaligned
 workspace->index pointer if nupper is odd.  Architectures where
 misaligned access is a hard no-no would then fail.  This appears
 to explain why thorntail is unhappy but other buildfarm members
 are not.
 
 
    Alexander Korotkov [Sun, 31 Jan 2021 20:51:06 +0000 (23:51 +0300)]     Throw error when assigning jsonb scalar instead of a composite object
 
 During the jsonb subscripting assignment, the provided path might assume an
 object or an array where the source jsonb has a scalar value.  Initial
 subscripting assignment logic will skip such an update operation with no
 message shown.  This commit makes it throw an error to indicate this type
 of situation.
 
 Discussion: https://postgr.es/m/CA%2Bq6zcV8qvGcDXurwwgUbwACV86Th7G80pnubg42e-p9gsSf%3Dg%40mail.gmail.com
 Discussion: https://postgr.es/m/CA%2Bq6zcX3mdxGCgdThzuySwH-ApyHHM-G4oB1R0fn0j2hZqqkLQ%40mail.gmail.com
 Discussion: https://postgr.es/m/CA%2Bq6zcVDuGBv%3DM0FqBYX8DPebS3F_0KQ6OVFobGJPM507_SZ_w%40mail.gmail.com
 Discussion: https://postgr.es/m/CA%2Bq6zcVovR%2BXY4mfk-7oNk-rF91gH0PebnNfuUjuuDsyHjOcVA%40mail.gmail.com
 Author: Dmitry Dolgov
 Reviewed-by: Tom Lane, Arthur Zakirov, Pavel Stehule, Dian M Fay
 Reviewed-by: Andrew Dunstan, Chapman Flack, Merlin Moncure, Peter Geoghegan
 Reviewed-by: Alvaro Herrera, Jim Nasby, Josh Berkus, Victor Wagner
 Reviewed-by: Aleksander Alekseev, Robert Haas, Oleg Bartunov
 
    Alexander Korotkov [Sun, 31 Jan 2021 20:51:01 +0000 (23:51 +0300)]     Filling array gaps during jsonb subscripting
 
 This commit introduces two new flags for jsonb assignment:
 
 * JB_PATH_FILL_GAPS: Appending array elements on the specified position, gaps
   are filled with nulls (similar to the JavaScript behavior).  This mode also
   instructs to   create the whole path in a jsonb object if some part of the
   path (more than just the last element) is not present.
 
 * JB_PATH_CONSISTENT_POSITION: Assigning keeps array positions consistent by
   preventing prepending of elements.
 
 Both flags are used only in jsonb subscripting assignment.
 
 Initially proposed by Nikita Glukhov based on polymorphic subscripting
 patch, but transformed into an independent change.
 
 Discussion: https://postgr.es/m/CA%2Bq6zcV8qvGcDXurwwgUbwACV86Th7G80pnubg42e-p9gsSf%3Dg%40mail.gmail.com
 Discussion: https://postgr.es/m/CA%2Bq6zcX3mdxGCgdThzuySwH-ApyHHM-G4oB1R0fn0j2hZqqkLQ%40mail.gmail.com
 Discussion: https://postgr.es/m/CA%2Bq6zcVDuGBv%3DM0FqBYX8DPebS3F_0KQ6OVFobGJPM507_SZ_w%40mail.gmail.com
 Discussion: https://postgr.es/m/CA%2Bq6zcVovR%2BXY4mfk-7oNk-rF91gH0PebnNfuUjuuDsyHjOcVA%40mail.gmail.com
 Author: Dmitry Dolgov
 Reviewed-by: Tom Lane, Arthur Zakirov, Pavel Stehule, Dian M Fay
 Reviewed-by: Andrew Dunstan, Chapman Flack, Merlin Moncure, Peter Geoghegan
 Reviewed-by: Alvaro Herrera, Jim Nasby, Josh Berkus, Victor Wagner
 Reviewed-by: Aleksander Alekseev, Robert Haas, Oleg Bartunov
 
    Alexander Korotkov [Sun, 31 Jan 2021 20:50:40 +0000 (23:50 +0300)]     Implementation of subscripting for jsonb
 
 Subscripting for jsonb does not support slices, does not have a limit for the
 number of subscripts, and an assignment expects a replace value to have jsonb
 type.  There is also one functional difference between assignment via
 subscripting and assignment via jsonb_set().  When an original jsonb container
 is NULL, the subscripting replaces it with an empty jsonb and proceeds with
 an assignment.
 
 For the sake of code reuse, we rearrange some parts of jsonb functionality
 to allow the usage of the same functions for jsonb_set and assign subscripting
 operation.
 
 The original idea belongs to Oleg Bartunov.
 
 Catversion is bumped.
 
 Discussion: https://postgr.es/m/CA%2Bq6zcV8qvGcDXurwwgUbwACV86Th7G80pnubg42e-p9gsSf%3Dg%40mail.gmail.com
 Discussion: https://postgr.es/m/CA%2Bq6zcX3mdxGCgdThzuySwH-ApyHHM-G4oB1R0fn0j2hZqqkLQ%40mail.gmail.com
 Discussion: https://postgr.es/m/CA%2Bq6zcVDuGBv%3DM0FqBYX8DPebS3F_0KQ6OVFobGJPM507_SZ_w%40mail.gmail.com
 Discussion: https://postgr.es/m/CA%2Bq6zcVovR%2BXY4mfk-7oNk-rF91gH0PebnNfuUjuuDsyHjOcVA%40mail.gmail.com
 Author: Dmitry Dolgov
 Reviewed-by: Tom Lane, Arthur Zakirov, Pavel Stehule, Dian M Fay
 Reviewed-by: Andrew Dunstan, Chapman Flack, Merlin Moncure, Peter Geoghegan
 Reviewed-by: Alvaro Herrera, Jim Nasby, Josh Berkus, Victor Wagner
 Reviewed-by: Aleksander Alekseev, Robert Haas, Oleg Bartunov
 
    Peter Geoghegan [Sun, 31 Jan 2021 18:10:55 +0000 (10:10 -0800)]     Remove unused _bt_delitems_delete() argument.
  The latestRemovedXid values used by nbtree deletion operations are
 determined by _bt_delitems_delete()'s caller, so there is no reason to
 pass a separate heapRel argument. 
 Oversight in commit 
d168b666823.  
  Alexander Korotkov [Sun, 31 Jan 2021 17:14:29 +0000 (20:14 +0300)]     Fix parsing of complex morphs to tsquery
  When to_tsquery() or websearch_to_tsquery() meet a complex morph containing
 multiple words residing adjacent position, these words are connected
 with OP_AND operator.  That leads to surprising results.  For instace,
 both websearch_to_tsquery('"pg_class pg"') and to_tsquery('pg_class <-> pg')
 produce '( pg & class ) <-> pg' tsquery.  This tsquery requires
 'pg' and 'class' words to reside on the same position and doesn't match
 to to_tsvector('pg_class pg').  It appears to be ridiculous behavior, which
 needs to be fixed. 
 This commit makes to_tsquery() or websearch_to_tsquery() connect words
 residing adjacent position with OP_PHRASE.  Therefore, now those words are
 normally chained with other OP_PHRASE operator.  The examples of above now
 produces 'pg <-> class <-> pg' tsquery, which matches to
 to_tsvector('pg_class pg'). 
 Another effect of this commit is that complex morph word positions now need to
 match the tsvector even if there is no surrounding OP_PHRASE.  This behavior
 change generally looks like an improvement but making this commit not
 backpatchable.  
Reported-by: Barry Pederson Bug: #16592
 Discussion: https://postgr.es/m/16592-
70b110ff9731c07d@postgresql.org
 Discussion: https://postgr.es/m/CAPpHfdv0EzVhf6CWfB1_TTZqXV_2Sn-jSY3zSd7ePH%3D-%2B1V2DQ%40mail.gmail.com
 Author: Alexander Korotkov 
Reviewed-by: Tom Lane, Neil Chen   Peter Eisentraut [Sat, 30 Jan 2021 18:14:31 +0000 (19:14 +0100)]     Add primary keys and unique constraints to system catalogs
  For those system catalogs that have a unique indexes, make a primary
 key and unique constraint, using ALTER TABLE ... PRIMARY KEY/UNIQUE
 USING INDEX. 
 This can be helpful for GUI tools that look for a primary key, and it
 might in the future allow declaring foreign keys, for making schema
 diagrams. 
 The constraint creation statements are automatically created by
 genbki.pl from DECLARE_UNIQUE_INDEX directives.  To specify which one
 of the available unique indexes is the primary key, use the new
 directive DECLARE_UNIQUE_INDEX_PKEY instead.  By convention, we
 usually make a catalog's OID column its primary key, if it has one.  
Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us> Discussion: https://www.postgresql.org/message-id/flat/
dc5f44d9-5ec1-a596-0251-
dadadcdede98@2ndquadrant.com  
  Peter Eisentraut [Sat, 30 Jan 2021 10:05:15 +0000 (11:05 +0100)]     doc: Clarify status of SELECT INTO on reference page
  The documentation as well as source code comments weren't entirely
 clear whether SELECT INTO was truly deprecated (thus in theory
 destined to be removed eventually), or just a less recommended
 variant.  After discussion, it appears that other implementations also
 use SELECT INTO in direct SQL in a way similar to PostgreSQL, so it
 seems worth keeping it for compatibility.  Update the language in the
 documentation to that effect. 
 Discussion: https://www.postgresql.org/message-id/flat/
96dc0df3-e13a-a85d-d045-
d6e2c85218da%40enterprisedb.com  
  Peter Eisentraut [Sat, 30 Jan 2021 08:41:44 +0000 (09:41 +0100)]     Allow GRANTED BY clause in normal GRANT and REVOKE statements
  The SQL standard allows a GRANTED BY clause on GRANT and
 REVOKE (privilege) statements that can specify CURRENT_USER or
 CURRENT_ROLE.  In PostgreSQL, both of these are the default behavior.
 Since we already have all the parsing support for this for the
 GRANT (role) statement, we might as well add basic support for this
 for the privilege variant as well.  This allows us to check off SQL
 feature T332.  In the future, perhaps more interesting things could be
 done with this, too.  
Reviewed-by: Simon Riggs <simon@2ndquadrant.com> Discussion: https://www.postgresql.org/message-id/flat/
f2feac44-b4c5-f38f-3699-
2851d6a76dc9@2ndquadrant.com  
  Noah Misch [Sat, 30 Jan 2021 08:12:18 +0000 (00:12 -0800)]     Revive "snapshot too old" with wal_level=minimal and SET TABLESPACE.
  Given a permanent relation rewritten in the current transaction, the
 old_snapshot_threshold mechanism assumed the relation had never been
 subject to early pruning.  Hence, a query could fail to report "snapshot
 too old" when the rewrite followed an early truncation.  ALTER TABLE SET
 TABLESPACE is probably the only rewrite mechanism capable of exposing
 this bug.  REINDEX sets indcheckxmin, avoiding the problem.  CLUSTER has
 zeroed page LSNs since before old_snapshot_threshold existed, so
 old_snapshot_threshold has never cooperated with it.  ALTER TABLE
 ... SET DATA TYPE makes the table look empty to every past snapshot,
 which is strictly worse.  Back-patch to v13, where commit 
c6b92041d38512a4176ed76ad06f713d2e6c01a8 broke this. 
 Kyotaro Horiguchi and Noah Misch 
 Discussion: https://postgr.es/m/
20210113.160705.
2225256954956139776.horikyota.ntt@gmail.com  
  Noah Misch [Sat, 30 Jan 2021 08:11:38 +0000 (00:11 -0800)]     Fix error with CREATE PUBLICATION, wal_level=minimal, and new tables.
  CREATE PUBLICATION has failed spuriously when applied to a permanent
 relation created or rewritten in the current transaction.  Make the same
 change to another site having the same semantic intent; the second
 instance has no user-visible consequences.  Back-patch to v13, where
 commit 
c6b92041d38512a4176ed76ad06f713d2e6c01a8 broke this. 
 Kyotaro Horiguchi 
 Discussion: https://postgr.es/m/
20210113.160705.
2225256954956139776.horikyota.ntt@gmail.com  
  Noah Misch [Sat, 30 Jan 2021 08:00:27 +0000 (00:00 -0800)]     Fix CREATE INDEX CONCURRENTLY for simultaneous prepared transactions.
  In a cluster having used CREATE INDEX CONCURRENTLY while having enabled
 prepared transactions, queries that use the resulting index can silently
 fail to find rows.  Fix this for future CREATE INDEX CONCURRENTLY by
 making it wait for prepared transactions like it waits for ordinary
 transactions.  This expands the VirtualTransactionId structure domain to
 admit prepared transactions.  It may be necessary to reindex to recover
 from past occurrences.  Back-patch to 9.5 (all supported versions). 
 Andrey Borodin, reviewed (in earlier versions) by Tom Lane and Michael
 Paquier. 
 Discussion: https://postgr.es/m/
2E712143-97F7-4890-B470-
4A35142ABC82@yandex-team.ru  
  Fujii Masao [Sat, 30 Jan 2021 01:12:22 +0000 (10:12 +0900)]     postgres_fdw: Fix tests for  CLOBBER_CACHE_ALWAYS.
  The regression tests added in commits 
708d165ddb and 
411ae64997 caused
 buildfarm failures when  CLOBBER_CACHE_ALWAYS was enabled.
 This commit stabilizes those tests. 
 The foreign server connections established by postgres_fdw behaves
 differently depending on whether CLOBBER_CACHE_ALWAYS is enabled or not.
 If it's not enabled, those connections are cached. On the other hand,
 if it's enabled, when the connections are established outside transaction
 block, they are not cached (i.e., they are immediately closed at the end of
 query that established them). So the subsequent postgres_fdw_get_connections()
 cannot list those connections and postgres_fdw_disconnect() cannot close them
 (because they are already closed). 
 When the connections are established inside transaction block, they are
 cached whether CLOBBER_CACHE_ALWAYS was enabled or not. But if it's enabled,
 they are immediately marked as invalid, otherwise not. This causes the
 subsequent postgres_fdw_get_connections() to return different result in
 "valid" column depending on whether CLOBBER_CACHE_ALWAYS was enabled or not. 
 This commit prevents the above differences of behavior from
 affecting the regression tests. 
 Per buildfarm failure on trilobite. 
 Original patch by Bharath Rupireddy. I (Fujii Masao) extracted
 the regression test fix from that and revised it a bit.  
Reported-by: Tom Lane Author: Bharath Rupireddy 
Reviewed-by: Fujii Masao Discussion: https://postgr.es/m/
2688508.
1611865371@sss.pgh.pa.us  
  Tom Lane [Fri, 29 Jan 2021 15:46:14 +0000 (10:46 -0500)]     Doc: improve cross-references for SET/SHOW.
  The corresponding functions set_config and current_setting were
 mostly not hyperlinked.  Clarify their descriptions a tad, too. 
 Discussion: https://postgr.es/m/
161183356250.4077.
687338658090583892@wrigleys.postgresql.org  
  Alexander Korotkov [Fri, 29 Jan 2021 12:27:55 +0000 (15:27 +0300)]     Document behavior of the .** jsonpath accessor in the lax mode
  When the .** jsonpath accessor handles the array, it selects both array and
 each of its elements.  When using lax mode, subsequent accessors automatically
 unwrap arrays.  So, the content of each array element may be selected twice. 
 Even though this behavior is counterintuitive, it's correct because everything
 works as designed.  This commit documents it. 
 Backpatch to 12 where the jsonpath language was introduced.  
Reported-by: Thomas Kellerer Bug: #16828
 Discussion: https://postgr.es/m/16828-
2b0229babfad2d8c%40postgresql.org
 Discussion: https://postgr.es/m/CAPpHfdtS-nNidT%3DEqZbAYOPcnNOWh_sd6skVdu2CAQUGdvpT8Q%40mail.gmail.com
 Author: Alexandex Korotkov, revised by Tom Lane 
Reviewed-by: Alvaro Herrera, Thomas Kellerer, Tom Lane Backpatch-through: 12  
  Peter Eisentraut [Fri, 29 Jan 2021 08:43:21 +0000 (09:43 +0100)]     Fix typo
 
 
    Michael Paquier [Fri, 29 Jan 2021 05:24:49 +0000 (14:24 +0900)]     doc: Improve wording of section for repslot statistics
  This documentation has been added in 
9868167, so no backpatch is
 needed. 
 Author: Justin Pryzby, Michael Paquier
 Discussion: https://postgr.es/m/
20201222041153.GK30237@telsasoft.com  
  Michael Paquier [Fri, 29 Jan 2021 04:59:18 +0000 (13:59 +0900)]     Adjust comments of CheckRelationTableSpaceMove() and SetRelationTableSpace()
  4c9c359, that introduced those two functions, has been overoptimistic on
 the point that only ShareUpdateExclusiveLock would be required when
 moving a relation to a new tablespace.  AccessExclusiveLock is a
 requirement, but ShareUpdateExclusiveLock may be used under specific
 conditions like REINDEX CONCURRENTLY where waits on past transactions
 make the operation safe even with a lower-level lock.  The current code
 does only the former, so update the existing comments to reflect that. 
 Once a REINDEX (TABLESPACE) is introduced, those comments would require
 an extra refresh to mention their new use case. 
 While on it, fix an incorrect variable name. 
 Per discussion with Álvaro Herrera. 
 Discussion: https://postgr.es/m/
20210127140741.GA14174@alvherre.pgsql  
  Thomas Munro [Fri, 29 Jan 2021 01:16:29 +0000 (14:16 +1300)]     Remove documentation of waiting restore_command.
  Following the removal of pg_standby, also remove the documentation
 section that describes how to write your own "waiting restore_command"
 along the same lines. 
 Discussion: https://postgr.es/m/
20201029024412.GP5380%40telsasoft.com 
Reviewed-by: Michael Paquier <michael@paquier.xyz>   Thomas Munro [Fri, 29 Jan 2021 00:21:53 +0000 (13:21 +1300)]     Retire pg_standby.
  pg_standby was useful more than a decade ago, but now it is obsolete.
 It has been proposed that we retire it many times.  Now seems like a
 good time to finally do it, because "waiting restore commands"
 are incompatible with a proposed recovery prefetching feature. 
 Discussion: https://postgr.es/m/
20201029024412.GP5380%40telsasoft.com
 Author: Justin Pryzby <pryzby@telsasoft.com> 
Reviewed-by: Heikki Linnakangas <hlinnaka@iki.fi> Reviewed-by: Peter Eisentraut <peter.eisentraut@enterprisedb.com> Reviewed-by: Michael Paquier <michael@paquier.xyz> Reviewed-by: Fujii Masao <masao.fujii@oss.nttdata.com>   Tom Lane [Thu, 28 Jan 2021 22:18:23 +0000 (17:18 -0500)]     Silence another gcc 11 warning.
 
 Per buildfarm and local experimentation, bleeding-edge gcc isn't
 convinced that the MemSet in reorder_function_arguments() is safe.
 Shut it up by adding an explicit check that pronargs isn't negative,
 and by changing MemSet to memset.  (It appears that either change is
 enough to quiet the warning at -O2, but let's do both to be sure.)
 
 
    Alvaro Herrera [Thu, 28 Jan 2021 19:56:07 +0000 (16:56 -0300)]     Remove bogus restriction from BEFORE UPDATE triggers
  In trying to protect the user from inconsistent behavior, commit 
487e9861d0cf "Enable BEFORE row-level triggers for partitioned tables"
 tried to prevent BEFORE UPDATE FOR EACH ROW triggers from moving the row
 from one partition to another.  However, it turns out that the
 restriction is wrong in two ways: first, it fails spuriously, preventing
 valid situations from working, as in bug #16794; and second, they don't
 protect from any misbehavior, because tuple routing would cope anyway. 
 Fix by removing that restriction. 
 We keep the same restriction on BEFORE INSERT FOR EACH ROW triggers,
 though.  It is valid and useful there.  In the future we could remove it
 by having tuple reroute work for inserts as it does for updates. 
 Backpatch to 13. 
 Author: Álvaro Herrera <alvherre@alvh.no-ip.org> 
Reported-by: Phillip Menke <pg@pmenke.de> Discussion: https://postgr.es/m/16794-
350a655580fbb9ae@postgresql.org  
  Tom Lane [Thu, 28 Jan 2021 18:41:55 +0000 (13:41 -0500)]     Fix hash partition pruning with asymmetric partition sets.
  perform_pruning_combine_step() was not taught about the number of
 partition indexes used in hash partitioning; more embarrassingly,
 get_matching_hash_bounds() also had it wrong.  These errors are masked
 in the common case where all the partitions have the same modulus
 and no partition is missing.  However, with missing or unequal-size
 partitions, we could erroneously prune some partitions that need
 to be scanned, leading to silently wrong query answers. 
 While a minimal-footprint fix for this could be to export
 get_partition_bound_num_indexes and make the incorrect functions use it,
 I'm of the opinion that that function should never have existed in the
 first place.  It's not reasonable data structure design that
 PartitionBoundInfoData lacks any explicit record of the length of
 its indexes[] array.  Perhaps that was all right when it could always
 be assumed equal to ndatums, but something should have been done about
 it as soon as that stopped being true.  Putting in an explicit
 "nindexes" field makes both partition_bounds_equal() and
 partition_bounds_copy() simpler, safer, and faster than before,
 and removes explicit knowledge of the number-of-partition-indexes
 rules from some other places too. 
 This change also makes get_hash_partition_greatest_modulus obsolete.
 I left that in place in case any external code uses it, but no core
 code does anymore. 
 Per bug #16840 from Michał Albrycht.  Back-patch to v11 where the
 hash partitioning code came in.  (In the back branches, add the new
 field at the end of PartitionBoundInfoData to minimize ABI risks.) 
 Discussion: https://postgr.es/m/16840-
571a22976f829ad4@postgresql.org  
  Tom Lane [Thu, 28 Jan 2021 16:17:13 +0000 (11:17 -0500)]     Make ecpg's rjulmdy() and rmdyjul() agree with their declarations.
  We had "short *mdy" in the extern declarations, but "short mdy[3]"
 in the actual function definitions.  Per C99 these are equivalent,
 but recent versions of gcc have started to issue warnings about
 the inconsistency.  Clean it up before the warnings get any more
 widespread. 
 Back-patch, in case anyone wants to build older PG versions with
 bleeding-edge compilers. 
 Discussion: https://postgr.es/m/
2401575.
1611764534@sss.pgh.pa.us  
  Alvaro Herrera [Thu, 28 Jan 2021 15:50:40 +0000 (12:50 -0300)]     pgbench: Remove dead code
  doConnect() never returns connections in state CONNECTION_BAD, so
 checking for that is pointless.  Remove the code that does. 
 This code has been dead since 
ba708ea3dc84, 20 years ago. 
 Discussion: https://postgr.es/m/
20210126195224.GA20361@alvherre.pgsql 
Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>   Peter Eisentraut [Thu, 28 Jan 2021 13:01:41 +0000 (14:01 +0100)]     Remove gratuitous uses of deprecated SELECT INTO
  CREATE TABLE AS has been preferred over SELECT INTO (outside of ecpg
 and PL/pgSQL) for a long time.  There were still a few uses of SELECT
 INTO in tests and documentation, some old, some more recent.  This
 changes them to CREATE TABLE AS.  Some occurrences in the tests remain
 where they are specifically testing SELECT INTO parsing or similar. 
 Discussion: https://www.postgresql.org/message-id/flat/
96dc0df3-e13a-a85d-d045-
d6e2c85218da%40enterprisedb.com  
  Heikki Linnakangas [Thu, 28 Jan 2021 12:53:03 +0000 (14:53 +0200)]     Add direct conversion routines between EUC_TW and Big5.
  Conversions between EUC_TW and Big5 were previously implemented by
 converting the whole input to MIC first, and then from MIC to the target
 encoding. Implement functions to convert directly between the two. 
 The reason to do this now is that I'm working on a patch that will change
 the conversion function signature so that if the input is invalid, we
 convert as much as we can and return the number of bytes successfully
 converted. That's not possible if we use an intermediary format, because
 if an error happens in the intermediary -> final conversion, we lose track
 of the location of the invalid character in the original input. Avoiding
 the intermediate step makes the conversions faster, too.  
Reviewed-by: John Naylor Discussion: https://www.postgresql.org/message-id/
b9e3167f-f84b-7aa4-5738-
be578a4db924%40iki.fi  
  Heikki Linnakangas [Thu, 28 Jan 2021 12:40:07 +0000 (14:40 +0200)]     Add mbverifystr() functions specific to each encoding.
  This makes pg_verify_mbstr() function faster, by allowing more efficient
 encoding-specific implementations. All the implementations included in
 this commit are pretty naive, they just call the same encoding-specific
 verifychar functions that were used previously, but that already gives a
 performance boost because the tight character-at-a-time loop is simpler.  
Reviewed-by: John Naylor Discussion: https://www.postgresql.org/message-id/
e7861509-3960-538a-9025-
b75a61188e01@iki.fi  
  Andrew Gierth [Thu, 28 Jan 2021 10:53:10 +0000 (10:53 +0000)]     Don't add bailout adjustment for non-strict deserialize calls.
 
 When building aggregate expression steps, strict checks need a bailout
 jump for when a null value is encountered, so there is a list of steps
 that require later adjustment. Adding entries to that list for steps
 that aren't actually strict would be harmless, except that there is an
 Assert which catches them. This leads to spurious errors on asserts
 builds, for data sets that trigger parallel aggregation of an
 aggregate with a non-strict deserialization function (no such
 aggregates exist in the core system).
 
 Repair by not adding the adjustment entry when it's not needed.
 
 Backpatch back to 11 where the code was introduced.
 
 Per a report from Darafei (Komzpa) of the PostGIS project; analysis
 and patch by me.
 
 Discussion: https://postgr.es/m/87mty7peb3.fsf@news-spur.riddles.org.uk
 
 
    Michael Paquier [Thu, 28 Jan 2021 07:22:34 +0000 (16:22 +0900)]     Fix crash of pg_stat_statements_info() without library loaded
  Other code paths are already protected against this case, and _PG_init()
 warns about that in pg_stat_statements.c.  While on it, I have checked
 the other extensions of the tree but did not notice any holes. 
 Oversight in 
9fbc3f3. 
 Author: Jaime Casanova 
Reviewed-by: Julien Rouhaud Discussion: https://postgr.es/m/CAJKUy5gF4=_=qhJ1VX_tSGFfjKHb9BvzhRYWSApJD=Bfwp2SBw@mail.gmail.com  
  Michael Paquier [Thu, 28 Jan 2021 07:13:26 +0000 (16:13 +0900)]     Refactor SQL functions of SHA-2 in cryptohashfuncs.c
 
 The same code pattern was repeated four times when compiling a SHA-2
 hash.  This refactoring has the advantage to issue a compilation warning
 if a new value is added to pg_cryptohash_type, so as anybody doing an
 addition in this area would need to consider if support for a new SQL
 function is needed or not.
 
 Author: Sehrope Sarkuni, Michael Paquier
 Discussion: https://postgr.es/m/YA7DvLRn2xnTgsMc@paquier.xyz
 
 
    Peter Geoghegan [Wed, 27 Jan 2021 23:11:13 +0000 (15:11 -0800)]     Reduce the default value of vacuum_cost_page_miss.
  When commit 
f425b605 introduced cost based vacuum delays back in 2004,
 the defaults reflected then-current trends in hardware, as well as
 certain historical limitations in PostgreSQL.  There have been enormous
 improvements in both areas since that time.  The cost limit GUC defaults
 finally became much more representative of current trends following
 commit 
cbccac37, which decreased autovacuum_vacuum_cost_delay's default
 by 10x for PostgreSQL 12 (it went from 20ms to only 2ms). 
 The relative costs have shifted too.  This should also be accounted for
 by the defaults.  More specifically, the relative importance of avoiding
 dirtying pages within VACUUM has greatly increased, primarily due to
 main memory capacity scaling and trends in flash storage.  Within
 Postgres itself, improvements like sequential access during index
 vacuuming (at least in nbtree and GiST indexes) have also been
 contributing factors. 
 To reflect all this, decrease the default of vacuum_cost_page_miss to 2.
 Since the default of vacuum_cost_page_dirty remains 20, dirtying a page
 is now considered 10x "costlier" than a page miss by default. 
 Author: Peter Geoghegan <pg@bowt.ie>
 Discussion: https://postgr.es/m/CAH2-WzmLPFnkWT8xMjmcsm7YS3+_Qi3iRWAb2+_Bc8UhVyHfuA@mail.gmail.com  
  Robert Haas [Wed, 27 Jan 2021 20:52:34 +0000 (15:52 -0500)]     In TrimCLOG(), don't reset XactCtl->shared->latest_page_number.
  Since the CLOG page number is not recorded directly in the checkpoint
 record, we have to use ShmemVariableCache->nextXid to figure out the
 latest CLOG page number at the start of recovery. However, as recovery
 progresses, replay of CLOG/EXTEND records will update our notion of
 the latest page number, and we should rely on that being accurate
 rather than recomputing the value based on an updated notion of
 nextXid. ShmemVariableCache->nextXid is only an approximation
 during recovery anyway, whereas CLOG/EXTEND records are an
 authoritative representation of how the SLRU has been updated. 
 Commit 
0fcc2decd485a61321a3220d8f76cb108b082009 makes this
 simplification possible, as before that change clog_redo() might
 have injected a bogus value here, and we'd want to get rid of
 that before entering normal running. 
 Patch by me, reviewed by Heikki Linnakangas. 
 Discussion: http://postgr.es/m/CA+TgmoZYig9+AQodhF5sRXuKkJ=RgFDugLr3XX_dz_F-p=TwTg@mail.gmail.com  
  Robert Haas [Wed, 27 Jan 2021 18:07:41 +0000 (13:07 -0500)]     In clog_redo(), don't set XactCtl->shared->latest_page_number.
  The comment is no longer accurate, and hasn't been entirely accurate
 since Hot Standby was introduced. The original idea here was that
 StartupCLOG() wouldn't be called until the end of recovery and
 therefore this value would be uninitialized when this code is reached,
 but Hot Standby made that true only when hot_standby=off, and commit 
1f113abdf87cd085dee3927960bb4f70442b7250 means that this value is now
 always initialized before replay even starts. 
 The original purpose of this code was to bypass the sanity check
 in SimpleLruTruncate(), which will no longer occur: now, if something
 is wrong, that sanity check might trip during recovery. That's
 probably a good thing, because in the current code base
 latest_page_number should always be initialized and therefore we
 expect that the sanity check should pass. If it doesn't, something
 has gone wrong, and complaining about it is appropriate. 
 Patch by me, reviewed by Heikki Linnakangas. 
 Discussion: http://postgr.es/m/CA+TgmoZYig9+AQodhF5sRXuKkJ=RgFDugLr3XX_dz_F-p=TwTg@mail.gmail.com  
  Tom Lane [Wed, 27 Jan 2021 17:50:17 +0000 (12:50 -0500)]     Doc: improve documentation for UNNEST().
  Per a user question, spell out that UNNEST() returns array elements
 in storage order; also provide an example to clarify the behavior for
 multi-dimensional arrays. 
 While here, also clarify the SELECT reference page's description of
 WITH ORDINALITY.  These details were already given in 7.2.1.4, but
 a reference page should not omit details. 
 Back-patch to v13; there's not room in the table in older versions. 
 Discussion: https://postgr.es/m/
FF1FB31F-0507-4F18-9559-
2DE6E07E3B43@gmail.com  
  Robert Haas [Wed, 27 Jan 2021 17:20:46 +0000 (12:20 -0500)]     Move StartupCLOG() calls to just after we initialize ShmemVariableCache.
 
 Previously, the hot_standby=off code path did this at end of recovery,
 while the hot_standby=on code path did it at the beginning of recovery.
 It's better to do this in only one place because (a) it's simpler,
 (b) StartupCLOG() is trivial so trying to postpone the work isn't
 useful, and (c) this will make it possible to simplify some other
 logic.
 
 Patch by me, reviewed by Heikki Linnakangas.
 
 Discussion: http://postgr.es/m/CA+TgmoZYig9+AQodhF5sRXuKkJ=RgFDugLr3XX_dz_F-p=TwTg@mail.gmail.com
 
 
    Peter Geoghegan [Wed, 27 Jan 2021 07:24:37 +0000 (23:24 -0800)]     Fix GiST index deletion assert issue.
  Avoid calling heap_index_delete_tuples() with an empty deltids array to
 avoid an assertion failure. 
 This issue was arguably an oversight in commit 
b5f58cf2, though the
 failing assert itself was added by my recent commit 
d168b666.  No
 backpatch, though, since the oversight is harmless in the back branches. 
 Author: Peter Geoghegan <pg@bowt.ie> 
Reported-By: Jaime Casanova <jcasanov@systemguards.com.ec> Discussion: https://postgr.es/m/CAJKUy5jscES84n3puE=sYngyF+zpb4wv8UMtuLnLPv5z=6yyNw@mail.gmail.com  
  Michael Paquier [Wed, 27 Jan 2021 04:40:33 +0000 (13:40 +0900)]     doc: Remove reference to views for TRUNCATE privilege
  The page about privilege rights mentioned that TRUNCATE could be applied
 to views or even other relation types.  This is confusing as this
 command can be used only on tables and on partitioned tables. 
 Oversight in 
afc4a78.  
Reported-by: Harisai Hari Reviewed-by: Laurenz Albe Discussion: https://postgr.es/m/
161157636877.14625.
15340884663716426087@wrigleys.postgresql.org
 Backpatch-through: 12  
  Michael Paquier [Wed, 27 Jan 2021 02:54:16 +0000 (11:54 +0900)]     Refactor code in tablecmds.c to check and process tablespace moves
 
 Two code paths of tablecmds.c (for relations with storage and without
 storage) use the same logic to check if the move of a relation to a
 new tablespace is allowed or not and to update pg_class.reltablespace
 and pg_class.relfilenode.
 
 A potential TABLESPACE clause for REINDEX, CLUSTER and VACUUM FULL needs
 similar checks to make sure that nothing is moved around in illegal ways
 (no mapped relations, shared relations only in pg_global, no move of
 temp tables owned by other backends).
 
 This reorganizes the existing code of ALTER TABLE so as all this logic
 is controlled by two new routines that can be reused for the other
 commands able to move relations across tablespaces, limiting the number
 of code paths in need of the same protections.  This also removes some
 code that was duplicated for tables with and without storage for ALTER
 TABLE.
 
 Author: Alexey Kondratov, Michael Paquier
 Discussion: https://postgr.es/m/YA+9mAMWYLXJMVPL@paquier.xyz
 
 
    Tom Lane [Tue, 26 Jan 2021 21:37:12 +0000 (16:37 -0500)]     Rethink recently-added SPI interfaces.
  SPI_execute_with_receiver and SPI_cursor_parse_open_with_paramlist are
 new in v14 (cf. commit 
2f48ede08).  Before they can get out the door,
 let's change their APIs to follow the practice recently established by
 SPI_prepare_extended etc: shove all optional arguments into a struct
 that callers are supposed to pre-zero.  The hope is to allow future
 addition of more options without either API breakage or a continuing
 proliferation of new SPI entry points.  With that in mind, choose
 slightly more generic names for them: SPI_execute_extended and
 SPI_cursor_parse_open respectively. 
 Discussion: https://postgr.es/m/CAFj8pRCLPdDAETvR7Po7gC5y_ibkn_-bOzbeJb39WHms01194Q@mail.gmail.com  
  Tom Lane [Tue, 26 Jan 2021 18:58:18 +0000 (13:58 -0500)]     Suppress compiler warnings from commit 
ee895a655. 
 For obscure reasons, some buildfarm members are now generating
 complaints about plpgsql_call_handler's "retval" variable possibly
 being used uninitialized.  It seems no less safe than it was before
 that commit, but these complaints are (mostly?) new.  I trust that
 initializing the variable where it's declared will be enough to
 shut that up. 
 I also notice that some compilers are warning about setjmp clobber
 of the same variable, which is maybe a bit more defensible.  Mark
 it volatile to silence that. 
 Also, rearrange the logic to give procedure_resowner a single
 point of initialization, in hopes of silencing some setjmp-clobber
 warnings about that.  (Marking it volatile would serve too, but
 its sibling variables are depending on single assignment, so let's
 stick with that method.) 
 Discussion: https://postgr.es/m/E1l4F1z-0000cN-Lx@gemulon.postgresql.org  
  Tom Lane [Tue, 26 Jan 2021 18:04:52 +0000 (13:04 -0500)]     Code review for psql's helpSQL() function.
  The loops to identify word boundaries could access past the end of
 the input string.  Likely that would never result in an actual
 crash, but it makes valgrind unhappy. 
 The logic to try different numbers of words didn't work when the
 input has two words but we only have a match to the first, eg
 "\h with select".  (We must "continue" the pass loop, not "break".) 
 The logic to compute nl_count was bizarrely managed, and in at
 least two code paths could end up calling PageOutput with
 nl_count = 0, resulting in failing to paginate output that should
 have been fed to the pager.  Also, in v12 and up, the nl_count
 calculation hadn't been updated to account for the addition of a URL. 
 The PQExpBuffer holding the command syntax details wasn't freed,
 resulting in a session-lifespan memory leak. 
 While here, improve some comments, choose a more descriptive name
 for a variable, fix inconsistent datatype choice for another variable. 
 Per bug #16837 from Alexander Lakhin.  This code is very old,
 so back-patch to all supported branches. 
 Kyotaro Horiguchi and Tom Lane 
 Discussion: https://postgr.es/m/16837-
479bcd56040c71b3@postgresql.org  
  Michael Paquier [Tue, 26 Jan 2021 09:43:01 +0000 (18:43 +0900)]     Fix memory leak when deallocating prepared statement in postgres_fdw
  The leak is minor, so no backpatch is done.  Oversight in 
21734d2.  
Reported-by: Tom Lane   Fujii Masao [Tue, 26 Jan 2021 08:16:52 +0000 (17:16 +0900)]     postgres_fdw: Fix test failure with -DENFORCE_REGRESSION_TEST_NAME_RESTRICTIONS
  The roles created by regression test should have names starting with
 "regress_", and the test introduced in commit 
411ae64997 did not do that. 
 Per buildfarm member longfin. 
 Discussion: https://postgr.es/m/
73fc5ae4-3c54-1262-4533-
f8c547de2e60@oss.nttdata.com  
  Fujii Masao [Tue, 26 Jan 2021 07:36:21 +0000 (16:36 +0900)]     postgres_fdw: Stabilize regression test for postgres_fdw_disconnect_all().
  The regression test added in commit 
411ae64997 caused buildfarm failures.
 The cause of them was that the order of warning messages output in the test
 was not stable. To fix this, this commit sets client_min_messages to ERROR
 temporarily when performing the test generating those warnings. 
 Per buildfarm failures. 
 Discussion: https://postgr.es/m/
2147113.
1611644754@sss.pgh.pa.us  
  Fujii Masao [Mon, 25 Jan 2021 18:54:46 +0000 (03:54 +0900)]     postgres_fdw: Add functions to discard cached connections.
 
 This commit introduces two new functions postgres_fdw_disconnect()
 and postgres_fdw_disconnect_all(). The former function discards
 the cached connections to the specified foreign server. The latter discards
 all the cached connections. If the connection is used in the current
 transaction, it's not closed and a warning message is emitted.
 
 For example, these functions are useful when users want to explicitly
 close the foreign server connections that are no longer necessary and
 then to prevent them from eating up the foreign servers connections
 capacity.
 
 Author: Bharath Rupireddy, tweaked a bit by Fujii Masao
 Reviewed-by: Alexey Kondratov, Zhijie Hou, Zhihong Yu, Fujii Masao
 Discussion: https://postgr.es/m/CALj2ACVvrp5=AVp2PupEm+nAC8S4buqR3fJMmaCoc7ftT0aD2A@mail.gmail.com
 
 
    Tom Lane [Tue, 26 Jan 2021 03:28:29 +0000 (22:28 -0500)]     Improve performance of repeated CALLs within plpgsql procedures.
  This patch essentially is cleaning up technical debt left behind
 by the original implementation of plpgsql procedures, particularly
 commit 
d92bc83c4.  That patch (or more precisely, follow-on patches
 fixing its worst bugs) forced us to re-plan CALL and DO statements
 each time through, if we're in a non-atomic context.  That wasn't
 for any fundamental reason, but just because use of a saved plan
 requires having a ResourceOwner to hold a reference count for the
 plan, and we had no suitable resowner at hand, nor would the
 available APIs support using one if we did.  While it's not that
 expensive to create a "plan" for CALL/DO, the cycles do add up
 in repeated executions. 
 This patch therefore makes the following API changes: 
 * GetCachedPlan/ReleaseCachedPlan are modified to let the caller
 specify which resowner to use to pin the plan, rather than forcing
 use of CurrentResourceOwner. 
 * spi.c gains a "SPI_execute_plan_extended" entry point that lets
 callers say which resowner to use to pin the plan.  This borrows the
 idea of an options struct from the recently added SPI_prepare_extended,
 hopefully allowing future options to be added without more API breaks.
 This supersedes SPI_execute_plan_with_paramlist (which I've marked
 deprecated) as well as SPI_execute_plan_with_receiver (which is new
 in v14, so I just took it out altogether). 
 * I also took the opportunity to remove the crude hack of letting
 plpgsql reach into SPI private data structures to mark SPI plans as
 "no_snapshot".  It's better to treat that as an option of
 SPI_prepare_extended. 
 Now, when running a non-atomic procedure or DO block that contains
 any CALL or DO commands, plpgsql creates a ResourceOwner that
 will be used to pin the plans of the CALL/DO commands.  (In an
 atomic context, we just use CurrentResourceOwner, as before.)
 Having done this, we can just save CALL/DO plans normally,
 whether or not they are used across transaction boundaries.
 This seems to be good for something like 2X speedup of a CALL
 of a trivial procedure with a few simple argument expressions.
 By restricting the creation of an extra ResourceOwner like this,
 there's essentially zero penalty in cases that can't benefit. 
 Pavel Stehule, with some further hacking by me 
 Discussion: https://postgr.es/m/CAFj8pRCLPdDAETvR7Po7gC5y_ibkn_-bOzbeJb39WHms01194Q@mail.gmail.com  
  Andres Freund [Mon, 25 Jan 2021 20:15:10 +0000 (12:15 -0800)]     Fix two typos in snapbuild.c.
  Reported-by: Heikki Linnakangas <hlinnaka@iki.fi> Discussion: https://postgr.es/m/
c94be044-818f-15e3-1ad3-
7a7ae2dfed0a@iki.fi  
  Tom Lane [Mon, 25 Jan 2021 19:53:13 +0000 (14:53 -0500)]     Don't clobber the calling user's credentials cache in Kerberos test.
  Embarrassing oversight in this test script, which fortunately is not
 run by default. 
 Report and patch by Jacob Champion. 
 Discussion: https://postgr.es/m/
1fcb175bafef6560f47a8c31229fa7c938486b8d.camel@vmware.com  
  Tom Lane [Mon, 25 Jan 2021 18:03:11 +0000 (13:03 -0500)]     Fix broken ruleutils support for function TRANSFORM clauses.
  I chanced to notice that this dumped core due to a faulty Assert.
 To add insult to injury, the output has been misformatted since v11.
 Obviously we need some regression testing here. 
 Discussion: https://postgr.es/m/
d1cc628c-3953-4209-957b-
29427acc38c8@www.fastmail.com  
  Robert Haas [Mon, 25 Jan 2021 17:34:00 +0000 (12:34 -0500)]     Remove CheckpointLock.
  Up until now, we've held this lock when performing a checkpoint or
 restartpoint, but commit 
076a055acf3c55314de267c62b03191586d79cf6 back
 in 2004 and commit 
7e48b77b1cebb9a43f9fdd6b17128a0ba36132f9 from 2009,
 taken together, have removed all need for this. In the present code,
 there's only ever one process entitled to attempt a checkpoint: either
 the checkpointer, during normal operation, or the postmaster, during
 single-user operation. So, we don't need the lock. 
 One possible concern in making this change is that it means that
 a substantial amount of code where HOLD_INTERRUPTS() was previously
 in effect due to the preceding LWLockAcquire() will now be
 running without that. This could mean that ProcessInterrupts()
 gets called in places from which it didn't before. However, this
 seems unlikely to do very much, because the checkpointer doesn't
 have any signal mapped to die(), so it's not clear how,
 for example, ProcDiePending = true could happen in the first
 place. Similarly with ClientConnectionLost and recovery conflicts. 
 Also, if there are any such problems, we might want to fix them
 rather than reverting this, since running lots of code with
 interrupt handling suspended is generally bad. 
 Patch by me, per an inquiry by Amul Sul. Review by Tom Lane
 and Michael Paquier. 
 Discussion: http://postgr.es/m/CAAJ_b97XnBBfYeSREDJorFsyoD1sHgqnNuCi=02mNQBUMnA=FA@mail.gmail.com  
  Tom Lane [Mon, 25 Jan 2021 16:20:17 +0000 (11:20 -0500)]     Doc: improve documentation of pg_proc.protrftypes.
  Add a "references" link pointing to pg_type, as we have for other arrays
 of type OIDs.  Wordsmith the explanation a bit. 
 Joel Jacobson, additional editing by me 
 Discussion: https://postgr.es/m/
d1cc628c-3953-4209-957b-
29427acc38c8@www.fastmail.com