1. 07 May, 2014 2 commits
  2. 06 May, 2014 17 commits
  3. 05 May, 2014 15 commits
  4. 04 May, 2014 2 commits
  5. 02 May, 2014 2 commits
    • Peter Eisentraut's avatar
    • Tom Lane's avatar
      Fix yet another corner case in dumping rules/views with USING clauses. · 91e16b98
      Tom Lane authored
      ruleutils.c tries to cope with additions/deletions/renamings of columns in
      tables referenced by views, by means of adding machine-generated aliases to
      the printed form of a view when needed to preserve the original semantics.
      A recent blog post by Marko Tiikkaja pointed out a case I'd missed though:
      if one input of a join with USING is itself a join, there is nothing to
      stop the user from adding a column of the same name as the USING column to
      whichever side of the sub-join didn't provide the USING column.  And then
      there'll be an error when the view is re-parsed, since now the sub-join
      exposes two columns matching the USING specification.  We were catching a
      lot of related cases, but not this one, so add some logic to cope with it.
      
      Back-patch to 9.3, which is the first release that makes any serious
      attempt to cope with such cases (cf commit 2ffa740b and follow-ons).
      91e16b98
  6. 01 May, 2014 2 commits
    • Tom Lane's avatar
      Fix "quiet inline" configure test for newer clang compilers. · 4c8aa8b5
      Tom Lane authored
      This test used to just define an unused static inline function and check
      whether that causes a warning.  But newer clang versions warn about
      unused static inline functions when defined inside a .c file, but not
      when defined in an included header, which is the case we care about.
      Change the test to cope.
      
      Andres Freund
      4c8aa8b5
    • Tom Lane's avatar
      Fix failure to detoast fields in composite elements of structured types. · 3f8c8e3c
      Tom Lane authored
      If we have an array of records stored on disk, the individual record fields
      cannot contain out-of-line TOAST pointers: the tuptoaster.c mechanisms are
      only prepared to deal with TOAST pointers appearing in top-level fields of
      a stored row.  The same applies for ranges over composite types, nested
      composites, etc.  However, the existing code only took care of expanding
      sub-field TOAST pointers for the case of nested composites, not for other
      structured types containing composites.  For example, given a command such
      as
      
      UPDATE tab SET arraycol = ARRAY[(ROW(x,42)::mycompositetype] ...
      
      where x is a direct reference to a field of an on-disk tuple, if that field
      is long enough to be toasted out-of-line then the TOAST pointer would be
      inserted as-is into the array column.  If the source record for x is later
      deleted, the array field value would become a dangling pointer, leading
      to errors along the line of "missing chunk number 0 for toast value ..."
      when the value is referenced.  A reproducible test case for this was
      provided by Jan Pecek, but it seems likely that some of the "missing chunk
      number" reports we've heard in the past were caused by similar issues.
      
      Code-wise, the problem is that PG_DETOAST_DATUM() is not adequate to
      produce a self-contained Datum value if the Datum is of composite type.
      Seen in this light, the problem is not just confined to arrays and ranges,
      but could also affect some other places where detoasting is done in that
      way, for example form_index_tuple().
      
      I tried teaching the array code to apply toast_flatten_tuple_attribute()
      along with PG_DETOAST_DATUM() when the array element type is composite,
      but this was messy and imposed extra cache lookup costs whether or not any
      TOAST pointers were present, indeed sometimes when the array element type
      isn't even composite (since sometimes it takes a typcache lookup to find
      that out).  The idea of extending that approach to all the places that
      currently use PG_DETOAST_DATUM() wasn't attractive at all.
      
      This patch instead solves the problem by decreeing that composite Datum
      values must not contain any out-of-line TOAST pointers in the first place;
      that is, we expand out-of-line fields at the point of constructing a
      composite Datum, not at the point where we're about to insert it into a
      larger tuple.  This rule is applied only to true composite Datums, not
      to tuples that are being passed around the system as tuples, so it's not
      as invasive as it might sound at first.  With this approach, the amount
      of code that has to be touched for a full solution is greatly reduced,
      and added cache lookup costs are avoided except when there actually is
      a TOAST pointer that needs to be inlined.
      
      The main drawback of this approach is that we might sometimes dereference
      a TOAST pointer that will never actually be used by the query, imposing a
      rather large cost that wasn't there before.  On the other side of the coin,
      if the field value is used multiple times then we'll come out ahead by
      avoiding repeat detoastings.  Experimentation suggests that common SQL
      coding patterns are unaffected either way, though.  Applications that are
      very negatively affected could be advised to modify their code to not fetch
      columns they won't be using.
      
      In future, we might consider reverting this solution in favor of detoasting
      only at the point where data is about to be stored to disk, using some
      method that can drill down into multiple levels of nested structured types.
      That will require defining new APIs for structured types, though, so it
      doesn't seem feasible as a back-patchable fix.
      
      Note that this patch changes HeapTupleGetDatum() from a macro to a function
      call; this means that any third-party code using that macro will not get
      protection against creating TOAST-pointer-containing Datums until it's
      recompiled.  The same applies to any uses of PG_RETURN_HEAPTUPLEHEADER().
      It seems likely that this is not a big problem in practice: most of the
      tuple-returning functions in core and contrib produce outputs that could
      not possibly be toasted anyway, and the same probably holds for third-party
      extensions.
      
      This bug has existed since TOAST was invented, so back-patch to all
      supported branches.
      3f8c8e3c