提交 0a844e84 编写于 作者: T Tom Lane

transformForUpdate() mustn't assume rowMarks list is initially empty.

It could be recursing into a sub-query where there was already a FOR
UPDATE clause.
上级 73d2a359
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $Id: analyze.c,v 1.171 2000/12/06 23:55:19 tgl Exp $ * $Id: analyze.c,v 1.172 2000/12/07 01:12:08 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -2503,6 +2503,7 @@ transformAlterTableStmt(ParseState *pstate, AlterTableStmt *stmt) ...@@ -2503,6 +2503,7 @@ transformAlterTableStmt(ParseState *pstate, AlterTableStmt *stmt)
return qry; return qry;
} }
/* exported so planner can check again after rewriting, query pullup, etc */
void void
CheckSelectForUpdate(Query *qry) CheckSelectForUpdate(Query *qry)
{ {
...@@ -2519,7 +2520,7 @@ CheckSelectForUpdate(Query *qry) ...@@ -2519,7 +2520,7 @@ CheckSelectForUpdate(Query *qry)
static void static void
transformForUpdate(Query *qry, List *forUpdate) transformForUpdate(Query *qry, List *forUpdate)
{ {
List *rowMarks = NIL; List *rowMarks = qry->rowMarks;
List *l; List *l;
List *rt; List *rt;
Index i; Index i;
...@@ -2542,6 +2543,7 @@ transformForUpdate(Query *qry, List *forUpdate) ...@@ -2542,6 +2543,7 @@ transformForUpdate(Query *qry, List *forUpdate)
} }
else else
{ {
if (!intMember(i, rowMarks)) /* avoid duplicates */
rowMarks = lappendi(rowMarks, i); rowMarks = lappendi(rowMarks, i);
rte->checkForWrite = true; rte->checkForWrite = true;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册