Обсуждение: how do you call one pltcl function from another?
I tried mailing this last week, but I think it didn't get sent:
I defined a procedure
CREATE FUNCTION meta_class (varchar) RETURNS varchar AS '
...
' LANGUAGE 'pltcl';
This works fine. But when I want to call it from another tcl procedure I
get errors:
bf2=# CREATE FUNCTION foo (varchar) RETURNS varchar AS '
return [meta_class $1]
' LANGUAGE 'pltcl';
bf2'# bf2'# CREATE
bf2=# bf2=# select foo(class) from weapon_Types;
ERROR: pltcl: invalid command name "meta_class"
This IS possible -- isn't it?
-Jonathan
Jonathan Ellis wrote:
> I tried mailing this last week, but I think it didn't get sent:
>
> I defined a procedure
>
> CREATE FUNCTION meta_class (varchar) RETURNS varchar AS '
> ...
> ' LANGUAGE 'pltcl';
>
> This works fine. But when I want to call it from another tcl procedure I
> get errors:
> bf2=# CREATE FUNCTION foo (varchar) RETURNS varchar AS '
> return [meta_class $1]
> ' LANGUAGE 'pltcl';
>
> bf2'# bf2'# CREATE
>
> bf2=# bf2=# select foo(class) from weapon_Types;
> ERROR: pltcl: invalid command name "meta_class"
>
> This IS possible -- isn't it?
It is. The problem is that the internal name of the proc in
the Tcl interpreter doesn't have to do with the function
name. Due to possible function overloading (multiple
functions with same name but different arguments) this is
impossible.
You need to call it via SPI like
spi_exec "select meta_class($1) as retval"
return $retval
Jan
--
#======================================================================#
# It's easier to get forgiveness for being wrong than for being right. #
# Let's break this rule - forgive me. #
#================================================== JanWieck@Yahoo.com #
> You need to call it via SPI like > > spi_exec "select meta_class($1) as retval" > return $retval What kind of performance hit is there doing this vs two plpgsql functions? IIANM, you're creating two separate tcl interpreters this way, which seems expensive. -Jonathan
Jonathan Ellis wrote:
> > You need to call it via SPI like
> >
> > spi_exec "select meta_class($1) as retval"
> > return $retval
>
> What kind of performance hit is there doing this vs two plpgsql functions?
> IIANM, you're creating two separate tcl interpreters this way, which seems
> expensive.
You are actually calling the same interpreter again through
the SPI interface (parser, planner, optimizer, executor).
Really expensive.
Someone can skip anything but the executor by preparing a
saved plan, but that's still a waste of CPU. At the very
least, calling one function from the other is expensive in
any procedural language, that must use a general solution
because the called function could be defined in any language.
Jan
--
#======================================================================#
# It's easier to get forgiveness for being wrong than for being right. #
# Let's break this rule - forgive me. #
#================================================== JanWieck@Yahoo.com #