mirror of
https://github.com/postgres/postgres.git
synced 2025-06-29 10:41:53 +03:00
- New functions to create a portal using a prepared/saved SPI plan or lookup an existing portal by name. - Functions to fetch/move from/in portals. Results are placed in the usual SPI_processed and SPI_tuptable, so the entire set of utility functions can be used to gain attribute access. - Prepared/saved SPI plans now use their own memory context and SPI_freeplan(plan) can remove them. - Tuple result sets (SPI_tuptable) now uses it's own memory context and can be free'd by SPI_freetuptable(tuptab). Enhancement of PL/pgSQL - Uses generic named portals internally in FOR ... SELECT loops to avoid running out of memory on huge result sets. - Support for CURSOR and REFCURSOR syntax using the new SPI functionality. Cursors used internally only need no explicit transaction block. Refcursor variables can be used inside of explicit transaction block to pass cursors between main application and functions. Jan
72 lines
2.0 KiB
C
72 lines
2.0 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* portal.h
|
|
* POSTGRES portal definitions.
|
|
*
|
|
*
|
|
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* $Id: portal.h,v 1.28 2001/05/21 14:22:18 wieck Exp $
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
/*
|
|
* Note:
|
|
* A portal is an abstraction which represents the execution state of
|
|
* a running query (specifically, a CURSOR).
|
|
*/
|
|
#ifndef PORTAL_H
|
|
#define PORTAL_H
|
|
|
|
#include "executor/execdesc.h"
|
|
#include "nodes/memnodes.h"
|
|
|
|
|
|
typedef struct PortalData *Portal;
|
|
|
|
typedef struct PortalData
|
|
{
|
|
char *name; /* Portal's name */
|
|
MemoryContext heap; /* subsidiary memory */
|
|
QueryDesc *queryDesc; /* Info about query associated with portal */
|
|
TupleDesc attinfo;
|
|
EState *state; /* Execution state of query */
|
|
bool atStart; /* T => fetch backwards is not allowed */
|
|
bool atEnd; /* T => fetch forwards is not allowed */
|
|
void (*cleanup) (Portal); /* Cleanup routine (optional) */
|
|
} PortalData;
|
|
|
|
/*
|
|
* PortalIsValid
|
|
* True iff portal is valid.
|
|
*/
|
|
#define PortalIsValid(p) PointerIsValid(p)
|
|
|
|
/*
|
|
* Access macros for Portal ... use these in preference to field access.
|
|
*/
|
|
#define PortalGetQueryDesc(portal) ((portal)->queryDesc)
|
|
#define PortalGetTupleDesc(portal) ((portal)->attinfo)
|
|
#define PortalGetState(portal) ((portal)->state)
|
|
#define PortalGetHeapMemory(portal) ((portal)->heap)
|
|
|
|
/*
|
|
* estimate of the maximum number of open portals a user would have,
|
|
* used in initially sizing the PortalHashTable in EnablePortalManager()
|
|
*/
|
|
#define PORTALS_PER_USER 64
|
|
|
|
|
|
extern void EnablePortalManager(void);
|
|
extern void AtEOXact_portals(void);
|
|
extern Portal CreatePortal(char *name);
|
|
extern void PortalDrop(Portal *portalP);
|
|
extern Portal GetPortalByName(char *name);
|
|
extern void PortalSetQuery(Portal portal, QueryDesc *queryDesc,
|
|
TupleDesc attinfo, EState *state,
|
|
void (*cleanup) (Portal portal));
|
|
|
|
|
|
#endif /* PORTAL_H */
|