1. 17 Nov, 2018 3 commits
    • Tom Lane's avatar
      Leave SIGTTIN/SIGTTOU signal handling alone in postmaster child processes. · 125f551c
      Tom Lane authored
      For reasons lost in the mists of time, most postmaster child processes
      reset SIGTTIN/SIGTTOU signal handling to SIG_DFL, with the major exception
      that backend sessions do not.  It seems like a pretty bad idea for any
      postmaster children to do that: if stderr is connected to the terminal,
      and the user has put the postmaster in background, any log output would
      result in the child process freezing up.  Hence, switch them all to
      doing what backends do, ie, nothing.  This allows them to inherit the
      postmaster's SIG_IGN setting.  On the other hand, manually-launched
      processes such as standalone backends will have default processing,
      which seems fine.
      
      In passing, also remove useless resets of SIGCONT and SIGWINCH signal
      processing.  Perhaps the postmaster once changed those to something
      besides SIG_DFL, but it doesn't now, so these are just wasted (and
      confusing) syscalls.
      
      Basically, this propagates the changes made in commit 8e2998d8 from
      backends to other postmaster children.  Probably the only reason these
      calls now exist elsewhere is that I missed changing pgstat.c along with
      postgres.c at the time.
      
      Given the lack of field complaints that can be traced to this, I don't
      presently feel a need to back-patch.
      
      Discussion: https://postgr.es/m/5627.1542477392@sss.pgh.pa.us
      125f551c
    • Andres Freund's avatar
    • Andres Freund's avatar
      Make TupleTableSlots extensible, finish split of existing slot type. · 4da597ed
      Andres Freund authored
      This commit completes the work prepared in 1a0586de, splitting the
      old TupleTableSlot implementation (which could store buffer, heap,
      minimal and virtual slots) into four different slot types.  As
      described in the aforementioned commit, this is done with the goal of
      making tuple table slots extensible, to allow for pluggable table
      access methods.
      
      To achieve runtime extensibility for TupleTableSlots, operations on
      slots that can differ between types of slots are performed using the
      TupleTableSlotOps struct provided at slot creation time.  That
      includes information from the size of TupleTableSlot struct to be
      allocated, initialization, deforming etc.  See the struct's definition
      for more detailed information about callbacks TupleTableSlotOps.
      
      I decided to rename TTSOpsBufferTuple to TTSOpsBufferHeapTuple and
      ExecCopySlotTuple to ExecCopySlotHeapTuple, as that seems more
      consistent with other naming introduced in recent patches.
      
      There's plenty optimization potential in the slot implementation, but
      according to benchmarking the state after this commit has similar
      performance characteristics to before this set of changes, which seems
      sufficient.
      
      There's a few changes in execReplication.c that currently need to poke
      through the slot abstraction, that'll be repaired once the pluggable
      storage patchset provides the necessary infrastructure.
      
      Author: Andres Freund and  Ashutosh Bapat, with changes by Amit Khandekar
      Discussion: https://postgr.es/m/20181105210039.hh4vvi4vwoq5ba2q@alap3.anarazel.de
      4da597ed
  2. 16 Nov, 2018 10 commits
    • Alvaro Herrera's avatar
      Avoid re-typedef'ing PartitionTupleRouting · 0201d79a
      Alvaro Herrera authored
      Apparently, gcc on macOS (?) doesn't like it.
      
      Per buildfarm.
      0201d79a
    • Alvaro Herrera's avatar
      pgbench: introduce a RandomState struct · 40923191
      Alvaro Herrera authored
      This becomes useful when used to retry a transaction after a
      serialization error or deadlock abort.  (We don't yet have that feature,
      but this is preparation for it.)
      
      While at it, use separate random state for thread administratrivia such
      as deciding which script to run, how long to delay for throttling, or
      whether to log a message when sampling; this not only makes these tasks
      independent of each other, but makes the actual thread run
      deterministic.
      
      Author: Marina Polyakova
      Reviewed-by: Fabien Coelho
      Discussion: https://postgr.es/m/72a0d590d6ba06f242d75c2e641820ec@postgrespro.ru
      40923191
    • Andres Freund's avatar
      Inline hot path of slot_getsomeattrs(). · a7aa608e
      Andres Freund authored
      This yields a minor speedup, which roughly balances the loss from the
      upcoming introduction of callbacks to do some operations on slots.
      
      Author: Andres Freund
      Discussion: https://postgr.es/m/20181105210039.hh4vvi4vwoq5ba2q@alap3.anarazel.de
      a7aa608e
    • Alvaro Herrera's avatar
      Redesign initialization of partition routing structures · 3f2393ed
      Alvaro Herrera authored
      This speeds up write operations (INSERT, UPDATE, DELETE, COPY, as well
      as the future MERGE) on partitioned tables.
      
      This changes the setup for tuple routing so that it does far less work
      during the initial setup and pushes more work out to when partitions
      receive tuples.  PartitionDispatchData structs for sub-partitioned
      tables are only created when a tuple gets routed through it.  The
      possibly large arrays in the PartitionTupleRouting struct have largely
      been removed.  The partitions[] array remains but now never contains any
      NULL gaps.  Previously the NULLs had to be skipped during
      ExecCleanupTupleRouting(), which could add a large overhead to the
      cleanup when the number of partitions was large.  The partitions[] array
      is allocated small to start with and only enlarged when we route tuples
      to enough partitions that it runs out of space. This allows us to keep
      simple single-row partition INSERTs running quickly.  Redesign
      
      The arrays in PartitionTupleRouting which stored the tuple translation maps
      have now been removed.  These have been moved out into a
      PartitionRoutingInfo struct which is an additional field in ResultRelInfo.
      
      The find_all_inheritors() call still remains by far the slowest part of
      ExecSetupPartitionTupleRouting(). This commit just removes the other slow
      parts.
      
      In passing also rename the tuple translation maps from being ParentToChild
      and ChildToParent to being RootToPartition and PartitionToRoot. The old
      names mislead you into thinking that a partition of some sub-partitioned
      table would translate to the rowtype of the sub-partitioned table rather
      than the root partitioned table.
      
      Authors: David Rowley and Amit Langote, heavily revised by Álvaro Herrera
      Testing help from Jesper Pedersen and Kato Sho.
      Discussion: https://postgr.es/m/CAKJS1f_1RJyFquuCKRFHTdcXqoPX-PYqAd7nz=GVBwvGh4a6xA@mail.gmail.com
      3f2393ed
    • Andres Freund's avatar
      Fix slot type assumptions for nodeGather[Merge]. · a387a3df
      Andres Freund authored
      The assumption made in 1a0586de was wrong, as evidenced by
      buildfarm failure on locust, which runs with
      force_parallel_mode=regress.  The tuples accessed in either nodes are
      in the outer slot, and we can't trivially rely on the slot type being
      known because the leader might execute the subsidiary node directly,
      or via the tuple queue on a worker. In the latter case the tuple will
      always be a heaptuple slot, but in the former, it'll be whatever the
      subsidiary node returns.
      a387a3df
    • Andres Freund's avatar
      Add dummy field to currently empty struct TupleTableSlotOps. · f92cd739
      Andres Freund authored
      Per MSVC complaint on buildfarm member dory.
      f92cd739
    • Andres Freund's avatar
      Don't generate tuple deforming functions for virtual slots. · 7ef04e4d
      Andres Freund authored
      Virtual tuple table slots never need tuple deforming. Therefore, if we
      know at expression compilation time, that a certain slot will always
      be virtual, there's no need to create a tuple deforming routine for
      it.
      
      Author: Andres Freund
      Discussion: https://postgr.es/m/20181105210039.hh4vvi4vwoq5ba2q@alap3.anarazel.de
      7ef04e4d
    • Andres Freund's avatar
      Verify that expected slot types match returned slot types. · 15d8f831
      Andres Freund authored
      This is important so JIT compilation knows what kind of tuple slot the
      deforming routine can expect. There's also optimization potential for
      expression initialization without JIT compilation. It e.g. seems
      plausible to elide EEOP_*_FETCHSOME ops entirely when dealing with
      virtual slots.
      
      Author: Andres Freund
      Discussion: https://postgr.es/m/20181105210039.hh4vvi4vwoq5ba2q@alap3.anarazel.de
      15d8f831
    • 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
  3. 15 Nov, 2018 12 commits
  4. 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
  5. 13 Nov, 2018 7 commits