blob: 544b2bee79fa64befea7929bbaf292dac881e44b [file] [log] [blame]
/* 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();
}
}