Thread: parse error in function
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';
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: > 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 >
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 >>
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 > (send "unregister YourEmailAddressHere" to majordomo@postgresql.org) >
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
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
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
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
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