aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser/parse_clause.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/parser/parse_clause.c')
-rw-r--r--src/backend/parser/parse_clause.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/src/backend/parser/parse_clause.c b/src/backend/parser/parse_clause.c
index 36a3efff876..6fff13479e4 100644
--- a/src/backend/parser/parse_clause.c
+++ b/src/backend/parser/parse_clause.c
@@ -1745,7 +1745,8 @@ transformWhereClause(ParseState *pstate, Node *clause,
*/
Node *
transformLimitClause(ParseState *pstate, Node *clause,
- ParseExprKind exprKind, const char *constructName)
+ ParseExprKind exprKind, const char *constructName,
+ LimitOption limitOption)
{
Node *qual;
@@ -1759,6 +1760,18 @@ transformLimitClause(ParseState *pstate, Node *clause,
/* LIMIT can't refer to any variables of the current query */
checkExprIsVarFree(pstate, qual, constructName);
+ /*
+ * Don't allow NULLs in FETCH FIRST .. WITH TIES. This test is ugly and
+ * extremely simplistic, in that you can pass a NULL anyway by hiding it
+ * inside an expression -- but this protects ruleutils against emitting an
+ * unadorned NULL that's not accepted back by the grammar.
+ */
+ if (exprKind == EXPR_KIND_LIMIT && limitOption == LIMIT_OPTION_WITH_TIES &&
+ IsA(clause, A_Const) && ((A_Const *) clause)->val.type == T_Null)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_ROW_COUNT_IN_LIMIT_CLAUSE),
+ errmsg("row count cannot be NULL in FETCH FIRST ... WITH TIES clause")));
+
return qual;
}