diff options
Diffstat (limited to 'src/pl/tcl/pltcl.c')
-rw-r--r-- | src/pl/tcl/pltcl.c | 17 |
1 files changed, 6 insertions, 11 deletions
diff --git a/src/pl/tcl/pltcl.c b/src/pl/tcl/pltcl.c index be8fe7a0f21..ecde90626bf 100644 --- a/src/pl/tcl/pltcl.c +++ b/src/pl/tcl/pltcl.c @@ -128,7 +128,7 @@ typedef struct pltcl_proc_desc typedef struct pltcl_query_desc { char qname[20]; - void *plan; + SPIPlanPtr plan; int nargs; Oid *argtypes; FmgrInfo *arginfuncs; @@ -2024,7 +2024,7 @@ pltcl_process_SPI_result(Tcl_Interp *interp, * pltcl_SPI_prepare() - Builtin support for prepared plans * The Tcl command SPI_prepare * always saves the plan using - * SPI_saveplan and returns a key for + * SPI_keepplan and returns a key for * access. There is no chance to prepare * and not save the plan currently. **********************************************************************/ @@ -2035,7 +2035,6 @@ pltcl_SPI_prepare(ClientData cdata, Tcl_Interp *interp, int nargs; CONST84 char **args; pltcl_query_desc *qdesc; - void *plan; int i; Tcl_HashEntry *hashent; int hashnew; @@ -2103,22 +2102,18 @@ pltcl_SPI_prepare(ClientData cdata, Tcl_Interp *interp, * Prepare the plan and check for errors ************************************************************/ UTF_BEGIN; - plan = SPI_prepare(UTF_U2E(argv[1]), nargs, qdesc->argtypes); + qdesc->plan = SPI_prepare(UTF_U2E(argv[1]), nargs, qdesc->argtypes); UTF_END; - if (plan == NULL) + if (qdesc->plan == NULL) elog(ERROR, "SPI_prepare() failed"); /************************************************************ * Save the plan into permanent memory (right now it's in the * SPI procCxt, which will go away at function end). ************************************************************/ - qdesc->plan = SPI_saveplan(plan); - if (qdesc->plan == NULL) - elog(ERROR, "SPI_saveplan() failed"); - - /* Release the procCxt copy to avoid within-function memory leak */ - SPI_freeplan(plan); + if (SPI_keepplan(qdesc->plan)) + elog(ERROR, "SPI_keepplan() failed"); pltcl_subtrans_commit(oldcontext, oldowner); } |