SQL state: 42601. Execption handling.

Started by Цalmost 4 years ago3 messagesgeneral
Jump to latest
#1Ц
pfunk@mail.ru

Community, is that behavior is explainable ?
 
I suppose the reason of such behavior in different steps of code parsing, but can`t find any discussions or topics in documentation.
Сould someone clarify the situation for sure?
 
create   or   replace   function  dbo.func(result  out   int )  as  $$ begin  result =  1 ;  end ; $$  language  plpgsql;

-- 1 --
do  $$
declare
v_result  int ;
begin  
   select  p.result  from  dbo.func(d) p  into  v_result;
exception   when  SQLSTATE  '42601'   then
     raise   '42601' ;
   when   others   then  
     raise   'others' ;
end ;
$$
 
--Exception is handled. This is OK.
ERROR:   others
CONTEXT:  PL/pgSQL  function  inline_code_block line  9   at   RAISE
********** Error **********
ERROR:  others
SQL  state: P0001
Context: PL/pgSQL  function  inline_code_block line  9   at   RAISE

-- 2 --
do  $$
begin  
   select  p.result  from  dbo.func() p  into  v_result;
exception   when  SQLSTATE  '42601'   then
     raise   '42601' ;
   when   others   then  
     raise   'others' ;
end ;
$$
 
--Exception is not handled. This is the question.
ERROR:   "v_result"   is   not  a known variable
LINE  3 :    select  p.result  from  dbo.func() p  into  v_result;
********** Error **********
ERROR:  "v_result"   is   not  a known variable
SQL  state:  42601
Character :  57
   
----------------------------------------------------------------------
 
 
 

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Ц (#1)
Re: SQL state: 42601. Execption handling.

=?UTF-8?B?0KY=?= <pfunk@mail.ru> writes:

-- 2 --
do $$
begin
select p.result from dbo.func() p into v_result;
exception when SQLSTATE '42601' then
raise '42601' ;
when others then
raise 'others' ;
end ;
$$

--Exception is not handled. This is the question.
ERROR: "v_result" is not a known variable
LINE 3 : select p.result from dbo.func() p into v_result;

This error is thrown by the plpgsql parser, so you can't trap it
with "exception", any more than you could trap other syntax errors
detected by the parser. (As an extreme example, you could certainly
not trap it if you misspelled "exception".)

regards, tom lane

#3Kyotaro Horiguchi
horikyota.ntt@gmail.com
In reply to: Tom Lane (#2)
Re: SQL state: 42601. Execption handling.

At Tue, 07 Jun 2022 10:36:52 -0400, Tom Lane <tgl@sss.pgh.pa.us> wrote in

=?UTF-8?B?0KY=?= <pfunk@mail.ru> writes:

-- 2 --
do $$
begin
select p.result from dbo.func() p into v_result;
exception when SQLSTATE '42601' then
raise '42601' ;
when others then
raise 'others' ;
end ;
$$

--Exception is not handled. This is the question.
ERROR: "v_result" is not a known variable
LINE 3 : select p.result from dbo.func() p into v_result;

This error is thrown by the plpgsql parser, so you can't trap it
with "exception", any more than you could trap other syntax errors
detected by the parser. (As an extreme example, you could certainly
not trap it if you misspelled "exception".)

FWIW, you can see the difference as the following difference.

=# CREATE OR REPLACE FUNCTION f1() RETURNS void AS $$
declare
v_result int;
begin
select p.result from dbo.func(d) p into v_result;
end ;
$$ LANGUAGE plpgsql;
CREATE FUNCTION
(Succeeds. That is, plpgsql parser doesn't catch it.)
=# select f1();
ERROR: column "d" does not exist
(Caught by SQL parser executed at runtime)

=# CREATE OR REPLACE FUNCTION f2() RETURNS void AS $$
begin
select p.result from dbo.func() p into v_result;
end ;
$$ LANGUAGE plpgsql;
ERROR: "v_result" is not a known variable
LINE 3: select p.result from dbo.func() p into v_result;
(Fails, as plpgsql parser caught it.)

regards.

--
Kyotaro Horiguchi
NTT Open Source Software Center