From: Tom Lane Date: Sun, 3 Dec 2006 21:40:07 +0000 (+0000) Subject: Fix LIMIT/OFFSET for null limit values. This worked before 8.2 but was broken X-Git-Tag: REL8_3_BETA1~1728 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=406d028a9bb1a531d8e413918709f8d99f5c7783;p=postgresql Fix LIMIT/OFFSET for null limit values. This worked before 8.2 but was broken by the change to make limit values int8 instead of int4. (Specifically, you can do DatumGetInt32 safely on a null value, but not DatumGetInt64.) Per bug #2803 from Greg Johnson. --- diff --git a/src/backend/executor/nodeLimit.c b/src/backend/executor/nodeLimit.c index 935b59a722..8455375c60 100644 --- a/src/backend/executor/nodeLimit.c +++ b/src/backend/executor/nodeLimit.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/nodeLimit.c,v 1.27 2006/07/26 19:31:50 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/executor/nodeLimit.c,v 1.28 2006/12/03 21:40:07 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -225,20 +225,24 @@ static void recompute_limits(LimitState *node) { ExprContext *econtext = node->ps.ps_ExprContext; + Datum val; bool isNull; if (node->limitOffset) { - node->offset = - DatumGetInt64(ExecEvalExprSwitchContext(node->limitOffset, - econtext, - &isNull, - NULL)); + val = ExecEvalExprSwitchContext(node->limitOffset, + econtext, + &isNull, + NULL); /* Interpret NULL offset as no offset */ if (isNull) node->offset = 0; - else if (node->offset < 0) - node->offset = 0; + else + { + node->offset = DatumGetInt64(val); + if (node->offset < 0) + node->offset = 0; + } } else { @@ -248,17 +252,23 @@ recompute_limits(LimitState *node) if (node->limitCount) { - node->noCount = false; - node->count = - DatumGetInt64(ExecEvalExprSwitchContext(node->limitCount, - econtext, - &isNull, - NULL)); + val = ExecEvalExprSwitchContext(node->limitCount, + econtext, + &isNull, + NULL); /* Interpret NULL count as no count (LIMIT ALL) */ if (isNull) - node->noCount = true; - else if (node->count < 0) + { node->count = 0; + node->noCount = true; + } + else + { + node->count = DatumGetInt64(val); + if (node->count < 0) + node->count = 0; + node->noCount = false; + } } else {