mirror of
https://github.com/postgres/postgres.git
synced 2025-11-07 19:06:32 +03:00
SEARCH and CYCLE clauses
This adds the SQL standard feature that adds the SEARCH and CYCLE clauses to recursive queries to be able to do produce breadth- or depth-first search orders and detect cycles. These clauses can be rewritten into queries using existing syntax, and that is what this patch does in the rewriter. Reviewed-by: Vik Fearing <vik@postgresfriends.org> Reviewed-by: Pavel Stehule <pavel.stehule@gmail.com> Discussion: https://www.postgresql.org/message-id/flat/db80ceee-6f97-9b4a-8ee8-3ba0c58e5be2@2ndquadrant.com
This commit is contained in:
@@ -38,6 +38,7 @@
|
||||
#include "rewrite/rewriteDefine.h"
|
||||
#include "rewrite/rewriteHandler.h"
|
||||
#include "rewrite/rewriteManip.h"
|
||||
#include "rewrite/rewriteSearchCycle.h"
|
||||
#include "rewrite/rowsecurity.h"
|
||||
#include "utils/builtins.h"
|
||||
#include "utils/lsyscache.h"
|
||||
@@ -2079,6 +2080,23 @@ fireRIRrules(Query *parsetree, List *activeRIRs)
|
||||
int rt_index;
|
||||
ListCell *lc;
|
||||
|
||||
/*
|
||||
* Expand SEARCH and CYCLE clauses in CTEs.
|
||||
*
|
||||
* This is just a convenient place to do this, since we are already
|
||||
* looking at each Query.
|
||||
*/
|
||||
foreach(lc, parsetree->cteList)
|
||||
{
|
||||
CommonTableExpr *cte = lfirst_node(CommonTableExpr, lc);
|
||||
|
||||
if (cte->search_clause || cte->cycle_clause)
|
||||
{
|
||||
cte = rewriteSearchAndCycle(cte);
|
||||
lfirst(lc) = cte;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* don't try to convert this into a foreach loop, because rtable list can
|
||||
* get changed each time through...
|
||||
|
||||
Reference in New Issue
Block a user