1. 02 Oct, 2014 3 commits
  2. 01 Oct, 2014 8 commits
    • Tom Lane's avatar
      Fix some more problems with nested append relations. · 5a6c168c
      Tom Lane authored
      As of commit a87c7291 (which later got backpatched as far as 9.1),
      we're explicitly supporting the notion that append relations can be
      nested; this can occur when UNION ALL constructs are nested, or when
      a UNION ALL contains a table with inheritance children.
      
      Bug #11457 from Nelson Page, as well as an earlier report from Elvis
      Pranskevichus, showed that there were still nasty bugs associated with such
      cases: in particular the EquivalenceClass mechanism could try to generate
      "join" clauses connecting an appendrel child to some grandparent appendrel,
      which would result in assertion failures or bogus plans.
      
      Upon investigation I concluded that all current callers of
      find_childrel_appendrelinfo() need to be fixed to explicitly consider
      multiple levels of parent appendrels.  The most complex fix was in
      processing of "broken" EquivalenceClasses, which are ECs for which we have
      been unable to generate all the derived equality clauses we would like to
      because of missing cross-type equality operators in the underlying btree
      operator family.  That code path is more or less entirely untested by
      the regression tests to date, because no standard opfamilies have such
      holes in them.  So I wrote a new regression test script to try to exercise
      it a bit, which turned out to be quite a worthwhile activity as it exposed
      existing bugs in all supported branches.
      
      The present patch is essentially the same as far back as 9.2, which is
      where parameterized paths were introduced.  In 9.0 and 9.1, we only need
      to back-patch a small fragment of commit 5b7b5518, which fixes failure to
      propagate out the original WHERE clauses when a broken EC contains constant
      members.  (The regression test case results show that these older branches
      are noticeably stupider than 9.2+ in terms of the quality of the plans
      generated; but we don't really care about plan quality in such cases,
      only that the plan not be outright wrong.  A more invasive fix in the
      older branches would not be a good idea anyway from a plan-stability
      standpoint.)
      5a6c168c
    • Andres Freund's avatar
      Refactor replication connection code of various pg_basebackup utilities. · 0c013e08
      Andres Freund authored
      Move some more code to manage replication connection command to
      streamutil.c. A later patch will introduce replication slot via
      pg_receivexlog and this avoid duplicating relevant code between
      pg_receivexlog and pg_recvlogical.
      
      Author: Michael Paquier, with some editing by me.
      0c013e08
    • Andres Freund's avatar
      pg_recvlogical.c code review. · fdf81c9a
      Andres Freund authored
      Several comments still referred to 'initiating', 'freeing', 'stopping'
      replication slots. These were terms used during different phases of
      the development of logical decoding, but are no long accurate.
      
      Also rename StreamLog() to StreamLogicalLog() and add 'void' to the
      prototype.
      
      Author: Michael Paquier, with some editing by me.
      
      Backpatch to 9.4 where pg_recvlogical was introduced.
      fdf81c9a
    • Heikki Linnakangas's avatar
      Remove num_xloginsert_locks GUC, replace with a #define · 5fa6c81a
      Heikki Linnakangas authored
      I left the GUC in place for the beta period, so that people could experiment
      with different values. No-one's come up with any data that a different value
      would be better under some circumstances, so rather than try to document to
      users what the GUC, let's just hard-code the current value, 8.
      5fa6c81a
    • Andres Freund's avatar
      Block signals while computing the sleep time in postmaster's main loop. · a39e78b7
      Andres Freund authored
      DetermineSleepTime() was previously called without blocked
      signals. That's not good, because it allows signal handlers to
      interrupt its workings.
      
      DetermineSleepTime() was added in 9.3 with the addition of background
      workers (da07a1e8), where it only read from
      BackgroundWorkerList.
      
      Since 9.4, where dynamic background workers were added (7f7485a0),
      the list is also manipulated in DetermineSleepTime(). That's bad
      because the list now can be persistently corrupted if modified by both
      a signal handler and DetermineSleepTime().
      
      This was discovered during the investigation of hangs on buildfarm
      member anole. It's unclear whether this bug is the source of these
      hangs or not, but it's worth fixing either way. I have confirmed that
      it can cause crashes.
      
      It luckily looks like this only can cause problems when bgworkers are
      actively used.
      
      Discussion: 20140929193733.GB14400@awork2.anarazel.de
      
      Backpatch to 9.3 where background workers were introduced.
      a39e78b7
    • Heikki Linnakangas's avatar
      Add functions for dealing with PGP armor header lines to pgcrypto. · 32984d8f
      Heikki Linnakangas authored
      This add a new pgp_armor_headers function to extract armor headers from an
      ASCII-armored blob, and a new overloaded variant of the armor function, for
      constructing an ASCII-armor with extra headers.
      
      Marko Tiikkaja and me.
      32984d8f
    • Andres Freund's avatar
      Improve documentation about binary/textual output mode for output plugins. · 0ef3c29a
      Andres Freund authored
      Also improve related error message as it contributed to the confusion.
      
      Discussion: CAB7nPqQrqFzjqCjxu4GZzTrD9kpj6HMn9G5aOOMwt1WZ8NfqeA@mail.gmail.com,
          CAB7nPqQXc_+g95zWnqaa=mVQ4d3BVRs6T41frcEYi2ocUrR3+A@mail.gmail.com
      
      Per discussion between Michael Paquier, Robert Haas and Andres Freund
      
      Backpatch to 9.4 where logical decoding was introduced.
      0ef3c29a
    • Andres Freund's avatar
      Rename CACHE_LINE_SIZE to PG_CACHE_LINE_SIZE. · ef886384
      Andres Freund authored
      As noted in http://bugs.debian.org/763098 there is a conflict between
      postgres' definition of CACHE_LINE_SIZE and the definition by various
      *bsd platforms. It's debatable who has the right to define such a
      name, but postgres' use was only introduced in 375d8526 (9.4), so
      it seems like a good idea to rename it.
      
      Discussion: 20140930195756.GC27407@msg.df7cb.de
      
      Per complaint of Christoph Berg in the above email, although he's not
      the original bug reporter.
      
      Backpatch to 9.4 where the define was introduced.
      ef886384
  3. 30 Sep, 2014 3 commits
  4. 29 Sep, 2014 4 commits
    • Andres Freund's avatar
      doc fix for pg_recvlogical: --create doesn't immediately exit. · 445d2628
      Andres Freund authored
      Author: Michael Paquier
      445d2628
    • Stephen Frost's avatar
      Also revert e3ec0728, JSON regression tests · 08da8947
      Stephen Frost authored
      Managed to forget to update the other JSON regression test output,
      again.  Revert the commit which fixed it before.
      
      Per buildfarm.
      08da8947
    • Stephen Frost's avatar
      Revert 95d737ff to add 'ignore_nulls' · c8a026e4
      Stephen Frost authored
      Per discussion, revert the commit which added 'ignore_nulls' to
      row_to_json.  This capability would be better added as an independent
      function rather than being bolted on to row_to_json.  Additionally,
      the implementation didn't address complex JSON objects, and so was
      incomplete anyway.
      
      Pointed out by Tom and discussed with Andrew and Robert.
      c8a026e4
    • Tom Lane's avatar
      Change JSONB's on-disk format for improved performance. · def4c28c
      Tom Lane authored
      The original design used an array of offsets into the variable-length
      portion of a JSONB container.  However, such an array is basically
      uncompressible by simple compression techniques such as TOAST's LZ
      compressor.  That's bad enough, but because the offset array is at the
      front, it tended to trigger the give-up-after-1KB heuristic in the TOAST
      code, so that the entire JSONB object was stored uncompressed; which was
      the root cause of bug #11109 from Larry White.
      
      To fix without losing the ability to extract a random array element in O(1)
      time, change this scheme so that most of the JEntry array elements hold
      lengths rather than offsets.  With data that's compressible at all, there
      tend to be fewer distinct element lengths, so that there is scope for
      compression of the JEntry array.  Every N'th entry is still an offset.
      To determine the length or offset of any specific element, we might have
      to examine up to N preceding JEntrys, but that's still O(1) so far as the
      total container size is concerned.  Testing shows that this cost is
      negligible compared to other costs of accessing a JSONB field, and that
      the method does largely fix the incompressible-data problem.
      
      While at it, rearrange the order of elements in a JSONB object so that
      it's "all the keys, then all the values" not alternating keys and values.
      This doesn't really make much difference right at the moment, but it will
      allow providing a fast path for extracting individual object fields from
      large JSONB values stored EXTERNAL (ie, uncompressed), analogously to the
      existing optimization for substring extraction from large EXTERNAL text
      values.
      
      Bump catversion to denote the incompatibility in on-disk format.
      We will need to fix pg_upgrade to disallow upgrading jsonb data stored
      with 9.4 betas 1 and 2.
      
      Heikki Linnakangas and Tom Lane
      def4c28c
  5. 26 Sep, 2014 8 commits
    • Stephen Frost's avatar
      Fix relcache for policies, and doc updates · ff27fcfa
      Stephen Frost authored
      Andres pointed out that there was an extra ';' in equalPolicies, which
      made me realize that my prior testing with CLOBBER_CACHE_ALWAYS was
      insufficient (it didn't always catch the issue, just most of the time).
      Thanks to that, a different issue was discovered, specifically in
      equalRSDescs.  This change corrects eqaulRSDescs to return 'true' once
      all policies have been confirmed logically identical.  After stepping
      through both functions to ensure correct behavior, I ran this for
      about 12 hours of CLOBBER_CACHE_ALWAYS runs of the regression tests
      with no failures.
      
      In addition, correct a few typos in the documentation which were pointed
      out by Thom Brown (thanks!) and improve the policy documentation further
      by adding a flushed out usage example based on a unix passwd file.
      
      Lastly, clean up a few comments in the regression tests and pg_dump.h.
      ff27fcfa
    • Robert Haas's avatar
      Fix identify_locking_dependencies for schema-only dumps. · 07d46a89
      Robert Haas authored
      Without this fix, parallel restore of a schema-only dump can deadlock,
      because when the dump is schema-only, the dependency will still be
      pointing at the TABLE item rather than the TABLE DATA item.
      
      Robert Haas and Tom Lane
      07d46a89
    • Andres Freund's avatar
      Further atomic ops portability improvements and bug fixes. · f9f07411
      Andres Freund authored
      * Don't play tricks for a more efficient pg_atomic_clear_flag() in the
        generic gcc implementation. The old version was broken on gcc < 4.7
        on !x86 platforms. Per buildfarm member chipmunk.
      * Make usage of __atomic() fences depend on HAVE_GCC__ATOMIC_INT32_CAS
        instead of HAVE_GCC__ATOMIC_INT64_CAS - there's platforms with 32bit
        support that don't support 64bit atomics.
      * Blindly fix two superflous #endif in generic-xlc.h
      * Check for --disable-atomics in platforms but x86.
      f9f07411
    • Andres Freund's avatar
      Fix a couple occurrences of 'the the' in the new atomics API. · a30199b0
      Andres Freund authored
      Author: Erik Rijkers
      a30199b0
    • Peter Eisentraut's avatar
      Fix whitespace · d11339c0
      Peter Eisentraut authored
      d11339c0
    • Andres Freund's avatar
      Define META_FREE in a way that doesn't cause -Wempty-body warnings. · 9b6bb9b4
      Andres Freund authored
      That get rids of the only -Wempty-body warning when compiling postgres
      with gcc 4.8/9. As 6550b901 shows, it's useful to be able to use that
      option routinely.
      
      Without asserts there's many more warnings, but that's food for
      another commit.
      9b6bb9b4
    • Andres Freund's avatar
      Fix atomic ops inline x86 inline assembly for older 32bit gccs. · f18cad94
      Andres Freund authored
      Some x86 32bit versions of gcc apparently generate references to the
      nonexistant %sil register when using when using the r input
      constraint, but not with the =q constraint. The latter restricts
      allocations to a/b/c/d which should all work.
      f18cad94
    • Andres Freund's avatar
      Fix atomic ops for x86 gcc compilers that don't understand atomic intrinsics. · 88bcdf9d
      Andres Freund authored
      Per buildfarm animal locust.
      88bcdf9d
  6. 25 Sep, 2014 7 commits
    • Andres Freund's avatar
      Add a basic atomic ops API abstracting away platform/architecture details. · b64d92f1
      Andres Freund authored
      Several upcoming performance/scalability improvements require atomic
      operations. This new API avoids the need to splatter compiler and
      architecture dependent code over all the locations employing atomic
      ops.
      
      For several of the potential usages it'd be problematic to maintain
      both, a atomics using implementation and one using spinlocks or
      similar. In all likelihood one of the implementations would not get
      tested regularly under concurrency. To avoid that scenario the new API
      provides a automatic fallback of atomic operations to spinlocks. All
      properties of atomic operations are maintained. This fallback -
      obviously - isn't as fast as just using atomic ops, but it's not bad
      either. For one of the future users the atomics ontop spinlocks
      implementation was actually slightly faster than the old purely
      spinlock using implementation. That's important because it reduces the
      fear of regressing older platforms when improving the scalability for
      new ones.
      
      The API, loosely modeled after the C11 atomics support, currently
      provides 'atomic flags' and 32 bit unsigned integers. If the platform
      efficiently supports atomic 64 bit unsigned integers those are also
      provided.
      
      To implement atomics support for a platform/architecture/compiler for
      a type of atomics 32bit compare and exchange needs to be
      implemented. If available and more efficient native support for flags,
      32 bit atomic addition, and corresponding 64 bit operations may also
      be provided. Additional useful atomic operations are implemented
      generically ontop of these.
      
      The implementation for various versions of gcc, msvc and sun studio have
      been tested. Additional existing stub implementations for
      * Intel icc
      * HUPX acc
      * IBM xlc
      are included but have never been tested. These will likely require
      fixes based on buildfarm and user feedback.
      
      As atomic operations also require barriers for some operations the
      existing barrier support has been moved into the atomics code.
      
      Author: Andres Freund with contributions from Oskari Saarenmaa
      Reviewed-By: Amit Kapila, Robert Haas, Heikki Linnakangas and Álvaro Herrera
      Discussion: CA+TgmoYBW+ux5-8Ja=Mcyuy8=VXAnVRHp3Kess6Pn3DMXAPAEA@mail.gmail.com,
          20131015123303.GH5300@awork2.anarazel.de,
          20131028205522.GI20248@awork2.anarazel.de
      b64d92f1
    • Andrew Dunstan's avatar
      Remove ill-conceived ban on zero length json object keys. · 9111d463
      Andrew Dunstan authored
      We removed a similar ban on this in json_object recently, but the ban in
      datum_to_json was left, which generate4d sprutious errors in othee json
      generators, notable json_build_object.
      
      Along the way, add an assertion that datum_to_json is not passed a null
      key. All current callers comply with this rule, but the assertion will
      catch any possible future misbehaviour.
      9111d463
    • Robert Haas's avatar
      Change locking regimen around buffer replacement. · 5d7962c6
      Robert Haas authored
      Previously, we used an lwlock that was held from the time we began
      seeking a candidate buffer until the time when we found and pinned
      one, which is disastrous for concurrency.  Instead, use a spinlock
      which is held just long enough to pop the freelist or advance the
      clock sweep hand, and then released.  If we need to advance the clock
      sweep further, we reacquire the spinlock once per buffer.
      
      This represents a significant increase in atomic operations around
      buffer eviction, but it still wins on many workloads.  On others, it
      may result in no gain, or even cause a regression, unless the number
      of buffer mapping locks is also increased.  However, that seems like
      material for a separate commit.  We may also need to consider other
      methods of mitigating contention on this spinlock, such as splitting
      it into multiple locks or jumping the clock sweep hand more than one
      buffer at a time, but those, too, seem like separate improvements.
      
      Patch by me, inspired by a much larger patch from Amit Kapila.
      Reviewed by Andres Freund.
      5d7962c6
    • Heikki Linnakangas's avatar
      Refactor space allocation for base64 encoding/decoding in pgcrypto. · 1dcfb8da
      Heikki Linnakangas authored
      Instead of trying to accurately calculate the space needed, use a StringInfo
      that's enlarged as needed. This is just moving things around currently - the
      old code was not wrong - but this is in preparation for a patch that adds
      support for extra armor headers, and would make the space calculation more
      complicated.
      
      Marko Tiikkaja
      1dcfb8da
    • Andres Freund's avatar
      Fix VPATH builds of the replication parser from git for some !gcc compilers. · 56a312aa
      Andres Freund authored
      Some compilers don't automatically search the current directory for
      included files. 9cc2c182 fixed that for builds from tarballs by
      adding an include to the source directory. But that doesn't work when
      the scanner is generated in the VPATH directory. Use the same search
      path as the other parsers in the tree.
      
      One compiler that definitely was affected is solaris' sun cc.
      
      Backpatch to 9.1 which introduced using an actual parser for
      replication commands.
      56a312aa
    • Andrew Dunstan's avatar
      Return NULL from json_object_agg if it gets no rows. · ecacbdbc
      Andrew Dunstan authored
      This makes it consistent with the docs and with all other builtin
      aggregates apart from count().
      ecacbdbc
    • Heikki Linnakangas's avatar
      Add -D option to specify data directory to pg_controldata and pg_resetxlog. · b0d81ade
      Heikki Linnakangas authored
      It was confusing that to other commands, like initdb and postgres, you would
      pass the data directory with "-D datadir", but pg_controldata and
      pg_resetxlog would take just plain path, without the "-D". With this patch,
      pg_controldata and pg_resetxlog also accept "-D datadir".
      
      Abhijit Menon-Sen, with minor kibitzing by me
      b0d81ade
  7. 24 Sep, 2014 5 commits
    • Stephen Frost's avatar
      Copy-editing of row security · afd1d95f
      Stephen Frost authored
      Address a few typos in the row security update, pointed out
      off-list by Adam Brightwell.  Also include 'ALL' in the list
      of commands supported, for completeness.
      afd1d95f
    • Stephen Frost's avatar
      Code review for row security. · 6550b901
      Stephen Frost authored
      Buildfarm member tick identified an issue where the policies in the
      relcache for a relation were were being replaced underneath a running
      query, leading to segfaults while processing the policies to be added
      to a query.  Similar to how TupleDesc RuleLocks are handled, add in a
      equalRSDesc() function to check if the policies have actually changed
      and, if not, swap back the rsdesc field (using the original instead of
      the temporairly built one; the whole structure is swapped and then
      specific fields swapped back).  This now passes a CLOBBER_CACHE_ALWAYS
      for me and should resolve the buildfarm error.
      
      In addition to addressing this, add a new chapter in Data Definition
      under Privileges which explains row security and provides examples of
      its usage, change \d to always list policies (even if row security is
      disabled- but note that it is disabled, or enabled with no policies),
      rework check_role_for_policy (it really didn't need the entire policy,
      but it did need to be using has_privs_of_role()), and change the field
      in pg_class to relrowsecurity from relhasrowsecurity, based on
      Heikki's suggestion.  Also from Heikki, only issue SET ROW_SECURITY in
      pg_restore when talking to a 9.5+ server, list Bypass RLS in \du, and
      document --enable-row-security options for pg_dump and pg_restore.
      
      Lastly, fix a number of minor whitespace and typo issues from Heikki,
      Dimitri, add a missing #include, per Peter E, fix a few minor
      variable-assigned-but-not-used and resource leak issues from Coverity
      and add tab completion for role attribute bypassrls as well.
      6550b901
    • Tom Lane's avatar
      Fix bogus variable-mangling in security_barrier_replace_vars(). · 3f6f9260
      Tom Lane authored
      This function created new Vars with varno different from varnoold, which
      is a condition that should never prevail before setrefs.c does the final
      variable-renumbering pass.  The created Vars could not be seen as equal()
      to normal Vars, which among other things broke equivalence-class processing
      for them.  The consequences of this were indeed visible in the regression
      tests, in the form of failure to propagate constants as one would expect.
      I stumbled across it while poking at bug #11457 --- after intentionally
      disabling join equivalence processing, the security-barrier regression
      tests started falling over with fun errors like "could not find pathkey
      item to sort", because of failure to match the corrupted Vars to normal
      ones.
      3f6f9260
    • Andrew Dunstan's avatar
      b1a52872
    • Tom Lane's avatar
      Fix incorrect search for "x?" style matches in creviterdissect(). · 3694b4d7
      Tom Lane authored
      When the number of allowed iterations is limited (either a "?" quantifier
      or a bound expression), the last sub-match has to reach to the end of the
      target string.  The previous coding here first tried the shortest possible
      match (one character, usually) and then gave up and back-tracked if that
      didn't work, typically leading to failure to match overall, as shown in
      bug #11478 from Christoph Berg.  The minimum change to fix that would be to
      not decrement k before "goto backtrack"; but that would be a pretty stupid
      solution, because we'd laboriously try each possible sub-match length
      before finally discovering that only ending at the end can work.  Instead,
      force the sub-match endpoint limit up to the end for even the first
      shortest() call if we cannot have any more sub-matches after this one.
      
      Bug introduced in my rewrite that added the iterdissect logic, commit
      173e29aa.  The shortest-first search code
      was too closely modeled on the longest-first code, which hasn't got this
      issue since it tries a match reaching to the end to start with anyway.
      Back-patch to all affected branches.
      3694b4d7
  8. 23 Sep, 2014 2 commits
    • Stephen Frost's avatar
      Add unicode_*_linestyle to \? variables · a5643073
      Stephen Frost authored
      In a2dabf0e we added the ability to have single or double unicode
      linestyle for the border, column, or header.  Unfortunately, the
      \? variables output was not updated for these new psql variables.
      
      This corrects that oversight.
      
      Patch by Pavel Stehule.
      a5643073
    • Stephen Frost's avatar
      Log ALTER SYSTEM statements as DDL · 43bed84c
      Stephen Frost authored
      Per discussion in bug #11350, log ALTER SYSTEM commands at the
      log_statement=ddl level, rather than at the log_statement=all level.
      
      Pointed out by Tomonari Katsumata.
      
      Back-patch to 9.4 where ALTER SYSTEM was introduced.
      43bed84c