1. 06 Nov, 2009 2 commits
    • Andrew Dunstan's avatar
      Keep track of language's trusted flag in InlineCodeBlock. Needed to support DO... · b79f49c7
      Andrew Dunstan authored
      Keep track of language's trusted flag in InlineCodeBlock. Needed to support DO blocks for languages that have both trusted and untrusted variants.
      b79f49c7
    • Tom Lane's avatar
      Change plpgsql from using textual substitution to insert variable references · 0772f1e5
      Tom Lane authored
      into SQL expressions, to using the newly added parser callback hooks.
      
      This allows us to do the substitutions in a more semantically-aware way:
      a variable reference will only be recognized where it can validly go,
      ie, a place where a column value or parameter would be legal, instead of
      the former behavior that would replace any textual match including
      table names and column aliases (leading to syntax errors later on).
      A release-note-worthy fine point is that plpgsql variable names that match
      fully-reserved words will now need to be quoted.
      
      This commit preserves the former behavior that variable references take
      precedence over any possible match to a column name.  The infrastructure
      is in place to support the reverse precedence or throwing an error on
      ambiguity, but those behaviors aren't accessible yet.
      
      Most of the code changes here are associated with making the namespace
      data structure persist so that it can be consulted at runtime, instead
      of throwing it away at the end of initial function parsing.
      
      The plpgsql scanner is still doing name lookups, but that behavior is
      now irrelevant for SQL expressions.  A future commit will deal with
      removing unnecessary lookups.
      0772f1e5
  2. 05 Nov, 2009 4 commits
  3. 04 Nov, 2009 5 commits
  4. 03 Nov, 2009 5 commits
  5. 01 Nov, 2009 2 commits
    • Tom Lane's avatar
      Dept of second thoughts: after studying index_getnext() a bit more I realize · 7d535ebe
      Tom Lane authored
      that it can scribble on scan->xs_ctup.t_self while following HOT chains,
      so we can't rely on that to stay valid between hashgettuple() calls.
      Introduce a private variable in HashScanOpaque, instead.
      7d535ebe
    • Tom Lane's avatar
      Fix two serious bugs introduced into hash indexes by the 8.4 patch that made · c4afdca4
      Tom Lane authored
      hash indexes keep entries sorted by hash value.  First, the original plans for
      concurrency assumed that insertions would happen only at the end of a page,
      which is no longer true; this could cause scans to transiently fail to find
      index entries in the presence of concurrent insertions.  We can compensate
      by teaching scans to re-find their position after re-acquiring read locks.
      Second, neither the bucket split nor the bucket compaction logic had been
      fixed to preserve hashvalue ordering, so application of either of those
      processes could lead to permanent corruption of an index, in the sense
      that searches might fail to find entries that are present.
      
      This patch fixes the split and compaction logic to preserve hashvalue
      ordering, but it cannot do anything about pre-existing corruption.  We will
      need to recommend reindexing all hash indexes in the 8.4.2 release notes.
      
      To buy back the performance loss hereby induced in split and compaction,
      fix them to use PageIndexMultiDelete instead of retail PageIndexDelete
      operations.  We might later want to do something with qsort'ing the
      page contents rather than doing a binary search for each insertion,
      but that seemed more invasive than I cared to risk in a back-patch.
      
      Per bug #5157 from Jeff Janes and subsequent investigation.
      c4afdca4
  6. 31 Oct, 2009 2 commits
    • Tom Lane's avatar
      Ensure the previous Perl interpreter selection is restored upon exit from · ef59fa04
      Tom Lane authored
      plperl_call_handler, in both the normal and error-exit paths.  Per report
      from Alexey Klyukin.
      ef59fa04
    • Tom Lane's avatar
      Implement parser hooks for processing ColumnRef and ParamRef nodes, as per my · fb5d0580
      Tom Lane authored
      recent proposal.  As proof of concept, remove knowledge of Params from the
      core parser, arranging for them to be handled entirely by parser hook
      functions.  It turns out we need an additional hook for that --- I had
      forgotten about the code that handles inferring a parameter's type from
      context.
      
      This is a preliminary step towards letting plpgsql handle its variables
      through parser hooks.  Additional work remains to be done to expose the
      facility through SPI, but I think this is all the changes needed in the core
      parser.
      fb5d0580
  7. 30 Oct, 2009 1 commit
    • Tom Lane's avatar
      Make the overflow guards in ExecChooseHashTableSize be more protective. · 8442317b
      Tom Lane authored
      The original coding ensured nbuckets and nbatch didn't exceed INT_MAX,
      which while not insane on its own terms did nothing to protect subsequent
      code like "palloc(nbatch * sizeof(BufFile *))".  Since enormous join size
      estimates might well be planner error rather than reality, it seems best
      to constrain the initial sizes to be not more than work_mem/sizeof(pointer),
      thus ensuring the allocated arrays don't exceed work_mem.  We will allow
      nbatch to get bigger than that during subsequent ExecHashIncreaseNumBatches
      calls, but we should still guard against integer overflow in those palloc
      requests.  Per bug #5145 from Bernt Marius Johnsen.
      
      Although the given test case only seems to fail back to 8.2, previous
      releases have variants of this issue, so patch all supported branches.
      8442317b
  8. 29 Oct, 2009 1 commit
  9. 28 Oct, 2009 4 commits
  10. 27 Oct, 2009 3 commits
    • Tom Lane's avatar
      Fix AfterTriggerSaveEvent to use a test and elog, not just Assert, to check · 44956c52
      Tom Lane authored
      that it's called within an AfterTriggerBeginQuery/AfterTriggerEndQuery pair.
      The RI cascade triggers suppress that overhead on the assumption that they
      are always run non-deferred, so it's possible to violate the condition if
      someone mistakenly changes pg_trigger to mark such a trigger deferred.
      We don't really care about supporting that, but throwing an error instead
      of crashing seems desirable.  Per report from Marcelo Costa.
      44956c52
    • Tom Lane's avatar
      Make FOR UPDATE/SHARE in the primary query not propagate into WITH queries; · 61e53282
      Tom Lane authored
      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
    • Alvaro Herrera's avatar
      Fix documentation on the toast.fillfactor reloption: it doesn't exist. · b091b976
      Alvaro Herrera authored
      Per note from Zoltan Boszormenyi.
      b091b976
  11. 26 Oct, 2009 4 commits
    • Peter Eisentraut's avatar
      f1c52475
    • Peter Eisentraut's avatar
      Check errors in for loop · 3ceae479
      Peter Eisentraut authored
      3ceae479
    • Heikki Linnakangas's avatar
      Fix range check in date_recv that tried to limit accepted values to only · 2078e384
      Heikki Linnakangas authored
      those accepted by date_in(). I confused julian day numbers and number of
      days since the postgres epoch 2000-01-01 in the original patch.
      
      I just noticed that it's still easy to get such out-of-range values into
      the database using to_date or +- operators, but this patch doesn't do
      anything about those functions.
      
      Per report from James Pye.
      2078e384
    • Tom Lane's avatar
      Re-implement EvalPlanQual processing to improve its performance and eliminate · 9f2ee8f2
      Tom Lane authored
      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
  12. 23 Oct, 2009 1 commit
  13. 21 Oct, 2009 3 commits
  14. 20 Oct, 2009 3 commits