/*
* Copyright 2004-2014 H2 Group. Multiple-Licensed under the MPL 2.0,
* and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.test.db;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.h2.test.TestBase;
import org.h2.value.DataType;
/**
* Tests the "create index ... using" syntax.
*
* @author Erwan Bocher Atelier SIG, IRSTV FR CNRS 2488
*/
public class TestUsingIndex extends TestBase {
private Connection conn;
private Statement stat;
/**
* Run just this test.
*
* @param a ignored
*/
public static void main(String... a) throws Exception {
TestBase.createCaller().init().test();
}
@Override
public void test() throws SQLException {
deleteDb("using_index");
testUsingBadSyntax();
testUsingGoodSyntax();
testHashIndex();
testSpatialIndex();
testBadSpatialSyntax();
}
private void testHashIndex() throws SQLException {
conn = getConnection("using_index");
stat = conn.createStatement();
stat.execute("create table test(id int)");
stat.execute("create index idx_name on test(id) using hash");
stat.execute("insert into test select x from system_range(1, 1000)");
ResultSet rs = stat.executeQuery("select * from test where id=100");
assertTrue(rs.next());
assertFalse(rs.next());
stat.execute("delete from test where id=100");
rs = stat.executeQuery("select * from test where id=100");
assertFalse(rs.next());
rs = stat.executeQuery("select min(id), max(id) from test");
assertTrue(rs.next());
assertEquals(1, rs.getInt(1));
assertEquals(1000, rs.getInt(2));
stat.execute("drop table test");
conn.close();
deleteDb("using_index");
}
private void testUsingBadSyntax() throws SQLException {
conn = getConnection("using_index");
stat = conn.createStatement();
stat.execute("create table test(id int)");
assertFalse(isSupportedSyntax(stat,
"create hash index idx_name_1 on test(id) using hash"));
assertFalse(isSupportedSyntax(stat,
"create hash index idx_name_2 on test(id) using btree"));
assertFalse(isSupportedSyntax(stat,
"create index idx_name_3 on test(id) using hash_tree"));
assertFalse(isSupportedSyntax(stat,
"create unique hash index idx_name_4 on test(id) using hash"));
assertFalse(isSupportedSyntax(stat,
"create index idx_name_5 on test(id) using hash table"));
conn.close();
deleteDb("using_index");
}
private void testUsingGoodSyntax() throws SQLException {
conn = getConnection("using_index");
stat = conn.createStatement();
stat.execute("create table test(id int)");
assertTrue(isSupportedSyntax(stat,
"create index idx_name_1 on test(id) using hash"));
assertTrue(isSupportedSyntax(stat,
"create index idx_name_2 on test(id) using btree"));
assertTrue(isSupportedSyntax(stat,
"create unique index idx_name_3 on test(id) using hash"));
conn.close();
deleteDb("using_index");
}
/**
* Return if the syntax is supported otherwise false
*
* @param stat the statement
* @param sql the SQL statement
* @return true if the query works, false if it fails
*/
private static boolean isSupportedSyntax(Statement stat, String sql) {
try {
stat.execute(sql);
return true;
} catch (SQLException ex) {
return false;
}
}
private void testSpatialIndex() throws SQLException {
if (!config.mvStore && config.mvcc) {
return;
}
if (config.memory && config.mvcc) {
return;
}
if (DataType.GEOMETRY_CLASS == null) {
return;
}
deleteDb("spatial");
conn = getConnection("spatial");
stat = conn.createStatement();
stat.execute("create table test"
+ "(id int primary key, poly geometry)");
stat.execute("insert into test values(1, "
+ "'POLYGON ((1 1, 1 2, 2 2, 1 1))')");
stat.execute("insert into test values(2,null)");
stat.execute("insert into test values(3, "
+ "'POLYGON ((3 1, 3 2, 4 2, 3 1))')");
stat.execute("insert into test values(4,null)");
stat.execute("insert into test values(5, "
+ "'POLYGON ((1 3, 1 4, 2 4, 1 3))')");
stat.execute("create index on test(poly) using rtree");
ResultSet rs = stat.executeQuery(
"select * from test "
+ "where poly && 'POINT (1.5 1.5)'::Geometry");
assertTrue(rs.next());
assertEquals(1, rs.getInt("id"));
assertFalse(rs.next());
rs.close();
conn.close();
deleteDb("spatial");
}
private void testBadSpatialSyntax() throws SQLException {
if (!config.mvStore && config.mvcc) {
return;
}
if (config.memory && config.mvcc) {
return;
}
if (DataType.GEOMETRY_CLASS == null) {
return;
}
deleteDb("spatial");
conn = getConnection("spatial");
stat = conn.createStatement();
stat.execute("create table test"
+ "(id int primary key, poly geometry)");
stat.execute("insert into test values(1, "
+ "'POLYGON ((1 1, 1 2, 2 2, 1 1))')");
assertFalse(isSupportedSyntax(stat,
"create spatial index on test(poly) using rtree"));
conn.close();
deleteDb("spatial");
}
}