1. 07 6月, 2011 1 次提交
    • T
      Fix rewriter to cope (more or less) with CTEs in the query being rewritten. · fc1286d3
      Tom Lane 提交于
      Since the original implementation of CTEs only allowed them in SELECT
      queries, the rule rewriter did not expect to find any CTEs in statements
      being rewritten by ON INSERT/UPDATE/DELETE rules.  We had dealt with this
      to some extent but the code was still several bricks shy of a load, as
      illustrated in bug #6051 from Jehan-Guillaume de Rorthais.
      
      In particular, we have to be able to copy CTEs from the original query's
      cteList into that of a rule action, in case the rule action references the
      CTE (which it pretty much always will).  This also implies we were doing
      things in the wrong order in RewriteQuery: we have to recursively rewrite
      the CTE queries before expanding the main query, so that we have the
      rewritten queries available to copy.
      
      There are unpleasant limitations yet to resolve here, but at least we now
      throw understandable FEATURE_NOT_SUPPORTED errors for them instead of just
      failing with bizarre implementation-dependent errors.  In particular, we
      can't handle propagating the same CTE into multiple post-rewrite queries
      (because then the CTE would be evaluated multiple times), and we can't cope
      with conflicts between CTE names in the original query and in the rule
      actions.
      fc1286d3
  2. 12 4月, 2011 1 次提交
  3. 10 4月, 2011 1 次提交
  4. 26 3月, 2011 1 次提交
    • T
      Pass collation to makeConst() instead of looking it up internally. · bfa4440c
      Tom Lane 提交于
      In nearly all cases, the caller already knows the correct collation, and
      in a number of places, the value the caller has handy is more correct than
      the default for the type would be.  (In particular, this patch makes it
      significantly less likely that eval_const_expressions will result in
      changing the exposed collation of an expression.)  So an internal lookup
      is both expensive and wrong.
      bfa4440c
  5. 26 2月, 2011 1 次提交
    • T
      Support data-modifying commands (INSERT/UPDATE/DELETE) in WITH. · 389af951
      Tom Lane 提交于
      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
  6. 23 2月, 2011 1 次提交
    • T
      Add a relkind field to RangeTblEntry to avoid some syscache lookups. · bdca82f4
      Tom Lane 提交于
      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
  7. 20 2月, 2011 1 次提交
  8. 09 2月, 2011 2 次提交
    • T
      Core support for "extensions", which are packages of SQL objects. · d9572c4e
      Tom Lane 提交于
      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
    • P
      Per-column collation support · 414c5a2e
      Peter Eisentraut 提交于
      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
  9. 02 1月, 2011 1 次提交
  10. 26 11月, 2010 1 次提交
    • R
      Object access hook framework, with post-creation hook. · cc1ed40d
      Robert Haas 提交于
      After a SQL object is created, we provide an opportunity for security
      or logging plugins to get control; for example, a security label provider
      could use this to assign an initial security label to newly created
      objects.  The basic infrastructure is (hopefully) reusable for other types
      of events that might require similar treatment.
      
      KaiGai Kohei, with minor adjustments.
      cc1ed40d
  11. 05 11月, 2010 1 次提交
    • T
      Reimplement planner's handling of MIN/MAX aggregate optimization. · 034967bd
      Tom Lane 提交于
      Per my recent proposal, get rid of all the direct inspection of indexes
      and manual generation of paths in planagg.c.  Instead, set up
      EquivalenceClasses for the aggregate argument expressions, and let the
      regular path generation logic deal with creating paths that can satisfy
      those sort orders.  This makes planagg.c a bit more visible to the rest
      of the planner than it was originally, but the approach is basically a lot
      cleaner than before.  A major advantage of doing it this way is that we get
      MIN/MAX optimization on inheritance trees (using MergeAppend of indexscans)
      practically for free, whereas in the old way we'd have had to add a whole
      lot more duplicative logic.
      
      One small disadvantage of this approach is that MIN/MAX aggregates can no
      longer exploit partial indexes having an "x IS NOT NULL" predicate, unless
      that restriction or something that implies it is specified in the query.
      The previous implementation was able to use the added "x IS NOT NULL"
      condition as an extra predicate proof condition, but in this version we
      rely entirely on indexes that are considered usable by the main planning
      process.  That seems a fair tradeoff for the simplicity and functionality
      gained.
      034967bd
  12. 20 10月, 2010 1 次提交
    • T
      Fix incorrect generation of whole-row variables in planner. · 6e74a91b
      Tom Lane 提交于
      A couple of places in the planner need to generate whole-row Vars, and were
      cutting corners by setting vartype = RECORDOID in the Vars, even in cases
      where there's an identifiable named composite type for the RTE being
      referenced.  While we mostly got away with this, it failed when there was
      also a parser-generated whole-row reference to the same RTE, because the
      two Vars weren't equal() due to the difference in vartype.  Fix by
      providing a subroutine the planner can call to generate whole-row Vars
      the same way the parser does.
      
      Per bug #5716 from Andrew Tipton.  Back-patch to 9.0 where one of the bogus
      calls was introduced (the other one is new in HEAD).
      6e74a91b
  13. 11 10月, 2010 1 次提交
    • T
      Support triggers on views. · 2ec993a7
      Tom Lane 提交于
      This patch adds the SQL-standard concept of an INSTEAD OF trigger, which
      is fired instead of performing a physical insert/update/delete.  The
      trigger function is passed the entire old and/or new rows of the view,
      and must figure out what to do to the underlying tables to implement
      the update.  So this feature can be used to implement updatable views
      using trigger programming style rather than rule hacking.
      
      In passing, this patch corrects the names of some columns in the
      information_schema.triggers view.  It seems the SQL committee renamed
      them somewhere between SQL:99 and SQL:2003.
      
      Dean Rasheed, reviewed by Bernd Helmle; some additional hacking by me.
      2ec993a7
  14. 21 9月, 2010 1 次提交
  15. 05 8月, 2010 1 次提交
    • R
      Standardize get_whatever_oid functions for other object types. · fd1843ff
      Robert Haas 提交于
      - Rename TSParserGetPrsid to get_ts_parser_oid.
      - Rename TSDictionaryGetDictid to get_ts_dict_oid.
      - Rename TSTemplateGetTmplid to get_ts_template_oid.
      - Rename TSConfigGetCfgid to get_ts_config_oid.
      - Rename FindConversionByName to get_conversion_oid.
      - Rename GetConstraintName to get_constraint_oid.
      - Add new functions get_opclass_oid, get_opfamily_oid, get_rewrite_oid,
        get_rewrite_oid_without_relid, get_trigger_oid, and get_cast_oid.
      
      The name of each function matches the corresponding catalog.
      
      Thanks to KaiGai Kohei for the review.
      fd1843ff
  16. 28 7月, 2010 1 次提交
    • S
      Reduce lock levels of CREATE TRIGGER and some ALTER TABLE, CREATE RULE actions. · 2dbbda02
      Simon Riggs 提交于
      Avoid hard-coding lockmode used for many altering DDL commands, allowing easier
      future changes of lock levels. Implementation of initial analysis on DDL
      sub-commands, so that many lock levels are now at ShareUpdateExclusiveLock or
      ShareRowExclusiveLock, allowing certain DDL not to block reads/writes.
      First of number of planned changes in this area; additional docs required
      when full project complete.
      2dbbda02
  17. 26 2月, 2010 1 次提交
  18. 15 2月, 2010 1 次提交
    • R
      Wrap calls to SearchSysCache and related functions using macros. · e26c539e
      Robert Haas 提交于
      The purpose of this change is to eliminate the need for every caller
      of SearchSysCache, SearchSysCacheCopy, SearchSysCacheExists,
      GetSysCacheOid, and SearchSysCacheList to know the maximum number
      of allowable keys for a syscache entry (currently 4).  This will
      make it far easier to increase the maximum number of keys in a
      future release should we choose to do so, and it makes the code
      shorter, too.
      
      Design and review by Tom Lane.
      e26c539e
  19. 03 1月, 2010 1 次提交
  20. 06 11月, 2009 1 次提交
  21. 29 10月, 2009 1 次提交
  22. 28 10月, 2009 2 次提交
    • T
      When FOR UPDATE/SHARE is used with LIMIT, put the LockRows plan node · 46e3a16b
      Tom Lane 提交于
      underneath the Limit node, not atop it.  This fixes the old problem that such
      a query might unexpectedly return fewer rows than the LIMIT says, due to
      LockRows discarding updated rows.
      
      There is a related problem that LockRows might destroy the sort ordering
      produced by earlier steps; but fixing that by pushing LockRows below Sort
      would create serious performance problems that are unjustified in many
      real-world applications, as well as potential deadlock problems from locking
      many more rows than expected.  Instead, keep the present semantics of applying
      FOR UPDATE after ORDER BY within a single query level; but allow the user to
      specify the other way by writing FOR UPDATE in a sub-select.  To make that
      work, track whether FOR UPDATE appeared explicitly in sub-selects or got
      pushed down from the parent, and don't flatten a sub-select that contained an
      explicit FOR UPDATE.
      46e3a16b
    • T
      Make FOR UPDATE/SHARE in the primary query not propagate into WITH queries; · 61e53282
      Tom Lane 提交于
      for example in
        WITH w AS (SELECT * FROM foo) SELECT * FROM w, bar ... FOR UPDATE
      the FOR UPDATE will now affect bar but not foo.  This is more useful and
      consistent than the original 8.4 behavior, which tried to propagate FOR UPDATE
      into the WITH query but always failed due to assorted implementation
      restrictions.  Even though we are in process of removing those restrictions,
      it seems correct on philosophical grounds to not let the outer query's
      FOR UPDATE affect the WITH query.
      
      In passing, fix isLockedRel which frequently got things wrong in
      nested-subquery cases: "FOR UPDATE OF foo" applies to an alias foo in the
      current query level, not subqueries.  This has been broken for a long time,
      but it doesn't seem worth back-patching further than 8.4 because the actual
      consequences are minimal.  At worst the parser would sometimes get
      RowShareLock on a relation when it should be AccessShareLock or vice versa.
      That would only make a difference if someone were using ExclusiveLock
      concurrently, which no standard operation does, and anyway FOR UPDATE
      doesn't result in visible changes so it's not clear that the someone would
      notice any problem.  Between that and the fact that FOR UPDATE barely works
      with subqueries at all in existing releases, I'm not excited about worrying
      about it.
      61e53282
  23. 26 10月, 2009 1 次提交
    • T
      Re-implement EvalPlanQual processing to improve its performance and eliminate · 9f2ee8f2
      Tom Lane 提交于
      a lot of strange behaviors that occurred in join cases.  We now identify the
      "current" row for every joined relation in UPDATE, DELETE, and SELECT FOR
      UPDATE/SHARE queries.  If an EvalPlanQual recheck is necessary, we jam the
      appropriate row into each scan node in the rechecking plan, forcing it to emit
      only that one row.  The former behavior could rescan the whole of each joined
      relation for each recheck, which was terrible for performance, and what's much
      worse could result in duplicated output tuples.
      
      Also, the original implementation of EvalPlanQual could not re-use the recheck
      execution tree --- it had to go through a full executor init and shutdown for
      every row to be tested.  To avoid this overhead, I've associated a special
      runtime Param with each LockRows or ModifyTable plan node, and arranged to
      make every scan node below such a node depend on that Param.  Thus, by
      signaling a change in that Param, the EPQ machinery can just rescan the
      already-built test plan.
      
      This patch also adds a prohibition on set-returning functions in the
      targetlist of SELECT FOR UPDATE/SHARE.  This is needed to avoid the
      duplicate-output-tuple problem.  It seems fairly reasonable since the
      other restrictions on SELECT FOR UPDATE are meant to ensure that there
      is a unique correspondence between source tuples and result tuples,
      which an output SRF destroys as much as anything else does.
      9f2ee8f2
  24. 03 9月, 2009 1 次提交
    • T
      Fix subquery pullup to wrap a PlaceHolderVar around the entire RowExpr · 57c9dff9
      Tom Lane 提交于
      that's generated for a whole-row Var referencing the subquery, when the
      subquery is in the nullable side of an outer join.  The previous coding
      instead put PlaceHolderVars around the elements of the RowExpr.  The effect
      was that when the outer join made the subquery outputs go to null, the
      whole-row Var produced ROW(NULL,NULL,...) rather than just NULL.  There
      are arguments afoot about whether those things ought to be semantically
      indistinguishable, but for the moment they are not entirely so, and the
      planner needs to take care that its machinations preserve the difference.
      Per bug #5025.
      
      Making this feasible required refactoring ResolveNew() to allow more caller
      control over what is substituted for a Var.  I chose to make ResolveNew()
      a wrapper around a new general-purpose function replace_rte_variables().
      I also fixed the ancient bogosity that ResolveNew might fail to set
      a query's hasSubLinks field after inserting a SubLink in it.  Although
      all current callers make sure that happens anyway, we've had bugs of that
      sort before, and it seemed like a good time to install a proper solution.
      
      Back-patch to 8.4.  The problem can be demonstrated clear back to 8.0,
      but the fix would be too invasive in earlier branches; not to mention
      that people may be depending on the subtly-incorrect behavior.  The
      8.4 series is new enough that fixing this probably won't cause complaints,
      but it might in older branches.  Also, 8.4 shows the incorrect behavior
      in more cases than older branches do, because it is able to flatten
      subqueries in more cases.
      57c9dff9
  25. 11 6月, 2009 1 次提交
  26. 14 5月, 2009 1 次提交
  27. 25 2月, 2009 1 次提交
    • T
      Get rid of the rather fuzzily defined FlattenedSubLink node type in favor of · e549722a
      Tom Lane 提交于
      making pull_up_sublinks() construct a full-blown JoinExpr tree representation
      of IN/EXISTS SubLinks that it is able to convert to semi or anti joins.
      This makes pull_up_sublinks() a shade more complex, but the gain in semantic
      clarity is worth it.  I still have more to do in this area to address the
      previously-discussed problems, but this commit in itself fixes at least one
      bug in HEAD, as shown by added regression test case.
      e549722a
  28. 27 1月, 2009 1 次提交
  29. 23 1月, 2009 2 次提交
  30. 02 1月, 2009 1 次提交
  31. 29 12月, 2008 1 次提交
  32. 19 11月, 2008 1 次提交
    • H
      Rethink the way FSM truncation works. Instead of WAL-logging FSM · 33960006
      Heikki Linnakangas 提交于
      truncations in FSM code, call FreeSpaceMapTruncateRel from smgr_redo. To
      make that cleaner from modularity point of view, move the WAL-logging one
      level up to RelationTruncate, and move RelationTruncate and all the
      related WAL-logging to new src/backend/catalog/storage.c file. Introduce
      new RelationCreateStorage and RelationDropStorage functions that are used
      instead of calling smgrcreate/smgrscheduleunlink directly. Move the
      pending rel deletion stuff from smgrcreate/smgrscheduleunlink to the new
      functions. This leaves smgr.c as a thin wrapper around md.c; all the
      transactional stuff is now in storage.c.
      
      This will make it easier to add new forks with similar truncation logic,
      like the visibility map.
      33960006
  33. 16 11月, 2008 1 次提交
    • T
      Make SELECT FOR UPDATE/SHARE work on inheritance trees, by having the plan · 0656ed3d
      Tom Lane 提交于
      return the tableoid as well as the ctid for any FOR UPDATE targets that
      have child tables.  All child tables are listed in the ExecRowMark list,
      but the executor just skips the ones that didn't produce the current row.
      
      Curiously, this longstanding restriction doesn't seem to have been documented
      anywhere; so no doc changes.
      0656ed3d
  34. 10 11月, 2008 2 次提交
  35. 02 11月, 2008 1 次提交
    • T
      Remove all uses of the deprecated functions heap_formtuple, heap_modifytuple, · 902d1cb3
      Tom Lane 提交于
      and heap_deformtuple in favor of the newer functions heap_form_tuple et al
      (which do the same things but use bool control flags instead of arbitrary
      char values).  Eliminate the former duplicate coding of these functions,
      reducing the deprecated functions to mere wrappers around the newer ones.
      We can't get rid of them entirely because add-on modules probably still
      contain many instances of the old coding style.
      
      Kris Jurka
      902d1cb3
  36. 23 10月, 2008 1 次提交
    • T
      Dept of better ideas: refrain from creating the planner's placeholder_list · 31468d05
      Tom Lane 提交于
      until vars are distributed to rels during query_planner() startup.  We don't
      really need it before that, and not building it early has some advantages.
      First, we don't need to put it through the various preprocessing steps, which
      saves some cycles and eliminates the need for a number of routines to support
      PlaceHolderInfo nodes at all.  Second, this means one less unused plan for any
      sub-SELECT appearing in a placeholder's expression, since we don't build
      placeholder_list until after sublink expansion is complete.
      31468d05