ct es past_present_future_nycpgday_20130322

Post on 01-Dec-2014

695 Views

Category:

Sports

1 Downloads

Preview:

Click to see full reader

DESCRIPTION

 

TRANSCRIPT

CTEsPast, Present, and FuturePGDay NYC 2013/03/22

Copyright© 2013David Fetterdavid@fetter.org

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 <tgl@sss.pgh.pa.us>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 Fetterdavid@fetter.org

top related