1. 24 Jun, 2021 5 commits
  2. 23 Jun, 2021 6 commits
    • Tom Lane's avatar
      Allow non-quoted identifiers as isolation test session/step names. · a443c1b2
      Tom Lane authored
      For no obvious reason, isolationtester has always insisted that
      session and step names be written with double quotes.  This is
      fairly tedious and does little for test readability, especially
      since the names that people actually choose almost always look
      like normal identifiers.  Hence, let's tweak the lexer to allow
      SQL-like identifiers not only double-quoted strings.
      
      (They're SQL-like, not exactly SQL, because I didn't add any
      case-folding logic.  Also there's no provision for U&"..." names,
      not that anyone's likely to care.)
      
      There is one incompatibility introduced by this change: if you write
      "foo""bar" with no space, that used to be taken as two identifiers,
      but now it's just one identifier with an embedded quote mark.
      
      I converted all the src/test/isolation/ specfiles to remove
      unnecessary double quotes, but stopped there because my
      eyes were glazing over already.
      
      Like 741d7f10, back-patch to all supported branches, so that this
      isn't a stumbling block for back-patching isolation test changes.
      
      Discussion: https://postgr.es/m/759113.1623861959@sss.pgh.pa.us
      a443c1b2
    • Tom Lane's avatar
      Doc: fix confusion about LEAKPROOF in syntax summaries. · 2031e166
      Tom Lane authored
      The syntax summaries for CREATE FUNCTION and allied commands
      made it look like LEAKPROOF is an alternative to
      IMMUTABLE/STABLE/VOLATILE, when of course it is an orthogonal
      option.  Improve that.
      
      Per gripe from aazamrafeeque0.  Thanks to David Johnston for
      suggestions.
      
      Discussion: https://postgr.es/m/162444349581.694.5818572718530259025@wrigleys.postgresql.org
      2031e166
    • Tom Lane's avatar
      Don't assume GSSAPI result strings are null-terminated. · 126cdaf4
      Tom Lane authored
      Our uses of gss_display_status() and gss_display_name() assumed
      that the gss_buffer_desc strings returned by those functions are
      null-terminated.  It appears that they generally are, given the
      lack of field complaints up to now.  However, the available
      documentation does not promise this, and some man pages
      for gss_display_status() show examples that rely on the
      gss_buffer_desc.length field instead of expecting null
      termination.  Also, we now have a report that on some
      implementations, clang's address sanitizer is of the opinion
      that the byte after the specified length is undefined.
      
      Hence, change the code to rely on the length field instead.
      
      This might well be cosmetic rather than fixing any real bug, but
      it's hard to be sure, so back-patch to all supported branches.
      While here, also back-patch the v12 changes that made pg_GSS_error
      deal honestly with multiple messages available from
      gss_display_status.
      
      Per report from Sudheer H R.
      
      Discussion: https://postgr.es/m/5372B6D4-8276-42C0-B8FB-BD0918826FC3@tekenlight.com
      126cdaf4
    • Tom Lane's avatar
      Improve display of query results in isolation tests. · 4a054069
      Tom Lane authored
      Previously, isolationtester displayed SQL query results using some
      ad-hoc code that clearly hadn't had much effort expended on it.
      Field values longer than 14 characters weren't separated from
      the next field, and usually caused misalignment of the columns
      too.  Also there was no visual separation of a query's result
      from subsequent isolationtester output.  This made test result
      files confusing and hard to read.
      
      To improve matters, let's use libpq's PQprint() function.  Although
      that's long since unused by psql, it's still plenty good enough
      for the purpose here.
      
      Like 741d7f10, back-patch to all supported branches, so that this
      isn't a stumbling block for back-patching isolation test changes.
      
      Discussion: https://postgr.es/m/582362.1623798221@sss.pgh.pa.us
      4a054069
    • Alvaro Herrera's avatar
      Add test case for obsoleting slot with active walsender, take 2 · 24043c27
      Alvaro Herrera authored
      The code to signal a running walsender when its reserved WAL size grows
      too large is completely uncovered before this commit; this adds coverage
      for that case.
      
      This test involves sending SIGSTOP to walsender and walreceiver, then
      advancing enough WAL for a checkpoint to trigger, then sending SIGCONT.
      
      There's no precedent for STOP signalling in Perl tests, and my reading
      of relevant manpages says it's likely to fail on Windows.  Because of
      this, this test is always skipped on that platform.
      
      This version fixes a couple of rarely hit race conditions in the
      previous attempt 09126984; most notably, both LOG string searches
      are loops, not just the second one; we acquire the start-of-log position
      before STOP-signalling; and reference the correct process name in the
      test description.  All per Tom Lane.
      
      Author: Álvaro Herrera <alvherre@alvh.no-ip.org>
      Discussion: https://postgr.es/m/202106102202.mjw4huiix7lo@alvherre.pgsql
      24043c27
    • Tom Lane's avatar
      Use annotations to reduce instability of isolation-test results. · 741d7f10
      Tom Lane authored
      We've long contended with isolation test results that aren't entirely
      stable.  Some test scripts insert long delays to try to force stable
      results, which is not terribly desirable; but other erratic failure
      modes remain, causing unrepeatable buildfarm failures.  I've spent a
      fair amount of time trying to solve this by improving the server-side
      support code, without much success: that way is fundamentally unable
      to cope with diffs that stem from chance ordering of arrival of
      messages from different server processes.
      
      We can improve matters on the client side, however, by annotating
      the test scripts themselves to show the desired reporting order
      of events that might occur in different orders.  This patch adds
      three types of annotations to deal with (a) test steps that might or
      might not complete their waits before the isolationtester can see them
      waiting; (b) test steps in different sessions that can legitimately
      complete in either order; and (c) NOTIFY messages that might arrive
      before or after the completion of a step in another session.  We might
      need more annotation types later, but this seems to be enough to deal
      with the instabilities we've seen in the buildfarm.  It also lets us
      get rid of all the long delays that were previously used, cutting more
      than a minute off the runtime of the isolation tests.
      
      Back-patch to all supported branches, because the buildfarm
      instabilities affect all the branches, and because it seems desirable
      to keep isolationtester's capabilities the same across all branches
      to simplify possible future back-patching of tests.
      
      Discussion: https://postgr.es/m/327948.1623725828@sss.pgh.pa.us
      741d7f10
  3. 22 Jun, 2021 2 commits
  4. 21 Jun, 2021 9 commits
  5. 20 Jun, 2021 2 commits
  6. 19 Jun, 2021 3 commits
    • Tom Lane's avatar
      Provide feature-test macros for libpq features added in v14. · 6991e774
      Tom Lane authored
      We had a request to provide a way to test at compile time for the
      availability of the new pipeline features.  More generally, it
      seems like a good idea to provide a way to test via #ifdef for
      all new libpq API features.  People have been using the version
      from pg_config.h for that; but that's more likely to represent the
      server version than the libpq version, in the increasingly-common
      scenario where they're different.  It's safer if libpq-fe.h itself
      is the source of truth about what features it offers.
      
      Hence, establish a policy that starting in v14 we'll add a suitable
      feature-is-present macro to libpq-fe.h when we add new API there.
      (There doesn't seem to be much point in applying this policy
      retroactively, but it's not too late for v14.)
      
      Tom Lane and Alvaro Herrera, per suggestion from Boris Kolpackov.
      
      Discussion: https://postgr.es/m/boris.20210617102439@codesynthesis.com
      6991e774
    • Amit Kapila's avatar
      Handle no replica identity index case in RelationGetIdentityKeyBitmap. · 2731ce1b
      Amit Kapila authored
      Commit e7eea52b has introduced a new function
      RelationGetIdentityKeyBitmap which omits to handle the case where there is
      no replica identity index on a relation.
      
      Author: Mark Dilger
      Reviewed-by: Takamichi Osumi, Amit Kapila
      Discussion: https://www.postgresql.org/message-id/4C99A862-69C8-431F-960A-81B1151F1B89@enterprisedb.com
      2731ce1b
    • Peter Geoghegan's avatar
      Support disabling index bypassing by VACUUM. · 3499df0d
      Peter Geoghegan authored
      Generalize the INDEX_CLEANUP VACUUM parameter (and the corresponding
      reloption): make it into a ternary style boolean parameter.  It now
      exposes a third option, "auto".  The "auto" option (which is now the
      default) enables the "bypass index vacuuming" optimization added by
      commit 1e55e7d1.
      
      "VACUUM (INDEX_CLEANUP TRUE)" is redefined to once again make VACUUM
      simply do any required index vacuuming, regardless of how few dead
      tuples are encountered during the first scan of the target heap relation
      (unless there are exactly zero).  This gives users a way of opting out
      of the "bypass index vacuuming" optimization, if for whatever reason
      that proves necessary.  It is also expected to be used by PostgreSQL
      developers as a testing option from time to time.
      
      "VACUUM (INDEX_CLEANUP FALSE)" does the same thing as it always has: it
      forcibly disables both index vacuuming and index cleanup.  It's not
      expected to be used much in PostgreSQL 14.  The failsafe mechanism added
      by commit 1e55e7d1 addresses the same problem in a simpler way.
      INDEX_CLEANUP can now be thought of as a testing and compatibility
      option.
      
      Author: Peter Geoghegan <pg@bowt.ie>
      Reviewed-By: default avatarMasahiko Sawada <sawada.mshk@gmail.com>
      Reviewed-By: default avatarJustin Pryzby <pryzby@telsasoft.com>
      Discussion: https://postgr.es/m/CAH2-WznrBoCST4_Gxh_G9hA8NzGUbeBGnOUC8FcXcrhqsv6OHQ@mail.gmail.com
      3499df0d
  7. 18 Jun, 2021 7 commits
    • Alvaro Herrera's avatar
      Add test case for obsoleting slot with active walsender · 09126984
      Alvaro Herrera authored
      The code to signal a running walsender when its reserved WAL size grows
      too large is completely uncovered before this commit; this adds coverage
      for that case.
      
      This test involves sending SIGSTOP to walsender and walreceiver and
      running a checkpoint while advancing WAL, then sending SIGCONT.  There's
      no precedent for this coding in Perl tests, and my reading of relevant
      manpages says it's likely to fail on Windows.  Because of this, this
      test is always skipped on that platform.
      
      Author: Álvaro Herrera <alvherre@alvh.no-ip.org>
      Discussion: https://postgr.es/m/202106102202.mjw4huiix7lo@alvherre.pgsql
      09126984
    • Tom Lane's avatar
      Fix misbehavior of DROP OWNED BY with duplicate polroles entries. · d21fca08
      Tom Lane authored
      Ordinarily, a pg_policy.polroles array wouldn't list the same role
      more than once; but CREATE POLICY does not prevent that.  If we
      perform DROP OWNED BY on a role that is listed more than once,
      RemoveRoleFromObjectPolicy either suffered an assertion failure
      or encountered a tuple-updated-by-self error.  Rewrite it to cope
      correctly with duplicate entries, and add a CommandCounterIncrement
      call to prevent the other problem.
      
      Per discussion, there's other cleanup that ought to happen here,
      but this seems like the minimum essential fix.
      
      Per bug #17062 from Alexander Lakhin.  It's been broken all along,
      so back-patch to all supported branches.
      
      Discussion: https://postgr.es/m/17062-11f471ae3199ca23@postgresql.org
      d21fca08
    • Tom Lane's avatar
      Improve version reporting in pgbench. · 84bee961
      Tom Lane authored
      Commit 547f04e7 caused pgbench to start printing its version number,
      which seems like a fine idea, but it needs a bit more work:
      * Print the server version number too, when different.
      * Print the PG_VERSION string, not some reconstructed approximation.
      
      This patch copies psql's well-tested code for the same purpose.
      
      Discussion: https://postgr.es/m/1226654.1624036821@sss.pgh.pa.us
      84bee961
    • Tom Lane's avatar
      Centralize the logic for protective copying of utility statements. · 7c337b6b
      Tom Lane authored
      In the "simple Query" code path, it's fine for parse analysis or
      execution of a utility statement to scribble on the statement's node
      tree, since that'll just be thrown away afterwards.  However it's
      not fine if the node tree is in the plan cache, as then it'd be
      corrupted for subsequent executions.  Up to now we've dealt with
      that by having individual utility-statement functions apply
      copyObject() if they were going to modify the tree.  But that's
      prone to errors of omission.  Bug #17053 from Charles Samborski
      shows that CREATE/ALTER DOMAIN didn't get this memo, and can
      crash if executed repeatedly from plan cache.
      
      In the back branches, we'll just apply a narrow band-aid for that,
      but in HEAD it seems prudent to have a more principled fix that
      will close off the possibility of other similar bugs in future.
      Hence, let's hoist the responsibility for doing copyObject up into
      ProcessUtility from its children, thus ensuring that it happens for
      all utility statement types.
      
      Also, modify ProcessUtility's API so that its callers can tell it
      whether a copy step is necessary.  It turns out that in all cases,
      the immediate caller knows whether the node tree is transient, so
      this doesn't involve a huge amount of code thrashing.  In this way,
      while we lose a little bit in the execute-from-cache code path due
      to sometimes copying node trees that wouldn't be mutated anyway,
      we gain something in the simple-Query code path by not copying
      throwaway node trees.  Statements that are complex enough to be
      expensive to copy are almost certainly ones that would have to be
      copied anyway, so the loss in the cache code path shouldn't be much.
      
      (Note that this whole problem applies only to utility statements.
      Optimizable statements don't have the issue because we long ago made
      the executor treat Plan trees as read-only.  Perhaps someday we will
      make utility statement execution act likewise, but I'm not holding
      my breath.)
      
      Discussion: https://postgr.es/m/931771.1623893989@sss.pgh.pa.us
      Discussion: https://postgr.es/m/17053-3ca3f501bbc212b4@postgresql.org
      7c337b6b
    • Andrew Dunstan's avatar
      Don't set a fast default for anything but a plain table · 0a4efdc7
      Andrew Dunstan authored
      The fast default code added in Release 11 omitted to check that the
      table a fast default was being added to was a plain table. Thus one
      could be added to a foreign table, which predicably blows up. Here we
      perform that check.
      
      In addition, on the back branches, since some of these might have
      escaped into the wild, if we encounter a missing value for
      an attribute of something other than a plain table we ignore it.
      
      Fixes bug #17056
      
      Backpatch to release 11,
      
      Reviewed by: Andres Freund, Álvaro Herrera and Tom Lane
      0a4efdc7
    • Fujii Masao's avatar
      Make archiver process handle barrier events. · 981524d2
      Fujii Masao authored
      Commit d75288fb made WAL archiver process an auxiliary process.
      An auxiliary process needs to handle barrier events but the commit
      forgot to make archiver process do that.
      
      Reported-by: Thomas Munro
      Author: Fujii Masao
      Reviewed-by: Thomas Munro
      Discussion: https://postgr.es/m/CA+hUKGLah2w1pWKHonZP_+EQw69=q56AHYwCgEN8GDzsRG_Hgw@mail.gmail.com
      981524d2
    • Michael Paquier's avatar
  8. 17 Jun, 2021 2 commits
    • Heikki Linnakangas's avatar
      Tidy up GetMultiXactIdMembers()'s behavior on error · d24c5658
      Heikki Linnakangas authored
      One of the error paths left *members uninitialized. That's not a live
      bug, because most callers don't look at *members when the function
      returns -1, but let's be tidy. One caller, in heap_lock_tuple(), does
      "if (members != NULL) pfree(members)", but AFAICS it never passes an
      invalid 'multi' value so it should not reach that error case.
      
      The callers are also a bit inconsistent in their expectations.
      heap_lock_tuple() pfrees the 'members' array if it's not-NULL, others
      pfree() it if "nmembers >= 0", and others if "nmembers > 0". That's
      not a live bug either, because the function should never return 0, but
      add an Assert for that to make it more clear. I left the callers alone
      for now.
      
      I also moved the line where we set *nmembers. It wasn't wrong before,
      but I like to do that right next to the 'return' statement, to make it
      clear that it's always set on return.
      
      Also remove one unreachable return statement after ereport(ERROR), for
      brevity and for consistency with the similar if-block right after it.
      
      Author: Greg Nancarrow with the additional changes by me
      Backpatch-through: 9.6, all supported versions
      d24c5658
    • Amit Kapila's avatar
      Document a few caveats in synchronous logical replication. · 3cb828db
      Amit Kapila authored
      In a synchronous logical setup, locking [user] catalog tables can cause
      deadlock. This is because logical decoding of transactions can lock
      catalog tables to access them so exclusively locking those in transactions
      can lead to deadlock. To avoid this users must refrain from having
      exclusive locks on catalog tables.
      
      Author: Takamichi Osumi
      Reviewed-by: Vignesh C, Amit Kapila
      Backpatch-through: 9.6
      Discussion: https://www.postgresql.org/message-id/20210222222847.tpnb6eg3yiykzpky%40alap3.anarazel.de
      3cb828db
  9. 16 Jun, 2021 4 commits
    • Tom Lane's avatar
      Fix plancache refcount leak after error in ExecuteQuery. · 131ea3e9
      Tom Lane authored
      When stuffing a plan from the plancache into a Portal, one is
      not supposed to risk throwing an error between GetCachedPlan and
      PortalDefineQuery; if that happens, the plan refcount incremented
      by GetCachedPlan will be leaked.  I managed to break this rule
      while refactoring code in 9dbf2b7d.  There is no visible
      consequence other than some memory leakage, and since nobody is
      very likely to trigger the relevant error conditions many times
      in a row, it's not surprising we haven't noticed.  Nonetheless,
      it's a bug, so rearrange the order of operations to remove the
      hazard.
      
      Noted on the way to looking for a better fix for bug #17053.
      This mistake is pretty old, so back-patch to all supported
      branches.
      131ea3e9
    • Tomas Vondra's avatar
      Fix copying data into slots with FDW batching · 99cea49d
      Tomas Vondra authored
      Commit b676ac44 optimized handling of tuple slots with bulk inserts
      into foreign tables, so that the slots are initialized only once and
      reused for all batches. The data was however copied into the slots only
      after the initialization, inserting duplicate values when the slot gets
      reused. Fixed by moving the ExecCopySlot outside the init branch.
      
      The existing postgres_fdw tests failed to catch this due to inserting
      data into foreign tables without unique indexes, and then checking only
      the number of inserted rows. This adds a new test with both a unique
      index and a check of inserted values.
      
      Reported-by: Alexander Pyhalov
      Discussion: https://postgr.es/m/7a8cf8d56b3d18e5c0bccd6cd42d04ac%40postgrespro.ru
      99cea49d
    • Tom Lane's avatar
      Improve SQLSTATE reporting in some replication-related code. · 6b787d9e
      Tom Lane authored
      I started out with the goal of reporting ERRCODE_CONNECTION_FAILURE
      when walrcv_connect() fails, but as I looked around I realized that
      whoever wrote this code was of the opinion that errcodes are purely
      optional.  That's not my understanding of our project policy.  Hence,
      make sure that an errcode is provided in each ereport that (a) is
      ERROR or higher level and (b) isn't arguably an internal logic error.
      Also fix some very dubious existing errcode assignments.
      
      While this is not per policy, it's also largely cosmetic, since few
      of these cases could get reported to applications.  So I don't
      feel a need to back-patch.
      
      Discussion: https://postgr.es/m/2189704.1623512522@sss.pgh.pa.us
      6b787d9e
    • Heikki Linnakangas's avatar
      Fix outdated comment that talked about seek position of WAL file. · d0303bc8
      Heikki Linnakangas authored
      Since commit c24dcd0c, we have been using pg_pread() to read the WAL
      file, which doesn't change the seek position (unless we fall back to
      the implementation in src/port/pread.c). Update comment accordingly.
      
      Backpatch-through: 12, where we started to use pg_pread()
      d0303bc8