libpgtcl doesn't use UTF encoding of TCL

From: pgsql-bugs(at)postgresql(dot)org
To: pgsql-bugs(at)postgresql(dot)org
Subject: libpgtcl doesn't use UTF encoding of TCL
Date: 2001-07-18 08:18:23
Message-ID: 200107180818.f6I8INj14514@hub.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs pgsql-hackers pgsql-interfaces

Eugene Faukin (elf(at)solvo(dot)ru) reports a bug with a severity of 2
The lower the number the more severe it is.

Short Description
libpgtcl doesn't use UTF encoding of TCL

Long Description
Modern versions of the TCL (8.2 at least) use UTF encoding to internal
storage of the text. libpgtcl uses TCL functions to insert strings directly
into TCL internal structure without any conversion.

Sample Code
I can suggest you next patch I use for myself:

diff -uNr postgresql-7.0.2.orig/src/interfaces/libpgtcl/pgtclCmds.c postgresql-7.0.2/src/interfaces/libpgtcl/pgtclCmds.c
--- postgresql-7.0.2.orig/src/interfaces/libpgtcl/pgtclCmds.c Wed Apr 12 21:17:11 2000
+++ postgresql-7.0.2/src/interfaces/libpgtcl/pgtclCmds.c Thu Nov 16 20:26:37 2000
@@ -431,6 +431,7 @@
Pg_ConnectionId *connid;
PGconn *conn;
PGresult *result;
+ Tcl_DString putString;

if (argc != 3)
{
@@ -449,7 +450,9 @@
return TCL_ERROR;
}

- result = PQexec(conn, argv[2]);
+ Tcl_UtfToExternalDString(NULL, argv[2], -1, &putString);
+ result = PQexec(conn, Tcl_DStringValue(&putString));
+ Tcl_DStringFree(&putString);

/* Transfer any notify events from libpq to Tcl event queue. */
PgNotifyTransferEvents(connid);
@@ -535,6 +538,7 @@
char *arrVar;
char nameBuffer[256];
const char *appendstr;
+ Tcl_DString retString;

if (argc < 3 || argc > 5)
{
@@ -685,11 +689,24 @@
}
#ifdef TCL_ARRAYS
for (i = 0; i < PQnfields(result); i++)
- Tcl_AppendElement(interp, tcl_value(PQgetvalue(result, tupno, i)));
+ {
+ Tcl_ExternalToUtfDString(NULL,
+ tcl_value(PQgetvalue(result,
+ tupno, i)),
+ -1, &retString);
+ Tcl_AppendElement(interp, Tcl_DStringValue(&retString));
+ }
#else
for (i = 0; i < PQnfields(result); i++)
- Tcl_AppendElement(interp, PQgetvalue(result, tupno, i));
+ {
+ Tcl_ExternalToUtfDString(NULL,
+ PQgetvalue(result, tupno, i),
+ -1, &retString);
+
+ Tcl_AppendElement(interp, Tcl_DStringValue(&retString));
+ }
#endif
+ Tcl_DStringFree(&retString);
return TCL_OK;
}
else if (strcmp(opt, "-tupleArray") == 0)
@@ -707,21 +724,35 @@
}
for (i = 0; i < PQnfields(result); i++)
{
- if (Tcl_SetVar2(interp, argv[4], PQfname(result, i),
+ Tcl_ExternalToUtfDString(NULL,
#ifdef TCL_ARRAYS
- tcl_value(PQgetvalue(result, tupno, i)),
+ tcl_value(PQgetvalue(result,
+ tupno, i)),
#else
- PQgetvalue(result, tupno, i),
+ PQgetvalue(result, tupno, i),
#endif
- TCL_LEAVE_ERR_MSG) == NULL)
- return TCL_ERROR;
+ -1, &retString);
+
+ if (Tcl_SetVar2(interp, argv[4], PQfname(result, i),
+ Tcl_DStringValue(&retString),
+ TCL_LEAVE_ERR_MSG) == NULL)
+ {
+ Tcl_DStringFree(&retString);
+ return TCL_ERROR;
+ }
}
+ Tcl_DStringFree(&retString);
return TCL_OK;
}
else if (strcmp(opt, "-attributes") == 0)
{
for (i = 0; i < PQnfields(result); i++)
- Tcl_AppendElement(interp, PQfname(result, i));
+ {
+ Tcl_ExternalToUtfDString(NULL, PQfname(result, i),
+ -1, &retString);
+ Tcl_AppendElement(interp, Tcl_DStringValue(&retString));
+ Tcl_DStringFree(&retString);
+ }
return TCL_OK;
}
else if (strcmp(opt, "-lAttributes") == 0)
@@ -1274,6 +1305,8 @@
column,
ncols;
Tcl_DString headers;
+ Tcl_DString retString;
+ Tcl_DString putString;
char buffer[2048];
struct info_s
{
@@ -1292,7 +1325,11 @@
if (conn == (PGconn *) NULL)
return TCL_ERROR;

- if ((result = PQexec(conn, argv[2])) == 0)
+ Tcl_UtfToExternalDString(NULL, argv[2], -1, &putString);
+ result = PQexec(conn, Tcl_DStringValue(&putString));
+ Tcl_DStringFree(&putString);
+
+ if (result == 0)
{
/* error occurred sending the query */
Tcl_SetResult(interp, PQerrorMessage(conn), TCL_VOLATILE);
@@ -1340,13 +1377,21 @@
Tcl_SetVar2(interp, argv[3], ".tupno", buffer, 0);

for (column = 0; column < ncols; column++)
- Tcl_SetVar2(interp, argv[3], info[column].cname,
+ {
+ Tcl_ExternalToUtfDString(NULL,
#ifdef TCL_ARRAYS
- tcl_value(PQgetvalue(result, tupno, column)),
+ tcl_value(PQgetvalue(result,
+ tupno,
+ column)),
#else
- PQgetvalue(result, tupno, column),
+ PQgetvalue(result, tupno, column),
#endif
- 0);
+ -1, &retString);
+
+ Tcl_SetVar2(interp, argv[3], info[column].cname,
+ Tcl_DStringValue(&retString), 0);
+ Tcl_DStringFree(&retString);
+ }

Tcl_SetVar2(interp, argv[3], ".command", "update", 0);

No file was uploaded with this report

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message jozzano 2001-07-18 09:23:41 BUG(fixed) in CREATE TABLE ADD CONSTRAINT...
Previous Message Keith F Irwin 2001-07-17 22:20:49 HELP! BUG? pg_dump mucks up grant/revoke

Browse pgsql-hackers by date

  From Date Subject
Next Message jerome crouigneau 2001-07-18 08:25:34 Memory management
Previous Message Zeugswetter Andreas SB 2001-07-18 08:14:28 AW: Idea: recycle WAL segments, don't delete/recreate ' em

Browse pgsql-interfaces by date

  From Date Subject
Next Message Henshall, Stuart - WCP 2001-07-18 08:58:17 RE: ODBC Problem
Previous Message Jamz 2001-07-18 00:10:31 ODBC Problem