Skip to content
Snippets Groups Projects
  1. 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
  2. Jun 09, 2011
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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
  9. Apr 10, 2011
  10. Apr 04, 2011
  11. Mar 26, 2011
  12. Mar 23, 2011
  13. 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
  14. 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
  15. 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
  16. 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
  17. 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
  18. 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
  19. 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
  20. Feb 23, 2011
    • Tom Lane's avatar
      Add a relkind field to RangeTblEntry to avoid some syscache lookups. · bdca82f4
      Tom Lane authored
      The recent additions for FDW support required checking foreign-table-ness
      in several places in the parse/plan chain.  While it's not clear whether
      that would really result in a noticeable slowdown, it seems best to avoid
      any performance risk by keeping a copy of the relation's relkind in
      RangeTblEntry.  That might have some other uses later, anyway.
      Per discussion.
      bdca82f4
  21. Feb 20, 2011
  22. Feb 19, 2011
    • Tom Lane's avatar
      Create the catalog infrastructure for foreign-data-wrapper handlers. · 327e0250
      Tom Lane authored
      Add a fdwhandler column to pg_foreign_data_wrapper, plus HANDLER options
      in the CREATE FOREIGN DATA WRAPPER and ALTER FOREIGN DATA WRAPPER commands,
      plus pg_dump support for same.  Also invent a new pseudotype fdw_handler
      with properties similar to language_handler.
      
      This is split out of the "FDW API" patch for ease of review; it's all stuff
      we will certainly need, regardless of any other details of the FDW API.
      FDW handler functions will not actually get called yet.
      
      In passing, fix some omissions and infelicities in foreigncmds.c.
      
      Shigeru Hanada, Jan Urbanski, Heikki Linnakangas
      327e0250
  23. Feb 17, 2011
    • Tom Lane's avatar
      Fix bogus test for hypothetical indexes in get_actual_variable_range(). · a2095f7f
      Tom Lane authored
      That function was supposing that indexoid == 0 for a hypothetical index,
      but that is not likely to be true in any non-toy implementation of an index
      adviser, since assigning a fake OID is the only way to know at EXPLAIN time
      which hypothetical index got selected.  Fix by adding a flag to
      IndexOptInfo to mark hypothetical indexes.  Back-patch to 9.0 where
      get_actual_variable_range() was added.
      
      Gurjeet Singh
      a2095f7f
  24. Feb 12, 2011
    • Peter Eisentraut's avatar
      DDL support for collations · b313bca0
      Peter Eisentraut authored
      - collowner field
      - CREATE COLLATION
      - ALTER COLLATION
      - DROP COLLATION
      - COMMENT ON COLLATION
      - integration with extensions
      - pg_dump support for the above
      - dependency management
      - psql tab completion
      - psql \dO command
      b313bca0
    • Tom Lane's avatar
      Add support for multiple versions of an extension and ALTER EXTENSION UPDATE. · 12147499
      Tom Lane authored
      This follows recent discussions, so it's quite a bit different from
      Dimitri's original.  There will probably be more changes once we get a bit
      of experience with it, but let's get it in and start playing with it.
      
      This is still just core code.  I'll start converting contrib modules
      shortly.
      
      Dimitri Fontaine and Tom Lane
      12147499
  25. Feb 10, 2011
    • Tom Lane's avatar
      Extend "ALTER EXTENSION ADD object" to permit "DROP object" as well. · 01467d3e
      Tom Lane authored
      Per discussion, this is something we should have sooner rather than later,
      and it doesn't take much additional code to support it.
      01467d3e
    • Tom Lane's avatar
      Fix improper matching of resjunk column names for FOR UPDATE in subselect. · e617f0d7
      Tom Lane authored
      Flattening of subquery range tables during setrefs.c could lead to the
      rangetable indexes in PlanRowMark nodes not matching up with the column
      names previously assigned to the corresponding resjunk ctid (resp. tableoid
      or wholerow) columns.  Typical symptom would be either a "cannot extract
      system attribute from virtual tuple" error or an Assert failure.  This
      wasn't a problem before 9.0 because we didn't support FOR UPDATE below the
      top query level, and so the final flattening could never renumber an RTE
      that was relevant to FOR UPDATE.  Fix by using a plan-tree-wide unique
      number for each PlanRowMark to label the associated resjunk columns, so
      that the number need not change during flattening.
      
      Per report from David Johnston (though I'm darned if I can see how this got
      past initial testing of the relevant code).  Back-patch to 9.0.
      e617f0d7
  26. Feb 09, 2011
    • Tom Lane's avatar
      Implement "ALTER EXTENSION ADD object". · 5bc178b8
      Tom Lane authored
      This is an essential component of making the extension feature usable;
      first because it's needed in the process of converting an existing
      installation containing "loose" objects of an old contrib module into
      the extension-based world, and second because we'll have to use it
      in pg_dump --binary-upgrade, as per recent discussion.
      
      Loosely based on part of Dimitri Fontaine's ALTER EXTENSION UPGRADE
      patch.
      5bc178b8
  27. Feb 08, 2011
    • Tom Lane's avatar
      Core support for "extensions", which are packages of SQL objects. · d9572c4e
      Tom Lane authored
      This patch adds the server infrastructure to support extensions.
      There is still one significant loose end, namely how to make it play nice
      with pg_upgrade, so I am not yet committing the changes that would make
      all the contrib modules depend on this feature.
      
      In passing, fix a disturbingly large amount of breakage in
      AlterObjectNamespace() and callers.
      
      Dimitri Fontaine, reviewed by Anssi Kääriäinen,
      Itagaki Takahiro, Tom Lane, and numerous others
      d9572c4e
    • Peter Eisentraut's avatar
      Per-column collation support · 414c5a2e
      Peter Eisentraut authored
      This adds collation support for columns and domains, a COLLATE clause
      to override it per expression, and B-tree index support.
      
      Peter Eisentraut
      reviewed by Pavel Stehule, Itagaki Takahiro, Robert Haas, Noah Misch
      414c5a2e
    • Simon Riggs's avatar
      Extend ALTER TABLE to allow Foreign Keys to be added without initial validation. · 722bf701
      Simon Riggs authored
      FK constraints that are marked NOT VALID may later be VALIDATED, which uses an
      ShareUpdateExclusiveLock on constraint table and RowShareLock on referenced
      table. Significantly reduces lock strength and duration when adding FKs.
      New state visible from psql.
      
      Simon Riggs, with reviews from Marko Tiikkaja and Robert Haas
      722bf701
    • Robert Haas's avatar
      Avoid having autovacuum workers wait for relation locks. · 32896c40
      Robert Haas authored
      Waiting for relation locks can lead to starvation - it pins down an
      autovacuum worker for as long as the lock is held.  But if we're doing
      an anti-wraparound vacuum, then we still wait; maintenance can no longer
      be put off.
      
      To assist with troubleshooting, if log_autovacuum_min_duration >= 0,
      we log whenever an autovacuum or autoanalyze is skipped for this reason.
      
      Per a gripe by Josh Berkus, and ensuing discussion.
      32896c40
  28. Jan 25, 2011
    • Tom Lane's avatar
      Implement ALTER TABLE ADD UNIQUE/PRIMARY KEY USING INDEX. · 88452d5b
      Tom Lane authored
      This feature allows a unique or pkey constraint to be created using an
      already-existing unique index.  While the constraint isn't very
      functionally different from the bare index, it's nice to be able to do that
      for documentation purposes.  The main advantage over just issuing a plain
      ALTER TABLE ADD UNIQUE/PRIMARY KEY is that the index can be created with
      CREATE INDEX CONCURRENTLY, so that there is not a long interval where the
      table is locked against updates.
      
      On the way, refactor some of the code in DefineIndex() and index_create()
      so that we don't have to pass through those functions in order to create
      the index constraint's catalog entries.  Also, in parse_utilcmd.c, pass
      around the ParseState pointer in struct CreateStmtContext to save on
      notation, and add error location pointers to some error reports that didn't
      have one before.
      
      Gurjeet Singh, reviewed by Steve Singer and Tom Lane
      88452d5b
  29. Jan 13, 2011
    • Tom Lane's avatar
      Fix PlanRowMark/ExecRowMark structures to handle inheritance correctly. · d487afbb
      Tom Lane authored
      In an inherited UPDATE/DELETE, each target table has its own subplan,
      because it might have a column set different from other targets.  This
      means that the resjunk columns we add to support EvalPlanQual might be
      at different physical column numbers in each subplan.  The EvalPlanQual
      rewrite I did for 9.0 failed to account for this, resulting in possible
      misbehavior or even crashes during concurrent updates to the same row,
      as seen in a recent report from Gordon Shannon.  Revise the data structure
      so that we track resjunk column numbers separately for each subplan.
      
      I also chose to move responsibility for identifying the physical column
      numbers back to executor startup, instead of assuming that numbers derived
      during preprocess_targetlist would stay valid throughout subsequent
      massaging of the plan.  That's a bit slower, so we might want to consider
      undoing it someday; but it would complicate the patch considerably and
      didn't seem justifiable in a bug fix that has to be back-patched to 9.0.
      d487afbb
  30. Jan 02, 2011
    • Robert Haas's avatar
      Basic foreign table support. · 0d692a0d
      Robert Haas authored
      Foreign tables are a core component of SQL/MED.  This commit does
      not provide a working SQL/MED infrastructure, because foreign tables
      cannot yet be queried.  Support for foreign table scans will need to
      be added in a future patch.  However, this patch creates the necessary
      system catalog structure, syntax support, and support for ancillary
      operations such as COMMENT and SECURITY LABEL.
      
      Shigeru Hanada, heavily revised by Robert Haas
      0d692a0d
  31. Jan 01, 2011
  32. Dec 31, 2010
    • Tom Lane's avatar
      Move symbols for ExecMergeJoin's state machine into nodeMergejoin.c. · 7b464015
      Tom Lane authored
      There's no reason for these values to be known anywhere else.  After
      doing this, executor/execdefs.h is vestigial and can be removed.
      7b464015
    • Tom Lane's avatar
      Support RIGHT and FULL OUTER JOIN in hash joins. · f4e4b327
      Tom Lane authored
      This is advantageous first because it allows us to hash the smaller table
      regardless of the outer-join type, and second because hash join can be more
      flexible than merge join in dealing with arbitrary join quals in a FULL
      join.  For merge join all the join quals have to be mergejoinable, but hash
      join will work so long as there's at least one hashjoinable qual --- the
      others can be any condition.  (This is true essentially because we don't
      keep per-inner-tuple match flags in merge join, while hash join can do so.)
      
      To do this, we need a has-it-been-matched flag for each tuple in the
      hashtable, not just one for the current outer tuple.  The key idea that
      makes this practical is that we can store the match flag in the tuple's
      infomask, since there are lots of bits there that are of no interest for a
      MinimalTuple.  So we aren't increasing the size of the hashtable at all for
      the feature.
      
      To write this without turning the hash code into even more of a pile of
      spaghetti than it already was, I rewrote ExecHashJoin in a state-machine
      style, similar to ExecMergeJoin.  Other than that decision, it was pretty
      straightforward.
      f4e4b327
  33. Dec 13, 2010
    • Robert Haas's avatar
      Generalize concept of temporary relations to "relation persistence". · 5f7b58fa
      Robert Haas authored
      This commit replaces pg_class.relistemp with pg_class.relpersistence;
      and also modifies the RangeVar node type to carry relpersistence rather
      than istemp.  It also removes removes rd_istemp from RelationData and
      instead performs the correct computation based on relpersistence.
      
      For clarity, we add three new macros: RelationNeedsWAL(),
      RelationUsesLocalBuffers(), and RelationUsesTempNamespace(), so that we
      can clarify the purpose of each check that previous depended on
      rd_istemp.
      
      This is intended as infrastructure for the upcoming unlogged tables
      patch, as well as for future possible work on global temporary tables.
      5f7b58fa
Loading