Skip to content
Snippets Groups Projects
Select Git revision
  • benchmark-tools
  • postgres-lambda
  • master default
  • REL9_4_25
  • REL9_5_20
  • REL9_6_16
  • REL_10_11
  • REL_11_6
  • REL_12_1
  • REL_12_0
  • REL_12_RC1
  • REL_12_BETA4
  • REL9_4_24
  • REL9_5_19
  • REL9_6_15
  • REL_10_10
  • REL_11_5
  • REL_12_BETA3
  • REL9_4_23
  • REL9_5_18
  • REL9_6_14
  • REL_10_9
  • REL_11_4
23 results

nodeSubqueryscan.c

Blame
    • Tom Lane's avatar
      69f526aa
      Mark read/write expanded values as read-only in ExecProject(). · 69f526aa
      Tom Lane authored
      If a plan node output expression returns an "expanded" datum, and that
      output column is referenced in more than one place in upper-level plan
      nodes, we need to ensure that what is returned is a read-only reference
      not a read/write reference.  Otherwise one of the referencing sites could
      scribble on or even delete the expanded datum before we have evaluated the
      others.  Commit 1dc5ebc9, which introduced this feature, supposed
      that it'd be sufficient to make SubqueryScan nodes force their output
      columns to read-only state.  The folly of that was revealed by bug #14174
      from Andrew Gierth, and really should have been immediately obvious
      considering that the planner will happily optimize SubqueryScan nodes
      out of the plan without any regard for this issue.
      
      The safest fix seems to be to make ExecProject() force its results into
      read-only state; that will cover every case where a plan node returns
      expression results.  Actually we can delegate this to ExecTargetList()
      since we can recursively assume that plain Vars will not reference
      read-write datums.  That should keep the extra overhead down to something
      minimal.  We no longer need ExecMakeSlotContentsReadOnly(), which was
      introduced only in support of the idea that just a few plan node types
      would need to do this.
      
      In the future it would be nice to have the planner account for this problem
      and inject force-to-read-only expression evaluation nodes into only the
      places where there's a risk of multiple evaluation.  That's not a suitable
      solution for 9.5 or even 9.6 at this point, though.
      
      Report: <20160603124628.9932.41279@wrigleys.postgresql.org>
      69f526aa
      History
      Mark read/write expanded values as read-only in ExecProject().
      Tom Lane authored
      If a plan node output expression returns an "expanded" datum, and that
      output column is referenced in more than one place in upper-level plan
      nodes, we need to ensure that what is returned is a read-only reference
      not a read/write reference.  Otherwise one of the referencing sites could
      scribble on or even delete the expanded datum before we have evaluated the
      others.  Commit 1dc5ebc9, which introduced this feature, supposed
      that it'd be sufficient to make SubqueryScan nodes force their output
      columns to read-only state.  The folly of that was revealed by bug #14174
      from Andrew Gierth, and really should have been immediately obvious
      considering that the planner will happily optimize SubqueryScan nodes
      out of the plan without any regard for this issue.
      
      The safest fix seems to be to make ExecProject() force its results into
      read-only state; that will cover every case where a plan node returns
      expression results.  Actually we can delegate this to ExecTargetList()
      since we can recursively assume that plain Vars will not reference
      read-write datums.  That should keep the extra overhead down to something
      minimal.  We no longer need ExecMakeSlotContentsReadOnly(), which was
      introduced only in support of the idea that just a few plan node types
      would need to do this.
      
      In the future it would be nice to have the planner account for this problem
      and inject force-to-read-only expression evaluation nodes into only the
      places where there's a risk of multiple evaluation.  That's not a suitable
      solution for 9.5 or even 9.6 at this point, though.
      
      Report: <20160603124628.9932.41279@wrigleys.postgresql.org>