Skip to content
Snippets Groups Projects
  1. Nov 18, 2011
    • Robert Haas's avatar
      Further consolidation of DROP statement handling. · fc6d1006
      Robert Haas authored
      This gets rid of an impressive amount of duplicative code, with only
      minimal behavior changes.  DROP FOREIGN DATA WRAPPER now requires object
      ownership rather than superuser privileges, matching the documentation
      we already have.  We also eliminate the historical warning about dropping
      a built-in function as unuseful.  All operations are now performed in the
      same order for all object types handled by dropcmds.c.
      
      KaiGai Kohei, with minor revisions by me
      fc6d1006
  2. Nov 03, 2011
    • Heikki Linnakangas's avatar
      Support range data types. · 4429f6a9
      Heikki Linnakangas authored
      Selectivity estimation functions are missing for some range type operators,
      which is a TODO.
      
      Jeff Davis
      4429f6a9
    • Tom Lane's avatar
      Fix handling of PlaceHolderVars in nestloop parameter management. · 7e3bf99b
      Tom Lane authored
      If we use a PlaceHolderVar from the outer relation in an inner indexscan,
      we need to reference the PlaceHolderVar as such as the value to be passed
      in from the outer relation.  The previous code effectively tried to
      reconstruct the PHV from its component expression, which doesn't work since
      (a) the Vars therein aren't necessarily bubbled up far enough, and (b) it
      would be the wrong semantics anyway because of the possibility that the PHV
      is supposed to have gone to null at some point before the current join.
      Point (a) led to "variable not found in subplan target list" planner
      errors, but point (b) would have led to silently wrong answers.
      Per report from Roger Niederland.
      7e3bf99b
  3. Oct 23, 2011
    • Tom Lane's avatar
      Don't trust deferred-unique indexes for join removal. · 0f39d505
      Tom Lane authored
      The uniqueness condition might fail to hold intra-transaction, and assuming
      it does can give incorrect query results.  Per report from Marti Raudsepp,
      though this is not his proposed patch.
      
      Back-patch to 9.0, where both these features were introduced.  In the
      released branches, add the new IndexOptInfo field to the end of the struct,
      to try to minimize ABI breakage for third-party code that may be examining
      that struct.
      0f39d505
  4. Oct 16, 2011
  5. Oct 14, 2011
    • Tom Lane's avatar
      Measure the number of all-visible pages for use in index-only scan costing. · e6858e66
      Tom Lane authored
      Add a column pg_class.relallvisible to remember the number of pages that
      were all-visible according to the visibility map as of the last VACUUM
      (or ANALYZE, or some other operations that update pg_class.relpages).
      Use relallvisible/relpages, instead of an arbitrary constant, to estimate
      how many heap page fetches can be avoided during an index-only scan.
      
      This is pretty primitive and will no doubt see refinements once we've
      acquired more field experience with the index-only scan mechanism, but
      it's way better than using a constant.
      
      Note: I had to adjust an underspecified query in the window.sql regression
      test, because it was changing answers when the plan changed to use an
      index-only scan.  Some of the adjacent tests perhaps should be adjusted
      as well, but I didn't do that here.
      e6858e66
  6. Oct 11, 2011
    • Tom Lane's avatar
      Rearrange the implementation of index-only scans. · a0185461
      Tom Lane authored
      This commit changes index-only scans so that data is read directly from the
      index tuple without first generating a faux heap tuple.  The only immediate
      benefit is that indexes on system columns (such as OID) can be used in
      index-only scans, but this is necessary infrastructure if we are ever to
      support index-only scans on expression indexes.  The executor is now ready
      for that, though the planner still needs substantial work to recognize
      the possibility.
      
      To do this, Vars in index-only plan nodes have to refer to index columns
      not heap columns.  I introduced a new special varno, INDEX_VAR, to mark
      such Vars to avoid confusion.  (In passing, this commit renames the two
      existing special varnos to OUTER_VAR and INNER_VAR.)  This allows
      ruleutils.c to handle them with logic similar to what we use for subplan
      reference Vars.
      
      Since index-only scans are now fundamentally different from regular
      indexscans so far as their expression subtrees are concerned, I also chose
      to change them to have their own plan node type (and hence, their own
      executor source file).
      a0185461
  7. Oct 08, 2011
    • Tom Lane's avatar
      Support index-only scans using the visibility map to avoid heap fetches. · a2822fb9
      Tom Lane authored
      When a btree index contains all columns required by the query, and the
      visibility map shows that all tuples on a target heap page are
      visible-to-all, we don't need to fetch that heap page.  This patch depends
      on the previous patches that made the visibility map reliable.
      
      There's a fair amount left to do here, notably trying to figure out a less
      chintzy way of estimating the cost of an index-only scan, but the core
      functionality seems ready to commit.
      
      Robert Haas and Ibrar Ahmed, with some previous work by Heikki Linnakangas.
      a2822fb9
  8. Sep 22, 2011
    • Tom Lane's avatar
      Make EXPLAIN ANALYZE report the numbers of rows rejected by filter steps. · f1972723
      Tom Lane authored
      This provides information about the numbers of tuples that were visited
      but not returned by table scans, as well as the numbers of join tuples
      that were considered and discarded within a join plan node.
      
      There is still some discussion going on about the best way to report counts
      for outer-join situations, but I think most of what's in the patch would
      not change if we revise that, so I'm going to go ahead and commit it as-is.
      
      Documentation changes to follow (they weren't in the submitted patch
      either).
      
      Marko Tiikkaja, reviewed by Marc Cousin, somewhat revised by Tom
      f1972723
  9. Sep 16, 2011
    • Tom Lane's avatar
      Redesign the plancache mechanism for more flexibility and efficiency. · e6faf910
      Tom Lane authored
      Rewrite plancache.c so that a "cached plan" (which is rather a misnomer
      at this point) can support generation of custom, parameter-value-dependent
      plans, and can make an intelligent choice between using custom plans and
      the traditional generic-plan approach.  The specific choice algorithm
      implemented here can probably be improved in future, but this commit is
      all about getting the mechanism in place, not the policy.
      
      In addition, restructure the API to greatly reduce the amount of extraneous
      data copying needed.  The main compromise needed to make that possible was
      to split the initial creation of a CachedPlanSource into two steps.  It's
      worth noting in particular that SPI_saveplan is now deprecated in favor of
      SPI_keepplan, which accomplishes the same end result with zero data
      copying, and no need to then spend even more cycles throwing away the
      original SPIPlan.  The risk of long-term memory leaks while manipulating
      SPIPlans has also been greatly reduced.  Most of this improvement is based
      on use of the recently-added MemoryContextSetParent primitive.
      e6faf910
  10. Sep 11, 2011
    • Peter Eisentraut's avatar
      Remove many -Wcast-qual warnings · 1b81c2fe
      Peter Eisentraut authored
      This addresses only those cases that are easy to fix by adding or
      moving a const qualifier or removing an unnecessary cast.  There are
      many more complicated cases remaining.
      1b81c2fe
  11. Sep 03, 2011
    • Tom Lane's avatar
      Rearrange planner to save the whole PlannerInfo (subroot) for a subquery. · b3aaf908
      Tom Lane authored
      Formerly, set_subquery_pathlist and other creators of plans for subqueries
      saved only the rangetable and rowMarks lists from the lower-level
      PlannerInfo.  But there's no reason not to remember the whole PlannerInfo,
      and indeed this turns out to simplify matters in a number of places.
      
      The immediate reason for doing this was so that the subroot will still be
      accessible when we're trying to extract column statistics out of an
      already-planned subquery.  But now that I've done it, it seems like a good
      code-beautification effort in its own right.
      
      I also chose to get rid of the transient subrtable and subrowmark fields in
      SubqueryScan nodes, in favor of having setrefs.c look up the subquery's
      RelOptInfo.  That required changing all the APIs in setrefs.c to pass
      PlannerInfo not PlannerGlobal, which was a large but quite mechanical
      transformation.
      
      One side-effect not foreseen at the beginning is that this finally broke
      inheritance_planner's assumption that replanning the same subquery RTE N
      times would necessarily give interchangeable results each time.  That
      assumption was always pretty risky, but now we really have to make a
      separate RTE for each instance so that there's a place to carry the
      separate subroots.
      b3aaf908
  12. Sep 01, 2011
  13. Aug 22, 2011
    • Tom Lane's avatar
      Fix trigger WHEN conditions when both BEFORE and AFTER triggers exist. · b33f78df
      Tom Lane authored
      Due to tuple-slot mismanagement, evaluation of WHEN conditions for AFTER
      ROW UPDATE triggers could crash if there had been a BEFORE ROW trigger
      fired for the same update.  Fix by not trying to overload the use of
      estate->es_trig_tuple_slot.  Per report from Yoran Heling.
      
      Back-patch to 9.0, when trigger WHEN conditions were introduced.
      b33f78df
  14. Aug 17, 2011
    • Tom Lane's avatar
      Revise sinval code to remove no-longer-used tuple TID from inval messages. · b5282aa8
      Tom Lane authored
      This requires adjusting the API for syscache callback functions: they now
      get a hash value, not a TID, to identify the target tuple.  Most of them
      weren't paying any attention to that argument anyway, but plancache did
      require a small amount of fixing.
      
      Also, improve performance a trifle by avoiding sending duplicate inval
      messages when a heap_update isn't changing the catcache lookup columns.
      b5282aa8
  15. Aug 06, 2011
    • Tom Lane's avatar
      Clean up ill-advised attempt to invent a private set of Node tags. · 05e83968
      Tom Lane authored
      Somebody thought it'd be cute to invent a set of Node tag numbers that were
      defined independently of, and indeed conflicting with, the main tag-number
      list.  While this accidentally failed to fail so far, it would certainly
      lead to trouble as soon as anyone wanted to, say, apply copyObject to these
      node types.  Clang was already complaining about the use of makeNode on
      these tags, and I think quite rightly so.  Fix by pushing these node
      definitions into the mainstream, including putting replnodes.h where it
      belongs.
      05e83968
  16. Aug 05, 2011
  17. Jul 18, 2011
  18. Jul 04, 2011
  19. Jun 30, 2011
    • Alvaro Herrera's avatar
      Enable CHECK constraints to be declared NOT VALID · 89779524
      Alvaro Herrera authored
      This means that they can initially be added to a large existing table
      without checking its initial contents, but new tuples must comply to
      them; a separate pass invoked by ALTER TABLE / VALIDATE can verify
      existing data and ensure it complies with the constraint, at which point
      it is marked validated and becomes a normal part of the table ecosystem.
      
      An non-validated CHECK constraint is ignored in the planner for
      constraint_exclusion purposes; when validated, cached plans are
      recomputed so that partitioning starts working right away.
      
      This patch also enables domains to have unvalidated CHECK constraints
      attached to them as well by way of ALTER DOMAIN / ADD CONSTRAINT / NOT
      VALID, which can later be validated with ALTER DOMAIN / VALIDATE
      CONSTRAINT.
      
      Thanks to Thom Brown, Dean Rasheed and Jaime Casanova for the various
      reviews, and Robert Hass for documentation wording improvement
      suggestions.
      
      This patch was sponsored by Enova Financial.
      89779524
  20. Jun 16, 2011
    • Tom Lane's avatar
      Rework parsing of ConstraintAttributeSpec to improve NOT VALID handling. · e1ccaff6
      Tom Lane authored
      The initial commit of the ALTER TABLE ADD FOREIGN KEY NOT VALID feature
      failed to support labeling such constraints as deferrable.  The best fix
      for this seems to be to fold NOT VALID into ConstraintAttributeSpec.
      That's a bit more general than the documented syntax, but it allows
      better-targeted syntax error messages.
      
      In addition, do some mostly-but-not-entirely-cosmetic code review for
      the whole NOT VALID patch.
      e1ccaff6
  21. Jun 09, 2011
  22. May 21, 2011
    • Heikki Linnakangas's avatar
      Pull up isReset flag from AllocSetContext to MemoryContext struct. This · 30e98a7e
      Heikki Linnakangas authored
      avoids the overhead of one function call when calling MemoryContextReset(),
      and it seems like the isReset optimization would be applicable to any new
      memory context we might invent in the future anyway.
      
      This buys back the overhead I just added in previous patch to always call
      MemoryContextReset() in ExecScan, even when there's no quals or projections.
      30e98a7e
  23. Apr 25, 2011
    • Robert Haas's avatar
      Remove partial and undocumented GRANT .. FOREIGN TABLE support. · be90032e
      Robert Haas authored
      Instead, foreign tables are treated just like views: permissions can
      be granted using GRANT privilege ON [TABLE] foreign_table_name TO role,
      and revoked similarly.  GRANT/REVOKE .. FOREIGN TABLE is no longer
      supported, just as we don't support GRANT/REVOKE .. VIEW.  The set of
      accepted permissions for foreign tables is now identical to the set for
      regular tables, and views.
      
      Per report from Thom Brown, and subsequent discussion.
      be90032e
  24. Apr 24, 2011
    • Tom Lane's avatar
      Improve cost estimation for aggregates and window functions. · e6a30a8c
      Tom Lane authored
      The previous coding failed to account properly for the costs of evaluating
      the input expressions of aggregates and window functions, as seen in a
      recent gripe from Claudio Freire.  (I said at the time that it wasn't
      counting these costs at all; but on closer inspection, it was effectively
      charging these costs once per output tuple.  That is completely wrong for
      aggregates, and not exactly right for window functions either.)
      
      There was also a hard-wired assumption that aggregates and window functions
      had procost 1.0, which is now fixed to respect the actual cataloged costs.
      
      The costing of WindowAgg is still pretty bogus, since it doesn't try to
      estimate the effects of spilling data to disk, but that seems like a
      separate issue.
      e6a30a8c
  25. Apr 21, 2011
    • Robert Haas's avatar
      Allow ALTER TABLE name {OF type | NOT OF}. · 68739ba8
      Robert Haas authored
      This syntax allows a standalone table to be made into a typed table,
      or a typed table to be made standalone.  This is possibly a mildly
      useful feature in its own right, but the real motivation for this
      change is that we need it to make pg_upgrade work with typed tables.
      This doesn't actually fix that problem, but it's necessary
      infrastructure.
      
      Noah Misch
      68739ba8
  26. Apr 18, 2011
    • Tom Lane's avatar
      Fix handling of collations in multi-row VALUES constructs. · 918854cc
      Tom Lane authored
      Per spec we ought to apply select_common_collation() across the expressions
      in each column of the VALUES table.  The original coding was just taking
      the first row and assuming it was representative.
      
      This patch adds a field to struct RangeTblEntry to carry the resolved
      collations, so initdb is forced for changes in stored rule representation.
      918854cc
  27. Apr 13, 2011
    • Tom Lane's avatar
      Pass collations to functions in FunctionCallInfoData, not FmgrInfo. · d64713df
      Tom Lane authored
      Since collation is effectively an argument, not a property of the function,
      FmgrInfo is really the wrong place for it; and this becomes critical in
      cases where a cached FmgrInfo is used for varying purposes that might need
      different collation settings.  Fix by passing it in FunctionCallInfoData
      instead.  In particular this allows a clean fix for bug #5970 (record_cmp
      not working).  This requires touching a bit more code than the original
      method, but nobody ever thought that collations would not be an invasive
      patch...
      d64713df
  28. Apr 10, 2011
  29. Apr 04, 2011
  30. Mar 26, 2011
  31. Mar 23, 2011
  32. Mar 22, 2011
    • Tom Lane's avatar
      Reimplement planner's handling of MIN/MAX aggregate optimization (again). · 8df08c84
      Tom Lane authored
      Instead of playing cute games with pathkeys, just build a direct
      representation of the intended sub-select, and feed it through
      query_planner to get a Path for the index access.  This is a bit slower
      than 9.1's previous method, since we'll duplicate most of the overhead of
      query_planner; but since the whole optimization only applies to rather
      simple single-table queries, that probably won't be much of a problem in
      practice.  The advantage is that we get to do the right thing when there's
      a partial index that needs the implicit IS NOT NULL clause to be usable.
      Also, although this makes planagg.c be a bit more closely tied to the
      ordering of operations in grouping_planner, we can get rid of some coupling
      to lower-level parts of the planner.  Per complaint from Marti Raudsepp.
      8df08c84
  33. Mar 20, 2011
    • Tom Lane's avatar
      Revise collation derivation method and expression-tree representation. · b310b6e3
      Tom Lane authored
      All expression nodes now have an explicit output-collation field, unless
      they are known to only return a noncollatable data type (such as boolean
      or record).  Also, nodes that can invoke collation-aware functions store
      a separate field that is the collation value to pass to the function.
      This avoids confusion that arises when a function has collatable inputs
      and noncollatable output type, or vice versa.
      
      Also, replace the parser's on-the-fly collation assignment method with
      a post-pass over the completed expression tree.  This allows us to use
      a more complex (and hopefully more nearly spec-compliant) assignment
      rule without paying for it in extra storage in every expression node.
      
      Fix assorted bugs in the planner's handling of collations by making
      collation one of the defining properties of an EquivalenceClass and
      by converting CollateExprs into discardable RelabelType nodes during
      expression preprocessing.
      b310b6e3
  34. Mar 11, 2011
    • Tom Lane's avatar
      Split CollateClause into separate raw and analyzed node types. · 8acdb8bf
      Tom Lane authored
      CollateClause is now used only in raw grammar output, and CollateExpr after
      parse analysis.  This is for clarity and to avoid carrying collation names
      in post-analysis parse trees: that's both wasteful and possibly misleading,
      since the collation's name could be changed while the parsetree still
      exists.
      
      Also, clean up assorted infelicities and omissions in processing of the
      node type.
      8acdb8bf
  35. Mar 10, 2011
    • Tom Lane's avatar
      Remove collation information from TypeName, where it does not belong. · a051ef69
      Tom Lane authored
      The initial collations patch treated a COLLATE spec as part of a TypeName,
      following what can only be described as brain fade on the part of the SQL
      committee.  It's a lot more reasonable to treat COLLATE as a syntactically
      separate object, so that it can be added in only the productions where it
      actually belongs, rather than needing to reject it in a boatload of places
      where it doesn't belong (something the original patch mostly failed to do).
      In addition this change lets us meet the spec's requirement to allow
      COLLATE anywhere in the clauses of a ColumnDef, and it avoids unfriendly
      behavior for constructs such as "foo::type COLLATE collation".
      
      To do this, pull collation information out of TypeName and put it in
      ColumnDef instead, thus reverting most of the collation-related changes in
      parse_type.c's API.  I made one additional structural change, which was to
      use a ColumnDef as an intermediate node in AT_AlterColumnType AlterTableCmd
      nodes.  This provides enough room to get rid of the "transform" wart in
      AlterTableCmd too, since the ColumnDef can carry the USING expression
      easily enough.
      
      Also fix some other minor bugs that have crept in in the same areas,
      like failure to copy recently-added fields of ColumnDef in copyfuncs.c.
      
      While at it, document the formerly secret ability to specify a collation
      in ALTER TABLE ALTER COLUMN TYPE, ALTER TYPE ADD ATTRIBUTE, and
      ALTER TYPE ALTER ATTRIBUTE TYPE; and correct some misstatements about
      what the default collation selection will be when COLLATE is omitted.
      
      BTW, the three-parameter form of format_type() should go away too,
      since it just contributes to the confusion in this area; but I'll do
      that in a separate patch.
      a051ef69
  36. Mar 04, 2011
    • Tom Lane's avatar
      Allow non-superusers to create (some) extensions. · 8d3b421f
      Tom Lane authored
      Remove the unconditional superuser permissions check in CREATE EXTENSION,
      and instead define a "superuser" extension property, which when false
      (not the default) skips the superuser permissions check.  In this case
      the calling user only needs enough permissions to execute the commands
      in the extension's installation script.  The superuser property is also
      enforced in the same way for ALTER EXTENSION UPDATE cases.
      
      In other ALTER EXTENSION cases and DROP EXTENSION, test ownership of
      the extension rather than superuserness.  ALTER EXTENSION ADD/DROP needs
      to insist on ownership of the target object as well; to do that without
      duplicating code, refactor comment.c's big switch for permissions checks
      into a separate function in objectaddress.c.
      
      I also removed the superuserness checks in pg_available_extensions and
      related functions; there's no strong reason why everybody shouldn't
      be able to see that info.
      
      Also invent an IF NOT EXISTS variant of CREATE EXTENSION, and use that
      in pg_dump, so that dumps won't fail for installed-by-default extensions.
      We don't have any of those yet, but we will soon.
      
      This is all per discussion of wrapping the standard procedural languages
      into extensions.  I'll make those changes in a separate commit; this is
      just putting the core infrastructure in place.
      8d3b421f
  37. Feb 27, 2011
    • Tom Lane's avatar
      Refactor the executor's API to support data-modifying CTEs better. · a874fe7b
      Tom Lane authored
      The originally committed patch for modifying CTEs didn't interact well
      with EXPLAIN, as noted by myself, and also had corner-case problems with
      triggers, as noted by Dean Rasheed.  Those problems show it is really not
      practical for ExecutorEnd to call any user-defined code; so split the
      cleanup duties out into a new function ExecutorFinish, which must be called
      between the last ExecutorRun call and ExecutorEnd.  Some Asserts have been
      added to these functions to help verify correct usage.
      
      It is no longer necessary for callers of the executor to call
      AfterTriggerBeginQuery/AfterTriggerEndQuery for themselves, as this is now
      done by ExecutorStart/ExecutorFinish respectively.  If you really need to
      suppress that and do it for yourself, pass EXEC_FLAG_SKIP_TRIGGERS to
      ExecutorStart.
      
      Also, refactor portal commit processing to allow for the possibility that
      PortalDrop will invoke user-defined code.  I think this is not actually
      necessary just yet, since the portal-execution-strategy logic forces any
      non-pure-SELECT query to be run to completion before we will consider
      committing.  But it seems like good future-proofing.
      a874fe7b
  38. Feb 26, 2011
    • Tom Lane's avatar
      Support data-modifying commands (INSERT/UPDATE/DELETE) in WITH. · 389af951
      Tom Lane authored
      This patch implements data-modifying WITH queries according to the
      semantics that the updates all happen with the same command counter value,
      and in an unspecified order.  Therefore one WITH clause can't see the
      effects of another, nor can the outer query see the effects other than
      through the RETURNING values.  And attempts to do conflicting updates will
      have unpredictable results.  We'll need to document all that.
      
      This commit just fixes the code; documentation updates are waiting on
      author.
      
      Marko Tiikkaja and Hitoshi Harada
      389af951
Loading