1. 09 Oct, 2018 4 commits
    • Tom Lane's avatar
      Remove no-longer-needed variant expected regression result files. · 6eb4378d
      Tom Lane authored
      numerology_1.out and float8-small-is-zero_1.out differ from their
      base files only in showing plain zero rather than minus zero for
      some results.  I believe that in the wake of commit 6eb3eb57,
      we will print minus zero as such on all IEEE-float platforms
      (and non-IEEE floats are going to cause many more regression diffs
      than this, anyway).  Hence we should be able to remove these and
      eliminate a bit of maintenance pain.  Let's see if the buildfarm
      agrees.
      
      Discussion: https://postgr.es/m/29037.1539021687@sss.pgh.pa.us
      6eb4378d
    • Tom Lane's avatar
      Select appropriate PG_PRINTF_ATTRIBUTE for recent NetBSD. · aed9fa0b
      Tom Lane authored
      NetBSD-current generates a large number of warnings about "%m" not
      being appropriate to use with *printf functions.  While that's true
      for their native printf, it's surely not true for snprintf.c, so I
      think they have misunderstood gcc's definition of the "gnu_printf"
      archetype.  Nonetheless, choosing "__syslog__" instead silences the
      warnings; so teach configure about that.
      
      Since this is only a cosmetic warning issue (and anyway it depends
      on previous hacking to be self-consistent), no back-patch.
      
      Discussion: https://postgr.es/m/16785.1539046036@sss.pgh.pa.us
      aed9fa0b
    • Michael Paquier's avatar
      Add pg_ls_archive_statusdir function · c4810162
      Michael Paquier authored
      This function lists the contents of the WAL archive status directory,
      and is intended to be used by monitoring tools.  Unlike pg_ls_dir(),
      access to it can be granted to non-superusers so that those monitoring
      tools can observe the principle of least privilege.  Access is also
      given by default to members of pg_monitor.
      
      Author:  Christoph Moench-Tegeder
      Reviewed-by: Aya Iwata
      Discussion: https://postgr.es/m/20180930205920.GA64534@elch.exwg.net
      c4810162
    • Tom Lane's avatar
      Convert some long lists in configure.in to one-line-per-entry style. · bfa6c5a0
      Tom Lane authored
      The idea here is that patches that add items to these lists will often
      be easier to rebase over other additions to the same lists, because
      they won't be trying to touch the very same line of configure.in.
      
      There will still be merge conflicts in the configure script, but that
      can be fixed just by re-running autoconf (or by leaving configure out
      of the submitted patch to begin with ...)
      
      Implementation note: use of m4_normalize() is necessary to get rid of
      the newlines, else incorrect shell syntax will be emitted.  But with
      that hack, the generated configure script is identical to what it
      was before.
      
      Discussion: https://postgr.es/m/19344.1539050134@sss.pgh.pa.us
      bfa6c5a0
  2. 08 Oct, 2018 9 commits
    • Thomas Munro's avatar
      Relax transactional restrictions on ALTER TYPE ... ADD VALUE (redux). · 212fab99
      Thomas Munro authored
      Originally committed as 15bc038f (plus some follow-ups), this was
      reverted in 28e07270 due to a problem discovered in parallel
      workers.  This new version corrects that problem by sending the
      list of uncommitted enum values to parallel workers.
      
      Here follows the original commit message describing the change:
      
      To prevent possibly breaking indexes on enum columns, we must keep
      uncommitted enum values from getting stored in tables, unless we
      can be sure that any such column is new in the current transaction.
      
      Formerly, we enforced this by disallowing ALTER TYPE ... ADD VALUE
      from being executed at all in a transaction block, unless the target
      enum type had been created in the current transaction.  This patch
      removes that restriction, and instead insists that an uncommitted enum
      value can't be referenced unless it belongs to an enum type created
      in the same transaction as the value.  Per discussion, this should be
      a bit less onerous.  It does require each function that could possibly
      return a new enum value to SQL operations to check this restriction,
      but there aren't so many of those that this seems unmaintainable.
      
      Author: Andrew Dunstan and Tom Lane, with parallel query fix by Thomas Munro
      Reviewed-by: Tom Lane
      Discussion: https://postgr.es/m/CAEepm%3D0Ei7g6PaNTbcmAh9tCRahQrk%3Dr5ZWLD-jr7hXweYX3yg%40mail.gmail.com
      Discussion: https://postgr.es/m/4075.1459088427%40sss.pgh.pa.us
      212fab99
    • Tom Lane's avatar
      Fix omissions in snprintf.c's coverage of standard *printf functions. · 7767aadd
      Tom Lane authored
      A warning on a NetBSD box revealed to me that pg_waldump/compat.c
      is using vprintf(), which snprintf.c did not provide coverage for.
      This is not good if we want to have uniform *printf behavior, and
      it's pretty silly to omit when it's a one-line function.
      
      I also noted that snprintf.c has pg_vsprintf() but for some reason
      it was not exposed to the outside world, creating another way in
      which code might accidentally invoke the platform *printf family.
      
      Let's just make sure that we replace all eight of the POSIX-standard
      printf family.
      
      Also, upgrade plperl.h and plpython.h to make sure that they do
      their undefine/redefine rain dance for all eight, not some random
      maybe-sufficient subset thereof.
      7767aadd
    • Tom Lane's avatar
      Advance transaction timestamp for intra-procedure transactions. · 82ff0cc9
      Tom Lane authored
      Per discussion, this behavior seems less astonishing than not doing so.
      
      Peter Eisentraut and Tom Lane
      
      Discussion: https://postgr.es/m/20180920234040.GC29981@momjian.us
      82ff0cc9
    • Tom Lane's avatar
      Improve snprintf.c's handling of NaN, Infinity, and minus zero. · 6eb3eb57
      Tom Lane authored
      Up to now, float4out/float8out handled NaN and Infinity cases explicitly,
      and invoked psprintf only for ordinary float values.  This was done because
      platform implementations of snprintf produce varying representations of
      these special cases.  But now that we use snprintf.c always, it's better
      to give it the responsibility to produce a uniform representation of
      these cases, so that we have uniformity across the board not only in
      float4out/float8out.  Hence, move that work into fmtfloat().
      
      Also, teach fmtfloat() to recognize IEEE minus zero and handle it
      correctly.  The previous coding worked only accidentally, and would
      fail for e.g. "%+f" format (it'd print "+-0.00000").  Now that we're
      using snprintf.c everywhere, it's not acceptable for it to do weird
      things in corner cases.  (This incidentally avoids a portability
      problem we've seen on some really ancient platforms, that native
      sprintf does the wrong thing with minus zero.)
      
      Also, introduce a new entry point in snprintf.c to allow float[48]out
      to bypass the work of interpreting a well-known format spec, as well
      as bypassing the overhead of the psprintf layer.  I modeled this API
      loosely on strfromd().  In my testing, this brings float[48]out back
      to approximately the same speed they had when using native snprintf,
      fixing one of the main performance issues caused by using snprintf.c.
      
      (There is some talk of more aggressive work to improve the speed of
      floating-point output conversion, but these changes seem to provide
      a better starting point for such work anyway.)
      
      Getting rid of the previous ad-hoc hack for Infinity/NaN in fmtfloat()
      allows removing <ctype.h> from snprintf.c's #includes.  I also removed
      a few other #includes that I think are historical, though the buildfarm
      may expose that as wrong.
      
      Discussion: https://postgr.es/m/13178.1538794717@sss.pgh.pa.us
      6eb3eb57
    • Tom Lane's avatar
      Avoid O(N^2) cost in ExecFindRowMark(). · f9eb7c14
      Tom Lane authored
      If there are many ExecRowMark structs, we spent O(N^2) time in
      ExecFindRowMark during executor startup.  Once upon a time this was
      not of great concern, but the addition of native partitioning has
      squeezed out enough other costs that this can become the dominant
      overhead in some use-cases for tables with many partitions.
      
      To fix, simply replace that List data structure with an array.
      
      This adds a little bit of cost to execCurrentOf(), but not much,
      and anyway that code path is neither of large importance nor very
      efficient now.  If we ever decide it is a bottleneck, constructing a
      hash table for lookup-by-tableoid would likely be the thing to do.
      
      Per complaint from Amit Langote, though this is different from
      his fix proposal.
      
      Discussion: https://postgr.es/m/468c85d9-540e-66a2-1dde-fec2b741e688@lab.ntt.co.jp
      f9eb7c14
    • Alvaro Herrera's avatar
      Silence compiler warning in Assert() · eee01d60
      Alvaro Herrera authored
      gcc 6.3 does not whine about this mistake I made in 39808e88 but
      evidently lots of other compilers do, according to Michael Paquier,
      Peter Eisentraut, Arthur Zakirov, Tomas Vondra.
      
      Discussion: too many to list
      eee01d60
    • Peter Eisentraut's avatar
      Track procedure calls in pg_stat_user_functions · 634b4b79
      Peter Eisentraut authored
      This was forgotten when procedures were implemented.
      Reported-by: default avatarLukas Fittl <lukas@fittl.com>
      634b4b79
    • Michael Paquier's avatar
      Improve two error messages related to foreign keys on partitioned tables · 9c2a970d
      Michael Paquier authored
      Error messages for creating a foreign key on a partitioned table using
      ONLY or NOT VALID were wrong in mentioning the objects they worked on.
      This commit adds on the way some regression tests missing for those
      cases.
      
      Author: Laurenz Albe
      Reviewed-by: Michael Paquier
      Discussion: https://postgr.es/m/c11c05810a9ed65e9b2c817a9ef442275a32fe80.camel@cybertec.at
      9c2a970d
    • Magnus Hagander's avatar
      Fix speling error · a9da329b
      Magnus Hagander authored
      Reported by Alexander Lakhin in bug #15423
      a9da329b
  3. 07 Oct, 2018 2 commits
    • Tom Lane's avatar
      Remove some unnecessary fields from Plan trees. · 52ed730d
      Tom Lane authored
      In the wake of commit f2343653, we no longer need some fields that
      were used before to control executor lock acquisitions:
      
      * PlannedStmt.nonleafResultRelations can go away entirely.
      
      * partitioned_rels can go away from Append, MergeAppend, and ModifyTable.
      However, ModifyTable still needs to know the RT index of the partition
      root table if any, which was formerly kept in the first entry of that
      list.  Add a new field "rootRelation" to remember that.  rootRelation is
      partly redundant with nominalRelation, in that if it's set it will have
      the same value as nominalRelation.  However, the latter field has a
      different purpose so it seems best to keep them distinct.
      
      Amit Langote, reviewed by David Rowley and Jesper Pedersen,
      and whacked around a bit more by me
      
      Discussion: https://postgr.es/m/468c85d9-540e-66a2-1dde-fec2b741e688@lab.ntt.co.jp
      52ed730d
    • Alvaro Herrera's avatar
      Fix catalog insertion order for ATTACH PARTITION · 39808e88
      Alvaro Herrera authored
      Commit 2fbdf1b3 changed the order in which we inserted catalog rows
      when creating partitions, so that we could remove an unsightly hack
      required for untimely relcache invalidations.  However, that commit only
      changed the ordering for CREATE TABLE PARTITION OF, and left ALTER TABLE
      ATTACH PARTITION unchanged, so the latter can be affected when catalog
      invalidations occur, for instance when the partition key involves an SQL
      function.
      
      Reported-by: Rajkumar Raghuwanshi
      Author: Amit Langote
      Reviewed-by: Michaël Paquier
      Discussion: https://postgr.es/m/CAKcux6=nTz9KSfTr_6Z2mpzLJ_09JN-rK6=dWic6gGyTSWueyQ@mail.gmail.com
      39808e88
  4. 06 Oct, 2018 7 commits
    • Alvaro Herrera's avatar
      Fix event triggers for partitioned tables · ad08006b
      Alvaro Herrera authored
      Index DDL cascading on partitioned tables introduced a way for ALTER
      TABLE to be called reentrantly.  This caused an an important deficiency
      in event trigger support to be exposed: on exiting the reentrant call,
      the alter table state object was clobbered, causing a crash when the
      outer alter table tries to finalize its processing.  Fix the crash by
      creating a stack of event trigger state objects.  There are still ways
      to cause things to misbehave (and probably other crashers) with more
      elaborate tricks, but at least it now doesn't crash in the obvious
      scenario.
      
      Backpatch to 9.5, where DDL deparsing of event triggers was introduced.
      
      Reported-by: Marco Slot
      Authors: Michaël Paquier, Álvaro Herrera
      Discussion: https://postgr.es/m/CANNhMLCpi+HQ7M36uPfGbJZEQLyTy7XvX=5EFkpR-b1bo0uJew@mail.gmail.com
      ad08006b
    • Tom Lane's avatar
      Restore sane locking behavior during parallel query. · 29ef2b31
      Tom Lane authored
      Commit 9a3cebea changed things so that parallel workers didn't obtain
      any lock of their own on tables they access.  That was clearly a bad
      idea, but I'd mistakenly supposed that it was the intended end result
      of the series of patches for simplifying the executor's lock management.
      Undo that change in relation_open(), and adjust ExecOpenScanRelation()
      so that it gets the correct lock if inside a parallel worker.
      
      In passing, clean up some more obsolete comments about when locks
      are acquired.
      
      Discussion: https://postgr.es/m/468c85d9-540e-66a2-1dde-fec2b741e688@lab.ntt.co.jp
      29ef2b31
    • Tom Lane's avatar
      Remove more redundant relation locking during executor startup. · f2343653
      Tom Lane authored
      We already have appropriate locks on every relation listed in the
      query's rangetable before we reach the executor.  Take the next step
      in exploiting that knowledge by removing code that worries about
      taking locks on non-leaf result relations in a partitioned table.
      
      In particular, get rid of ExecLockNonLeafAppendTables and a stanza in
      InitPlan that asserts we already have locks on certain such tables.
      
      In passing, clean up some now-obsolete comments in InitPlan.
      
      Amit Langote, reviewed by David Rowley and Jesper Pedersen,
      and whacked around a bit more by me
      
      Discussion: https://postgr.es/m/468c85d9-540e-66a2-1dde-fec2b741e688@lab.ntt.co.jp
      f2343653
    • Tom Lane's avatar
      Don't use is_infinite() where isinf() will do. · 0209f028
      Tom Lane authored
      Places that aren't testing for sign should not use the more expensive
      function; it's just wasteful, not to mention being a cognitive load
      for readers who may know what isinf() is but not is_infinite().
      
      As things stand, we actually don't need is_infinite() anyplace except
      float4out/float8out, which means it could potentially go away altogether
      after the changes I proposed in <13178.1538794717@sss.pgh.pa.us>.
      0209f028
    • Tom Lane's avatar
      Propagate xactStartTimestamp and stmtStartTimestamp to parallel workers. · 07ee62ce
      Tom Lane authored
      Previously, a worker process would establish values for these based on
      its own start time.  In v10 and up, this can trivially be shown to cause
      misbehavior of transaction_timestamp(), timestamp_in(), and related
      functions which are (perhaps unwisely?) marked parallel-safe.  It seems
      likely that other behaviors might diverge from what happens in the parent
      as well.
      
      It's not as trivial to demonstrate problems in 9.6 or 9.5, but I'm sure
      it's still possible, so back-patch to all branches containing parallel
      worker infrastructure.
      
      In HEAD only, mark now() and statement_timestamp() as parallel-safe
      (other affected functions already were).  While in theory we could
      still squeeze that change into v11, it doesn't seem important enough
      to force a last-minute catversion bump.
      
      Konstantin Knizhnik, whacked around a bit by me
      
      Discussion: https://postgr.es/m/6406dbd2-5d37-4cb6-6eb2-9c44172c7e7c@postgrespro.ru
      07ee62ce
    • Dean Rasheed's avatar
      Improve the accuracy of floating point statistical aggregates. · e954a727
      Dean Rasheed authored
      When computing statistical aggregates like variance, the common
      schoolbook algorithm which computes the sum of the squares of the
      values and subtracts the square of the mean can lead to a large loss
      of precision when using floating point arithmetic, because the
      difference between the two terms is often very small relative to the
      terms themselves.
      
      To avoid this, re-work these aggregates to use the Youngs-Cramer
      algorithm, which is a proven, numerically stable algorithm that
      directly aggregates the sum of the squares of the differences of the
      values from the mean in a single pass over the data.
      
      While at it, improve the test coverage to test the aggregate combine
      functions used during parallel aggregation.
      
      Per report and suggested algorithm from Erich Schubert.
      
      Patch by me, reviewed by Madeleine Thompson.
      
      Discussion: https://postgr.es/m/153313051300.1397.9594490737341194671@wrigleys.postgresql.org
      e954a727
    • Michael Paquier's avatar
      Assign constraint name when cloning FK definition for partitions · 38921d14
      Michael Paquier authored
      This is for example used when attaching a partition to a partitioned
      table which includes foreign keys, and in this case the constraint name
      has been missing in the data cloned.  This could lead to hard crashes,
      as when validating the foreign key constraint, the constraint name is
      always expected.  Particularly, when using log_min_messages >= DEBUG1, a
      log message would be generated with this unassigned constraint name,
      leading to an assertion failure on HEAD.
      
      While on it, rename a variable in ATExecAttachPartition which was
      declared twice with the same name.
      
      Author: Michael Paquier
      Reviewed-by: Álvaro Herrera
      Discussion: https://postgr.es/m/20181005042236.GG1629@paquier.xyz
      Backpatch-through: 11
      38921d14
  5. 05 Oct, 2018 5 commits
    • Bruce Momjian's avatar
      doc: update PG 11 release notes · 6eb612fe
      Bruce Momjian authored
      Discussion: https://postgr.es/m/1f5b2e66-7ba8-98ec-c06a-aee9ff33f050@postgresql.org
      
      Author: Jonathan S. Katz
      
      Backpatch-through: 11
      6eb612fe
    • Tom Lane's avatar
      Allow btree comparison functions to return INT_MIN. · c87cb5f7
      Tom Lane authored
      Historically we forbade datatype-specific comparison functions from
      returning INT_MIN, so that it would be safe to invert the sort order
      just by negating the comparison result.  However, this was never
      really safe for comparison functions that directly return the result
      of memcmp(), strcmp(), etc, as POSIX doesn't place any such restriction
      on those library functions.  Buildfarm results show that at least on
      recent Linux on s390x, memcmp() actually does return INT_MIN sometimes,
      causing sort failures.
      
      The agreed-on answer is to remove this restriction and fix relevant
      call sites to not make such an assumption; code such as "res = -res"
      should be replaced by "INVERT_COMPARE_RESULT(res)".  The same is needed
      in a few places that just directly negated the result of memcmp or
      strcmp.
      
      To help find places having this problem, I've also added a compile option
      to nbtcompare.c that causes some of the commonly used comparators to
      return INT_MIN/INT_MAX instead of their usual -1/+1.  It'd likely be
      a good idea to have at least one buildfarm member running with
      "-DSTRESS_SORT_INT_MIN".  That's far from a complete test of course,
      but it should help to prevent fresh introductions of such bugs.
      
      This is a longstanding portability hazard, so back-patch to all supported
      branches.
      
      Discussion: https://postgr.es/m/20180928185215.ffoq2xrq5d3pafna@alap3.anarazel.de
      c87cb5f7
    • Tom Lane's avatar
      Ensure that PLPGSQL_DTYPE_ROW variables have valid refname fields. · 113a6599
      Tom Lane authored
      Without this, the syntax-tree-dumping functions in pl_funcs.c crash,
      and there are other places that might be at risk too.  Per report
      from Pavel Stehule.
      
      Looks like I broke this in commit f9263006, so back-patch to v11.
      
      Discussion: https://postgr.es/m/CAFj8pRA+3f5n4642q2g8BXCKjbTd7yU9JMYAgDyHgozk6cQ-VA@mail.gmail.com
      113a6599
    • Peter Eisentraut's avatar
      Remove redundant allocation · b5f03dc7
      Peter Eisentraut authored
      Author: Nikita Glukhov <n.gluhov@postgrespro.ru>
      b5f03dc7
    • Michael Paquier's avatar
      Add pg_ls_tmpdir function · 9cd92d1a
      Michael Paquier authored
      This lists the contents of a temporary directory associated to a given
      tablespace, useful to get information about on-disk consumption caused
      by temporary files used by a session query.  By default, pg_default is
      scanned, and a tablespace can be specified as argument.
      
      This function is intended to be used by monitoring tools, and, unlike
      pg_ls_dir(), access to them can be granted to non-superusers so that
      those monitoring tools can observe the principle of least privilege.
      Access is also given by default to members of pg_monitor.
      
      Author: Nathan Bossart
      Reviewed-by: Laurenz Albe
      Discussion: https://postgr.es/m/92F458A2-6459-44B8-A7F2-2ADD3225046A@amazon.com
      9cd92d1a
  6. 04 Oct, 2018 5 commits
  7. 03 Oct, 2018 8 commits
    • Andres Freund's avatar
    • Andres Freund's avatar
      Ensure that snprintf.c's fmtint() doesn't overflow when printing INT64_MIN. · 4868e446
      Andres Freund authored
      This isn't actually a live bug, as the output happens to be the
      same.  But it upsets tools like UBSan, which makes it worthwhile to
      fix.
      
      As it's an issue without practical consequences, don't backpatch.
      
      Author: Andres Freund
      Discussion: https://postgr.es/m/20180928001121.hhx5n6dsygqxr5wu@alap3.anarazel.de
      4868e446
    • Tom Lane's avatar
      Change executor to just Assert that table locks were already obtained. · 9a3cebea
      Tom Lane authored
      Instead of locking tables during executor startup, just Assert that
      suitable locks were obtained already during the parse/plan pipeline
      (or re-obtained by the plan cache).  This must be so, else we have a
      hazard that concurrent DDL has invalidated the plan.
      
      This is pretty inefficient as well as undercommented, but it's all going
      to go away shortly, so I didn't try hard.  This commit is just another
      attempt to use the buildfarm to see if we've missed anything in the plan
      to simplify the executor's table management.
      
      Note that the change needed here in relation_open() exposes that
      parallel workers now really are accessing tables without holding any
      lock of their own, whereas they were not doing that before this commit.
      This does not give me a warm fuzzy feeling about that aspect of parallel
      query; it does not seem like a good design, and we now know that it's
      had exactly no actual testing.  I think that we should modify parallel
      query so that that change can be reverted.
      
      Discussion: https://postgr.es/m/468c85d9-540e-66a2-1dde-fec2b741e688@lab.ntt.co.jp
      9a3cebea
    • Andres Freund's avatar
      Fix issues around EXPLAIN with JIT. · c03c1449
      Andres Freund authored
      I (Andres) was more than a bit hasty in committing 33001fd7
      after last minute changes, leading to a number of problems (jit output
      was only shown for JIT in parallel workers, and just EXPLAIN without
      ANALYZE didn't work).  Lukas luckily found these issues quickly.
      
      Instead of combining instrumentation in in standard_ExecutorEnd(), do
      so on demand in the new ExplainPrintJITSummary().
      
      Also update a documentation example of the JIT output, changed in
      52050ad8.
      
      Author: Lukas Fittl, with minor changes by me
      Discussion: https://postgr.es/m/CAP53PkxmgJht69pabxBXJBM+0oc6kf3KHMborLP7H2ouJ0CCtQ@mail.gmail.com
      Backpatch: 11, where JIT compilation was introduced
      c03c1449
    • Tom Lane's avatar
      Rationalize snprintf.c's handling of "ll" formats. · 595a0eab
      Tom Lane authored
      Although all known platforms define "long long" as 64 bits, it still feels
      a bit shaky to be using "va_arg(args, int64)" to pull out an argument that
      the caller thought was declared "long long".  The reason it was coded like
      this, way back in commit 3311c766, was to work around the possibility that
      the compiler had no type named "long long" --- and, at the time, that it
      maybe didn't have 64-bit ints at all.  Now that we're requiring compilers
      to support C99, those concerns are moot.  Let's make the code clearer and
      more bulletproof by writing "long long" where we mean "long long".
      
      This does introduce a hazard that we'd inefficiently use 128-bit arithmetic
      to convert plain old integers.  The way to tackle that would be to provide
      two versions of fmtint(), one for "long long" and one for narrower types.
      Since, as of today, no platforms require that, we won't bother with the
      extra code for now.
      
      Discussion: https://postgr.es/m/1680.1538587115@sss.pgh.pa.us
      595a0eab
    • Tom Lane's avatar
      Provide fast path in snprintf.c for conversion specs that are just "%s". · 6d842be6
      Tom Lane authored
      This case occurs often enough (around 45% of conversion specs executed
      in our regression tests are just "%s") that it's worth an extra test
      per conversion spec to allow skipping all the logic associated with
      field widths and padding when it happens.
      
      Discussion: https://postgr.es/m/26193.1538582367@sss.pgh.pa.us
      6d842be6
    • Tom Lane's avatar
      Make assorted performance improvements in snprintf.c. · abd9ca37
      Tom Lane authored
      In combination, these changes make our version of snprintf as fast
      or faster than most platforms' native snprintf, except for cases
      involving floating-point conversion (which we still delegate to
      the native sprintf).  The speed penalty for a float conversion
      is down to around 10% though, much better than before.
      
      Notable changes:
      
      * Rather than always parsing the format twice to see if it contains
      instances of %n$, do the extra scan only if we actually find a $.
      This obviously wins for non-localized formats, and even when there
      is use of %n$, we can avoid scanning text before the first % twice.
      
      * Use strchrnul() if available to find the next %, and emit the
      literal text between % escapes as strings rather than char-by-char.
      
      * Create a bespoke function (dopr_outchmulti) for the common case
      of emitting N copies of the same character, in place of writing
      loops around dopr_outch.
      
      * Simplify construction of the format string for invocations of sprintf
      for floats.
      
      * Const-ify some internal functions, and avoid unnecessary use of
      pass-by-reference arguments.
      
      Patch by me, reviewed by Andres Freund
      
      Discussion: https://postgr.es/m/11787.1534530779@sss.pgh.pa.us
      abd9ca37
    • Amit Kapila's avatar
      MAXALIGN the target address where we store flattened value. · 9bc9f72b
      Amit Kapila authored
      The API (EOH_flatten_into) that flattens the expanded value representation
      expects the target address to be maxaligned.  All it's usage adhere to that
      principle except when serializing datums for parallel query.  Fix that
      usage.
      
      Diagnosed-by: Tom Lane
      Author: Tom Lane and Amit Kapila
      Backpatch-through: 9.6
      Discussion: https://postgr.es/m/11629.1536550032@sss.pgh.pa.us
      9bc9f72b