Creating a procedure containing "case when" expression leads to a server crash:
-------------------------------------------------------------------------------

                 Key: CORE-3965
                 URL: http://tracker.firebirdsql.org/browse/CORE-3965
             Project: Firebird Core
          Issue Type: Bug
    Affects Versions: 3.0 Initial
         Environment: probably all (tested on Windows 7 and Ubuntu 12.04)
            Reporter: Frank Schlottmann-Goedde
            Priority: Blocker


Using the following script in isql against the employee database demonstrates 
the error

/*
Creating a procedure containing "case when" expression leads to a server crash:


Unbehandelte Ausnahme bei 0x779015de in firebird.exe: 0xC0000005: 
Zugriffsverletzung beim Lesen an Position 0x00000088.
Callstack according to msvc 8:
        ntdll.dll!779015de()    
        [Unten angegebene Rahmen sind möglicherweise nicht korrekt und/oder 
fehlen, keine Symbole geladen für ntdll.dll]        
        ntdll.dll!779015de()    
        ntdll.dll!778f014e()    
        msvcr80.dll!_strnicmp_l(const char * dst=0x02d271d4, const char * 
src=0x81ca1ed3, unsigned int count=24, localeinfo_struct * plocinfo=0x02d629f0) 
 Zeile 65 + 0xc Bytes C++
        engine12.dll!Firebird::MutexLockGuard::~MutexLockGuard()  Zeile 373     
C++
        engine12.dll!Firebird::MutexLockGuard::~MutexLockGuard()  Zeile 373     
C++
        engine12.dll!Firebird::MemoryPool::release(void * object=0x02d435d8)  
Zeile 559 + 0x8 Bytes     C++
        engine12.dll!Jrd::Parser::yyexpand()  Zeile 29341       C++
        engine12.dll!Jrd::Parser::yylex()  Zeile 21970  C++
        engine12.dll!Jrd::Parser::yylex1()  Zeile 29310 + 0x7 Bytes     C++
        engine12.dll!Jrd::Parser::parseAux()  Zeile 22810 + 0x7 Bytes   C++
        engine12.dll!Jrd::Parser::parse()  Zeile 96 + 0x5 Bytes C++
        engine12.dll!prepareStatement(Jrd::thread_db * tdbb=0x0028ef44, 
Jrd::dsql_dbb * database=0x00000000, Jrd::jrd_tra * transaction=0x02da0298, 
unsigned long textLength=1829, const char * text=0x00000000, unsigned short 
clientDialect=3, unsigned short parserVersion=2, bool isInternalRequest=false)  
Zeile 1598      C++
        engine12.dll!prepareRequest(Jrd::thread_db * tdbb=0x0028ef44, 
Jrd::dsql_dbb * database=0x02170018, Jrd::jrd_tra * transaction=0x02da0298, 
unsigned long textLength=1829, const char * text=0x00393d98, unsigned short 
clientDialect=3, unsigned short parserVersion=0, bool isInternalRequest=false)  
Zeile 1526 + 0x23 Bytes   C++
        engine12.dll!DSQL_execute_immediate(Jrd::thread_db * tdbb=0x0028ef44, 
Jrd::Attachment * attachment=0x02df0018, Jrd::jrd_tra * * 
tra_handle=0x0028f034, unsigned long length=1829, const char * 
string=0x00393d98, unsigned short dialect=32, unsigned long in_blr_length=0, 
const unsigned char * in_blr=0x00000000, unsigned long in_msg_length=0, const 
unsigned char * in_msg=0x00000000, unsigned long out_blr_length=0, const 
unsigned char * out_blr=0x00000000, unsigned long out_msg_length=0, unsigned 
char * out_msg=0x00000000, bool isInternalRequest=false)  Zeile 671 + 0x1c 
Bytes        C++
        engine12.dll!Jrd::JAttachment::execute(Firebird::IStatus * 
user_status=0x0028f104, Firebird::ITransaction * apiTra=0x02da0298, unsigned 
int length=1829, const char * string=0x00393d98, unsigned int dialect=32, 
unsigned int __formal=0, const Firebird::FbMessage * inMsgBuffer=0x0028f0f4, 
const Firebird::FbMessage * outMsgBuffer=0x0028f0e4)  Zeile 4388 C++
        fbclient.dll!Why::YAttachment::execute(Firebird::IStatus * 
status=0x0028f104, Firebird::ITransaction * transaction=0x003531b8, unsigned 
int length=1829, const char * string=0x00393d98, unsigned int dialect=32, 
unsigned int inMsgType=0, const Firebird::FbMessage * inMsgBuffer=0x0028f0f4, 
const Firebird::FbMessage * outMsgBuffer=0x0028f0e4)  Zeile 4405 + 0x25 Bytes   
C++
        firebird.exe!rem_port::execute_immediate(P_OP op=op_exec_immediate, 
p_sqlst * exnow=0x0028f858, packet * sendL=0x0028f360)  Zeile 2775 + 0x63 Bytes 
    C++
        firebird.exe!process_packet(rem_port * port=0x00391170, packet * 
sendL=0x0028f360, packet * receive=0x0028f654, rem_port * * result=0x0028f948)  
Zeile 4107     C++
        firebird.exe!SRVR_main(rem_port * main_port=0x00391170, unsigned short 
flags=32)  Zeile 1069 + 0x18 Bytes       C++
        firebird.exe!service_connection(rem_port * port=0x00000000)  Zeile 537 
+ 0x11 Bytes     C++
        firebird.exe!WinMain(HINSTANCE__ * hThisInst=0x00400000, HINSTANCE__ * 
__formal=0x00000000, char * lpszArgs=0x007d7dad, int nWndMode=10)  Zeile 295 + 
0x5 Bytes C++
        firebird.exe!__tmainCRTStartup()  Zeile 589 + 0x1d Bytes        C
        kernel32.dll!757933aa()         
        ntdll.dll!77919ef2()    
        ntdll.dll!77919ec5()    
*/
SET TERM ^ ;
create or alter procedure P_BETEILIGUNG_ORDER (
    GID char(36) character set ISO8859_1 collate ISO8859_1,
    ORDERNR integer,
    DIR smallint,
    MIT_FUEHRENDER char(1) character set ISO8859_1 collate ISO8859_1)
as
declare variable CUR_ORDERNR integer;
declare variable MAX_ORDERNR integer;
declare variable FK_REF char(36);
begin

  if (MIT_FUEHRENDER is null) then
    MIT_FUEHRENDER = 'F';

  
  select R.Qty_ORDERed, R.item_type
  from sales R
  where R.po_number = :GID
  into :CUR_ORDERNR, :FK_REF;
  
  if (ORDERNR is null) then
    ORDERNR = CUR_ORDERNR + coalesce(DIR, 0);

  if (ORDERNR <= case MIT_FUEHRENDER
                   when 'T' then 1
                   else 2
                 end) then
    ORDERNR = case MIT_FUEHRENDER
                when 'T' then 1
                else 2
              end;
  else
  begin
    select max(R.qty_ordered)
    from sales R
    where R.item_type = :FK_REF
    into :MAX_ORDERNR;
    if (ORDERNR > MAX_ORDERNR) then
      ORDERNR = MAX_ORDERNR;
  end

  if (ORDERNR = CUR_ORDERNR) then 
    exit;
  else
  if (ORDERNR < CUR_ORDERNR) then 
    update sales R
    set R.qty_ordered = R.qty_ordered + 1
    where R.item_type = :FK_REF and
          R.qty_ordered between :ORDERNR and :CUR_ORDERNR;
  else 
    update sales R
    set R.qty_ordered = R.ORDERNR - 1
    where R.qty_ordered = :FK_REF and
          R.qty_ordered between :CUR_ORDERNR and :ORDERNR;

  update sales R
  set R.qty_ordered = :ORDERNR
  where R.po_number = :GID;

end^
SET TERM ; ^

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://tracker.firebirdsql.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

       

------------------------------------------------------------------------------
The Windows 8 Center - In partnership with Sourceforge
Your idea - your app - 30 days.
Get started!
http://windows8center.sourceforge.net/
what-html-developers-need-to-know-about-coding-windows-8-metro-style-apps/
Firebird-Devel mailing list, web interface at 
https://lists.sourceforge.net/lists/listinfo/firebird-devel

Reply via email to