Hi,

i think i found a critical bug in hsql. The following sql can reproduce this:

-- begin sql --
DROP TABLE test1 IF EXISTS;
DROP TABLE test2 IF EXISTS;
CREATE TABLE test1 (id int, b1 bit);
CREATE TABLE test2 (id int);
insert into test1 values(1,true);
insert into test2 values(2);

select id,null as b1 from test2
union
select id,b1 from test1;
-- end sql --

This causes an exception in the database process:
Exception in thread "HSQLDB Connection @b6ef8" java.lang.ClassCastException: java.lang.Boolean
   at org.hsqldb.rowio.RowOutputBase.writeData(Unknown Source)
   at org.hsqldb.Result.write(Unknown Source)
   at org.hsqldb.Result.write(Unknown Source)
   at org.hsqldb.ServerConnection.run(Unknown Source)
   at java.lang.Thread.run(Thread.java:595)

The jdbc query never returns a value, the sql client freezes.

This happens only on Client-Server databases. When i start an in-memory database (directly from DriverManager), it seems to work.

Below is a testcase to reproduce the problem.
Please send answers as copy to [EMAIL PROTECTED] since i'm not in the mailing list.

Michael.

-- testcase --

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

import junit.framework.TestCase;

import org.hsqldb.Server;
import org.hsqldb.ServerConstants;

public class HSQLJoinBugTest extends TestCase
{
   public void testHibernateUnionBug() throws Throwable
   {
       Server dbServer=new Server();
       dbServer.setDatabasePath(0,"mem:test");
       dbServer.start();
       do
       {
           try { Thread.sleep(100); } catch (Exception ex) {}
       } while (dbServer.getState()==ServerConstants.SERVER_STATE_OPENING);

       if (dbServer.getState()!=ServerConstants.SERVER_STATE_ONLINE)
throw new RuntimeException("Unable to start database Server (ServerState: "+
                   dbServer.getStateDescriptor()+")");
// load the driver
       new org.hsqldb.jdbcDriver();
       // connect to the database
Connection db=DriverManager.getConnection("jdbc:hsqldb:hsql://localhost","sa","");
       Statement st=db.createStatement();
st.execute("CREATE TABLE test1 (id int, b1 bit)");
       st.execute("CREATE TABLE test2 (id int)");
       st.execute("INSERT INTO test1 VALUES(1,true)");
       st.execute("INSERT INTO test2 VALUES(2)");
st.executeQuery("select id,null as b1 from test2 union select id,b1 from test1");
   }
}



-------------------------------------------------------
SF.Net email is sponsored by: Discover Easy Linux Migration Strategies
from IBM. Find simple to follow Roadmaps, straightforward articles,
informative Webcasts and more! Get everything you need to get up to
speed, fast. http://ads.osdn.com/?ad_id=7477&alloc_id=16492&op=click
_______________________________________________
hsqldb-developers mailing list
hsqldb-developers@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/hsqldb-developers

Reply via email to