1. 27 Nov, 2019 3 commits
  2. 26 Nov, 2019 4 commits
    • Andrew Dunstan's avatar
      Fix closing stdin in TestLib.pm · 792dba73
      Andrew Dunstan authored
      Commit 9af34f3c naively assumed that all non-windows platforms would
      have pseudoterminals and that perl would have IO::Pty. Such is not the
      case. Instead of assumung anything, test for the presence of IO::Pty and
      only use code that might depend on it if it's present. The test result is
      exposed in $TestLib::have_io_pty so that it can be conveniently used in
      SKIP tests.
      
      Discussion: https://postgr.es/m/20191126044110.GB5435@paquier.xyz
      792dba73
    • Tom Lane's avatar
      Allow access to child table statistics if user can read parent table. · 553d2ec2
      Tom Lane authored
      The fix for CVE-2017-7484 disallowed use of pg_statistic data for
      planning purposes if the user would not be able to select the associated
      column and a non-leakproof function is to be applied to the statistics
      values.  That turns out to disable use of pg_statistic data in some
      common cases involving inheritance/partitioning, where the user does
      have permission to select from the parent table that was actually named
      in the query, but not from a child table whose stats are needed.  Since,
      in non-corner cases, the user *can* select the child table's data via
      the parent, this restriction is not actually useful from a security
      standpoint.  Improve the logic so that we also check the permissions of
      the originally-named table, and allow access if select permission exists
      for that.
      
      When checking access to stats for a simple child column, we can map
      the child column number back to the parent, and perform this test
      exactly (including not allowing access if the child column isn't
      exposed by the parent).  For expression indexes, the current logic
      just insists on whole-table select access, and this patch allows
      access if the user can select the whole parent table.  In principle,
      if the child table has extra columns, this might allow access to
      stats on columns the user can't read.  In practice, it's unlikely
      that the planner is going to do any stats calculations involving
      expressions that are not visible to the query, so we'll ignore that
      fine point for now.  Perhaps someday we'll improve that logic to
      detect exactly which columns are used by an expression index ...
      but today is not that day.
      
      Back-patch to v11.  The issue was created in 9.2 and up by the
      CVE-2017-7484 fix, but this patch depends on the append_rel_array[]
      planner data structure which only exists in v11 and up.  In
      practice the issue is most urgent with partitioned tables, so
      fixing v11 and later should satisfy much of the practical need.
      
      Dilip Kumar and Amit Langote, with some kibitzing by me
      
      Discussion: https://postgr.es/m/3876.1531261875@sss.pgh.pa.us
      553d2ec2
    • Michael Paquier's avatar
      Add safeguards for pg_fsync() called with incorrectly-opened fds · 12198239
      Michael Paquier authored
      On some platforms, fsync() returns EBADFD when opening a file descriptor
      with O_RDONLY (read-only), leading ultimately now to a PANIC to prevent
      data corruption.
      
      This commit adds a new sanity check in pg_fsync() based on fcntl() to
      make sure that we don't repeat again mistakes with incorrectly-set file
      descriptors so as problems are detected at an early stage.  Without
      that, such errors could only be detected after running Postgres on a
      specific supported platform for the culprit code path, which could take
      some time before being found.  b8e19b93 was a fix for such a problem,
      which got undetected for more than 5 years, and a586cc4b fixed another
      similar issue.
      
      Note that the new check added works as well when fsync=off is
      configured, so as all regression tests would detect problems as long as
      assertions are enabled.  fcntl() being not available on Windows, the
      new checks do not happen there.
      
      Author: Michael Paquier
      Reviewed-by: Mark Dilger
      Discussion: https://postgr.es/m/20191009062640.GB21379@paquier.xyz
      12198239
    • Amit Kapila's avatar
      Don't shut down Gather[Merge] early under Limit. · 080313f8
      Amit Kapila authored
      Revert part of commit 19df1702f5.
      
      Early shutdown was added by that commit so that we could collect
      statistics from workers, but unfortunately, it interacted badly with
      rescans.  The problem is that we ended up destroying the parallel context
      which is required for rescans.  This leads to rescans of a Limit node over
      a Gather node to produce unpredictable results as it tries to access
      destroyed parallel context.  By reverting the early shutdown code, we
      might lose statistics in some cases of Limit over Gather [Merge], but that
      will require further study to fix.
      
      Reported-by: Jerry Sievers
      Diagnosed-by: Thomas Munro
      Author: Amit Kapila, testcase by Vignesh C
      Backpatch-through: 9.6
      Discussion: https://postgr.es/m/87ims2amh6.fsf@jsievers.enova.com
      080313f8
  3. 25 Nov, 2019 7 commits
  4. 24 Nov, 2019 7 commits
    • Andrew Dunstan's avatar
      Use native methods to open input in TestLib::slurp_file on Windows. · 114541d5
      Andrew Dunstan authored
      It is hoped that this will avoid some errors that we have seen before,
      but lately with greater frequency, in buildfarm animals.
      
      For now apply only to master. If this proves effective it can be
      backpatched.
      
      Discussion: https://postgr.es/m/13900.1572839580@sss.pgh.pa.us
      
      Author: Juan José Santamaría Flecha
      114541d5
    • Tom Lane's avatar
      Doc: improve discussion of race conditions involved in LISTEN. · d3aa114a
      Tom Lane authored
      The user docs didn't really explain how to use LISTEN safely,
      so clarify that.  Also clean up some fuzzy-headed explanations
      in comments.  No code changes.
      
      Discussion: https://postgr.es/m/3ac7f397-4d5f-be8e-f354-440020675694@gmail.com
      d3aa114a
    • Tom Lane's avatar
      Avoid assertion failure with LISTEN in a serializable transaction. · 6b802cfc
      Tom Lane authored
      If LISTEN is the only action in a serializable-mode transaction,
      and the session was not previously listening, and the notify queue
      is not empty, predicate.c reported an assertion failure.  That
      happened because we'd acquire the transaction's initial snapshot
      during PreCommit_Notify, which was called *after* predicate.c
      expects any such snapshot to have been established.
      
      To fix, just swap the order of the PreCommit_Notify and
      PreCommit_CheckForSerializationFailure calls during CommitTransaction.
      This will imply holding the notify-insertion lock slightly longer,
      but the difference could only be meaningful in serializable mode,
      which is an expensive option anyway.
      
      It appears that this is just an assertion failure, with no
      consequences in non-assert builds.  A snapshot used only to scan
      the notify queue could not have been involved in any serialization
      conflicts, so there would be nothing for
      PreCommit_CheckForSerializationFailure to do except assign it a
      prepareSeqNo and set the SXACT_FLAG_PREPARED flag.  And given no
      conflicts, neither of those omissions affect the behavior of
      ReleasePredicateLocks.  This admittedly once-over-lightly analysis
      is backed up by the lack of field reports of trouble.
      
      Per report from Mark Dilger.  The bug is old, so back-patch to all
      supported branches; but the new test case only goes back to 9.6,
      for lack of adequate isolationtester infrastructure before that.
      
      Discussion: https://postgr.es/m/3ac7f397-4d5f-be8e-f354-440020675694@gmail.com
      Discussion: https://postgr.es/m/13881.1574557302@sss.pgh.pa.us
      6b802cfc
    • Thomas Munro's avatar
      doc: Fix whitespace in syntax. · 1974853d
      Thomas Munro authored
      Back-patch to 10.
      
      Author: Andreas Karlsson
      Discussion: https://postgr.es/m/043acae2-a369-b7fa-be48-1933aa2e82d1%40proxel.se
      1974853d
    • Tom Lane's avatar
      Stabilize NOTIFY behavior by transmitting notifies before ReadyForQuery. · 79002697
      Tom Lane authored
      This patch ensures that, if any notify messages were received during
      a just-finished transaction, they get sent to the frontend just before
      not just after the ReadyForQuery message.  With libpq and other client
      libraries that act similarly, this guarantees that the client will see
      the notify messages as available as soon as it thinks the transaction
      is done.
      
      This probably makes no difference in practice, since in realistic
      use-cases the application would have to cope with asynchronous
      arrival of notify events anyhow.  However, it makes it a lot easier
      to build cross-session-notify test cases with stable behavior.
      I'm a bit surprised now that we've not seen any buildfarm instability
      with the test cases added by commit b10f40bf.  Tests that I intend
      to add in an upcoming bug fix are definitely unstable without this.
      
      Back-patch to 9.6, which is as far back as we can do NOTIFY testing
      with the isolationtester infrastructure.
      
      Discussion: https://postgr.es/m/13881.1574557302@sss.pgh.pa.us
      79002697
    • Tom Lane's avatar
      Stabilize the results of pg_notification_queue_usage(). · 8b7ae5a8
      Tom Lane authored
      This function wasn't touched in commit 51004c71, but that turns out
      to be a bad idea, because its results now include any dead space
      that exists in the NOTIFY queue on account of our being lazy about
      advancing the queue tail.  Notably, the isolation tests now fail
      if run twice without a server restart between, because async-notify's
      first test of the function will already show a positive value.
      It seems likely that end users would be equally unhappy about the
      result's instability.  To fix, just make the function call
      asyncQueueAdvanceTail before computing its result.  That should end
      in producing the same value as before, and it's hard to believe that
      there's any practical use-case where pg_notification_queue_usage()
      is called so often as to create a performance degradation, especially
      compared to what we did before.
      
      Out of paranoia, also mark this function parallel-restricted (it
      was volatile, but parallel-safe by default, before).  Although the
      code seems to work fine when run in a parallel worker, that's outside
      the design scope of async.c, and it's a bit scary to have intentional
      side-effects happening in a parallel worker.  There seems no plausible
      use-case where it'd be important to try to parallelize this, so let's
      not take any risk of introducing new bugs.
      
      In passing, re-pgindent async.c and run reformat-dat-files on
      pg_proc.dat, just because I'm a neatnik.
      
      Discussion: https://postgr.es/m/13881.1574557302@sss.pgh.pa.us
      8b7ae5a8
    • Tom Lane's avatar
      Remove a couple of unnecessary if-tests. · 91da65f4
      Tom Lane authored
      Commit abd9ca37 replaced a couple of while-loops in fmtfloat()
      with calls to dopr_outchmulti, but I (tgl) failed to notice that
      the new if-tests guarding those calls were really unnecessary,
      because they're inside a larger if-block checking the same thing.
      
      Ranier Vilela
      
      Discussion: https://postgr.es/m/MN2PR18MB2927850AB00CF39CC370D107E34B0@MN2PR18MB2927.namprd18.prod.outlook.com
      91da65f4
  5. 23 Nov, 2019 3 commits
  6. 22 Nov, 2019 6 commits
    • Tom Lane's avatar
      Make psql redisplay the query buffer after \e. · d1c866e5
      Tom Lane authored
      Up to now, whatever you'd edited was put back into the query buffer
      but not redisplayed, which is less than user-friendly.  But we can
      improve that just by printing the text along with a prompt, if we
      enforce that the editing result ends with a newline (which it
      typically would anyway).  You then continue typing more lines if
      you want, or you can type ";" or do \g or \r or another \e.
      
      This is intentionally divorced from readline's processing,
      for simplicity and so that it works the same with or without
      readline enabled.  We discussed possibly integrating things
      more closely with readline; but that seems difficult, uncertainly
      portable across different readline and libedit versions, and
      of limited real benefit anyway.  Let's try the simple way and
      see if it's good enough.
      
      Patch by me, thanks to Fabien Coelho and Laurenz Albe for review
      
      Discussion: https://postgr.es/m/13192.1572318028@sss.pgh.pa.us
      d1c866e5
    • Tom Lane's avatar
      Avoid taking a new snapshot for an immutable simple expression in plpgsql. · 73b06cf8
      Tom Lane authored
      We already used this optimization if the plpgsql function is read-only.
      But it seems okay to do it even in a read-write function, if the
      expression contains only immutable functions/operators.  There would
      only be a change of behavior if an "immutable" called function depends
      on seeing database updates made during the current plpgsql function.
      That's enough of a violation of the promise of immutability that anyone
      who complains won't have much of a case.
      
      The benefits are significant --- for simple cases like
      
        while i < 10000000
        loop
          i := i + 1;
        end loop;
      
      I see net performance improvements around 45%.  Of course, real-world
      cases won't get that much faster, but it ought to be noticeable.
      At the very least, this removes much of the performance penalty that
      used to exist for forgetting to mark a plpgsql function non-volatile.
      
      Konstantin Knizhnik, reviewed by Pavel Stehule, cosmetic changes by me
      
      Discussion: https://postgr.es/m/ed9da20e-01aa-d04b-d085-e6c16b14b9d7@postgrespro.ru
      73b06cf8
    • Tom Lane's avatar
      Add test coverage for "unchanged toast column" replication code path. · f67b1737
      Tom Lane authored
      It seems pretty unacceptable to have no regression test coverage
      for this aspect of the logical replication protocol, especially
      given the bugs we've found in related code.
      
      Discussion: https://postgr.es/m/16129-a0c0f48e71741e5f@postgresql.org
      f67b1737
    • Tom Lane's avatar
      Fix bogus tuple-slot management in logical replication UPDATE handling. · 4d9ceb00
      Tom Lane authored
      slot_modify_cstrings seriously abused the TupleTableSlot API by relying
      on a slot's underlying data to stay valid across ExecClearTuple.  Since
      this abuse was also quite undocumented, it's little surprise that the
      case got broken during the v12 slot rewrites.  As reported in bug #16129
      from Ondřej Jirman, this could lead to crashes or data corruption when
      a logical replication subscriber processes a row update.  Problems would
      only arise if the subscriber's table contained columns of pass-by-ref
      types that were not being copied from the publisher.
      
      Fix by explicitly copying the datum/isnull arrays from the source slot
      that the old row was in already.  This ends up being about the same
      thing that happened pre-v12, but hopefully in a less opaque and
      fragile way.
      
      We might've caught the problem sooner if there were any test cases
      dealing with updates involving non-replicated or dropped columns.
      Now there are.
      
      Back-patch to v10 where this code came in.  Even though the failure
      does not manifest before v12, IMO this code is too fragile to leave
      as-is.  In any case we certainly want the additional test coverage.
      
      Patch by me; thanks to Tomas Vondra for initial investigation.
      
      Discussion: https://postgr.es/m/16129-a0c0f48e71741e5f@postgresql.org
      4d9ceb00
    • Michael Paquier's avatar
      Add .gitignore to src/tutorial/ · 8959a5e0
      Michael Paquier authored
      A set of SQL files are generated for the tutorial when compiling the
      code, so let's avoid any risk to have them added in the tree in the
      future.
      8959a5e0
    • Michael Paquier's avatar
      Remove traces of version-0 calling convention in src/tutorial/ · a9d5157a
      Michael Paquier authored
      Support has been removed as of 5ded4bd2, but code related to the tutorial
      still used it.  Functions using version-1 are already present for some
      time in the tutorial, and the documentation mentions them, so just
      replace the old version with the new one.
      
      Reported-by: Pavel Stehule
      Analyzed-by: Euler Taveira
      Author: Michael Paquier
      Reviewed-by: Tom Lane, Pavel Stehule
      Discussion: https://postgr.es/m/CAFj8pRCgC2uDzrw-vvanXu6Z3ofyviEOQPEpH6_aL4OCe7JRag@mail.gmail.com
      a9d5157a
  7. 21 Nov, 2019 8 commits
  8. 20 Nov, 2019 2 commits