Uploaded image for project: 'Derby'
  1. Derby
  2. DERBY-5

Network Server Protocol error when select fails and "order by" is specified



    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • Network Server
    • None


      Reporting for Army, filed on derby-dev list.

      If, when using the Network Server, one tries to execute a select
      statement that fails because of an SQL exception (ex. divide-by-zero),
      and if an "order by" clause is specified as part of the select, the
      server will throw a distributed protocol exception, instead of the
      appropriate error.

      Repro (using the "ij" utility)

      ij> connect 'jdbc:derby:net://localhost:1527/myDB:user=u;password=p;';
      ij> create table t1 (i int, j int);
      0 rows inserted/updated/deleted
      ij> insert into t1 values (2,0);
      1 row inserted/updated/deleted

      – Without an "order by" it's fine...
      – (22012 ==> "Attempt to divide by zero.", which is fine)

      ij> select

      {fn mod(i,j)} from t1;
      ERROR 22012: DB2 SQL error: SQLCODE: -1, SQLSTATE: 22012, SQLERRMC: 22012

      – With an order by, it dies...

      ij> select {fn mod(i,j)}

      from t1 order by 1;

      ERROR 58009: Execution failed due to a distribution protocol error that
      caused deallocation of the conversation. A DRDA Data Stream Syntax Error
      was detected. Reason: 0x13


      The problem is in the DRDAConnThread.java file, "processCommands(...)"
      method, in the "case CodePoint.OPNQRY" block of code. In the case of an
      SQL exception, there's a call to "writer.clearBuffer()" that is used to
      ensure that only an OPNQFLRM is sent back to the client, not the
      OPNQRYRM and/or QRYDSC that may have been written to buffer before the
      OPNQFLRM. That call to "clearBuffer" has to be replaced with something
      smarter, so that instead of doing a full clear (which causes the problem
      shown above), it only backs out the buffer writes that it has made since
      beginning the "case CodePoint.OPNQRY" block...




            army A B
            tulika Tulika Agrawal
            0 Vote for this issue
            0 Start watching this issue