]> granicus.if.org Git - postgresql/commitdiff
Code review for bigint-LIMIT patch. Fix missed planner dependency,
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 26 Jul 2006 19:31:51 +0000 (19:31 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 26 Jul 2006 19:31:51 +0000 (19:31 +0000)
eliminate unnecessary code, force initdb because stored rules change
(limit nodes are now supposed to be int8 not int4 expressions).
Update comments and error messages, which still all said 'integer'.

src/backend/executor/nodeLimit.c
src/backend/optimizer/plan/planagg.c
src/backend/optimizer/plan/planner.c
src/backend/parser/parse_clause.c
src/backend/parser/parse_coerce.c
src/include/catalog/catversion.h
src/include/nodes/parsenodes.h
src/include/nodes/plannodes.h
src/include/parser/parse_coerce.h

index 99c474b16116b586283e54b19e924b62d42b02aa..935b59a722391f16b59c01fd551d4b2b761a6645 100644 (file)
@@ -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;
index 30814a7e75cebc2a9907901f9aec318028073592..39e77897c0a6f2b44e626f5dfc3f2030c004bb7d 100644 (file)
@@ -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
index 5545da4978fcf1a2d8adb8ebffc39054a64c135c..c02f6e195cd57deb7827ae1fc25560fb599a3147 100644 (file)
@@ -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 */
                        }
index 2b95722530a636cb054055c2c60d5987a9065d08..d34529c74ee7d30f70be6f05f0b665357e83d8da 100644 (file)
@@ -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
index 6aa04b7b82bf1329a73d0f157e23ce682b099b8f..010c704c689d7ec81e7b95a03206972d97b97793 100644 (file)
@@ -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.
index 93ce0809e0050d5d7676a27f64be08e1322033e4..bcb2232e0b151f49f8434b97067414014e52b483 100644 (file)
@@ -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
index 9198dadf5aff0a3147c9fc3e776839495bd885ef..c44ba954d8446dc0dd38314c11486b89abfee1b1 100644 (file)
@@ -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 */
 
index 59425e722966f463356dca79cc25f571d568af75..78a472342bd5449eb26bb585fa3c6712d8b42f08 100644 (file)
@@ -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
index a5afff496c8d9e37954ae0f7a0c5307d5f85fc56..84d119df7624819833629da71926f0f009b02473 100644 (file)
@@ -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,