1. 25 Aug, 2021 1 commit
  2. 16 Jul, 2021 1 commit
  3. 12 May, 2021 1 commit
    • Etsuro Fujita's avatar
      Fix EXPLAIN ANALYZE for async-capable nodes. · a363bc6d
      Etsuro Fujita authored
      EXPLAIN ANALYZE for an async-capable ForeignScan node associated with
      postgres_fdw is done just by using instrumentation for ExecProcNode()
      called from the node's callbacks, causing the following problems:
      
      1) If the remote table to scan is empty, the node is incorrectly
         considered as "never executed" by the command even if the node is
         executed, as ExecProcNode() isn't called from the node's callbacks at
         all in that case.
      2) The command fails to collect timings for things other than
         ExecProcNode() done in the node, such as creating a cursor for the
         node's remote query.
      
      To fix these problems, add instrumentation for async-capable nodes, and
      modify postgres_fdw accordingly.
      
      My oversight in commit 27e1f145.
      
      While at it, update a comment for the AsyncRequest struct in execnodes.h
      and the documentation for the ForeignAsyncRequest API in fdwhandler.sgml
      to match the code in ExecAsyncAppendResponse() in nodeAppend.c, and fix
      typos in comments in nodeAppend.c.
      
      Per report from Andrey Lepikhov, though I didn't use his patch.
      
      Reviewed-by: Andrey Lepikhov
      Discussion: https://postgr.es/m/2eb662bb-105d-fc20-7412-2f027cc3ca72%40postgrespro.ru
      a363bc6d
  4. 27 Apr, 2021 2 commits
    • Fujii Masao's avatar
      doc: Review for "Allow TRUNCATE command to truncate foreign tables". · 0c8f4086
      Fujii Masao authored
      Typos, corrections and language improvements in the docs.
      
      Author: Justin Pryzby, Fujii Masao
      Reviewed-by: Bharath Rupireddy, Justin Pryzby, Fujii Masao
      Discussion: https://postgr.es/m/20210411041658.GB14564@telsasoft.com
      0c8f4086
    • Fujii Masao's avatar
      Don't pass "ONLY" options specified in TRUNCATE to foreign data wrapper. · 8e9ea08b
      Fujii Masao authored
      Commit 8ff1c946 allowed TRUNCATE command to truncate foreign tables.
      Previously the information about "ONLY" options specified in TRUNCATE
      command were passed to the foreign data wrapper. Then postgres_fdw
      constructed the TRUNCATE command to issue the remote server and
      included "ONLY" options in it based on the passed information.
      
      On the other hand, "ONLY" options specified in SELECT, UPDATE or DELETE
      have no effect when accessing or modifying the remote table, i.e.,
      are not passed to the foreign data wrapper. So it's inconsistent to
      make only TRUNCATE command pass the "ONLY" options to the foreign data
      wrapper. Therefore this commit changes the TRUNCATE command so that
      it doesn't pass the "ONLY" options to the foreign data wrapper,
      for the consistency with other statements. Also this commit changes
      postgres_fdw so that it always doesn't include "ONLY" options in
      the TRUNCATE command that it constructs.
      
      Author: Fujii Masao
      Reviewed-by: Bharath Rupireddy, Kyotaro Horiguchi, Justin Pryzby, Zhihong Yu
      Discussion: https://postgr.es/m/551ed8c1-f531-818b-664a-2cecdab99cd8@oss.nttdata.com
      8e9ea08b
  5. 22 Apr, 2021 1 commit
  6. 08 Apr, 2021 1 commit
    • Fujii Masao's avatar
      Allow TRUNCATE command to truncate foreign tables. · 8ff1c946
      Fujii Masao authored
      This commit introduces new foreign data wrapper API for TRUNCATE.
      It extends TRUNCATE command so that it accepts foreign tables as
      the targets to truncate and invokes that API. Also it extends postgres_fdw
      so that it can issue TRUNCATE command to foreign servers, by adding
      new routine for that TRUNCATE API.
      
      The information about options specified in TRUNCATE command, e.g.,
      ONLY, CACADE, etc is passed to FDW via API. The list of foreign tables to
      truncate is also passed to FDW. FDW truncates the foreign data sources
      that the passed foreign tables specify, based on those information.
      For example, postgres_fdw constructs TRUNCATE command using them
      and issues it to the foreign server.
      
      For performance, TRUNCATE command invokes the FDW routine for
      TRUNCATE once per foreign server that foreign tables to truncate belong to.
      
      Author: Kazutaka Onishi, Kohei KaiGai, slightly modified by Fujii Masao
      Reviewed-by: Bharath Rupireddy, Michael Paquier, Zhihong Yu, Alvaro Herrera, Stephen Frost, Ashutosh Bapat, Amit Langote, Daniel Gustafsson, Ibrar Ahmed, Fujii Masao
      Discussion: https://postgr.es/m/CAOP8fzb_gkReLput7OvOK+8NHgw-RKqNv59vem7=524krQTcWA@mail.gmail.com
      Discussion: https://postgr.es/m/CAJuF6cMWDDqU-vn_knZgma+2GMaout68YUgn1uyDnexRhqqM5Q@mail.gmail.com
      8ff1c946
  7. 31 Mar, 2021 2 commits
    • Tom Lane's avatar
      Rework planning and execution of UPDATE and DELETE. · 86dc9005
      Tom Lane authored
      This patch makes two closely related sets of changes:
      
      1. For UPDATE, the subplan of the ModifyTable node now only delivers
      the new values of the changed columns (i.e., the expressions computed
      in the query's SET clause) plus row identity information such as CTID.
      ModifyTable must re-fetch the original tuple to merge in the old
      values of any unchanged columns.  The core advantage of this is that
      the changed columns are uniform across all tables of an inherited or
      partitioned target relation, whereas the other columns might not be.
      A secondary advantage, when the UPDATE involves joins, is that less
      data needs to pass through the plan tree.  The disadvantage of course
      is an extra fetch of each tuple to be updated.  However, that seems to
      be very nearly free in context; even worst-case tests don't show it to
      add more than a couple percent to the total query cost.  At some point
      it might be interesting to combine the re-fetch with the tuple access
      that ModifyTable must do anyway to mark the old tuple dead; but that
      would require a good deal of refactoring and it seems it wouldn't buy
      all that much, so this patch doesn't attempt it.
      
      2. For inherited UPDATE/DELETE, instead of generating a separate
      subplan for each target relation, we now generate a single subplan
      that is just exactly like a SELECT's plan, then stick ModifyTable
      on top of that.  To let ModifyTable know which target relation a
      given incoming row refers to, a tableoid junk column is added to
      the row identity information.  This gets rid of the horrid hack
      that was inheritance_planner(), eliminating O(N^2) planning cost
      and memory consumption in cases where there were many unprunable
      target relations.
      
      Point 2 of course requires point 1, so that there is a uniform
      definition of the non-junk columns to be returned by the subplan.
      We can't insist on uniform definition of the row identity junk
      columns however, if we want to keep the ability to have both
      plain and foreign tables in a partitioning hierarchy.  Since
      it wouldn't scale very far to have every child table have its
      own row identity column, this patch includes provisions to merge
      similar row identity columns into one column of the subplan result.
      In particular, we can merge the whole-row Vars typically used as
      row identity by FDWs into one column by pretending they are type
      RECORD.  (It's still okay for the actual composite Datums to be
      labeled with the table's rowtype OID, though.)
      
      There is more that can be done to file down residual inefficiencies
      in this patch, but it seems to be committable now.
      
      FDW authors should note several API changes:
      
      * The argument list for AddForeignUpdateTargets() has changed, and so
      has the method it must use for adding junk columns to the query.  Call
      add_row_identity_var() instead of manipulating the parse tree directly.
      You might want to reconsider exactly what you're adding, too.
      
      * PlanDirectModify() must now work a little harder to find the
      ForeignScan plan node; if the foreign table is part of a partitioning
      hierarchy then the ForeignScan might not be the direct child of
      ModifyTable.  See postgres_fdw for sample code.
      
      * To check whether a relation is a target relation, it's no
      longer sufficient to compare its relid to root->parse->resultRelation.
      Instead, check it against all_result_relids or leaf_result_relids,
      as appropriate.
      
      Amit Langote and Tom Lane
      
      Discussion: https://postgr.es/m/CA+HiwqHpHdqdDn48yCEhynnniahH78rwcrv1rEX65-fsZGBOLQ@mail.gmail.com
      86dc9005
    • Etsuro Fujita's avatar
      Add support for asynchronous execution. · 27e1f145
      Etsuro Fujita authored
      This implements asynchronous execution, which runs multiple parts of a
      non-parallel-aware Append concurrently rather than serially to improve
      performance when possible.  Currently, the only node type that can be
      run concurrently is a ForeignScan that is an immediate child of such an
      Append.  In the case where such ForeignScans access data on different
      remote servers, this would run those ForeignScans concurrently, and
      overlap the remote operations to be performed simultaneously, so it'll
      improve the performance especially when the operations involve
      time-consuming ones such as remote join and remote aggregation.
      
      We may extend this to other node types such as joins or aggregates over
      ForeignScans in the future.
      
      This also adds the support for postgres_fdw, which is enabled by the
      table-level/server-level option "async_capable".  The default is false.
      
      Robert Haas, Kyotaro Horiguchi, Thomas Munro, and myself.  This commit
      is mostly based on the patch proposed by Robert Haas, but also uses
      stuff from the patch proposed by Kyotaro Horiguchi and from the patch
      proposed by Thomas Munro.  Reviewed by Kyotaro Horiguchi, Konstantin
      Knizhnik, Andrey Lepikhov, Movead Li, Thomas Munro, Justin Pryzby, and
      others.
      
      Discussion: https://postgr.es/m/CA%2BTgmoaXQEt4tZ03FtQhnzeDEMzBck%2BLrni0UWHVVgOTnA6C1w%40mail.gmail.com
      Discussion: https://postgr.es/m/CA%2BhUKGLBRyu0rHrDCMC4%3DRn3252gogyp1SjOgG8SEKKZv%3DFwfQ%40mail.gmail.com
      Discussion: https://postgr.es/m/20200228.170650.667613673625155850.horikyota.ntt%40gmail.com
      27e1f145
  8. 24 Feb, 2021 1 commit
  9. 17 Feb, 2021 1 commit
  10. 20 Jan, 2021 1 commit
    • Tomas Vondra's avatar
      Implement support for bulk inserts in postgres_fdw · b663a413
      Tomas Vondra authored
      Extends the FDW API to allow batching inserts into foreign tables. That
      is usually much more efficient than inserting individual rows, due to
      high latency for each round-trip to the foreign server.
      
      It was possible to implement something similar in the regular FDW API,
      but it was inconvenient and there were issues with reporting the number
      of actually inserted rows etc. This extends the FDW API with two new
      functions:
      
      * GetForeignModifyBatchSize - allows the FDW picking optimal batch size
      
      * ExecForeignBatchInsert - inserts a batch of rows at once
      
      Currently, only INSERT queries support batching. Support for DELETE and
      UPDATE may be added in the future.
      
      This also implements batching for postgres_fdw. The batch size may be
      specified using "batch_size" option both at the server and table level.
      
      The initial patch version was written by me, but it was rewritten and
      improved in many ways by Takayuki Tsunakawa.
      
      Author: Takayuki Tsunakawa
      Reviewed-by: Tomas Vondra, Amit Langote
      Discussion: https://postgr.es/m/20200628151002.7x5laxwpgvkyiu3q@development
      b663a413
  11. 14 Oct, 2020 1 commit
  12. 30 Aug, 2020 1 commit
    • Tom Lane's avatar
      Redefine pg_class.reltuples to be -1 before the first VACUUM or ANALYZE. · 3d351d91
      Tom Lane authored
      Historically, we've considered the state with relpages and reltuples
      both zero as indicating that we do not know the table's tuple density.
      This is problematic because it's impossible to distinguish "never yet
      vacuumed" from "vacuumed and seen to be empty".  In particular, a user
      cannot use VACUUM or ANALYZE to override the planner's normal heuristic
      that an empty table should not be believed to be empty because it is
      probably about to get populated.  That heuristic is a good safety
      measure, so I don't care to abandon it, but there should be a way to
      override it if the table is indeed intended to stay empty.
      
      Hence, represent the initial state of ignorance by setting reltuples
      to -1 (relpages is still set to zero), and apply the minimum-ten-pages
      heuristic only when reltuples is still -1.  If the table is empty,
      VACUUM or ANALYZE (but not CREATE INDEX) will override that to
      reltuples = relpages = 0, and then we'll plan on that basis.
      
      This requires a bunch of fiddly little changes, but we can get rid of
      some ugly kluges that were formerly needed to maintain the old definition.
      
      One notable point is that FDWs' GetForeignRelSize methods will see
      baserel->tuples = -1 when no ANALYZE has been done on the foreign table.
      That seems like a net improvement, since those methods were formerly
      also in the dark about what baserel->tuples = 0 really meant.  Still,
      it is an API change.
      
      I bumped catversion because code predating this change would get confused
      by seeing reltuples = -1.
      
      Discussion: https://postgr.es/m/F02298E0-6EF4-49A1-BCB6-C484794D9ACC@thebuild.com
      3d351d91
  13. 05 Jul, 2020 1 commit
  14. 03 Jul, 2020 1 commit
    • Tom Lane's avatar
      Clamp total-tuples estimates for foreign tables to ensure planner sanity. · ca5e93f7
      Tom Lane authored
      After running GetForeignRelSize for a foreign table, adjust rel->tuples
      to be at least as large as rel->rows.  This prevents bizarre behavior
      in estimate_num_groups() and perhaps other places, especially in the
      scenario where rel->tuples is zero because pg_class.reltuples is
      (suggesting that ANALYZE has never been run for the table).  As things
      stood, we'd end up estimating one group out of any GROUP BY on such a
      table, whereas the default group-count estimate is more likely to result
      in a sane plan.
      
      Also, clarify in the documentation that GetForeignRelSize has the option
      to override the rel->tuples value if it has a better idea of what to use
      than what is in pg_class.reltuples.
      
      Per report from Jeff Janes.  Back-patch to all supported branches.
      
      Patch by me; thanks to Etsuro Fujita for review
      
      Discussion: https://postgr.es/m/CAMkU=1xNo9cnan+Npxgz0eK7394xmjmKg-QEm8wYG9P5-CcaqQ@mail.gmail.com
      ca5e93f7
  15. 18 Sep, 2019 1 commit
  16. 08 Sep, 2019 1 commit
  17. 09 May, 2019 1 commit
  18. 26 Apr, 2019 1 commit
  19. 18 Mar, 2019 1 commit
  20. 01 Mar, 2019 1 commit
    • Andres Freund's avatar
      Store tuples for EvalPlanQual in slots, rather than as HeapTuples. · ad0bda5d
      Andres Freund authored
      For the upcoming pluggable table access methods it's quite
      inconvenient to store tuples as HeapTuples, as that'd require
      converting tuples from a their native format into HeapTuples. Instead
      use slots to manage epq tuples.
      
      To fit into that scheme, change the foreign data wrapper callback
      RefetchForeignRow, to store the tuple in a slot. Insist on using the
      caller provided slot, so it conveniently can be stored in the
      corresponding EPQ slot.  As there is no in core user of
      RefetchForeignRow, that change was done blindly, but we plan to test
      that soon.
      
      To avoid duplicating that work for row locks, move row locks to just
      directly use the EPQ slots - it previously temporarily stored tuples
      in LockRowsState.lr_curtuples, but that doesn't seem beneficial, given
      we'd possibly end up with a significant number of additional slots.
      
      The behaviour of es_epqTupleSet[rti -1] is now checked by
      es_epqTupleSlot[rti -1] != NULL, as that is distinguishable from a
      slot containing an empty tuple.
      
      Author: Andres Freund, Haribabu Kommi, Ashutosh Bapat
      Discussion: https://postgr.es/m/20180703070645.wchpu5muyto5n647@alap3.anarazel.de
      ad0bda5d
  21. 07 Feb, 2019 1 commit
    • Tom Lane's avatar
      Split create_foreignscan_path() into three functions. · 34ea1ab7
      Tom Lane authored
      Up to now postgres_fdw has been using create_foreignscan_path() to
      generate not only base-relation paths, but also paths for foreign joins
      and foreign upperrels.  This is wrong, because create_foreignscan_path()
      calls get_baserel_parampathinfo() which will only do the right thing for
      baserels.  It accidentally fails to fail for unparameterized paths, which
      are the only ones postgres_fdw (thought it) was handling, but we really
      need different APIs for the baserel and join cases.
      
      In HEAD, the best thing to do seems to be to split up the baserel,
      joinrel, and upperrel cases into three functions so that they can
      have different APIs.  I haven't actually given create_foreign_join_path
      a different API in this commit: we should spend a bit of time thinking
      about just what we want to do there, since perhaps FDWs would want to
      do something different from the build-up-a-join-pairwise approach that
      get_joinrel_parampathinfo expects.  In the meantime, since postgres_fdw
      isn't prepared to generate parameterized joins anyway, just give it a
      defense against trying to plan joins with lateral refs.
      
      In addition (and this is what triggered this whole mess) fix bug #15613
      from Srinivasan S A, by teaching file_fdw and postgres_fdw that plain
      baserel foreign paths still have outer refs if the relation has
      lateral_relids.  Add some assertions in relnode.c to catch future
      occurrences of the same error --- in particular, to catch other FDWs
      doing that, but also as backstop against core-code mistakes like the
      one fixed by commit bdd9a99a.
      
      Bug #15613 also needs to be fixed in the back branches, but the
      appropriate fix will look quite a bit different there, since we don't
      want to assume that existing FDWs get the word right away.
      
      Discussion: https://postgr.es/m/15613-092be1be9576c728@postgresql.org
      34ea1ab7
  22. 13 Dec, 2018 1 commit
  23. 08 Jul, 2018 1 commit
    • Jeff Davis's avatar
      Fix WITH CHECK OPTION on views referencing postgres_fdw tables. · a45adc74
      Jeff Davis authored
      If a view references a foreign table, and the foreign table has a
      BEFORE INSERT trigger, then it's possible for a tuple inserted or
      updated through the view to be changed such that it violates the
      view's WITH CHECK OPTION constraint.
      
      Before this commit, postgres_fdw handled this case inconsistently. A
      RETURNING clause on the INSERT or UPDATE statement targeting the view
      would cause the finally-inserted tuple to be read back, and the WITH
      CHECK OPTION violation would throw an error. But without a RETURNING
      clause, postgres_fdw would not read the final tuple back, and WITH
      CHECK OPTION would not throw an error for the violation (or may throw
      an error when there is no real violation). AFTER ROW triggers on the
      foreign table had a similar effect as a RETURNING clause on the INSERT
      or UPDATE statement.
      
      To fix, this commit retrieves the attributes needed to enforce the
      WITH CHECK OPTION constraint along with the attributes needed for the
      RETURNING clause (if any) from the remote side. Thus, the WITH CHECK
      OPTION constraint is always evaluated against the final tuple after
      any triggers on the remote side.
      
      This fix may be considered inconsistent with CHECK constraints
      declared on foreign tables, which are not enforced locally at all
      (because the constraint is on a remote object). The discussion
      concluded that this difference is reasonable, because the WITH CHECK
      OPTION is a constraint on the local view (not any remote object);
      therefore it only makes sense to enforce its WITH CHECK OPTION
      constraint locally.
      
      Author: Etsuro Fujita
      Reviewed-by: Arthur Zakirov, Stephen Frost
      Discussion: https://www.postgresql.org/message-id/7eb58fab-fd3b-781b-ac33-f7cfec96021f%40lab.ntt.co.jp
      a45adc74
  24. 06 Apr, 2018 1 commit
  25. 02 Apr, 2018 2 commits
  26. 27 Nov, 2017 1 commit
    • Tom Lane's avatar
      Fix creation of resjunk tlist entries for inherited mixed UPDATE/DELETE. · 9a785ad5
      Tom Lane authored
      rewriteTargetListUD's processing is dependent on the relkind of the query's
      target table.  That was fine at the time it was made to act that way, even
      for queries on inheritance trees, because all tables in an inheritance tree
      would necessarily be plain tables.  However, the 9.5 feature addition
      allowing some members of an inheritance tree to be foreign tables broke the
      assumption that rewriteTargetListUD's output tlist could be applied to all
      child tables with nothing more than column-number mapping.  This led to
      visible failures if foreign child tables had row-level triggers, and would
      also break in cases where child tables belonged to FDWs that used methods
      other than CTID for row identification.
      
      To fix, delay running rewriteTargetListUD until after the planner has
      expanded inheritance, so that it is applied separately to the (already
      mapped) tlist for each child table.  We can conveniently call it from
      preprocess_targetlist.  Refactor associated code slightly to avoid the
      need to heap_open the target relation multiple times during
      preprocess_targetlist.  (The APIs remain a bit ugly, particularly around
      the point of which steps scribble on parse->targetList and which don't.
      But avoiding such scribbling would require a change in FDW callback APIs,
      which is more pain than it's worth.)
      
      Also fix ExecModifyTable to ensure that "tupleid" is reset to NULL when
      we transition from rows providing a CTID to rows that don't.  (That's
      really an independent bug, but it manifests in much the same cases.)
      
      Add a regression test checking one manifestation of this problem, which
      was that row-level triggers on a foreign child table did not work right.
      
      Back-patch to 9.5 where the problem was introduced.
      
      Etsuro Fujita, reviewed by Ildus Kurbangaliev and Ashutosh Bapat
      
      Discussion: https://postgr.es/m/20170514150525.0346ba72@postgrespro.ru
      9a785ad5
  27. 23 Nov, 2017 1 commit
    • Peter Eisentraut's avatar
      Convert documentation to DocBook XML · 3c49c6fa
      Peter Eisentraut authored
      Since some preparation work had already been done, the only source
      changes left were changing empty-element tags like <xref linkend="foo">
      to <xref linkend="foo"/>, and changing the DOCTYPE.
      
      The source files are still named *.sgml, but they are actually XML files
      now.  Renaming could be considered later.
      
      In the build system, the intermediate step to convert from SGML to XML
      is removed.  Everything is build straight from the source files again.
      The OpenSP (or the old SP) package is no longer needed.
      
      The documentation toolchain instructions are updated and are much
      simpler now.
      
      Peter Eisentraut, Alexander Lakhin, Jürgen Purtz
      3c49c6fa
  28. 17 Oct, 2017 1 commit
    • Peter Eisentraut's avatar
      Don't use SGML empty tags · c29c5789
      Peter Eisentraut authored
      For DocBook XML compatibility, don't use SGML empty tags (</>) anymore,
      replace by the full tag name.  Add a warning option to catch future
      occurrences.
      
      Alexander Lakhin, Jürgen Purtz
      c29c5789
  29. 06 Oct, 2017 1 commit
    • Robert Haas's avatar
      Basic partition-wise join functionality. · f49842d1
      Robert Haas authored
      Instead of joining two partitioned tables in their entirety we can, if
      it is an equi-join on the partition keys, join the matching partitions
      individually.  This involves teaching the planner about "other join"
      rels, which are related to regular join rels in the same way that
      other member rels are related to baserels.  This can use significantly
      more CPU time and memory than regular join planning, because there may
      now be a set of "other" rels not only for every base relation but also
      for every join relation.  In most practical cases, this probably
      shouldn't be a problem, because (1) it's probably unusual to join many
      tables each with many partitions using the partition keys for all
      joins and (2) if you do that scenario then you probably have a big
      enough machine to handle the increased memory cost of planning and (3)
      the resulting plan is highly likely to be better, so what you spend in
      planning you'll make up on the execution side.  All the same, for now,
      turn this feature off by default.
      
      Currently, we can only perform joins between two tables whose
      partitioning schemes are absolutely identical.  It would be nice to
      cope with other scenarios, such as extra partitions on one side or the
      other with no match on the other side, but that will have to wait for
      a future patch.
      
      Ashutosh Bapat, reviewed and tested by Rajkumar Raghuwanshi, Amit
      Langote, Rafia Sabih, Thomas Munro, Dilip Kumar, Antonin Houska, Amit
      Khandekar, and by me.  A few final adjustments by me.
      
      Discussion: http://postgr.es/m/CAFjFpRfQ8GrQvzp3jA2wnLqrHmaXna-urjm_UY9BqXj=EaDTSA@mail.gmail.com
      Discussion: http://postgr.es/m/CAFjFpRcitjfrULr5jfuKWRPsGUX0LQ0k8-yG0Qw2+1LBGNpMdw@mail.gmail.com
      f49842d1
  30. 06 Sep, 2017 2 commits
    • Peter Eisentraut's avatar
      doc: Make function synopsis formatting more uniform · 34ae1828
      Peter Eisentraut authored
      Whitespace use was inconsistent in the same chapter.
      34ae1828
    • Peter Eisentraut's avatar
      Escape < and & in SGML · 1c53f612
      Peter Eisentraut authored
      This is not required in SGML, but will be in XML, so this is a step to
      prepare for the conversion to XML.  (It is still not required to escape
      >, but we did it here in some cases for symmetry.)
      
      Add a command-line option to osx/onsgmls calls to warn about unescaped
      occurrences in the future.
      
      Author: Alexander Law <exclusion@gmail.com>
      Author: Peter Eisentraut <peter.eisentraut@2ndquadrant.com>
      1c53f612
  31. 30 Aug, 2017 1 commit
    • Tom Lane's avatar
      Separate reinitialization of shared parallel-scan state from ExecReScan. · 41b0dd98
      Tom Lane authored
      Previously, the parallel executor logic did reinitialization of shared
      state within the ExecReScan code for parallel-aware scan nodes.  This is
      problematic, because it means that the ExecReScan call has to occur
      synchronously (ie, during the parent Gather node's ReScan call).  That is
      swimming very much against the tide so far as the ExecReScan machinery is
      concerned; the fact that it works at all today depends on a lot of fragile
      assumptions, such as that no plan node between Gather and a parallel-aware
      scan node is parameterized.  Another objection is that because ExecReScan
      might be called in workers as well as the leader, hacky extra tests are
      needed in some places to prevent unwanted shared-state resets.
      
      Hence, let's separate this code into two functions, a ReInitializeDSM
      call and the ReScan call proper.  ReInitializeDSM is called only in
      the leader and is guaranteed to run before we start new workers.
      ReScan is returned to its traditional function of resetting only local
      state, which means that ExecReScan's usual habits of delaying or
      eliminating child rescan calls are safe again.
      
      As with the preceding commit 7df2c1f8, it doesn't seem to be necessary
      to make these changes in 9.6, which is a good thing because the FDW and
      CustomScan APIs are impacted.
      
      Discussion: https://postgr.es/m/CAA4eK1JkByysFJNh9M349u_nNjqETuEnY_y1VUc_kJiU0bxtaQ@mail.gmail.com
      41b0dd98
  32. 26 Feb, 2017 1 commit
  33. 22 Jul, 2016 1 commit
  34. 12 Jul, 2016 1 commit
  35. 08 Jul, 2016 1 commit
  36. 01 Jul, 2016 1 commit
    • Tom Lane's avatar
      Rethink the GetForeignUpperPaths API (again). · 9e703987
      Tom Lane authored
      In the previous design, the GetForeignUpperPaths FDW callback hook was
      called before we got around to labeling upper relations with the proper
      consider_parallel flag; this meant that any upper paths created by an FDW
      would be marked not-parallel-safe.  While that's probably just as well
      right now, we aren't going to want it to be true forever.  Hence, abandon
      the idea that FDWs should be allowed to inject upper paths before the core
      code has gotten around to creating the relevant upper relation.  (Well,
      actually they still can, but it's on their own heads how well it works.)
      Instead, adopt the same API already designed for create_upper_paths_hook:
      we call GetForeignUpperPaths after each upperrel has been created and
      populated with the paths the core planner knows how to make.
      9e703987