1. 16 Jul, 2017 2 commits
  2. 15 Jul, 2017 2 commits
    • Tom Lane's avatar
      Improve comments for execExpr.c's handling of FieldStore subexpressions. · de2af6e0
      Tom Lane authored
      Given this code's general eagerness to use subexpressions' output variables
      as temporary workspace, it's not exactly clear that it is safe for
      FieldStore to tell a newval subexpression that it can write into the same
      variable that is being supplied as a potential input.  Document the chain
      of assumptions needed for that to be safe.
      de2af6e0
    • Tom Lane's avatar
      Improve comments for execExpr.c's isAssignmentIndirectionExpr(). · e9b64824
      Tom Lane authored
      I got confused about why this function doesn't need to recursively
      search the expression tree for a CaseTestExpr node.  After figuring
      that out, add a comment to save the next person some time.
      e9b64824
  3. 14 Jul, 2017 4 commits
    • Alvaro Herrera's avatar
      pg_upgrade i18n: Fix "%s server/cluster" wording · 837255cc
      Alvaro Herrera authored
      The original wording was impossible to translate correctly.
      
      Discussion: https://postgr.es/m/20170523002827.lzc2jkzh2gubclqb@alvherre.pgsql
      837255cc
    • Tom Lane's avatar
      Code review for NextValueExpr expression node type. · decb08eb
      Tom Lane authored
      Add missing infrastructure for this node type, notably in ruleutils.c where
      its lack could demonstrably cause EXPLAIN to fail.  Add outfuncs/readfuncs
      support.  (outfuncs support is useful today for debugging purposes.  The
      readfuncs support may never be needed, since at present it would only
      matter for parallel query and NextValueExpr should never appear in a
      parallelizable query; but it seems like a bad idea to have a primnode type
      that isn't fully supported here.)  Teach planner infrastructure that
      NextValueExpr is a volatile, parallel-unsafe, non-leaky expression node
      with cost cpu_operator_cost.  Given its limited scope of usage, there
      *might* be no live bug today from the lack of that knowledge, but it's
      certainly going to bite us on the rear someday.  Teach pg_stat_statements
      about the new node type, too.
      
      While at it, also teach cost_qual_eval() that MinMaxExpr, SQLValueFunction,
      XmlExpr, and CoerceToDomain should be charged as cpu_operator_cost.
      Failing to do this for SQLValueFunction was an oversight in my commit
      0bb51aa9.  The others are longer-standing oversights, but no time like the
      present to fix them.  (In principle, CoerceToDomain could have cost much
      higher than this, but it doesn't presently seem worth trying to examine the
      domain's constraints here.)
      
      Modify execExprInterp.c to execute NextValueExpr as an out-of-line
      function; it seems quite unlikely to me that it's worth insisting that
      it be inlined in all expression eval methods.  Besides, providing the
      out-of-line function doesn't stop anyone from inlining if they want to.
      
      Adjust some places where NextValueExpr support had been inserted with the
      aid of a dartboard rather than keeping it in the same order as elsewhere.
      
      Discussion: https://postgr.es/m/23862.1499981661@sss.pgh.pa.us
      decb08eb
    • Tom Lane's avatar
      Fix broken link-command-line ordering for libpgfeutils. · c95275fc
      Tom Lane authored
      In the frontend Makefiles that pull in libpgfeutils, we'd generally
      done it like this:
      
      LDFLAGS += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport)
      
      That method is badly broken, as seen in bug #14742 from Chris Ruprecht.
      The -L flag for src/fe_utils ends up being placed after whatever random
      -L flags are in LDFLAGS already.  That puts us at risk of pulling in
      libpgfeutils.a from some previous installation rather than the freshly
      built one in src/fe_utils.  Also, the lack of an "override" is hazardous
      if someone tries to specify some LDFLAGS on the make command line.
      
      The correct way to do it is like this:
      
      override LDFLAGS := -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport) $(LDFLAGS)
      
      so that libpgfeutils, along with libpq, libpgport, and libpgcommon, are
      guaranteed to be pulled in from the build tree and not from any referenced
      system directory, because their -L flags will appear first.
      
      In some places we'd been even lazier and done it like this:
      
      LDFLAGS += -L$(top_builddir)/src/fe_utils -lpgfeutils -lpq
      
      which is subtly wrong in an additional way: on platforms where we can't
      restrict the symbols exported by libpq.so, it allows libpgfeutils to
      latch onto libpgport and libpgcommon symbols from libpq.so, rather than
      directly from those static libraries as intended.  This carries hazards
      like those explained in the comments for the libpq_pgport macro.
      
      In addition to fixing the broken libpgfeutils usages, I tried to
      standardize on using $(libpq_pgport) like so:
      
      override LDFLAGS := $(libpq_pgport) $(LDFLAGS)
      
      even where libpgfeutils is not in the picture.  This makes no difference
      right now but will hopefully discourage future mistakes of the same ilk.
      And it's more like the way we handle CPPFLAGS in libpq-using Makefiles.
      
      In passing, just for consistency, make pgbench include PTHREAD_LIBS the
      same way everyplace else does, ie just after LIBS rather than in some
      random place in the command line.  This might have practical effect if
      there are -L switches in that macro on some platform.
      
      It looks to me like the MSVC build scripts are not affected by this
      error, but someone more familiar with them than I might want to double
      check.
      
      Back-patch to 9.6 where libpgfeutils was introduced.  In 9.6, the hazard
      this error creates is that a reinstallation might link to the prior
      installation's copy of libpgfeutils.a and thereby fail to absorb a
      minor-version bug fix.
      
      Discussion: https://postgr.es/m/20170714125106.9231.13772@wrigleys.postgresql.org
      c95275fc
    • Heikki Linnakangas's avatar
      Fix pg_basebackup output to stdout on Windows. · 8046465c
      Heikki Linnakangas authored
      When writing a backup to stdout with pg_basebackup on Windows, put stdout
      to binary mode. Any CR bytes in the output will otherwise be output
      incorrectly as CR+LF.
      
      In the passing, standardize on using "_setmode" instead of "setmode", for
      the sake of consistency. They both do the same thing, but according to
      MSDN documentation, setmode is deprecated.
      
      Fixes bug #14634, reported by Henry Boehlert. Patch by Haribabu Kommi.
      Backpatch to all supported versions.
      
      Discussion: https://www.postgresql.org/message-id/20170428082818.24366.13134@wrigleys.postgresql.org
      8046465c
  4. 13 Jul, 2017 3 commits
    • Tom Lane's avatar
      Fix dumping of FUNCTION RTEs that contain non-function-call expressions. · a3ca72ae
      Tom Lane authored
      The grammar will only accept something syntactically similar to a function
      call in a function-in-FROM expression.  However, there are various ways
      to input something that ruleutils.c won't deparse that way, potentially
      leading to a view or rule that fails dump/reload.  Fix by inserting a
      dummy CAST around anything that isn't going to deparse as a function
      (which is one of the ways to get something like that in there in the
      first place).
      
      In HEAD, also make use of the infrastructure added by this to avoid
      emitting unnecessary parentheses in CREATE INDEX deparsing.  I did
      not change that in back branches, thinking that people might find it
      to be unexpected/unnecessary behavioral change.
      
      In HEAD, also fix incorrect logic for when to add extra parens to
      partition key expressions.  Somebody apparently thought they could
      get away with simpler logic than pg_get_indexdef_worker has, but
      they were wrong --- a counterexample is PARTITION BY LIST ((a[1])).
      Ignoring the prettyprint flag for partition expressions isn't exactly
      a nice solution anyway.
      
      This has been broken all along, so back-patch to all supported branches.
      
      Discussion: https://postgr.es/m/10477.1499970459@sss.pgh.pa.us
      a3ca72ae
    • Alvaro Herrera's avatar
      Fix typo in v10 release notes · 2036f71b
      Alvaro Herrera authored
      The new functions return a list of files in the corresponding directory,
      not the name of the directory itself.
      
      Pointed out by Gianni Ciolli.
      2036f71b
    • Heikki Linnakangas's avatar
      Fix race between GetNewTransactionId and GetOldestActiveTransactionId. · 74fc8386
      Heikki Linnakangas authored
      The race condition goes like this:
      
      1. GetNewTransactionId advances nextXid e.g. from 100 to 101
      2. GetOldestActiveTransactionId reads the new nextXid, 101
      3. GetOldestActiveTransactionId loops through the proc array. There are no
         active XIDs there, so it returns 101 as the oldest active XID.
      4. GetNewTransactionid stores XID 100 to MyPgXact->xid
      
      So, GetOldestActiveTransactionId returned XID 101, even though 100 only
      just started and is surely still running.
      
      This would be hard to hit in practice, and even harder to spot any ill
      effect if it happens. GetOldestActiveTransactionId is only used when
      creating a checkpoint in a master server, and the race condition can only
      happen on an online checkpoint, as there are no backends running during a
      shutdown checkpoint. The oldestActiveXid value of an online checkpoint is
      only used when starting up a hot standby server, to determine the starting
      point where pg_subtrans is initialized from. For the race condition to
      happen, there must be no other XIDs in the proc array that would hold back
      the oldest-active XID value, which means that the missed XID must be a top
      transaction's XID. However, pg_subtrans is not used for top XIDs, so I
      believe an off-by-one error is in fact inconsequential. Nevertheless, let's
      fix it, as it's clearly wrong and the fix is simple.
      
      This has been wrong ever since hot standby was introduced, so backport to
      all supported versions.
      
      Discussion: https://www.postgresql.org/message-id/e7258662-82b6-7a45-56d4-99b337a32bf7@iki.fi
      74fc8386
  5. 12 Jul, 2017 7 commits
  6. 11 Jul, 2017 1 commit
    • Tom Lane's avatar
      Fix multiple assignments to a column of a domain type. · b1cb32fb
      Tom Lane authored
      We allow INSERT and UPDATE commands to assign to the same column more than
      once, as long as the assignments are to subfields or elements rather than
      the whole column.  However, this failed when the target column was a domain
      over array rather than plain array.  Fix by teaching process_matched_tle()
      to look through CoerceToDomain nodes, and add relevant test cases.
      
      Also add a group of test cases exercising domains over array of composite.
      It's doubtless accidental that CREATE DOMAIN allows this case while not
      allowing straight domain over composite; but it does, so we'd better make
      sure we don't break it.  (I could not find any documentation mentioning
      either side of that, so no doc changes.)
      
      It's been like this for a long time, so back-patch to all supported
      branches.
      
      Discussion: https://postgr.es/m/4206.1499798337@sss.pgh.pa.us
      b1cb32fb
  7. 10 Jul, 2017 10 commits
  8. 09 Jul, 2017 3 commits
  9. 08 Jul, 2017 1 commit
  10. 07 Jul, 2017 2 commits
  11. 06 Jul, 2017 4 commits
    • Teodor Sigaev's avatar
      Fix potential data corruption during freeze · 31b8db8e
      Teodor Sigaev authored
      Fix oversight in 3b97e682 bug fix. Bitwise AND is used instead of OR and
      it cleans all bits in t_infomask heap tuple field.
      
      Backpatch to 9.3
      31b8db8e
    • Dean Rasheed's avatar
      Clarify the contract of partition_rbound_cmp(). · f1dae097
      Dean Rasheed authored
      partition_rbound_cmp() is intended to compare range partition bounds
      in a way such that if all the bound values are equal but one is an
      upper bound and one is a lower bound, the upper bound is treated as
      smaller than the lower bound. This particular ordering is required by
      RelationBuildPartitionDesc() when building the PartitionBoundInfoData,
      so that it can consistently keep only the upper bounds when upper and
      lower bounds coincide.
      
      Update the function comment to make that clearer.
      
      Also, fix a (currently unreachable) corner-case bug -- if the bound
      values coincide and they contain unbounded values, fall through to the
      lower-vs-upper comparison code, rather than immediately returning
      0. Currently it is not possible to define coincident upper and lower
      bounds containing unbounded columns, but that may change in the
      future, so code defensively.
      
      Discussion: https://postgr.es/m/CAAJ_b947mowpLdxL3jo3YLKngRjrq9+Ej4ymduQTfYR+8=YAYQ@mail.gmail.com
      f1dae097
    • Dean Rasheed's avatar
      Simplify the logic checking new range partition bounds. · c03911d9
      Dean Rasheed authored
      The previous logic, whilst not actually wrong, was overly complex and
      involved doing two binary searches, where only one was really
      necessary. This simplifies that logic and improves the comments.
      
      One visible change is that if the new partition overlaps multiple
      existing partitions, the error message now always reports the overlap
      with the first existing partition (the one with the lowest
      bounds). The old code would sometimes report the clash with the first
      partition and sometimes with the last one.
      
      Original patch idea from Amit Langote, substantially rewritten by me.
      
      Discussion: https://postgr.es/m/CAAJ_b947mowpLdxL3jo3YLKngRjrq9+Ej4ymduQTfYR+8=YAYQ@mail.gmail.com
      c03911d9
    • Tom Lane's avatar
      Fix another race-condition-ish issue in recovery/t/001_stream_rep.pl. · ec86af91
      Tom Lane authored
      Buildfarm members hornet and sungazer have shown multiple instances of
      "Failed test 'xmin of non-cascaded slot with hs feedback has changed'".
      The reason seems to be that the test is checking the current xmin of the
      master server's replication slot against a past xmin of the first slave
      server's replication slot.  Even though the latter slot is downstream of
      the former, it's possible for its reported xmin to be ahead of the former's
      reported xmin, because those numbers are updated whenever the respective
      downstream walreceiver feels like it (see logic in WalReceiverMain).
      Instrumenting this test shows that indeed the slave slot's xmin does often
      advance before the master's does, especially if an autovacuum transaction
      manages to occur during the relevant window.  If we happen to capture such
      an advanced xmin as $xmin, then the subsequent wait_slot_xmins call can
      fall through before the master's xmin has advanced at all, and then if it
      advances before the get_slot_xmins call, we can get the observed failure.
      Yeah, that's a bit of a long chain of deduction, but it's hard to explain
      any other way how the test can get past an "xmin <> '$xmin'" check only
      to have the next query find that xmin does equal $xmin.
      
      Fix by keeping separate images of the master and slave slots' xmins
      and testing their has-xmin-advanced conditions independently.
      ec86af91
  12. 05 Jul, 2017 1 commit