This patch is for the following TODO item. SQL command: -/Change LIMIT/OFFSET and FETCH/MOVE to use int8
/Since the limit/offset patch is already applied, this patch is meant for Fetch/Move query. I have tested the patch and it works for int64 values. Please verify this. Thanks Dhanaraj / /
*** ./src/backend/commands/portalcmds.c.orig Sat Aug 12 23:04:54 2006 --- ./src/backend/commands/portalcmds.c Sat Aug 12 23:04:53 2006 *************** *** 176,183 **** char *completionTag) { Portal portal; ! long nprocessed; /* * Disallow empty-string cursor name (conflicts with protocol-level * unnamed portal). --- 176,183 ---- char *completionTag) { Portal portal; ! int64 nprocessed; /* * Disallow empty-string cursor name (conflicts with protocol-level * unnamed portal). *************** *** 209,215 **** /* Return command status if wanted */ if (completionTag) ! snprintf(completionTag, COMPLETION_TAG_BUFSIZE, "%s %ld", stmt->ismove ? "MOVE" : "FETCH", nprocessed); } --- 209,215 ---- /* Return command status if wanted */ if (completionTag) ! snprintf(completionTag, COMPLETION_TAG_BUFSIZE, "%s %lld", stmt->ismove ? "MOVE" : "FETCH", nprocessed); } *** ./src/backend/parser/gram.y.orig Sat Aug 12 23:04:57 2006 --- ./src/backend/parser/gram.y Sun Aug 13 00:06:28 2006 *************** *** 116,122 **** %union { ! int ival; char chr; char *str; const char *keyword; --- 116,122 ---- %union { ! int64 ival; char chr; char *str; const char *keyword; *************** *** 1180,1192 **** ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("INTERVAL(%d) precision must not be negative", ! $3))); if ($3 > MAX_INTERVAL_PRECISION) { ereport(WARNING, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("INTERVAL(%d) precision reduced to maximum allowed, %d", ! $3, MAX_INTERVAL_PRECISION))); $3 = MAX_INTERVAL_PRECISION; } --- 1180,1192 ---- ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("INTERVAL(%d) precision must not be negative", ! (int)$3))); if ($3 > MAX_INTERVAL_PRECISION) { ereport(WARNING, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("INTERVAL(%d) precision reduced to maximum allowed, %d", ! (int)$3, MAX_INTERVAL_PRECISION))); $3 = MAX_INTERVAL_PRECISION; } *************** *** 2620,2626 **** ICONST { char buf[64]; ! snprintf(buf, sizeof(buf), "%d", $1); $$ = makeString(pstrdup(buf)); } | FCONST { $$ = makeString($1); } --- 2620,2626 ---- ICONST { char buf[64]; ! snprintf(buf, sizeof(buf), "%d", (int)$1); $$ = makeString(pstrdup(buf)); } | FCONST { $$ = makeString($1); } *************** *** 6281,6293 **** ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("INTERVAL(%d) precision must not be negative", ! $3))); if ($3 > MAX_INTERVAL_PRECISION) { ereport(WARNING, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("INTERVAL(%d) precision reduced to maximum allowed, %d", ! $3, MAX_INTERVAL_PRECISION))); $3 = MAX_INTERVAL_PRECISION; } $$->typmod = INTERVAL_TYPMOD($3, $5); --- 6281,6293 ---- ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("INTERVAL(%d) precision must not be negative", ! (int)$3))); if ($3 > MAX_INTERVAL_PRECISION) { ereport(WARNING, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("INTERVAL(%d) precision reduced to maximum allowed, %d", ! (int)$3, MAX_INTERVAL_PRECISION))); $3 = MAX_INTERVAL_PRECISION; } $$->typmod = INTERVAL_TYPMOD($3, $5); *************** *** 6408,6419 **** ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("NUMERIC precision %d must be between 1 and %d", ! $2, NUMERIC_MAX_PRECISION))); if ($4 < 0 || $4 > $2) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("NUMERIC scale %d must be between 0 and precision %d", ! $4, $2))); $$ = (($2 << 16) | $4) + VARHDRSZ; } --- 6408,6419 ---- ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("NUMERIC precision %d must be between 1 and %d", ! (int)$2, NUMERIC_MAX_PRECISION))); if ($4 < 0 || $4 > $2) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("NUMERIC scale %d must be between 0 and precision %d", ! (int)$4, (int)$2))); $$ = (($2 << 16) | $4) + VARHDRSZ; } *************** *** 6423,6429 **** ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("NUMERIC precision %d must be between 1 and %d", ! $2, NUMERIC_MAX_PRECISION))); $$ = ($2 << 16) + VARHDRSZ; } --- 6423,6429 ---- ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("NUMERIC precision %d must be between 1 and %d", ! (int)$2, NUMERIC_MAX_PRECISION))); $$ = ($2 << 16) + VARHDRSZ; } *************** *** 6441,6452 **** ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("DECIMAL precision %d must be between 1 and %d", ! $2, NUMERIC_MAX_PRECISION))); if ($4 < 0 || $4 > $2) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("DECIMAL scale %d must be between 0 and precision %d", ! $4, $2))); $$ = (($2 << 16) | $4) + VARHDRSZ; } --- 6441,6452 ---- ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("DECIMAL precision %d must be between 1 and %d", ! (int)$2, NUMERIC_MAX_PRECISION))); if ($4 < 0 || $4 > $2) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("DECIMAL scale %d must be between 0 and precision %d", ! (int)$4, (int)$2))); $$ = (($2 << 16) | $4) + VARHDRSZ; } *************** *** 6456,6462 **** ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("DECIMAL precision %d must be between 1 and %d", ! $2, NUMERIC_MAX_PRECISION))); $$ = ($2 << 16) + VARHDRSZ; } --- 6456,6462 ---- ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("DECIMAL precision %d must be between 1 and %d", ! (int)$2, NUMERIC_MAX_PRECISION))); $$ = ($2 << 16) + VARHDRSZ; } *************** *** 6662,6674 **** ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("TIMESTAMP(%d)%s precision must not be negative", ! $3, ($5 ? " WITH TIME ZONE": "")))); if ($3 > MAX_TIMESTAMP_PRECISION) { ereport(WARNING, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("TIMESTAMP(%d)%s precision reduced to maximum allowed, %d", ! $3, ($5 ? " WITH TIME ZONE": ""), MAX_TIMESTAMP_PRECISION))); $3 = MAX_TIMESTAMP_PRECISION; } --- 6662,6674 ---- ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("TIMESTAMP(%d)%s precision must not be negative", ! (int)$3, ($5 ? " WITH TIME ZONE": "")))); if ($3 > MAX_TIMESTAMP_PRECISION) { ereport(WARNING, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("TIMESTAMP(%d)%s precision reduced to maximum allowed, %d", ! (int)$3, ($5 ? " WITH TIME ZONE": ""), MAX_TIMESTAMP_PRECISION))); $3 = MAX_TIMESTAMP_PRECISION; } *************** *** 6695,6707 **** ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("TIME(%d)%s precision must not be negative", ! $3, ($5 ? " WITH TIME ZONE": "")))); if ($3 > MAX_TIME_PRECISION) { ereport(WARNING, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("TIME(%d)%s precision reduced to maximum allowed, %d", ! $3, ($5 ? " WITH TIME ZONE": ""), MAX_TIME_PRECISION))); $3 = MAX_TIME_PRECISION; } --- 6695,6707 ---- ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("TIME(%d)%s precision must not be negative", ! (int)$3, ($5 ? " WITH TIME ZONE": "")))); if ($3 > MAX_TIME_PRECISION) { ereport(WARNING, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("TIME(%d)%s precision reduced to maximum allowed, %d", ! (int)$3, ($5 ? " WITH TIME ZONE": ""), MAX_TIME_PRECISION))); $3 = MAX_TIME_PRECISION; } *************** *** 7435,7447 **** ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("CURRENT_TIME(%d) precision must not be negative", ! $3))); if ($3 > MAX_TIME_PRECISION) { ereport(WARNING, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("CURRENT_TIME(%d) precision reduced to maximum allowed, %d", ! $3, MAX_TIME_PRECISION))); $3 = MAX_TIME_PRECISION; } d->typmod = $3; --- 7435,7447 ---- ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("CURRENT_TIME(%d) precision must not be negative", ! (int)$3))); if ($3 > MAX_TIME_PRECISION) { ereport(WARNING, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("CURRENT_TIME(%d) precision reduced to maximum allowed, %d", ! (int)$3, MAX_TIME_PRECISION))); $3 = MAX_TIME_PRECISION; } d->typmod = $3; *************** *** 7480,7492 **** ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("CURRENT_TIMESTAMP(%d) precision must not be negative", ! $3))); if ($3 > MAX_TIMESTAMP_PRECISION) { ereport(WARNING, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("CURRENT_TIMESTAMP(%d) precision reduced to maximum allowed, %d", ! $3, MAX_TIMESTAMP_PRECISION))); $3 = MAX_TIMESTAMP_PRECISION; } d->typmod = $3; --- 7480,7492 ---- ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("CURRENT_TIMESTAMP(%d) precision must not be negative", ! (int)$3))); if ($3 > MAX_TIMESTAMP_PRECISION) { ereport(WARNING, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("CURRENT_TIMESTAMP(%d) precision reduced to maximum allowed, %d", ! (int)$3, MAX_TIMESTAMP_PRECISION))); $3 = MAX_TIMESTAMP_PRECISION; } d->typmod = $3; *************** *** 7527,7539 **** ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("LOCALTIME(%d) precision must not be negative", ! $3))); if ($3 > MAX_TIME_PRECISION) { ereport(WARNING, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("LOCALTIME(%d) precision reduced to maximum allowed, %d", ! $3, MAX_TIME_PRECISION))); $3 = MAX_TIME_PRECISION; } d->typmod = $3; --- 7527,7539 ---- ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("LOCALTIME(%d) precision must not be negative", ! (int)$3))); if ($3 > MAX_TIME_PRECISION) { ereport(WARNING, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("LOCALTIME(%d) precision reduced to maximum allowed, %d", ! (int)$3, MAX_TIME_PRECISION))); $3 = MAX_TIME_PRECISION; } d->typmod = $3; *************** *** 7575,7587 **** ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("LOCALTIMESTAMP(%d) precision must not be negative", ! $3))); if ($3 > MAX_TIMESTAMP_PRECISION) { ereport(WARNING, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("LOCALTIMESTAMP(%d) precision reduced to maximum allowed, %d", ! $3, MAX_TIMESTAMP_PRECISION))); $3 = MAX_TIMESTAMP_PRECISION; } d->typmod = $3; --- 7575,7587 ---- ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("LOCALTIMESTAMP(%d) precision must not be negative", ! (int)$3))); if ($3 > MAX_TIMESTAMP_PRECISION) { ereport(WARNING, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("LOCALTIMESTAMP(%d) precision reduced to maximum allowed, %d", ! (int)$3, MAX_TIMESTAMP_PRECISION))); $3 = MAX_TIMESTAMP_PRECISION; } d->typmod = $3; *************** *** 8360,8372 **** ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("INTERVAL(%d) precision must not be negative", ! $3))); if ($3 > MAX_INTERVAL_PRECISION) { ereport(WARNING, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("INTERVAL(%d) precision reduced to maximum allowed, %d", ! $3, MAX_INTERVAL_PRECISION))); $3 = MAX_INTERVAL_PRECISION; } n->typename->typmod = INTERVAL_TYPMOD($3, $6); --- 8360,8372 ---- ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("INTERVAL(%d) precision must not be negative", ! (int)$3))); if ($3 > MAX_INTERVAL_PRECISION) { ereport(WARNING, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("INTERVAL(%d) precision reduced to maximum allowed, %d", ! (int)$3, MAX_INTERVAL_PRECISION))); $3 = MAX_INTERVAL_PRECISION; } n->typename->typmod = INTERVAL_TYPMOD($3, $6); *** ./src/backend/parser/scan.l.orig Sat Aug 12 23:04:58 2006 --- ./src/backend/parser/scan.l Sat Aug 12 23:04:57 2006 *************** *** 666,671 **** --- 666,690 ---- #endif ) { + /* For Fetch/Move stmt, convert the string into int64 value */ + if((strcmp(yylval.keyword, "fetch")==0) || (strcmp(yylval.keyword, "move")==0)) + { + int64 intVal; + errno = 0; + + intVal = strtoll(yytext, &endptr, 10); + if (*endptr != '\0' || errno == ERANGE) + { + yylval.str = pstrdup(yytext); + return FCONST; + } + else + { + yylval.ival = intVal; + return ICONST; + } + } + /* integer too large, treat it as a float */ yylval.str = pstrdup(yytext); return FCONST; *** ./src/backend/tcop/postgres.c.orig Sat Aug 12 23:05:03 2006 --- ./src/backend/tcop/postgres.c Sat Aug 12 23:05:03 2006 *************** *** 1678,1684 **** * Process an "Execute" message for a portal */ static void ! exec_execute_message(const char *portal_name, long max_rows) { CommandDest dest; DestReceiver *receiver; --- 1678,1684 ---- * Process an "Execute" message for a portal */ static void ! exec_execute_message(const char *portal_name, int64 max_rows) { CommandDest dest; DestReceiver *receiver; *************** *** 3263,3275 **** case 'E': /* execute */ { const char *portal_name; ! int max_rows; /* Set statement_timestamp() */ SetCurrentStatementStartTimestamp(); portal_name = pq_getmsgstring(&input_message); ! max_rows = pq_getmsgint(&input_message, 4); pq_getmsgend(&input_message); exec_execute_message(portal_name, max_rows); --- 3263,3275 ---- case 'E': /* execute */ { const char *portal_name; ! int64 max_rows; /* Set statement_timestamp() */ SetCurrentStatementStartTimestamp(); portal_name = pq_getmsgstring(&input_message); ! max_rows = pq_getmsgint64(&input_message); pq_getmsgend(&input_message); exec_execute_message(portal_name, max_rows); *** ./src/backend/tcop/pquery.c.orig Sat Aug 12 23:05:03 2006 --- ./src/backend/tcop/pquery.c Sat Aug 12 23:05:03 2006 *************** *** 37,45 **** ParamListInfo params, DestReceiver *dest, char *completionTag); ! static uint32 RunFromStore(Portal portal, ScanDirection direction, long count, DestReceiver *dest); ! static long PortalRunSelect(Portal portal, bool forward, long count, DestReceiver *dest); static void PortalRunUtility(Portal portal, Query *query, DestReceiver *dest, char *completionTag); --- 37,45 ---- ParamListInfo params, DestReceiver *dest, char *completionTag); ! static uint64 RunFromStore(Portal portal, ScanDirection direction, int64 count, DestReceiver *dest); ! static int64 PortalRunSelect(Portal portal, bool forward, int64 count, DestReceiver *dest); static void PortalRunUtility(Portal portal, Query *query, DestReceiver *dest, char *completionTag); *************** *** 46,54 **** static void PortalRunMulti(Portal portal, DestReceiver *dest, DestReceiver *altdest, char *completionTag); ! static long DoPortalRunFetch(Portal portal, FetchDirection fdirection, ! long count, DestReceiver *dest); static void DoPortalRewind(Portal portal); --- 46,54 ---- static void PortalRunMulti(Portal portal, DestReceiver *dest, DestReceiver *altdest, char *completionTag); ! static int64 DoPortalRunFetch(Portal portal, FetchDirection fdirection, ! int64 count, DestReceiver *dest); static void DoPortalRewind(Portal portal); *************** *** 545,551 **** * suspended due to exhaustion of the count parameter. */ bool ! PortalRun(Portal portal, long count, DestReceiver *dest, DestReceiver *altdest, char *completionTag) { --- 545,551 ---- * suspended due to exhaustion of the count parameter. */ bool ! PortalRun(Portal portal, int64 count, DestReceiver *dest, DestReceiver *altdest, char *completionTag) { *************** *** 745,759 **** * * Returns number of rows processed (suitable for use in result tag) */ ! static long PortalRunSelect(Portal portal, bool forward, ! long count, DestReceiver *dest) { QueryDesc *queryDesc; ScanDirection direction; ! uint32 nprocessed; /* * NB: queryDesc will be NULL if we are fetching from a held cursor or a --- 745,759 ---- * * Returns number of rows processed (suitable for use in result tag) */ ! static int64 PortalRunSelect(Portal portal, bool forward, ! int64 count, DestReceiver *dest) { QueryDesc *queryDesc; ScanDirection direction; ! uint64 nprocessed; /* * NB: queryDesc will be NULL if we are fetching from a held cursor or a *************** *** 767,773 **** /* * Force the queryDesc destination to the right thing. This supports * MOVE, for example, which will pass in dest = DestNone. This is okay to ! * change as long as we do it on every fetch. (The Executor must not * assume that dest never changes.) */ if (queryDesc) --- 767,773 ---- /* * Force the queryDesc destination to the right thing. This supports * MOVE, for example, which will pass in dest = DestNone. This is okay to ! * change as int64 as we do it on every fetch. (The Executor must not * assume that dest never changes.) */ if (queryDesc) *************** *** 806,817 **** if (!ScanDirectionIsNoMovement(direction)) { ! long oldPos; if (nprocessed > 0) portal->atStart = false; /* OK to go backward now */ if (count == 0 || ! (unsigned long) nprocessed < (unsigned long) count) portal->atEnd = true; /* we retrieved 'em all */ oldPos = portal->portalPos; portal->portalPos += nprocessed; --- 806,817 ---- if (!ScanDirectionIsNoMovement(direction)) { ! int64 oldPos; if (nprocessed > 0) portal->atStart = false; /* OK to go backward now */ if (count == 0 || ! (uint64) nprocessed < (uint64) count) portal->atEnd = true; /* we retrieved 'em all */ oldPos = portal->portalPos; portal->portalPos += nprocessed; *************** *** 854,860 **** portal->portalPos++; /* adjust for endpoint case */ } if (count == 0 || ! (unsigned long) nprocessed < (unsigned long) count) { portal->atStart = true; /* we retrieved 'em all */ portal->portalPos = 0; --- 854,860 ---- portal->portalPos++; /* adjust for endpoint case */ } if (count == 0 || ! (uint64) nprocessed < (uint64) count) { portal->atStart = true; /* we retrieved 'em all */ portal->portalPos = 0; *************** *** 862,868 **** } else { ! long oldPos; oldPos = portal->portalPos; portal->portalPos -= nprocessed; --- 862,868 ---- } else { ! int64 oldPos; oldPos = portal->portalPos; portal->portalPos -= nprocessed; *************** *** 888,898 **** * are run in the caller's memory context (since we have no estate). Watch * out for memory leaks. */ ! static uint32 ! RunFromStore(Portal portal, ScanDirection direction, long count, DestReceiver *dest) { ! long current_tuple_count = 0; TupleTableSlot *slot; slot = MakeSingleTupleTableSlot(portal->tupDesc); --- 888,898 ---- * are run in the caller's memory context (since we have no estate). Watch * out for memory leaks. */ ! static uint64 ! RunFromStore(Portal portal, ScanDirection direction, int64 count, DestReceiver *dest) { ! int64 current_tuple_count = 0; TupleTableSlot *slot; slot = MakeSingleTupleTableSlot(portal->tupDesc); *************** *** 940,946 **** ExecDropSingleTupleTableSlot(slot); ! return (uint32) current_tuple_count; } /* --- 940,946 ---- ExecDropSingleTupleTableSlot(slot); ! return (uint64) current_tuple_count; } /* *************** *** 1129,1141 **** * * Returns number of rows processed (suitable for use in result tag) */ ! long PortalRunFetch(Portal portal, FetchDirection fdirection, ! long count, DestReceiver *dest) { ! long result; Portal saveActivePortal; Snapshot saveActiveSnapshot; ResourceOwner saveResourceOwner; --- 1129,1141 ---- * * Returns number of rows processed (suitable for use in result tag) */ ! int64 PortalRunFetch(Portal portal, FetchDirection fdirection, ! int64 count, DestReceiver *dest) { ! int64 result; Portal saveActivePortal; Snapshot saveActiveSnapshot; ResourceOwner saveResourceOwner; *************** *** 1244,1253 **** * * Returns number of rows processed (suitable for use in result tag) */ ! static long DoPortalRunFetch(Portal portal, FetchDirection fdirection, ! long count, DestReceiver *dest) { bool forward; --- 1244,1253 ---- * * Returns number of rows processed (suitable for use in result tag) */ ! static int64 DoPortalRunFetch(Portal portal, FetchDirection fdirection, ! int64 count, DestReceiver *dest) { bool forward; *************** *** 1283,1289 **** * we are. In any case, we arrange to fetch the target row * going forwards. */ ! if (portal->posOverflow || portal->portalPos == LONG_MAX || count - 1 <= portal->portalPos / 2) { DoPortalRewind(portal); --- 1283,1289 ---- * we are. In any case, we arrange to fetch the target row * going forwards. */ ! if (portal->posOverflow || portal->portalPos == LLONG_MAX || count - 1 <= portal->portalPos / 2) { DoPortalRewind(portal); *************** *** 1293,1299 **** } else { ! long pos = portal->portalPos; if (portal->atEnd) pos++; /* need one extra fetch if off end */ --- 1293,1299 ---- } else { ! int64 pos = portal->portalPos; if (portal->atEnd) pos++; /* need one extra fetch if off end */ *************** *** 1405,1411 **** */ if (!forward && count == FETCH_ALL && dest->mydest == DestNone) { ! long result = portal->portalPos; if (result > 0 && !portal->atEnd) result--; --- 1405,1411 ---- */ if (!forward && count == FETCH_ALL && dest->mydest == DestNone) { ! int64 result = portal->portalPos; if (result > 0 && !portal->atEnd) result--; *** ./src/include/nodes/parsenodes.h.orig Sat Aug 12 23:05:18 2006 --- ./src/include/nodes/parsenodes.h Sat Aug 12 23:05:18 2006 *************** *** 1419,1431 **** FETCH_RELATIVE } FetchDirection; ! #define FETCH_ALL LONG_MAX typedef struct FetchStmt { NodeTag type; FetchDirection direction; /* see above */ ! long howMany; /* number of rows, or position argument */ char *portalname; /* name of portal (cursor) */ bool ismove; /* TRUE if MOVE */ } FetchStmt; --- 1419,1431 ---- FETCH_RELATIVE } FetchDirection; ! #define FETCH_ALL LLONG_MAX typedef struct FetchStmt { NodeTag type; FetchDirection direction; /* see above */ ! int64 howMany; /* number of rows, or position argument */ char *portalname; /* name of portal (cursor) */ bool ismove; /* TRUE if MOVE */ } FetchStmt; *** ./src/include/tcop/pquery.h.orig Sat Aug 12 23:05:19 2006 --- ./src/include/tcop/pquery.h Sat Aug 12 23:05:19 2006 *************** *** 30,42 **** extern void PortalSetResultFormat(Portal portal, int nFormats, int16 *formats); ! extern bool PortalRun(Portal portal, long count, DestReceiver *dest, DestReceiver *altdest, char *completionTag); ! extern long PortalRunFetch(Portal portal, FetchDirection fdirection, ! long count, DestReceiver *dest); #endif /* PQUERY_H */ --- 30,42 ---- extern void PortalSetResultFormat(Portal portal, int nFormats, int16 *formats); ! extern bool PortalRun(Portal portal, int64 count, DestReceiver *dest, DestReceiver *altdest, char *completionTag); ! extern int64 PortalRunFetch(Portal portal, FetchDirection fdirection, ! int64 count, DestReceiver *dest); #endif /* PQUERY_H */ *** ./src/include/utils/portal.h.orig Sat Aug 12 23:05:19 2006 --- ./src/include/utils/portal.h Sat Aug 12 23:05:19 2006 *************** *** 163,169 **** bool atStart; bool atEnd; bool posOverflow; ! long portalPos; /* Presentation data, primarily used by the pg_cursors system view */ TimestampTz creation_time; /* time at which this portal was defined */ --- 163,169 ---- bool atStart; bool atEnd; bool posOverflow; ! int64 portalPos; /* Presentation data, primarily used by the pg_cursors system view */ TimestampTz creation_time; /* time at which this portal was defined */
---------------------------(end of broadcast)--------------------------- TIP 3: Have you checked our extensive FAQ? http://www.postgresql.org/docs/faq