diff options
author | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2013-08-02 12:49:03 -0400 |
---|---|---|
committer | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2013-08-02 13:18:37 -0400 |
commit | 88c556680ca3faa40f7428c7705455d744a9859e (patch) | |
tree | 59b23b7cd6bd5e2b46f10ab517d9f54e06b9e9a5 /src/backend/optimizer/plan/planner.c | |
parent | 05ee328d66b700832cff61f59894ced7878fbfdb (diff) | |
download | postgresql-88c556680ca3faa40f7428c7705455d744a9859e.tar.gz postgresql-88c556680ca3faa40f7428c7705455d744a9859e.zip |
Fix crash in error report of invalid tuple lock
My tweak of these error messages in commit c359a1b082 contained the
thinko that a query would always have rowMarks set for a query
containing a locking clause. Not so: when declaring a cursor, for
instance, rowMarks isn't set at the point we're checking, so we'd be
dereferencing a NULL pointer.
The fix is to pass the lock strength to the function raising the error,
instead of trying to reverse-engineer it. The result not only is more
robust, but it also seems cleaner overall.
Per report from Robert Haas.
Diffstat (limited to 'src/backend/optimizer/plan/planner.c')
-rw-r--r-- | src/backend/optimizer/plan/planner.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index 9ff8050080f..49bd9302fa5 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -1962,7 +1962,8 @@ preprocess_rowmarks(PlannerInfo *root) * CTIDs invalid. This is also checked at parse time, but that's * insufficient because of rule substitution, query pullup, etc. */ - CheckSelectLocking(parse); + CheckSelectLocking(parse, ((RowMarkClause *) + linitial(parse->rowMarks))->strength); } else { |