From 88c556680ca3faa40f7428c7705455d744a9859e Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Fri, 2 Aug 2013 12:49:03 -0400 Subject: 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. --- src/test/regress/expected/matview.out | 3 +++ src/test/regress/expected/portals.out | 4 ++++ src/test/regress/expected/union.out | 2 ++ src/test/regress/sql/matview.sql | 3 +++ src/test/regress/sql/portals.sql | 3 +++ src/test/regress/sql/union.sql | 2 ++ 6 files changed, 17 insertions(+) (limited to 'src/test/regress') diff --git a/src/test/regress/expected/matview.out b/src/test/regress/expected/matview.out index 5a31fda69fc..ddaa6460953 100644 --- a/src/test/regress/expected/matview.out +++ b/src/test/regress/expected/matview.out @@ -292,6 +292,9 @@ NOTICE: materialized view "no_such_mv" does not exist, skipping -- make sure invalid comination of options is prohibited REFRESH MATERIALIZED VIEW CONCURRENTLY tvmm WITH NO DATA; ERROR: CONCURRENTLY and WITH NO DATA options cannot be used together +-- no tuple locks on materialized views +SELECT * FROM tvvm FOR SHARE; +ERROR: cannot lock rows in materialized view "tvvm" -- test join of mv and view SELECT type, m.totamt AS mtot, v.totamt AS vtot FROM tm m LEFT JOIN tv v USING (type) ORDER BY type; type | mtot | vtot diff --git a/src/test/regress/expected/portals.out b/src/test/regress/expected/portals.out index 01152a939d3..aafc6cf5294 100644 --- a/src/test/regress/expected/portals.out +++ b/src/test/regress/expected/portals.out @@ -1226,6 +1226,10 @@ DECLARE c1 CURSOR FOR SELECT * FROM uctest; DELETE FROM uctest WHERE CURRENT OF c1; -- fail, no current row ERROR: cursor "c1" is not positioned on a row ROLLBACK; +BEGIN; +DECLARE c1 CURSOR FOR SELECT MIN(f1) FROM uctest FOR UPDATE; +ERROR: FOR UPDATE is not allowed with aggregate functions +ROLLBACK; -- WHERE CURRENT OF may someday work with views, but today is not that day. -- For now, just make sure it errors out cleanly. CREATE TEMP VIEW ucview AS SELECT * FROM uctest; diff --git a/src/test/regress/expected/union.out b/src/test/regress/expected/union.out index bf8f1bcaf77..ae690cf9689 100644 --- a/src/test/regress/expected/union.out +++ b/src/test/regress/expected/union.out @@ -317,6 +317,8 @@ SELECT q1 FROM int8_tbl EXCEPT ALL SELECT DISTINCT q2 FROM int8_tbl; 123 (3 rows) +SELECT q1 FROM int8_tbl EXCEPT ALL SELECT q1 FROM int8_tbl FOR NO KEY UPDATE; +ERROR: FOR NO KEY UPDATE is not allowed with UNION/INTERSECT/EXCEPT -- -- Mixed types -- diff --git a/src/test/regress/sql/matview.sql b/src/test/regress/sql/matview.sql index 9d60bbbbe4d..620cbaca151 100644 --- a/src/test/regress/sql/matview.sql +++ b/src/test/regress/sql/matview.sql @@ -95,6 +95,9 @@ DROP MATERIALIZED VIEW IF EXISTS no_such_mv; -- make sure invalid comination of options is prohibited REFRESH MATERIALIZED VIEW CONCURRENTLY tvmm WITH NO DATA; +-- no tuple locks on materialized views +SELECT * FROM tvvm FOR SHARE; + -- test join of mv and view SELECT type, m.totamt AS mtot, v.totamt AS vtot FROM tm m LEFT JOIN tv v USING (type) ORDER BY type; diff --git a/src/test/regress/sql/portals.sql b/src/test/regress/sql/portals.sql index 02286c4096e..203e6577039 100644 --- a/src/test/regress/sql/portals.sql +++ b/src/test/regress/sql/portals.sql @@ -447,6 +447,9 @@ BEGIN; DECLARE c1 CURSOR FOR SELECT * FROM uctest; DELETE FROM uctest WHERE CURRENT OF c1; -- fail, no current row ROLLBACK; +BEGIN; +DECLARE c1 CURSOR FOR SELECT MIN(f1) FROM uctest FOR UPDATE; +ROLLBACK; -- WHERE CURRENT OF may someday work with views, but today is not that day. -- For now, just make sure it errors out cleanly. diff --git a/src/test/regress/sql/union.sql b/src/test/regress/sql/union.sql index 6194ce47511..d567cf14819 100644 --- a/src/test/regress/sql/union.sql +++ b/src/test/regress/sql/union.sql @@ -109,6 +109,8 @@ SELECT q1 FROM int8_tbl EXCEPT ALL SELECT q2 FROM int8_tbl; SELECT q1 FROM int8_tbl EXCEPT ALL SELECT DISTINCT q2 FROM int8_tbl; +SELECT q1 FROM int8_tbl EXCEPT ALL SELECT q1 FROM int8_tbl FOR NO KEY UPDATE; + -- -- Mixed types -- -- cgit v1.2.3