Re: Fwd: PreparedStatement.setObject(...) fails for OffsetDateTime when used in a merge statement
Lance Java via Hsqldb-user <[email protected]> Tue, 7 Mar 2023 19:13:25 +0000
| Newsgroups | gmane.comp.java.hsqldb.user |
|---|---|
| Message-ID | <CAN7Z0vQ=8gpqXx2jEi4wbGmZoHoRzwYy+wLPo_8391LFPuvykg@mail.gmail.com> |
--===============5243337243805489251== Content-Type: multipart/alternative; boundary="00000000000061f0be05f6543553" --00000000000061f0be05f6543553 Content-Type: text/plain; charset="UTF-8" Thanks, I'll try this... hopefully syntax works in hsqldb and oracle. I'm assuming I'll be setting the parameter as OffsetDateTime and not String? On Tue, 7 Mar 2023, 6:44 pm Fred Toussi via Hsqldb-user, < [email protected]> wrote: > I am aware that you don't need a cast for INSERT or UPDATE. You do need > one for MERGE. The reason is it is not generally possible to determine the > type of the stand-alone ? variable in a MERGE statement. The CAST gives it > the intended type. This issue currently affects the data time types and > will be fixed in the next release. Even after the fix, it is more efficient > to use CASTs in MERGE statements, which avoids internal conversion to > VARCHAR and back to the required type. > > > On Tue, Mar 7, 2023, at 16:02, Lance Java via Hsqldb-user wrote: > > Please see the failng test case at > https://gist.github.com/uklance/14fd8c27e34ffddbe504109009e4dcc3 which > shows the column type is TIMESTAMP WITH TIME ZONE > > @BeforeEach > public void beforeEach() throws Exception { > connection = > DriverManager.getConnection("jdbc:hsqldb:mem:test;sql.syntax_ora=true", > "test", "test"); > connection.createStatement().execute( > "CREATE TABLE SAMPLE (\n" + > " ID NUMERIC(12,0) PRIMARY KEY,\n" + > " CODE VARCHAR2(50)," + > " LAST_UPDATED TIMESTAMP WITH TIME ZONE,\n" + > ")" > ); > } > > > You can also use a CAST to the intended SQL type for the parameter > The failing test case shows that PreparedStatement.setObject(...) works > for OffsetDateTime for INSERT and UPDATE statements. Why is this only > failing for MERGE? > > On Tue, 7 Mar 2023 at 15:51, Fred Toussi via Hsqldb-user < > [email protected]> wrote: > > > You can also use a CAST to the intended SQL type for the parameter. > Assuming you want TIMESTAMP WITH TIME ZONE as the type: > > "MERGE INTO SAMPLE t " + > "USING (SELECT ? AS ID, ? AS CODE, CAST(? AS TIMESTAMP WITH TIME ZONE) AS > LAST_UPDATED FROM DUAL) val " + > > > On Tue, Mar 7, 2023, at 15:11, Lance Java via Hsqldb-user wrote: > > HSQLDB seems to fail for PreparedStatement.setObject(...) for > OffsetDateTime when used in a merge statement. > > This merge logic will fail > > private void merge2Sample(long id, String code, OffsetDateTime > createdDate) throws SQLException { > String sql = > "MERGE INTO SAMPLE t " + > "USING (SELECT ? AS ID, ? AS CODE, ? AS LAST_UPDATED FROM > DUAL) val " + > "ON (t.ID = val.ID) " + > "WHEN MATCHED THEN UPDATE SET t.CODE = val.CODE, > t.LAST_UPDATED = val.LAST_UPDATED " + > "WHEN NOT MATCHED THEN INSERT (ID, CODE, LAST_UPDATED) > VALUES (val.ID, val.CODE, val.LAST_UPDATED)"; > try (PreparedStatement ps = connection.prepareStatement(sql)) { > ps.setLong(1, id); > ps.setString(2, code); > ps.setObject(3, createdDate); > assertThat(ps.executeUpdate()).isEqualTo(1); > } > } > > As a workaround I can call PreparedStatement.setString(...) with a string > formatted using a DateTimeFormatter but I'd prefer not to > > private void merge1Sample(long id, String code, OffsetDateTime > createdDate) throws SQLException { > DateTimeFormatter dateFormatter = > DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSxxxxx"); > String sql = > "MERGE INTO SAMPLE t " + > "USING (SELECT ? AS ID, ? AS CODE, ? AS LAST_UPDATED FROM > DUAL) val " + > "ON (t.ID = val.ID) " + > "WHEN MATCHED THEN UPDATE SET t.CODE = val.CODE, > t.LAST_UPDATED = val.LAST_UPDATED " + > "WHEN NOT MATCHED THEN INSERT (ID, CODE, LAST_UPDATED) > VALUES (val.ID, val.CODE, val.LAST_UPDATED)"; > try (PreparedStatement ps = connection.prepareStatement(sql)) { > ps.setLong(1, id); > ps.setString(2, code); > ps.setString(3, dateFormatter.format(createdDate)); > assertThat(ps.executeUpdate()).isEqualTo(1); > } > } > > Please see the failing test case at > https://gist.github.com/uklance/14fd8c27e34ffddbe504109009e4dcc3 which > throws the following exception > > Caused by: org.hsqldb.HsqlException: data exception: invalid datetime > format > > at org.hsqldb.error.Error.error(Unknown Source) > > at org.hsqldb.error.Error.error(Unknown Source) > > at > org.hsqldb.types.DateTimeType.convertToDatetimeSpecial(Unknown Source) > > at org.hsqldb.types.DateTimeType.convertToType(Unknown Source) > > at org.hsqldb.ExpressionOp.getValue(Unknown Source) > > at org.hsqldb.StatementDML.getInsertData(Unknown Source) > > at org.hsqldb.StatementDML.executeMergeStatement(Unknown Source) > > at org.hsqldb.StatementDML.getResult(Unknown Source) > > at org.hsqldb.StatementDMQL.execute(Unknown Source) > > at org.hsqldb.Session.executeCompiledStatement(Unknown Source) > > at org.hsqldb.Session.execute(Unknown Source) > > ... 71 more > > _______________________________________________ > Hsqldb-user mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/hsqldb-user > > > _______________________________________________ > Hsqldb-user mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/hsqldb-user > > > _______________________________________________ > Hsqldb-user mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/hsqldb-user > > > _______________________________________________ > Hsqldb-user mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/hsqldb-user > --00000000000061f0be05f6543553 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable <div dir=3D"auto"><div>Thanks, I'll try this... hopefully syntax works = in hsqldb and oracle. I'm assuming I'll be setting the parameter as= OffsetDateTime and not String?=C2=A0</div><div dir=3D"auto"><br><div class= =3D"gmail_quote" dir=3D"auto"><div dir=3D"ltr" class=3D"gmail_attr">On Tue,= 7 Mar 2023, 6:44 pm Fred Toussi via Hsqldb-user, <<a href=3D"mailto:hsq= [email protected]">[email protected]</a>> w= rote:<br></div><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex= ;border-left:1px #ccc solid;padding-left:1ex"><u></u><div><div style=3D"fon= t-family:Arial">I am aware that you don't need a cast for INSERT or UPD= ATE. You do need one for MERGE. The reason is it is not generally possible = to determine the type of the stand-alone ? variable in a MERGE statement. T= he CAST gives it the intended type. This issue currently affects the data t= ime types and will be fixed in the next release. Even after the fix, it is = more efficient to use CASTs in MERGE statements, which avoids internal conv= ersion to VARCHAR and back to the required type.<br></div><div style=3D"fon= t-family:Arial"><br></div><div style=3D"font-family:Arial"><br></div><div>O= n Tue, Mar 7, 2023, at 16:02, Lance Java via Hsqldb-user wrote:<br></div><b= lockquote type=3D"cite" id=3D"m_-2609216729337246027qt"><div dir=3D"ltr"><d= iv>Please see the failng test case at <a href=3D"https://gist.github.com/uk= lance/14fd8c27e34ffddbe504109009e4dcc3" target=3D"_blank" rel=3D"noreferrer= ">https://gist.github.com/uklance/14fd8c27e34ffddbe504109009e4dcc3</a> whic= h shows the column type is=C2=A0TIMESTAMP WITH TIME ZONE<br></div><div><br>= </div><div><div>=C2=A0 =C2=A0 @BeforeEach<br></div><div>=C2=A0 =C2=A0 publi= c void beforeEach() throws Exception {<br></div><div>=C2=A0 =C2=A0 =C2=A0 = =C2=A0 connection =3D DriverManager.getConnection("jdbc:hsqldb:mem:tes= t;sql.syntax_ora=3Dtrue", "test", "test");<br></di= v><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 connection.createStatement().execute(<br= ></div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "C= REATE TABLE SAMPLE (\n" +<br></div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 " =C2=A0 ID NUMERIC(12,0) PRIMARY KEY,\n&q= uot; +<br></div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 " =C2=A0 CODE VARCHAR2(50)," +<br></div><div>=C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 " =C2=A0 LAST_UPDATED TIMEST= AMP WITH TIME ZONE,\n" +<br></div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 ")"<br></div><div>=C2=A0 =C2=A0 =C2=A0 = =C2=A0 );<br></div><div>=C2=A0 =C2=A0 }<br></div></div><div><br></div><div>= >=C2=A0<span style=3D"font-family:Arial">You can also use a CAST to the = intended SQL type for the parameter</span><br></div><div><span style=3D"fon= t-family:Arial">The failing=C2=A0test case shows that PreparedStatement.set= Object(...) works for OffsetDateTime for INSERT and UPDATE statements. Why = is this only failing for MERGE?</span><br></div></div><div><br></div><div><= div dir=3D"ltr">On Tue, 7 Mar 2023 at 15:51, Fred Toussi via Hsqldb-user &l= t;<a href=3D"mailto:[email protected]" target=3D"_blank" re= l=3D"noreferrer">[email protected]</a>> wrote:<br></div>= <blockquote style=3D"margin-top:0px;margin-right:0px;margin-bottom:0px;marg= in-left:0.8ex;border-left-color:rgb(204,204,204);border-left-style:solid;bo= rder-left-width:1px;padding-left:1ex"><div><div><u></u><br></div><div><div = style=3D"font-family:Arial">You can also use a CAST to the intended SQL typ= e for the parameter. Assuming you want TIMESTAMP WITH TIME ZONE as the type= :<br></div><div style=3D"font-family:Arial"><br></div><blockquote type=3D"c= ite" id=3D"m_-2609216729337246027qt-m_773025684330080279qt"><div dir=3D"ltr= "><div><div dir=3D"ltr"><div><div>"MERGE INTO SAMPLE t " +<br></d= iv><div>"USING (SELECT ? AS ID, ? AS CODE, CAST(? AS TIMESTAMP WITH TI= ME ZONE) AS LAST_UPDATED FROM DUAL) val " +<br></div></div></div></div= ></div></blockquote><div style=3D"font-family:Arial"><br></div><div>On Tue,= Mar 7, 2023, at 15:11, Lance Java via Hsqldb-user wrote:<br></div><blockqu= ote type=3D"cite" id=3D"m_-2609216729337246027qt-m_773025684330080279qt"><d= iv dir=3D"ltr"><div><div dir=3D"ltr">HSQLDB seems to fail for PreparedState= ment.setObject(...) for OffsetDateTime when used in a merge statement.<br><= /div><div dir=3D"ltr"><div><br></div><div>This merge logic will fail<br></d= iv><div><br></div><div><div>=C2=A0 =C2=A0 private void merge2Sample(long id= , String code, OffsetDateTime createdDate) throws SQLException =C2=A0{<br><= /div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 String sql =3D<br></div><div>=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "MERGE INTO SAMPLE t = " +<br></div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 "USING (SELECT ? AS ID, ? AS CODE, ? AS LAST_UPDATED FROM DUAL) va= l " +<br></div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 "ON (t.ID =3D val.ID) " +<br></div><div>=C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "WHEN MATCHED THEN UPDATE SET t= .CODE =3D val.CODE, t.LAST_UPDATED =3D val.LAST_UPDATED " +<br></div><= div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "WHEN NOT = MATCHED THEN INSERT (ID, CODE, LAST_UPDATED) VALUES (val.ID, val.CODE, val.= LAST_UPDATED)";<br></div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 try (Prepare= dStatement ps =3D connection.prepareStatement(sql)) {<br></div><div>=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ps.setLong(1, id);<br></div><div>=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ps.setString(2, code);<br></div><div>=C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ps.setObject(3, createdDate);<br></d= iv><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 assertThat(ps.executeUpda= te()).isEqualTo(1);<br></div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br></div><d= iv>=C2=A0 =C2=A0 }<br></div></div><div><br></div><div>As a workaround I can= call PreparedStatement.setString(...) with a string formatted using a Date= TimeFormatter but I'd prefer not to<br></div><div><br></div><div><div>= =C2=A0 =C2=A0 private void merge1Sample(long id, String code, OffsetDateTim= e createdDate) throws SQLException =C2=A0{<br></div><div>=C2=A0 =C2=A0 =C2= =A0 =C2=A0 DateTimeFormatter dateFormatter =3D DateTimeFormatter.ofPattern(= "yyyy-MM-dd HH:mm:ss.SSSxxxxx");<br></div><div>=C2=A0 =C2=A0 =C2= =A0 =C2=A0 String sql =3D<br></div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 "MERGE INTO SAMPLE t " +<br></div><div>=C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "USING (SELECT ? = AS ID, ? AS CODE, ? AS LAST_UPDATED FROM DUAL) val " +<br></div><div>= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "ON (t.ID =3D = val.ID) " +<br></div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 "WHEN MATCHED THEN UPDATE SET t.CODE =3D val.CODE, t.LAS= T_UPDATED =3D val.LAST_UPDATED " +<br></div><div>=C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "WHEN NOT MATCHED THEN INSERT (ID, = CODE, LAST_UPDATED) VALUES (val.ID, val.CODE, val.LAST_UPDATED)";<br><= /div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 try (PreparedStatement ps =3D connect= ion.prepareStatement(sql)) {<br></div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 ps.setLong(1, id);<br></div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 ps.setString(2, code);<br></div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 ps.setString(3, dateFormatter.format(createdDate));<br></div= ><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 assertThat(ps.executeUpdate= ()).isEqualTo(1);<br></div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br></div><div= >=C2=A0 =C2=A0 }<br></div></div><div><br></div><div>Please see the failing = test case at=C2=A0<a href=3D"https://gist.github.com/uklance/14fd8c27e34ffd= dbe504109009e4dcc3" style=3D"font-family:Verdana,"sans-serif"" ta= rget=3D"_blank" rel=3D"noreferrer">https://gist.github.com/uklance/14fd8c27= e34ffddbe504109009e4dcc3</a>=C2=A0which throws the following exception<br><= /div><div><div><br></div><div><p><span style=3D"font-family:Verdana,"s= ans-serif"">Caused by: org.hsqldb.HsqlException: data exception: inval= id datetime format<u></u><u></u></span><br></p><p><span style=3D"font-famil= y:Verdana,"sans-serif"">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 at org.hsqldb.error.Error.error(Unknown Source)<u></u><u></= u></span><br></p><p><span style=3D"font-family:Verdana,"sans-serif&quo= t;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 at org.hsqldb.er= ror.Error.error(Unknown Source)<u></u><u></u></span><br></p><p><span style= =3D"font-family:Verdana,"sans-serif"">=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 at org.hsqldb.types.DateTimeType.convertToDatet= imeSpecial(Unknown Source)<u></u><u></u></span><br></p><p><span style=3D"fo= nt-family:Verdana,"sans-serif"">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 at org.hsqldb.types.DateTimeType.convertToType(Unknow= n Source)<u></u><u></u></span><br></p><p><span style=3D"font-family:Verdana= ,"sans-serif"">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 at org.hsqldb.ExpressionOp.getValue(Unknown Source)<u></u><u></u></s= pan><br></p><p><span style=3D"font-family:Verdana,"sans-serif"">= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 at org.hsqldb.Statem= entDML.getInsertData(Unknown Source)<u></u><u></u></span><br></p><p><span s= tyle=3D"font-family:Verdana,"sans-serif"">=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 at org.hsqldb.StatementDML.executeMergeSt= atement(Unknown Source)<u></u><u></u></span><br></p><p><span style=3D"font-= family:Verdana,"sans-serif"">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 at org.hsqldb.StatementDML.getResult(Unknown Source)<u><= /u><u></u></span><br></p><p><span style=3D"font-family:Verdana,"sans-s= erif"">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 at org.h= sqldb.StatementDMQL.execute(Unknown Source)<u></u><u></u></span><br></p><p>= <span style=3D"font-family:Verdana,"sans-serif"">=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 at org.hsqldb.Session.executeCompil= edStatement(Unknown Source)<u></u><u></u></span><br></p><p><span style=3D"f= ont-family:Verdana,"sans-serif"">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 at org.hsqldb.Session.execute(Unknown Source)<u></= u><u></u></span><br></p><p><span style=3D"font-family:Verdana,"sans-se= rif"">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ... 71 mo= re</span><br></p></div></div></div></div></div><div><br></div><div>________= _______________________________________<br></div><div>Hsqldb-user mailing l= ist<br></div><div><a href=3D"mailto:[email protected]" targ= et=3D"_blank" rel=3D"noreferrer">[email protected]</a><br><= /div><div><a href=3D"https://lists.sourceforge.net/lists/listinfo/hsqldb-us= er" target=3D"_blank" rel=3D"noreferrer">https://lists.sourceforge.net/list= s/listinfo/hsqldb-user</a><br></div><div><br></div></blockquote><div style= =3D"font-family:Arial"><br></div></div><div>_______________________________= ________________<br></div><div>Hsqldb-user mailing list<br></div><div><a hr= ef=3D"mailto:[email protected]" target=3D"_blank" rel=3D"no= referrer">[email protected]</a><br></div><div><a href=3D"ht= tps://lists.sourceforge.net/lists/listinfo/hsqldb-user" rel=3D"noreferrer n= oreferrer" target=3D"_blank">https://lists.sourceforge.net/lists/listinfo/h= sqldb-user</a><br></div></div></blockquote></div><div><br></div><div>______= _________________________________________<br></div><div>Hsqldb-user mailing= list<br></div><div><a href=3D"mailto:[email protected]" ta= rget=3D"_blank" rel=3D"noreferrer">[email protected]</a><br= ></div><div><a href=3D"https://lists.sourceforge.net/lists/listinfo/hsqldb-= user" target=3D"_blank" rel=3D"noreferrer">https://lists.sourceforge.net/li= sts/listinfo/hsqldb-user</a><br></div><div><br></div></blockquote><div styl= e=3D"font-family:Arial"><br></div></div>___________________________________= ____________<br> Hsqldb-user mailing list<br> <a href=3D"mailto:[email protected]" target=3D"_blank" rel= =3D"noreferrer">[email protected]</a><br> <a href=3D"https://lists.sourceforge.net/lists/listinfo/hsqldb-user" rel=3D= "noreferrer noreferrer" target=3D"_blank">https://lists.sourceforge.net/lis= ts/listinfo/hsqldb-user</a><br> </blockquote></div></div></div> --00000000000061f0be05f6543553-- --===============5243337243805489251== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline --===============5243337243805489251== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Hsqldb-user mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/hsqldb-user --===============5243337243805489251==--