1. 04 Jun, 2017 4 commits
    • Tom Lane's avatar
      #ifdef out assorted unused GEQO code. · 9db7d47f
      Tom Lane authored
      I'd always assumed that backend/optimizer/geqo/'s remarkably poor
      showing on code coverage metrics was because we weren't exercising
      it much in the regression tests.  But it turns out that a good chunk
      of the problem is that there's a bunch of code that is physically
      unreachable (because the calls to it are #ifdef'd out in geqo_main.c)
      but is being built anyway.  Making the called code have #if guards
      similar to the calling code saves a couple of kilobytes of executable
      size and should make the coverage numbers more reflective of reality.
      
      It's arguable that we should just delete all the unused recombination
      mechanisms altogether, but I didn't feel a need to go that far today.
      9db7d47f
    • Tom Lane's avatar
      Disallow CREATE INDEX if table is already in use in current session. · 0d188526
      Tom Lane authored
      If we allow this, whatever outer command has the table open will not know
      about the new index and may fail to update it as needed, as shown in a
      report from Laurenz Albe.  We already had such a prohibition in place for
      ALTER TABLE, but the CREATE INDEX syntax missed the check.
      
      Fixing it requires an API change for DefineIndex(), which conceivably
      would break third-party extensions if we were to back-patch it.  Given
      how long this problem has existed without being noticed, fixing it in
      the back branches doesn't seem worth that risk.
      
      Discussion: https://postgr.es/m/A737B7A37273E048B164557ADEF4A58B53A4DC9A@ntex2010i.host.magwien.gv.at
      0d188526
    • Alvaro Herrera's avatar
      Assorted translatable string fixes · 55a70a02
      Alvaro Herrera authored
      Mark our rusage reportage string translatable; remove quotes from type
      names; unify formatting of very similar messages.
      55a70a02
    • Tom Lane's avatar
      Remove dead variables. · 5936d25f
      Tom Lane authored
      Commit 512c7356 left a couple of variables unused except for being set.
      My compiler didn't whine about this, but some buildfarm members did.
      5936d25f
  2. 03 Jun, 2017 6 commits
    • Tom Lane's avatar
      Add some missing backslash commands to psql's tab-completion knowledge. · f1175556
      Tom Lane authored
      \if and related commands were overlooked here, as were \dRp and \dRs
      from the logical-replication patch, as was \?.
      
      While here, reformat the list to put each new first command letter on
      a separate line; perhaps that will limit the need to reflow the whole
      list when we add more commands in future.
      
      Masahiko Sawada (reformatting by me)
      
      Discussion: https://postgr.es/m/CAD21AoDW1QHtBsM33hV+Fg2mYEs+FWj4qtoCU72AwHAXQ3U6ZQ@mail.gmail.com
      f1175556
    • Tom Lane's avatar
      Fix <> and pattern-NOT-match estimators to handle nulls correctly. · 512c7356
      Tom Lane authored
      These estimators returned 1 minus the corresponding equality/match
      estimate, which is incorrect: we need to subtract off the fraction
      of nulls in the column, since those are neither equal nor not equal
      to the comparison value.  The error only becomes obvious if the
      nullfrac is large, but it could be very bad in a mostly-nulls
      column, as reported in bug #14676 from Marko Tiikkaja.
      
      To fix the <> case, refactor eqsel() and neqsel() to call a common
      support routine, which can be made to account for nullfrac correctly.
      The pattern-match cases were already factored that way, and it was
      simply an oversight that patternsel() wasn't subtracting off nullfrac.
      
      neqjoinsel() has a similar problem, but since we're elsewhere discussing
      changing its behavior entirely, I left it alone for now.
      
      This is a very longstanding bug, but I'm hesitant to back-patch a fix for
      it.  Given the lack of prior complaints, such cases must not come up often,
      so it's probably not worth the risk of destabilizing plans in stable
      branches.
      
      Discussion: https://postgr.es/m/20170529153847.4275.95416@wrigleys.postgresql.org
      512c7356
    • Tom Lane's avatar
      Fix old corner-case logic error in final_cost_nestloop(). · 23886581
      Tom Lane authored
      When costing a nestloop with stop-at-first-inner-match semantics, and a
      non-indexscan inner path, final_cost_nestloop() wants to charge the full
      scan cost of the inner rel at least once, with additional scans charged
      at inner_rescan_run_cost which might be less.  However the logic for
      doing this effectively assumed that outer_matched_rows is at least 1.
      If it's zero, which is not unlikely for a small outer rel, we ended up
      charging inner_run_cost plus N times inner_rescan_run_cost, as much as
      double the correct charge for an outer rel with only one row that
      we're betting won't be matched.  (Unless the inner rel is materialized,
      in which case it has very small inner_rescan_run_cost and the cost
      is not so far off what it should have been.)
      
      The upshot of this was that the planner had a tendency to select plans
      that failed to make effective use of the stop-at-first-inner-match
      semantics, and that might have Materialize nodes in them even when the
      predicted number of executions of the Materialize subplan was only 1.
      This was not so obvious before commit 9c7f5229, because the case only
      arose in connection with semi/anti joins where there's not freedom to
      reverse the join order.  But with the addition of unique-inner joins,
      it could result in some fairly bad planning choices, as reported by
      Teodor Sigaev.  Indeed, some of the test cases added by that commit
      have plans that look dubious on closer inspection, and are changed
      by this patch.
      
      Fix the logic to ensure that we don't charge for too many inner scans.
      I chose to adjust it so that the full-freight scan cost is associated
      with an unmatched outer row if possible, not a matched one, since that
      seems like a better model of what would happen at runtime.
      
      This is a longstanding bug, but given the lesser impact in back branches,
      and the lack of field complaints, I won't risk a back-patch.
      
      Discussion: https://postgr.es/m/CAKJS1f-LzkUsFxdJ_-Luy38orQ+AdEXM5o+vANR+-pHAWPSecg@mail.gmail.com
      23886581
    • Peter Eisentraut's avatar
      Receive invalidation messages correctly in tablesync worker · 66b84fa8
      Peter Eisentraut authored
      We didn't accept any invalidation messages until the whole sync process
      had finished (because it flattens all the remote transactions in the
      single one).  So the sync worker didn't learn about subscription
      changes/drop until it has finished.  This could lead to "orphaned" sync
      workers.
      
      Author: Petr Jelinek <petr.jelinek@2ndquadrant.com>
      Reported-by: default avatarMasahiko Sawada <sawada.mshk@gmail.com>
      66b84fa8
    • Peter Eisentraut's avatar
      Make tablesync worker exit when apply dies while it was waiting for it · 3c9bc215
      Peter Eisentraut authored
      This avoids "orphaned" sync workers.
      
      This was caused by a thinko in wait_for_sync_status_change.
      
      Author: Petr Jelinek <petr.jelinek@2ndquadrant.com>
      Reported-by: default avatarMasahiko Sawada <sawada.mshk@gmail.com>
      3c9bc215
    • Andres Freund's avatar
      Allow parallelism in COPY (query) TO ...; · 34aebcf4
      Andres Freund authored
      Previously this was not allowed, as copy.c didn't set the
      CURSOR_OPT_PARALLEL_OK flag when planning the query. Set it.
      
      While the lack of parallel query for COPY isn't strictly speaking a
      bug, it does prevent parallelism from being used in a facility
      commonly used to run long running queries. Thus backpatch to 9.6.
      
      Author: Andres Freund
      Discussion: https://postgr.es/m/20170531231958.ihanapplorptykzm@alap3.anarazel.de
      Backpatch: 9.6, where parallelism was introduced.
      34aebcf4
  3. 02 Jun, 2017 7 commits
  4. 01 Jun, 2017 4 commits
  5. 31 May, 2017 4 commits
  6. 30 May, 2017 6 commits
  7. 29 May, 2017 8 commits
    • Tom Lane's avatar
      Make edge-case behavior of jsonb_populate_record match json_populate_record · 68cff231
      Tom Lane authored
      json_populate_record throws an error if asked to convert a JSON scalar
      or array into a composite type.  jsonb_populate_record was returning
      a record full of NULL fields instead.  It seems better to make it
      throw an error for this case as well.
      
      Nikita Glukhov
      
      Discussion: https://postgr.es/m/fbd1d566-bba0-a3de-d6d0-d3b1d7c24ff2@postgrespro.ru
      68cff231
    • Tom Lane's avatar
      Fix thinko in JsObjectSize() macro. · e45c5be9
      Tom Lane authored
      The macro gave the wrong answers for a JsObject with is_json == 0:
      it would return 1 if jsonb_cont == NULL, or if that wasn't NULL,
      it would return 1 for any non-zero size.
      
      We could fix that, but the only use of this macro at present is in the
      JsObjectIsEmpty() macro, so it seems simpler and clearer to get rid of
      JsObjectSize() and put corrected logic into JsObjectIsEmpty().
      
      Thinko in commit cf35346e, so no need for back-patch.
      
      Nikita Glukhov
      
      Discussion: https://postgr.es/m/fbd1d566-bba0-a3de-d6d0-d3b1d7c24ff2@postgrespro.ru
      e45c5be9
    • Tom Lane's avatar
      Prevent running pg_resetwal/pg_resetxlog against wrong-version data dirs. · f3db7f16
      Tom Lane authored
      pg_resetwal (formerly pg_resetxlog) doesn't insist on finding a matching
      version number in pg_control, and that seems like an important thing to
      preserve since recovering from corrupt pg_control is a prime reason to
      need to run it.  However, that means you can try to run it against a
      data directory of a different major version, which is at best useless
      and at worst disastrous.  So as to provide some protection against that
      type of pilot error, inspect PG_VERSION at startup and refuse to do
      anything if it doesn't match.  PG_VERSION is read-only after initdb,
      so it's unlikely to get corrupted, and even if it were corrupted it would
      be easy to fix by hand.
      
      This hazard has been there all along, so back-patch to all supported
      branches.
      
      Michael Paquier, with some kibitzing by me
      
      Discussion: https://postgr.es/m/f4b8eb91-b934-8a0d-b3cc-68f06e2279d1@enterprisedb.com
      f3db7f16
    • Tom Lane's avatar
      Allow NumericOnly to be "+ FCONST". · ce509452
      Tom Lane authored
      The NumericOnly grammar production accepted ICONST, + ICONST, - ICONST,
      FCONST, and - FCONST, but for some reason not + FCONST.  This led to
      strange inconsistencies like
      
      regression=# set random_page_cost = +4;
      SET
      regression=# set random_page_cost = 4000000000;
      SET
      regression=# set random_page_cost = +4000000000;
      ERROR:  syntax error at or near "4000000000"
      
      (because 4000000000 is too large to be an ICONST).  While there's
      no actual functional reason to need to write a "+", if we allow
      it for integers it seems like we should allow it for numerics too.
      
      It's been like that forever, so back-patch to all supported branches.
      
      Discussion: https://postgr.es/m/30908.1496006184@sss.pgh.pa.us
      ce509452
    • Tom Lane's avatar
      More code review for get_qual_for_list(). · dced55da
      Tom Lane authored
      Avoid trashing the input PartitionBoundSpec; while that might be safe for
      current callers, it's certainly trouble waiting to happen.  In the same
      vein, make sure that all of the result data structure is freshly palloc'd,
      rather than some of it being pointers into the input data structures
      (which we don't know the lifespans of).
      
      Simplify the logic for tacking on IS NULL or IS NOT NULL conditions some
      more; commit 85c2b9a1 left a lot on the table there.  And rearrange the
      construction of the nodes into (what seems to me) a more logical order.
      
      In passing, make sure that get_qual_for_range() also returns a freshly
      palloc'd structure, since there's no value in having that guarantee for
      only one kind of partitioning.  And improve some comments there.
      
      Jeevan Ladhe, with further tweaking by me
      
      Discussion: https://postgr.es/m/CAOgcT0MAcYoMs93W80iTUf_dP36=1mZQzeUk+nnwY_-qWDrCfw@mail.gmail.com
      dced55da
    • Magnus Hagander's avatar
      Fix typo in comment · 917d9128
      Magnus Hagander authored
      Masahiko Sawada
      917d9128
    • Heikki Linnakangas's avatar
      Fix reference to RFC specifying SCRAM. · 6fd65f6b
      Heikki Linnakangas authored
      Noted by Peter Eisentraut
      6fd65f6b
    • Tom Lane's avatar
      Code review focused on new node types added by partitioning support. · 76a3df6e
      Tom Lane authored
      Fix failure to check that we got a plain Const from const-simplification of
      a coercion request.  This is the cause of bug #14666 from Tian Bing: there
      is an int4 to money cast, but it's only stable not immutable (because of
      dependence on lc_monetary), resulting in a FuncExpr that the code was
      miserably unequipped to deal with, or indeed even to notice that it was
      failing to deal with.  Add test cases around this coercion behavior.
      
      In view of the above, sprinkle the code liberally with castNode() macros,
      in hope of catching the next such bug a bit sooner.  Also, change some
      functions that were randomly declared to take Node* to take more specific
      pointer types.  And change some struct fields that were declared Node*
      but could be given more specific types, allowing removal of assorted
      explicit casts.
      
      Place PARTITION_MAX_KEYS check a bit closer to the code it's protecting.
      Likewise check only-one-key-for-list-partitioning restriction in a less
      random place.
      
      Avoid not-per-project-style usages like !strcmp(...).
      
      Fix assorted failures to avoid scribbling on the input of parse
      transformation.  I'm not sure how necessary this is, but it's entirely
      silly for these functions to be expending cycles to avoid that and not
      getting it right.
      
      Add guards against partitioning on system columns.
      
      Put backend/nodes/ support code into an order that matches handling
      of these node types elsewhere.
      
      Annotate the fact that somebody added location fields to PartitionBoundSpec
      and PartitionRangeDatum but forgot to handle them in
      outfuncs.c/readfuncs.c.  This is fairly harmless for production purposes
      (since readfuncs.c would just substitute -1 anyway) but it's still bogus.
      It's not worth forcing a post-beta1 initdb just to fix this, but if we
      have another reason to force initdb before 10.0, we should go back and
      clean this up.
      
      Contrariwise, somebody added location fields to PartitionElem and
      PartitionSpec but forgot to teach exprLocation() about them.
      
      Consolidate duplicative code in transformPartitionBound().
      
      Improve a couple of error messages.
      
      Improve assorted commentary.
      
      Re-pgindent the files touched by this patch; this affects a few comment
      blocks that must have been added quite recently.
      
      Report: https://postgr.es/m/20170524024550.29935.14396@wrigleys.postgresql.org
      76a3df6e
  8. 28 May, 2017 1 commit