Bruce Momjian wrote:
+ /* + * Return the length of a datum, possibly compressed
+  */
+ Datum
+ pg_column_size(PG_FUNCTION_ARGS)
+ {
+       Datum                   value = PG_GETARG_DATUM(0);
+       int                             result;
+ + /* fn_extra stores the fixed column length, or -1 for varlena. */
+       if (fcinfo->flinfo->fn_extra == NULL)     /* first call? */
+       {
+               /* On the first call lookup the datatype of the supplied 
argument */

[...]

Is this optimization worth the code complexity?

+               tp = SearchSysCache(TYPEOID,
+                                                       
ObjectIdGetDatum(argtypeid),
+                                                       0, 0, 0);
+               if (!HeapTupleIsValid(tp))
+               {
+                       /* Oid not in pg_type, should never happen. */
+                       ereport(ERROR,
+                                       (errcode(ERRCODE_INTERNAL_ERROR),
+                                        errmsg("invalid typid: %u", 
argtypeid)));
+               }

elog(ERROR) is usually used for "can't happen" errors; also, the usual error message in this scenario is "cache lookup failed [...]". Perhaps better to use get_typlen() here, anyway.

-Neil

---------------------------(end of broadcast)---------------------------
TIP 6: Have you searched our list archives?

              http://archives.postgresql.org

Reply via email to