1. 16 Nov, 2018 2 commits
    • Andres Freund's avatar
      Compute information about EEOP_*_FETCHSOME at expression init time. · 675af5c0
      Andres Freund authored
      Previously this information was computed when JIT compiling an
      expression.  But the information is useful for assertions in the
      non-JIT case too (for assertions), therefore it makes sense to move
      it.
      
      This will, in a followup commit, allow to treat different slot types
      differently. E.g. for virtual slots there's no need to generate a JIT
      function to deform the slot.
      
      Author: Andres Freund
      Discussion: https://postgr.es/m/20181105210039.hh4vvi4vwoq5ba2q@alap3.anarazel.de
      675af5c0
    • Andres Freund's avatar
      Introduce notion of different types of slots (without implementing them). · 1a0586de
      Andres Freund authored
      Upcoming work intends to allow pluggable ways to introduce new ways of
      storing table data. Accessing those table access methods from the
      executor requires TupleTableSlots to be carry tuples in the native
      format of such storage methods; otherwise there'll be a significant
      conversion overhead.
      
      Different access methods will require different data to store tuples
      efficiently (just like virtual, minimal, heap already require fields
      in TupleTableSlot). To allow that without requiring additional pointer
      indirections, we want to have different structs (embedding
      TupleTableSlot) for different types of slots.  Thus different types of
      slots are needed, which requires adapting creators of slots.
      
      The slot that most efficiently can represent a type of tuple in an
      executor node will often depend on the type of slot a child node
      uses. Therefore we need to track the type of slot is returned by
      nodes, so parent slots can create slots based on that.
      
      Relatedly, JIT compilation of tuple deforming needs to know which type
      of slot a certain expression refers to, so it can create an
      appropriate deforming function for the type of tuple in the slot.
      
      But not all nodes will only return one type of slot, e.g. an append
      node will potentially return different types of slots for each of its
      subplans.
      
      Therefore add function that allows to query the type of a node's
      result slot, and whether it'll always be the same type (whether it's
      fixed). This can be queried using ExecGetResultSlotOps().
      
      The scan, result, inner, outer type of slots are automatically
      inferred from ExecInitScanTupleSlot(), ExecInitResultSlot(),
      left/right subtrees respectively. If that's not correct for a node,
      that can be overwritten using new fields in PlanState.
      
      This commit does not introduce the actually abstracted implementation
      of different kind of TupleTableSlots, that will be left for a followup
      commit.  The different types of slots introduced will, for now, still
      use the same backing implementation.
      
      While this already partially invalidates the big comment in
      tuptable.h, it seems to make more sense to update it later, when the
      different TupleTableSlot implementations actually exist.
      
      Author: Ashutosh Bapat and Andres Freund, with changes by Amit Khandekar
      Discussion: https://postgr.es/m/20181105210039.hh4vvi4vwoq5ba2q@alap3.anarazel.de
      1a0586de
  2. 15 Nov, 2018 12 commits
  3. 14 Nov, 2018 8 commits
    • Tom Lane's avatar
      Make psql's "\pset format" command reject non-unique abbreviations. · eaf746a5
      Tom Lane authored
      The previous behavior of preferring the oldest match had the advantage
      of not breaking existing scripts when we add a conflicting format name;
      but that behavior was undocumented and fragile (it seems just luck that
      commit add9182e didn't break it).  Let's go over to the less mistake-
      prone approach of complaining when there are multiple matches.
      
      Since this is a small compatibility break, no back-patch.
      
      Daniel Vérité
      
      Discussion: https://postgr.es/m/cb7e1caf-3ea6-450d-af28-f524903a030c@manitou-mail.org
      eaf746a5
    • Tom Lane's avatar
      Doc: remove claim that all \pset format options are unique in 1 letter. · 51eaaafb
      Tom Lane authored
      This hasn't been correct since 9.3 added "latex-longtable".
      
      I left the phraseology "Unique abbreviations are allowed" alone.
      It's correct as far as it goes, and we are studiously refraining
      from specifying exactly what happens if you give a non-unique
      abbreviation.  (The answer in the back branches is "you get a
      backwards-compatible choice", and the answer in HEAD will shortly
      be "you get an error", but there seems no need to mention such
      details here.)
      
      Daniel Vérité
      
      Discussion: https://postgr.es/m/cb7e1caf-3ea6-450d-af28-f524903a030c@manitou-mail.org
      51eaaafb
    • Tom Lane's avatar
      Add a timezone-specific variant of date_trunc(). · 600b04d6
      Tom Lane authored
      date_trunc(field, timestamptz, zone_name) performs truncation using
      the named time zone as reference, rather than working in the session
      time zone as is the default behavior.  It's equivalent to
      
      date_trunc(field, timestamptz at time zone zone_name) at time zone zone_name
      
      but it's faster, easier to type, and arguably easier to understand.
      
      Vik Fearing and Tom Lane
      
      Discussion: https://postgr.es/m/6249ffc4-2b22-4c1b-4e7d-7af84fedd7c6@2ndquadrant.com
      600b04d6
    • Tom Lane's avatar
      Second try at fixing numeric data passed through an ECPG SQLDA. · 06c72344
      Tom Lane authored
      In commit ecfd5579, I removed sqlda.c's checks for ndigits != 0 on the
      grounds that we should duplicate the state of the numeric value's digit
      buffer even when all the digits are zeroes.  However, that still isn't
      quite right, because another possible state of the digit buffer is
      buf == digits == NULL (this occurs for a NaN).  As the code now stands,
      it'll invoke memcpy with a NULL source address and zero bytecount,
      which we know a few platforms crash on.  Hence, reinstate the no-copy
      short-circuit, but make it test specifically for buf != NULL rather than
      some other condition.  In hindsight, the ndigits test (added by commit
      f2ae9f9c) was almost certainly meant to fix the NaN case not the
      all-zeroes case as the associated thread alleged.
      
      As before, back-patch to all supported versions.
      
      Discussion: https://postgr.es/m/1803D792815FC24D871C00D17AE95905C71161@g01jpexmbkw24
      06c72344
    • Peter Eisentraut's avatar
      Lower lock level for renaming indexes · 1b5d797c
      Peter Eisentraut authored
      Change lock level for renaming index (either ALTER INDEX or implicitly
      via some other commands) from AccessExclusiveLock to
      ShareUpdateExclusiveLock.
      
      One reason we need a strong lock for relation renaming is that the
      name change causes a rebuild of the relcache entry.  Concurrent
      sessions that have the relation open might not be able to handle the
      relcache entry changing underneath them.  Therefore, we need to lock
      the relation in a way that no one can have the relation open
      concurrently.  But for indexes, the relcache handles reloads specially
      in RelationReloadIndexInfo() in a way that keeps changes in the
      relcache entry to a minimum.  As long as no one keeps pointers to
      rd_amcache and rd_options around across possible relcache flushes,
      which is the case, this ought to be safe.
      
      We also want to use a self-exclusive lock for correctness, so that
      concurrent DDL doesn't overwrite the rename if they start updating
      while still seeing the old version.  Therefore, we use
      ShareUpdateExclusiveLock, which is already used by other DDL commands
      that want to operate in a concurrent manner.
      
      The reason this is interesting at all is that renaming an index is a
      typical part of a concurrent reindexing workflow (CREATE INDEX
      CONCURRENTLY new + DROP INDEX CONCURRENTLY old + rename back).  And
      indeed a future built-in REINDEX CONCURRENTLY might rely on the ability
      to do concurrent renames as well.
      Reviewed-by: default avatarAndrey Klychkov <aaklychkov@mail.ru>
      Reviewed-by: default avatarFabrízio de Royes Mello <fabriziomello@gmail.com>
      Discussion: https://www.postgresql.org/message-id/flat/1531767486.432607658@f357.i.mail.ru
      1b5d797c
    • Michael Paquier's avatar
      Initialize TransactionState and user ID consistently at transaction start · b4721f39
      Michael Paquier authored
      If a failure happens when a transaction is starting between the moment
      the transaction status is changed from TRANS_DEFAULT to TRANS_START and
      the moment the current user ID and security context flags are fetched
      via GetUserIdAndSecContext(), or before initializing its basic fields,
      then those may get reset to incorrect values when the transaction
      aborts, leaving the session in an inconsistent state.
      
      One problem reported is that failing a starting transaction at the first
      query of a session could cause several kinds of system crashes on the
      follow-up queries.
      
      In order to solve that, move the initialization of the transaction state
      fields and the call of GetUserIdAndSecContext() in charge of fetching
      the current user ID close to the point where the transaction status is
      switched to TRANS_START, where there cannot be any error triggered
      in-between, per an idea of Tom Lane.  This properly ensures that the
      current user ID, the security context flags and that the basic fields of
      TransactionState remain consistent even if the transaction fails while
      starting.
      
      Reported-by: Richard Guo
      Diagnosed-By: Richard Guo
      Author: Michael Paquier
      Reviewed-by: Tom Lane
      Discussion: https://postgr.es/m/CAN_9JTxECSb=pEPcb0a8d+6J+bDcOZ4=DgRo_B7Y5gRHJUM=Rw@mail.gmail.com
      Backpatch-through: 9.4
      b4721f39
    • Michael Paquier's avatar
      Add flag values in WAL description to all heap records · 3be97b97
      Michael Paquier authored
      Hexadecimal is consistently used as format to not bloat too much the
      output but keep it readable.  This information is useful mainly for
      debugging purposes with for example pg_waldump.
      
      Author: Michael Paquier
      Reviewed-by: Nathan Bossart, Dmitry Dolgov, Andres Freund, Álvaro
      Herrera
      Discussion: https://postgr.es/m/20180413034734.GE1552@paquier.xyz
      3be97b97
    • Michael Paquier's avatar
      Refactor code creating PartitionBoundInfo · b52b7dc2
      Michael Paquier authored
      The code building PartitionBoundInfo based on the constituent partition
      data read from catalogs has been located in partcache.c, with a specific
      set of routines dedicated to bound types, like sorting or bound data
      creation.  All this logic is moved to partbounds.c and relocates all the
      bound-specific logistic into it, with partition_bounds_create() as
      principal entry point.
      
      Author: Amit Langote
      Reviewed-by: Michael Paquier, Álvaro Herrera
      Discussion: https://postgr.es/m/3f289da8-6d10-75fe-814a-635e8b191d43@lab.ntt.co.jp
      b52b7dc2
  4. 13 Nov, 2018 11 commits
  5. 12 Nov, 2018 6 commits
    • Michael Paquier's avatar
      Remove CommandCounterIncrement() after processing ON COMMIT DELETE · 52b70b1c
      Michael Paquier authored
      This comes from f9b5b41e, which is part of one the original commits that
      implemented ON COMMIT actions.  By looking at the truncation code, any
      CCI needed happens locally when rebuilding indexes, so it looks safe to
      just remove this final incrementation.
      
      Author: Michael Paquier
      Reviewed-by: Álvaro Herrera
      Discussion: https://postgr.es/m/20181109024731.GF2652@paquier.xyz
      52b70b1c
    • Tom Lane's avatar
      Simplify null-element handling in extension_config_remove(). · 3de49148
      Tom Lane authored
      There's no point in asking deconstruct_array() for a null-flags
      array when we already checked the array has no nulls, and aren't
      going to examine the output anyhow.  Not asking for this output
      should make the code marginally faster, and it's also more
      robust since if there somehow were nulls, deconstruct_array()
      would throw an error.
      
      Daniel Gustafsson
      
      Discussion: https://postgr.es/m/289FFB8B-7AAB-48B5-A497-6E0D41D7BA47@yesql.se
      3de49148
    • Tom Lane's avatar
      Limit the number of index clauses considered in choose_bitmap_and(). · e3f005d9
      Tom Lane authored
      classify_index_clause_usage() is O(N^2) in the number of distinct index
      qual clauses it considers, because of its use of a simple search list to
      store them.  For nearly all queries, that's fine because only a few clauses
      will be considered.  But Alexander Kuzmenkov reported a machine-generated
      query with 80000 (!) index qual clauses, which caused this code to take
      forever.  Somewhat remarkably, this is the only O(N^2) behavior we now
      have for such a query, so let's fix it.
      
      We can get rid of the O(N^2) runtime for cases like this without much
      damage to the functionality of choose_bitmap_and() by separating out
      paths with "too many" qual or pred clauses, and deeming them to always
      be nonredundant with other paths.  Then their clauses needn't go into
      the search list, so it doesn't get too long, but we don't lose the
      ability to consider bitmap AND plans altogether.  I set the threshold
      for "too many" to be 100 clauses per path, which should be plenty to
      ensure no change in planning behavior for normal queries.
      
      There are other things we could do to make this go faster, but it's not
      clear that it's worth any additional effort.  80000 qual clauses require
      a whole lot of work in many other places, too.
      
      The code's been like this for a long time, so back-patch to all supported
      branches.  The troublesome query only works back to 9.5 (in 9.4 it fails
      with stack overflow in the parser); so I'm not sure that fixing this in
      9.4 has any real-world benefit, but perhaps it does.
      
      Discussion: https://postgr.es/m/90c5bdfa-d633-dabe-9889-3cf3e1acd443@postgrespro.ru
      e3f005d9
    • Michael Paquier's avatar
      ffb68980
    • Peter Eisentraut's avatar
      doc: Small punctuation improvement · fc151211
      Peter Eisentraut authored
      fc151211
    • Peter Eisentraut's avatar
      doc: Small run-time pruning doc fix · 253b3f67
      Peter Eisentraut authored
      A note in ddl.sgml used to mention that run-time pruning was only
      implemented for Append.  When we got MergeAppend support, this was
      updated to mention that MergeAppend is supported too.  This is
      slightly weird as it's not all that obvious what exactly isn't
      supported when we mention:
      
          <para>
           Both of these behaviors are likely to be changed in a future release
           of <productname>PostgreSQL</productname>.
          </para>
      
      This patch updates this to mention that ModifyTable is unsupported,
      which makes the above fragment make sense again.
      
      Author: David Rowley <david.rowley@2ndquadrant.com>
      253b3f67
  6. 11 Nov, 2018 1 commit