Hi all,
I'm not sure psql handles \dFp the right way. The query allows
translators to translate some columns' values but forgets to escape the
strings. So, here is a patch that escapes these translated strings.
Regards.
--
Guillaume.
http://www.postgresqlfr.org
http://dalibo.com
Index: src/bin/psql/describe.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/bin/psql/describe.c,v
retrieving revision 1.162
diff -c -r1.162 describe.c
*** src/bin/psql/describe.c 15 Nov 2007 21:14:42 -0000 1.162
--- src/bin/psql/describe.c 11 Dec 2007 18:04:09 -0000
***************
*** 2069,2112 ****
printQueryOpt myopt = pset.popt;
initPQExpBuffer(&buf);
!
! printfPQExpBuffer(&buf,
! "SELECT '%s' AS \"%s\", \n"
" p.prsstart::pg_catalog.regproc AS \"%s\", \n"
! " pg_catalog.obj_description(p.prsstart, 'pg_proc') as \"%s\" \n"
" FROM pg_catalog.pg_ts_parser p \n"
" WHERE p.oid = '%s' \n"
"UNION ALL \n"
! "SELECT '%s', \n"
" p.prstoken::pg_catalog.regproc, \n"
" pg_catalog.obj_description(p.prstoken, 'pg_proc') \n"
" FROM pg_catalog.pg_ts_parser p \n"
" WHERE p.oid = '%s' \n"
"UNION ALL \n"
! "SELECT '%s', \n"
" p.prsend::pg_catalog.regproc, \n"
" pg_catalog.obj_description(p.prsend, 'pg_proc') \n"
" FROM pg_catalog.pg_ts_parser p \n"
" WHERE p.oid = '%s' \n"
"UNION ALL \n"
! "SELECT '%s', \n"
" p.prsheadline::pg_catalog.regproc, \n"
" pg_catalog.obj_description(p.prsheadline, 'pg_proc') \n"
" FROM pg_catalog.pg_ts_parser p \n"
" WHERE p.oid = '%s' \n"
"UNION ALL \n"
! "SELECT '%s', \n"
" p.prslextype::pg_catalog.regproc, \n"
" pg_catalog.obj_description(p.prslextype, 'pg_proc') \n"
" FROM pg_catalog.pg_ts_parser p \n"
! " WHERE p.oid = '%s' \n",
! _("Start parse"),
! _("Method"), _("Function"), _("Description"),
! oid,
! _("Get next token"), oid,
! _("End parse"), oid,
! _("Get headline"), oid,
! _("Get token types"), oid
);
res = PSQLexec(buf.data, false);
--- 2069,2114 ----
printQueryOpt myopt = pset.popt;
initPQExpBuffer(&buf);
! appendPQExpBuffer(&buf, "SELECT ");
! appendStringLiteralConn(&buf, _("Start parse"), pset.db);
! appendPQExpBuffer(&buf, " AS \"%s\", \n"
" p.prsstart::pg_catalog.regproc AS \"%s\", \n"
! " pg_catalog.obj_description(p.prsstart, 'pg_proc') AS \"%s\" \n"
" FROM pg_catalog.pg_ts_parser p \n"
" WHERE p.oid = '%s' \n"
"UNION ALL \n"
! "SELECT ",
! _("Method"), _("Function"), _("Description"), oid);
! appendStringLiteralConn(&buf, _("Get next token"), pset.db);
! appendPQExpBuffer(&buf, ", \n"
" p.prstoken::pg_catalog.regproc, \n"
" pg_catalog.obj_description(p.prstoken, 'pg_proc') \n"
" FROM pg_catalog.pg_ts_parser p \n"
" WHERE p.oid = '%s' \n"
"UNION ALL \n"
! "SELECT ", oid);
! appendStringLiteralConn(&buf, _("End parse"), pset.db);
! appendPQExpBuffer(&buf, ", \n"
" p.prsend::pg_catalog.regproc, \n"
" pg_catalog.obj_description(p.prsend, 'pg_proc') \n"
" FROM pg_catalog.pg_ts_parser p \n"
" WHERE p.oid = '%s' \n"
"UNION ALL \n"
! "SELECT ", oid);
! appendStringLiteralConn(&buf, _("Get headline"), pset.db);
! appendPQExpBuffer(&buf, ", \n"
" p.prsheadline::pg_catalog.regproc, \n"
" pg_catalog.obj_description(p.prsheadline, 'pg_proc') \n"
" FROM pg_catalog.pg_ts_parser p \n"
" WHERE p.oid = '%s' \n"
"UNION ALL \n"
! "SELECT ", oid);
! appendStringLiteralConn(&buf, _("Get token types"), pset.db);
! appendPQExpBuffer(&buf, ", \n"
" p.prslextype::pg_catalog.regproc, \n"
" pg_catalog.obj_description(p.prslextype, 'pg_proc') \n"
" FROM pg_catalog.pg_ts_parser p \n"
! " WHERE p.oid = '%s' \n", oid
);
res = PSQLexec(buf.data, false);
---------------------------(end of broadcast)---------------------------
TIP 6: explain analyze is your friend