mirror of
https://github.com/postgres/postgres.git
synced 2025-11-07 19:06:32 +03:00
Re-implement LIMIT/OFFSET as a plan node type, instead of a hack in
ExecutorRun. This allows LIMIT to work in a view. Also, LIMIT in a cursor declaration will behave in a reasonable fashion, whereas before it was overridden by the FETCH count.
This commit is contained in:
@@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.107 2000/10/16 17:08:05 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.108 2000/10/26 21:34:44 tgl Exp $
|
||||
*
|
||||
* NOTES
|
||||
* The PerformAddAttribute() code, like most of the relation
|
||||
@@ -111,7 +111,6 @@ PerformPortalFetch(char *name,
|
||||
int feature;
|
||||
QueryDesc *queryDesc;
|
||||
MemoryContext oldcontext;
|
||||
Const limcount;
|
||||
|
||||
/* ----------------
|
||||
* sanity checks
|
||||
@@ -123,20 +122,6 @@ PerformPortalFetch(char *name,
|
||||
return;
|
||||
}
|
||||
|
||||
/* ----------------
|
||||
* Create a const node from the given count value
|
||||
* ----------------
|
||||
*/
|
||||
memset(&limcount, 0, sizeof(limcount));
|
||||
limcount.type = T_Const;
|
||||
limcount.consttype = INT4OID;
|
||||
limcount.constlen = sizeof(int4);
|
||||
limcount.constvalue = Int32GetDatum(count);
|
||||
limcount.constisnull = false;
|
||||
limcount.constbyval = true;
|
||||
limcount.constisset = false;
|
||||
limcount.constiscast = false;
|
||||
|
||||
/* ----------------
|
||||
* get the portal from the portal name
|
||||
* ----------------
|
||||
@@ -156,8 +141,7 @@ PerformPortalFetch(char *name,
|
||||
oldcontext = MemoryContextSwitchTo(PortalGetHeapMemory(portal));
|
||||
|
||||
/* ----------------
|
||||
* setup "feature" to tell the executor what direction and
|
||||
* how many tuples to fetch.
|
||||
* setup "feature" to tell the executor which direction to go in.
|
||||
* ----------------
|
||||
*/
|
||||
if (forward)
|
||||
@@ -166,7 +150,7 @@ PerformPortalFetch(char *name,
|
||||
feature = EXEC_BACK;
|
||||
|
||||
/* ----------------
|
||||
* tell the destination to prepare to recieve some tuples
|
||||
* tell the destination to prepare to receive some tuples
|
||||
* ----------------
|
||||
*/
|
||||
queryDesc = PortalGetQueryDesc(portal);
|
||||
@@ -194,8 +178,7 @@ PerformPortalFetch(char *name,
|
||||
* execute the portal fetch operation
|
||||
* ----------------
|
||||
*/
|
||||
ExecutorRun(queryDesc, PortalGetState(portal), feature,
|
||||
(Node *) NULL, (Node *) &limcount);
|
||||
ExecutorRun(queryDesc, PortalGetState(portal), feature, (long) count);
|
||||
|
||||
if (dest == None) /* MOVE */
|
||||
pfree(queryDesc);
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
|
||||
* Portions Copyright (c) 1994-5, Regents of the University of California
|
||||
*
|
||||
* $Header: /cvsroot/pgsql/src/backend/commands/explain.c,v 1.60 2000/10/05 19:11:26 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/commands/explain.c,v 1.61 2000/10/26 21:34:44 tgl Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -217,6 +217,9 @@ explain_outNode(StringInfo str, Plan *plan, int indent, ExplainState *es)
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case T_Limit:
|
||||
pname = "Limit";
|
||||
break;
|
||||
case T_Hash:
|
||||
pname = "Hash";
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user