diff --git a/doc/src/sgml/ref/select.sgml b/doc/src/sgml/ref/select.sgml index fa676b1698d..16bbab52c3e 100644 --- a/doc/src/sgml/ref/select.sgml +++ b/doc/src/sgml/ref/select.sgml @@ -1515,7 +1515,8 @@ FETCH { FIRST | NEXT } [ count ] { The WITH TIES option is used to return any additional rows that tie for the last place in the result set according to the ORDER BY clause; ORDER BY - is mandatory in this case. + is mandatory in this case, and SKIP LOCKED is + not allowed. ROW and ROWS as well as FIRST and NEXT are noise words that don't influence the effects of these clauses. diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c index 512b00bc656..fbbf769a871 100644 --- a/src/backend/commands/matview.c +++ b/src/backend/commands/matview.c @@ -185,7 +185,8 @@ ExecRefreshMatView(RefreshMatViewStmt *stmt, const char *queryString, if (concurrent && stmt->skipData) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("CONCURRENTLY and WITH NO DATA options cannot be used together"))); + errmsg("%s and %s options cannot be used together", + "CONCURRENTLY", "WITH NO DATA"))); /* * Check that everything is correct for a refresh. Problems at this point diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index e3068a374ee..08f1bf1031c 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -16816,6 +16816,21 @@ insertSelectOptions(SelectStmt *stmt, ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("WITH TIES cannot be specified without ORDER BY clause"))); + if (limitClause->limitOption == LIMIT_OPTION_WITH_TIES && stmt->lockingClause) + { + ListCell *lc; + + foreach(lc, stmt->lockingClause) + { + LockingClause *lock = lfirst_node(LockingClause, lc); + + if (lock->waitPolicy == LockWaitSkip) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("%s and %s options cannot be used together", + "SKIP LOCKED", "WITH TIES"))); + } + } stmt->limitOption = limitClause->limitOption; } if (withClause) diff --git a/src/test/regress/expected/limit.out b/src/test/regress/expected/limit.out index b75afcc01a3..8a98bbea8eb 100644 --- a/src/test/regress/expected/limit.out +++ b/src/test/regress/expected/limit.out @@ -619,6 +619,11 @@ SELECT thousand 0 (2 rows) +-- SKIP LOCKED and WITH TIES are incompatible +SELECT thousand + FROM onek WHERE thousand < 5 + ORDER BY thousand FETCH FIRST 1 ROW WITH TIES FOR UPDATE SKIP LOCKED; +ERROR: SKIP LOCKED and WITH TIES options cannot be used together -- should fail SELECT ''::text AS two, unique1, unique2, stringu1 FROM onek WHERE unique1 > 50 diff --git a/src/test/regress/sql/limit.sql b/src/test/regress/sql/limit.sql index d2d4ef132df..6f0cda98701 100644 --- a/src/test/regress/sql/limit.sql +++ b/src/test/regress/sql/limit.sql @@ -173,6 +173,11 @@ SELECT thousand FROM onek WHERE thousand < 5 ORDER BY thousand FETCH FIRST 2 ROW ONLY; +-- SKIP LOCKED and WITH TIES are incompatible +SELECT thousand + FROM onek WHERE thousand < 5 + ORDER BY thousand FETCH FIRST 1 ROW WITH TIES FOR UPDATE SKIP LOCKED; + -- should fail SELECT ''::text AS two, unique1, unique2, stringu1 FROM onek WHERE unique1 > 50