== PostgreSQL Weekly News - March 3, 2019 ==
От | David Fetter |
---|---|
Тема | == PostgreSQL Weekly News - March 3, 2019 == |
Дата | |
Msg-id | 20190303214109.GA3279@fetter.org обсуждение исходный текст |
Список | pgsql-announce |
== PostgreSQL Weekly News - March 3, 2019 == == PostgreSQL Jobs for March == http://archives.postgresql.org/pgsql-jobs/2019-03/ == PostgreSQL Local == PostgreSQL@SCaLE is a two day, two track event which takes place on March 7-8, 2019, at Pasadena Convention Center, as part of SCaLE 17X. https://www.socallinuxexpo.org/scale/17x/postgresscale pgDay Paris 2019 will be held in Paris, France on March 12, 2019 at 199bis rue Saint-Martin. http://2019.pgday.paris/ Nordic PGDay 2019 will be held in Copenhagen, Denmark, at the Copenhagen Marriott Hotel, on March 19, 2019. https://2019.nordicpgday.org/ PGConf APAC 2019 will be held in Singapore March 19-21, 2019. http://2019.pgconfapac.org/ The German-speaking PostgreSQL Conference 2019 will take place on May 10, 2019 in Leipzig. http://2019.pgconf.de/ PGDay.IT 2019 will take place May 16th and May 17th in Bologna, Italy. https://2019.pgday.it/en/ PGCon 2019 will take place in Ottawa on May 28-31, 2019. https://www.pgcon.org/2019 Swiss PGDay 2019 will take place in Rapperswil (near Zurich) on June 28, 2019. The CfP is open through April 18, 2019, and registration is open. http://www.pgday.ch/2019/ PostgresLondon 2019 will be July 2-3, 2019 with an optional training day on July 1. The CfP is open at https://goo.gl/forms/hsvZKAmq0c96XQ4l2 through March 15, 2019. http://postgreslondon.org PGConf.Brazil 2019 is on August 1-3 2019 in São Paulo. http://pgconf.com.br == PostgreSQL in the News == Planet PostgreSQL: http://planet.postgresql.org/ PostgreSQL Weekly News is brought to you this week by David Fetter Submit news and announcements by Sunday at 3:00pm PST8PDT to david@fetter.org. == Applied Patches == Thomas Munro pushed: - Fix inconsistent out-of-memory error reporting in dsa.c. Commit 16be2fd1 introduced the flag DSA_ALLOC_NO_OOM to control whether the DSA allocator would raise an error or return InvalidDsaPointer on failure to allocate. One edge case was not handled correctly: if we fail to allocate an internal "span" object for a large allocation, we would always return InvalidDsaPointer regardless of the flag; a caller not expecting that could then dereference a null pointer. This is a plausible explanation for a one-off report of a segfault. Remove a redundant pair of braces so that all three stanzas that handle DSA_ALLOC_NO_OOM match in style, for visual consistency. While fixing inconsistencies, if FreePageManagerGet() can't supply the pages that our book-keeping says it should be able to supply, then we should always report a FATAL error. Previously we treated that as a regular allocation failure in one code path, but as a FATAL condition in another. Back-patch to 10, where dsa.c landed. Author: Thomas Munro Reported-by: Jakub Glapa Discussion: https://postgr.es/m/CAEepm=2oPqXxyWQ-1o60tpOLrwkw=VpgNXqqF1VN2EyO9zKGQw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/29ddb548f683e15429cd5464029c01d83c40bb40 Michaël Paquier pushed: - Make release of 2PC identifier and locks consistent in COMMIT PREPARED. When preparing a transaction in two-phase commit, a dummy PGPROC entry holding the GID used for the transaction is registered, which gets released once COMMIT PREPARED is run. Prior releasing its shared memory state, all the locks taken in the prepared transaction are released using a dedicated set of callbacks (pgstat and multixact having similar callbacks), which may cause the locks to be released before the GID is set free. Hence, there is a small window where lock conflicts could happen, for example: - Transaction A releases its locks, still holding its GID in shared memory. - Transaction B held a lock which conflicted with locks of transaction A. - Transaction B continues its processing, reusing the same GID as transaction A. - Transaction B fails because of a conflicting GID, already in use by transaction A. This commit changes the shared memory state release so as post-commit callbacks and predicate lock cleanup happen consistently with the shared memory state cleanup for the dummy PGPROC entry. The race window is small and 2PC had this issue from the start, so no backpatch is done. On top if that fixes discussed involved ABI breakages, which are not welcome in stable branches. Reported-by: Oleksii Kliukin, Ildar Musin Diagnosed-by: Oleksii Kliukin, Ildar Musin Author: Michael Paquier Reviewed-by: Masahiko Sawada, Oleksii Kliukin Discussion: https://postgr.es/m/BF9B38A4-2BFF-46E8-BA87-A2D00A8047A6@hintbits.com https://git.postgresql.org/pg/commitdiff/effe7d9552dd41fd6119404e39eecd2653cd966c - Simplify some code in pg_rewind when syncing target directory. 9a4059d simplified the flush of target data folder when finishing processing, and could have done a bit more. Discussion: https://postgr.es/m/20190131064759.GA13429@paquier.xyz https://git.postgresql.org/pg/commitdiff/6e52209eb1f830552a5ec220c2bfc3b517535837 - Fix memory leak when inserting tuple at relation creation for CTAS. The leak has been introduced by 763f2ed which has addressed the problem for transient tables, and forgot CREATE TABLE AS which shares a similar logic when receiving a new tuple to store into the newly-created relation. Author: Jeff Janes Discussion: https://postgr.es/m/CAMkU=1xZXtz3mziPEPD2Fubbas4G2RWkZm5HHABtfKVcbu1=Sg@mail.gmail.com https://git.postgresql.org/pg/commitdiff/414a9d3cf34c7aff1c63533df4c40ebb63bd0840 - Fix SCRAM authentication via SSL when mixing versions of OpenSSL. When using a libpq client linked with OpenSSL 1.0.1 or older to connect to a backend linked with OpenSSL 1.0.2 or newer, the server would send SCRAM-SHA-256-PLUS and SCRAM-SHA-256 as valid mechanisms for the SASL exchange, and the client would choose SCRAM-SHA-256-PLUS even if it does not support channel binding, leading to a confusing error. In this case, what the client ought to do is switch to SCRAM-SHA-256 so as the authentication can move on and succeed. So for a SCRAM authentication over SSL, here are all the cases present and how we deal with them using libpq: 1) Server supports channel binding, it sends SCRAM-SHA-256-PLUS and SCRAM-SHA-256 as allowed mechanisms. 1-1) Client supports channel binding, chooses SCRAM-SHA-256-PLUS. 1-2) Client does not support channel binding, chooses SCRAM-SHA-256. 2) Server does not support channel binding, sends SCRAM-SHA-256 as allowed mechanism. 2-1) Client supports channel binding, still it has no choice but to choose SCRAM-SHA-256. 2-2) Client does not support channel binding, it chooses SCRAM-SHA-256. In all these scenarios the connection should succeed, and the one which was handled incorrectly prior this commit is 1-2), causing the connection attempt to fail because client chose SCRAM-SHA-256-PLUS over SCRAM-SHA-256. Reported-by: Hugh Ranalli Diagnosed-by: Peter Eisentraut Author: Michael Paquier Reviewed-by: Peter Eisentraut Discussion: https://postgr.es/m/CAAhbUMO89SqUk-5mMY+OapgWf-twF2NA5sCucbHEzMfGbvcepA@mail.gmail.com Backpatch-through: 11 https://git.postgresql.org/pg/commitdiff/87c346a35ee869e401e736163ec9d21632cc3b0d - Improve documentation of data_sync_retry. Reflecting an updated parameter value requires a server restart, which was not mentioned in the documentation and in postgresql.conf.sample. Reported-by: Thomas Poty Discussion: https://postgr.es/m/15659-0cd812f13027a2d8@postgresql.org https://git.postgresql.org/pg/commitdiff/b3a156858ab03cb5f9c55dedcaf85a6249b3ec64 - Make pg_partition_tree return no rows on unsupported and undefined objects. The function was tweaked so as it returned one row full of NULLs when working on an unsupported relkind or an undefined object as of cc53123, and after discussion with Amit and Álvaro it looks more natural to make it return no rows. Author: Michael Paquier Reviewed-by: Álvaro Herrera, Amit Langote Discussion: https://postgr.es/m/20190227184808.GA17357@alvherre.pgsql https://git.postgresql.org/pg/commitdiff/0f3cdf873e7d81fbf61965e13685595c8a23c322 - Consider only relations part of partition trees in partition functions. This changes the partition functions so as tables and indexes which are not part of partition trees are handled the same way as what is done for undefined objects and unsupported relkinds: pg_partition_tree() returns no rows and pg_partition_root() returns a NULL result. Hence, partitioned tables, partitioned indexes and relations whose flag pg_class.relispartition is set are considered as valid objects to process. Previously, tables and indexes not included in a partition tree were processed the same way as a partition or a partitioned table, which caused the functions to return inconsistent results for inherited tables, especially when inheriting from multiple tables. Reported-by: Álvaro Herrera Author: Amit Langote, Michael Paquier Reviewed-by: Tom Lane Discussion: https://postgr.es/m/20190228193203.GA26151@alvherre.pgsql https://git.postgresql.org/pg/commitdiff/3422955735d9b2623532c60c53cb885c9cb6e3b1 Peter Eisentraut pushed: - Remove unnecessary use of PROCEDURAL. Remove some unnecessary, legacy-looking use of the PROCEDURAL keyword before LANGUAGE. We mostly don't use this anymore, so some of these look a bit old. There is still some use in pg_dump, which is harder to remove because it's baked into the archive format, so I'm not touching that. Discussion: https://www.postgresql.org/message-id/2330919b-62d9-29ac-8de3-58c024fdcb96@2ndquadrant.com https://git.postgresql.org/pg/commitdiff/bc09d5e4cc1813c9af60c4537fe7d70ed1baae11 - psql: Remove obsolete code. The check in create_help.pl for a null end tag (</>) has been obsolete since the conversion from SGML to XML, since XML does not allow that anymore. https://git.postgresql.org/pg/commitdiff/b6926dee0e1304368964e1161bfd60dd4b01b25d - Set cluster_name for PostgresNode.pm instances. This can help identifying test instances more easily at run time, and it also provides some minimal test coverage for the cluster_name feature. Reviewed-by: Euler Taveira <euler@timbira.com.br> Discussion: https://www.postgresql.org/message-id/flat/1257eaee-4874-e791-e83a-46720c72cac7@2ndquadrant.com https://git.postgresql.org/pg/commitdiff/538ecc17c478e87cc3155c2b9cda7a1b1812d767 - Set fallback_application_name for a walreceiver to cluster_name. By default, the fallback_application_name for a physical walreceiver is "walreceiver". This means that multiple standbys cannot be distinguished easily on a primary, for example in pg_stat_activity or synchronous_standby_names. If cluster_name is set, use that for fallback_application_name in the walreceiver. (If it's not set, it remains "walreceiver".) If someone set cluster_name to identify their instance, we might as well use that by default to identify the node remotely as well. It's still possible to specify another application_name in primary_conninfo explicitly. Reviewed-by: Euler Taveira <euler@timbira.com.br> Discussion: https://www.postgresql.org/message-id/flat/1257eaee-4874-e791-e83a-46720c72cac7@2ndquadrant.com https://git.postgresql.org/pg/commitdiff/6ae578a91e653ce3f4cba8cab96ce41e0cc7103f - Remove unused macro. It has never been used as long as hstore has been in the tree. https://git.postgresql.org/pg/commitdiff/da35d14806249c4619b2b5efda061211768a27ce - Update comment. for ff11e7f4b9ae017585c3ba146db7ba39c31f209a https://git.postgresql.org/pg/commitdiff/22c0d52b8dc175fe46ebb6e0ab5b2be35e02be4e - Remove unnecessary unused MATCH PARTIAL code. ri_triggers.c spends a lot of space catering to a not-yet-implemented MATCH PARTIAL option. An actual implementation would probably not use the existing code structure anyway, so let's just simplify this for now. First, have ri_FetchConstraintInfo() check that riinfo->confmatchtype is valid. Then we don't have to repeat that everywhere. In the various referential action functions, we don't need to pay attention to the match type at all right now, so remove all that code. A future MATCH PARTIAL implementation would probably have some conditions added to the present code, but it won't need an entirely separate switch branch in each case. In RI_FKey_fk_upd_check_required(), reorganize the code to make it much simpler. Reviewed-by: Corey Huinker <corey.huinker@gmail.com> Discussion: https://www.postgresql.org/message-id/flat/0ccdd3e1-10b0-dd05-d8a7-183507c11eb1%402ndquadrant.com https://git.postgresql.org/pg/commitdiff/0afdecc1e5d70f86d87fdc125b83ed4b7e3e88dd - Compact for loops. Declare loop variable in for loop, for readability and to save space. Reviewed-by: Corey Huinker <corey.huinker@gmail.com> Discussion: https://www.postgresql.org/message-id/flat/0ccdd3e1-10b0-dd05-d8a7-183507c11eb1%402ndquadrant.com https://git.postgresql.org/pg/commitdiff/554ebf687852d045f0418d3242b978b49f160f44 - Reduce comments. Reduce the vertical space used by comments in ri_triggers.c, making the file longer and more tedious to read than it needs to be. Update some comments to use a more common style. Reviewed-by: Corey Huinker <corey.huinker@gmail.com> Discussion: https://www.postgresql.org/message-id/flat/0ccdd3e1-10b0-dd05-d8a7-183507c11eb1%402ndquadrant.com https://git.postgresql.org/pg/commitdiff/05d604718f7fec7db33548374ecde3f11916ec15 - Clean up some variable names in ri_triggers.c. There was a mix of old_slot/oldslot, new_slot/newslot. Since we've changed everything from row to slot, we might as well take this opportunity to clean this up. Also update some more comments for the slot change. https://git.postgresql.org/pg/commitdiff/0a271df705c98c1cc617078ebd069cf080fa5a16 - Merge near-duplicate code in RI triggers. Merge ri_setnull and ri_setdefault into one function ri_set. These functions were to a large part identical. This is a continuation in spirit of 4797f9b519995ceca5d6b8550b5caa2ff6d19347. Author: Corey Huinker <corey.huinker@gmail.com> Discussion: https://www.postgresql.org/message-id/flat/0ccdd3e1-10b0-dd05-d8a7-183507c11eb1%402ndquadrant.com https://git.postgresql.org/pg/commitdiff/3f61999cc9da68890174dd8cf97f2cb96b223e81 - Fix whitespace. https://git.postgresql.org/pg/commitdiff/aad21d4c3cd84e7c2a28d239048d2e2f494be47e Peter Geoghegan pushed: - Correct obsolete nbtree page deletion comment. Commit efada2b8e92, which made the nbtree page deletion algorithm more robust, removed _bt_getstackbuf() calls from _bt_pagedel(). It failed to update a comment that referenced the earlier approach. Update the comment to explain that the _bt_getstackbuf() page deletion call site mirrors the only other remaining _bt_getstackbuf() call site, which is reached during page splits. https://git.postgresql.org/pg/commitdiff/067786cea0f150ccf9350abb9a5ac3e4ad328804 - Remove unneeded argument from _bt_getstackbuf(). _bt_getstackbuf() is called at exactly two points following commit efada2b8e92 (one call site is concerned with page splits, while the other is concerned with page deletion). The parent buffer returned by _bt_getstackbuf() is write-locked in both cases. Remove the 'access' argument and make _bt_getstackbuf() assume that callers require a write-lock. https://git.postgresql.org/pg/commitdiff/2ab23445bc6af517bddb40d8429146d8ff8d7ff4 Michael Meskes pushed: - Hopefully fixing memory handling issues in ecpglib that Coverity found. https://git.postgresql.org/pg/commitdiff/0cc0507940c1cf4153fc25c8f6f4f75adada86d0 - Free memory in ecpg bytea regression test. While not really a problem it's easier to run tools like valgrind against it when fixed. https://git.postgresql.org/pg/commitdiff/42ccbe4351e4c0b1ad1684323c2fea79c86ae573 Robert Haas pushed: - Change lock acquisition order in expand_inherited_rtentry. Previously, this function acquired locks in the order using find_all_inheritors(), which locks the children of each table that it processes in ascending OID order, and which processes the inheritance hierarchy as a whole in a breadth-first fashion. Now, it processes the inheritance hierarchy in a depth-first fashion, and at each level it proceeds in the order in which tables appear in the PartitionDesc. If table inheritance rather than table partitioning is used, the old order is preserved. This change moves the locking of any given partition much closer to the code that actually expands that partition. This seems essential if we ever want to allow concurrent DDL to add or remove partitions, because if the set of partitions can change, we must use the same data to decide which partitions to lock as we do to decide which partitions to expand; otherwise, we might expand a partition that we haven't locked. It should hopefully also facilitate efforts to postpone inheritance expansion or locking for performance reasons, because there's really no way to postpone locking some partitions if we're blindly locking them all using find_all_inheritors(). The only downside of this change which is known to me is that it further deviates from the principle that we should always lock the inheritance hierarchy in find_all_inheritors() order to avoid deadlock risk. However, we've already crossed that bridge in commit 9eefba181f7782d27d85d7e94e6028371e7ab2d7 and there are futher patches pending that make similar changes, so this isn't really giving up anything that we haven't surrendered already -- and it seems entirely worth it, given the performance benefits some of those changes seem likely to bring. Patch by me; thanks to David Rowley for discussion of these issues. Discussion: http://postgr.es/m/CAKJS1f_eEYVEq5tM8sm1k-HOwG0AyCPwX54XG9x4w0zy_N4Q_Q@mail.gmail.com Discussion: http://postgr.es/m/CA+TgmoZUwPf_uanjF==gTGBMJrn8uCq52XYvAEorNkLrUdoawg@mail.gmail.com https://git.postgresql.org/pg/commitdiff/f4b6341d5fcb627d51b3fc89527aa5eaa659fb2e Andres Freund pushed: - Add ExecStorePinnedBufferHeapTuple. This allows to avoid an unnecessary pin/unpin cycle when storing a tuple in an already pinned buffer into a slot, when the pin isn't further needed at the call site. Only a single caller for now (to ensure coverage), but upcoming patches will increase use of the new function. Author: Andres Freund Discussion: https://postgr.es/m/20180703070645.wchpu5muyto5n647@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/8aa02b52db11039925191912eca71e3584b68860 - Allow to use HeapTupleData embedded in [Buffer]HeapTupleTableSlot. That avoids having to care about the lifetime of the HeapTupleHeaderData passed to ExecStore[Buffer]HeapTuple(). That doesn't make a huge difference for a plain HeapTupleTableSlot, but for BufferHeapTupleTableSlot it can be a significant advantage, avoiding the need to materialize slots where it's inconvenient to provide a HeapTupleData with appropriate lifetime to point to the on-disk tuple. It's quite possible that we'll want to add support functions for constructing HeapTuples using that embedded HeapTupleData, but for now callers do so themselves. Author: Andres Freund Discussion: https://postgr.es/m/20180703070645.wchpu5muyto5n647@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/5408e233f0667478e7f2a3e4b914e14217e20729 - Store table oid and tuple's tid in tuple slots directly. After the introduction of tuple table slots all table AMs need to support returning the table oid of the tuple stored in a slot created by said AM. It does not make sense to re-implement that in every AM, therefore move handling of table OIDs into the TupleTableSlot structure itself. It's possible that we, at a later date, might want to get rid of HeapTupleData.t_tableOid entirely, but doing so before the abstractions for table AMs are integrated turns out to be too hard, so delay that for now. Similarly, every AM needs to support the concept of a tuple identifier (tid / item pointer) for its tuples. It's quite possible that we'll generalize the exact form of a tid at a future point (to allow for things like index organized tables), but for now many parts of the code know about tids, so there's not much point in abstracting tids away. Therefore also move into slot (rather than providing API to set/get the tid associated with the tuple in a slot). Once table AM includes insert/updating/deleting tuples, the responsibility to set the correct tid after such an action will move into that. After that change, code doing such modifications, should not have to deal with HeapTuples directly anymore. Author: Andres Freund, Haribabu Kommi and Ashutosh Bapat Discussion: https://postgr.es/m/20180703070645.wchpu5muyto5n647@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/b8d71745eac0a12740a70dc78cbcdedadade37f8 - Use slots in trigger infrastructure, except for the actual invocation. In preparation for abstracting table storage, convert trigger.c to track tuples in slots. Which also happens to make code calling triggers simpler. As the calling interface for triggers themselves is not changed in this patch, HeapTuples still are extracted from the slot at that time. But that's handled solely inside trigger.c, not visible to callers. It's quite likely that we'll want to revise the external trigger interface, but that's a separate large project. As part of this work the slots used for old/new/return tuples are moved from EState into ResultRelInfo, as different updated tables might need different slots. The slots are now also now created on-demand, which is good both from an efficiency POV, but also makes the modifying code simpler. Author: Andres Freund, Amit Khandekar and Ashutosh Bapat Discussion: https://postgr.es/m/20180703070645.wchpu5muyto5n647@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/ff11e7f4b9ae017585c3ba146db7ba39c31f209a - Initialize variable to silence compiler warning. After ff11e7f4b9ae Tom's compiler warns about accessing a potentially uninitialized rInfo. That's not actually possible, but it's understandable the compiler would get this wrong. NULL initialize too. Reported-By: Tom Lane Discussion: https://postgr.es/m/11199.1551285318@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/5963b29e03d9b93011acb3954ccc3565d217acc3 - Allow buffer tuple table slots to materialize after ExecStoreVirtualTuple(). While not common, it can be useful to store a virtual tuple into a buffer tuple table slot, and then materialize that slot. So far we've asserted out, which surprisingly wasn't a problem for anything in core. But that seems fragile, and it also breaks redis_fdw after ff11e7f4b9. Thus, allow materializing a virtual tuple stored in a buffer tuple table slot. Author: Andres Freund Discussion: https://postgr.es/m/20190227181621.xholonj7ff7ohxsg@alap3.anarazel.de https://postgr.es/m/20180703070645.wchpu5muyto5n647@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/f414abd62da7aa3cfd75e9047affd94c029c7c04 - Don't superfluously materialize slot after DELETE from an FDW. Previously that was needed to safely store the table oid, but after b8d71745eac0a127 that's not necessary anymore. Author: Andres Freund https://git.postgresql.org/pg/commitdiff/253655116bb437d649203a5a87105e885e4b08f9 - Don't force materializing when copying a buffer tuple table slot. After 5408e233f0667478 it's not necessary to force materializing the target slot when copying from one buffer slot to another. Previously that was required because the HeapTupleData portion of the source slot wasn't guaranteed to stay valid long enough, but now we can simply copy that part into the destination slot's tupdata. Author: Andres Freund https://git.postgresql.org/pg/commitdiff/8f0577386e68c3b1c83a07b95756e5ee3f4ae73f - Store tuples for EvalPlanQual in slots, rather than as HeapTuples. For the upcoming pluggable table access methods it's quite inconvenient to store tuples as HeapTuples, as that'd require converting tuples from a their native format into HeapTuples. Instead use slots to manage epq tuples. To fit into that scheme, change the foreign data wrapper callback RefetchForeignRow, to store the tuple in a slot. Insist on using the caller provided slot, so it conveniently can be stored in the corresponding EPQ slot. As there is no in core user of RefetchForeignRow, that change was done blindly, but we plan to test that soon. To avoid duplicating that work for row locks, move row locks to just directly use the EPQ slots - it previously temporarily stored tuples in LockRowsState.lr_curtuples, but that doesn't seem beneficial, given we'd possibly end up with a significant number of additional slots. The behaviour of es_epqTupleSet[rti -1] is now checked by es_epqTupleSlot[rti -1] != NULL, as that is distinguishable from a slot containing an empty tuple. Author: Andres Freund, Haribabu Kommi, Ashutosh Bapat Discussion: https://postgr.es/m/20180703070645.wchpu5muyto5n647@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/ad0bda5d24ea2bcc72b5e50020e3c79bab10836b - Use a virtual rather than a heap slot in two places where that suffices. Author: Andres Freund Discussion: https://postgr.es/m/20180703070645.wchpu5muyto5n647@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/70b9bda65f8174e24eef5d8967705485a314a82e Tom Lane pushed: - Standardize some more loops that chase down parallel lists. We have forboth() and forthree() macros that simplify iterating through several parallel lists, but not everyplace that could reasonably use those was doing so. Also invent forfour() and forfive() macros to do the same for four or five parallel lists, and use those where applicable. The immediate motivation for doing this is to reduce the number of ad-hoc lnext() calls, to reduce the footprint of a WIP patch. However, it seems like good cleanup and error-proofing anyway; the places that were combining forthree() with a manually iterated loop seem particularly illegible and bug-prone. There was some speculation about restructuring related parsetree representations to reduce the need for parallel list chasing of this sort. Perhaps that's a win, or perhaps not, but in any case it would be considerably more invasive than this patch; and it's not particularly related to my immediate goal of improving the List infrastructure. So I'll leave that question for another day. Patch by me; thanks to David Rowley for review. Discussion: https://postgr.es/m/11587.1550975080@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/c94fb8e8acc05c4b5f9f5b2a595ce7930827c2be - Teach optimizer's predtest.c more things about ScalarArrayOpExpr. In particular, make it possible to prove/refute "x IS NULL" and "x IS NOT NULL" predicates from a clause involving a ScalarArrayOpExpr even when we are unable or unwilling to deconstruct the expression into an AND/OR tree. This avoids a former unexpected degradation of plan quality when the size of an ARRAY[] expression or array constant exceeded the arbitrary MAX_SAOP_ARRAY_SIZE limit. For IS-NULL proofs, we don't really care about the values of the individual array elements; at most, we care whether there are any, and for some common cases we needn't even know that. The main user-visible effect of this is to let the optimizer recognize applicability of partial indexes with "x IS NOT NULL" predicates to queries with "x IN (array)" clauses in some cases where it previously failed to recognize that. The structure of predtest.c is such that a bunch of related proofs will now also succeed, but they're probably much less useful in the wild. James Coleman, reviewed by David Rowley Discussion: https://postgr.es/m/CAAaqYe8yKSvzbyu8w-dThRs9aTFMwrFxn_BkTYeXgjqe3CbNjg@mail.gmail.com https://git.postgresql.org/pg/commitdiff/65ce07e0202f2ef0953be9d085d3e5df7ad353a4 - Check we don't misoptimize a NOT IN where the subquery returns no rows. Future-proofing against a common mistake in attempts to optimize NOT IN. We don't have such an optimization right now, but attempts to do so are in the works, and some of 'em are buggy. Add a regression test case covering the point. David Rowley Discussion: https://postgr.es/m/CAKJS1f90E9agVZryVyUpbHQbjTt5ExqS2Fsodmt5_A7E_cEyVA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/3396138a6de329fa7b5e0dda79219b4ae82622dc Álvaro Herrera pushed: - pg_dump: Fix ArchiveEntry handling of some empty values. Commit f831d4acc changed what pg_dump emits for some empty fields: they were output as empty strings before, NULL pointer afterwards. That makes old pg_restore unable to work (crash) with such files, which is unacceptable. Return to the original representation by explicitly setting those struct members to "" where needed; remove some no longer needed checks for NULL input. We can declutter the code a little by returning to NULLs when we next update the archive version, so add a note to remind us later. Discussion: https://postgr.es/m/20190225074539.az6j3u464cvsoxh6@depesz.com Reported-by: hubert depesz lubaczewski Author: Dmitry Dolgov https://git.postgresql.org/pg/commitdiff/19455c9f5606072a191962271c35ad659fbab526 - Improve docs for ALTER TABLE .. SET TABLESPACE. Discussion: https://postgr.es/m/20190220173815.GA7959@alvherre.pgsql Reviewed-by: Robert Haas https://git.postgresql.org/pg/commitdiff/2c31825fb9a95914418f1e376917f60841a26c78 Joe Conway pushed: - Make get_controlfile not leak file descriptors. When backend functions were added to expose controldata via SQL, reading of pg_control was consolidated under src/common so that both frontend and backend could share the same code. That move from frontend-only to shared frontend-backend failed to recognize the risk (and coding standards violation) of using a bare open(). In particular, it risked leaking file descriptors if transient errors occurred while reading the file. Fix that by using OpenTransientFile() instead in the backend case, which is purpose-built for this type of usage. Since there have been no complaints from the field, and an intermittent failure low risk, no backpatch. Hard failure would of course be bad, but in that case these functions are probably the least of your worries. Author: Joe Conway Reviewed-By: Michael Paquier Reported by: Michael Paquier Discussion: https://postgr.es/m/20190227074728.GA15710@paquier.xyz https://git.postgresql.org/pg/commitdiff/4598a99cf22de0dbab975d9c87ce16fd53146aca Amit Kapila pushed: - Clear the local map when not used. After commit b0eaa4c51b, we use a local map of pages to find the required space for small relations. We do clear this map when we have found a block with enough free space, when we extend the relation, or on transaction abort so that it can be used next time. However, we miss to clear it when we didn't find any pages to try from the map which leads to an assertion failure when we later tried to use it after relation extension. In the passing, I have improved some comments in this area. Reported-by: Tom Lane based on buildfarm results Author: Amit Kapila Reviewed-by: John Naylor Tested-by: Kuntal Ghosh Discussion: https://postgr.es/m/32368.1551114120@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/9c32e4c35026bd52aaf340bfe7594abc653e42f0 Andrew Dunstan pushed: - Add --exclude-database option to pg_dumpall. This option functions similarly to pg_dump's --exclude-table option, but for database names. The option can be given once, and the argument can be a pattern including wildcard characters. Author: Andrew Dunstan. Reviewd-by: Fabien Coelho and Michael Paquier Discussion: https://postgr.es/m/43a54a47-4aa7-c70e-9ca6-648f436dd6e6@2ndQuadrant.com https://git.postgresql.org/pg/commitdiff/f092de0503cd77a8463e7089c249d5e0586a120b - Add extra descriptive headings in pg_dumpall. Headings are added for the User Configurations and Databases sections, and for each user configuration and database in the output. Author: Fabien Coelho Discussion: https://postgr.es/m/alpine.DEB.2.21.1812272222130.32444@lancre https://git.postgresql.org/pg/commitdiff/6cbdbd9e8d8f2986fde44f2431ed8d0c8fce7f5d - Remove tests for pg_dumpall --exclude-database missing argument. It turns out that different getopt implementations spell the error for missing arguments different ways. This test is of fairly marginal value, so instead of trying to keep up with the different error messages just remove the test. https://git.postgresql.org/pg/commitdiff/97b6f2eb759ce898ad632fd7b5db29f542b93454 - Avoid accidental wildcard expansion in msys shell. Commit f092de05 added a test for pg_dumpall --exclude-database including the wildcard pattern '*dump*' which matches some files in the source directory. The test library on msys uses the shell which expands this and thus the program gets incorrect arguments. This doesn't happen if the pattern doesn't match any files, so here the pattern is set to '*dump_test*' which is such a pattern. Per buildfarm animal jacana. https://git.postgresql.org/pg/commitdiff/78b408a20a5a19486f0ed833466d0de342c7e471 Dean Rasheed pushed: - Further fixing for multi-row VALUES lists for updatable views. Previously, rewriteTargetListIU() generated a list of attribute numbers from the targetlist, which were passed to rewriteValuesRTE(), which expected them to contain the same number of entries as there are columns in the VALUES RTE, and to be in the same order. That was fine when the target relation was a table, but for an updatable view it could be broken in at least three different ways --- rewriteTargetListIU() could insert additional targetlist entries for view columns with defaults, the view columns could be in a different order from the columns of the underlying base relation, and targetlist entries could be merged together when assigning to elements of an array or composite type. As a result, when recursing to the base relation, the list of attribute numbers generated from the rewritten targetlist could no longer be relied upon to match the columns of the VALUES RTE. We got away with that prior to 41531e42d3 because it used to always be the case that rewriteValuesRTE() did nothing for the underlying base relation, since all DEFAULTS had already been replaced when it was initially invoked for the view, but that was incorrect because it failed to apply defaults from the base relation. Fix this by examining the targetlist entries more carefully and picking out just those that are simple Vars referencing the VALUES RTE. That's sufficient for the purposes of rewriteValuesRTE(), which is only responsible for dealing with DEFAULT items in the VALUES RTE. Any DEFAULT item in the VALUES RTE that doesn't have a matching simple-Var-assignment in the targetlist is an error which we complain about, but in theory that ought to be impossible. Additionally, move this code into rewriteValuesRTE() to give a clearer separation of concerns between the 2 functions. There is no need for rewriteTargetListIU() to know about the details of the VALUES RTE. While at it, fix the comment for rewriteValuesRTE() which claimed that it doesn't support array element and field assignments --- that hasn't been true since a3c7a993d5 (9.6 and later). Back-patch to all supported versions, with minor differences for the pre-9.6 branches, which don't support array element and field assignments to the same column in multi-row VALUES lists. Reviewed by Amit Langote. Discussion: https://postgr.es/m/15623-5d67a46788ec8b7f@postgresql.org https://git.postgresql.org/pg/commitdiff/ed4653db8ca7a70ba7a4d329a44812893f8e59c2 == Pending Patches == Masahiko Sawada sent in another revision of a patch to add a function to copy replication slots. Peter Eisentraut sent in a patch to remove volatile from latch API. Etsuro Fujita sent in another revision of a patch to fix another oddity in costing aggregate pushdown paths. Kyotaro HORIGUCHI sent in another revision of a patch to move the temporary storage used by the stats collector from files to shared memory. Mike Palmiotto sent in a patch to change StartChildProcess to take a struct with data for forking/execing each different process. David Rowley sent in a patch to increase the default vacuum_cost_limit from 200 to 2000. Peter Eisentraut sent in another revision of a patch to implement GENERATED columns in two flavors: virtual (generated at query time) and stored. Peter Eisentraut sent in two more revisions of a patch to psql to add a documentation URL to the \help output. Mike Palmiotto sent in two revisions of a patch to add a "partition pruning" hook. Takeshi Ideriha sent in a patch to protect syscache from bloating with negative cache entries. Konstantin Knizhnik and Michaël Paquier traded patches to fix the readdir implementation on Windows. Takayuki Tsunakawa sent in two more revisions of a patch to disable vacuum truncation. Nagaura Ryohei sent in five more revisions of a patch to add TCP timeout parameters. Haribabu Kommi sent in a patch to move the current_logfiles file into log_directory. Andrew Gierth sent in a patch to ensure that JIT works on FreeBSD/ARMv7. Aleksey Kondratov sent in a patch to remove some redundant tests from portalmem.c. Noah Misch sent in a patch to make it possible to change a column's type from timestamp to timestamptz without a full-table rewrite. Michael Banck sent in another revision of a patch to make it possible to enable page checksums offline. Thomas Munro sent in a patch to report bgworker launch failure during smart shutdown. Álvaro Herrera sent in two more revisions of a patch to create a function pg_partition_ancestors() and use same to display foreign key relationships in psql for partitioned tables. Simon Riggs sent in two revisions of a patch to replace the hard-wired value of 10 in pgbench with a MAX_ARGS parameter. Robert Haas sent in two more revisions of a patch to implement ATTACH/DETACH PARTITION CONCURRENTLY. Amit Kapila sent in three revisions of a patch to ensure that when a block is not obtained from the local map, it is cleared. Etsuro Fujita sent in a patch to fix an oddity with parallel safety test for scan/join target in grouping_planner. Peter Geoghegan sent in another revision of a patch to make all nbtree entries unique by having heap TIDs participate in comparisons. Justin Pryzby sent in another revision of a patch to avoid repetitive log of PREPARE during EXECUTE of prepared statements. Haribabu Kommi sent in another revision of a patch to add libpq support to connect to standby server as priority. Dean Rasheed sent in a patch to fix an inconsistent use of default for updatable view. Etsuro Fujita sent in a patch to remove some unneeded parallel safety tests from grouping_planner. Shawn Debnath sent in another revision of a patch to refactor the fsync mechanism to support future SMGR implementations. David Rowley and Tom Lane traded patches to turn use arrays instead of the List structure. Álvaro Herrera sent in another revision of a patch to take advantage of CoW filesystems for WAL. Alexander Kuzmenkov sent in another revision of a patch to remove unneeded self-joins. Ildus Kurbangaliev sent in another revision of a patch to make it possible to use custom compression methods. Antonin Houska sent in another revision of a patch to enable aggregate pushdown. Joe Conway sent in a patch to allow for redacting all client messages for functions marked as leakproof. Jeff Janes sent in another revision of a patch to fix the costing for Bloom indexes. Peter Moser sent in another revision of a patch to implement temporal queries using range types. Takamichi Osumi sent in a patch to implement CREATE OR REPLACE TRIGGER. David Steele sent in two revisions of a patch to add exclusive backup deprecation notes to documentation. Álvaro Herrera sent in another revision of a patch to make it possible for partitioned tables to be referenced by foreign keys. Surafel Temesgen sent in two more revisions of a patch to implement FETCH FIRST ... PERCENT. Masahiko Sawada sent in another revision of a patch to add a DISABLE_INDEX_CLEANUP option to VACUUM and a corresponding --disable-index-cleanup option to vacuumdb. Thomas Munro sent in a patch to drop the "smgr" type. Tomáš Vondra and David Rowley traded patches to implement multivariate MCV lists and histograms. Christoph Berg and Tom Lane traded patches to fix an issue which manifested as errors mentioning incomplete startup packets. Nikita Glukhov sent in another revision of a patch to add the SQL/JSON functions. Nikita Glukhov sent in a patch to fix some memory leaks and mistaken error handling in jsonb_plpython. Kyotaro HORIGUCHI sent in another revision of a patch to prevent syscache from bloating with negative cache entries. David Rowley sent in another revision of a patch to make ALTER TABLE ... SET NOT NULL operate by constraints alone. Michael Meskes sent in a patch to make PREPARE work in ECPG. Amit Langote sent in another revision of a patch to speed up planning with partitions. Etsuro Fujita sent in a patch to revive the modify_in_place parameter to apply_scanjoin_target_to_paths. Nikita Glukhov sent in another revision of a patch to implement JSON_TABLE. Adrien Nayrat sent in another revision of a patch to make it possible to log a sample of transactions. Tatsuro Yamada sent in another revision of a patch to implement a progress monitor for CLUSTER. Michael Banck and Fabien COELHO traded patches to make it possible to enable page checksums online. Nikita Glukhov and Alexander Korotkov traded patches to implement jsonpath. Sergei Kornilov sent in another revision of a patch to refactor WaitForWALToBecomeAvailable to gracefully restart source. Fabien COELHO sent in another revision of a patch to pgbench to add a pseudo-random permutation function. David Rowley sent in two more revisions of a patch to turn some NOT IN queries into antijoins. Pavel Stěhule sent in another revision of a patch to implement schema variables.
В списке pgsql-announce по дате отправления:
Предыдущее
От: Stephen FrostДата:
Сообщение: PostgreSQL Participates in Google Summer of Code 2019!