Обсуждение: function language type?
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
I am trying to write a function in the SQL procedural language. But when I
use type plpgsql, as the user's guide says, I get this error:
ERROR: Unrecognized language specified in a CREATE FUNCTION: 'plpgsql'.
Recognized languages are sql, C, internal and the created procedural
languages.
If I try setting the language to type sql, I get:
ERROR: parser: parse error at or near "alias"
The only occurance of the string alias is in these four lines, which are
below a DECLARE line, which is the first line of the function:
osec ALIAS FOR $1;
dsec ALIAS FOR $2;
who ALIAS FOR $3;
avoids ALIAS FOR $4;
And yes, the function has four parameters.
Any ideas?
Ian
P.S. Please keep the CC on this message, I want replies at both mailboxes.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.1 (GNU/Linux)
Comment: For info see http://www.gnupg.org
iD8DBQE5fSeJfn9ub9ZE1xoRAkshAJ9zzq3oq2Qu4NsICfNJmwelA58/YgCfcFyc
KjcG5GHUjCZOeXlURbDOqk4=
=Gn4j
-----END PGP SIGNATURE-----
Ian Turner <vectro@pipeline.com> writes:
> ERROR: Unrecognized language specified in a CREATE FUNCTION: 'plpgsql'.
> Recognized languages are sql, C, internal and the created procedural
> languages.
plpgsql is not installed by default. See "createlang plpgsql".
regards, tom lane
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
> plpgsql is not installed by default. See "createlang plpgsql".
OK. Now it barfs on this:
CREATE TEMPORARY TABLE NextHopTemp (
num integer REFERENCES Sectors PRIMARY KEY,
prev integer REFERENCES Sectors,
settled boolean,
cost integer,
);
RETURN 1;
with the error 'ERROR: copyObject: don't know how to copy 611'. Does this
mean one is not permitted to create tables (even temporaries!) in a
function?
Thanks for your advice,
Ian
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.1 (GNU/Linux)
Comment: For info see http://www.gnupg.org
iD8DBQE5fgQcfn9ub9ZE1xoRAm/oAKDbnXiIYmAaxWKe91t0Du/UiNYUjgCggFwA
ynGoNrrbLFV8ujrU8yUUBXM=
=wNrE
-----END PGP SIGNATURE-----
Ian Turner <vectro@pipeline.com> writes:
> with the error 'ERROR: copyObject: don't know how to copy 611'. Does this
> mean one is not permitted to create tables (even temporaries!) in a
> function?
At the moment, I think not. There's no fundamental reason why it
couldn't be done, just some unfinished legwork (like writing a copy
subroutine for CreateStmt parse nodes...)
regards, tom lane
Ian Turner <iant@mail.brainstorm.net> writes:
>>>> with the error 'ERROR: copyObject: don't know how to copy 611'. Does this
>>>> mean one is not permitted to create tables (even temporaries!) in a
>>>> function?
>>
>> At the moment, I think not. There's no fundamental reason why it
>> couldn't be done, just some unfinished legwork (like writing a copy
>> subroutine for CreateStmt parse nodes...)
> OK. How hard would this be?
Actually I think the copyObject support may be the only missing piece.
But don't quote me.
> And just out of curiosity, why is the process different if one is in a
> function?
The issue with plpgsql is it wants to prepare a saved plan for SQL
commands, so they don't have to be re-planned on every call. So that
means copying the parser output to someplace. A lot of utility-class
statement parsenodes aren't in copyObject's repertoire for some
reason (laziness long ago no doubt).
> Can one create tables using the perl, C, or TCL interfaces?
Offhand I think this would work out-of-the-box in pltcl and plperl,
because they don't do preplanning. This is also why you can do
something like "SELECT ... FROM $1" in those PLs and not in plpgsql:
they just form the command as a string and then run it through the
whole parse/plan process every time.
And of course you can do anything you want in C, if you don't mind
the learning curve.
regards, tom lane
Tom Lane wrote:
>
> > Can one create tables using the perl, C, or TCL interfaces?
>
> Offhand I think this would work out-of-the-box in pltcl and plperl,
> because they don't do preplanning. This is also why you can do
> something like "SELECT ... FROM $1" in those PLs and not in plpgsql:
> they just form the command as a string and then run it through the
> whole parse/plan process every time.
More than that. PL/Tcl supports saved plans, but also
supports direct SPI query execution. So it's the decision of
the function programmer, which queries to plan and save once
and which don't.
Jan
--
#======================================================================#
# It's easier to get forgiveness for being wrong than for being right. #
# Let's break this rule - forgive me. #
#================================================== JanWieck@Yahoo.com #
Ian Turner <iant@mail.brainstorm.net> writes:
> Looking at the source, I see the following parsenodes which are NOT
> supported by copyObject:
Uh, what version of the source are you looking at? Quite a few of
those *are* supported.
> Which of these is it worth supporting? I will implement the necessary
> _copy<type> functions.
The missing stuff is basically the 600-series node types; any XXXStmt
node that you want to be able to use in a plpgsql function needs to be
copiable. If you want to support CREATE TABLE you will likely find that
some more of the 700-series nodes are also needed for CREATE TABLE
infrastructure.
It is not worth your trouble to do this unless you are working from
current sources (CVS or a recent daily snapshot)...
regards, tom lane