postgresql/src/backend/parser
Tom Lane bd3daddaf2 Arrange to convert EXISTS subqueries that are equivalent to hashable IN
subqueries into the same thing you'd have gotten from IN (except always with
unknownEqFalse = true, so as to get the proper semantics for an EXISTS).
I believe this fixes the last case within CVS HEAD in which an EXISTS could
give worse performance than an equivalent IN subquery.

The tricky part of this is that if the upper query probes the EXISTS for only
a few rows, the hashing implementation can actually be worse than the default,
and therefore we need to make a cost-based decision about which way to use.
But at the time when the planner generates plans for subqueries, it doesn't
really know how many times the subquery will be executed.  The least invasive
solution seems to be to generate both plans and postpone the choice until
execution.  Therefore, in a query that has been optimized this way, EXPLAIN
will show two subplans for the EXISTS, of which only one will actually get
executed.

There is a lot more that could be done based on this infrastructure: in
particular it's interesting to consider switching to the hash plan if we start
out using the non-hashed plan but find a lot more upper rows going by than we
expected.  I have therefore left some minor inefficiencies in place, such as
initializing both subplans even though we will currently only use one.
2008-08-22 00:16:04 +00:00
..
.cvsignore Add .cvsignore file so cvs doesn't complain if you have lex/yacc 1999-03-21 02:43:58 +00:00
Makefile Refactor backend makefiles to remove lots of duplicate code 2008-02-19 10:30:09 +00:00
README Small wording improvements for source code READMEs. 2008-04-09 01:00:46 +00:00
analyze.c Teach the system how to use hashing for UNION. (INTERSECT/EXCEPT will follow, 2008-08-07 01:11:52 +00:00
gram.y Implement SQL-spec RETURNS TABLE syntax for functions. 2008-07-18 03:32:53 +00:00
keywords.c Support "variadic" functions, which can accept a variable number of arguments 2008-07-16 01:30:23 +00:00
parse_agg.c Rearrange the querytree representation of ORDER BY/GROUP BY/DISTINCT items 2008-08-02 21:32:01 +00:00
parse_clause.c Teach the system how to use hashing for UNION. (INTERSECT/EXCEPT will follow, 2008-08-07 01:11:52 +00:00
parse_coerce.c Allow I/O conversion casts to be applied to or from any type that is a member 2008-07-30 21:23:17 +00:00
parse_expr.c Arrange to convert EXISTS subqueries that are equivalent to hashable IN 2008-08-22 00:16:04 +00:00
parse_func.c Replace the hard-wired type knowledge in TypeCategory() and IsPreferredType() 2008-07-30 17:05:05 +00:00
parse_node.c Allow float8, int8, and related datatypes to be passed by value on machines 2008-04-21 00:26:47 +00:00
parse_oper.c Rearrange the querytree representation of ORDER BY/GROUP BY/DISTINCT items 2008-08-02 21:32:01 +00:00
parse_relation.c Restructure some header files a bit, in particular heapam.h, by removing some 2008-05-12 00:00:54 +00:00
parse_target.c Remove typename from A_Const. 2008-04-29 14:59:17 +00:00
parse_type.c Some minor further cleanup around A_Const. Don't attach a typecast in 2008-04-29 20:44:49 +00:00
parse_utilcmd.c Support "variadic" functions, which can accept a variable number of arguments 2008-07-16 01:30:23 +00:00
parser.c Update copyrights in source tree to 2008. 2008-01-01 19:46:01 +00:00
scan.l Add "%option noinput" to the scanners to avoid compiler warnings. GCC 4.3 2008-05-09 15:36:31 +00:00
scansup.c Update copyrights in source tree to 2008. 2008-01-01 19:46:01 +00:00

README

$PostgreSQL: pgsql/src/backend/parser/README,v 1.10 2008/04/09 01:00:46 momjian Exp $

Parser
======

This directory does more than tokenize and parse SQL queries.  It also
creates Query structures for the various complex queries that are passed
to the optimizer and then executor.

parser.c	things start here
scan.l		break query into tokens
scansup.c	handle escapes in input strings
keywords.c	turn keywords into specific tokens
gram.y		parse the tokens and fill query-type-specific structures
analyze.c	top level of parse analysis for optimizable queries
parse_clause.c	handle clauses like WHERE, ORDER BY, GROUP BY, ...
parse_coerce.c	handle coercing expressions to different data types
parse_expr.c	handle expressions like col, col + 3, x = 3 or x = 4
parse_oper.c	handle operators in expressions
parse_agg.c	handle aggregates, like SUM(col1),  AVG(col2), ...
parse_func.c	handle functions, table.column and column identifiers
parse_node.c	create nodes for various structures
parse_target.c	handle the result list of the query
parse_relation.c support routines for tables and column handling
parse_type.c	support routines for data type handling
parse_utilcmd.c	parse analysis for utility commands (done at execution time)