Fix LIMIT/OFFSET for null limit values. This worked before 8.2 but was broken
authorTom Lane
Sun, 3 Dec 2006 21:40:07 +0000 (21:40 +0000)
committerTom Lane
Sun, 3 Dec 2006 21:40:07 +0000 (21:40 +0000)
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.

src/backend/executor/nodeLimit.c

index 935b59a722391f16b59c01fd551d4b2b761a6645..8455375c60239beaa66a166f3bf25c2205966383 100644 (file)
@@ -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
    {