1. 29 Nov, 2013 1 commit
    • Robert Haas's avatar
      Refine our definition of what constitutes a system relation. · 8e18d04d
      Robert Haas authored
      Although user-defined relations can't be directly created in
      pg_catalog, it's possible for them to end up there, because you can
      create them in some other schema and then use ALTER TABLE .. SET SCHEMA
      to move them there.  Previously, such relations couldn't afterwards
      be manipulated, because IsSystemRelation()/IsSystemClass() rejected
      all attempts to modify objects in the pg_catalog schema, regardless
      of their origin.  With this patch, they now reject only those
      objects in pg_catalog which were created at initdb-time, allowing
      most operations on user-created tables in pg_catalog to proceed
      normally.
      
      This patch also adds new functions IsCatalogRelation() and
      IsCatalogClass(), which is similar to IsSystemRelation() and
      IsSystemClass() but with a slightly narrower definition: only TOAST
      tables of system catalogs are included, rather than *all* TOAST tables.
      This is currently used only for making decisions about when
      invalidation messages need to be sent, but upcoming logical decoding
      patches will find other uses for this information.
      
      Andres Freund, with some modifications by me.
      8e18d04d
  2. 28 Nov, 2013 11 commits
    • Heikki Linnakangas's avatar
      Another gin_desc fix. · 2fe69cac
      Heikki Linnakangas authored
      The number of items inserted was incorrectly printed as if it was a boolean.
      2fe69cac
    • Heikki Linnakangas's avatar
      Fix gin_desc routine to match the WAL format. · 97c19e6c
      Heikki Linnakangas authored
      In the GIN incomplete-splits patch, I used BlockIdDatas to store the block
      number of left and right children, when inserting a downlink after a split
      to an internal page posting list page. But gin_desc thought they were stored
      as BlockNumbers.
      97c19e6c
    • Tom Lane's avatar
      Fix latent(?) race condition in LockReleaseAll. · da8a7160
      Tom Lane authored
      We have for a long time checked the head pointer of each of the backend's
      proclock lists and skipped acquiring the corresponding locktable partition
      lock if the head pointer was NULL.  This was safe enough in the days when
      proclock lists were changed only by the owning backend, but it is pretty
      questionable now that the fast-path patch added cases where backends add
      entries to other backends' proclock lists.  However, we don't really wish
      to revert to locking each partition lock every time, because in simple
      transactions that would add a lot of useless lock/unlock cycles on
      already-heavily-contended LWLocks.  Fortunately, the only way that another
      backend could be modifying our proclock list at this point would be if it
      was promoting a formerly fast-path lock of ours; and any such lock must be
      one that we'd decided not to delete in the previous loop over the locallock
      table.  So it's okay if we miss seeing it in this loop; we'd just decide
      not to delete it again.  However, once we've detected a non-empty list,
      we'd better re-fetch the list head pointer after acquiring the partition
      lock.  This guards against possibly fetching a corrupt-but-non-null pointer
      if pointer fetch/store isn't atomic.  It's not clear if any practical
      architectures are like that, but we've never assumed that before and don't
      wish to start here.  In any case, the situation certainly deserves a code
      comment.
      
      While at it, refactor the partition traversal loop to use a for() construct
      instead of a while() loop with goto's.
      
      Back-patch, just in case the risk is real and not hypothetical.
      da8a7160
    • Alvaro Herrera's avatar
      Unbreak buildfarm · d51a8c52
      Alvaro Herrera authored
      I removed an intermediate commit before pushing and forgot to test the
      resulting tree :-(
      d51a8c52
    • Alvaro Herrera's avatar
      Use a more granular approach to follow update chains · 247c76a9
      Alvaro Herrera authored
      Instead of simply checking the KEYS_UPDATED bit, we need to check
      whether each lock held on the future version of the tuple conflicts with
      the lock we're trying to acquire.
      
      Per bug report #8434 by Tomonari Katsumata
      247c76a9
    • Alvaro Herrera's avatar
      Compare Xmin to previous Xmax when locking an update chain · e4828e9c
      Alvaro Herrera authored
      Not doing so causes us to traverse an update chain that has been broken
      by concurrent page pruning.  All other code that traverses update chains
      uses this check as one of the cases in which to stop iterating, so
      replicate it here too.  Failure to do so leads to erroneous CLOG,
      subtrans or multixact lookups.
      
      Per discussion following the bug report by J Smith in
      CADFUPgc5bmtv-yg9znxV-vcfkb+JPRqs7m2OesQXaM_4Z1JpdQ@mail.gmail.com
      as diagnosed by Andres Freund.
      e4828e9c
    • Alvaro Herrera's avatar
      Don't try to set InvalidXid as page pruning hint · c235a6a5
      Alvaro Herrera authored
      If a transaction updates/deletes a tuple just before aborting, and a
      concurrent transaction tries to prune the page concurrently, the pruner
      may see HeapTupleSatisfiesVacuum return HEAPTUPLE_DELETE_IN_PROGRESS,
      but a later call to HeapTupleGetUpdateXid() return InvalidXid.  This
      would cause an assertion failure in development builds, but would be
      otherwise Mostly Harmless.
      
      Fix by checking whether the updater Xid is valid before trying to apply
      it as page prune point.
      
      Reported by Andres in 20131124000203.GA4403@alap2.anarazel.de
      c235a6a5
    • Alvaro Herrera's avatar
      Cope with heap_fetch failure while locking an update chain · e518fa7a
      Alvaro Herrera authored
      The reason for the fetch failure is that the tuple was removed because
      it was dead; so the failure is innocuous and can be ignored.  Moreover,
      there's no need for further work and we can return success to the caller
      immediately.  EvalPlanQualFetch is doing something very similar to this
      already.
      
      Report and test case from Andres Freund in
      20131124000203.GA4403@alap2.anarazel.de
      e518fa7a
    • Peter Eisentraut's avatar
    • Bruce Momjian's avatar
      pg_buffercache docs: adjust order of fields · 9ef780d4
      Bruce Momjian authored
      Adjust order of fields to match view order.
      
      Jaime Casanova
      9ef780d4
    • Peter Eisentraut's avatar
      doc: Put data types in alphabetical order · a607b690
      Peter Eisentraut authored
      From: Andreas Karlsson <andreas@proxel.se>
      a607b690
  3. 27 Nov, 2013 13 commits
    • Tom Lane's avatar
      Fix stale-pointer problem in fast-path locking logic. · 7db285af
      Tom Lane authored
      When acquiring a lock in fast-path mode, we must reset the locallock
      object's lock and proclock fields to NULL.  They are not necessarily that
      way to start with, because the locallock could be left over from a failed
      lock acquisition attempt earlier in the transaction.  Failure to do this
      led to all sorts of interesting misbehaviors when LockRelease tried to
      clean up no-longer-related lock and proclock objects in shared memory.
      Per report from Dan Wood.
      
      In passing, modify LockRelease to elog not just Assert if it doesn't find
      lock and proclock objects for a formerly fast-path lock, matching the code
      in FastPathGetRelationLockEntry and LockRefindAndRelease.  This isn't a
      bug but it will help in diagnosing any future bugs in this area.
      
      Also, modify FastPathTransferRelationLocks and FastPathGetRelationLockEntry
      to break out of their loops over the fastpath array once they've found the
      sole matching entry.  This was inconsistently done in some search loops
      and not others.
      
      Improve assorted related comments, too.
      
      Back-patch to 9.2 where the fast-path mechanism was introduced.
      7db285af
    • Kevin Grittner's avatar
      Minor correction of READ COMMITTED isolation level docs. · 89ba8150
      Kevin Grittner authored
      Per report from AK
      89ba8150
    • Tom Lane's avatar
      Minor corrections in lmgr/README. · 8c84803e
      Tom Lane authored
      Correct an obsolete statement that no backend touches another backend's
      PROCLOCK lists.  This was probably wrong even when written (the deadlock
      checker looks at everybody's lists), and it's certainly quite wrong now
      that fast-path locking can require creation of lock and proclock objects
      on behalf of another backend.  Also improve some statements in the hot
      standby explanation, and do one or two other trivial bits of wordsmithing/
      reformatting.
      8c84803e
    • Heikki Linnakangas's avatar
      Get rid of the post-recovery cleanup step of GIN page splits. · 631118fe
      Heikki Linnakangas authored
      Replace it with an approach similar to what GiST uses: when a page is split,
      the left sibling is marked with a flag indicating that the parent hasn't been
      updated yet. When the parent is updated, the flag is cleared. If an insertion
      steps on a page with the flag set, it will finish split before proceeding
      with the insertion.
      
      The post-recovery cleanup mechanism was never totally reliable, as insertion
      to the parent could fail e.g because of running out of memory or disk space,
      leaving the tree in an inconsistent state.
      
      This also divides the responsibility of WAL-logging more clearly between
      the generic ginbtree.c code, and the parts specific to entry and posting
      trees. There is now a common WAL record format for insertions and deletions,
      which is written by ginbtree.c, followed by tree-specific payload, which is
      returned by the placetopage- and split- callbacks.
      631118fe
    • Heikki Linnakangas's avatar
      More GIN refactoring. · ce5326ee
      Heikki Linnakangas authored
      Separate the insertion payload from the more static portions of GinBtree.
      GinBtree now only contains information related to searching the tree, and
      the information of what to insert is passed separately.
      
      Add root block number to GinBtree, instead of passing it around all the
      functions as argument.
      
      Split off ginFinishSplit() from ginInsertValue(). ginFinishSplit is
      responsible for finding the parent and inserting the downlink to it.
      ce5326ee
    • Heikki Linnakangas's avatar
      Fix plpython3 expected output. · 4118f7e8
      Heikki Linnakangas authored
      I neglected this in the previous commit that updated the plpython2 output,
      which I forgot to "git add" earlier.
      
      As pointed out by Rodolfo Campero and Marko Kreen.
      4118f7e8
    • Heikki Linnakangas's avatar
      Don't update relfrozenxid if any pages were skipped. · 82b43f7d
      Heikki Linnakangas authored
      Vacuum recognizes that it can update relfrozenxid by checking whether it has
      processed all pages of a relation. Unfortunately it performed that check
      after truncating the dead pages at the end of the relation, and used the new
      number of pages to decide whether all pages have been scanned. If the new
      number of pages happened to be smaller or equal to the number of pages
      scanned, it incorrectly decided that all pages were scanned.
      
      This can lead to relfrozenxid being updated, even though some pages were
      skipped that still contain old XIDs. That can lead to data loss due to xid
      wraparounds with some rows suddenly missing. This likely has escaped notice
      so far because it takes a large number (~2^31) of xids being used to see the
      effect, while a full-table vacuum before that would fix the issue.
      
      The incorrect logic was introduced by commit
      b4b6923e. Backpatch this fix down to 8.4,
      like that commit.
      
      Andres Freund, with some modifications by me.
      82b43f7d
    • Michael Meskes's avatar
      Documentation fix for ecpg. · 2390f2b2
      Michael Meskes authored
      The latest fixes removed a limitation that was still in the docs, so Zoltan updated the docs, too.
      2390f2b2
    • Michael Meskes's avatar
      ECPG: Fix searching for quoted cursor names case-sensitively. · 51867a0f
      Michael Meskes authored
      Patch by Böszörményi Zoltán <zb@cybertec.at>
      51867a0f
    • Fujii Masao's avatar
      Add --xlogdir option to pg_basebackup, for specifying the pg_xlog directory. · d1b88f6b
      Fujii Masao authored
      Haribabu kommi, slightly modified by me.
      d1b88f6b
    • Fujii Masao's avatar
      Fix typo in release note. · 551c7828
      Fujii Masao authored
      Backpatch to 9.1.
      
      Josh Kupershmidt
      551c7828
    • Peter Eisentraut's avatar
    • Peter Eisentraut's avatar
      doc: Add id to index in XSLT build · 3803ff98
      Peter Eisentraut authored
      That way, the HTML file name of the index will be the same as currently
      for the DSSSL build.
      3803ff98
  4. 26 Nov, 2013 9 commits
  5. 25 Nov, 2013 2 commits
  6. 24 Nov, 2013 4 commits
    • Jeff Davis's avatar
      Lessen library-loading log level. · 559d5358
      Jeff Davis authored
      Previously, messages were emitted at the LOG level every time a
      backend preloaded a library. That was acceptable (though unnecessary)
      for shared_preload_libraries; but it was excessive for
      local_preload_libraries and session_preload_libraries. Reduce to
      DEBUG1.
      
      Also, there was logic in the EXEC_BACKEND case to avoid repeated
      messages for shared_preload_libraries by demoting them to
      DEBUG2. DEBUG1 seems more appropriate there, as well, so eliminate
      that special case.
      
      Peter Geoghegan.
      559d5358
    • Tom Lane's avatar
      Fix new and latent bugs with errno handling in secure_read/secure_write. · 36a3be65
      Tom Lane authored
      These functions must be careful that they return the intended value of
      errno to their callers.  There were several scenarios where this might
      not happen:
      
      1. The recent SSL renegotiation patch added a hunk of code that would
      execute after setting errno.  In the first place, it's doubtful that we
      should consider renegotiation to be successfully completed after a failure,
      and in the second, there's no real guarantee that the called OpenSSL
      routines wouldn't clobber errno.  Fix by not executing that hunk except
      during success exit.
      
      2. errno was left in an unknown state in case of an unrecognized return
      code from SSL_get_error().  While this is a "can't happen" case, it seems
      like a good idea to be sure we know what would happen, so reset errno to
      ECONNRESET in such cases.  (The corresponding code in libpq's fe-secure.c
      already did this.)
      
      3. There was an (undocumented) assumption that client_read_ended() wouldn't
      change errno.  While true in the current state of the code, this seems less
      than future-proof.  Add explicit saving/restoring of errno to make sure
      that changes in the called functions won't break things.
      
      I see no need to back-patch, since #1 is new code and the other two issues
      are mostly hypothetical.
      
      Per discussion with Amit Kapila.
      36a3be65
    • Michael Meskes's avatar
      Allow C array definitions to use sizeof(). · 08d1b22b
      Michael Meskes authored
      When parsing C variable definitions ecpg should allow sizeof() operators as array dimensions.
      08d1b22b
    • Michael Meskes's avatar
      Distinguish between C and SQL mode for C-style comments. · 8ac5e88f
      Michael Meskes authored
      SQL standard asks for allowing nested comments, while C does not. Therefore the
      two comments, while mostly similar, have to be parsed seperately.
      8ac5e88f