38 #define PORTALS_PER_USER 16 46 #define MAX_PORTALNAME_LEN NAMEDATALEN 56 #define PortalHashTableLookup(NAME, PORTAL) \ 58 PortalHashEnt *hentry; \ 60 hentry = (PortalHashEnt *) hash_search(PortalHashTable, \ 61 (NAME), HASH_FIND, NULL); \ 63 PORTAL = hentry->portal; \ 68 #define PortalHashTableInsert(PORTAL, NAME) \ 70 PortalHashEnt *hentry; bool found; \ 72 hentry = (PortalHashEnt *) hash_search(PortalHashTable, \ 73 (NAME), HASH_ENTER, &found); \ 75 elog(ERROR, "duplicate portal name"); \ 76 hentry->portal = PORTAL; \ 78 PORTAL->name = hentry->portalname; \ 81 #define PortalHashTableDelete(PORTAL) \ 83 PortalHashEnt *hentry; \ 85 hentry = (PortalHashEnt *) hash_search(PortalHashTable, \ 86 PORTAL->name, HASH_REMOVE, NULL); \ 88 elog(WARNING, "trying to delete portal name that does not exist"); \ 108 Assert(TopPortalContext == NULL);
155 foreach(lc, portal->
stmts)
186 (
errcode(ERRCODE_DUPLICATE_CURSOR),
187 errmsg(
"cursor \"%s\" already exists", name)));
190 (
errcode(ERRCODE_DUPLICATE_CURSOR),
191 errmsg(
"closing existing cursor \"%s\"",
216 portal->
atEnd =
true;
236 static unsigned int unnamed_portal_count = 0;
243 unnamed_portal_count++;
244 sprintf(portalname,
"<unnamed portal %u>", unnamed_portal_count);
282 const char *prepStmtName,
283 const char *sourceText,
292 AssertArg(commandTag != CMDTAG_UNKNOWN || stmts ==
NIL);
299 portal->
stmts = stmts;
300 portal->
cplan = cplan;
314 portal->
cplan = NULL;
399 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
400 errmsg(
"portal \"%s\" cannot be run", portal->
name)));
477 (
errcode(ERRCODE_INVALID_CURSOR_STATE),
478 errmsg(
"cannot drop pinned portal \"%s\"", portal->
name)));
485 (
errcode(ERRCODE_INVALID_CURSOR_STATE),
486 errmsg(
"cannot drop active portal \"%s\"", portal->
name)));
608 if (PortalHashTable == NULL)
690 elog(
ERROR,
"cannot commit while a portal is pinned");
730 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
731 errmsg(
"cannot PREPARE a transaction that has created a cursor WITH HOLD")));
1135 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1136 errmsg(
"set-valued function called in context that cannot accept a set")));
1139 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1140 errmsg(
"materialize mode required, but it is not allowed in this context")));
1162 TIMESTAMPTZOID, -1, 0);
1186 MemSet(nulls, 0,
sizeof(nulls));
1269 (
errcode(ERRCODE_INVALID_TRANSACTION_TERMINATION),
1270 errmsg(
"cannot perform transaction commands inside a cursor loop that is not read-only")));
1274 elog(
ERROR,
"pinned portal is not ready to be auto-held");
void tuplestore_putvalues(Tuplestorestate *state, TupleDesc tdesc, Datum *values, bool *isnull)
void UnpinPortal(Portal portal)
Portal CreatePortal(const char *name, bool allowDup, bool dupSilent)
#define IsA(nodeptr, _type_)
void MemoryContextDelete(MemoryContext context)
#define AllocSetContextCreate
static void PortalReleaseCachedPlan(Portal portal)
#define AssertState(condition)
Portal CreateNewPortal(void)
TupleDesc CreateTemplateTupleDesc(int natts)
void(* cleanup)(Portal portal)
Portal GetPortalByName(const char *name)
#define CURSOR_OPT_BINARY
ResourceOwner CurTransactionResourceOwner
#define ALLOCSET_SMALL_SIZES
void MarkPortalActive(Portal portal)
#define tuplestore_donestoring(state)
void ResourceOwnerDelete(ResourceOwner owner)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
int errcode(int sqlerrcode)
Datum pg_cursor(PG_FUNCTION_ARGS)
#define MemSet(start, val, len)
MemoryContext holdContext
void ReleaseCachedPlan(CachedPlan *plan, ResourceOwner owner)
void PortalCleanup(Portal portal)
void PortalDefineQuery(Portal portal, const char *prepStmtName, const char *sourceText, CommandTag commandTag, List *stmts, CachedPlan *cplan)
MemoryContext portalContext
#define CURSOR_OPT_NO_SCROLL
void AtCleanup_Portals(void)
void AtAbort_Portals(void)
#define PortalHashTableDelete(PORTAL)
static MemoryContext TopPortalContext
void pfree(void *pointer)
PlannedStmt * PortalGetPrimaryStmt(Portal portal)
bool ThereAreNoReadyPortals(void)
#define TimestampTzGetDatum(X)
#define ALLOCSET_DEFAULT_SIZES
#define lfirst_node(type, lc)
void MarkPortalDone(Portal portal)
struct PortalData * Portal
void PinPortal(Portal portal)
HTAB * hash_create(const char *tabname, long nelem, const HASHCTL *info, int flags)
void PortalErrorCleanup(void)
void AtSubCleanup_Portals(SubTransactionId mySubid)
void TupleDescInitEntry(TupleDesc desc, AttrNumber attributeNumber, const char *attributeName, Oid oidtypeid, int32 typmod, int attdim)
SubTransactionId createSubid
#define AssertArg(condition)
MemoryContext TopMemoryContext
TimestampTz creation_time
char portalname[MAX_PORTALNAME_LEN]
void MemoryContextDeleteChildren(MemoryContext context)
Tuplestorestate * tuplestore_begin_heap(bool randomAccess, bool interXact, int maxKBytes)
SubTransactionId activeSubid
void * MemoryContextAllocZero(MemoryContext context, Size size)
void EnablePortalManager(void)
#define ereport(elevel,...)
void PortalHashTableDeleteAll(void)
SetFunctionReturnMode returnMode
struct portalhashent PortalHashEnt
#define Assert(condition)
void ResourceOwnerRelease(ResourceOwner owner, ResourceReleasePhase phase, bool isCommit, bool isTopLevel)
SubTransactionId GetCurrentSubTransactionId(void)
static void HoldPortal(Portal portal)
void AtSubAbort_Portals(SubTransactionId mySubid, SubTransactionId parentSubid, ResourceOwner myXactOwner, ResourceOwner parentXactOwner)
void UnregisterSnapshotFromOwner(Snapshot snapshot, ResourceOwner owner)
void tuplestore_end(Tuplestorestate *state)
void MemoryContextSetIdentifier(MemoryContext context, const char *id)
void PersistHoldablePortal(Portal portal)
void MarkPortalFailed(Portal portal)
#define InvalidSubTransactionId
void * hash_seq_search(HASH_SEQ_STATUS *status)
MemoryContext ecxt_per_query_memory
void hash_seq_init(HASH_SEQ_STATUS *status, HTAB *hashp)
void PortalCreateHoldStore(Portal portal)
bool PreCommit_Portals(bool isPrepare)
Tuplestorestate * setResult
void ResourceOwnerNewParent(ResourceOwner owner, ResourceOwner newparent)
static Datum values[MAXATTR]
#define MAX_PORTALNAME_LEN
bool shmem_exit_inprogress
Tuplestorestate * holdStore
int errmsg(const char *fmt,...)
void PortalDrop(Portal portal, bool isTopCommit)
#define CURSOR_OPT_SCROLL
#define CStringGetTextDatum(s)
void HoldPinnedPortals(void)
static HTAB * PortalHashTable
static void static void status(const char *fmt,...) pg_attribute_printf(1
#define PortalHashTableLookup(NAME, PORTAL)
#define PortalHashTableInsert(PORTAL, NAME)
#define PointerIsValid(pointer)
void hash_seq_term(HASH_SEQ_STATUS *status)
void AtSubCommit_Portals(SubTransactionId mySubid, SubTransactionId parentSubid, ResourceOwner parentXactOwner)
const char * prepStmtName
TimestampTz GetCurrentStatementStartTimestamp(void)
ResourceOwner ResourceOwnerCreate(ResourceOwner parent, const char *name)