Index: src/pl/tcl/pltcl.c =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/pl/tcl/pltcl.c,v retrieving revision 1.64 diff -c -r1.64 pltcl.c *** src/pl/tcl/pltcl.c 2002/09/26 05:39:03 1.64 --- src/pl/tcl/pltcl.c 2002/10/04 10:19:08 *************** *** 39,50 **** #include - #include - #include - #include #include #include - #include #include #include "access/heapam.h" --- 39,46 ---- *************** *** 308,313 **** --- 304,310 ---- ************************************************************/ spi_rc = SPI_exec("select 1 from pg_class " "where relname = 'pltcl_modules'", 1); + SPI_freetuptable(SPI_tuptable); if (spi_rc != SPI_OK_SELECT) elog(ERROR, "pltcl_init_load_unknown(): select from pg_class failed"); if (SPI_processed == 0) *************** *** 334,339 **** --- 331,337 ---- if (SPI_processed == 0) { Tcl_DStringFree(&unknown_src); + SPI_freetuptable(SPI_tuptable); elog(WARNING, "pltcl: Module unknown not found in pltcl_modules"); return; } *************** *** 359,364 **** --- 357,363 ---- } tcl_rc = Tcl_GlobalEval(interp, Tcl_DStringValue(&unknown_src)); Tcl_DStringFree(&unknown_src); + SPI_freetuptable(SPI_tuptable); } *************** *** 955,963 **** * Build our internal proc name from the functions Oid ************************************************************/ if (!is_trigger) ! sprintf(internal_proname, "__PLTcl_proc_%u", fn_oid); else ! sprintf(internal_proname, "__PLTcl_proc_%u_trigger", fn_oid); /************************************************************ * Lookup the internal proc name in the hashtable --- 954,964 ---- * Build our internal proc name from the functions Oid ************************************************************/ if (!is_trigger) ! snprintf(internal_proname, sizeof(internal_proname), ! "__PLTcl_proc_%u", fn_oid); else ! snprintf(internal_proname, sizeof(internal_proname), ! "__PLTcl_proc_%u_trigger", fn_oid); /************************************************************ * Lookup the internal proc name in the hashtable *************** *** 1127,1133 **** prodesc->arg_is_rel[i] = 1; if (i > 0) strcat(proc_internal_args, " "); ! sprintf(buf, "__PLTcl_Tup_%d", i + 1); strcat(proc_internal_args, buf); ReleaseSysCache(typeTup); continue; --- 1128,1134 ---- prodesc->arg_is_rel[i] = 1; if (i > 0) strcat(proc_internal_args, " "); ! snprintf(buf, sizeof(buf), "__PLTcl_Tup_%d", i + 1); strcat(proc_internal_args, buf); ReleaseSysCache(typeTup); continue; *************** *** 1140,1146 **** if (i > 0) strcat(proc_internal_args, " "); ! sprintf(buf, "%d", i + 1); strcat(proc_internal_args, buf); ReleaseSysCache(typeTup); --- 1141,1147 ---- if (i > 0) strcat(proc_internal_args, " "); ! snprintf(buf, sizeof(buf), "%d", i + 1); strcat(proc_internal_args, buf); ReleaseSysCache(typeTup); *************** *** 1177,1183 **** { if (!prodesc->arg_is_rel[i]) continue; ! sprintf(buf, "array set %d $__PLTcl_Tup_%d\n", i + 1, i + 1); Tcl_DStringAppend(&proc_internal_body, buf, -1); } } --- 1178,1185 ---- { if (!prodesc->arg_is_rel[i]) continue; ! snprintf(buf, sizeof(buf), "array set %d $__PLTcl_Tup_%d\n", ! i + 1, i + 1); Tcl_DStringAppend(&proc_internal_body, buf, -1); } } *************** *** 1475,1480 **** --- 1477,1483 ---- int ntuples; HeapTuple *volatile tuples; volatile TupleDesc tupdesc = NULL; + SPITupleTable *tuptable; sigjmp_buf save_restart; char *usage = "syntax error - 'SPI_exec " *************** *** 1557,1570 **** { case SPI_OK_UTILITY: Tcl_SetResult(interp, "0", TCL_VOLATILE); return TCL_OK; case SPI_OK_SELINTO: case SPI_OK_INSERT: case SPI_OK_DELETE: case SPI_OK_UPDATE: ! sprintf(buf, "%d", SPI_processed); Tcl_SetResult(interp, buf, TCL_VOLATILE); return TCL_OK; case SPI_OK_SELECT: --- 1560,1575 ---- { case SPI_OK_UTILITY: Tcl_SetResult(interp, "0", TCL_VOLATILE); + SPI_freetuptable(SPI_tuptable); return TCL_OK; case SPI_OK_SELINTO: case SPI_OK_INSERT: case SPI_OK_DELETE: case SPI_OK_UPDATE: ! snprintf(buf, sizeof(buf), "%d", SPI_processed); Tcl_SetResult(interp, buf, TCL_VOLATILE); + SPI_freetuptable(SPI_tuptable); return TCL_OK; case SPI_OK_SELECT: *************** *** 1607,1613 **** return TCL_ERROR; default: ! sprintf(buf, "%d", spi_rc); Tcl_AppendResult(interp, "pltcl: SPI_exec() failed - ", "unknown RC ", buf, NULL); return TCL_ERROR; --- 1612,1618 ---- return TCL_ERROR; default: ! snprintf(buf, sizeof(buf), "%d", spi_rc); Tcl_AppendResult(interp, "pltcl: SPI_exec() failed - ", "unknown RC ", buf, NULL); return TCL_ERROR; *************** *** 1645,1656 **** { if (ntuples > 0) pltcl_set_tuple_values(interp, arrayname, 0, tuples[0], tupdesc); ! sprintf(buf, "%d", ntuples); Tcl_SetResult(interp, buf, TCL_VOLATILE); memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart)); return TCL_OK; } /************************************************************ * There is a loop body - process all tuples and evaluate * the body on each --- 1650,1664 ---- { if (ntuples > 0) pltcl_set_tuple_values(interp, arrayname, 0, tuples[0], tupdesc); ! snprintf(buf, sizeof(buf), "%d", ntuples); Tcl_SetResult(interp, buf, TCL_VOLATILE); + SPI_freetuptable(SPI_tuptable); memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart)); return TCL_OK; } + tuptable = SPI_tuptable; + /************************************************************ * There is a loop body - process all tuples and evaluate * the body on each *************** *** 1668,1687 **** continue; if (loop_rc == TCL_RETURN) { memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart)); return TCL_RETURN; } if (loop_rc == TCL_BREAK) break; memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart)); return TCL_ERROR; } /************************************************************ * Finally return the number of tuples ************************************************************/ memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart)); ! sprintf(buf, "%d", ntuples); Tcl_SetResult(interp, buf, TCL_VOLATILE); return TCL_OK; } --- 1676,1699 ---- continue; if (loop_rc == TCL_RETURN) { + SPI_freetuptable(tuptable); memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart)); return TCL_RETURN; } if (loop_rc == TCL_BREAK) break; + SPI_freetuptable(tuptable); memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart)); return TCL_ERROR; } + SPI_freetuptable(tuptable); + /************************************************************ * Finally return the number of tuples ************************************************************/ memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart)); ! snprintf(buf, sizeof(buf), "%d", ntuples); Tcl_SetResult(interp, buf, TCL_VOLATILE); return TCL_OK; } *************** *** 1690,1696 **** /********************************************************************** * pltcl_SPI_prepare() - Builtin support for prepared plans * The Tcl command SPI_prepare ! * allways saves the plan using * SPI_saveplan and returns a key for * access. There is no chance to prepare * and not save the plan currently. --- 1702,1708 ---- /********************************************************************** * 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 * access. There is no chance to prepare * and not save the plan currently. *************** *** 1736,1742 **** * Allocate the new querydesc structure ************************************************************/ qdesc = (pltcl_query_desc *) malloc(sizeof(pltcl_query_desc)); ! sprintf(qdesc->qname, "%lx", (long) qdesc); qdesc->nargs = nargs; qdesc->argtypes = (Oid *) malloc(nargs * sizeof(Oid)); qdesc->arginfuncs = (FmgrInfo *) malloc(nargs * sizeof(FmgrInfo)); --- 1748,1754 ---- * Allocate the new querydesc structure ************************************************************/ qdesc = (pltcl_query_desc *) malloc(sizeof(pltcl_query_desc)); ! snprintf(qdesc->qname, sizeof(qdesc->qname), "%lx", (long) qdesc); qdesc->nargs = nargs; qdesc->argtypes = (Oid *) malloc(nargs * sizeof(Oid)); qdesc->arginfuncs = (FmgrInfo *) malloc(nargs * sizeof(FmgrInfo)); *************** *** 1815,1821 **** break; default: ! sprintf(buf, "unknown RC %d", SPI_result); reason = buf; break; --- 1827,1833 ---- break; default: ! snprintf(buf, sizeof(buf), "unknown RC %d", SPI_result); reason = buf; break; *************** *** 1846,1852 **** break; default: ! sprintf(buf, "unknown RC %d", SPI_result); reason = buf; break; --- 1858,1864 ---- break; default: ! snprintf(buf, sizeof(buf), "unknown RC %d", SPI_result); reason = buf; break; *************** *** 1897,1902 **** --- 1909,1915 ---- int ntuples; HeapTuple *volatile tuples = NULL; volatile TupleDesc tupdesc = NULL; + SPITupleTable *tuptable; sigjmp_buf save_restart; Tcl_HashTable *query_hash; *************** *** 2116,2129 **** { case SPI_OK_UTILITY: Tcl_SetResult(interp, "0", TCL_VOLATILE); return TCL_OK; case SPI_OK_SELINTO: case SPI_OK_INSERT: case SPI_OK_DELETE: case SPI_OK_UPDATE: ! sprintf(buf, "%d", SPI_processed); Tcl_SetResult(interp, buf, TCL_VOLATILE); return TCL_OK; case SPI_OK_SELECT: --- 2129,2144 ---- { case SPI_OK_UTILITY: Tcl_SetResult(interp, "0", TCL_VOLATILE); + SPI_freetuptable(SPI_tuptable); return TCL_OK; case SPI_OK_SELINTO: case SPI_OK_INSERT: case SPI_OK_DELETE: case SPI_OK_UPDATE: ! snprintf(buf, sizeof(buf), "%d", SPI_processed); Tcl_SetResult(interp, buf, TCL_VOLATILE); + SPI_freetuptable(SPI_tuptable); return TCL_OK; case SPI_OK_SELECT: *************** *** 2166,2172 **** return TCL_ERROR; default: ! sprintf(buf, "%d", spi_rc); Tcl_AppendResult(interp, "pltcl: SPI_exec() failed - ", "unknown RC ", buf, NULL); return TCL_ERROR; --- 2181,2187 ---- return TCL_ERROR; default: ! snprintf(buf, sizeof(buf), "%d", spi_rc); Tcl_AppendResult(interp, "pltcl: SPI_exec() failed - ", "unknown RC ", buf, NULL); return TCL_ERROR; *************** *** 2208,2218 **** if (ntuples > 0) pltcl_set_tuple_values(interp, arrayname, 0, tuples[0], tupdesc); memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart)); ! sprintf(buf, "%d", ntuples); Tcl_SetResult(interp, buf, TCL_VOLATILE); return TCL_OK; } /************************************************************ * There is a loop body - process all tuples and evaluate * the body on each --- 2223,2236 ---- if (ntuples > 0) pltcl_set_tuple_values(interp, arrayname, 0, tuples[0], tupdesc); memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart)); ! snprintf(buf, sizeof(buf), "%d", ntuples); Tcl_SetResult(interp, buf, TCL_VOLATILE); + SPI_freetuptable(SPI_tuptable); return TCL_OK; } + tuptable = SPI_tuptable; + /************************************************************ * There is a loop body - process all tuples and evaluate * the body on each *************** *** 2229,2248 **** continue; if (loop_rc == TCL_RETURN) { memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart)); return TCL_RETURN; } if (loop_rc == TCL_BREAK) break; memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart)); return TCL_ERROR; } /************************************************************ * Finally return the number of tuples ************************************************************/ memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart)); ! sprintf(buf, "%d", ntuples); Tcl_SetResult(interp, buf, TCL_VOLATILE); return TCL_OK; } --- 2247,2270 ---- continue; if (loop_rc == TCL_RETURN) { + SPI_freetuptable(tuptable); memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart)); return TCL_RETURN; } if (loop_rc == TCL_BREAK) break; + SPI_freetuptable(tuptable); memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart)); return TCL_ERROR; } + SPI_freetuptable(tuptable); + /************************************************************ * Finally return the number of tuples ************************************************************/ memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart)); ! snprintf(buf, sizeof(buf), "%d", ntuples); Tcl_SetResult(interp, buf, TCL_VOLATILE); return TCL_OK; } *************** *** 2258,2264 **** { char buf[64]; ! sprintf(buf, "%u", SPI_lastoid); Tcl_SetResult(interp, buf, TCL_VOLATILE); return TCL_OK; } --- 2280,2286 ---- { char buf[64]; ! snprintf(buf, sizeof(buf), "%u", SPI_lastoid); Tcl_SetResult(interp, buf, TCL_VOLATILE); return TCL_OK; } *************** *** 2300,2306 **** { arrptr = &arrayname; nameptr = &attname; ! sprintf(buf, "%d", tupno); Tcl_SetVar2(interp, arrayname, ".tupno", buf, 0); } --- 2322,2328 ---- { arrptr = &arrayname; nameptr = &attname; ! snprintf(buf, sizeof(buf), "%d", tupno); Tcl_SetVar2(interp, arrayname, ".tupno", buf, 0); }