Issue Details (XML | Word | Printable)

Key: CORE-3965
Type: Bug Bug
Status: Closed Closed
Resolution: Fixed
Priority: Blocker Blocker
Assignee: Adriano dos Santos Fernandes
Reporter: Frank Schlottmann-Goedde
Votes: 0
Watchers: 0
Operations

If you were logged in you would be able to see more operations.
Firebird Core

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

Created: 29/Oct/12 10:15 AM   Updated: 29/May/15 12:43 PM
Component/s: None
Affects Version/s: 3.0 Initial
Fix Version/s: 3.0 Alpha 1

Environment: probably all (tested on Windows 7 and Ubuntu 12.04)

QA Status: Done with caveats
Test Details:
NB: `UPDATE` statement in source sample (privided by ticket-starter) contains "set r.qty_ordered = r.ordernr - 1" - but there is NO such field in the table SALES.
Changed DML to: "update sales r set r.qty_ordered = :ordernr ..." -- i.e. use OUT-prameter "ordernr", see header of SP p_beteiligung_order.


 Description  « Hide
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 ; ^

 All   Comments   Change History   Subversion Commits      Sort Order: Ascending order - Click to sort in descending order
There are no comments yet on this issue.