Thanks again.  Will review the test case and continue to work on the
problem.

Yes:  Sorry about lack of support for prepared DDL.  That's coming, but
almost certainly without parametric support.

----- Original Message -----
From: "Sebastian Kloska" <[EMAIL PROTECTED]>
To: "HSQLDB Developers" <[EMAIL PROTECTED]>; "Campbell
Boucher-Burnet" <[EMAIL PROTECTED]>
Sent: Friday, September 12, 2003 7:51 AM
Subject: Re: [Hsqldb-developers] Subqueries in prepared Statements ?


>   Hi ....
>
>   I've dwelled on it a little bit more and found out that
>   subqueries seem to be broken in prepared statements when
>   using virtual table names (e.g. select X."Title" from  "Books" X where
X."Price">20.
>
>   I've attached a test application which does the following.
>
>   <snip>
>   drop table a if exists
>   create cached table a (a int identity,b int)
>
>   create index bIdx on a(b)
>
>   insert into a(b) values(1)
>   insert into a(b) values(2)
>   insert into a(b) values(3)
>   insert into a(b) values(4)
>   insert into a(b) values(5)
>   insert into a(b) values(6)
>
>   /** Use a subquery to determine range to modify **/
>   update a set b=100 where b>(select b from a X where X.a=2)
>
>   /** Do the same with parameters and no virtual table name **/
>   update a set b=200 where b>(select b from a   where   a=?)
>
>   /** Do it with virtual table names **/
>   update a set b=300 where b>(select b from a X where X.a=?)
>   </snip>
>
>   The application supports the very same value (2) for the UPDATE
>   statement in all three cases and only stumbled over the third UPDATE
>   statement.
>
>   Hope that helps ....
>
>   P.S.
>
>   It also seems that PreparedStatement.execute() is very picky on
>   the kind of statement you are allowed to execute 'DROP' and 'INSERT'
>   statements seem to be rejected.
>
>
> Campbell Boucher-Burnet wrote:
> > Thanks Sebastian.  I'll take a look at this and add a test case in
> > org.hsqldb.test
> >
> > ----- Original Message -----
> > From: "Sebastian Kloska" <[EMAIL PROTECTED]>
> > To: "HSQLDB Developers" <[EMAIL PROTECTED]>
> > Sent: Thursday, September 11, 2003 9:30 AM
> > Subject: [Hsqldb-developers] Subqueries in prepared Statements ?
> >
> >
> >
> >>  Hi ...
> >>
> >>  In the readme.txt freadt mentions that IN(?,?)
> >>  statements in prepared statements are broken.
> >>
> >>  I can't find anything about in the bug tracker,
> >>  but I seem to have trouble with all kind of
> >>  subqueries in prepared statement in APLHA_O
> >>
> >>  e.g.
> >>
> >>  I have a lot stuff like
> >>
> >>  UPDATE a SET a.b=0
> >>    where a.c>(select MIN(d) FROM a WHERE e=X)
> >>
> >>  or alike:
> >>
> >>  When I execute the stuff interactively
> >>  it works find but whe X is set as a parameter
> >>  in a prepared statement I often get
> >>
> >>  'Single value expected'
> >>
> >>  What seems to be the problem ?
> >>
> >>  Cheers
> >>
> >>  S.,
> >>
> >>
> >>--
> >>**********************************
> >>Dr. Sebastian Kloska
> >>Head of Bioinformatics
> >>Scienion AG
> >>Volmerstr. 7a
> >>12489 Berlin
> >>phone: +49-(30)-6392-1708
> >>fax:   +49-(30)-6392-1701
> >>http://www.scienion.de
> >>**********************************
> >>
> >>
> >>
> >>-------------------------------------------------------
> >>This sf.net email is sponsored by:ThinkGeek
> >>Welcome to geek heaven.
> >>http://thinkgeek.com/sf
> >>_______________________________________________
> >>hsqldb-developers mailing list
> >>[EMAIL PROTECTED]
> >>https://lists.sourceforge.net/lists/listinfo/hsqldb-developers
> >>
> >
> >
>
>
> --
> **********************************
> Dr. Sebastian Kloska
> Head of Bioinformatics
> Scienion AG
> Volmerstr. 7a
> 12489 Berlin
> phone: +49-(30)-6392-1708
> fax:   +49-(30)-6392-1701
> http://www.scienion.de
> **********************************
>


----------------------------------------------------------------------------
----


>
> import java.sql.*;
> import java.io.*;
> import java.text.*;
>
> class PrepareTest {
>
>     private Connection con=null;
>
>     private class sqlStmt {
> boolean prepare;
> boolean update;
> String  command;
>
> sqlStmt(String c,boolean p,boolean u) {
>     prepare=p;
>     command =c;
>     update  = u;
> }
>     };
>
>     private sqlStmt[] stmtArray = {
> new sqlStmt("drop table a if exists",false,false),
> new sqlStmt("create cached table a (a int identity,b int)",false,false),
>
> new sqlStmt("create index bIdx on a(b)",false,false),
>
> new sqlStmt("insert into a(b) values(1)",true,true),
> new sqlStmt("insert into a(b) values(2)",true,true),
> new sqlStmt("insert into a(b) values(3)",true,true),
> new sqlStmt("insert into a(b) values(4)",true,true),
> new sqlStmt("insert into a(b) values(5)",true,true),
> new sqlStmt("insert into a(b) values(6)",true,true),
>
> new sqlStmt("update a set b=100 where b>(select b from a X where
X.a=2)",true,true),
> new sqlStmt("update a set b=200 where b>(select b from a where
a=?)",true,true),
> new sqlStmt("update a set b=300 where b>(select b from a X where
X.a=?)",true,true)
>     };
>
>     private Object[][] stmtArgs = {
> { },{ },{ },{ },{ },{ },{ },{ },{ },{},{new Integer(2)},{new Integer(2)}
>     };
>
>     public static void main (String[] argv) {
>
> Connection con = null;
>
> try {
>     String url = "jdbc:hsqldb:Test";
>     Class.forName("org.hsqldb.jdbcDriver");
>     con = java.sql.DriverManager.getConnection(url,"sa","");
>     System.err.println("SciSelect::connect -- connected to '" +url+"'");
> } catch(Exception e) {
>     System.err.println(" ?? main: Caught Exception "+e);
>     System.err.println(" - SHIT - ");
>     return;
> }
>
> PrepareTest  t=new PrepareTest(con);
>
> boolean b=t.test();
>
> System.err.println( b ? " -- OK -- " : " ?? FAILED ?? " );
> System.exit(0);
>     }
>
>     public PrepareTest(Connection c) {
> con = c;
>     }
>
>     public boolean test() {
>
>
> try {
>
>     int i=0;
>
>
>     for(i=0;i < stmtArray.length;i++) {
>
> int j;
>
> System.err.println(" -- #"+i+" ----------------------- ");
>
> if(stmtArray[i].prepare) {
>     PreparedStatement ps = null;
>     System.err.println(" -- preparing\n<<<\n" + stmtArray[i].command +
"\n>>>\n");
>     ps = con.prepareStatement(stmtArray[i].command);
>     System.err.print(" -- setting " + stmtArgs[i].length + " Args [");
>
>     for(j=0;j<stmtArgs[i].length;j++) {
> System.err.print( (j>0 ? "; " : "" ) + stmtArgs[i][j]);
> ps.setObject(j+1,stmtArgs[i][j]);
>     }
>
>     System.err.println("]");
>     System.err.println(" -- executing ");
>
>     if(stmtArray[i].update) {
> int r = ps.executeUpdate();
> System.err.println(" ***** ps.executeUpdate gave me "+r);
>     } else {
> boolean b = ps.execute();
> System.err.print(" ***** ps.execute gave me "+b);
>     }
> } else {
>     System.err.println(" -- executing directly\n<<<\n" +
stmtArray[i].command + "\n>>>\n");
>     Statement s = con.createStatement();
>     boolean   b = s.execute(stmtArray[i].command);
>     System.err.println(" ***** st.execute gave me "+b);
> }
>     }
> } catch(Exception e) {
>     System.err.println(" ?? Caught Exception "+e);
>     return false;
> }
> return true;
>     }
> }
>



-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
hsqldb-developers mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/hsqldb-developers

Reply via email to