mirror of
https://github.com/postgres/postgres.git
synced 2025-08-19 23:22:23 +03:00
Fix WITH attached to a nested set operation (UNION/INTERSECT/EXCEPT).
Parse analysis neglected to cover the case of a WITH clause attached to an intermediate-level set operation; it only handled WITH at the top level or WITH attached to a leaf-level SELECT. Per report from Adam Mackler. In HEAD, I rearranged the order of SelectStmt's fields to put withClause with the other fields that can appear on non-leaf SelectStmts. In back branches, leave it alone to avoid a possible ABI break for third-party code. Back-patch to 8.4 where WITH support was added.
This commit is contained in:
@@ -678,6 +678,18 @@ checkWellFormedRecursion(CteState *cstate)
|
||||
if (cstate->selfrefcount != 1) /* shouldn't happen */
|
||||
elog(ERROR, "missing recursive reference");
|
||||
|
||||
/* WITH mustn't contain self-reference, either */
|
||||
if (stmt->withClause)
|
||||
{
|
||||
cstate->curitem = i;
|
||||
cstate->innerwiths = NIL;
|
||||
cstate->selfrefcount = 0;
|
||||
cstate->context = RECURSION_SUBLINK;
|
||||
checkWellFormedRecursionWalker((Node *) stmt->withClause->ctes,
|
||||
cstate);
|
||||
Assert(cstate->innerwiths == NIL);
|
||||
}
|
||||
|
||||
/*
|
||||
* Disallow ORDER BY and similar decoration atop the UNION. These
|
||||
* don't make sense because it's impossible to figure out what they
|
||||
@@ -933,7 +945,7 @@ checkWellFormedSelectStmt(SelectStmt *stmt, CteState *cstate)
|
||||
cstate);
|
||||
checkWellFormedRecursionWalker((Node *) stmt->lockingClause,
|
||||
cstate);
|
||||
break;
|
||||
/* stmt->withClause is intentionally ignored here */
|
||||
break;
|
||||
case SETOP_EXCEPT:
|
||||
if (stmt->all)
|
||||
@@ -952,6 +964,7 @@ checkWellFormedSelectStmt(SelectStmt *stmt, CteState *cstate)
|
||||
cstate);
|
||||
checkWellFormedRecursionWalker((Node *) stmt->lockingClause,
|
||||
cstate);
|
||||
/* stmt->withClause is intentionally ignored here */
|
||||
break;
|
||||
default:
|
||||
elog(ERROR, "unrecognized set op: %d",
|
||||
|
Reference in New Issue
Block a user