aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2001-10-19 19:43:19 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2001-10-19 19:43:19 +0000
commit58f6b951c2ae18056757d22db769836b33b2c1b4 (patch)
treee89738fbdcd60b82651c3dfe06a48119dbc01a86
parent861a679fc131a7c75d3ac7a23728f02ff1c8ec03 (diff)
downloadpostgresql-58f6b951c2ae18056757d22db769836b33b2c1b4.tar.gz
postgresql-58f6b951c2ae18056757d22db769836b33b2c1b4.zip
Fix a lot of confusion between typlen and typmod. Didn't hurt too much
back when only varlena types paid any attention to typmod ...
-rw-r--r--src/pl/tcl/pltcl.c58
1 files changed, 28 insertions, 30 deletions
diff --git a/src/pl/tcl/pltcl.c b/src/pl/tcl/pltcl.c
index b929fea623d..0d04e1a76b8 100644
--- a/src/pl/tcl/pltcl.c
+++ b/src/pl/tcl/pltcl.c
@@ -31,7 +31,7 @@
* ENHANCEMENTS, OR MODIFICATIONS.
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/pl/tcl/pltcl.c,v 1.45 2001/10/19 02:43:46 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/pl/tcl/pltcl.c,v 1.46 2001/10/19 19:43:19 tgl Exp $
*
**********************************************************************/
@@ -107,7 +107,6 @@ typedef struct pltcl_proc_desc
int nargs;
FmgrInfo arg_out_func[FUNC_MAX_ARGS];
Oid arg_out_elem[FUNC_MAX_ARGS];
- int arg_out_len[FUNC_MAX_ARGS];
int arg_is_rel[FUNC_MAX_ARGS];
} pltcl_proc_desc;
@@ -123,8 +122,8 @@ typedef struct pltcl_query_desc
Oid *argtypes;
FmgrInfo *arginfuncs;
Oid *argtypelems;
+ bool *argbyvals;
Datum *argvalues;
- int *arglen;
} pltcl_query_desc;
@@ -353,7 +352,7 @@ pltcl_init_load_unknown(Tcl_Interp *interp)
/************************************************************
* There is a module named unknown. Resemble the
* source from the modsrc attributes and evaluate
- * it in the safe interpreter
+ * it in the Tcl interpreter
************************************************************/
fno = SPI_fnumber(SPI_tuptable->tupdesc, "modsrc");
@@ -468,7 +467,7 @@ pltcl_func_handler(PG_FUNCTION_ARGS)
/************************************************************
* Create the tcl command to call the internal
- * proc in the safe interpreter
+ * proc in the Tcl interpreter
************************************************************/
Tcl_DStringInit(&tcl_cmd);
Tcl_DStringInit(&list_tmp);
@@ -525,7 +524,7 @@ pltcl_func_handler(PG_FUNCTION_ARGS)
tmp = DatumGetCString(FunctionCall3(&prodesc->arg_out_func[i],
fcinfo->arg[i],
ObjectIdGetDatum(prodesc->arg_out_elem[i]),
- Int32GetDatum(prodesc->arg_out_len[i])));
+ Int32GetDatum(-1)));
UTF_BEGIN;
Tcl_DStringAppendElement(&tcl_cmd, UTF_E2U(tmp));
UTF_END;
@@ -567,7 +566,7 @@ pltcl_func_handler(PG_FUNCTION_ARGS)
}
/************************************************************
- * Convert the result value from the safe interpreter
+ * Convert the result value from the Tcl interpreter
* into its PostgreSQL data format and return it.
* Again, the function call could fire an elog and we
* have to count for the current interpreter level we are
@@ -823,7 +822,7 @@ pltcl_trigger_handler(PG_FUNCTION_ARGS)
}
/************************************************************
- * Convert the result value from the safe interpreter
+ * Convert the result value from the Tcl interpreter
* and setup structures for SPI_modifytuple();
************************************************************/
if (Tcl_SplitList(interp, interp->result,
@@ -902,8 +901,8 @@ pltcl_trigger_handler(PG_FUNCTION_ARGS)
ret_values[--i],
tupdesc->attrs[attnum - 1]->atttypid);
}
- typinput = (Oid) (((Form_pg_type) GETSTRUCT(typeTup))->typinput);
- typelem = (Oid) (((Form_pg_type) GETSTRUCT(typeTup))->typelem);
+ typinput = ((Form_pg_type) GETSTRUCT(typeTup))->typinput;
+ typelem = ((Form_pg_type) GETSTRUCT(typeTup))->typelem;
ReleaseSysCache(typeTup);
/************************************************************
@@ -1001,7 +1000,7 @@ compile_pltcl_function(Oid fn_oid, bool is_trigger)
* the in-/out-functions in the prodesc block and create
* a new hashtable entry for it.
*
- * Then we load the procedure into the safe interpreter.
+ * Then we load the procedure into the Tcl interpreter.
************************************************************/
if (hashent == NULL)
{
@@ -1122,8 +1121,7 @@ compile_pltcl_function(Oid fn_oid, bool is_trigger)
prodesc->arg_is_rel[i] = 0;
perm_fmgr_info(typeStruct->typoutput, &(prodesc->arg_out_func[i]));
- prodesc->arg_out_elem[i] = (Oid) (typeStruct->typelem);
- prodesc->arg_out_len[i] = typeStruct->typlen;
+ prodesc->arg_out_elem[i] = typeStruct->typelem;
if (i > 0)
strcat(proc_internal_args, " ");
@@ -1442,7 +1440,7 @@ pltcl_returnnull(ClientData cdata, Tcl_Interp *interp,
/**********************************************************************
* pltcl_SPI_exec() - The builtin SPI_exec command
- * for the safe interpreter
+ * for the Tcl interpreter
**********************************************************************/
static int
pltcl_SPI_exec(ClientData cdata, Tcl_Interp *interp,
@@ -1724,8 +1722,8 @@ pltcl_SPI_prepare(ClientData cdata, Tcl_Interp *interp,
qdesc->argtypes = (Oid *) malloc(nargs * sizeof(Oid));
qdesc->arginfuncs = (FmgrInfo *) malloc(nargs * sizeof(FmgrInfo));
qdesc->argtypelems = (Oid *) malloc(nargs * sizeof(Oid));
+ qdesc->argbyvals = (bool *) malloc(nargs * sizeof(bool));
qdesc->argvalues = (Datum *) malloc(nargs * sizeof(Datum));
- qdesc->arglen = (int *) malloc(nargs * sizeof(int));
/************************************************************
* Prepare to start a controlled return through all
@@ -1739,8 +1737,8 @@ pltcl_SPI_prepare(ClientData cdata, Tcl_Interp *interp,
free(qdesc->argtypes);
free(qdesc->arginfuncs);
free(qdesc->argtypelems);
+ free(qdesc->argbyvals);
free(qdesc->argvalues);
- free(qdesc->arglen);
free(qdesc);
ckfree((char *) args);
return TCL_ERROR;
@@ -1761,8 +1759,8 @@ pltcl_SPI_prepare(ClientData cdata, Tcl_Interp *interp,
perm_fmgr_info(((Form_pg_type) GETSTRUCT(typeTup))->typinput,
&(qdesc->arginfuncs[i]));
qdesc->argtypelems[i] = ((Form_pg_type) GETSTRUCT(typeTup))->typelem;
+ qdesc->argbyvals[i] = ((Form_pg_type) GETSTRUCT(typeTup))->typbyval;
qdesc->argvalues[i] = (Datum) NULL;
- qdesc->arglen[i] = (int) (((Form_pg_type) GETSTRUCT(typeTup))->typlen);
ReleaseSysCache(typeTup);
}
@@ -2035,10 +2033,10 @@ pltcl_SPI_execp(ClientData cdata, Tcl_Interp *interp,
memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart));
for (j = 0; j < callnargs; j++)
{
- if (qdesc->arglen[j] < 0 &&
+ if (!qdesc->argbyvals[j] &&
qdesc->argvalues[j] != (Datum) NULL)
{
- pfree((char *) (qdesc->argvalues[j]));
+ pfree(DatumGetPointer(qdesc->argvalues[j]));
qdesc->argvalues[j] = (Datum) NULL;
}
}
@@ -2060,7 +2058,7 @@ pltcl_SPI_execp(ClientData cdata, Tcl_Interp *interp,
FunctionCall3(&qdesc->arginfuncs[j],
CStringGetDatum(UTF_U2E(callargs[j])),
ObjectIdGetDatum(qdesc->argtypelems[j]),
- Int32GetDatum(qdesc->arglen[j]));
+ Int32GetDatum(-1));
UTF_END;
}
@@ -2090,9 +2088,9 @@ pltcl_SPI_execp(ClientData cdata, Tcl_Interp *interp,
memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart));
for (j = 0; j < callnargs; j++)
{
- if (qdesc->arglen[j] < 0 && qdesc->argvalues[j] != (Datum) NULL)
+ if (!qdesc->argbyvals[j] && qdesc->argvalues[j] != (Datum) NULL)
{
- pfree((char *) (qdesc->argvalues[j]));
+ pfree(DatumGetPointer(qdesc->argvalues[j]));
qdesc->argvalues[j] = (Datum) NULL;
}
}
@@ -2112,9 +2110,9 @@ pltcl_SPI_execp(ClientData cdata, Tcl_Interp *interp,
************************************************************/
for (j = 0; j < callnargs; j++)
{
- if (qdesc->arglen[j] < 0 && qdesc->argvalues[j] != (Datum) NULL)
+ if (!qdesc->argbyvals[j] && qdesc->argvalues[j] != (Datum) NULL)
{
- pfree((char *) (qdesc->argvalues[j]));
+ pfree(DatumGetPointer(qdesc->argvalues[j]));
qdesc->argvalues[j] = (Datum) NULL;
}
}
@@ -2338,8 +2336,8 @@ pltcl_set_tuple_values(Tcl_Interp *interp, char *arrayname,
attname, tupdesc->attrs[i]->atttypid);
}
- typoutput = (Oid) (((Form_pg_type) GETSTRUCT(typeTup))->typoutput);
- typelem = (Oid) (((Form_pg_type) GETSTRUCT(typeTup))->typelem);
+ typoutput = ((Form_pg_type) GETSTRUCT(typeTup))->typoutput;
+ typelem = ((Form_pg_type) GETSTRUCT(typeTup))->typelem;
ReleaseSysCache(typeTup);
/************************************************************
@@ -2355,7 +2353,7 @@ pltcl_set_tuple_values(Tcl_Interp *interp, char *arrayname,
outputstr = DatumGetCString(OidFunctionCall3(typoutput,
attr,
ObjectIdGetDatum(typelem),
- Int32GetDatum(tupdesc->attrs[i]->attlen)));
+ Int32GetDatum(tupdesc->attrs[i]->atttypmod)));
UTF_BEGIN;
Tcl_SetVar2(interp, *arrptr, *nameptr, UTF_E2U(outputstr), 0);
UTF_END;
@@ -2410,8 +2408,8 @@ pltcl_build_tuple_argument(HeapTuple tuple, TupleDesc tupdesc,
attname, tupdesc->attrs[i]->atttypid);
}
- typoutput = (Oid) (((Form_pg_type) GETSTRUCT(typeTup))->typoutput);
- typelem = (Oid) (((Form_pg_type) GETSTRUCT(typeTup))->typelem);
+ typoutput = ((Form_pg_type) GETSTRUCT(typeTup))->typoutput;
+ typelem = ((Form_pg_type) GETSTRUCT(typeTup))->typelem;
ReleaseSysCache(typeTup);
/************************************************************
@@ -2427,7 +2425,7 @@ pltcl_build_tuple_argument(HeapTuple tuple, TupleDesc tupdesc,
outputstr = DatumGetCString(OidFunctionCall3(typoutput,
attr,
ObjectIdGetDatum(typelem),
- Int32GetDatum(tupdesc->attrs[i]->attlen)));
+ Int32GetDatum(tupdesc->attrs[i]->atttypmod)));
Tcl_DStringAppendElement(retval, attname);
UTF_BEGIN;
Tcl_DStringAppendElement(retval, UTF_E2U(outputstr));