diff --git a/src/backend/executor/nodeLimit.c b/src/backend/executor/nodeLimit.c
index 99c474b16116b586283e54b19e924b62d42b02aa..935b59a722391f16b59c01fd551d4b2b761a6645 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.26 2006/07/26 00:34:48 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/backend/executor/nodeLimit.c,v 1.27 2006/07/26 19:31:50 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -23,7 +23,6 @@
 
 #include "executor/executor.h"
 #include "executor/nodeLimit.h"
-#include "catalog/pg_type.h"
 
 static void recompute_limits(LimitState *node);
 
@@ -227,24 +226,14 @@ recompute_limits(LimitState *node)
 {
 	ExprContext *econtext = node->ps.ps_ExprContext;
 	bool		isNull;
-  	Oid type;
-  
+
 	if (node->limitOffset)
 	{
-		type = ((Const *) node->limitOffset->expr)->consttype;
-  
-		if (type == INT8OID)
-			node->offset =
+		node->offset =
 			DatumGetInt64(ExecEvalExprSwitchContext(node->limitOffset,
 													econtext,
 													&isNull,
 													NULL));
-		else
-			node->offset = DatumGetInt32(ExecEvalExprSwitchContext(node->limitOffset,
-																   econtext,
-																   &isNull,
-																   NULL));
-
 		/* Interpret NULL offset as no offset */
 		if (isNull)
 			node->offset = 0;
@@ -260,21 +249,11 @@ recompute_limits(LimitState *node)
 	if (node->limitCount)
 	{
 		node->noCount = false;
-		type = ((Const *) node->limitCount->expr)->consttype;
- 
-		if (type == INT8OID)
-			node->count =
+		node->count =
 			DatumGetInt64(ExecEvalExprSwitchContext(node->limitCount,
 													econtext,
 													&isNull,
 													NULL));
-		else
-			node->count = DatumGetInt32(ExecEvalExprSwitchContext(node->limitCount,
-																  econtext,
-																  &isNull,
-																  NULL));
- 
-
 		/* Interpret NULL count as no count (LIMIT ALL) */
 		if (isNull)
 			node->noCount = true;
diff --git a/src/backend/optimizer/plan/planagg.c b/src/backend/optimizer/plan/planagg.c
index 30814a7e75cebc2a9907901f9aec318028073592..39e77897c0a6f2b44e626f5dfc3f2030c004bb7d 100644
--- a/src/backend/optimizer/plan/planagg.c
+++ b/src/backend/optimizer/plan/planagg.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/optimizer/plan/planagg.c,v 1.18 2006/07/14 14:52:20 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/backend/optimizer/plan/planagg.c,v 1.19 2006/07/26 19:31:50 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -459,9 +459,9 @@ make_agg_subplan(PlannerInfo *root, MinMaxAggInfo *info)
 
 	/* set up LIMIT 1 */
 	subparse->limitOffset = NULL;
-	subparse->limitCount = (Node *) makeConst(INT4OID, sizeof(int4),
-											  Int32GetDatum(1),
-											  false, true);
+	subparse->limitCount = (Node *) makeConst(INT8OID, sizeof(int64),
+											  Int64GetDatum(1),
+											  false, false /* not by val */);
 
 	/*
 	 * Generate the plan for the subquery.	We already have a Path for the
diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c
index 5545da4978fcf1a2d8adb8ebffc39054a64c135c..c02f6e195cd57deb7827ae1fc25560fb599a3147 100644
--- a/src/backend/optimizer/plan/planner.c
+++ b/src/backend/optimizer/plan/planner.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/optimizer/plan/planner.c,v 1.204 2006/07/26 00:34:48 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/backend/optimizer/plan/planner.c,v 1.205 2006/07/26 19:31:50 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1129,7 +1129,6 @@ preprocess_limit(PlannerInfo *root, double tuple_fraction,
 			else
 			{
 				*offset_est = DatumGetInt64(((Const *) est)->constvalue);
-
 				if (*offset_est < 0)
 					*offset_est = 0;	/* less than 0 is same as 0 */
 			}
diff --git a/src/backend/parser/parse_clause.c b/src/backend/parser/parse_clause.c
index 2b95722530a636cb054055c2c60d5987a9065d08..d34529c74ee7d30f70be6f05f0b665357e83d8da 100644
--- a/src/backend/parser/parse_clause.c
+++ b/src/backend/parser/parse_clause.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/parser/parse_clause.c,v 1.154 2006/07/26 00:34:48 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/backend/parser/parse_clause.c,v 1.155 2006/07/26 19:31:51 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1074,9 +1074,12 @@ transformWhereClause(ParseState *pstate, Node *clause,
 
 /*
  * transformLimitClause -
- *	  Transform the expression and make sure it is of type integer.
+ *	  Transform the expression and make sure it is of type bigint.
  *	  Used for LIMIT and allied clauses.
  *
+ * Note: as of Postgres 8.2, LIMIT expressions are expected to yield int8,
+ * rather than int4 as before.
+ *
  * constructName does not affect the semantics, but is used in error messages
  */
 Node *
@@ -1090,7 +1093,7 @@ transformLimitClause(ParseState *pstate, Node *clause,
 
 	qual = transformExpr(pstate, clause);
 
-	qual = coerce_to_integer64(pstate, qual, constructName);
+	qual = coerce_to_bigint(pstate, qual, constructName);
 
 	/*
 	 * LIMIT can't refer to any vars or aggregates of the current query; we
diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c
index 6aa04b7b82bf1329a73d0f157e23ce682b099b8f..010c704c689d7ec81e7b95a03206972d97b97793 100644
--- a/src/backend/parser/parse_coerce.c
+++ b/src/backend/parser/parse_coerce.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/parser/parse_coerce.c,v 2.142 2006/07/26 00:34:48 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/backend/parser/parse_coerce.c,v 2.143 2006/07/26 19:31:51 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -780,7 +780,8 @@ coerce_record_to_complex(ParseState *pstate, Node *node,
 	return (Node *) rowexpr;
 }
 
-/* coerce_to_boolean()
+/*
+ * coerce_to_boolean()
  *		Coerce an argument of a construct that requires boolean input
  *		(AND, OR, NOT, etc).  Also check that input is not a set.
  *
@@ -819,8 +820,9 @@ coerce_to_boolean(ParseState *pstate, Node *node,
 	return node;
 }
 
-/* coerce_to_integer()
- *		Coerce an argument of a construct that requires integer input
+/*
+ * coerce_to_integer()
+ *		Coerce an argument of a construct that requires integer input.
  *		Also check that input is not a set.
  *
  * Returns the possibly-transformed node tree.
@@ -857,10 +859,11 @@ coerce_to_integer(ParseState *pstate, Node *node,
 
 	return node;
 }
- 
-/* coerce_to_integer64()
- *              Coerce an argument of a construct that requires integer input
- *              (LIMIT, OFFSET).  Also check that input is not a set.
+
+/*
+ * coerce_to_bigint()
+ *		Coerce an argument of a construct that requires int8 input.
+ *		Also check that input is not a set.
  *
  * Returns the possibly-transformed node tree.
  *
@@ -868,34 +871,35 @@ coerce_to_integer(ParseState *pstate, Node *node,
  * processing is wanted.
  */
 Node *
-coerce_to_integer64(ParseState *pstate, Node *node,
-					const char *constructName)
+coerce_to_bigint(ParseState *pstate, Node *node,
+				 const char *constructName)
 {
-	Oid	inputTypeId = exprType(node);
+	Oid			inputTypeId = exprType(node);
 
 	if (inputTypeId != INT8OID)
 	{
 		node = coerce_to_target_type(pstate, node, inputTypeId,
-									 INT8OID, -1, COERCION_ASSIGNMENT,
+									 INT8OID, -1,
+									 COERCION_ASSIGNMENT,
 									 COERCE_IMPLICIT_CAST);
 		if (node == NULL)
-				ereport(ERROR,
-						  (errcode(ERRCODE_DATATYPE_MISMATCH),
-					  /* translator: first %s is name of a SQL construct, eg LIMIT */
-							 errmsg("argument of %s must be type integer, not type %s",
-									constructName, format_type_be(inputTypeId))));
+			ereport(ERROR,
+					(errcode(ERRCODE_DATATYPE_MISMATCH),
+			/* translator: first %s is name of a SQL construct, eg LIMIT */
+				   errmsg("argument of %s must be type bigint, not type %s",
+						  constructName, format_type_be(inputTypeId))));
 	}
 
 	if (expression_returns_set(node))
 		ereport(ERROR,
-				  (errcode(ERRCODE_DATATYPE_MISMATCH),
-		  /* translator: %s is name of a SQL construct, eg LIMIT */
-					   errmsg("argument of %s must not return a set",
-							  constructName)));
+				(errcode(ERRCODE_DATATYPE_MISMATCH),
+		/* translator: %s is name of a SQL construct, eg LIMIT */
+				 errmsg("argument of %s must not return a set",
+						constructName)));
 
 	return node;
 }
-  
+
 
 /* select_common_type()
  *		Determine the common supertype of a list of input expression types.
diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h
index 93ce0809e0050d5d7676a27f64be08e1322033e4..bcb2232e0b151f49f8434b97067414014e52b483 100644
--- a/src/include/catalog/catversion.h
+++ b/src/include/catalog/catversion.h
@@ -37,7 +37,7 @@
  * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.340 2006/07/25 03:51:21 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.341 2006/07/26 19:31:51 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -53,6 +53,6 @@
  */
 
 /*							yyyymmddN */
-#define CATALOG_VERSION_NO	200607241
+#define CATALOG_VERSION_NO	200607261
 
 #endif
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 9198dadf5aff0a3147c9fc3e776839495bd885ef..c44ba954d8446dc0dd38314c11486b89abfee1b1 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/nodes/parsenodes.h,v 1.317 2006/07/13 16:49:19 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/nodes/parsenodes.h,v 1.318 2006/07/26 19:31:51 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -112,8 +112,8 @@ typedef struct Query
 
 	List	   *sortClause;		/* a list of SortClause's */
 
-	Node	   *limitOffset;	/* # of result tuples to skip */
-	Node	   *limitCount;		/* # of result tuples to return */
+	Node	   *limitOffset;	/* # of result tuples to skip (int8 expr) */
+	Node	   *limitCount;		/* # of result tuples to return (int8 expr) */
 
 	List	   *rowMarks;		/* a list of RowMarkClause's */
 
diff --git a/src/include/nodes/plannodes.h b/src/include/nodes/plannodes.h
index 59425e722966f463356dca79cc25f571d568af75..78a472342bd5449eb26bb585fa3c6712d8b42f08 100644
--- a/src/include/nodes/plannodes.h
+++ b/src/include/nodes/plannodes.h
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/nodes/plannodes.h,v 1.83 2006/03/05 15:58:57 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/nodes/plannodes.h,v 1.84 2006/07/26 19:31:51 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -463,6 +463,9 @@ typedef struct SetOp
 
 /* ----------------
  *		limit node
+ *
+ * Note: as of Postgres 8.2, the offset and count expressions are expected
+ * to yield int8, rather than int4 as before.
  * ----------------
  */
 typedef struct Limit
diff --git a/src/include/parser/parse_coerce.h b/src/include/parser/parse_coerce.h
index a5afff496c8d9e37954ae0f7a0c5307d5f85fc56..84d119df7624819833629da71926f0f009b02473 100644
--- a/src/include/parser/parse_coerce.h
+++ b/src/include/parser/parse_coerce.h
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/parser/parse_coerce.h,v 1.64 2006/07/26 00:34:48 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/parser/parse_coerce.h,v 1.65 2006/07/26 19:31:51 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -57,9 +57,9 @@ extern Node *coerce_to_boolean(ParseState *pstate, Node *node,
 				  const char *constructName);
 extern Node *coerce_to_integer(ParseState *pstate, Node *node,
 				  const char *constructName);
-extern Node *coerce_to_integer64(ParseState *pstate, Node *node,
-                                    const char *constructName);
- 
+extern Node *coerce_to_bigint(ParseState *pstate, Node *node,
+							  const char *constructName);
+
 extern Oid	select_common_type(List *typeids, const char *context);
 extern Node *coerce_to_common_type(ParseState *pstate, Node *node,
 					  Oid targetTypeId,