Re: libpgtcl doesn't use UTF encoding of TCL - Mailing list pgsql-bugs

From Bruce Momjian
Subject Re: libpgtcl doesn't use UTF encoding of TCL
Date
Msg-id 200109051652.f85Gqb120891@candle.pha.pa.us
Whole thread Raw
In response to Re: libpgtcl doesn't use UTF encoding of TCL  (Reinhard Max <max@suse.de>)
Responses Re: libpgtcl doesn't use UTF encoding of TCL  (Reinhard Max <max@suse.de>)
List pgsql-bugs
> On Wed, 18 Jul 2001, Tom Lane wrote:
>
> > Reinhard Max <max@suse.de> writes:
> > > On Wed, 18 Jul 2001, Bruce Momjian wrote:
> > >> Do you have any idea how this will work with earlier TCL versions?
> >
> > > It won't. If pgtcl is supposed to still be able to compile with older
> > > versions of Tcl, the changes have to be made a compile time option.
> >
> > Please do that and resubmit the patch.
>
> Here it is, but I consider it still incomplete and I have not done
> exhaustive testing. Some more occurrences of PQexec and PQgetvalue
> need to be wrapped up with UTF8 conversion, but I'll not have the time
> to do it for the next 1-2 weeks.
>
> cu
>     Reinhard

I have a patch here that handles all the TCL/UTF issues.  Would you let
me know if it is OK?

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026
Index: configure.in
===================================================================
RCS file: /junk/pgsql/repo/pgsql/configure.in,v
retrieving revision 1.132
diff -u -r1.132 configure.in
--- configure.in    2001/08/01 23:52:50    1.132
+++ configure.in    2001/08/23 15:18:30
@@ -411,6 +411,21 @@


 #
+# If Tcl is enabled (above) then check for pltcl_utf
+#
+AC_MSG_CHECKING([whether to build with PL/Tcl with UTF support])
+if test "$with_tcl" = yes; then
+  PGAC_ARG_BOOL(enable, pltcl-utf, no,
+                [  --enable-pltcl-utf      build PL/Tcl UTF support (if Tcl is enabled)],
+                [AC_DEFINE([ENABLE_PLTCL_UTF])])
+else
+  enable_pltcl_utf=no
+fi
+AC_MSG_RESULT([$enable_pltcl_utf])
+AC_SUBST([enable_pltcl_utf])
+
+
+#
 # Optionally build Perl modules (Pg.pm and PL/Perl)
 #
 AC_MSG_CHECKING([whether to build Perl modules])
Index: doc/src/sgml/installation.sgml
===================================================================
RCS file: /junk/pgsql/repo/pgsql/doc/src/sgml/installation.sgml,v
retrieving revision 1.50
diff -u -r1.50 installation.sgml
--- doc/src/sgml/installation.sgml    2001/06/02 18:25:16    1.50
+++ doc/src/sgml/installation.sgml    2001/08/24 12:39:53
@@ -674,6 +674,17 @@
       </varlistentry>

       <varlistentry>
+       <term>--enable-pltcl-utf</term>
+       <listitem>
+        <para>
+         Enables enables PL/Tcl Tcl_UtfToExternal and Tcl_ExternalToUtf
+         conversion support. These functions needed for Tcl versions 8.1
+         and above for proper handling of 8-bit characters.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
        <term>--enable-odbc</term>
        <listitem>
         <para>
Index: src/include/config.h.in
===================================================================
RCS file: /junk/pgsql/repo/pgsql/src/include/config.h.in,v
retrieving revision 1.170
diff -u -r1.170 config.h.in
--- src/include/config.h.in    2001/08/01 23:52:50    1.170
+++ src/include/config.h.in    2001/08/23 15:01:41
@@ -84,6 +84,9 @@
 /* --enable-pltcl-unknown */
 #undef ENABLE_PLTCL_UNKNOWN

+/* --enable-pltcl-utf */
+#undef ENABLE_PLTCL_UTF
+
 /* --enable-nls */
 #undef ENABLE_NLS

Index: src/pl/tcl/pltcl.c
===================================================================
RCS file: /junk/pgsql/repo/pgsql/src/pl/tcl/pltcl.c,v
retrieving revision 1.38
diff -u -r1.38 pltcl.c
--- src/pl/tcl/pltcl.c    2001/08/02 15:45:55    1.38
+++ src/pl/tcl/pltcl.c    2001/08/24 12:43:06
@@ -59,6 +59,18 @@
 #include "catalog/pg_language.h"
 #include "catalog/pg_type.h"

+#if defined(ENABLE_PLTCL_UTF) && TCL_MAJOR_VERSION == 8 \
+    && TCL_MINOR_VERSION > 0
+#    define UTF_BEGIN    do { Tcl_DString _pltcl_ds_tmp
+#       define UTF_END        Tcl_DStringFree(&_pltcl_ds_tmp); } while (0)
+#       define UTF_U2E(x)    (Tcl_UtfToExternalDString(NULL,(x),-1,&_pltcl_ds_tmp))
+#    define UTF_E2U(x)    (Tcl_ExternalToUtfDString(NULL,(x),-1,&_pltcl_ds_tmp))
+#else /* ENABLE_PLTCL_UTF */
+#    define    UTF_BEGIN
+#    define    UTF_END
+#    define    UTF_U2E(x)    (x)
+#    define    UTF_E2U(x)    (x)
+#endif /* ENABLE_PLTCL_UTF */

 /**********************************************************************
  * The information we cache about loaded procedures
@@ -333,7 +345,9 @@
                             SPI_tuptable->tupdesc, fno);
         if (part != NULL)
         {
-            Tcl_DStringAppend(&unknown_src, part, -1);
+            UTF_BEGIN;
+            Tcl_DStringAppend(&unknown_src, UTF_E2U(part), -1);
+            UTF_END;
             pfree(part);
         }
     }
@@ -613,7 +627,9 @@
         }
         proc_source = DatumGetCString(DirectFunctionCall1(textout,
                                   PointerGetDatum(&procStruct->prosrc)));
-        Tcl_DStringAppend(&proc_internal_body, proc_source, -1);
+        UTF_BEGIN;
+        Tcl_DStringAppend(&proc_internal_body, UTF_E2U(proc_source), -1);
+        UTF_END;
         pfree(proc_source);
         Tcl_DStringAppendElement(&proc_internal_def,
                                  Tcl_DStringValue(&proc_internal_body));
@@ -715,7 +731,9 @@
                                                     fcinfo->arg[i],
                               ObjectIdGetDatum(prodesc->arg_out_elem[i]),
                                 Int32GetDatum(prodesc->arg_out_len[i])));
-                Tcl_DStringAppendElement(&tcl_cmd, tmp);
+                UTF_BEGIN;
+                Tcl_DStringAppendElement(&tcl_cmd, UTF_E2U(tmp));
+                UTF_END;
                 pfree(tmp);
             }
         }
@@ -777,13 +795,15 @@
     if (SPI_finish() != SPI_OK_FINISH)
         elog(ERROR, "pltcl: SPI_finish() failed");

+    UTF_BEGIN;
     if (fcinfo->isnull)
         retval = (Datum) 0;
     else
         retval = FunctionCall3(&prodesc->result_in_func,
-                               PointerGetDatum(interp->result),
+                               PointerGetDatum(UTF_U2E(interp->result)),
                                ObjectIdGetDatum(prodesc->result_in_elem),
                                Int32GetDatum(-1));
+    UTF_END;

     /************************************************************
      * Finally we may restore normal error handling.
@@ -929,7 +949,9 @@

         proc_source = DatumGetCString(DirectFunctionCall1(textout,
                                   PointerGetDatum(&procStruct->prosrc)));
-        Tcl_DStringAppend(&proc_internal_body, proc_source, -1);
+        UTF_BEGIN;
+        Tcl_DStringAppend(&proc_internal_body, UTF_E2U(proc_source), -1);
+        UTF_END;
         pfree(proc_source);
         Tcl_DStringAppendElement(&proc_internal_def,
                                  Tcl_DStringValue(&proc_internal_body));
@@ -1230,11 +1252,13 @@
          ************************************************************/
         modnulls[attnum - 1] = ' ';
         fmgr_info(typinput, &finfo);
+        UTF_BEGIN;
         modvalues[attnum - 1] =
             FunctionCall3(&finfo,
-                          CStringGetDatum(ret_values[i++]),
+                          CStringGetDatum(UTF_U2E(ret_values[i++])),
                           ObjectIdGetDatum(typelem),
                    Int32GetDatum(tupdesc->attrs[attnum - 1]->atttypmod));
+        UTF_END;
     }

     rettup = SPI_modifytuple(trigdata->tg_relation, rettup, tupdesc->natts,
@@ -1558,7 +1582,9 @@
     /************************************************************
      * Execute the query and handle return codes
      ************************************************************/
-    spi_rc = SPI_exec(argv[query_idx], count);
+    UTF_BEGIN;
+    spi_rc = SPI_exec(UTF_U2E(argv[query_idx]), count);
+    UTF_END;
     memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart));

     switch (spi_rc)
@@ -1794,7 +1820,9 @@
     /************************************************************
      * Prepare the plan and check for errors
      ************************************************************/
-    plan = SPI_prepare(argv[1], nargs, qdesc->argtypes);
+    UTF_BEGIN;
+    plan = SPI_prepare(UTF_U2E(argv[1]), nargs, qdesc->argtypes);
+    UTF_END;

     if (plan == NULL)
     {
@@ -2078,11 +2106,13 @@
          ************************************************************/
         for (j = 0; j < callnargs; j++)
         {
+            UTF_BEGIN;
             qdesc->argvalues[j] =
                 FunctionCall3(&qdesc->arginfuncs[j],
-                              CStringGetDatum(callargs[j]),
+                              CStringGetDatum(UTF_U2E(callargs[j])),
                               ObjectIdGetDatum(qdesc->argtypelems[j]),
                               Int32GetDatum(qdesc->arglen[j]));
+            UTF_END;
         }

         /************************************************************
@@ -2377,7 +2407,9 @@
                                                          attr,
                                                ObjectIdGetDatum(typelem),
                               Int32GetDatum(tupdesc->attrs[i]->attlen)));
-            Tcl_SetVar2(interp, *arrptr, *nameptr, outputstr, 0);
+            UTF_BEGIN;
+            Tcl_SetVar2(interp, *arrptr, *nameptr, UTF_E2U(outputstr), 0);
+            UTF_END;
             pfree(outputstr);
         }
         else
@@ -2448,7 +2480,9 @@
                                                ObjectIdGetDatum(typelem),
                               Int32GetDatum(tupdesc->attrs[i]->attlen)));
             Tcl_DStringAppendElement(retval, attname);
-            Tcl_DStringAppendElement(retval, outputstr);
+            UTF_BEGIN;
+            Tcl_DStringAppendElement(retval, UTF_E2U(outputstr));
+            UTF_END;
             pfree(outputstr);
         }
     }

pgsql-bugs by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: create view bug
Next
From: pgsql-bugs@postgresql.org
Date:
Subject: Bug #438: New users inherit permissions from dropped users