1. 05 Apr, 2019 14 commits
  2. 04 Apr, 2019 16 commits
    • Andres Freund's avatar
      tableam: Add table_multi_insert() and revamp/speed-up COPY FROM buffering. · 86b85044
      Andres Freund authored
      This adds table_multi_insert(), and converts COPY FROM, the only user
      of heap_multi_insert, to it.
      
      A simple conversion of COPY FROM use slots would have yielded a
      slowdown when inserting into a partitioned table for some
      workloads. Different partitions might need different slots (both slot
      types and their descriptors), and dropping / creating slots when
      there's constant partition changes is measurable.
      
      Thus instead revamp the COPY FROM buffering for partitioned tables to
      allow to buffer inserts into multiple tables, flushing only when
      limits are reached across all partition buffers. By only dropping
      slots when there've been inserts into too many different partitions,
      the aforementioned overhead is gone. By allowing larger batches, even
      when there are frequent partition changes, we actuall speed such cases
      up significantly.
      
      By using slots COPY of very narrow rows into unlogged / temporary
      might slow down very slightly (due to the indirect function calls).
      
      Author: David Rowley, Andres Freund, Haribabu Kommi
      Discussion:
          https://postgr.es/m/20180703070645.wchpu5muyto5n647@alap3.anarazel.de
          https://postgr.es/m/20190327054923.t3epfuewxfqdt22e@alap3.anarazel.de
      86b85044
    • Tom Lane's avatar
      Add a "SQLSTATE-only" error verbosity option to libpq and psql. · 7bac3aca
      Tom Lane authored
      This is intended for use mostly in test scripts for external tools,
      which could do without cross-PG-version variations in error message
      wording.  Of course, the SQLSTATE isn't guaranteed stable either, but
      it should be more so than the error message text.
      
      Note: there's a bit of an ABI change for libpq here, but it seems
      OK because if somebody compiles against a newer version of libpq-fe.h,
      and then tries to pass PQERRORS_SQLSTATE to PQsetErrorVerbosity()
      of an older libpq library, it will be accepted and then act like
      PQERRORS_DEFAULT, thanks to the way the tests in pqBuildErrorMessage3
      have historically been phrased.  That seems acceptable.
      
      Didier Gautheron, reviewed by Dagfinn Ilmari Mannsåker
      
      Discussion: https://postgr.es/m/CAJRYxuKyj4zA+JGVrtx8OWAuBfE-_wN4sUMK4H49EuPed=mOBw@mail.gmail.com
      7bac3aca
    • Alvaro Herrera's avatar
      pg_restore: Require "-f -" to mean stdout · 413ccaa7
      Alvaro Herrera authored
      The previous convention that stdout was selected by default when nothing
      is specified was just too error-prone.
      
      After a suggestion from Andrew Gierth.
      Author: Euler Taveira
      Reviewed-by: Yoshikazu Imai, José Arthur Benetasso Villanova
      Discussion: https://postgr.es/m/87sgwrmhdv.fsf@news-spur.riddles.org.uk
      413ccaa7
    • Tom Lane's avatar
      Make queries' locking of indexes more consistent. · 9c703c16
      Tom Lane authored
      The assertions added by commit b04aeb0a exposed that there are some
      code paths wherein the executor will try to open an index without
      holding any lock on it.  We do have some lock on the index's table,
      so it seems likely that there's no fatal problem with this (for
      instance, the index couldn't get dropped from under us).  Still,
      it's bad practice and we should fix it.
      
      To do so, remove the optimizations in ExecInitIndexScan and friends
      that tried to avoid taking a lock on an index belonging to a target
      relation, and just take the lock always.  In non-bug cases, this
      will result in no additional shared-memory access, since we'll find
      in the local lock table that we already have a lock of the desired
      type; hence, no significant performance degradation should occur.
      
      Also, adjust the planner and executor so that the type of lock taken
      on an index is always identical to the type of lock taken for its table,
      by relying on the recently added RangeTblEntry.rellockmode field.
      This avoids some corner cases where that might not have been true
      before (possibly resulting in extra locking overhead), and prevents
      future maintenance issues from having multiple bits of logic that
      all needed to be in sync.  In addition, this change removes all core
      calls to ExecRelationIsTargetRelation, which avoids a possible O(N^2)
      startup penalty for queries with large numbers of target relations.
      (We'd probably remove that function altogether, were it not that we
      advertise it as something that FDWs might want to use.)
      
      Also adjust some places in selfuncs.c to not take any lock on indexes
      they are transiently opening, since we can assume that plancat.c
      did that already.
      
      In passing, change gin_clean_pending_list() to take RowExclusiveLock
      not AccessShareLock on its target index.  Although it's not clear that
      that's actually a bug, it seemed very strange for a function that's
      explicitly going to modify the index to use only AccessShareLock.
      
      David Rowley, reviewed by Julien Rouhaud and Amit Langote,
      a bit of further tweaking by me
      
      Discussion: https://postgr.es/m/19465.1541636036@sss.pgh.pa.us
      9c703c16
    • Robert Haas's avatar
      Allow VACUUM to be run with index cleanup disabled. · a96c41fe
      Robert Haas authored
      This commit adds a new reloption, vacuum_index_cleanup, which
      controls whether index cleanup is performed for a particular
      relation by default.  It also adds a new option to the VACUUM
      command, INDEX_CLEANUP, which can be used to override the
      reloption.  If neither the reloption nor the VACUUM option is
      used, the default is true, as before.
      
      Masahiko Sawada, reviewed and tested by Nathan Bossart, Alvaro
      Herrera, Kyotaro Horiguchi, Darafei Praliaskouski, and me.
      The wording of the documentation is mostly due to me.
      
      Discussion: http://postgr.es/m/CAD21AoAt5R3DNUZSjOoXDUY=naYPUOuffVsRzuTYMz29yLzQCA@mail.gmail.com
      a96c41fe
    • Peter Geoghegan's avatar
      Invalidate binary search bounds consistently. · 74eb2176
      Peter Geoghegan authored
      _bt_check_unique() failed to invalidate binary search bounds in the
      event of a live conflict following commit e5adcb78.  This resulted in
      problems after waiting for the conflicting xact to commit or abort.  The
      subsequent call to _bt_check_unique() would restore the initial binary
      search bounds, rather than starting a new search.  Fix by explicitly
      invalidating bounds when it becomes clear that there is a live conflict
      that insertion will have to wait to resolve.
      
      Ashutosh Sharma, with a few additional tweaks by me.
      
      Author: Ashutosh Sharma
      Reported-By: Ashutosh Sharma
      Diagnosed-By: Ashutosh Sharma
      Discussion: https://postgr.es/m/CAE9k0PnQp-qr-UYKMSCzdC2FBzdE4wKP41hZrZvvP26dKLonLg@mail.gmail.com
      74eb2176
    • Stephen Frost's avatar
      Move the be_gssapi_get_* prototypes · 87e16db5
      Stephen Frost authored
      The be_gssapi_get_* prototypes were put close to similar ones for SSL-
      but a bit too close since that meant they ended up only being included
      for SSL-enabled builds.  Move those to be under ENABLE_GSS instead.
      
      Pointed out by Tom.
      87e16db5
    • Thomas Munro's avatar
      Refactor the fsync queue for wider use. · 3eb77eba
      Thomas Munro authored
      Previously, md.c and checkpointer.c were tightly integrated so that
      fsync calls could be handed off and processed in the background.
      Introduce a system of callbacks and file tags, so that other modules
      can hand off fsync work in the same way.
      
      For now only md.c uses the new interface, but other users are being
      proposed.  Since there may be use cases that are not strictly SMGR
      implementations, use a new function table for sync handlers rather
      than extending the traditional SMGR one.
      
      Instead of using a bitmapset of segment numbers for each RelFileNode
      in the checkpointer's hash table, make the segment number part of the
      key.  This requires sending explicit "forget" requests for every
      segment individually when relations are dropped, but suits the file
      layout schemes of proposed future users better (ie sparse or high
      segment numbers).
      
      Author: Shawn Debnath and Thomas Munro
      Reviewed-by: Thomas Munro, Andres Freund
      Discussion: https://postgr.es/m/CAEepm=2gTANm=e3ARnJT=n0h8hf88wqmaZxk0JYkxw+b21fNrw@mail.gmail.com
      3eb77eba
    • Peter Eisentraut's avatar
      file_fdw: Fix for generated columns · 33215d11
      Peter Eisentraut authored
      Since file_fdw uses COPY internally, but COPY doesn't allow listing
      generated columns in its column list, we need to make sure that we
      don't add generated columns to the column lists internally generated
      by file_fdw.
      Reported-by: default avatarErik Rijkers <er@xs4all.nl>
      33215d11
    • Noah Misch's avatar
      Silence -Wimplicit-fallthrough in sysv_shmem.c. · 6f0e1900
      Noah Misch authored
      Commit 2f932f71 added code that elicits
      a warning on buildfarm member flaviventris.  Back-patch to 9.4, like
      that commit.
      
      Reported by Andres Freund.
      
      Discussion: https://postgr.es/m/20190404020057.galelv7by75ekqrh@alap3.anarazel.de
      6f0e1900
    • Noah Misch's avatar
      Make src/test/recovery/t/017_shm.pl safe for concurrent execution. · 16ee6eaf
      Noah Misch authored
      Buildfarm members idiacanthus and komodoensis, which share a host, both
      executed this test in the same second.  That failed.  Back-patch to 9.6,
      where the test first appeared.
      
      Discussion: https://postgr.es/m/20190404020543.GA1319573@rfd.leadboat.com
      16ee6eaf
    • Michael Paquier's avatar
      Improve readability of some tests in strings.sql · 92c76021
      Michael Paquier authored
      c2513365 has added some tests to check if a toast relation should be
      empty or not, hardcoding the toast relation name when calling
      pg_relation_size().  pg_class.reltoastrelid offers the same information,
      so simplify the tests to use that.
      
      Reviewed-by: Daniel Gustafsson
      Discussion: https://postgr.es/m/20190403065949.GH3298@paquier.xyz
      92c76021
    • Andres Freund's avatar
      tableam: basic documentation. · b73c3a11
      Andres Freund authored
      This adds documentation about the user oriented parts of table access
      methods (i.e. the default_table_access_method GUC and the USING clause
      for CREATE TABLE etc), adds a basic chapter about the table access
      method interface, and adds a note to storage.sgml that it's contents
      don't necessarily apply for non-builtin AMs.
      
      Author: Haribabu Kommi and Andres Freund
      Discussion: https://postgr.es/m/20180703070645.wchpu5muyto5n647@alap3.anarazel.de
      b73c3a11
    • Noah Misch's avatar
      Assert that pgwin32_signal_initialize() has been called early enough. · ab9ed9be
      Noah Misch authored
      Before the pgwin32_signal_initialize() call, the backend version of
      pg_usleep() has no effect.  No in-tree code falls afoul of that today,
      but temporary commit 23078689 did so.
      
      Discussion: https://postgr.es/m/20190402135442.GA1173872@rfd.leadboat.com
      ab9ed9be
    • Noah Misch's avatar
      Handle USE_MODULE_DB for all tests able to use an installed postmaster. · f433394e
      Noah Misch authored
      When $(MODULES) and $(MODULE_big) are empty, derive the database name
      from the first element of $(REGRESS) instead of using a constant string.
      When deriving the database name from $(MODULES), use its first element
      instead of the entire list; the earlier approach would fail if any
      multi-module directory had $(REGRESS) tests.  Treat isolation suites and
      src/pl correspondingly.  Under USE_MODULE_DB=1, installcheck-world and
      check-world no longer reuse any database name in a given postmaster.
      Buildfarm members axolotl, mandrill and frogfish saw spurious "is being
      accessed by other users" failures that would not have happened without
      database name reuse.  (The CountOtherDBBackends() 5s deadline expired
      during DROP DATABASE; a backend for an earlier test suite had used the
      same database name and had not yet exited.)  Back-patch to 9.4 (all
      supported versions), except bits pertaining to isolation suites.
      
      Concept reviewed by Andrew Dunstan, Andres Freund and Tom Lane.
      
      Discussion: https://postgr.es/m/20190401135213.GE891537@rfd.leadboat.com
      f433394e
    • Noah Misch's avatar
      Consistently test for in-use shared memory. · 2f932f71
      Noah Misch authored
      postmaster startup scrutinizes any shared memory segment recorded in
      postmaster.pid, exiting if that segment matches the current data
      directory and has an attached process.  When the postmaster.pid file was
      missing, a starting postmaster used weaker checks.  Change to use the
      same checks in both scenarios.  This increases the chance of a startup
      failure, in lieu of data corruption, if the DBA does "kill -9 `head -n1
      postmaster.pid` && rm postmaster.pid && pg_ctl -w start".  A postmaster
      will no longer recycle segments pertaining to other data directories.
      That's good for production, but it's bad for integration tests that
      crash a postmaster and immediately delete its data directory.  Such a
      test now leaks a segment indefinitely.  No "make check-world" test does
      that.  win32_shmem.c already avoided all these problems.  In 9.6 and
      later, enhance PostgresNode to facilitate testing.  Back-patch to 9.4
      (all supported versions).
      
      Reviewed by Daniel Gustafsson and Kyotaro HORIGUCHI.
      
      Discussion: https://postgr.es/m/20130911033341.GD225735@tornado.leadboat.com
      2f932f71
  3. 03 Apr, 2019 10 commits
    • Tom Lane's avatar
    • Tomas Vondra's avatar
      Add SETTINGS option to EXPLAIN, to print modified settings. · ea569d64
      Tomas Vondra authored
      Query planning is affected by a number of configuration options, and it
      may be crucial to know which of those options were set to non-default
      values.  With this patch you can say EXPLAIN (SETTINGS ON) to include
      that information in the query plan.  Only options affecting planning,
      with values different from the built-in default are printed.
      
      This patch also adds auto_explain.log_settings option, providing the
      same capability in auto_explain module.
      
      Author: Tomas Vondra
      Reviewed-by: Rafia Sabih, John Naylor
      Discussion: https://postgr.es/m/e1791b4c-df9c-be02-edc5-7c8874944be0@2ndquadrant.com
      ea569d64
    • Alvaro Herrera's avatar
      Tweak docs for log_statement_sample_rate · d1f04b96
      Alvaro Herrera authored
      Author: Justin Pryzby, partly after a suggestion from Masahiko Sawada
      Discussion: https://postgr.es/m/20190328135918.GA27808@telsasoft.com
      Discussion: https://postgr.es/m/CAD21AoB9+y8N4+Fan-ne-_7J5yTybPttxeVKfwUocKp4zT1vNQ@mail.gmail.com
      d1f04b96
    • Alvaro Herrera's avatar
      Log all statements from a sample of transactions · 799e2203
      Alvaro Herrera authored
      This is useful to obtain a view of the different transaction types in an
      application, regardless of the durations of the statements each runs.
      
      Author: Adrien Nayrat
      Reviewed-by: Masahiko Sawada, Hayato Kuroda, Andres Freund
      799e2203
    • Tom Lane's avatar
      Remove now-unnecessary thread pointer arguments in pgbench. · d8c0bd9f
      Tom Lane authored
      Not required after nuking the zipfian thread-local cache.
      
      Also add a comment about hazardous pointer punning in threadRun(),
      and avoid using "thread" to refer to the threads array as a whole.
      
      Fabien Coelho and Tom Lane, per suggestion from Alvaro Herrera
      
      Discussion: https://postgr.es/m/alpine.DEB.2.21.1904032126060.7997@lancre
      d8c0bd9f
    • Tomas Vondra's avatar
      Reduce overhead of pg_mcv_list (de)serialization · c50b3158
      Tomas Vondra authored
      Commit ea4e1c0e resolved issues with memory alignment in serialized
      pg_mcv_list values, but it required copying data to/from the varlena
      buffer during serialization and deserialization.  As the MCV lits may
      be fairly large, the overhead (memory consumption, CPU usage) can get
      rather significant too.
      
      This change tweaks the serialization format so that the alignment is
      correct with respect to the varlena value, and so the parts may be
      accessed directly without copying the data.
      
      Catversion bump, as it affects existing pg_statistic_ext data.
      c50b3158
    • Stephen Frost's avatar
      GSSAPI encryption support · b0b39f72
      Stephen Frost authored
      On both the frontend and backend, prepare for GSSAPI encryption
      support by moving common code for error handling into a separate file.
      Fix a TODO for handling multiple status messages in the process.
      Eliminate the OIDs, which have not been needed for some time.
      
      Add frontend and backend encryption support functions.  Keep the
      context initiation for authentication-only separate on both the
      frontend and backend in order to avoid concerns about changing the
      requested flags to include encryption support.
      
      In postmaster, pull GSSAPI authorization checking into a shared
      function.  Also share the initiator name between the encryption and
      non-encryption codepaths.
      
      For HBA, add "hostgssenc" and "hostnogssenc" entries that behave
      similarly to their SSL counterparts.  "hostgssenc" requires either
      "gss", "trust", or "reject" for its authentication.
      
      Similarly, add a "gssencmode" parameter to libpq.  Supported values are
      "disable", "require", and "prefer".  Notably, negotiation will only be
      attempted if credentials can be acquired.  Move credential acquisition
      into its own function to support this behavior.
      
      Add a simple pg_stat_gssapi view similar to pg_stat_ssl, for monitoring
      if GSSAPI authentication was used, what principal was used, and if
      encryption is being used on the connection.
      
      Finally, add documentation for everything new, and update existing
      documentation on connection security.
      
      Thanks to Michael Paquier for the Windows fixes.
      
      Author: Robbie Harwood, with changes to the read/write functions by me.
      Reviewed in various forms and at different times by: Michael Paquier,
         Andres Freund, David Steele.
      Discussion: https://www.postgresql.org/message-id/flat/jlg1tgq1ktm.fsf@thriss.redhat.com
      b0b39f72
    • Alvaro Herrera's avatar
      Copy name when cloning FKs recurses to partitions · 5f6fc34a
      Alvaro Herrera authored
      We were passing a string owned by a syscache entry, which was released
      before recursing.  Fix by pstrdup'ing the string.
      
      Per buildfarm member prion.
      5f6fc34a
    • Alvaro Herrera's avatar
      Support foreign keys that reference partitioned tables · f56f8f8d
      Alvaro Herrera authored
      Previously, while primary keys could be made on partitioned tables, it
      was not possible to define foreign keys that reference those primary
      keys.  Now it is possible to do that.
      
      Author: Álvaro Herrera
      Reviewed-by: Amit Langote, Jesper Pedersen
      Discussion: https://postgr.es/m/20181102234158.735b3fevta63msbj@alvherre.pgsql
      f56f8f8d
    • Heikki Linnakangas's avatar
      Generate less WAL during GiST, GIN and SP-GiST index build. · 9155580f
      Heikki Linnakangas authored
      Instead of WAL-logging every modification during the build separately,
      first build the index without any WAL-logging, and make a separate pass
      through the index at the end, to write all pages to the WAL. This
      significantly reduces the amount of WAL generated, and is usually also
      faster, despite the extra I/O needed for the extra scan through the index.
      WAL generated this way is also faster to replay.
      
      For GiST, the LSN-NSN interlock makes this a little tricky. All pages must
      be marked with a valid (i.e. non-zero) LSN, so that the parent-child
      LSN-NSN interlock works correctly. We now use magic value 1 for that during
      index build. Change the fake LSN counter to begin from 1000, so that 1 is
      safely smaller than any real or fake LSN. 2 would've been enough for our
      purposes, but let's reserve a bigger range, in case we need more special
      values in the future.
      
      Author: Anastasia Lubennikova, Andrey V. Lepikhov
      Reviewed-by: Heikki Linnakangas, Dmitry Dolgov
      9155580f