[PATCH] [LARGE] select * from cursor foo
От | Alex Pilosov |
---|---|
Тема | [PATCH] [LARGE] select * from cursor foo |
Дата | |
Msg-id | Pine.BSO.4.10.10108290740540.19501-100000@spider.pilosoft.com обсуждение исходный текст |
Список | pgsql-hackers |
Patch not attached, apparently mail server rejects large files. Patch can be found on www.formenos.org/pg/cursor.fix1.diff Notes: 1. Incompatible changes: CURSOR is now a keyword and may not be used as an identifier (tablename, etc). Otherwise, we get shift-reduce conflicts in grammar. 2. Major changes: a) RangeTblEntry (RTE for short) instead of having two possibilities, subquery and non-subquery, now has a rtetype field which can be of 3 possible states: RTE_RELATION, RTE_SUBSELECT, RTE_PORTAL). The type-specific structures are unionized, so where you used to have rte->relid, now you must do rte->u.rel.relid. Proper way to check what is the RTE type is now checking for rte->rtetype instead of checking whether rte->subquery is null. b) Similarly, RelOptInfo now has a RelOptInfoType which is an enum with 4 states, REL_PLAIN,REL_SUBQUERY,REL_JOIN,REL_PORTAL. I did not do the unionization of type-specific structures. Maybe I should've if I'm going to get in a big change anyway. c) There's a function PortalRun which fetches N records from portal and sets atEnd/atStart values properly. It replaces code duplicated in 2 places. How to test: declare foo cursor for select * from pg_class; select * from cursor foo; Documentation updates will be forthcoming ASAP, I just wanted to get this patch in queue before the freeze. Or at least making sure someone could look through this patch before freeze. :) Next patch will be one to support "SELECT * FROM func(arg1,arg2)" which would work by creating first a special kind of portal for selection from a function and then setting query source to be that portal. -alex
В списке pgsql-hackers по дате отправления: