提交 cf963b69 authored 作者: Thomas Mueller's avatar Thomas Mueller

javadocs

上级 1865ce3d
......@@ -17,7 +17,11 @@ Change Log
<h2>Next Version (unreleased)</h2>
<ul>
<li>Linked tables: To view the statements that are executed against the target table, set the trace level to 3.
<li>
</li><li>Improved compatibility. New compatibility modes for Oracle and Derby.
New compatibility flag uniqueIndexNullDistinct to only allow one row with 'NULL' in a unique
index. This flag is enabled for Derby, Oracle, MSSQLServer, and HSQLDB.
</li><li>Linked tables: To view the statements that are executed against the target table, set the trace level to 3.
</li><li>RunScript tool: new options to show and check the results of queries.
</li><li>Deadlocks are now detected. One transaction is rolled back automatically.
</li><li>The Lucene fulltext index was always re-created when opening a
......@@ -100,7 +104,7 @@ Change Log
<li>H2 is now dual-licensed under the Eclipse Public License (EPL) and the
old 'H2 License' (which is basically MPL).
</li><li>Sometimes an exception 'File ID mismatch' or 'try to add a record twice'
occured after large records (8 KB or larger) are updated or deleted.
occurred after large records (8 KB or larger) are updated or deleted.
See also http://code.google.com/p/h2database/issues/detail?id=22
</li><li>H2 Console: The tools can now be translated
(it didn't work in the last release).
......@@ -194,10 +198,10 @@ Change Log
</li><li>For years below 1, the YEAR method didn't return the correct value,
and the conversion from date and timestamp to varchar was incorrect.
</li><li>CSVWRITE caused a NullPointerException when not specifying a nullString.
</li><li>When a log file switch occured just after a truncate table or drop table
</li><li>When a log file switch occurred just after a truncate table or drop table
statement, the database could not be started normally (RECOVER=1
was required). Fixed.
</li><li>When a log file switch occured in the middle of a sequence flush
</li><li>When a log file switch occurred in the middle of a sequence flush
(sequences are only flushed every 32 values by default), the sequence
value was lost. Fixed.
</li><li>Altering a sequence didn't unlock the system table
......
......@@ -99,7 +99,6 @@ via PayPal:
</p>
<ul>
<li>Florent Ramiere, France
</li><li>Pete Haidinyak, USA
</li><li>Jun Iyama, Japan
</li><li>Antonio Casqueiro, Portugal
</li><li>Oliver Computing LLC, USA
......@@ -109,6 +108,7 @@ via PayPal:
</li><li>Antonio Dieguez, Chile
</li><li><a href="http://ontologyworks.com/">Ontology Works, USA</a>
</li><li>lumber-mill.co.jp, Japan
</li><li>Pete Haidinyak, USA
</li></ul>
</div></td></tr></table><!-- analytics --></body></html>
......@@ -272,11 +272,27 @@ PolePosition</a><br />
Open source database benchmark.
</p>
<p><a href="http://poormans.sourceforge.net/index.html">
Poormans</a><br />
Very basic CMS running as a SWT application and generating static html pages.
</p>
<p><a href="http://www.railo-technologies.com">
Railo</a><br />
Railo is an alternative engine for the Cold Fusion Markup Language, that compiles code
programmed in CFML into Java bytecode and executes it on a servlet engine.
</p>
<p><a href="http://patir.rubyforge.org/rutema/index.html">
Rutema</a><br />
Rutema is a test execution and management tool for heterogeneous development environments written in Ruby.
</p>
<p><a href="http://scriptella.javaforge.com">
Sava</a><br />
Open-source web-based content management system.
</p>
<p><a href="http://scriptella.javaforge.com">
Scriptella</a><br />
ETL (Extract-Transform-Load) and script execution tool.
......
......@@ -79,7 +79,7 @@ Roadmap
</li><li>Test performance again with SQL Server, Oracle, DB2
</li><li>Test with dbmonster (http://dbmonster.kernelpanic.pl/)
</li><li>Test with dbcopy (http://dbcopyplugin.sourceforge.net)
</li><li>Find a tool to view a text file >100 MB, with find, page up and down (like less)
</li><li>Find a tool to view large text file >100 MB, with find, page up and down (like less), truncate before / after
</li><li>Implement, test, document XAConnection and so on
</li><li>Web site: get rid of frame set
</li><li>Pluggable data type (for compression, validation, conversion, encryption)
......
......@@ -179,8 +179,8 @@ public abstract class Command implements CommandInterface {
}
if (trace.isInfoEnabled()) {
long time = System.currentTimeMillis() - startTime;
if (time > Constants.LONG_QUERY_LIMIT_MS) {
trace.info("long query: " + time);
if (time > Constants.SLOW_QUERY_LIMIT_MS) {
trace.info("slow query: " + time);
}
}
}
......
......@@ -170,7 +170,7 @@ public class ErrorCode {
* to lock a table the first session has locked. As an example, session 1
* has locked table A, while session 2 has locked table B. If session 1 now
* tries to lock table B and session 2 tries to lock table A, a deadlock has
* occured. Deadlocks that involve more than two sessions are also possible.
* occurred. Deadlocks that involve more than two sessions are also possible.
* To solve deadlock problems, an application should lock tables always in
* the same order, such as always lock table A before locking table B. For
* details, see <a href="http://en.wikipedia.org/wiki/Deadlock">Wikipedia
......@@ -301,7 +301,7 @@ public class ErrorCode {
/**
* The error with code <code>50200</code> is thrown when
* another connection locked an object longer than the lock timeout
* set for this connection, or when a deadlock occured.
* set for this connection, or when a deadlock occurred.
* Example:
* <pre>
* CREATE TABLE TEST(ID INT);
......@@ -560,7 +560,7 @@ public class ErrorCode {
/**
* The error with code <code>90021</code> is thrown when
* trying to convert a value to a data type where the conversion is undefined,
* or when an error occured trying to convert.
* or when an error occurred trying to convert.
* Example:
* <pre>
* CALL CAST(DATE '2001-01-01' AS BOOLEAN);
......@@ -599,7 +599,7 @@ public class ErrorCode {
/**
* The error with code <code>90025</code> is thrown when
* a file could not be deleted, because it is still in use
* (only in Windows), or because an error occured when deleting.
* (only in Windows), or because an error occurred when deleting.
*/
public static final int FILE_DELETE_FAILED_1 = 90025;
......@@ -617,7 +617,7 @@ public class ErrorCode {
/**
* The error with code <code>90028</code> is thrown when
* an input / output error occured. For more information, see the root
* an input / output error occurred. For more information, see the root
* cause of the exception.
*/
public static final int IO_EXCEPTION_1 = 90028;
......@@ -645,7 +645,7 @@ public class ErrorCode {
/**
* The error with code <code>90031</code> is thrown when
* an input / output error occured. For more information, see the root
* an input / output error occurred. For more information, see the root
* cause of the exception.
*/
public static final int IO_EXCEPTION_2 = 90031;
......@@ -780,7 +780,7 @@ public class ErrorCode {
/**
* The error with code <code>90044</code> is thrown when
* an exception or error occured while calling the triggers fire method.
* an exception or error occurred while calling the triggers fire method.
* See the root cause for details.
*/
public static final int ERROR_EXECUTING_TRIGGER_3 = 90044;
......@@ -1398,7 +1398,7 @@ public class ErrorCode {
public static final int SIMULATED_POWER_OFF = 90098;
/**
* The error with code <code>90099</code> is thrown when an error occured
* The error with code <code>90099</code> is thrown when an error occurred
* trying to initialize the database event listener. Example:
* <pre>
* jdbc:h2:&tilde;/test;DATABASE_EVENT_LISTENER='java.lang.String'
......@@ -1457,7 +1457,7 @@ public class ErrorCode {
/**
* The error with code <code>90105</code> is thrown when
* an exception occured in a user-defined method.
* an exception occurred in a user-defined method.
* Example:
* <pre>
* CREATE ALIAS SYS_PROP FOR "java.lang.System.getProperty";
......@@ -1513,7 +1513,7 @@ public class ErrorCode {
/**
* The error with code <code>90111</code> is thrown when
* an exception occured while accessing a linked table.
* an exception occurred while accessing a linked table.
*/
public static final int ERROR_ACCESSING_LINKED_TABLE_2 = 90111;
......
......@@ -358,12 +358,6 @@ public class Constants {
* the largest file (data file or index file).
*/
public static final long LOG_SIZE_DIVIDER = 10;
/**
* Queries that take longer than this number of milliseconds are written to
* the trace file with the level info.
*/
public static final long LONG_QUERY_LIMIT_MS = 100;
/**
* The file header used for binary files.
......@@ -468,6 +462,12 @@ public class Constants {
*/
public static final String SERVER_PROPERTIES_TITLE = "H2 Server Properties";
/**
* Queries that take longer than this number of milliseconds are written to
* the trace file with the level info.
*/
public static final long SLOW_QUERY_LIMIT_MS = 100;
/**
* The file name suffix of data files.
*/
......
......@@ -1687,7 +1687,7 @@ public class Database implements DataHandler {
}
/**
* This method is called after an exception occured, to inform the database
* This method is called after an exception occurred, to inform the database
* event listener (if one is set).
*
* @param e the exception
......
......@@ -31,6 +31,13 @@ public class Mode {
public boolean indexDefinitionInCreateTable;
public boolean systemColumns;
public boolean squareBracketQuotedNames;
/**
* When using unique indexes, multiple rows with NULL in one of the columns
* are allowed by default. However many databases view NULL as distinct in
* this regard and only allow one row with NULL.
*/
public boolean uniqueIndexSingleNull;
private String name;
......@@ -54,10 +61,20 @@ public class Mode {
mode = new Mode("HSQLDB");
mode.nullConcatIsNull = true;
mode.convertOnlyToSmallerScale = true;
mode.uniqueIndexSingleNull = true;
add(mode);
mode = new Mode("MSSQLServer");
mode.squareBracketQuotedNames = true;
mode.uniqueIndexSingleNull = true;
add(mode);
mode = new Mode("Derby");
mode.uniqueIndexSingleNull = true;
add(mode);
mode = new Mode("Oracle");
mode.uniqueIndexSingleNull = true;
add(mode);
}
......
......@@ -237,7 +237,10 @@ public abstract class BaseIndex extends SchemaObjectBase implements Index {
return 0;
}
public boolean isNull(Row newRow) {
public boolean containsNullAndAllowMultipleNull(Session session, Row newRow) {
if (session.getDatabase().getMode().uniqueIndexSingleNull) {
return false;
}
for (int i = 0; i < columns.length; i++) {
int index = columnIds[i];
Value v = newRow.getValue(index);
......
......@@ -63,7 +63,7 @@ public class BtreeLeaf extends BtreePage {
int comp = index.compareRows(row, newRow);
if (comp == 0) {
if (index.indexType.getUnique()) {
if (!index.isNull(newRow)) {
if (!index.containsNullAndAllowMultipleNull(session, newRow)) {
throw index.getDuplicateKeyException();
}
}
......
......@@ -83,7 +83,7 @@ public class BtreeNode extends BtreePage {
int comp = index.compareRows(row, newRow);
if (comp == 0) {
if (index.indexType.getUnique()) {
if (!index.isNull(newRow)) {
if (!index.containsNullAndAllowMultipleNull(session, newRow)) {
throw index.getDuplicateKeyException();
}
}
......
......@@ -179,12 +179,15 @@ public interface Index extends SchemaObject {
int compareRows(SearchRow rowData, SearchRow compare) throws SQLException;
/**
* Check if a row is NULL.
*
* Check if one of the columns is NULL and multiple rows with NULL are
* allowed using the current compatibility mode for unique indexes. Note:
* NULL behavior is complicated in SQL.
*
* @param newRow
* @return if it is null
* @return true if one of the columns is null and multiple nulls in unique
* indexes are allowed
*/
boolean isNull(Row newRow);
boolean containsNullAndAllowMultipleNull(Session session, Row newRow);
/**
* Compare the positions of two rows.
......
......@@ -237,8 +237,8 @@ public class MultiVersionIndex implements Index {
return base.getType();
}
public boolean isNull(Row newRow) {
return base.isNull(newRow);
public boolean containsNullAndAllowMultipleNull(Session session, Row newRow) {
return base.containsNullAndAllowMultipleNull(session, newRow);
}
public void removeChildrenAndResources(Session session) throws SQLException {
......
......@@ -53,7 +53,7 @@ public class TreeIndex extends BaseIndex {
int compare = compareRows(row, r);
if (compare == 0) {
if (indexType.getUnique()) {
if (!isNull(row)) {
if (!containsNullAndAllowMultipleNull(session, row)) {
throw getDuplicateKeyException();
}
}
......
......@@ -170,7 +170,7 @@ public class JdbcConnectionPool implements DataSource {
*
* @return a new Connection object.
* @throws SQLException when a new connection could not be established,
* or a timeout occured
* or a timeout occurred
*/
public Connection getConnection() throws SQLException {
for (int i = 0;; i++) {
......
......@@ -52,10 +52,10 @@ public interface DataHandler {
int getChecksum(byte[] data, int start, int end);
/**
* Check if the simulated power failure occured.
* Check if the simulated power failure occurred.
* This call will decrement the countdown.
*
* @throws SQLException if the simulated power failure occured
* @throws SQLException if the simulated power failure occurred
*/
void checkPowerOff() throws SQLException;
......
......@@ -105,7 +105,7 @@ public abstract class Table extends SchemaObjectBase {
* @param session the session
* @param exclusive true for write locks, false for read locks
* @param force lock even in the MVCC mode
* @throws SQLException if a lock timeout occured
* @throws SQLException if a lock timeout occurred
*/
public abstract void lock(Session session, boolean exclusive, boolean force) throws SQLException;
......@@ -871,7 +871,7 @@ public abstract class Table extends SchemaObjectBase {
}
/**
* Check if a deadlock occured. This method is called recursively. There is
* Check if a deadlock occurred. This method is called recursively. There is
* a circle if the session to be tested for is the same as the originating
* session (the 'clash session'). In this case the method must return an
* empty object array. Once a deadlock has been detected, the methods must
......
......@@ -61,7 +61,7 @@ public class IOUtils {
* @param skip the number of bytes to skip
* @throws EOFException if the end of file has been reached before all bytes
* could be skipped
* @throws IOException if an IO exception occured while skipping
* @throws IOException if an IO exception occurred while skipping
*/
public static void skipFully(InputStream in, long skip) throws IOException {
while (skip > 0) {
......@@ -80,7 +80,7 @@ public class IOUtils {
* @param skip the number of characters to skip
* @throws EOFException if the end of file has been reached before all
* characters could be skipped
* @throws IOException if an IO exception occured while skipping
* @throws IOException if an IO exception occurred while skipping
*/
public static void skipFully(Reader reader, long skip) throws IOException {
while (skip > 0) {
......
......@@ -18,7 +18,7 @@ public interface JdbcConnectionListener {
// TODO pooled connection: make sure
// fatalErrorOccurred is called in the right situations
/**
* A fatal error occured.
* A fatal error occurred.
*
* @param conn the connection
* @param e the exception
......
......@@ -575,8 +575,8 @@ public class DataType {
/**
* Convert a SQL type to a value type.
*
* @param the SQL type
* @return type the value type
* @param sqlType the SQL type
* @return the value type
*/
public static int convertSQLTypeToValueType(int sqlType) throws SQLException {
switch(sqlType) {
......
......@@ -133,8 +133,8 @@ public class Transfer {
* @param x the value
* @return itself
*/
public Transfer writeInt(int i) throws IOException {
out.writeInt(i);
public Transfer writeInt(int x) throws IOException {
out.writeInt(x);
return this;
}
......@@ -153,8 +153,8 @@ public class Transfer {
* @param x the value
* @return itself
*/
public Transfer writeLong(long i) throws IOException {
out.writeLong(i);
public Transfer writeLong(long x) throws IOException {
out.writeLong(x);
return this;
}
......
......@@ -102,7 +102,7 @@ INSERT INTO ITEM VALUES(41,
</li></ul>
<b>Bugfixes:</b>
<ul><li>Sometimes an exception ''File ID mismatch'' or ''try to add a record twice''
occured after large records (8 KB or larger) are updated or deleted.
occurred after large records (8 KB or larger) are updated or deleted.
See also http://code.google.com/p/h2database/issues/detail?id=22
</li><li>H2 Console: The tools can now be translated
(it didn''t work in the last release).
......@@ -186,7 +186,7 @@ INSERT INTO ITEM VALUES(39,
</li><li>TRACE_LEVEL_ settings are no longer persistent.
</li></ul>
<b>Bugfixes:</b>
<ul><li>When a log file switch occured in the middle of certain operations,
<ul><li>When a log file switch occurred in the middle of certain operations,
the database could not be started normally (RECOVER=1 was required).
</li><li>Altering a sequence didn''t unlock the system table with autocommit disabled.
</li><li>CSVWRITE caused a NullPointerException when not specifying a nullString.
......
......@@ -593,7 +593,7 @@ Roadmap:
}
}
public void beforeTest() throws SQLException {
void beforeTest() throws SQLException {
DeleteDbFiles.execute(TestBase.baseDir, null, true);
FileSystemDisk.getInstance().deleteRecursive("trace.db");
if (networked) {
......@@ -609,7 +609,7 @@ Roadmap:
}
}
public void afterTest() throws SQLException {
private void afterTest() throws SQLException {
FileSystemDisk.getInstance().deleteRecursive("trace.db");
if (networked && server != null) {
server.stop();
......
......@@ -37,8 +37,11 @@ public abstract class TestBase {
protected TestAll config;
private long start;
// private static final String BASE_TEST_DIR =
// System.getProperty("java.io.tmpdir") + "/h2";
/**
* Get the test directory for this test.
*
* @param name the directory name suffix
*/
public static String getTestDir(String name) {
return BASE_TEST_DIR + "/test" + name;
}
......@@ -47,6 +50,12 @@ public abstract class TestBase {
config.beforeTest();
}
/**
* Initialize the test configuration.
*
* @param conf the configuration
* @return itself
*/
public TestBase init(TestAll conf) throws Exception {
baseDir = getTestDir("");
this.config = conf;
......@@ -62,6 +71,13 @@ public abstract class TestBase {
// do nothing
}
/**
* This method is initializes the test, runs the test by calling the test()
* method, and prints status information. It also catches exceptions so that
* the tests can continue.
*
* @param conf the test configuration
*/
public void runTest(TestAll conf) {
try {
init(conf);
......@@ -77,10 +93,25 @@ public abstract class TestBase {
}
}
/**
* Open a database connection in admin mode. The default user name and
* password is used.
*
* @param name the database name
* @return the connection
*/
public Connection getConnection(String name) throws Exception {
return getConnectionInternal(getURL(name, true), getUser(), getPassword());
}
/**
* Open a database connection.
*
* @param name the database name
* @param user the user name to use
* @param password the password to use
* @return the connection
*/
protected Connection getConnection(String name, String user, String password) throws Exception {
return getConnectionInternal(getURL(name, false), user, password);
}
......@@ -194,6 +225,11 @@ public abstract class TestBase {
trace("" + x);
}
/**
* Write a message to system out if trace is enabled.
*
* @param s the message to write
*/
public void trace(String s) {
if (config.traceTest) {
println(s);
......@@ -206,6 +242,13 @@ public abstract class TestBase {
}
}
/**
* Print the currently used memory, the message and the given time in
* milliseconds.
*
* @param s the message
* @param time the time in millis
*/
public void printTimeMemory(String s, long time) {
if (config.big) {
println(getMemoryUsed() + " MB: " + s + " ms: " + time);
......@@ -236,6 +279,12 @@ public abstract class TestBase {
throw new Exception(string);
}
/**
* Log an error message.
*
* @param s the message
* @param e the exception
*/
public static void logError(String s, Throwable e) {
if (e == null) {
e = new Exception(s);
......@@ -281,14 +330,34 @@ public abstract class TestBase {
DeleteDbFiles.execute(dir, name, true);
}
/**
* This method will be called by the test framework.
*
* @throws Exception if an exception in the test occurs
*/
public abstract void test() throws Exception;
/**
* Check if two values are equal, and if not throw an exception.
*
* @param message the message to print in case of error
* @param expected the expected value
* @param actual the actual value
* @throws Exception if the values are not equal
*/
public void assertEquals(String message, int expected, int actual) throws Exception {
if (expected != actual) {
fail("Expected: " + expected + " actual: " + actual + " message: " + message);
}
}
/**
* Check if two values are equal, and if not throw an exception.
*
* @param expected the expected value
* @param actual the actual value
* @throws Exception if the values are not equal
*/
public void assertEquals(int expected, int actual) throws Exception {
if (expected != actual) {
fail("Expected: " + expected + " actual: " + actual);
......
......@@ -55,19 +55,19 @@ public class Coverage {
*
* @param args the command line parameters
*/
public static void main(String[] arg) {
new Coverage().run(arg);
public static void main(String[] args) {
new Coverage().run(args);
}
void run(String[] arg) {
if (arg.length == 0 || arg[0].equals("-?")) {
void run(String[] args) {
if (args.length == 0 || args[0].equals("-?")) {
printUsage();
return;
}
Coverage c = new Coverage();
int recurse = 1;
for (int i = 0; i < arg.length; i++) {
String s = arg[i];
for (int i = 0; i < args.length; i++) {
String s = args[i];
if (s.equals("-r")) {
// maximum recurse is 100 subdirectories, that should be enough
recurse = 100;
......@@ -76,7 +76,7 @@ public class Coverage {
} else if (s.equals("-f")) {
c.perFunction = true;
} else if (s.equals("-e")) {
c.addExclude(arg[++i]);
c.addExclude(args[++i]);
} else {
c.addDir(s, recurse);
}
......
......@@ -39,6 +39,15 @@ public class Db {
}
}
/**
* Open the database connection. For most databases, it is not required to
* load the driver before calling this method.
*
* @param url the database URL
* @param user the user name
* @param password the password
* @return the database
*/
public static Db open(String url, String user, String password) {
try {
JdbcDriverUtils.load(url);
......@@ -48,6 +57,12 @@ public class Db {
}
}
/**
* Prepare a SQL statement.
*
* @param sql the SQL statement
* @return the prepared statement
*/
public Prepared prepare(String sql) {
try {
PreparedStatement prep = (PreparedStatement) prepared.get(sql);
......@@ -61,6 +76,11 @@ public class Db {
}
}
/**
* Execute a SQL statement.
*
* @param sql the SQL statement
*/
public void execute(String sql) {
try {
stat.execute(sql);
......@@ -69,6 +89,9 @@ public class Db {
}
}
/**
* Close the database connection.
*/
public void close() {
try {
conn.close();
......@@ -88,6 +111,11 @@ public class Db {
this.prep = prep;
}
/**
* Set the value of the current parameter.
*
* @param x the value
*/
public Prepared set(int x) {
try {
prep.setInt(++index, x);
......@@ -97,6 +125,11 @@ public class Db {
}
}
/**
* Set the value of the current parameter.
*
* @param x the value
*/
public Prepared set(String x) {
try {
prep.setString(++index, x);
......@@ -106,6 +139,11 @@ public class Db {
}
}
/**
* Set the value of the current parameter.
*
* @param x the value
*/
public Prepared set(byte[] x) {
try {
prep.setBytes(++index, x);
......@@ -115,6 +153,11 @@ public class Db {
}
}
/**
* Set the value of the current parameter.
*
* @param x the value
*/
public Prepared set(InputStream x) {
try {
prep.setBinaryStream(++index, x, -1);
......@@ -124,6 +167,9 @@ public class Db {
}
}
/**
* Execute the prepared statement.
*/
public void execute() {
try {
prep.execute();
......@@ -145,6 +191,9 @@ public class Db {
}
}
/**
* Commit a pending transaction.
*/
public void commit() {
try {
conn.commit();
......
......@@ -8,6 +8,7 @@ package org.h2.test.db;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import org.h2.test.TestBase;
......@@ -23,12 +24,32 @@ public class TestCompatibility extends TestBase {
deleteDb("compatibility");
conn = getConnection("compatibility");
testUniqueIndexSingleNull();
testHsqlDb();
testMySQL();
conn.close();
}
private void testUniqueIndexSingleNull() throws Exception {
Statement stat = conn.createStatement();
String[] modes = new String[] { "PostgreSQL", "MySQL", "HSQLDB", "MSSQLServer", "Derby", "Oracle", "Regular" };
String multiNull = "PostgreSQL,MySQL,Regular";
for (int i = 0; i < modes.length; i++) {
String mode = modes[i];
stat.execute("SET MODE " + mode);
stat.execute("CREATE TABLE TEST(ID INT)");
stat.execute("CREATE UNIQUE INDEX IDX_ID_U ON TEST(ID)");
try {
stat.execute("INSERT INTO TEST VALUES(1), (2), (NULL), (NULL)");
assertTrue(mode + " mode should not support multiple NULL", multiNull.indexOf(mode) >= 0);
} catch (SQLException e) {
assertTrue(mode + " mode should support multiple NULL", multiNull.indexOf(mode) < 0);
}
stat.execute("DROP TABLE TEST");
}
}
private void testHsqlDb() throws Exception {
Statement stat = conn.createStatement();
......
......@@ -120,31 +120,52 @@ public class TestFunctionOverload extends TestBase {
stat.close();
}
/**
* This method is called via reflection from the database.
*/
public static int overload0() {
return 0;
}
/**
* This method is called via reflection from the database.
*/
public static int overload1or2(int one) {
return one;
}
/**
* This method is called via reflection from the database.
*/
public static int overload1or2(int one, int two) {
return one + two;
}
/**
* This method is called via reflection from the database.
*/
public static int overload1or2WithConn(Connection conn, int one) throws SQLException {
conn.createStatement().executeQuery("select 1 from dual");
return one;
}
/**
* This method is called via reflection from the database.
*/
public static int overload1or2WithConn(int one, int two) {
return one + two;
}
/**
* This method is called via reflection from the database.
*/
public static int overloadError(int one, int two) {
return one + two;
}
/**
* This method is called via reflection from the database.
*/
public static int overloadError(double one, double two) {
return (int) (one + two);
}
......
......@@ -269,6 +269,9 @@ public class TestFunctions extends TestBase {
assertEquals(value, s);
}
/**
* This method is called via reflection from the database.
*/
public static BufferedInputStream blob2stream(Blob value) throws SQLException {
if (value == null) {
return null;
......@@ -277,6 +280,9 @@ public class TestFunctions extends TestBase {
return bufferedInStream;
}
/**
* This method is called via reflection from the database.
*/
public static BufferedInputStream stream2stream(InputStream value) {
if (value == null) {
return null;
......@@ -285,6 +291,9 @@ public class TestFunctions extends TestBase {
return bufferedInStream;
}
/**
* This method is called via reflection from the database.
*/
public static int addRow(Connection conn, int id, String name) throws SQLException {
conn.createStatement().execute("INSERT INTO TEST VALUES(" + id + ", '" + name + "')");
ResultSet rs = conn.createStatement().executeQuery("SELECT COUNT(*) FROM TEST");
......@@ -294,19 +303,31 @@ public class TestFunctions extends TestBase {
return result;
}
/**
* This method is called via reflection from the database.
*/
public static ResultSet select(Connection conn, String sql) throws SQLException {
Statement stat = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
return stat.executeQuery(sql);
}
/**
* This method is called via reflection from the database.
*/
public static ResultSet selectMaxId(Connection conn) throws SQLException {
return conn.createStatement().executeQuery("SELECT MAX(ID) FROM TEST");
}
/**
* This method is called via reflection from the database.
*/
public static Object[] getArray() {
return new Object[] { new Integer(0), "Hello" };
}
/**
* This method is called via reflection from the database.
*/
public static ResultSet nullResultSet(Connection conn) throws SQLException {
PreparedStatement statement = conn.prepareStatement("select null from system_range(1,1)");
return statement.executeQuery();
......@@ -349,6 +370,9 @@ public class TestFunctions extends TestBase {
return rs;
}
/**
* This method is called via reflection from the database.
*/
public static int root(int value) {
if (value < 0) {
TestBase.logError("function called but should not", null);
......
......@@ -131,6 +131,14 @@ public class TestMultiDimension extends TestBase {
conn.close();
}
/**
* This method is called via reflection from the database.
*
* @param x the x value
* @param y the y value
* @param z the z value
* @return the bit-interleaved value
*/
public static long interleave(int x, int y, int z) {
return MultiDimension.getInstance().interleave(new int[] { x, y, z });
}
......
......@@ -24,7 +24,13 @@ public class TestOpenClose extends TestBase implements DatabaseEventListener {
int nextId = 10;
public static void main(String[] a) throws Exception {
/**
* This method is called when executing this application from the command
* line.
*
* @param args the command line parameters
*/
public static void main(String[] args) throws Exception {
new TestOpenClose().test();
}
......
......@@ -65,7 +65,7 @@ public class TestRights extends TestBase {
conn.close();
}
public void testSchemaRenameUser() throws Exception {
void testSchemaRenameUser() throws Exception {
if (config.memory) {
return;
}
......@@ -98,7 +98,7 @@ public class TestRights extends TestBase {
conn.close();
}
public void testAccessRights() throws Exception {
void testAccessRights() throws Exception {
if (config.memory) {
return;
}
......@@ -246,7 +246,7 @@ public class TestRights extends TestBase {
executeSuccess("DROP TABLE TEST");
}
public void executeError(String sql) throws Exception {
void executeError(String sql) throws Exception {
try {
stat.execute(sql);
fail("not admin");
......@@ -255,7 +255,7 @@ public class TestRights extends TestBase {
}
}
public void executeSuccess(String sql) throws Exception {
void executeSuccess(String sql) throws Exception {
if (stat.execute(sql)) {
ResultSet rs = stat.getResultSet();
......
......@@ -23,6 +23,12 @@ public class TestRunscript extends TestBase implements Trigger {
test(true);
}
/**
* This method is called via reflection from the database.
*
* @param a the value
* @return the absolute value
*/
public static int test(int a) {
return Math.abs(a);
}
......
......@@ -153,6 +153,9 @@ public class TestCancel extends TestBase {
}
}
/**
* This method is called via reflection from the database.
*/
public static int visit(int x) {
lastVisited = x;
return x;
......
......@@ -84,6 +84,11 @@ public class TestXid implements Xid {
}
}
/**
* This method is called when executing this application.
*
* @param args the command line parameters
*/
public static void main(String[] args) {
new TestXid();
}
......
......@@ -19,6 +19,12 @@ public class Listener implements Runnable {
volatile int maxValue;
/**
* This method is called when executing this application from the command
* line.
*
* @param args the command line parameters
*/
public static void main(String[] args) throws Exception {
new Listener().test(args);
}
......
......@@ -85,6 +85,12 @@ public class Test {
}
}
/**
* This method is called when executing this application from the command
* line.
*
* @param args the command line parameters
*/
public static void main(String[] args) throws Exception {
new Test().test(args);
}
......
......@@ -56,6 +56,12 @@ public class TestRecover {
// System.getProperty("test.driver",
// "org.apache.derby.jdbc.EmbeddedDriver");
/**
* This method is called when executing this application from the command
* line.
*
* @param args the command line parameters
*/
public static void main(String[] args) throws Exception {
new TestRecover().runTest();
}
......
......@@ -25,6 +25,12 @@ public class TestWrite {
// utility class
}
/**
* This method is called when executing this application from the command
* line.
*
* @param args the command line parameters
*/
public static void main(String[] args) throws Exception {
testFile("rw", false);
testFile("rwd", false);
......
......@@ -49,7 +49,7 @@ public class WebClient {
this.sessionId = id;
}
public String get(String url, String page) throws IOException {
String get(String url, String page) throws IOException {
if (sessionId != null) {
if (page.indexOf('?') < 0) {
page += "?";
......
......@@ -44,7 +44,7 @@ import org.h2.util.RandomUtils;
*/
public class TestCrashAPI extends TestBase {
public static final Class[] INTERFACES = { Connection.class, PreparedStatement.class, Statement.class,
private static final Class[] INTERFACES = { Connection.class, PreparedStatement.class, Statement.class,
ResultSet.class, ResultSetMetaData.class, Savepoint.class,
ParameterMetaData.class, Clob.class, Blob.class, Array.class, CallableStatement.class };
......
......@@ -229,7 +229,7 @@ public abstract class TestHalt extends TestBase {
}
}
public void disconnectHSQLDB() {
void disconnectHSQLDB() {
try {
conn.createStatement().execute("SHUTDOWN");
} catch (Exception e) {
......@@ -238,7 +238,7 @@ public abstract class TestHalt extends TestBase {
// super.disconnect();
}
public void disconnectDerby() {
void disconnectDerby() {
// super.disconnect();
try {
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
......
......@@ -20,6 +20,12 @@ public class TestHaltApp extends TestHalt {
private int rowCount;
/**
* This method is called when executing this application from the command
* line.
*
* @param args the command line parameters
*/
public static void main(String[] args) throws Exception {
SelfDestructor.startCountdown(60);
baseDir = TestHalt.DIR;
......
......@@ -25,6 +25,11 @@ public class TestKillProcess {
// utility class
}
/**
* This method is called when executing this application.
*
* @param args the command line parameters
*/
public static void main(String[] args) throws Exception {
SelfDestructor.startCountdown(60);
try {
......
......@@ -62,6 +62,12 @@ public class TestKillRestart extends TestBase {
}
}
/**
* This method is called when executing this application from the command
* line.
*
* @param args the command line parameters
*/
public static void main(String[] args) throws Exception {
SelfDestructor.startCountdown(60);
String driver = "org.h2.Driver";
......
......@@ -113,6 +113,12 @@ public class TestKillRestartMulti extends TestBase {
}
}
/**
* This method is called when executing this application from the command
* line.
*
* @param args the command line parameters
*/
public static void main(String[] args) throws Exception {
SelfDestructor.startCountdown(60);
new TestKillRestartMulti().test(args);
......
......@@ -13,26 +13,78 @@ import java.sql.SQLException;
*/
public interface DbInterface {
/**
* Drop all objects in the database.
*/
void reset() throws SQLException;
/**
* Connect to the database.
*/
void connect() throws Exception;
/**
* Disconnect from the database.
*/
void disconnect() throws SQLException;
/**
* Close the connection and the database.
*/
void end() throws SQLException;
/**
* Create the specified table.
*
* @param table the table to create
*/
void createTable(Table table) throws SQLException;
/**
* Drop the specified table.
*
* @param table the table to drop
*/
void dropTable(Table table) throws SQLException;
/**
* Create an index.
*
* @param index the index to create
*/
void createIndex(Index index) throws SQLException;
/**
* Drop an index.
*
* @param index the index to drop
*/
void dropIndex(Index index) throws SQLException;
/**
* Insert a row into a table.
*
* @param table the table
* @param c the column list
* @param v the values
* @return the result
*/
Result insert(Table table, Column[] c, Value[] v) throws SQLException;
/**
* Execute a query.
*
* @param sql the SQL statement
*/
Result select(String sql) throws SQLException;
/**
* Delete a number of rows.
*
* @param table the table
* @param condition the condition
* @return the result
*/
Result delete(Table table, String condition) throws SQLException;
/**
......@@ -46,9 +98,20 @@ public interface DbInterface {
*/
Result update(Table table, Column[] columns, Value[] values, String condition) throws SQLException;
/**
* Enable or disable autocommit.
*
* @param b the new value
*/
void setAutoCommit(boolean b) throws SQLException;
/**
* Commit a pending transaction.
*/
void commit() throws SQLException;
/**
* Roll back a pending transaction.
*/
void rollback() throws SQLException;
}
......@@ -80,7 +80,7 @@ public class DbState implements DbInterface {
// nothing to do
}
public Table randomTable() {
Table randomTable() {
if (tables.size() == 0) {
return null;
}
......
......@@ -32,15 +32,15 @@ public class TestSynth extends TestBase {
private boolean stopImmediately;
private int mode;
public boolean is(int isType) {
boolean is(int isType) {
return mode == isType;
}
public RandomGen random() {
RandomGen random() {
return random;
}
public String randomIdentifier() {
String randomIdentifier() {
int len = random.getLog(8) + 2;
while (true) {
return random.randomString(len);
......@@ -193,11 +193,11 @@ public class TestSynth extends TestBase {
}
}
public Table randomTable() {
Table randomTable() {
return db.randomTable();
}
public void log(int id, String s) {
void log(int id, String s) {
if (showLog && id == 0) {
System.out.println(s);
}
......
......@@ -64,6 +64,12 @@ public class TestExit extends TestBase implements DatabaseEventListener {
}
}
/**
* This method is called when executing this application from the command
* line.
*
* @param args the command line parameters
*/
public static void main(String[] args) throws Exception {
SelfDestructor.startCountdown(60);
if (args.length == 0) {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论