|From:||David Fetter <david(at)fetter(dot)org>|
|To:||PostgreSQL Announce <pgsql-announce(at)postgresql(dot)org>|
|Subject:||== PostgreSQL Weekly News - January 07 2018 ==|
|Views:||Raw Message | Whole Thread | Download mbox|
== PostgreSQL Weekly News - January 07 2018 ==
== PostgreSQL Product News ==
Buildfarm 6.1 software, a continuous integration system for the PostgreSQL
== PostgreSQL Jobs for January ==
== PostgreSQL Local ==
FOSDEM PGDay 2018, a one day conference held before the main FOSDEM event will
be held in Brussels, Belgium, on Feb 2nd, 2018.
Prague PostgreSQL Developer Day 2018 (P2D2 2018) is a two-day
conference that will be held on February 14-15 2018 in Prague, Czech Republic.
PGConf India 2018 will be on February 22-23, 2018 in Bengaluru, Karnataka.
PostgreSQL(at)SCaLE is a two day, two track event which takes place on
March 8-9, 2018, at Pasadena Convention Center, as part of SCaLE 16X.
Nordic PGDay 2018 will be held in Oslo, Norway, at the Radisson Blu Hotel
Nydalen, on March 13, 2018. The CfP is open through December 31, 2017 at
pgDay Paris 2018 will be held in Paris, France at the Espace Saint-Martin, on
March 15 2018. The CfP is open until December 31, 2017.
PGConf APAC 2018 will be held in Singapore March 22-23, 2018.
The German-speaking PostgreSQL Conference 2018 will take place on April 13th,
2018 in Berlin. The CfP is open until January 09, 2018 at
http://2018.pgconf.de/de/callforpapers.html and the conference site is at
PGConfNepal 2018 will be held May 4-5, 2018 at Kathmandu University, Dhulikhel,
Nepal. The CfP is open until 2018-02-01 at
PGConf.Brazil 2018 will take place in São Paulo, Brazil on August 3-4 2018. The
CfP will open soon.
== 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 EST5EDT. Please send English
language ones to david(at)fetter(dot)org, German language to pwn(at)pgug(dot)de, Italian
language to pwn(at)itpug(dot)org(dot)
== Applied Patches ==
Tom Lane pushed:
- Merge coding of return/exit/continue cases in plpgsql's loop statements.
plpgsql's five different loop control statements contained three distinct
implementations of the same (or what ought to be the same, at least) logic for
handling return/exit/continue result codes from their child statements. At
best, that's trouble waiting to happen, and there seems no very good reason
for the coding to be so different. Refactor so that all the common logic is
expressed in a single macro. Discussion:
- Improve regression tests' code coverage for plpgsql control structures. I
noticed that our code coverage report showed considerable deficiency in test
coverage for PL/pgSQL control statements. Notably, both exec_stmt_block and
most of the loop control statements had very poor coverage of handling of
return/exit/continue result codes from their child statements; and
exec_stmt_fori was seriously lacking in feature coverage, having no test that
exercised its BY or REVERSE features, nor verification that its overflow
defenses work. Now that we have some infrastructure for plpgsql-specific test
scripts, the natural thing to do is make a new script rather than further
extend plpgsql.sql. So I created a new script plpgsql_control.sql with the
charter to test plpgsql control structures, and moved a few existing tests
there because they fell entirely under that charter. I then added new test
cases that exercise the bits of code complained of above. Of the five kinds
of loop statements, only exec_stmt_while's result code handling is fully
exercised by these tests. That would be a deficiency as things stand, but a
follow-on commit will merge the loop statements' result code handling into one
implementation. So testing each usage of that implementation separately seems
redundant. In passing, also add a couple test cases to plpgsql.sql to more
fully exercise plpgsql's code related to expanded arrays --- I had thought
that area was sufficiently covered already, but the coverage report showed a
couple of un-executed code paths. Discussion:
- Ensure proper alignment of tuples in HashMemoryChunkData buffers. The
previous coding relied (without any documentation) on the data member of
HashMemoryChunkData being at a MAXALIGN'ed offset. If it was not, the tuples
would not be maxaligned either, leading to failures on alignment-picky
machines. While there seems to be no live bug on any platform we support,
this is clearly pretty fragile: any addition to or rearrangement of the fields
in HashMemoryChunkData could break it. Let's remove the hazard by getting rid
of the data member and instead using pointer arithmetic with an explicitly
maxalign'ed offset. Discussion:
- Teach eval_const_expressions() to handle some more cases. Add some
infrastructure (mostly macros) to make it easier to write typical cases for
constant-expression simplification. Add simplification processing for
ArrayRef, RowExpr, and ScalarArrayOpExpr node types, which formerly went
unsimplified even if all their inputs were constants. Also teach it to
simplify FieldSelect from a composite constant. Make use of the new
infrastructure to reduce the amount of code needed for the existing ArrayExpr
and ArrayCoerceExpr cases. One existing test case changes output as a result
of the fact that RowExpr can now be folded to a constant. All the new code is
exercised by existing test cases according to gcov, so I feel no need to add
additional tests. Tom Lane, reviewed by Dmitry Dolgov Discussion:
- Fix some minor errors in new PHJ code. Correct
ExecParallelHashTuplePrealloc's estimate of whether the space_allowed limit is
exceeded. Be more consistent about tuples that are exactly
HASH_CHUNK_THRESHOLD in size (they're "small", not "large"). Neither of these
things explain the current buildfarm unhappiness, but they're still bugs.
Thomas Munro, per gripe by me Discussion:
- Clean up tupdesc.c for recent changes. TupleDescCopy needs to have the same
effects as CreateTupleDescCopy in that, since it doesn't copy constraints, it
should clear the per-attribute fields associated with them. Oversight in
commit cc5f81366. Since TupleDescCopy has already established the presumption
that it can just flat-copy the entire attribute array in one go, propagate
that approach into CreateTupleDescCopy and CreateTupleDescCopyConstr. (I'm
suspicious that this would lead to valgrind complaints if we had any trailing
padding in the struct, but we do not, and anyway fixing that seems like a job
for a separate commit.) Add some better comments. Thomas Munro, reviewed by
Vik Fearing, some additional hacking by me Discussion:
- Tweak parallel hash join test case in hopes of improving stability. This
seems to make things better on gaur, let's see what the rest of the buildfarm
thinks. Thomas Munro Discussion:
- Fix incorrect computations of length of null bitmap in pageinspect. Instead
of using our standard macro for this calculation, this code did it itself ...
and got it wrong, leading to incorrect display of the null bitmap in some
cases. Noted and fixed by Maksim Milyutin. In passing, remove a uselessly
duplicative error check. Errors were introduced in commit d6061f83a;
back-patch to 9.6 where that came in. Maksim Milyutin, reviewed by Andrey
- Fix new test case to not be endian-dependent. Per buildfarm. Discussion:
- Rewrite ConditionVariableBroadcast() to avoid live-lock. The original
implementation of ConditionVariableBroadcast was, per its self-description,
"the dumbest way possible". Thomas Munro found out it was a bit too dumb. An
awakened process may immediately re-queue itself, if the specific condition
it's waiting for is not yet satisfied. If this happens before
ConditionVariableBroadcast is able to see the wait queue as empty, then
ConditionVariableBroadcast will re-awaken the same process, repeating the
cycle. Given unlucky timing this back-and-forth can repeat indefinitely;
loops lasting thousands of seconds have been seen in testing. To fix, add our
own process to the end of the wait queue to serve as a sentinel, and exit the
broadcast loop once our process is not there anymore. There are various
special considerations described in the comments, the principal disadvantage
being that wakers can no longer be sure whether they awakened a real waiter or
just a sentinel. But in practice nobody pays attention to the result of
ConditionVariableSignal or ConditionVariableBroadcast anyway, so that problem
seems hypothetical. Back-patch to v10 where condition_variable.c was
introduced. Tom Lane and Thomas Munro Discussion:
- Reorder steps in ConditionVariablePrepareToSleep for more safety. In the
admittedly-very-unlikely case that AddWaitEventToSet fails,
ConditionVariablePrepareToSleep would error out after already having set
cv_sleep_target, which is probably bad, and after having already set
cv_wait_event_set, which is very bad. Transaction abort might or might not
clean up cv_sleep_target properly; but there is nothing that would be aware
that the WaitEventSet wasn't fully constructed, so that all future condition
variable sleeps would be broken. We can easily guard against these hazards
with slight restructuring. Back-patch to v10 where condition_variable.c was
- Remove return values of ConditionVariableSignal/Broadcast. In the wake of
commit aced5a92b, the semantics of these results are a bit squishy: we can
tell whether we signaled some other process(es), but we do not know which ones
were real waiters versus mere sentinels for ConditionVariableBroadcast
operations. It does not help much that ConditionVariableBroadcast will
attempt to pass on the signal to the next real waiter, because (a) there might
not be one, and (b) that will only happen awhile later, anyway. So these
results could overstate how much effect the calls really had. However, no
existing caller of either function pays any attention to its result value, so
it seems reasonable to just define that as a required property of a correct
algorithm. To encourage correctness and save some tiny number of cycles,
change both functions to return void. Patch by me, per an observation by
Thomas Munro. No back-patch, since if any third parties happen to be using
these functions, they might not appreciate an API break in a minor release.
Noah Misch pushed:
- In tests, await an LSN no later than the recovery target. Otherwise, the test
fails with "Timed out while waiting for standby to catch up". This happened
rarely, perhaps only when autovacuum wrote WAL between our choosing the
recovery target and choosing the LSN to await. Commit
b26f7fa6ae2b4e5d64525b3d5bc66a0ddccd9e24 fixed one case of this. Fix two
more. Back-patch to 9.6, which introduced the affected test. Discussion:
Andres Freund pushed:
- Fix EXPLAIN ANALYZE output for Parallel Hash. In a race case, EXPLAIN ANALYZE
could fail to display correct nbatch and size information. Refactor so that
participants report only on batches they worked on rather than trying to
report on all of them, and teach explain.c to consider the HashInstrumentation
object from all participants instead of picking the first one it can find.
This should fix an occasional build farm failure in the "join" regression
test. Author: Thomas Munro Reviewed-By: Andres Freund Discussion:
- Simplify representation of aggregate transition values a bit. Previously
aggregate transition values for hash and other forms of aggregation (i.e. sort
and no group by) were represented differently. Hash based aggregation used a
grouping set indexed array pointing to an array of transition values, whereas
other forms of aggregation used one flattened array with the index being
computed out of grouping set and transition offsets. That made upcoming
changes hard, so represent both as grouping set indexed array of per-group
data. As a nice side-effect this also makes aggregation slightly faster,
because computing offsets with `transno + (setno * numTrans)` turns out not to
be that cheap (too big for x86 lea for example). Author: Andres Freund
- Rename pg_rewind's copy_file_range() to avoid conflict with new linux syscall.
Upcoming versions of glibc will contain copy_file_range(2), a wrapper around a
new linux syscall for in-kernel copying of data ranges. This conflicts with
pg_rewinds function of the same name. Therefore rename pg_rewinds version. As
our version isn't a generic copying facility we decided to choose a rewind
specific function name. Per buildfarm animal caiman and subsequent discussion
with Tom Lane. Author: Andres Freund Discussion:
https://firstname.lastname@example.org Backpatch: 9.5-, where
pg_rewind was introduced
Peter Eisentraut pushed:
- Don't cast between GinNullCategory and bool. The original idea was that we
could use an isNull-style bool array directly as a GinNullCategory array.
However, the existing code already acknowledges that that doesn't really work,
because of the possibility that bool as currently defined can have arbitrary
bit patterns for true values. So it has to loop through the nullFlags array
to set each bool value to an acceptable value. But if we are looping through
the whole array anyway, we might as well build a proper GinNullCategory array
instead and abandon the type casting. That makes the code much safer in case
bool is ever changed to something else. Reviewed-by: Michael Paquier
- Define LDAPS_PORT if it's missing and disable implicit LDAPS on Windows. Some
versions of Windows don't define LDAPS_PORT. Also, Windows' ldap_sslinit() is
documented to use LDAPS even if you said secure=0 when the port number happens
to be 636 or 3269. Let's avoid using the port number to imply that you want
LDAPS, so that connection strings have the same meaning on Windows and Unix.
Author: Thomas Munro Discussion:
- Allow ldaps when using ldap authentication. While ldaptls=1 provides an RFC
4513 conforming way to do LDAP authentication with TLS encryption, there was
an earlier de facto standard way to do LDAP over SSL called LDAPS. Even
though it's not enshrined in a standard, it's still widely used and sometimes
required by organizations' network policies. There seems to be no reason not
to support it when available in the client library. Therefore, add support
when using OpenLDAP 2.4+ or Windows. It can be configured with
ldapscheme=ldaps or ldapurl=ldaps://... Add tests for both ways of requesting
LDAPS and a test for the pre-existing ldaptls=1. Modify the 001_auth.pl test
for "diagnostic messages", which was previously relying on the server
rejecting ldaptls=1. Author: Thomas Munro Reviewed-By: Peter Eisentraut
- Refactor channel binding code to fetch cbind_data only when necessary. As
things stand now, channel binding data is fetched from OpenSSL and saved into
the SCRAM exchange context for any SSL connection attempted for a SCRAM
authentication, resulting in data fetched but not used if no channel binding
is used or if a different channel binding type is used than what the data is
here for. Refactor the code in such a way that binding data is fetched from
the SSL stack only when a specific channel binding is used for both the
frontend and the backend. In order to achieve that, save the libpq connection
context directly in the SCRAM exchange state, and add a dependency to SSL in
the low-level SCRAM routines. This makes the interface in charge of
initializing the SCRAM context cleaner as all its data comes from either
PGconn* (for frontend) or Port* (for the backend). Author: Michael Paquier
- Implement channel binding tls-server-end-point for SCRAM. This adds a second
standard channel binding type for SCRAM. It is mainly intended for
third-party clients that cannot implement tls-unique, for example JDBC.
Author: Michael Paquier <michael(dot)paquier(at)gmail(dot)com>
- Fix build with older OpenSSL versions. Apparently, X509_get_signature_nid()
is only in fairly new OpenSSL versions, so use the lower-level interface it is
built on instead.
- Add missing includes. <openssl/x509.h> is necessary to look into the X509
struct, used by ac3ff8b1d8f98da38c53a701e6397931080a39cf.
- Another attempt at fixing build with various OpenSSL versions. It seems we
can't easily work around the lack of X509_get_signature_nid(), so revert the
previous attempts and just disable the tls-server-end-point feature if we
don't have it.
Bruce Momjian pushed:
- Update copyright for 2018. Backpatch-through: certain files through 9.3
- pg_upgrade: simplify code layout in a few places. Backpatch-through: 9.4
(9.3 didn't need improving)
- pg_upgrade: revert part of patch for ease of translation. Revert part of
959ee6d267fb24e667fc64e9837a376e236e84a5 . Backpatch-through: 10
- pg_upgrade: remove C comment. Revert another part of
959ee6d267fb24e667fc64e9837a376e236e84a5 . Backpatch-through: 10
Álvaro Herrera pushed:
- Fix isolation test to be less timing-dependent. I did this by adding another
locking process, which makes the other two wait. This way the output should
be stable enough. Per buildfarm and Andres Freund Discussion:
- Make XactLockTableWait work for transactions that are not yet self-locked.
XactLockTableWait assumed that its xid argument has already added itself to
the lock table. That assumption led to another assumption that if locking the
xid has succeeded but the xid is reported as still in progress, then the input
xid must have been a subtransaction. These assumptions hold true for the
original uses of this code in locking related to on-disk tuples, but they
break down in logical replication slot snapshot building -- in particular,
when a standby snapshot logged contains an xid that's already in ProcArray but
not yet in the lock table. This leads to assertion failures that can be
reproduced all the way back to 9.4, when logical decoding was introduced. To
fix, change SubTransGetParent to SubTransGetTopmostTransaction which has a
slightly different API: it returns the argument Xid if there is no parent, and
it goes all the way to the top instead of moving up the levels one by one.
Also, to avoid busy-waiting, add a 1ms sleep to give the other process time to
register itself in the lock table. For consistency, change
ConditionalXactLockTableWait the same way. Author: Petr Jelínek Discussion:
Reported-by: Konstantin Knizhnik Diagnosed-by: Stas Kelvich, Petr Jelínek
Reviewed-by: Andres Freund, Robert Haas
- Revert "Fix isolation test to be less timing-dependent". This reverts commit
2268e6afd596. It turned out that inconsistency in the report is still
possible, so go back to the simpler formulation of the test and instead add an
alternate expected output. Discussion:
- Fix typo. Author: Dagfinn Ilmari Mannsåker Discussion:
- Fix deadlock hazard in CREATE INDEX CONCURRENTLY. Multiple sessions doing
CREATE INDEX CONCURRENTLY simultaneously are supposed to be able to work in
parallel, as evidenced by fixes in commit c3d09b3bd23f specifically to support
this case. In reality, one of the sessions would be aborted by a misterious
"deadlock detected" error. Jeff Janes diagnosed that this is because of
leftover snapshots used for system catalog scans -- this was broken by
8aa3e47510b9 keeping track of (registering) the catalog snapshot. To fix the
deadlocks, it's enough to de-register that snapshot prior to waiting.
Backpatch to 9.4, which introduced MVCC catalog scans. Include an
isolationtester spec that 8 out of 10 times reproduces the deadlock with the
unpatched code for me (Álvaro). Author: Jeff Janes Diagnosed-by: Jeff Janes
Reported-by: Jeremy Finzel Discussion:
- Fix failure to delete spill files of aborted transactions. Logical decoding's
reorderbuffer.c may spill transaction files to disk when transactions are
large. These are supposed to be removed when they become "too old" by xid;
but file removal requires the boundary LSNs of the transaction to be known.
The final_lsn is only set when we see the commit or abort record for the
transaction, but nothing sets the value for transactions that crash, so the
removal code misbehaves -- in assertion-enabled builds, it crashes by a failed
assertion. To fix, modify the final_lsn of transactions that don't have a
value set, to the LSN of the very latest change in the transaction. This
causes the spilled files to be removed appropriately. Author: Atsushi
Torikoshi Reviewed-by: Kyotaro HORIGUCHI, Craig Ringer, Masahiko Sawada
Andrew Dunstan pushed:
- Fix use of config-specific libraries for Windows OpenSSL. Commit 614350a3
allowed for an different builds of OpenSSL libraries on Windows, but ignored
the fact that the alternative builds don't have config-specific libraries.
This patch fixes the Solution file to ask for the correct libraries. per
offline discussions with Leonardo Cecchi and Marco Nenciarini, Backpatch to
all live branches.
Robert Haas pushed:
- Code review for Parallel Append. Remove unnecessary #include mistakenly added
in execnodes.h. Fix mistake in comment in choose_next_subplan_for_leader.
Adjust row estimates in cost_append for a possibly-different parallel divisor.
Clamp row estimates in cost_append after operations that may not produce
integers. Amit Kapila, with cosmetic adjustments by me. Discussion:
- Simplify and encapsulate tuple routing support code. Instead of having
ExecSetupPartitionTupleRouting return multiple out parameters, have it return
a pointer to a structure containing all of those different things. Also,
provide and use a cleanup function, ExecCleanupTupleRouting, instead of
cleaning up all of the resources allocated by ExecSetupPartitionTupleRouting
individually. Amit Khandekar, reviewed by Amit Langote, David Rowley, and me
- Minor preparatory refactoring for UPDATE row movement. Generalize
is_partition_attr to has_partition_attrs and make it accessible from outside
tablecmds.c. Change map_partition_varattnos to clarify that it can be used
for mapping between any two relations in a partitioning hierarchy, not just
parent -> child. Amit Khandekar, reviewed by Amit Langote, David Rowley, and
me. Some comment changes by me. Discussion:
- Factor error generation out of ExecPartitionCheck. At present, we always
raise an ERROR if the partition constraint is violated, but a pending patch
for UPDATE tuple routing will consider instead moving the tuple to the correct
partition. Refactor to make that simpler. Amit Khandekar, reviewed by Amit
Langote, David Rowley, and me. Discussion:
Simon Riggs pushed:
- Default monitoring roles - errata. 25fff40798fc4ac11a241bfd9ab0c45c085e2212
introduced default monitoring roles. Apply these corrections: * Allow access
to pg_stat_get_wal_senders() by role pg_read_all_stats * Correct comment in
pg_stat_get_wal_receiver() to show it is no longer superuser-only. Author:
Feike Steenbergen Reviewed-by: Michael Paquier Apply to HEAD, then later
backpatch to 10
- Add TIMELINE to backup_label file. Allows new test to confirm timelines match
Author: Michael Paquier Reviewed-by: David Steele
== Pending Patches ==
Jeevan Chalke sent in another revision of a patch to implement partition-wise
Fabien COELHO sent in two more revisions of a patch to add a --random-seed
option to pgbench.
Amit Kapila sent in another revision of a patch to ensure that parallel paths
include tlist cost.
Shubham Barai sent in another revision of a patch to implement predicate locking
in GIN indexes.
Marco Nenciarini sent in another revision of a patch to ensure that
session_replication_role = replica with TRUNCATE.
David Steele sent in another revision of a patch to implement a configurable
file mode mask.
Amit Khandekar sent in three more revisions of a patch to ensure that UPDATEs to
partitioned tables that would have the effect of moving tuples from one
partition to another actually do so.
Rushabh Lathia and Peter Geoghegan traded patches to add parallel tuplesort for
parallel B-Tree index creation.
Jesper Pedersen sent in a patch documenting how indexes automatically created on
partitioned tables are named.
Nikita Glukhov sent in two more revisions of a patch to implement SQL/JSON.
Tomas Vondra sent in another revision of a patch to implement controls on the
resources logical replication can consume.
Dagfinn Ilmari Mannsåker sent in a patch to remove a duplicate poly_ops row from
the SP-GiST opclass table.
Remi Colinet sent in another revision of a patch to make block and file size for
WAL and relations defined at cluster creation.
Haribabu Kommi sent in three more revisions of a patch to make
pg_stat_wal_receiver display connected hosts.
Haribabu Kommi sent in another revision of a patch to implement pluggable
Andrew Dunstan sent in two revisions of a patch to implement TZH and TZM format
specifiers in to_timestamp and friends.
Tomas Vondra sent in another revision of a patch to implement multivariate
histograms and MCV lists.
Fabien COELHO sent in another revision of a patch to add more functions and
operators to pgbench.
Thomas Munro sent in a patch to fix warnings about pg_attribute_always_inline.
Fabien COELHO sent in another revision of a patch to add \if support to pgbench.
Emre Hasegeli sent in another revision of a patch to improve the native
Dmitry Dolgov sent in another revision of a patch to implement generic type
subscripting and use same in arrays and JSONB.
Artur Zakirov sent in another revision of a patch to create a more flexible
configuration for full-text search.
Alexander Korotkov sent in another revision of a patch to fix some pg_trgm
Tom Lane sent in another revision of a patch to improve OR conditions on joined
columns, which commonly occur in queries on star schemas.
Jing Wang sent in another revision of a patch to implement a 'prefer-read'
feature in libpq.
Alexander Korotkov sent in two more revisions of a patch to implement
Álvaro Herrera sent in two more revisions of a patch to implement local indexes
for partitioned tables.
Vaishnavi Prabakaran sent in another revision of a patch to implement pipelining
batch support for libpq.
Haribabu Kommi sent in another revision of a patch to refactor database
attributes between pg_dump and pg_dumpall.
Peter Eisentraut sent in another revision of a patch to implement transaction
control in procedures.
Peter Eisentraut sent in a patch to fix ssl tests for when tls-server-end-point
is not supported.
Bruce Momjian sent in a patch to fix an invalid pg_upgrade error message during
Álvaro Herrera sent in another revision of a patch to allow indexes on
partitioned tables to be unique.
Marco Nenciarini sent in three more revisions of a patch to implement logical
decoding of TRUNCATE.
David Rowley sent in three more revisions of a patch to implement runtime
David Rowley sent in another revision of a patch to remove useless DISTINCT
clauses where they're easily identified as such.
David Rowley sent in another revision of a patch to remove [Merge]Append nodes
which contain a single subpath.
Michaël Paquier sent in another revision of a patch to create backup history
files for backups taken from standbys.
Tom Lane sent in another revision of a patch to fix an Oracle-compatible instr
function in the documentation.
Pavel Stěhule sent in another revision of a patch to add some new checks to
Simon Riggs sent in another revision of a patch to surface replication status
for logical replication.
Tomas Vondra sent in another revision of a patch to implement BRIN multi-range
Artur Zakirov sent in another revision of a patch to enable sharing Ispell
dictionaries among backends.
Andrew Dunstan sent in another revision of a patch to implement JSONPATH.
|Next Message||Jonathan S. Katz||2018-01-08 14:53:12||Announcing @postgresql|
|Previous Message||David Fetter||2017-12-31 20:35:36||== PostgreSQL Weekly News - December 31 2017 ==|