]> granicus.if.org Git - postgresql/commitdiff
Fix a lot of confusion between typlen and typmod. Didn't hurt too much
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 19 Oct 2001 19:43:19 +0000 (19:43 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 19 Oct 2001 19:43:19 +0000 (19:43 +0000)
back when only varlena types paid any attention to typmod ...

src/pl/tcl/pltcl.c

index b929fea623d3a0cd101aee4cfc066f0ef04fe02e..0d04e1a76b84329cd760ca6b2d38ea18c62c2fd9 100644 (file)
@@ -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));