ct es past_present_future_nycpgday_20130322
DESCRIPTION
TRANSCRIPT
CTEsPast, Present, and FuturePGDay NYC 2013/03/22
Copyright© 2013David [email protected]
Past (pre-8.4)
ø
Past (pre-8.4)
☹
Past (8.4)
- Add support for WITH clauses (CTEs), including WITH RECURSIVE (Yoshiyuki Asaba, Tatsuo Ishii, Tom)
Past CTEsWITH [RECURSIVE] t1 [(column type,…)] AS( [SELECT | VALUES][UNION [ALL] [SELECT]),t2 AS…tn AS…SELECT…
SQL is Turing-Complete
Travelling Salesman Problem
Given a number of cities and the costs of travelling from any city to any other city, what is the least-cost round-trip route that visits each city exactly once and then returns to the starting city?
Present (9.1)
Allow data-modification commands (INSERT/UPDATE/DELETE) in WITH clauses
YAY!WITH [RECURSIVE] t1 [(column type,…)] AS( [SELECT | VALUES |
(INSERT | UPDATE | DELETE) [RETURNING]][UNION [ALL] [SELECT | VALUES | (INSERT | UPDATE | DELETE) [RETURNING]]), ...(SELECT | INSERT | UPDATE | DELETE) …
Future (9.4+)
Let's think this through.
NOW!WITH [RECURSIVE] t1 [(column type,…)] AS( [SELECT | VALUES |
(INSERT | UPDATE | DELETE) [RETURNING]][UNION [ALL] [SELECT | VALUES |
(INSERT | UPDATE | DELETE) [RETURNING]]), ...
(SELECT | INSERT | UPDATE | DELETE) …
Data Manipulation
WITH [RECURSIVE] t1 [(column type,…)]AS (
DML[UNION [ALL] DML]), ...
DML
Actually...
Data Manipulation
WITH [RECURSIVE] t1 [(column type,…)]AS (
DML[(UNION|INTERSECT) [ALL] DML]), ...
DML
DML That Can't Return Rows...YET!
•COPY
•DO
•EXPLAIN
•SHOW
Fortunately...
commit 7a3e30e608a25800a1f7fdfaaca4da3f0ac0fb07Author: Tom Lane <[email protected]>Date: Sat Aug 12 02:52:06 2006 +0000 Add INSERT/UPDATE/DELETE RETURNING, with basic docs and regression tests. plpgsql support to come later. Along the way, convert execMain's SELECT INTO support into a DestReceiver, in order to eliminate some ugly special cases. Jonah Harris and Tom Lane doc/src/sgml/ref/delete.sgml | 56 +++++++++- doc/src/sgml/ref/insert.sgml | 65 ++++++++++-- doc/src/sgml/ref/update.sgml | 57 +++++++++- src/backend/access/common/printtup.c | 8 +- src/backend/commands/prepare.c | 9 +- src/backend/executor/execMain.c | 655 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------- src/backend/executor/spi.c | 9 +- src/backend/nodes/copyfuncs.c | 9 +- src/backend/nodes/equalfuncs.c | 9 +- src/backend/nodes/outfuncs.c | 4 +- src/backend/nodes/readfuncs.c | 4 +- src/backend/optimizer/plan/planagg.c | 3 +- src/backend/optimizer/plan/planner.c | 39 ++++++- src/backend/optimizer/plan/setrefs.c | 137 ++++++++++++++++++------ src/backend/optimizer/prep/prepjointree.c | 6 +- src/backend/optimizer/prep/preptlist.c | 39 ++++++- src/backend/optimizer/util/clauses.c | 5 +- src/backend/parser/analyze.c | 89 ++++++++++++++-- src/backend/parser/gram.y | 20 +++- src/backend/parser/keywords.c | 3 +- src/backend/tcop/dest.c | 9 +- src/backend/tcop/pquery.c | 152 +++++++++++++++----------- src/backend/tcop/utility.c | 4 +- src/backend/utils/adt/ruleutils.c | 123 +++++++++++++++------- src/include/catalog/catversion.h | 4 +- src/include/executor/executor.h | 3 +- src/include/nodes/execnodes.h | 4 +- src/include/nodes/parsenodes.h | 24 ++++- src/include/optimizer/planmain.h | 5 +- src/include/tcop/dest.h | 9 +- src/include/utils/portal.h | 16 ++- src/test/regress/expected/returning.out | 195 ++++++++++++++++++++++++++++++++++ src/test/regress/parallel_schedule | 4 +- src/test/regress/serial_schedule | 3 +- src/test/regress/sql/returning.sql | 87 +++++++++++++++ 35 files changed, 1459 insertions(+), 409 deletions(-)
Why not go the whole route?
Data{{Manipula,Defini}tion,C
ontrol}
WITH [RECURSIVE] t1 [(column type,…)]AS (
D(M|C|D)L[(UNION|INTERSECT) [ALL] D(M|C|D)L]), ...
D(M|C|D)L
OMG!
What Needs to Happen?
Powers Needed
1.Return rows (RETURNING)
2.Use rowsets (FROM | USING) (later)
3.Wrap in CTE machinery
Bikesheds
•Which ones first?
•UPDATE RETURNING (NEW & OLD)
•What should RETURNING be able to return?
•What does FROM/USING even mean?
•et cetæra
Let's Make This Be!
Questions?Comments!
Thanks!
Copyright© 2013David [email protected]