1. 21 Jun, 2016 1 commit
    • Tom Lane's avatar
      Refactor planning of projection steps that don't need a Result plan node. · 8b9d323c
      Tom Lane authored
      The original upper-planner-pathification design (commit 3fc6e2d7)
      assumed that we could always determine during Path formation whether or not
      we would need a Result plan node to perform projection of a targetlist.
      That turns out not to work very well, though, because createplan.c still
      has some responsibilities for choosing the specific target list associated
      with sorting/grouping nodes (in particular it might choose to add resjunk
      columns for sorting).  We might not ever refactor that --- doing so would
      push more work into Path formation, which isn't attractive --- and we
      certainly won't do so for 9.6.  So, while create_projection_path and
      apply_projection_to_path can tell for sure what will happen if the subpath
      is projection-capable, they can't tell for sure when it isn't.  This is at
      least a latent bug in apply_projection_to_path, which might think it can
      apply a target to a non-projecting node when the node will end up computing
      something different.
      
      Also, I'd tied the creation of a ProjectionPath node to whether or not a
      Result is needed, but it turns out that we sometimes need a ProjectionPath
      node anyway to avoid modifying a possibly-shared subpath node.  Callers had
      to use create_projection_path for such cases, and we added code to them
      that knew about the potential omission of a Result node and attempted to
      adjust the cost estimates for that.  That was uncertainly correct and
      definitely ugly/unmaintainable.
      
      To fix, have create_projection_path explicitly check whether a Result
      is needed and adjust its cost estimate accordingly, though it creates
      a ProjectionPath in either case.  apply_projection_to_path is now mostly
      just an optimized version that can avoid creating an extra Path node when
      the input is known to not be shared with any other live path.  (There
      is one case that create_projection_path doesn't handle, which is pushing
      parallel-safe expressions below a Gather node.  We could make it do that
      by duplicating the GatherPath, but there seems no need as yet.)
      
      create_projection_plan still has to recheck the tlist-match condition,
      which means that if the matching situation does get changed by createplan.c
      then we'll have made a slightly incorrect cost estimate.  But there seems
      no help for that in the near term, and I doubt it occurs often enough,
      let alone would change planning decisions often enough, to be worth
      stressing about.
      
      I added a "dummypp" field to ProjectionPath to track whether
      create_projection_path thinks a Result is needed.  This is not really
      necessary as-committed because create_projection_plan doesn't look at the
      flag; but it seems like a good idea to remember what we thought when
      forming the cost estimate, if only for debugging purposes.
      
      In passing, get rid of the target_parallel parameter added to
      apply_projection_to_path by commit 54f5c515.  I don't think that's a good
      idea because it involves callers in what should be an internal decision,
      and opens us up to missing optimization opportunities if callers think they
      don't need to provide a valid flag, as most don't.  For the moment, this
      just costs us an extra has_parallel_hazard call when planning a Gather.
      If that starts to look expensive, I think a better solution would be to
      teach PathTarget to carry/cache knowledge of parallel-safety of its
      contents.
      8b9d323c
  2. 20 Jun, 2016 7 commits
  3. 19 Jun, 2016 1 commit
    • Tom Lane's avatar
      Docs: improve description of psql's %R prompt escape sequence. · 705ad7f3
      Tom Lane authored
      Dilian Palauzov pointed out in bug #14201 that the docs failed to mention
      the possibility of %R producing '(' due to an unmatched parenthesis.
      
      He proposed just adding that in the same style as the other options were
      listed; but it seemed to me that the sentence was already nearly
      unintelligible, so I rewrote it a bit more extensively.
      
      Report: <20160619121113.5789.68274@wrigleys.postgresql.org>
      705ad7f3
  4. 18 Jun, 2016 6 commits
    • Tom Lane's avatar
      Improve error message annotation for GRANT/REVOKE on untrusted PLs. · 9bc33323
      Tom Lane authored
      The annotation for "ERROR: language "foo" is not trusted" used to say
      "HINT: Only superusers can use untrusted languages", which was fairly
      poorly thought out.  For one thing, it's not a hint about what to do,
      but a statement of fact, which makes it errdetail.  But also, this
      fails to clarify things much, because there's a missing step in the
      chain of reasoning.  I think it's more useful to say "GRANT and REVOKE
      are not allowed on untrusted languages, because only superusers can use
      untrusted languages".
      
      It's been like this for a long time, but given the lack of previous
      complaints, I don't think this is worth back-patching.
      
      Discussion: <1417.1466289901@sss.pgh.pa.us>
      9bc33323
    • Tom Lane's avatar
      Update 9.6 release notes through today. · a3f42e85
      Tom Lane authored
      a3f42e85
    • Tom Lane's avatar
      Restore foreign-key-aware estimation of join relation sizes. · 100340e2
      Tom Lane authored
      This patch provides a new implementation of the logic added by commit
      137805f8 and later removed by 77ba6108.  It differs from the original
      primarily in expending much less effort per joinrel in large queries,
      which it accomplishes by doing most of the matching work once per query not
      once per joinrel.  Hopefully, it's also less buggy and better commented.
      The never-documented enable_fkey_estimates GUC remains gone.
      
      There remains work to be done to make the selectivity estimates account
      for nulls in FK referencing columns; but that was true of the original
      patch as well.  We may be able to address this point later in beta.
      In the meantime, any error should be in the direction of overestimating
      rather than underestimating joinrel sizes, which seems like the direction
      we want to err in.
      
      Tomas Vondra and Tom Lane
      
      Discussion: <31041.1465069446@sss.pgh.pa.us>
      100340e2
    • Tom Lane's avatar
      Still another try at fixing scanjoin_target insertion into parallel plans. · 598aa194
      Tom Lane authored
      The previous code neglected the fact that the scanjoin_target might
      carry sortgroupref labelings that we need to absorb.  Instead, do
      create_projection_path() unconditionally, and tweak the path's cost
      estimate after the fact.  (I'm now convinced that we ought to refactor
      the way we account for sometimes not needing a separate projection step,
      but right now is not the time for that sort of cleanup.)
      
      Problem identified by Amit Kapila, patch by me.
      598aa194
    • Tom Lane's avatar
      Fix parallel-safety markings for contrib/dblink. · 7e81a18d
      Tom Lane authored
      As shown by buildfarm reports, dblink_build_sql_insert and
      dblink_build_sql_update are *not* parallel safe, because they
      may attempt to access temporary tables of the local session.
      
      Although dblink_build_sql_delete doesn't actually touch the
      contents of the referenced table, it seems consistent and prudent
      to mark it PARALLEL RESTRICTED too.
      7e81a18d
    • Tom Lane's avatar
      Fix handling of argument and result datatypes for partial aggregation. · 915b703e
      Tom Lane authored
      When doing partial aggregation, the args list of the upper (combining)
      Aggref node is replaced by a Var representing the output of the partial
      aggregation steps, which has either the aggregate's transition data type
      or a serialized representation of that.  However, nodeAgg.c blindly
      continued to use the args list as an indication of the user-level argument
      types.  This broke resolution of polymorphic transition datatypes at
      executor startup (though it accidentally failed to fail for the ANYARRAY
      case, which is likely the only one anyone had tested).  Moreover, the
      constructed FuncExpr passed to the finalfunc contained completely wrong
      information, which would have led to bogus answers or crashes for any case
      where the finalfunc examined that information (which is only likely to be
      with polymorphic aggregates using a non-polymorphic transition type).
      
      As an independent bug, apply_partialaggref_adjustment neglected to resolve
      a polymorphic transition datatype before assigning it as the output type
      of the lower-level Aggref node.  This again accidentally failed to fail
      for ANYARRAY but would be unlikely to work in other cases.
      
      To fix the first problem, record the user-level argument types in a
      separate OID-list field of Aggref, and look to that rather than the args
      list when asking what the argument types were.  (It turns out to be
      convenient to include any "direct" arguments in this list too, although
      those are not currently subject to being overwritten.)
      
      Rather than adding yet another resolve_aggregate_transtype() call to fix
      the second problem, add an aggtranstype field to Aggref, and store the
      resolved transition type OID there when the planner first computes it.
      (By doing this in the planner and not the parser, we can allow the
      aggregate's transition type to change from time to time, although no DDL
      support yet exists for that.)  This saves nothing of consequence for
      simple non-polymorphic aggregates, but for polymorphic transition types
      we save a catalog lookup during executor startup as well as several
      planner lookups that are new in 9.6 due to parallel query planning.
      
      In passing, fix an error that was introduced into count_agg_clauses_walker
      some time ago: it was applying exprTypmod() to something that wasn't an
      expression node at all, but a TargetEntry.  exprTypmod silently returned
      -1 so that there was not an obvious failure, but this broke the intended
      sensitivity of aggregate space consumption estimates to the typmod of
      varchar and similar data types.  This part needs to be back-patched.
      
      Catversion bump due to change of stored Aggref nodes.
      
      Discussion: <8229.1466109074@sss.pgh.pa.us>
      915b703e
  5. 17 Jun, 2016 10 commits
    • Tom Lane's avatar
      Docs typo fix. · d30d1acf
      Tom Lane authored
      Guillaume Lelarge
      d30d1acf
    • Alvaro Herrera's avatar
      Finish up XLOG_HINT renaming · 1ca4a1b5
      Alvaro Herrera authored
      Commit b8fd1a09 renamed XLOG_HINT to XLOG_FPI, but neglected two
      places.
      
      Backpatch to 9.3, like that commit.
      1ca4a1b5
    • Robert Haas's avatar
      pg_visibility: Add pg_truncate_visibility_map function. · 71d05a2c
      Robert Haas authored
      This requires some core changes as well so that we can properly
      WAL-log the truncation.  Specifically, it changes the format of the
      XLOG_SMGR_TRUNCATE WAL record, so bump XLOG_PAGE_MAGIC.
      
      Patch by me, reviewed but not fully endorsed by Andres Freund.
      71d05a2c
    • Robert Haas's avatar
      Try again to fix the way the scanjoin_target is used with partial paths. · 54f5c515
      Robert Haas authored
      Commit 04ae11f6 removed some broken
      code to apply the scan/join target to partial paths, but its theory
      that this processing step is totally unnecessary turns out to be wrong.
      Put similar code back again, but this time, check for parallel-safety
      and avoid in-place modifications to paths that may already have been
      used as part of some other path.
      
      (This is not an entirely elegant solution to this problem; it might
      be better, for example, to postpone generate_gather_paths for the
      topmost scan/join rel until after the scan/join target has been
      applied.  But this is not the time for such redesign work.)
      
      Amit Kapila and Robert Haas
      54f5c515
    • Robert Haas's avatar
      Add VACUUM (DISABLE_PAGE_SKIPPING) for emergencies. · ede62e56
      Robert Haas authored
      If you really want to vacuum every single page in the relation,
      regardless of apparent visibility status or anything else, you can use
      this option.  In previous releases, this behavior could be achieved
      using VACUUM (FREEZE), but because we can now recognize all-frozen
      pages as not needing to be frozen again, that no longer works.  There
      should be no need for routine use of this option, but maybe bugs or
      disaster recovery will necessitate its use.
      
      Patch by me, reviewed by Andres Freund.
      ede62e56
    • Robert Haas's avatar
      Update dblink extension for parallel query. · 20eb2731
      Robert Haas authored
      Almost all functions provided by this extension are PARALLEL
      RESTRICTED.  Mostly, that's because the leader's TCP connections won't
      be shared with the workers, but in some cases like dblink_get_pkey
      it's because they obtain locks which might be released early if taken
      within a parallel worker.  dblink_fdw_validator probably can't be used
      in a query anyway, but there would be no problem from the point of
      view of parallel query if it were, so it's PARALLEL SAFE.
      
      Andreas Karlsson
      20eb2731
    • Robert Haas's avatar
      postgres_fdw: Rephrase comment. · 177c56d6
      Robert Haas authored
      Per gripe from Thomas Munro, who only complained about a more
      localized problem, but I couldn't resist a bit more wordsmithing.
      177c56d6
    • Robert Haas's avatar
      Fix typo. · 9c188a84
      Robert Haas authored
      Thomas Munro
      9c188a84
    • Robert Haas's avatar
      Remove PID from 'parallel worker' context message. · 292794f8
      Robert Haas authored
      Discussion: <bfd204ab-ab1a-792a-b345-0274a09a4b5f@2ndquadrant.com>
      292794f8
    • Robert Haas's avatar
      Attempt to fix broken regression test. · 103512ce
      Robert Haas authored
      In commit 8c1d9d56, I attempted to
      add a regression test that would fail if the target list was pushed
      into a parallel worker, but due to brain fade on my part, it just
      randomly fails whether anything bad or not, because the error check
      inside the parallel_restricted() function tests whether there is
      *any process in the system* that is not connected to a client, not
      whether the process running the query is not connected to a client.
      
      A little experimentation has left me pessimistic about the
      prospects of doing better here in a short amount of time, so let's
      just fall back to checking that the plan is as we expect and leave
      the execution-time check for another day.
      103512ce
  6. 16 Jun, 2016 7 commits
    • Tom Lane's avatar
      Fix validation of overly-long IPv6 addresses. · 4c56f326
      Tom Lane authored
      The inet/cidr types sometimes failed to reject IPv6 inputs with too many
      colon-separated fields, instead translating them to '::/0'.  This is the
      result of a thinko in the original ISC code that seems to be as yet
      unreported elsewhere.  Per bug #14198 from Stefan Kaltenbrunner.
      
      Report: <20160616182222.5798.959@wrigleys.postgresql.org>
      4c56f326
    • Tom Lane's avatar
      Fix fuzzy thinking in ReinitializeParallelDSM(). · bfb93742
      Tom Lane authored
      The fact that no workers were successfully launched in the previous
      iteration does not excuse us from setting up properly to try again.
      This appears to explain crashes I saw in parallel regression testing
      due to error_mqh being NULL when it shouldn't be.
      
      Minor other cosmetic fixes too.
      bfb93742
    • Tom Lane's avatar
      Invent min_parallel_relation_size GUC to replace a hard-wired constant. · 75be6646
      Tom Lane authored
      The main point of doing this is to allow the cutoff to be set very small,
      even zero, to allow parallel-query behavior to be tested on relatively
      small tables such as we typically use in the regression tests.  But it
      might be of use to users too.  The number-of-workers scaling behavior in
      create_plain_partial_paths() is pretty ad-hoc and subject to change, so
      we won't expose anything about that, but the notion of not considering
      parallel query at all for tables below size X seems reasonably stable.
      
      Amit Kapila, per a suggestion from me
      
      Discussion: <17170.1465830165@sss.pgh.pa.us>
      75be6646
    • Alvaro Herrera's avatar
      Reword bogus comment · 3b5a2a88
      Alvaro Herrera authored
      3b5a2a88
    • Tom Lane's avatar
      Avoid crash in "postgres -C guc" for a GUC with a null string value. · 0b0baf26
      Tom Lane authored
      Emit "(null)" instead, which was the behavior all along on platforms
      that don't crash, eg OS X.  Per report from Jehan-Guillaume de Rorthais.
      Back-patch to 9.2 where -C option was introduced.
      
      Michael Paquier
      
      Report: <20160615204036.2d35d86a@firost>
      0b0baf26
    • Alvaro Herrera's avatar
      Remove unused prototype · b000afea
      Alvaro Herrera authored
      Commit 6f56b41a removed function get_pg_database_relfilenode but left
      its prototype in place.  Remove it.
      b000afea
    • Robert Haas's avatar
      Add regression test for 04ae11f6. · 8c1d9d56
      Robert Haas authored
      The code in this area needs further revision, and it would be best
      not to re-break the things we've already fixed.
      
      Per a gripe from Tom Lane.
      8c1d9d56
  7. 15 Jun, 2016 7 commits
    • Tom Lane's avatar
      Use strftime("%c") to format timestamps in psql's \watch command. · 9901d8ac
      Tom Lane authored
      This allows the timestamps to follow local conventions (in particular,
      they respond to the LC_TIME environment setting).  In C locale you get
      the same results as before.  It seems like a good idea to do this now not
      later because we already changed the format of \watch headers for 9.6.
      
      Also, increase the buffer sizes a tad to ensure there's enough space for
      translated strings.
      
      Discussion: <20160612145532.GA22965@postgresql.kr>
      9901d8ac
    • Robert Haas's avatar
      Fix regression test for force_parallel_mode=on. · 12f86209
      Robert Haas authored
      Commit 14a254fb managed not to
      exercise the code it was intended to test, and the comment explaining
      why no "parallel worker" line showed up in the context wasn't right.
      
      Amit Kapila, tweaked by me per Amit's analysis.
      12f86209
    • Robert Haas's avatar
      Add integrity-checking functions to pg_visibility. · e472ce96
      Robert Haas authored
      The new pg_check_visible() and pg_check_frozen() functions can be used to
      verify that the visibility map bits for a relation's data pages match the
      actual state of the tuples on those pages.
      
      Amit Kapila and Robert Haas, reviewed (in earlier versions) by Andres
      Freund.  Additional testing help by Thomas Munro.
      e472ce96
    • Robert Haas's avatar
      Fix lazy_scan_heap so that it won't mark pages all-frozen too soon. · 38e9f90a
      Robert Haas authored
      Commit a892234f added a new bit per
      page to the visibility map fork indicating whether the page is
      all-frozen, but incorrectly assumed that if lazy_scan_heap chose to
      freeze a tuple then that tuple would not need to later be frozen
      again. This turns out to be false, because xmin and xmax (and
      conceivably xvac, if dealing with tuples from very old releases) could
      be frozen at separate times.
      
      Thanks to Andres Freund for help in uncovering and tracking down this
      issue.
      38e9f90a
    • Robert Haas's avatar
      Mark some functions parallel-unsafe. · c7a25c24
      Robert Haas authored
      currtid() and currtid2() call GetLatestSnapshot(), which fails in
      parallel mode.  pg_export_snapshot() calls ExportSnapshot() which
      attempts to assign an XID for the current transaction if it does not
      already have one; that, too, will fail in parallel mode.
      
      Andreas Seltenreich
      c7a25c24
    • Tom Lane's avatar
      Force idle_in_transaction_session_timeout off in pg_dump and autovacuum. · 8383486f
      Tom Lane authored
      We disable statement_timeout and lock_timeout during dump and restore, to
      prevent any global settings that might exist from breaking routine backups.
      Commit c6dda1f4 should have added idle_in_transaction_session_timeout to
      that list, but failed to.
      
      Another place where these timeouts get turned off is autovacuum.  While
      I doubt an idle timeout could fire there, it seems better to be safe than
      sorry.
      
      pg_dump issue noted by Bernd Helmle, the other one found by grepping.
      
      Report: <352F9B77DB5D3082578D17BB@eje.land.credativ.lan>
      8383486f
    • Peter Eisentraut's avatar
      PL/Python: Clean up extended error reporting docs and tests · f0688d6e
      Peter Eisentraut authored
      Format the example and test code more to Python style standards.
      Improve whitespace.  Improve documentation formatting.
      f0688d6e
  8. 14 Jun, 2016 1 commit