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:
@@ -399,8 +399,23 @@ markTargetListOrigin(ParseState *pstate, TargetEntry *tle,
|
||||
{
|
||||
CommonTableExpr *cte = GetCTEForRTE(pstate, rte, netlevelsup);
|
||||
TargetEntry *ste;
|
||||
List *tl = GetCTETargetList(cte);
|
||||
int extra_cols = 0;
|
||||
|
||||
ste = get_tle_by_resno(GetCTETargetList(cte), attnum);
|
||||
/*
|
||||
* RTE for CTE will already have the search and cycle columns
|
||||
* added, but the subquery won't, so skip looking those up.
|
||||
*/
|
||||
if (cte->search_clause)
|
||||
extra_cols += 1;
|
||||
if (cte->cycle_clause)
|
||||
extra_cols += 2;
|
||||
if (extra_cols &&
|
||||
attnum > list_length(tl) &&
|
||||
attnum <= list_length(tl) + extra_cols)
|
||||
break;
|
||||
|
||||
ste = get_tle_by_resno(tl, attnum);
|
||||
if (ste == NULL || ste->resjunk)
|
||||
elog(ERROR, "CTE %s does not have attribute %d",
|
||||
rte->eref->aliasname, attnum);
|
||||
|
||||
Reference in New Issue
Block a user