| /* Copyright (c) 2001-2009, The HSQL Development Group |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are met: |
| * |
| * Redistributions of source code must retain the above copyright notice, this |
| * list of conditions and the following disclaimer. |
| * |
| * Redistributions in binary form must reproduce the above copyright notice, |
| * this list of conditions and the following disclaimer in the documentation |
| * and/or other materials provided with the distribution. |
| * |
| * Neither the name of the HSQL Development Group nor the names of its |
| * contributors may be used to endorse or promote products derived from this |
| * software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, |
| * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| |
| package org.hsqldb.test; |
| |
| import java.sql.Connection; |
| import java.sql.DriverManager; |
| import java.sql.PreparedStatement; |
| import java.sql.ResultSet; |
| import java.sql.Statement; |
| import java.util.TimeZone; |
| import java.sql.SQLException; |
| |
| /** |
| * Date Test Case. |
| */ |
| public class TestDatetimeSimple extends junit.framework.TestCase { |
| |
| static { |
| try { |
| Class.forName("org.hsqldb.jdbcDriver"); |
| } catch (ClassNotFoundException cnfe) { |
| throw new RuntimeException( |
| "<clinit> failed. JDBC Driver class not in CLASSPATH"); |
| } |
| } |
| |
| public void testSimple() throws SQLException { |
| |
| Connection conn = DriverManager.getConnection("jdbc:hsqldb:mem:m", |
| "SA", ""); |
| ResultSet rs; |
| PreparedStatement ps; |
| Statement st = conn.createStatement(); |
| |
| st.executeUpdate("CREATE TABLE t(i int, d date)"); |
| st.executeUpdate("INSERT INTO t VALUES(1, '2008-11-27')"); |
| |
| rs = st.executeQuery("SELECT d FROM t"); |
| |
| rs.next(); |
| System.out.println("Object: " + rs.getObject("d") // |
| + " ; Timestamp: " + rs.getTimestamp("d") // |
| + " ; Date: " + rs.getDate("d") // |
| + " ; String: " + rs.getString("d")); |
| rs.close(); |
| |
| rs = st.executeQuery("SELECT count(*) c FROM t WHERE d = " |
| + "'2008-11-27'"); |
| |
| rs.next(); |
| System.out.println("Match? " + (rs.getInt("c") > 0)); |
| st.executeUpdate("DELETE FROM t"); |
| |
| /* This is prohibited: |
| |
| st.executeUpdate("INSERT INTO t VALUES(2, '2008-11-27 0:00:00')"); |
| |
| Q: Do we want to prohibit this, even though we permit the same |
| usage with PreparedStatement using a Timestamp, as follows? |
| |
| A: In the disallowed case, a String that is not a data string is used, |
| while in the other case, a timestamp object is used. It follows the |
| cast specification, which requires the String to be a valid date |
| string, and allows casting from a TIMESTAMP object to DATE |
| |
| */ |
| ps = conn.prepareStatement("INSERT INTO t VALUES(3, ?)"); |
| |
| ps.setTimestamp(1, java.sql.Timestamp.valueOf("2008-10-27 0:00:00")); |
| ps.execute(); |
| ps.close(); |
| |
| rs = st.executeQuery("SELECT d FROM t"); |
| |
| rs.next(); |
| System.out.println("Object: " + rs.getObject("d") // |
| + " ; Date: " + rs.getDate("d") // |
| + " ; Timestamp: " + rs.getTimestamp("d") + // |
| "; String: " + rs.getString("d")); |
| rs.close(); |
| |
| rs = st.executeQuery("SELECT count(*) c FROM t WHERE d = " |
| + "'2008-10-27'"); |
| |
| /* FRED: When the DATE value is inserted with a TIMESTAMP, |
| * all matches using a date fail. The query here fails regardless |
| * of what date I use. */ |
| rs.next(); |
| System.out.println("Match? " + (rs.getInt("c") > 0)); |
| |
| /** ******** TIMESTAMP COL BELOW ********* */ |
| st.executeUpdate("CREATE TABLE t2(i int, ts timestamp)"); |
| /* These all fail: |
| st.executeUpdate("INSERT INTO t2 VALUES(1, '2008-11-27')"); |
| st.executeUpdate("INSERT INTO t2 VALUES(1, timestamp '2008-11-27')"); |
| in both cases, the string is not a valid timestamp string |
| */ |
| st.executeUpdate( |
| "INSERT INTO t2 VALUES(1, timestamp '2008-11-27 12:30:00')"); |
| st.executeUpdate("INSERT INTO t2 VALUES(1, '2008-11-27 12:30:00')"); |
| |
| /** FOLLOWING ALL WORK AS EXPECTED: */ |
| ps = conn.prepareStatement("INSERT INTO t2 VALUES(2, ?)"); |
| |
| ps.setTimestamp(1, java.sql.Timestamp.valueOf("2008-10-27 0:00:00")); |
| ps.execute(); |
| ps.close(); |
| |
| rs = st.executeQuery("SELECT ts FROM t2"); |
| |
| rs.next(); |
| System.out.println("Object: " + rs.getObject("ts") // |
| + " ; Timestamp: " + rs.getTimestamp("ts") // |
| + " ; Date: " + rs.getObject("ts") // |
| + "; String: " + rs.getString("ts")); |
| rs.close(); |
| st.executeUpdate("SHUTDOWN"); |
| conn.close(); |
| } |
| |
| public void testValues() throws SQLException { |
| |
| Connection conn = DriverManager.getConnection("jdbc:hsqldb:mem:m", |
| "SA", ""); |
| ResultSet rs; |
| PreparedStatement ps; |
| String s; |
| Object o; |
| java.sql.Date d; |
| java.sql.Timestamp ts; |
| Statement st = conn.createStatement(); |
| |
| st.executeUpdate("CREATE TABLE t(d date)"); |
| st.executeUpdate("INSERT INTO t VALUES('2008-11-27')"); |
| |
| rs = st.executeQuery("SELECT d FROM t"); |
| |
| rs.next(); |
| |
| s = rs.getString("d"); |
| o = rs.getObject("d"); |
| d = rs.getDate("d"); |
| ts = rs.getTimestamp("d"); |
| |
| System.out.println("2008-11-27 INSERTED" + "\n String: " + s |
| + "\n Object: " + o + "\n Date: " + dump(d) |
| + "\n Timestamp: " + dump(ts) + '\n'); |
| rs.close(); |
| |
| rs = st.executeQuery("CALL CURRENT_DATE"); |
| |
| rs.next(); |
| |
| o = rs.getObject(1); |
| d = rs.getDate(1); |
| s = rs.getString(1); |
| ts = rs.getTimestamp(1); |
| |
| System.out.println("CURRENT_DATE @" + new java.util.Date() |
| + "\n String: " + s + "\n Object: " + o |
| + "\n Date: " + dump(d) + "\n Timestamp: " |
| + dump(ts) + '\n'); |
| rs.close(); |
| |
| rs = st.executeQuery("CALL LOCALTIMESTAMP"); |
| |
| rs.next(); |
| |
| o = rs.getObject(1); |
| s = rs.getString(1); |
| ts = rs.getTimestamp(1); |
| |
| System.out.println("LOCALTIMESTAMP @" + new java.util.Date() |
| + "\n String: " + s + "\n Object: " + o |
| + "\n Timestamp: " + dump(ts) + '\n'); |
| rs.close(); |
| |
| rs = st.executeQuery("CALL CURRENT_TIMESTAMP"); |
| |
| rs.next(); |
| |
| s = rs.getString(1); |
| o = rs.getObject(1); |
| ts = rs.getTimestamp(1); |
| |
| System.out.println("CURRENT_TIMESTAMP @" + new java.util.Date() |
| + "\n String: " + s + "\n Object: " + o |
| + "\n Timestamp: " + dump(ts) + '\n'); |
| rs.close(); |
| st.executeUpdate("SHUTDOWN"); |
| conn.close(); |
| } |
| |
| static public String dump(java.sql.Timestamp t) { |
| return "String (" + t.toString() + "), GMTString (" + t.toGMTString() |
| + "), LocalString (" + t.toLocaleString() + ')'; |
| } |
| |
| static public String dump(java.sql.Date d) { |
| return "String (" + d.toString() + "), GMTString (" + d.toGMTString() |
| + "), LocalString (" + d.toLocaleString() + ')'; |
| } |
| |
| public static void main(String[] argv) { |
| |
| TestDatetimeSimple testA = new TestDatetimeSimple(); |
| String[] zones = { "GMT-05:00" }; |
| |
| try { |
| for (int i = 0; i < zones.length; i++) { |
| TimeZone timeZone = TimeZone.getTimeZone(zones[i]); |
| |
| TimeZone.setDefault(timeZone); |
| testA.testSimple(); |
| testA.testValues(); |
| } |
| } catch (SQLException e) { |
| e.printStackTrace(); |
| } |
| } |
| } |