postgresql/src/backend/parser
Bruce Momjian d21de3b121 > =================================================================
> User interface proposal for multi-row function targetlist entries
> =================================================================
> 1. Only one targetlist entry may return a set.
> 2. Each targetlist item (other than the set returning one) is
>    repeated for each item in the returned set.
>

Having gotten no objections (actually, no response at all), I can only assume
no one had heartburn with this change. The attached patch covers the first of
the two proposals, i.e. restricting the target list to only one set returning
function.

It compiles cleanly, and passes all regression tests. If there are no
objections, please apply.

Any suggestions on where this should be documented (other than maybe sql-select)?

Thanks,

Joe

p.s. Here's what the previous example now looks like:
CREATE TABLE bar(f1 int, f2 text, f3 int);
INSERT INTO bar VALUES(1, 'Hello', 42);
INSERT INTO bar VALUES(2, 'Happy', 45);

CREATE TABLE foo(a int, b text);
INSERT INTO foo VALUES(42, 'World');
INSERT INTO foo VALUES(42, 'Everyone');
INSERT INTO foo VALUES(45, 'Birthday');
INSERT INTO foo VALUES(45, 'New Year');

CREATE TABLE foo2(a int, b text);
INSERT INTO foo2 VALUES(42, '!!!!');
INSERT INTO foo2 VALUES(42, '????');
INSERT INTO foo2 VALUES(42, '####');
INSERT INTO foo2 VALUES(45, '$$$$');

CREATE OR REPLACE FUNCTION getfoo(int) RETURNS SETOF text AS '
   SELECT b FROM foo WHERE a = $1
' language 'sql';

CREATE OR REPLACE FUNCTION getfoo2(int) RETURNS SETOF text AS '
   SELECT b FROM foo2 WHERE a = $1
' language 'sql';

regression=# SELECT f1, f2, getfoo(f3) AS f4 FROM bar;
  f1 |  f2   |    f4
----+-------+----------
   1 | Hello | World
   1 | Hello | Everyone
   2 | Happy | Birthday
   2 | Happy | New Year
(4 rows)

regression=# SELECT f1, f2, getfoo(f3) AS f4, getfoo2(f3) AS f5 FROM bar;
ERROR:  Only one target list entry may return a set result


Joe Conway
2003-02-13 05:06:35 +00:00
..
.cvsignore Add .cvsignore file so cvs doesn't complain if you have lex/yacc 1999-03-21 02:43:58 +00:00
analyze.c Use a varno not chosen at random for dummy variables in the top-level 2003-02-11 04:13:06 +00:00
gram.y Get rid of last few vestiges of parsetree dependency on grammar token 2003-02-10 04:44:47 +00:00
keywords.c Get rid of last few vestiges of parsetree dependency on grammar token 2003-02-10 04:44:47 +00:00
Makefile Get rid of last few vestiges of parsetree dependency on grammar token 2003-02-10 04:44:47 +00:00
parse_agg.c Fix parse_agg.c to detect ungrouped Vars in sub-SELECTs; remove code 2003-01-17 03:25:04 +00:00
parse_clause.c > ================================================================= 2003-02-13 05:06:35 +00:00
parse_coerce.c Create a distinction between Lists of integers and Lists of OIDs, to get 2003-02-09 06:56:28 +00:00
parse_expr.c Get rid of last few vestiges of parsetree dependency on grammar token 2003-02-10 04:44:47 +00:00
parse_func.c Create a distinction between Lists of integers and Lists of OIDs, to get 2003-02-09 06:56:28 +00:00
parse_node.c Preliminary code review for domain CHECK constraints patch: add documentation, 2002-12-12 20:35:16 +00:00
parse_oper.c Tighten selection of equality and ordering operators for grouping 2002-11-29 21:39:12 +00:00
parse_relation.c Phase 2 of read-only-plans project: restructure expression-tree nodes 2002-12-12 15:49:42 +00:00
parse_target.c > ================================================================= 2003-02-13 05:06:35 +00:00
parse_type.c Create a distinction between Lists of integers and Lists of OIDs, to get 2003-02-09 06:56:28 +00:00
parser.c pgindent run. 2002-09-04 20:31:48 +00:00
README cleanup 1998-08-23 14:43:46 +00:00
scan.l Add cast to suppress compile warning on Alphas. 2002-11-11 03:33:38 +00:00
scansup.c Be careful to include postgres.h *before* any system headers, to ensure 2002-09-05 00:43:07 +00:00

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

parser.c	things start here
scan.l		break query into tokens
scansup.c	handle escapes in input
keywords.c	turn keywords into specific tokens
gram.y		parse the tokens and fill query-type-specific structures
analyze.c	handle post-parse processing for each query type
parse_clause.c	handle clauses like WHERE, ORDER BY, GROUP BY, ...
parse_coerce.c	used for coercing expressions of different types
parse_expr.c	handle expressions like col, col + 3, x = 3 or x = 4
parse_oper.c	handle operations 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 type handling