function language type?

Started by Ian Turnerover 25 years ago7 messagesgeneral
Jump to latest
#1Ian Turner
vectro@pipeline.com

-----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-----

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Ian Turner (#1)
Re: function language type?

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

#3Ian Turner
vectro@pipeline.com
In reply to: Tom Lane (#2)
Re: function language type?

-----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-----

#4Tom Lane
tgl@sss.pgh.pa.us
In reply to: Ian Turner (#3)
Re: function language type?

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

#5Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tom Lane (#4)
Re: function language type?

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

#6'JanWieck@t-online.de'
JanWieck@t-online.de
In reply to: Tom Lane (#5)
Re: function language type?

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 #

#7Tom Lane
tgl@sss.pgh.pa.us
In reply to: 'JanWieck@t-online.de' (#6)
Re: function language type?

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