]> granicus.if.org Git - postgresql/commit
Apply Tcl_Init() to the "hold" interpreter created by pltcl.
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 25 Jan 2010 01:58:14 +0000 (01:58 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 25 Jan 2010 01:58:14 +0000 (01:58 +0000)
commite7dcfd05f3f0ac4c80d5bd26973a748230f9cbe1
tree00621ae14d1e54c138c445e279bc46f2f5443312
parent56cbb611ec749ba867a4cfc09c8b7df0f4446620
Apply Tcl_Init() to the "hold" interpreter created by pltcl.

You might think this is unnecessary since that interpreter is never used
to run code --- but it turns out that's wrong.  As of Tcl 8.5, the "clock"
command (alone among builtin Tcl commands) is partially implemented by
loaded-on-demand Tcl code, which means that it fails if there's not
unknown-command support, and also that it's impossible to run it directly
in a safe interpreter.  The way they get around the latter is that
Tcl_CreateSlave() automatically sets up an alias command that forwards any
execution of "clock" in a safe slave interpreter to its parent interpreter.
Thus, when attempting to execute "clock" in trusted pltcl, the command
actually executes in the "hold" interpreter, where it will fail if
unknown-command support hasn't been introduced by sourcing the standard
init.tcl script, which is done by Tcl_Init().  (This is a pretty dubious
design decision on the Tcl boys' part, if you ask me ... but they didn't.)

Back-patch all the way.  It's not clear that anyone would try to use ancient
versions of pltcl with a recent Tcl, but it's not clear they wouldn't, either.
Also add a regression test using "clock", in branches that have regression
test support for pltcl.

Per recent trouble report from Kyle Bateman.
src/pl/tcl/expected/pltcl_setup.out
src/pl/tcl/pltcl.c
src/pl/tcl/sql/pltcl_setup.sql