diff options
author | Bruce Momjian <bruce@momjian.us> | 2004-03-05 00:47:01 +0000 |
---|---|---|
committer | Bruce Momjian <bruce@momjian.us> | 2004-03-05 00:47:01 +0000 |
commit | 65a0db19f48920d4be4607fca15634cf6b0a3d3b (patch) | |
tree | b8c81e24ff7968001325c9ded5e7d76d5a917c30 /src/backend/executor/spi.c | |
parent | 202cbdca0322d2606d744f260824e82826fe6a71 (diff) | |
download | postgresql-65a0db19f48920d4be4607fca15634cf6b0a3d3b.tar.gz postgresql-65a0db19f48920d4be4607fca15634cf6b0a3d3b.zip |
Add new SPI functions for use by PL/Java:
+extern Oid SPI_getargtypeid(void *plan, int argIndex);
+extern int SPI_getargcount(void *plan);
+extern bool SPI_is_cursor_plan(void *plan);
Thomas Hallgren
Diffstat (limited to 'src/backend/executor/spi.c')
-rw-r--r-- | src/backend/executor/spi.c | 61 |
1 files changed, 60 insertions, 1 deletions
diff --git a/src/backend/executor/spi.c b/src/backend/executor/spi.c index 5b4d92124d7..128a063f3c6 100644 --- a/src/backend/executor/spi.c +++ b/src/backend/executor/spi.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/spi.c,v 1.109 2003/12/02 19:26:47 joe Exp $ + * $PostgreSQL: pgsql/src/backend/executor/spi.c,v 1.110 2004/03/05 00:47:01 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -918,6 +918,65 @@ SPI_cursor_close(Portal portal) PortalDrop(portal, false); } +/* + * Returns the Oid representing the type id for argument at argIndex. First + * parameter is at index zero. + */ +Oid +SPI_getargtypeid(void *plan, int argIndex) +{ + if (plan == NULL || argIndex < 0 || argIndex >= ((_SPI_plan*)plan)->nargs) + { + SPI_result = SPI_ERROR_ARGUMENT; + return InvalidOid; + } + return ((_SPI_plan *) plan)->argtypes[argIndex]; +} + +/* + * Returns the number of arguments for the prepared plan. + */ +int +SPI_getargcount(void *plan) +{ + if (plan == NULL) + { + SPI_result = SPI_ERROR_ARGUMENT; + return -1; + } + return ((_SPI_plan *) plan)->nargs; +} + +/* + * Returns true if the plan contains exactly one command + * and that command originates from normal SELECT (i.e. + * *not* a SELECT ... INTO). In essence, the result indicates + * if the command can be used with SPI_cursor_open + * + * Parameters + * plan A plan previously prepared using SPI_prepare + */ +bool +SPI_is_cursor_plan(void *plan) +{ + List *qtlist; + _SPI_plan *spiplan = (_SPI_plan *) plan; + if (spiplan == NULL) + { + SPI_result = SPI_ERROR_ARGUMENT; + return false; + } + + qtlist = spiplan->qtlist; + if(length(spiplan->ptlist) == 1 && length(qtlist) == 1) + { + Query *queryTree = (Query *) lfirst((List *) lfirst(qtlist)); + if(queryTree->commandType == CMD_SELECT && queryTree->into == NULL) + return true; + } + return false; +} + /* =================== private functions =================== */ /* |