/* Copyright (c) 2001-2010, 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.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class TestSchemaParse extends junit.framework.TestCase { Connection con = null; Statement statement; private static final String ipref = "INFORMATION_SCHEMA."; protected void setUp() throws Exception { Class.forName("org.hsqldb.jdbc.JDBCDriver"); con = DriverManager.getConnection("jdbc:hsqldb:mem:parsetest", "sa", ""); statement = con.createStatement(); execSQL("SET AUTOCOMMIT false", 0); execSQL("CREATE TABLE tsttbl (i INT, vc VARCHAR(100))", 0); execSQL("CREATE TABLE bigtbl (i INT, vc VARCHAR(100), i101 INT, i102 INT, " + "i103 INT, i104 INT, i105 INT, i106 INT, i107 INT, " + "i108 INT, i109 INT, i110 INT, i111 INT, i112 INT, " + "i113 INT, i114 INT, i115 INT, i116 INT, i117 INT, " + "i118 INT, i119 INT)", 0); execSQL("INSERT INTO tsttbl VALUES (1, 'one')", 1); execSQL("INSERT INTO tsttbl VALUES (2, 'two')", 1); execSQL("CREATE TABLE joinedtbl (i2 INT, vc2 VARCHAR(100))", 0); execSQL("INSERT INTO joinedtbl VALUES (2, 'zwei')", 1); execSQL("CREATE TABLE indexedtbl (i3 INT, vc3 VARCHAR(100))", 0); execSQL("INSERT INTO indexedtbl VALUES (3, 'tres')", 1); execSQL("CREATE TABLE triggedtbl (i4 INT, vc4 VARCHAR(100))", 0); // Can't test text tables in memory-only DB. //execSQL("CREATE TEXT TABLE texttbl (i5 INT, vc5 VARCHAR(100))", 0); execSQL("INSERT INTO triggedtbl VALUES (4, 'quatro')", 1); execSQL("CREATE FUNCTION tstali(VARCHAR(100)) RETURNS VARCHAR(100) " + "LANGUAGE JAVA EXTERNAL NAME " + "'CLASSPATH:org.hsqldb.test.BlaineTrig.capitalize'", 0); execSQL("CREATE UNIQUE INDEX tstind ON indexedtbl (i3)", 0); execSQL("CREATE SEQUENCE tstseq", 0); execSQL("CREATE TRIGGER tsttrig AFTER INSERT ON triggedtbl CALL \"" + "org.hsqldb.test.BlaineTrig\"", 0); execSQL("CREATE USER tstuser PASSWORD fake", 0); execSQL("CREATE TABLE constrainedtbl (i6 INT, vc6 VARCHAR(100), " + "CONSTRAINT ucons UNIQUE(i6))", 0); execSQL("CREATE TABLE primarytbl (i8 INT, i18 INT, vc8 VARCHAR(100), " + "UNIQUE(i8), UNIQUE(i18))", 0); execSQL( "CREATE TABLE foreigntbl (i7 INT, vc7 VARCHAR(100), " + "CONSTRAINT tstfk FOREIGN KEY (i7) REFERENCES primarytbl (i8))", 0); execSQL("CREATE TABLE playtbl (i9 INT, vc9 VARCHAR(100))", 0); execSQL("CREATE TABLE toindextbl (i10 INT, vc10 VARCHAR(100))", 0); execSQL("INSERT INTO toindextbl VALUES (10, 'zehn')", 1); // Do the view last since it can cause dependendies with indexes, etc. execSQL("CREATE VIEW tstview AS SELECT * FROM tsttbl WHERE i < 10", 0); execSQL("COMMIT", 0); } // Want to permit the SHUTDOWN SQL command in tearDown() to fail iff // the test method run has tested SHUTDOWN. private boolean shutdownTested = false; protected void tearDown() throws Exception { // Shut down to destroy all of the DB objects (only works because // it's an in-memory instance. execSQL("SHUTDOWN", shutdownTested); if (con != null) { con.close(); } super.tearDown(); } public void test2pTables() throws Exception { String prefix = "public."; execSQL("DROP VIEW tstview", 0); // Just so deps don't cause problems // Select commands assertEquals(2, queryRowCount("SELECT i FROM " + prefix + "tsttbl WHERE i IN (1, 2, 3)")); execSQL("CREATE TABLE " + prefix + "newtbl AS (SELECT * FROM tsttbl) WITH DATA", 0); assertEquals(2, queryRowCount("SELECT admin FROM " + ipref + "system_users")); assertEquals("Sub-query", 1, queryRowCount("SELECT vc FROM " + prefix + "tsttbl WHERE i = (\n" + " SELECT i2 FROM " + prefix + "joinedtbl\n" + ")")); assertEquals("Join", 1, queryRowCount("SELECT vc FROM " + prefix + "tsttbl, " + prefix + "joinedtbl\n" + "WHERE tsttbl.i = joinedtbl.i2\n" + "AND joinedtbl.vc2 = 'zwei'")); // Selects using Labels/Aliases assertEquals( 2, queryRowCount( "SELECT ali.i FROM " + prefix + "tsttbl ali WHERE ali.i IN (1, 2, 3)")); execSQL("CREATE TABLE " + prefix + "newtbl2 AS (SELECT * FROM tsttbl) WITH DATA", 0); execSQL("CREATE TABLE newtbl3 AS (SELECT * FROM " + prefix + "tsttbl ali) WITH DATA", 0); execSQL("CREATE TABLE "+ prefix + "newtbl4 AS (SELECT * FROM " + prefix + "tsttbl ali) WITH DATA", 0); assertEquals(2, queryRowCount("SELECT ali.admin FROM " + ipref + "system_users ali")); assertEquals("Sub-query", 1, queryRowCount("SELECT ali.vc FROM " + prefix + "tsttbl ali WHERE i = (\n" + " SELECT bali.i2 FROM " + prefix + "joinedtbl bali\n" + ")")); assertEquals("Join", 1, queryRowCount("SELECT ali.vc FROM " + prefix + "tsttbl ali, " + prefix + "joinedtbl bali\n" + "WHERE ali.i = bali.i2\n" + "AND bali.vc2 = 'zwei'")); /* Mixed aliases not working yet assertEquals("Join", 1, queryRowCount( "SELECT ali.vc FROM " + prefix + "tsttbl ali, " + prefix + "joinedtbl bali\nWHERE tsttbl.i = joinedtbl.i2\n" + "AND bali.vc2 = 'zwei'")); */ // Alter Table commands execSQL("ALTER TABLE " + prefix + "playtbl RENAME TO " + prefix + "renamedtbl", 0); execSQL("ALTER TABLE " + prefix + "renamedtbl RENAME TO " + prefix + "playtbl", 0); execSQL("ALTER TABLE " + prefix + "constrainedtbl ADD CONSTRAINT con1 CHECK (i6 > 4)", 0); execSQL("ALTER TABLE " + prefix + "tsttbl ADD COLUMN vco1 VARCHAR(100)", 0); execSQL("ALTER TABLE " + prefix + "tsttbl DROP COLUMN vco1", 0); execSQL("ALTER TABLE " + prefix + "tsttbl ADD COLUMN vco1 VARCHAR(100)", 0); execSQL("ALTER TABLE " + prefix + "tsttbl ALTER COLUMN vco1 RENAME TO j1", 0); execSQL("ALTER TABLE " + prefix + "constrainedtbl DROP CONSTRAINT con1", 0); execSQL("ALTER TABLE " + prefix + "foreigntbl DROP CONSTRAINT tstfk", 0); execSQL("ALTER TABLE " + prefix + "foreigntbl ADD CONSTRAINT tstfk FOREIGN KEY " + "(i7) REFERENCES primarytbl (i8)", 0); execSQL("ALTER TABLE " + prefix + "playtbl ADD CONSTRAINT ucons9 UNIQUE (i9)", 0); // Drop table command execSQL("DROP TABLE " + prefix + "playtbl", 0); // Set table readonly command execSQL("SET TABLE " + prefix + "tsttbl READONLY true", 0); execSQL("SET TABLE " + prefix + "tsttbl READONLY false", 0); // Create table commands execSQL("CREATE TABLE " + prefix + "tsttbly (i INT, vc VARCHAR(100))", 0); execSQL("CREATE CACHED TABLE " + prefix + "tsttblx (i INT, vc VARCHAR(100))", 0); execSQL("CREATE TABLE constrz (i6 INT, vc6 VARCHAR(100), " + "CONSTRAINT uconsz UNIQUE(i6))", 0); execSQL( "CREATE TABLE forztbl (i7 INT, vc7 VARCHAR(100), " + "CONSTRAINT tstfkz FOREIGN KEY (i7) REFERENCES primarytbl (i8))", 0); // Update command execSQL("UPDATE " + prefix + "tsttbl SET vc = 'eleven' WHERE i = 1", 1); // delete execSQL("DELETE FROM " + prefix + "tsttbl WHERE i = 1", 1); // grant, revoke execSQL("GRANT ALL ON " + prefix + "tsttbl TO tstuser", 0); execSQL("REVOKE ALL ON " + prefix + "tsttbl FROM tstuser RESTRICT", 0); } public void test2pViews() throws Exception { String prefix = "public."; assertEquals(2, queryRowCount("SELECT i FROM " + prefix + "tstview WHERE i IN (1, 2, 3)")); assertEquals(2, queryRowCount("SELECT i FROM tstview")); assertEquals(2, queryRowCount("SELECT ali.i FROM tstview ali")); assertEquals("Sub-query", 1, queryRowCount("SELECT vc FROM " + prefix + "tstview WHERE i = (\n" + " SELECT i2 FROM " + prefix + "joinedtbl\n" + ")")); assertEquals("Join", 1, queryRowCount("SELECT vc FROM " + prefix + "tstview, " + prefix + "joinedtbl\n" + "WHERE tstview.i = joinedtbl.i2\n" + "AND joinedtbl.vc2 = 'zwei'")); assertEquals( 2, queryRowCount( "SELECT i FROM " + prefix + "tstview ali WHERE ali.i IN (1, 2, 3)")); // view execSQL("CREATE VIEW " + prefix + "tstview2 AS SELECT * FROM tsttbl WHERE i < 10", 0); // grant, revoke execSQL("GRANT ALL ON " + prefix + "tstview TO tstuser", 0); execSQL("REVOKE ALL ON " + prefix + "tstview FROM tstuser RESTRICT", 0); // drop execSQL("DROP VIEW tstview", 0); } public void test2pSequences() throws Exception { String prefix = "public."; execSQL("CREATE SEQUENCE " + prefix + "tstseq2", 0); execSQL("ALTER SEQUENCE " + prefix + "tstseq RESTART WITH 23", 0); assertEquals(1, queryRowCount("SELECT next value FOR " + prefix + "tstseq FROM tsttbl WHERE i = 1")); execSQL("DROP SEQUENCE " + prefix + "tstseq", 0); } public void test2pConstraints() throws Exception { String prefix = "public."; // Some named constraints execSQL("CREATE TABLE constbl1 (i11 INT, vc12 VARCHAR(100), " + "CONSTRAINT " + prefix + "uconsw UNIQUE(vc12))", 0); execSQL("CREATE TABLE constbl2 (i11 INT, vc12 VARCHAR(100), " + "CONSTRAINT " + prefix + "chk CHECK (i11 > 4))", 0); execSQL("CREATE TABLE for2tbl (i7 INT, vc7 VARCHAR(100), " + "CONSTRAINT " + prefix + "tstfk2 FOREIGN KEY (i7) REFERENCES primarytbl (i8))", 0); execSQL("CREATE TABLE for3tbl (i7 INT, vc7 VARCHAR(100), " + "CONSTRAINT " + prefix + "tstpk2 PRIMARY KEY (i7))", 0); execSQL("ALTER TABLE constrainedtbl ADD CONSTRAINT " + prefix + "con1 CHECK (i6 > 4)", 0); execSQL("ALTER TABLE foreigntbl ADD CONSTRAINT " + prefix + "tstfkm FOREIGN KEY " + "(i7) REFERENCES primarytbl (i18)", 0); execSQL("ALTER TABLE for3tbl DROP CONSTRAINT " + prefix + "tstpk2", 0); } public void test2pIndexes() throws Exception { String prefix = "public."; execSQL("CREATE UNIQUE INDEX playind ON playtbl (i9)", 0); execSQL("CREATE UNIQUE INDEX bigind ON bigtbl (i)", 0); execSQL("CREATE UNIQUE INDEX " + prefix + "tstind2 ON tsttbl (i)", 0); execSQL("ALTER INDEX " + prefix + "playind RENAME TO renamedind", 0); execSQL("ALTER INDEX " + prefix + "renamedind RENAME TO " + prefix + "tstind22", 0); execSQL("ALTER INDEX tstind RENAME TO " + prefix + "renamedind", 0); execSQL("DROP INDEX " + prefix + "bigind", 0); } public void test2pAliases() throws Exception { String prefix = "public."; // All occurrences of "expect" in this method indicate bugs. // When fixed, don't change the value of "expect" in the method body. int expect = 0; expect = SQL_ABORT; execSQL("CREATE ALIAS " + prefix + "tstalias " + "FOR \"org.hsqldb.test.BlaineTrig.capitalize\"", expect); // Following should not throw an exception: /* assertEquals( expect, queryRowCount( "SELECT " + prefix + "tstalias('helo') FROM tsttbl WHERE i = 1")); */ } public void test2pTriggers() throws Exception { String prefix = "public."; execSQL("CREATE TRIGGER " + prefix + "tsttrig2 AFTER INSERT ON triggedtbl " + "CALL \"org.hsqldb.test.BlaineTrig\"", 0); execSQL("DROP TRIGGER " + prefix + "tsttrig", 0); } public void testSanityCheck() throws Exception { // All occurrences of "expect" in this method indicate bugs. // When fixed, change the value of "expect" to 0: int expect = SQL_ABORT; // The most basic CREATEs and INSERTs would have already failed // in the setup method. // Get rid of view early so it doesn't cause dependency problems. assertEquals(2, queryRowCount("SELECT i FROM tstview")); execSQL("DROP VIEW tstview", 0); execSQL("CREATE CACHED TABLE cachtbl (i INT, vc VARCHAR(100))", 0); execSQL("SET TABLE tsttbl READONLY true", 0); execSQL("SET TABLE tsttbl READONLY false", 0); execSQL("INSERT INTO tsttbl VALUES (11, 'eleven')", 1); assertEquals(1, queryRowCount("SELECT i FROM tsttbl WHERE i = 1")); assertEquals( 2, queryRowCount("SELECT i FROM tsttbl WHERE i IN (1, 2, 3)")); execSQL("ALTER SEQUENCE tstseq RESTART WITH 13", 0); execSQL("ALTER TABLE playtbl RENAME TO renamedtbl", 0); execSQL("ALTER TABLE renamedtbl RENAME TO playtbl", 0); execSQL("DROP INDEX tstind", 0); execSQL("DROP TABLE bigtbl", 0); execSQL("DROP SEQUENCE tstseq", 0); execSQL("SET FILES LOG SIZE 5", 0); // Following syntax is now obsolete. execSQL("SET PROPERTY \"hsqldb.first_identity\" 4", SQL_ABORT); execSQL("UPDATE tsttbl SET vc = 'eleven' WHERE i = 1", 1); execSQL( "ALTER TABLE constrainedtbl ADD CONSTRAINT con1 CHECK (i6 > 4)", 0); // Can't test text tables in in-memory DB. execSQL("COMMIT", 0); execSQL("DELETE FROM tsttbl WHERE i < 10", 2); assertEquals(1, queryRowCount("SELECT i FROM tsttbl")); execSQL("ROLLBACK", 0); assertEquals(3, queryRowCount("SELECT i FROM tsttbl")); // Remember that inserts must change after adding a column. execSQL("ALTER TABLE tsttbl ADD COLUMN vco1 VARCHAR(100)", 0); execSQL("ALTER TABLE tsttbl DROP COLUMN vco1", 0); execSQL("CREATE UNIQUE INDEX tstind ON tsttbl (i)", 0); execSQL("SET AUTOCOMMIT true", 0); execSQL("SET AUTOCOMMIT false", 0); execSQL("SET IGNORECASE true", 0); execSQL("SET IGNORECASE false", 0); execSQL("SET PASSWORD blah", 0); execSQL("SET PASSWORD 'blah'", 0); execSQL("SET DATABASE REFERENTIAL INTEGRITY true", 0); execSQL("GRANT ALL ON playtbl TO tstuser", 0); execSQL("REVOKE ALL ON playtbl FROM tstuser RESTRICT", 0); // TODO: These should not throw a Null Pointer exception. execSQL("ALTER INDEX tstind RENAME TO renamedind", 0); execSQL("ALTER INDEX renamedind RENAME TO tstind", 0); execSQL("ALTER USER tstuser SET PASSWORD frank", 0); execSQL("ALTER USER tstuser SET PASSWORD 'frank'", 0); execSQL("ALTER TABLE tsttbl ADD COLUMN vco1 VARCHAR(100)", 0); execSQL("ALTER TABLE tsttbl ALTER COLUMN vco1 RENAME TO j1", 0); execSQL("ALTER TABLE constrainedtbl DROP CONSTRAINT con1", 0); execSQL("ALTER TABLE foreigntbl DROP CONSTRAINT tstfk", 0); execSQL("ALTER TABLE foreigntbl ADD CONSTRAINT tstfk FOREIGN KEY " + "(i7) REFERENCES primarytbl (i8)", 0); assertEquals("Sub-query", 1, queryRowCount("SELECT vc FROM tsttbl WHERE i = (\n" + " SELECT i2 FROM joinedtbl\n" + ")")); assertEquals( "Join", 1, queryRowCount( "SELECT vc FROM tsttbl, joinedtbl WHERE tsttbl.i = joinedtbl.i2\n" + "AND joinedtbl.vc2 = 'zwei'")); // Over-specified table names assertEquals( "Over-specified Query 1", 1, queryRowCount("SELECT tsttbl.i FROM tsttbl WHERE tsttbl.i = 1")); assertEquals("Over-specified Query 2", 1, queryRowCount("SELECT tsttbl.i FROM tsttbl WHERE i = 1")); assertEquals("Over-specified Query 3", 1, queryRowCount("SELECT i FROM tsttbl WHERE tsttbl.i = 1")); // HSQLDB labels, Oracle aliases assertEquals("Trivial Label/alias 1", 1, queryRowCount("SELECT i FROM tsttbl ali WHERE i = 1")); assertEquals("Trivial Label/alias 2", 1, queryRowCount("SELECT i FROM tsttbl AS ali WHERE i = 1")); assertEquals( "Trivial Label/alias 3", 1, queryRowCount("SELECT ali.i FROM tsttbl ali WHERE i = 1")); assertEquals( "Trivial Label/alias 4", 1, queryRowCount("SELECT i FROM tsttbl ali WHERE ali.i = 1")); assertEquals( "Trivial Label/alias 5", 1, queryRowCount("SELECT ali.i FROM tsttbl ali WHERE ali.i = 1")); /** * Uncomment when this mixing of aliases and real names is fixed. * * assertEquals("Mixed Label/aliases 1", 1, queryRowCount( * "SELECT tsttbl.i FROM tsttbl ali WHERE i = 1")); * assertEquals("Mixed Label/aliases 2", 1, queryRowCount( * "SELECT i FROM tsttbl ali WHERE tsttbl.i = 1")); * assertEquals("Mixed Label/aliases 3", 1, queryRowCount( * "SELECT tsttbl.i FROM tsttbl ali WHERE tsttbl.i = 1")); * assertEquals("Mixed Label/aliases 4", 1, queryRowCount( * "SELECT tsttbl.i FROM tsttbl ali WHERE ali.i = 1")); * assertEquals("Mixed Label/aliases 5", 1, queryRowCount( * "SELECT ali.i FROM tsttbl ali WHERE tsttbl.i = 1")); */ assertEquals( "Join w/Labels/aliases 1", 1, queryRowCount( "SELECT vc FROM tsttbl ali1, joinedtbl ali2\n" + "WHERE i = i2 AND vc2 = 'zwei'")); assertEquals( "Join w/Labels/aliases 2", 1, queryRowCount( "SELECT vc FROM tsttbl ali1, joinedtbl ali2\n" + "WHERE ali1.i = i2 AND ali2.vc2 = 'zwei'")); assertEquals( "Join w/Labels/aliases 3", 1, queryRowCount( "SELECT ali1.vc FROM tsttbl ali1, joinedtbl ali2\n" + "WHERE ali1.i = i2 AND ali2.vc2 = 'zwei'")); assertEquals( "Join w/Labels/aliases 4", 1, queryRowCount( "SELECT ali1.vc FROM tsttbl ali1, joinedtbl ali2\n" + "WHERE i = i2 AND vc2 = 'zwei'")); /** * Uncomment when this mixing of aliases and real names is fixed. * assertEquals("Join w/Mixed Labels/aliases 1", 1, queryRowCount( * "SELECT vc FROM tsttbl ali1, joinedtbl ali2\n" * + "WHERE tsttbl.i = i2 AND vc2 = 'zwei'")); * assertEquals("Join w/Mixed Labels/aliases 2", 1, queryRowCount( * "SELECT vc FROM tsttbl ali1, joinedtbl ali2\n" * + "WHERE tsttbl.i = i2 AND joinedtbl.vc2 = 'zwei'")); * assertEquals("Join w/Mixed Labels/aliases 3", 1, queryRowCount( * "SELECT ali1.vc FROM tsttbl ali1, joinedtbl ali2\n" * + "WHERE ali1.i = i2 AND joinedtbl.vc2 = 'zwei'")); * assertEquals("Join w/Mixed Labels/aliases 4", 1, queryRowCount( * "SELECT tsttbl.vc FROM tsttbl ali1, joinedtbl ali2\n" * + "WHERE ali1.i = i2 AND ali2.vc2 = 'zwei'")); * assertEquals("Join w/Mixed Labels/aliases 5", 1, queryRowCount( * "SELECT tsttbl.vc FROM tsttbl ali1, joinedtbl ali2\n" * + "WHERE i = i2 AND vc2 = 'zwei'")); * assertEquals("Join w/Mixed Labels/aliases 6", 1, queryRowCount( * "SELECT tsttbl.vc FROM tsttbl ali1, joinedtbl ali2\n" * + "WHERE i = i2 AND joinedtbl.vc2 = 'zwei'")); */ execSQL("CHECKPOINT bad", expect); execSQL("INSERT INTO tsttbl(i, vc) VALUES (12, 'twelve')", 1); execSQL("CREATE TABLE newtbl AS (SELECT * FROM tsttbl) WITH DATA", 0); } public void testTwoPartKeywords() throws Exception { multiPartKeywords("public."); } public void testThreePartKeywords() throws Exception { multiPartKeywords("alpha.public."); } public void multiPartKeywords(String pref) throws Exception { /* * Search for "expect =". This indicates a bug that needs fixing. */ /* * IMPORTANT!!!! When fixed, the method should NOT change the * expect value from SQL_ABORT. * Where "expect" is used there is always a real error. */ int expect = SQL_ABORT; // If > 2 name parts. E.g. "x.y.z". boolean manyParter = (pref.lastIndexOf('.') != pref.indexOf('.')); // Prep for we will attempt to drop later execSQL("DROP VIEW tstview", 0); // Don't want dep. problems execSQL("CREATE TABLE adroptbl (i INT, vc VARCHAR(100))", 0); execSQL("CREATE TABLE bdroptbl (i INT, vc VARCHAR(100))", 0); execSQL("CREATE UNIQUE INDEX adropind ON adroptbl (i)", 0); execSQL("CREATE UNIQUE INDEX bdropind ON bdroptbl (i)", 0); execSQL("CREATE SEQUENCE bdropseq", 0); execSQL("CREATE SEQUENCE adropseq", 0); execSQL("CREATE TRIGGER adroptrig AFTER INSERT ON adroptbl CALL \"" + "org.hsqldb.test.BlaineTrig\"", 0); execSQL("CREATE TRIGGER bdroptrig AFTER INSERT ON bdroptbl CALL \"" + "org.hsqldb.test.BlaineTrig\"", 0); execSQL("CREATE VIEW adropviewx AS SELECT * FROM adroptbl", 0); execSQL("CREATE VIEW bdropviewx AS SELECT * FROM bdroptbl", 0); execSQL("ALTER TABLE playtbl ADD COLUMN newc VARCHAR(100)", 0); // prep execSQL("SET TABLE tsttbl READONLY false", 0); // reset execSQL("SET TABLE tsttbl READONLY " + pref + "true", expect); execSQL(pref + "CREATE SEQUENCE tstseqa", expect); execSQL(pref + "SET PROPERTY \"hsqldb.first_identity\" 4", expect); execSQL("SET " + pref + "PROPERTY \"hsqldb.first_identity\" 4", expect); /* This block not keywords, but other non-Strings */ execSQL("SELECT i FROM tsttbl WHERE i = " + pref + "1", expect); execSQL("SELECT i FROM tsttbl WHERE vc = " + pref + "'1.3'", expect); execSQL("SELECT i FROM tsttbl WHERE vc = " + pref + "1", expect); execSQL("SELECT i FROM tsttbl WHERE i = " + pref + "'1.3'", expect); execSQL("SELECT i FROM tsttbl WHERE " + pref + "1 = " + pref + "1", expect); execSQL("SELECT i FROM tsttbl WHERE " + pref + "'1.3' = " + pref + "'1.3'", expect); execSQL("SELECT i FROM tsttbl WHERE " + pref + "true = " + pref + "true", expect); execSQL("SELECT i FROM tsttbl WHERE i " + pref + "IN (2, 4)", expect); execSQL("SELECT i FROM tsttbl WHERE i < 3 y.AND i > 0", expect); execSQL("SELECT i FROM tsttbl WHERE i < y.3 AND i > 0", expect); execSQL("INSERT INTO tsttbl VALUES (" + pref + "1, 'one')", expect); execSQL("CREATE VIEW tstviewx AS SELECT " + pref + "* FROM tsttbl WHERE i < 10", expect); execSQL("DROP VIEW tstviewx IF EXISTS", 0); // reset execSQL("INSERT INTO tsttbl VALUES (1, " + pref + "'one')", expect); execSQL("CREATE UNIQUE INDEX tstinda ON toindextbl (" + pref + "i10)", expect); execSQL("DROP INDEX tstinda IF EXISTS", 0); // reset execSQL("CREATE VIEW tstviewx AS SELECT * FROM tsttbl WHERE i < " + pref + "10", expect); execSQL("DROP VIEW tstviewx IF EXISTS", 0); // reset execSQL("xDROP VIEW adropview", expect); execSQL("DROP xVIEW bdropview", expect); execSQL("xDROP TRIGGER adroptrig", expect); execSQL("DROP xTRIGGER bdroptrig", expect); execSQL("xDROP INDEX adropind", expect); execSQL("DROP xINDEX bdropind", expect); execSQL("xDROP TABLE adroptbl", expect); execSQL("DROP xTABLE bdroptbl", expect); execSQL("xDROP SEQUENCE adropseq", expect); execSQL("DROP xSEQUENCE bdropseq", expect); execSQL("SET LOGSIZE " + pref + "5", expect); // Can't test text tables in in-memory DB. execSQL(pref + "SET TABLE texttbl SOURCE \"test.csv;fs=|\"", expect); execSQL("SET " + pref + "TABLE texttbl SOURCE \"test.csv;fs=|\"", expect); execSQL("SET TABLE texttbl " + pref + "SOURCE \"test.csv;fs=|\"", expect); execSQL("SET TABLE texttbl SOURCE " + pref + "\"test.csv;fs=|\"", expect); execSQL("UPDATE tsttbl SET vc = " + pref + "'eleven' WHERE i = 1", expect); execSQL("UPDATE tsttbl SET vc = 'eleven' WHERE i = " + pref + "1", expect); execSQL("ALTER SEQUENCE tstseq RESTART WITH " + pref + "13", expect); execSQL("ALTER TABLE constrainedtbl ADD CONSTRAINT con1 CHECK (i6 > " + pref + "4)", expect); execSQL(pref + "INSERT INTO tsttbl VALUES (1, 'one')", expect); execSQL("INSERT " + pref + "INTO tsttbl VALUES (1, 'one')", expect); if (!manyParter) { expect = 1; } execSQL("INSERT INTO " + pref + "tsttbl VALUES (1, 'one')", expect); expect = SQL_ABORT; execSQL(pref + "DELETE FROM tsttbl WHERE i < 10", expect); execSQL("SELECT vc FROM " + pref + "tsttbl, " + pref + "joinedtbl WHERE tsttbl.i = joinedtbl.i2\n" + "AND joinedtbl.vc2 = 'zwei'", (manyParter ? SQL_ABORT : SQL_FAIL)); execSQL(pref + "SELECT i FROM tsttbl", expect); execSQL("SELECT i " + pref + "FROM tsttbl", expect); execSQL("SELECT i FROM tsttbl " + pref + "WHERE i > 0", expect); execSQL(pref + "CREATE ALIAS alpha.tstalia " + "FOR \"org.hsqldb.test.BlaineTrig.capitalize\"", expect); execSQL("CREATE " + pref + "ALIAS tstalib " + "FOR \"org.hsqldb.test.BlaineTrig.capitalize\"", expect); execSQL("CREATE ALIAS tstalic " + pref + "FOR \"org.hsqldb.test.BlaineTrig.capitalize\"", expect); execSQL("CREATE ALIAS tstalid " + "FOR " + pref + "\"org.hsqldb.test.BlaineTrig.capitalize\"", expect); execSQL("ALTER " + pref + "TABLE playtbl DROP COLUMN newc", expect); execSQL("CREATE " + pref + "SEQUENCE tstseqb", expect); execSQL("CREATE " + pref + "TRIGGER tsttrigx AFTER INSERT ON triggedtbl CALL '" + "org.hsqldb.test.BlaineTrig'", expect); execSQL("CREATE " + pref + "USER tstusera PASSWORD fake", expect); execSQL("CREATE VIEW tstviewx " + pref + "AS SELECT * FROM tsttbl WHERE i < 10", expect); execSQL("DROP VIEW tstviewx IF EXISTS", 0); // reset execSQL("CREATE UNIQUE " + pref + "INDEX tstinda ON toindextbl (i10)", expect); execSQL("DROP INDEX tstinda IF EXISTS", 0); // reset execSQL("CREATE " + pref + "INDEX tstinda ON toindextbl (i10)", expect); execSQL("DROP INDEX tstinda IF EXISTS", 0); // reset execSQL("CREATE TRIGGER tsttrigy " + pref + "AFTER INSERT ON triggedtbl CALL \"" + "org.hsqldb.test.BlaineTrig\"", expect); execSQL("CREATE USER tstuserb " + pref + "PASSWORD fake", expect); execSQL("CREATE VIEW tstviewx AS " + pref + "SELECT * FROM tsttbl WHERE i < 10", expect); execSQL("DROP VIEW tstviewx IF EXISTS", 0); // reset execSQL("CREATE UNIQUE INDEX tstinda " + pref + "ON toindextbl (i10)", expect); execSQL("DROP INDEX tstinda IF EXISTS", 0); // reset execSQL("CREATE TRIGGER tsttrigz AFTER " + pref + "INSERT ON triggedtbl CALL \"" + "org.hsqldb.test.BlaineTrig\"", expect); execSQL("CREATE VIEW tstviewx AS SELECT * " + pref + "FROM tsttbl WHERE i < 10", expect); if (!manyParter) { expect = 0; } execSQL("CREATE USER tstuserc PASSWORD " + pref + "fake", expect); expect = SQL_ABORT; execSQL("DROP VIEW tstviewx IF EXISTS", 0); // reset execSQL("CREATE TRIGGER tsttriga AFTER INSERT " + pref + "ON triggedtbl CALL \"" + "org.hsqldb.test.BlaineTrig\"", expect); execSQL("CREATE TRIGGER tsttrigb AFTER INSERT ON triggedtbl " + pref + "CALL \"" + "org.hsqldb.test.BlaineTrig\"", expect); execSQL("CREATE VIEW tstviewx AS SELECT * FROM tsttbl " + pref + "WHERE i < 10", expect); execSQL("DROP VIEW tstviewx IF EXISTS", 0); // reset execSQL("CREATE TRIGGER tsttrigc AFTER INSERT ON triggedtbl CALL " + pref + "\"org.hsqldb.test.BlaineTrig'", expect); execSQL("CREATE " + pref + "UNIQUE INDEX tstindx ON toindextbl (i10)", expect); execSQL("DROP INDEX tstinda IF EXISTS", 0); // reset execSQL( "CREATE " + pref + "VIEW tstviewx AS SELECT * FROM tsttbl WHERE i < 10", expect); execSQL("DROP VIEW tstviewx IF EXISTS", 0); // reset execSQL(pref + "CREATE USER tstuserd PASSWORD fake", expect); execSQL(pref + "CREATE TRIGGER tsttrigd AFTER INSERT ON triggedtbl CALL \"" + "org.hsqldb.test.BlaineTrig\"", expect); execSQL( pref + "CREATE VIEW tstviewx AS SELECT * FROM tsttbl WHERE i < 10", expect); execSQL("DROP VIEW tstviewx IF EXISTS", 0); // reset execSQL(pref + "CREATE UNIQUE INDEX tstinda ON toindextbl (i10)", expect); execSQL("DROP INDEX tstinda IF EXISTS", 0); // reset execSQL("CREATE TABLE t1 (i " + pref + "INT, vc VARCHAR)", expect); execSQL("DROP TABLE t1 IF EXISTS", 0); // reset execSQL("CREATE TABLE t1 (i INT, vc " + pref + "VARCHAR)", expect); execSQL("DROP TABLE t1 IF EXISTS", 0); // reset execSQL(pref + "CREATE TABLE t1 (i INT, vc VARCHAR)", expect); execSQL("DROP TABLE t1 IF EXISTS", 0); // reset execSQL("CREATE " + pref + "TABLE t1 (i INT, vc VARCHAR)", expect); execSQL("DROP TABLE t1 IF EXISTS", 0); // reset execSQL("CREATE TABLE t1 (i " + pref + "INT, vc VARCHAR)", expect); execSQL("DROP TABLE t1 IF EXISTS", 0); // reset execSQL("CREATE TABLE t1 (i INT, vc " + pref + "VARCHAR)", expect); execSQL("DROP TABLE t1 IF EXISTS", 0); // reset execSQL("DELETE " + pref + "FROM tsttbl WHERE i < 10", expect); if (!manyParter) { expect = 3; } execSQL("DELETE FROM tsttbl " + pref + "WHERE i < 10", expect); expect = SQL_ABORT; execSQL(pref + "SET AUTOCOMMIT true", expect); execSQL("SET " + pref + "AUTOCOMMIT true", expect); execSQL("SET AUTOCOMMIT false", 0); // reset execSQL(pref + "SET IGNORECASE true", expect); execSQL("SET " + pref + "IGNORECASE true", expect); execSQL(pref + "SET LOGSIZE 5", expect); execSQL("SET " + pref + "LOGSIZE 5", expect); execSQL(pref + "SET PASSWORD blah", expect); execSQL("SET " + pref + "PASSWORD blah", expect); execSQL(pref + "SET REFERENTIAL_INTEGRITY true", expect); execSQL("SET " + pref + "REFERENTIAL_INTEGRITY true", expect); // Can't test text tables in in-memory DB. execSQL(pref + "SET SCRIPTFORMAT text", expect); execSQL("SET " + pref + "SCRIPTFORMAT text", expect); execSQL(pref + "SET TABLE tsttbl READONLY true", expect); execSQL("SET " + pref + "TABLE tsttbl READONLY true", expect); execSQL("SET TABLE tsttbl READONLY false", 0); // reset execSQL(pref + "GRANT ALL ON playtbl TO tstuser", expect); execSQL("GRANT " + pref + "ALL ON playtbl TO tstuser", expect); execSQL("GRANT ALL " + pref + "ON playtbl TO tstuser", expect); execSQL("GRANT ALL ON playtbl " + pref + "TO tstuser", expect); if (!manyParter) { expect = 0; } execSQL("GRANT ALL ON playtbl TO " + pref + "tstuser", expect); expect = SQL_ABORT; execSQL(pref + "REVOKE ALL ON playtbl FROM tstuser RESTRICT", expect); execSQL("REVOKE " + pref + "ALL ON playtbl FROM tstuser RESTRICT", expect); execSQL("REVOKE ALL " + pref + "ON playtbl FROM tstuser RESTRICT", expect); execSQL("REVOKE ALL ON playtbl " + pref + "FROM tstuser RESTRICT", expect); if (!manyParter) { expect = 0; } execSQL("REVOKE ALL ON playtbl FROM " + pref + "tstuser RESTRICT", expect); expect = SQL_ABORT; execSQL("GRANT ALL ON playtbl TO tstuser", 0); // reset execSQL(pref + "COMMIT", expect); execSQL(pref + "ROLLBACK", expect); execSQL(pref + "UPDATE tsttbl SET vc = 'eleven' WHERE i = 1", expect); execSQL("UPDATE tsttbl " + pref + "SET vc = 'eleven' WHERE i = 1", expect); execSQL("UPDATE tsttbl SET vc = 'eleven' " + pref + "WHERE i = 1", expect); execSQL(pref + "ALTER INDEX tstind RENAME TO renamedind", expect); execSQL("ALTER INDEX tstind " + pref + "RENAME TO renamedind", expect); execSQL("ALTER " + pref + "INDEX tstind RENAME TO renamedind", expect); execSQL("ALTER INDEX tstind RENAME " + pref + "TO renamedind", expect); execSQL(pref + "ALTER SEQUENCE tstseq RESTART WITH 13", expect); execSQL("ALTER " + pref + "SEQUENCE tstseq RESTART WITH 13", expect); execSQL("ALTER SEQUENCE tstseq " + pref + "RESTART WITH 13", expect); execSQL("ALTER SEQUENCE tstseq RESTART " + pref + "WITH 13", expect); if (!manyParter) { expect = 0; } execSQL("ALTER USER tstuser SET PASSWORD " + pref + "frank", expect); expect = SQL_ABORT; execSQL(pref + "ALTER USER tstuser SET PASSWORD frank", expect); execSQL("ALTER " + pref + "USER tstuser SET PASSWORD frank", expect); execSQL("ALTER USER tstuser " + pref + "SET PASSWORD frank", expect); execSQL("ALTER USER tstuser SET " + pref + "PASSWORD frank", expect); execSQL(pref + "ALTER TABLE tsttbl ADD COLUMN vco1 VARCHAR", expect); execSQL("ALTER " + pref + "TABLE tsttbl ADD COLUMN vco2 VARCHAR", expect); execSQL("ALTER TABLE tsttbl " + pref + "ADD COLUMN vco3 VARCHAR", expect); execSQL("ALTER TABLE tsttbl ADD " + pref + "COLUMN vco4 VARCHAR", expect); execSQL("ALTER TABLE tsttbl ADD " + pref + "COLUMN vco5 " + pref + "VARCHAR", expect); execSQL("ALTER TABLE bigtbl DROP " + pref + "COLUMN i103", expect); execSQL("ALTER TABLE bigtbl " + pref + "DROP COLUMN i102", expect); execSQL(pref + "ALTER TABLE bigtbl DROP COLUMN i101", expect); execSQL(pref + "ALTER TABLE bigtbl ALTER COLUMN i104 RENAME TO j1", expect); execSQL("ALTER " + pref + "TABLE bigtbl ALTER COLUMN i105 RENAME TO j2", expect); execSQL("ALTER TABLE bigtbl " + pref + "ALTER COLUMN i106 RENAME TO j3", expect); execSQL("ALTER TABLE bigtbl ALTER " + pref + "COLUMN i107 RENAME TO j4", expect); execSQL("ALTER TABLE bigtbl ALTER COLUMN i108 " + pref + "RENAME TO j5", expect); execSQL("ALTER TABLE bigtbl ALTER COLUMN i109 RENAME " + pref + "TO j6", expect); execSQL( pref + "ALTER TABLE constrainedtbl ADD CONSTRAINT con2 CHECK (i6 > 4)", expect); execSQL( "ALTER " + pref + "TABLE constrainedtbl ADD CONSTRAINT con3 CHECK (i6 > 4)", expect); execSQL("ALTER TABLE constrainedtbl " + pref + "ADD CONSTRAINT con4 CHECK (i6 > 4)", expect); execSQL( "ALTER TABLE constrainedtbl ADD CONSTRAINT con1 CHECK (i6 > 4)", true); // setup execSQL( "ALTER TABLE constrainedtbl ADD CONSTRAINT con2 CHECK (i6 > 4)", true); // setup execSQL( "ALTER TABLE constrainedtbl ADD CONSTRAINT con3 CHECK (i6 > 4)", true); // setup execSQL( "ALTER TABLE constrainedtbl ADD CONSTRAINT con4 CHECK (i6 > 4)", true); // setup execSQL("ALTER TABLE constrainedtbl ADD " + pref + "CONSTRAINT con5 CHECK (i6 > 4)", expect); execSQL("ALTER TABLE constrainedtbl ADD CONSTRAINT con6 " + pref + "CHECK (i6 > 4)", expect); execSQL("ALTER TABLE constrainedtbl DROP CONSTRAINT ucons", true); // reset execSQL( pref + "ALTER TABLE constrainedtbl ADD CONSTRAINT ucons UNIQUE (i6)", expect); execSQL("ALTER TABLE constrainedtbl DROP CONSTRAINT ucons", true); // reset execSQL( "ALTER " + pref + "TABLE constrainedtbl ADD CONSTRAINT ucons UNIQUE (i6)", expect); execSQL("ALTER TABLE constrainedtbl DROP CONSTRAINT ucons", true); // reset execSQL("ALTER TABLE constrainedtbl " + pref + "ADD CONSTRAINT ucons UNIQUE (i6)", expect); execSQL("ALTER TABLE constrainedtbl DROP CONSTRAINT ucons", true); // reset execSQL("ALTER TABLE constrainedtbl ADD " + pref + "CONSTRAINT ucons UNIQUE (i6)", expect); execSQL("ALTER TABLE constrainedtbl DROP CONSTRAINT ucons", true); // reset execSQL("ALTER TABLE constrainedtbl ADD CONSTRAINT ucons " + pref + "UNIQUE (i6)", expect); execSQL("ALTER TABLE constrainedtbl ADD CONSTRAINT ucons UNIQUE (i6)", true); // reset execSQL(pref + "ALTER TABLE playtbl RENAME TO renamedtbl", expect); execSQL("ALTER TABLE renamedtbl RENAME TO playtbl", true); // reset execSQL("ALTER " + pref + "TABLE playtbl RENAME TO renamedtbl", expect); execSQL("ALTER TABLE renamedtbl RENAME TO playtbl", true); // reset execSQL("ALTER TABLE playtbl " + pref + "RENAME TO renamedtbl", expect); execSQL("ALTER TABLE renamedtbl RENAME TO playtbl", true); // reset execSQL("ALTER TABLE playtbl RENAME " + pref + "TO renamedtbl", expect); execSQL(pref + "ALTER TABLE constrainedtbl DROP CONSTRAINT con1", expect); execSQL("ALTER " + pref + "TABLE constrainedtbl DROP CONSTRAINT con2", expect); execSQL("ALTER TABLE constrainedtbl " + pref + "DROP CONSTRAINT con3", expect); execSQL("ALTER TABLE constrainedtbl DROP " + pref + "CONSTRAINT con4", expect); execSQL("ALTER TABLE foreigntbl DROP CONSTRAINT tstfk", true); // reset execSQL(pref + "ALTER TABLE foreigntbl ADD CONSTRAINT tstfk FOREIGN KEY " + "(i7) REFERENCES primarytbl (i8)", expect); execSQL("ALTER TABLE foreigntbl DROP CONSTRAINT tstfk", true); // reset execSQL("ALTER " + pref + "TABLE foreigntbl ADD CONSTRAINT tstfk FOREIGN KEY " + "(i7) REFERENCES primarytbl (i8)", expect); execSQL("ALTER TABLE foreigntbl DROP CONSTRAINT tstfk", true); // reset execSQL("ALTER TABLE foreigntbl " + pref + "ADD CONSTRAINT tstfk FOREIGN KEY " + "(i7) REFERENCES primarytbl (i8)", expect); execSQL("ALTER TABLE foreigntbl DROP CONSTRAINT tstfk", true); // reset execSQL("ALTER TABLE foreigntbl ADD " + pref + "CONSTRAINT tstfk FOREIGN KEY " + "(i7) REFERENCES primarytbl (i8)", expect); execSQL("ALTER TABLE foreigntbl DROP CONSTRAINT tstfk", true); // reset execSQL("ALTER TABLE foreigntbl ADD CONSTRAINT tstfk " + pref + "FOREIGN KEY " + "(i7) REFERENCES primarytbl (i8)", expect); execSQL("ALTER TABLE foreigntbl DROP CONSTRAINT tstfk", true); // reset execSQL("ALTER TABLE foreigntbl ADD CONSTRAINT tstfk FOREIGN " + pref + "KEY " + "(i7) REFERENCES primarytbl (i8)", expect); execSQL("ALTER TABLE foreigntbl DROP CONSTRAINT tstfk", true); // reset execSQL("ALTER TABLE foreigntbl ADD CONSTRAINT tstfk FOREIGN KEY " + "(i7) " + pref + "REFERENCES primarytbl (i8)", expect); /* // KEEP THESE TEST CASES AT THE BOTTOM!!!! Can wreck all following // tests in current method, even when this test succeeds. // Can only run one successful SHUTDOWN command in one test case. execSQL(pref + "SHUTDOWN", SQL_ABORT); execSQL(pref + "SHUTDOWN IMMEDIATELY", SQL_ABORT); */ shutdownTested = true; /* Failing execSQL(pref + "SHUTDOWN BADARG", SQL_ABORT); execSQL("Bad SHUTDOWN command did shut down database", "SET LOGSIZE " + pref + "5", 0); */ execSQL("SHUTDOWN IMMEDIATELY", 0); } public void testThreePartNames() throws Exception { execSQL("SELECT public.tsttbl.i FROM public.beta.tsttbl\n" + "WHERE public.tsttbl.i = 1", SQL_ABORT); } /** * This method seems to be obsolete. */ public void testBasicQueries() throws Exception { String prefix = "public."; assertEquals(2, queryRowCount("SELECT i FROM " + prefix + "tsttbl")); assertEquals(1, queryRowCount("SELECT vc FROM " + prefix + "tsttbl WHERE i = 1")); assertEquals(1, queryRowCount("SELECT vc FROM " + prefix + "tsttbl WHERE i = (\n" + " SELECT i2 FROM " + prefix + "joinedtbl\n" + ")")); } /** @todo fredt - need to define additional identifiers to use for all cases of expect */ private static final int SQL_ABORT = -1234; private static final int SQL_INITIAL = -1233; private static final int SQL_FAIL = -1; private void execSQL(String s, boolean ignoreError) throws SQLException { try { statement.execute(s); statement.getUpdateCount(); } catch (SQLException se) { if (!ignoreError) { throw se; } //else System.err.println("FAILURE of (" + s + ')'); } } private void execSQL(String m, String s, int expect) { int retval = SQL_INITIAL; try { statement.execute(s); retval = statement.getUpdateCount(); } catch (SQLException se) { retval = SQL_ABORT; } assertEquals(m, expect, retval); } /** @todo fredt - this method body seems to be incorrect */ private void execSQL(String s, int expect) { execSQL(s, s, expect); } private int queryRowCount(String query) throws SQLException { int count = 0; if (!statement.execute(query)) { return count; } ResultSet rs = statement.getResultSet(); try { while (rs.next()) { count++; } } finally { rs.close(); } return count; } private int tableRowCount(String tableName) throws SQLException { String query = "SELECT count(*) FROM " + tableName; if (!statement.execute(query)) { return 0; } ResultSet rs = statement.getResultSet(); try { if (!rs.next()) { throw new SQLException("0 rows returned by (" + query + ')'); } int count = rs.getInt(1); if (rs.next()) { throw new SQLException("> 1 row returned by (" + query + ')'); } return count; } finally { rs.close(); } //throw new Exception("Failed to get rowcount for " + tableName); } public TestSchemaParse() { super(); } public TestSchemaParse(String s) { super(s); } /** * This method allows to easily run this unit test independent of the other * unit tests, and without dealing with Ant or unrelated test suites. */ static public void main(String[] sa) { junit.textui.TestRunner runner = new junit.textui.TestRunner(); junit.framework.TestResult result = runner.run(runner.getTest(TestSchemaParse.class.getName())); System.exit(result.wasSuccessful() ? 0 : 1); } public static junit.framework.Test suite() { junit.framework.TestSuite newSuite = new junit.framework.TestSuite(); newSuite.addTest(new TestSchemaParse("testSanityCheck")); newSuite.addTest(new TestSchemaParse("testTwoPartKeywords")); newSuite.addTest(new TestSchemaParse("testThreePartKeywords")); newSuite.addTest(new TestSchemaParse("testThreePartNames")); newSuite.addTest(new TestSchemaParse("testBasicQueries")); newSuite.addTest(new TestSchemaParse("test2pTables")); newSuite.addTest(new TestSchemaParse("test2pViews")); newSuite.addTest(new TestSchemaParse("test2pSequences")); newSuite.addTest(new TestSchemaParse("test2pIndexes")); newSuite.addTest(new TestSchemaParse("test2pAliases")); newSuite.addTest(new TestSchemaParse("test2pConstraints")); newSuite.addTest(new TestSchemaParse("test2pTriggers")); return newSuite; } ; public void fire(int i, String name, String table, Object[] row1, Object[] row2) {} public static String capitalize(String inString) { return inString.toUpperCase(); } }