parse error in function

Started by Uros Gruberover 22 years ago9 messagesgeneral
Jump to latest
#1Uros Gruber
uros@sir-mag.com

Hello!

I have problem with my function and I can find what's wrong.

WARNING: Error occurred while executing PL/pgSQL function fn_insert_entry_pending
WARNING: line 26 at SQL statement
ERROR: parser: parse error at or near "$1" at character 58

create or replace function "fn_insert_entry_pending"(varchar,varchar,varchar,varchar,varchar,boolean,boolean,date,int,int) returns integer as '
declare
email alias for $1;
caption alias for $2;
description alias for $3;
keywords alias for $4;
url alias for $5;
is_company alias for $6;
is_novelty alias for $7;
expire alias for $8;
category1 alias for $9;
category2 alias for $10;
tmp record;
id_entry_tmp integer;

begin
SELECT INTO tmp id_user FROM "user" WHERE id_user = email;
if not found then
execute ''INSERT INTO "user" (id_user) VALUES ('' || quote_literal(email) || '')'';
end if;
select into id_entry_tmp id_entry from "directory_entry" where url=url and is_novelty=is_novelty;

DELETE FROM "directory_entry_pending" WHERE "url"=url and "id_entry"=id_entry_tmp and "is_novelty"=is_novelty;

INSERT INTO "directory_entry_pending" (id_entry,id_user,caption,url,is_company,is_novelty,expire,hash) VALUES (id_entry_tmp,$1,$2,$5,$6,$7,$8,''1'');

return 1;
end;
' language 'plpgsql';

#2John Sidney-Woollett
johnsw@wardbrook.com
In reply to: Uros Gruber (#1)
Re: parse error in function

Have you got any funny characters in your function definition (like a TAB
character) - I can't tell from your e-mail.

I've seen problems before inserting function using psql when this is the
case.

John Sidney-Woollett

Uros said:

Show quoted text

Hello!

I have problem with my function and I can find what's wrong.

WARNING: Error occurred while executing PL/pgSQL function
fn_insert_entry_pending
WARNING: line 26 at SQL statement
ERROR: parser: parse error at or near "$1" at character 58

create or replace function
"fn_insert_entry_pending"(varchar,varchar,varchar,varchar,varchar,boolean,boolean,date,int,int)
returns integer as '
declare
email alias for $1;
caption alias for $2;
description alias for $3;
keywords alias for $4;
url alias for $5;
is_company alias for $6;
is_novelty alias for $7;
expire alias for $8;
category1 alias for $9;
category2 alias for $10;
tmp record;
id_entry_tmp integer;

begin
SELECT INTO tmp id_user FROM "user" WHERE id_user = email;
if not found then
execute ''INSERT INTO "user" (id_user) VALUES ('' ||
quote_literal(email) || '')'';
end if;
select into id_entry_tmp id_entry from "directory_entry" where url=url
and is_novelty=is_novelty;

DELETE FROM "directory_entry_pending" WHERE "url"=url and
"id_entry"=id_entry_tmp and "is_novelty"=is_novelty;

INSERT INTO "directory_entry_pending"
(id_entry,id_user,caption,url,is_company,is_novelty,expire,hash)
VALUES (id_entry_tmp,$1,$2,$5,$6,$7,$8,''1'');

return 1;
end;
' language 'plpgsql';

---------------------------(end of broadcast)---------------------------
TIP 7: don't forget to increase your free space map settings

#3Uros Gruber
uros@sir-mag.com
In reply to: John Sidney-Woollett (#2)
Re: parse error in function

Hello John,

This happen when i run my function and I check for this characters. I have
only spaces.

Thursday, January 15, 2004, 3:29:35 PM, you wrote:

JSW> Have you got any funny characters in your function definition (like a TAB
JSW> character) - I can't tell from your e-mail.

JSW> I've seen problems before inserting function using psql when this is the
JSW> case.

JSW> John Sidney-Woollett

JSW> Uros said:

Show quoted text

Hello!

I have problem with my function and I can find what's wrong.

WARNING: Error occurred while executing PL/pgSQL function
fn_insert_entry_pending
WARNING: line 26 at SQL statement
ERROR: parser: parse error at or near "$1" at character 58

create or replace function
"fn_insert_entry_pending"(varchar,varchar,varchar,varchar,varchar,boolean,boolean,date,int,int)
returns integer as '
declare
email alias for $1;
caption alias for $2;
description alias for $3;
keywords alias for $4;
url alias for $5;
is_company alias for $6;
is_novelty alias for $7;
expire alias for $8;
category1 alias for $9;
category2 alias for $10;
tmp record;
id_entry_tmp integer;

begin
SELECT INTO tmp id_user FROM "user" WHERE id_user = email;
if not found then
execute ''INSERT INTO "user" (id_user) VALUES ('' ||
quote_literal(email) || '')'';
end if;
select into id_entry_tmp id_entry from "directory_entry" where url=url
and is_novelty=is_novelty;

DELETE FROM "directory_entry_pending" WHERE "url"=url and
"id_entry"=id_entry_tmp and "is_novelty"=is_novelty;

INSERT INTO "directory_entry_pending"
(id_entry,id_user,caption,url,is_company,is_novelty,expire,hash)
VALUES (id_entry_tmp,$1,$2,$5,$6,$7,$8,''1'');

return 1;
end;
' language 'plpgsql';

---------------------------(end of broadcast)---------------------------
TIP 7: don't forget to increase your free space map settings

#4John Sidney-Woollett
johnsw@wardbrook.com
In reply to: Uros Gruber (#3)
Re: parse error in function

Apologies, I jumped the gun, amd misread your e-mail.

Isn't the syntax for "select into"...

select column1, column2 into variable1, variable2 from {yourtable} where
{some-condition};

Your statement would be:

SELECT id_user INTO tmp FROM user WHERE id_user = email;

See http://www.postgres.org/docs/current/interactive/sql-selectinto.html

Hope that helps.

John

Uros said:

Hello John,

This happen when i run my function and I check for this characters. I

have

only spaces.

Thursday, January 15, 2004, 3:29:35 PM, you wrote:

JSW> Have you got any funny characters in your function definition (like

a

TAB
JSW> character) - I can't tell from your e-mail.

JSW> I've seen problems before inserting function using psql when this

is

the
JSW> case.

JSW> John Sidney-Woollett

JSW> Uros said:

Hello!
I have problem with my function and I can find what's wrong.
WARNING: Error occurred while executing PL/pgSQL function
fn_insert_entry_pending
WARNING: line 26 at SQL statement
ERROR: parser: parse error at or near "$1" at character 58
create or replace function
"fn_insert_entry_pending"(varchar,varchar,varchar,varchar,varchar,boolean,boolean,date,int,int)

returns integer as '

declare
email alias for $1;
caption alias for $2;
description alias for $3;
keywords alias for $4;
url alias for $5;
is_company alias for $6;
is_novelty alias for $7;
expire alias for $8;
category1 alias for $9;
category2 alias for $10;
tmp record;
id_entry_tmp integer;
begin
SELECT INTO tmp id_user FROM "user" WHERE id_user = email; if not

found then

execute ''INSERT INTO "user" (id_user) VALUES ('' ||
quote_literal(email) || '')'';
end if;
select into id_entry_tmp id_entry from "directory_entry" where
url=url
and is_novelty=is_novelty;
DELETE FROM "directory_entry_pending" WHERE "url"=url and
"id_entry"=id_entry_tmp and "is_novelty"=is_novelty;
INSERT INTO "directory_entry_pending"
(id_entry,id_user,caption,url,is_company,is_novelty,expire,hash)

VALUES (id_entry_tmp,$1,$2,$5,$6,$7,$8,''1'');

return 1;
end;
' language 'plpgsql';
---------------------------(end of
broadcast)---------------------------
TIP 7: don't forget to increase your free space map settings

---------------------------(end of broadcast)---------------------------

TIP 2: you can get off all lists at once with the unregister command

Show quoted text

(send "unregister YourEmailAddressHere" to majordomo@postgresql.org)

#5Richard Huxton
dev@archonet.com
In reply to: Uros Gruber (#1)
Re: parse error in function

On Thursday 15 January 2004 14:25, Uros wrote:

Hello!

I have problem with my function and I can find what's wrong.

WARNING: Error occurred while executing PL/pgSQL function
fn_insert_entry_pending WARNING: line 26 at SQL statement
ERROR: parser: parse error at or near "$1" at character 58

Possibly unrelated, but what is this variable?

SELECT INTO tmp id_user FROM "user" WHERE id_user = email;

^^^

Also - make sure you haven't got a column called 'email' in any query where
you are using the variable 'email' - that can cause confusion.

--
Richard Huxton
Archonet Ltd

#6Uros Gruber
uros@sir-mag.com
In reply to: Richard Huxton (#5)
Re: parse error in function

Hello Richard,

Thursday, January 15, 2004, 4:10:10 PM, you wrote:

RH> On Thursday 15 January 2004 14:25, Uros wrote:

Hello!

I have problem with my function and I can find what's wrong.

WARNING: Error occurred while executing PL/pgSQL function
fn_insert_entry_pending WARNING: line 26 at SQL statement
ERROR: parser: parse error at or near "$1" at character 58

RH> Possibly unrelated, but what is this variable?

SELECT INTO tmp id_user FROM "user" WHERE id_user = email;

RH> ^^^

RH> Also - make sure you haven't got a column called 'email' in any query where
RH> you are using the variable 'email' - that can cause confusion.

Problem was aliases, becasu alias name was the same as column and then the
same name was value and rowname. I replace all names like email1 etc. and
it works. I hope ;).

--
Best regards,
Uros mailto:uros@sir-mag.com

#7Tom Lane
tgl@sss.pgh.pa.us
In reply to: Uros Gruber (#1)
Re: parse error in function

Uros <uros@sir-mag.com> writes:

I have problem with my function and I can find what's wrong.

Don't use plpgsql variable names that conflict with field names of the
tables you are trying to access in the function.

regards, tom lane

#8Richard Huxton
dev@archonet.com
In reply to: Uros Gruber (#6)
Re: parse error in function

On Thursday 15 January 2004 15:22, Uros wrote:

RH> Also - make sure you haven't got a column called 'email' in any query
where RH> you are using the variable 'email' - that can cause confusion.

Problem was aliases, becasu alias name was the same as column and then the
same name was value and rowname. I replace all names like email1 etc. and
it works. I hope ;).

The error messages could be a bit clearer with some of these problems - I've
had quite a bit of experience now decoding strange parser errors with
plpgsql.

--
Richard Huxton
Archonet Ltd

#9Tom Lane
tgl@sss.pgh.pa.us
In reply to: Richard Huxton (#8)
Re: parse error in function

Richard Huxton <dev@archonet.com> writes:

On Thursday 15 January 2004 15:22, Uros wrote:

RH> Also - make sure you haven't got a column called 'email' in any query
where RH> you are using the variable 'email' - that can cause confusion.

Problem was aliases, becasu alias name was the same as column and then the
same name was value and rowname. I replace all names like email1 etc. and
it works. I hope ;).

The error messages could be a bit clearer with some of these problems - I've
had quite a bit of experience now decoding strange parser errors with
plpgsql.

Would it help any if plpgsql showed the actual string fed to the main
SQL parser? In PG 7.4, the message you would get from Uros' example is

ERROR: syntax error at or near "$1" at character 58
CONTEXT: PL/pgSQL function "fn_insert_entry_pending" line 26 at SQL statement

but I think we could make it produce something like

ERROR: syntax error at or near "$1" at character 58
CONTEXT: PL/pgSQL function "fn_insert_entry_pending" line 26 at SQL statement "INSERT INTO "directory_entry_pending" (id_entry,id_user, $1 , $2 , $3 , $4 , $5 ,hash) VALUES ( $6 , $7 , $8 , $9 , $10 , $11 , $12 ,'1')"

I'm not sure if this would be helpful or just confusing. In particular
notice how the parameter symbols have been renumbered compared to what
was written in the function, which for reference is

INSERT INTO "directory_entry_pending" (id_entry,id_user,caption,url,is_company,is_novelty,expire,hash) VALUES (id_entry_tmp,$1,$2,$5,$6,$7,$8,''1'');

I can see that confusing someone. But at least this would give users a
reasonable shot at understanding what happened. Right now you have to
enable log_statement and dig in the postmaster log to see what's
happening under the hood. (That's how I got the correct string to
exhibit in the example above...)

regards, tom lane