1. 08 Feb, 2013 11 commits
    • Tom Lane's avatar
      Fix gist_box_same and gist_point_consistent to handle fuzziness correctly. · 3c29b196
      Tom Lane authored
      While there's considerable doubt that we want fuzzy behavior in the
      geometric operators at all (let alone as currently implemented), nobody is
      stepping forward to redesign that stuff.  In the meantime it behooves us
      to make sure that index searches agree with the behavior of the underlying
      operators.  This patch fixes two problems in this area.
      
      First, gist_box_same was using fuzzy equality, but it really needs to use
      exact equality to prevent not-quite-identical upper index keys from being
      treated as identical, which for example would prevent an existing upper
      key from being extended by an amount less than epsilon.  This would result
      in inconsistent indexes.  (The next release notes will need to recommend
      that users reindex GiST indexes on boxes, polygons, circles, and points,
      since all four opclasses use gist_box_same.)
      
      Second, gist_point_consistent used exact comparisons for upper-page
      comparisons in ~= searches, when it needs to use fuzzy comparisons to
      ensure it finds all matches; and it used fuzzy comparisons for point <@ box
      searches, when it needs to use exact comparisons because that's what the
      <@ operator (rather inconsistently) does.
      
      The added regression test cases illustrate all three misbehaviors.
      
      Back-patch to all active branches.  (8.4 did not have GiST point_ops,
      but it still seems prudent to apply the gist_box_same patch to it.)
      
      Alexander Korotkov, reviewed by Noah Misch
      3c29b196
    • Alvaro Herrera's avatar
      Clean up c.h / postgres.h after Assert() move · 381d4b70
      Alvaro Herrera authored
      Per Tom
      381d4b70
    • Alvaro Herrera's avatar
      Fix Xmax freeze conditions · 5766228b
      Alvaro Herrera authored
      I broke this in 0ac5ad51; previously, freezing a tuple marked with an
      IS_MULTI xmax was not necessary.
      
      Per brokenness report from Jeff Janes.
      5766228b
    • Tom Lane's avatar
      doc: Fix mistakes in the most recent set of release notes. · 335c5e92
      Tom Lane authored
      Improve description of the vacuum_freeze_table_age bug (it's much more
      serious than we realized at the time the fix was committed), and correct
      attribution of pg_upgrade -O/-o fix (Marti Raudsepp contributed that,
      but Bruce forgot to credit him in the commit log).
      
      No need to back-patch right now, it'll happen when the next set of
      release notes are prepared.
      335c5e92
    • Magnus Hagander's avatar
      Fix another typo in a comment · c572bfaf
      Magnus Hagander authored
      Noted by Thom Brown
      c572bfaf
    • Peter Eisentraut's avatar
      Exclude access/rmgrlist.h from cpluspluscheck · cf4d67e8
      Peter Eisentraut authored
      It is not meant to be included standalone.
      cf4d67e8
    • Peter Eisentraut's avatar
      scripts: Add build prerequisite on libpgport · 47601421
      Peter Eisentraut authored
      Without this, building in src/bin/scripts directly will fail if
      libpgport wasn't built first.  Other bin components are handled the same
      way.
      
      Phil Sorber
      47601421
    • Magnus Hagander's avatar
      Fix typo in comment · 733701d2
      Magnus Hagander authored
      Etsuro Fujita
      733701d2
    • Peter Eisentraut's avatar
      doc: Rewrite how to get the source code · 858ef718
      Peter Eisentraut authored
      Instead of hardcoding a specific link, give a general link to the
      download section of the web site.  This gives the user more download
      options and the sysadmins more flexibility.  Also, the previously
      presented link didn't work for devel versions.
      858ef718
    • Tom Lane's avatar
      Fix performance issue in EXPLAIN (ANALYZE, TIMING OFF). · bcc6c4c2
      Tom Lane authored
      Commit af7914c6, which added the TIMING
      option to EXPLAIN, had an oversight: if the TIMING option is disabled
      then control in InstrStartNode() goes through an elog(DEBUG2) call, which
      typically does nothing but takes a noticeable amount of time to do it.
      Tweak the logic to avoid that.
      
      In HEAD, also change the elog(DEBUG2)'s in instrument.c to elog(ERROR).
      It's not very clear why they weren't like that to begin with, but this
      episode shows that not complaining more vociferously about misuse is
      likely to do little except allow bugs to remain hidden.
      
      While at it, adjust some code that was making possibly-dangerous
      assumptions about flag bits being in the rightmost byte of the
      instrument_options word.
      
      Problem reported by Pavel Stehule (via Tomas Vondra).
      bcc6c4c2
    • Tom Lane's avatar
      Make contrib/btree_gist's GiST penalty function a bit saner. · 9221f9d4
      Tom Lane authored
      The previous coding supposed that the first differing bytes in two varlena
      datums must have the same sign difference as their overall comparison
      result.  This is obviously bogus for text strings in non-C locales, and
      probably wrong for numeric, and even for bytea I think it was wrong on
      machines where char is signed.  When the assumption failed, the function
      could deliver a zero or negative penalty in situations where such a result
      is quite ridiculous, leading the core GiST code to make very bad page-split
      decisions.
      
      To fix, take the absolute values of the byte-level differences.  Also,
      switch the code to using unsigned char not just char, so that the behavior
      will be consistent whether char is signed or not.
      
      Per investigation of a trouble report from Tomas Vondra.  Back-patch to all
      supported branches.
      9221f9d4
  2. 07 Feb, 2013 4 commits
    • Tom Lane's avatar
      Fix erroneous range-union logic for varlena types in contrib/btree_gist. · 94f565dc
      Tom Lane authored
      gbt_var_bin_union() failed to do the right thing when the existing range
      needed to be widened at both ends rather than just one end.  This could
      result in an invalid index in which keys that are present would not be
      found by searches, because the searches would not think they need to
      descend to the relevant leaf pages.  This error affected all the varlena
      datatypes supported by btree_gist (text, bytea, bit, numeric).
      
      Per investigation of a trouble report from Tomas Vondra.  (There is also
      an issue in gbt_var_penalty(), but that should only result in inefficiency
      not wrong answers.  I'm committing this separately so that we have a git
      state in which it can be tested that bad penalty results don't produce
      invalid indexes.)  Back-patch to all supported branches.
      94f565dc
    • Tom Lane's avatar
      Repair bugs in GiST page splitting code for multi-column indexes. · 166d534f
      Tom Lane authored
      When considering a non-last column in a multi-column GiST index,
      gistsplit.c tries to improve on the split chosen by the opclass-specific
      pickSplit function by considering penalties for the next column.  However,
      there were two bugs in this code: it failed to recompute the union keys for
      the leftmost index columns, even though these might well change after
      reassigning tuples; and it included the old union keys in the recomputation
      for the columns it did recompute, so that those keys couldn't get smaller
      even if they should.  The first problem could result in an invalid index
      in which searches wouldn't find index entries that are in fact present;
      the second would make the index less efficient to search.
      
      Both of these errors were caused by misuse of gistMakeUnionItVec, whose
      API was designed in a way that just begged such errors to be made.  There
      is no situation in which it's safe or useful to compute the union keys for
      a subset of the index columns, and there is no caller that wants any
      previous union keys to be included in the computation; so the undocumented
      choice to treat the union keys as in/out rather than pure output parameters
      is a waste of code as well as being dangerous.
      
      Hence, rather than just making a minimal patch, I've changed the API of
      gistMakeUnionItVec to remove the "startkey" parameter (it now always
      processes all index columns) and treat the attr/isnull arrays as purely
      output parameters.
      
      In passing, also get rid of a couple of unnecessary and dangerous uses
      of static variables in gistutil.c.  It's remarkable that the one in
      gistMakeUnionKey hasn't given us portability troubles before now, because
      in addition to posing a re-entrancy hazard, it was unsafely assuming that
      a static char[] array would have at least Datum alignment.
      
      Per investigation of a trouble report from Tomas Vondra.  (There are also
      some bugs in contrib/btree_gist to be fixed, but that seems like material
      for a separate patch.)  Back-patch to all supported branches.
      166d534f
    • Tom Lane's avatar
      Fix possible failure to send final transaction counts to stats collector. · c5aad8dc
      Tom Lane authored
      Normally, we suppress sending a tabstats message to the collector unless
      there were some actual table stats to send.  However, during backend exit
      we should force out the message if there are any transaction commit/abort
      counts to send, else the session's last few commit/abort counts will never
      get reported at all.  We had logic for this, but the short-circuit test
      at the top of pgstat_report_stat() ignored the "force" flag, with the
      consequence that session-ending transactions that touched no database-local
      tables would not get counted.  Seems to be an oversight in my commit
      641912b4, which added the "force" flag.
      That was back in 8.3, so back-patch to all supported versions.
      c5aad8dc
    • Simon Riggs's avatar
      Rely only on checkpoint 1 at end of recovery. · 072521b8
      Simon Riggs authored
      Searching for checkpoint 2 (previous) is not
      correct in all cases.
      
      Bug report from Heikki Linnakangas
      072521b8
  3. 06 Feb, 2013 3 commits
  4. 04 Feb, 2013 4 commits
    • Tom Lane's avatar
      Prevent execution of enum_recv() from SQL. · ab0f7b60
      Tom Lane authored
      This function was misdeclared to take cstring when it should take internal.
      This at least allows crashing the server, and in principle an attacker
      might be able to use the function to examine the contents of server memory.
      
      The correct fix is to adjust the system catalog contents (and fix the
      regression tests that should have caught this but failed to).  However,
      asking users to correct the catalog contents in existing installations
      is a pain, so as a band-aid fix for the back branches, install a check
      in enum_recv() to make it throw error if called with a cstring argument.
      We will later revert this in HEAD in favor of correcting the catalogs.
      
      Our thanks to Sumit Soni (via Secunia SVCRP) for reporting this issue.
      
      Security: CVE-2013-0255
      ab0f7b60
    • Tom Lane's avatar
    • Simon Riggs's avatar
      Reset vacuum_defer_cleanup_age to PGC_SIGHUP. · f480e294
      Simon Riggs authored
      Revert commit 84725aa5
      f480e294
    • Simon Riggs's avatar
      Reset master xmin when hot_standby_feedback disabled. · bd56e741
      Simon Riggs authored
      If walsender has xmin of standby then ensure we
      reset the value to 0 when we change from hot_standby_feedback=on
      to hot_standby_feedback=off.
      bd56e741
  5. 03 Feb, 2013 2 commits
    • Tom Lane's avatar
      Perform line wrapping and indenting by default in ruleutils.c. · 62e66640
      Tom Lane authored
      This patch changes pg_get_viewdef() and allied functions so that
      PRETTY_INDENT processing is always enabled.  Per discussion, only the
      PRETTY_PAREN processing (that is, stripping of "unnecessary" parentheses)
      poses any real forward-compatibility risk, so we may as well make dump
      output look as nice as we safely can.
      
      Also, set the default wrap length to zero (i.e, wrap after each SELECT
      or FROM list item), since there's no very principled argument for the
      former default of 80-column wrapping, and most people seem to agree this
      way looks better.
      
      Marko Tiikkaja, reviewed by Jeevan Chalke, further hacking by Tom Lane
      62e66640
    • Peter Eisentraut's avatar
      PL/Python: Add result object str handler · 330ed4ac
      Peter Eisentraut authored
      This is intended so that say plpy.debug(rv) prints something useful for
      debugging query execution results.
      
      reviewed by Steve Singer
      330ed4ac
  6. 02 Feb, 2013 5 commits
    • Tom Lane's avatar
      Create a psql command \gset to store query results into psql variables. · d2d153fd
      Tom Lane authored
      This eases manipulation of query results in psql scripts.
      
      Pavel Stehule, reviewed by Piyush Newe, Shigeru Hanada, and Tom Lane
      d2d153fd
    • Tom Lane's avatar
      Prevent "\g filename" from affecting subsequent commands after an error. · 101d6ae7
      Tom Lane authored
      In the previous coding, psql's state variable saying that output should
      go to a file was only reset after successful completion of a query
      returning tuples.  Thus for example,
      
      regression=# select 1/0
      regression-# \g somefile
      ERROR:  division by zero
      regression=# select 1/2;
      regression=#
      
      ... huh, I wonder where that output went.  Even more oddly, the state
      was not reset even if it's the file that's causing the failure:
      
      regression=# select 1/2 \g /foo
      /foo: Permission denied
      regression=# select 1/2;
      /foo: Permission denied
      regression=# select 1/2;
      /foo: Permission denied
      
      This seems to me not to satisfy the principle of least surprise.
      \g is certainly not documented in a way that suggests its effects are
      at all persistent.
      
      To fix, adjust the code so that the flag is reset at exit from SendQuery
      no matter what happened.
      
      Noted while reviewing the \gset patch, which had comparable issues.
      Arguably this is a bug fix, but I'll refrain from back-patching for now.
      101d6ae7
    • Simon Riggs's avatar
      Mark vacuum_defer_cleanup_age as PGC_POSTMASTER. · 84725aa5
      Simon Riggs authored
      Following bug analysis of #7819 by Tom Lane
      84725aa5
    • Bruce Momjian's avatar
      Adjust COPY FREEZE error message to be more accurate and consistent. · e8ae0196
      Bruce Momjian authored
      Per suggestions from Noah and Tom.
      e8ae0196
    • Peter Eisentraut's avatar
      doc: Tiny whitespace fix · f4987049
      Peter Eisentraut authored
      f4987049
  7. 01 Feb, 2013 5 commits
    • Alvaro Herrera's avatar
      Move Assert() definitions to c.h · e1d25de3
      Alvaro Herrera authored
      This way, they can be used by frontend and backend code.  We already
      supported that, but doing it this way allows us to mix true frontend
      files with backend files compiled in frontend environment.
      
      Author: Andres Freund
      e1d25de3
    • Alvaro Herrera's avatar
      Fix typo in freeze_table_age implementation · dd1569da
      Alvaro Herrera authored
      The original code used freeze_min_age instead of freeze_table_age.  The
      main consequence of this mistake is that lowering freeze_min_age would
      cause full-table scans to occur much more frequently, which causes
      serious issues because the number of writes required is much larger.
      That feature (freeze_min_age) is supposed to affect only how soon tuples
      are frozen; some pages should still be skipped due to the visibility
      map.
      
      Backpatch to 8.4, where the freeze_table_age feature was introduced.
      
      Report and patch from Andres Freund
      dd1569da
    • Alvaro Herrera's avatar
      Fill tuple before HeapSatisfiesHOTAndKeyUpdate · 9ee00ef4
      Alvaro Herrera authored
      Failing to do this results in almost all updates to system catalogs
      being non-HOT updates, because the OID column would differ (not having
      been set for the new tuple), which is an indexed column.
      
      While at it, make sure to set the tableoid early in both old and new
      tuples as well.  This isn't of much consequence, since that column is
      seldom (never?) indexed.
      
      Report and patch from Andres Freund.
      9ee00ef4
    • Peter Eisentraut's avatar
      Add CREATE RECURSIVE VIEW syntax · 58390526
      Peter Eisentraut authored
      This is specified in the SQL standard.  The CREATE RECURSIVE VIEW
      specification is transformed into a normal CREATE VIEW statement with a
      WITH RECURSIVE clause.
      
      reviewed by Abhijit Menon-Sen and Stephen Frost
      58390526
    • Peter Eisentraut's avatar
      PL/Tcl: Fix compiler warnings with Tcl 8.6 · b1980f6d
      Peter Eisentraut authored
      Some constification was added in the Tcl APIs, so add the modifiers in
      PL/Tcl as well.
      b1980f6d
  8. 31 Jan, 2013 6 commits
    • Alvaro Herrera's avatar
      Restrict infomask bits to set on multixacts · b78647a0
      Alvaro Herrera authored
      We must only set the bit(s) for the strongest lock held in the tuple;
      otherwise, a multixact containing members with exclusive lock and
      key-share lock will behave as though only a share lock is held.
      
      This bug was introduced in commit 0ac5ad51, somewhere along
      development, when we allowed a singleton FOR SHARE lock to be
      implemented without a MultiXact by using a multi-bit pattern.
      I overlooked that GetMultiXactIdHintBits() needed to be tweaked as well.
      Previously, we could have the bits for FOR KEY SHARE and FOR UPDATE
      simultaneously set and it wouldn't cause a problem.
      
      Per report from digoal@126.com
      b78647a0
    • Alvaro Herrera's avatar
      pgrowlocks: fix bogus lock strength output · 77a3082f
      Alvaro Herrera authored
      Per report from digoal@126.com
      77a3082f
    • Bruce Momjian's avatar
      pg_upgrade docs: mention modification of postgresql.conf in new cluster · a11e15c7
      Bruce Momjian authored
      Mention it might be necessary to modify postgresql.conf in the new
      cluster to match the old cluster.
      
      Backpatch to 9.2.
      
      Suggested by user.
      a11e15c7
    • Simon Riggs's avatar
      Switch timelines if we crash soon after promotion. · 3f0ab052
      Simon Riggs authored
      Previous patch to skip checkpoints at end of recovery didn't
      correctly perform crash recovery, fumbling the timeline switch.
      Now we record the minRecoveryPointTLI of the newly selected
      timeline, so that we crash recover to the correct timeline.
      
      Bug report from Fujii Masao, investigated by me.
      3f0ab052
    • Tom Lane's avatar
      Reject nonzero day fields in AT TIME ZONE INTERVAL functions. · 9afc5839
      Tom Lane authored
      It's not sensible for an interval that's used as a time zone value to be
      larger than a day.  When we changed the interval type to contain a separate
      day field, check_timezone() was adjusted to reject nonzero day values, but
      timetz_izone(), timestamp_izone(), and timestamptz_izone() evidently were
      overlooked.
      
      While at it, make the error messages for these three cases consistent.
      9afc5839
    • Magnus Hagander's avatar
      Properly zero-pad the day-of-year part of the win32 build number · bfb8a8d3
      Magnus Hagander authored
      This ensure the version number increases over time. The first three digits
      in the version number is still set to the actual PostgreSQL version
      number, but the last one is intended to be an ever increasing build number,
      which previosly failed when it changed between 1, 2 and 3 digits long values.
      
      Noted by Deepak
      bfb8a8d3