aboutsummaryrefslogtreecommitdiff
path: root/src/backend/optimizer
Commit message (Collapse)AuthorAge
* Further sort-order twiddling in optimizer: be smart aboutTom Lane1999-08-22
| | | | case where ORDER BY and GROUP BY request the same sort order.
* Further planner/optimizer cleanups. Move all set_tlist_referencesTom Lane1999-08-22
| | | | | | | | | | and fix_opids processing to a single recursive pass over the plan tree executed at the very tail end of planning, rather than haphazardly here and there at different places. Now that tlist Vars do not get modified until the very end, it's possible to get rid of the klugy var_equal and match_varid partial-matching routines, and just use plain equal() throughout the optimizer. This is a step towards allowing merge and hash joins to be done on expressions instead of only Vars ...
* Major revision of sort-node handling: push knowledge of queryTom Lane1999-08-21
| | | | | | | | | | | | | sort order down into planner, instead of handling it only at the very top level of the planner. This fixes many things. An explicit sort is now avoided if there is a cheaper alternative (typically an indexscan) not only for ORDER BY, but also for the internal sort of GROUP BY. It works even when there is no other reason (such as a WHERE condition) to consider the indexscan. It works for indexes on functions. It works for indexes on functions, backwards. It's just so cool... CAUTION: I have changed the representation of SortClause nodes, therefore THIS UPDATE BREAKS STORED RULES. You will need to initdb.
* Remove extraneous SeqScan node that make_noname was insertingTom Lane1999-08-18
| | | | | | above a Sort or Materialize node. As far as I can tell, the only place that actually needed that was set_tlist_references, which was being lazy about checking to see if it had a noname node to fix or not...
* Assign sort keys properly when there are duplicate entries inTom Lane1999-08-16
| | | | | pathkey list --- corrects misbehavior seen with multiple mergejoin clauses mentioning same variable.
* Major planner/optimizer revision: get rid of PathOrder node type,Tom Lane1999-08-16
| | | | | | | | | store all ordering information in pathkeys lists (which are now lists of lists of PathKeyItem nodes, not just lists of lists of vars). This was a big win --- the code is smaller and IMHO more understandable than it was, even though it handles more cases. I believe the node changes will not force an initdb for anyone; planner nodes don't show up in stored rules.
* Update comments about pathkeys.Tom Lane1999-08-13
|
* Clean up optimizer's handling of indexscan quals that need to beTom Lane1999-08-12
| | | | | | | | | | | | commuted (ie, the index var appears on the right). These are now handled the same way as merge and hash join quals that need to be commuted: the actual reversing of the clause only happens if we actually choose the path and generate a plan from it. Furthermore, the clause is only reversed in the 'indexqual' field of the plan, not in the 'indxqualorig' field. This allows the clause to still be recognized and removed from qpquals of upper level join plans. Also, simplify and generalize match_clause_to_indexkey; now it recognizes binary-compatible indexes for join as well as restriction clauses.
* Minor cleanups and code beautification; eliminate someTom Lane1999-08-10
| | | | routines that are now dead code.
* Revise create_nestloop_node's handling of inner indexscan toTom Lane1999-08-10
| | | | | | | | work under a wider range of scenarios than it did --- it formerly did not handle a multi-pass inner scan, nor cases in which the inner scan's indxqualorig or non-index qual contained outer var references. I am not sure that these limitations could be hit in the existing optimizer, but they need to be fixed for future expansion.
* > > Prevent sorting if result is already sortedBruce Momjian1999-08-09
| | | | | | | | | | | | | | > > > > was implemented by Jan Wieck. > > His work is for ascending order cases. > > > > Here is a patch to prevent sorting also in descending > > order cases. > > Because I had already changed _bt_first() to position > > backward correctly before v6.5,this patch would work. > > Hiroshi Inoue Inoue@tpf.co.jp
* Clean up tlist.c tree-walking routines withTom Lane1999-08-09
| | | | expression_tree_mutator.
* Store -1 in attdisbursion to signal 'no duplicates in column'.Tom Lane1999-08-09
| | | | Centralize att_disbursion readout logic.
* Move get_attdisbursion to lsyscache. Clean up get_typdefault.Tom Lane1999-08-09
|
* Rewrite fix_indxqual_references, which was entirely bogus forTom Lane1999-08-09
| | | | | | | multi-scan indexscan plans; it tried to use the same table-to-index attribute mapping for all the scans, even if they used different indexes. It would klugily work as long as OR indexquals never used multikey indexes, but that's not likely to hold up much longer...
* Clean up routines in setrefs.c by replacing individual treeTom Lane1999-08-09
| | | | walking logic with expression_tree_walker/mutator calls.
* Create a standardized expression_tree_mutator support routineTom Lane1999-08-09
| | | | | | to go along with expression_tree_walker. (_walker is not suitable for routines that need to alter the tree structure significantly.) Other minor cleanups in clauses.c.
* Revise generation of hashjoin paths: generate one path perTom Lane1999-08-06
| | | | | | | | | | | | | | | hashjoinable clause, not one path for a randomly-chosen element of each set of clauses with the same join operator. That is, if you wrote SELECT ... WHERE t1.f1 = t2.f2 and t1.f3 = t2.f4, and both '=' ops were the same opcode (say, all four fields are int4), then the system would either consider hashing on f1=f2 or on f3=f4, but it would *not* consider both possibilities. Boo hiss. Also, revise estimation of hashjoin costs to include a penalty when the inner join var has a high disbursion --- ie, the most common value is pretty common. This tends to lead to badly skewed hash bucket occupancy and way more comparisons than you'd expect on average. I imagine that the cost calculation still needs tweaking, but at least it generates a more reasonable plan than before on George Young's example.
* Update comments about clause selectivity estimation.Tom Lane1999-07-30
|
* Further cleanups of indexqual processing: simplify controlTom Lane1999-07-30
| | | | | logic in indxpath.c, avoid generation of redundant indexscan paths for the same relation and index.
* Fix coredump seen when doing mergejoin between indexed tables,Tom Lane1999-07-30
| | | | | | for example in the regression test database, try select * from tenk1 t1, tenk1 t2 where t1.unique1 = t2.unique2; 6.5 has this same bug ...
* Update comments for create_indexscan_node().Tom Lane1999-07-30
|
* Add support for Case exprs to fix_indxqual_references,Tom Lane1999-07-29
| | | | | | so that Case works in WHERE join clauses. Temporary patch --- this routine is one of many that ought to be changed to use centralized expression-tree- walking logic.
* Correct bug in best_innerjoin(): it should check all theTom Lane1999-07-27
| | | | | | | rels that the inner path needs to join to, but it was only checking for the first one. Failure could only have been observed with an OR-clause that mentions 3 or more tables, and then only if the bogus path was actually selected as cheapest ...
* First cut at doing LIKE/regex indexing optimization inTom Lane1999-07-27
| | | | | | | | | | | | | | | | | | optimizer rather than parser. This has many advantages, such as not getting fooled by chance uses of operator names ~ and ~~ (the operators are identified by OID now), and not creating useless comparison operations in contexts where the comparisons will not actually be used as indexquals. The new code also recognizes exact-match LIKE and regex patterns, and produces an = indexqual instead of >= and <=. This change does NOT fix the problem with non-ASCII locales: the code still doesn't know how to generate an upper bound indexqual for non-ASCII collation order. But it's no worse than before, just the same deficiency in a different place... Also, dike out loc_restrictinfo fields in Plan nodes. These were doing nothing useful in the absence of 'expensive functions' optimization, and they took a considerable amount of processing to fill in.
* Further work on planning of indexscans. Cleaned up interfacesTom Lane1999-07-25
| | | | | to index_selectivity so that it can be handed an indexqual clause list rather than a bunch of assorted derivative data.
* Remove 'restrictinfojoinid' field from RestrictInfo nodes.Tom Lane1999-07-25
| | | | | | | The only place it was being used was as temporary storage in indxpath.c, and the logic was wrong: the same restrictinfo node could get chosen to carry the info for two different joins. Right fix is to return a second list of unjoined-relids parallel to the list of clause groups.
* Clean up messy clause-selectivity code in clausesel.c; repair bugTom Lane1999-07-24
| | | | | | | | | | | | | | | | | | | | identified by Hiroshi (incorrect cost attributed to OR clauses after multiple passes through set_rest_selec()). I think the code was trying to allow selectivities of OR subclauses to be passed in from outside, but noplace was actually passing any useful data, and set_rest_selec() was passing wrong data. Restructure representation of "indexqual" in IndexPath nodes so that it is the same as for indxqual in completed IndexScan nodes: namely, a toplevel list with an entry for each pass of the index scan, having sublists that are implicitly-ANDed index qual conditions for that pass. You don't want to know what the old representation was :-( Improve documentation of OR-clause indexscan functions. Remove useless 'notclause' field from RestrictInfo nodes. (This might force an initdb for anyone who has stored rules containing RestrictInfos, but I do not think that RestrictInfo ever appears in completed plans.)
* Minor code beautification, extensive improvement ofTom Lane1999-07-23
| | | | | comments. This file was full of obsolete and just plain wrong commentary...
* Move some system includes into c.h, and remove duplicates.Bruce Momjian1999-07-17
|
* Final cleanup.Bruce Momjian1999-07-16
|
* Update #include cleanupsBruce Momjian1999-07-16
|
* Change #include's to use <> and "" as appropriate.Bruce Momjian1999-07-15
|
* Remove unused #includes in *.c files.Bruce Momjian1999-07-15
|
* Clean up #include in /include directory. Add scripts for checking includes.Bruce Momjian1999-07-15
|
* Several routines failed to cope with CASE expressions, andTom Lane1999-07-15
| | | | indeed some of 'em were missing support for more node types than that...
* Cleanup of /include #include's, for 6.6 only.Bruce Momjian1999-07-14
|
* Fix for \do and ceil()/float.Bruce Momjian1999-07-07
|
* Fix spelling of variable name.Bruce Momjian1999-07-07
|
* Cleanup of min tuple size.Bruce Momjian1999-07-07
|
* Fix misspelling.Bruce Momjian1999-07-07
|
* Fix to prevent too large tuple from being created.Bruce Momjian1999-07-03
|
* Clean up problems with sublinks + grouping in planner. NotTom Lane1999-06-21
| | | | | sure if they are all fixed, because rewriter is now the stumbling block, but at least some cases work that did not work before.
* On second thought, expression_tree_walker should handle bareTom Lane1999-06-21
| | | | SubLink nodes after all ...
* Change form() to varargform() to prevent portability problems.Bruce Momjian1999-06-19
|
* Create a generic expression-tree-walker subroutine, whichTom Lane1999-06-19
| | | | | | will gradually replace all of the boilerplate tree-walk-recursion code that currently exists in O(N) slightly different forms in N subroutines. I've had it with adding missing cases to these subroutines...
* Remove query_planner's overhasty rejection of cases whereTom Lane1999-06-12
| | | | | | | | | | | | tlist and qual are NULL. It ought to handle these the same as the cases where tlist contains only constant expressions, ie, be willing to generate a Result-node plan. This did not use to matter, but it does now because union_planner will flatten the tlist when aggregates are present. Thus, 'select count(1) from table' now causes query_planner to be given a null tlist, and to duplicate 6.4's behavior we need it to give back a Result plan rather than refusing the query. 6.4 was arguably doing the Wrong Thing for this query, but I'm not going to open a semantics issue right before 6.5 release ... can revisit that problem later.
* Plug hole in dike: planner would coredump if query_plannerTom Lane1999-06-12
| | | | | | | | returned NULL, which it will do in some cases where an elog(ERROR) would probably be more appropriate. For the moment, generate a not-very- informative error message rather than proceeding to certain coredump. Probably ought to think about making query_planner elog instead of returning NULL, but this is at least a safe change for now.
* Fix errors in SELECT ... GROUP BY ... UNION SELECT ...Tom Lane1999-06-10
| | | | | ye proverbial one-line patch (not counting five lines of comment so's maybe it won't happen again)
* Fix problems with grouping/aggregation in queries that useTom Lane1999-06-06
| | | | inheritance ... basically it was completely busted :-(