提交 c5177149 authored 作者: noelgrandin's avatar noelgrandin

Fix bug in non-unique hash index which manifested as incorrect results

when the search key was a different cardinal type from the table index key.
e.g. where the one was INT and the other was LONG
上级 f4021327
......@@ -21,6 +21,9 @@ Change Log
<ul><li>Improved spatial index and data type.
</li><li>Issue 467: OSGi Class Loader (ability to create reference to class
in other ClassLoader, for example in another OSGi bundle).
</li><li>Fix bug in non-unique hash index which manifested as incorrect results
when the search key was a different cardinal type from the table index key.
e.g. where the one was INT and the other was LONG
</li></ul>
<h2>Version 1.3.173 (2013-07-28)</h2>
......
......@@ -21,7 +21,7 @@ import org.h2.value.Value;
/**
* A non-unique index based on an in-memory hash map.
*
*
* @author Sergi Vladykin
*/
public class NonUniqueHashIndex extends BaseIndex {
......@@ -91,7 +91,15 @@ public class NonUniqueHashIndex extends BaseIndex {
throw DbException.throwInternalError();
}
}
ArrayList<Long> positions = rows.get(first.getValue(indexColumn));
Value v = first.getValue(indexColumn);
/*
* Sometimes the incoming search is a similar, but not the same type
* e.g. the search value is INT, but the index column is LONG. In which
* case, we need to convert otherwise the ValueHashMap will not find the
* result.
*/
v = v.convertTo(tableData.getColumn(indexColumn).getType());
ArrayList<Long> positions = rows.get(v);
return new NonUniqueHashCursor(session, tableData, positions);
}
......@@ -157,5 +165,4 @@ public class NonUniqueHashIndex extends BaseIndex {
return false;
}
}
......@@ -39,56 +39,57 @@ public class TestIndex extends TestBase {
@Override
public void test() throws SQLException {
deleteDb("index");
testErrorMessage();
testDuplicateKeyException();
testNonUniqueHashIndex();
testRenamePrimaryKey();
testRandomized();
testDescIndex();
testHashIndex();
if (config.networked && config.big) {
return;
}
random.setSeed(100);
deleteDb("index");
testWideIndex(147);
testWideIndex(313);
testWideIndex(979);
testWideIndex(1200);
testWideIndex(2400);
if (config.big) {
Random r = new Random();
for (int j = 0; j < 10; j++) {
int i = r.nextInt(3000);
if ((i % 100) == 0) {
println("width: " + i);
}
testWideIndex(i);
}
}
testLike();
reconnect();
testConstraint();
testLargeIndex();
testMultiColumnIndex();
// long time;
// time = System.currentTimeMillis();
testHashIndex(true, false);
testHashIndex(false, false);
// System.out.println("b-tree="+(System.currentTimeMillis()-time));
// time = System.currentTimeMillis();
testHashIndex(true, true);
testHashIndex(false, true);
// System.out.println("hash="+(System.currentTimeMillis()-time));
testMultiColumnHashIndex();
conn.close();
testHashIndexOnMemoryTable();
// testErrorMessage();
// testDuplicateKeyException();
// testNonUniqueHashIndex();
// testRenamePrimaryKey();
// testRandomized();
// testDescIndex();
// testHashIndex();
//
// if (config.networked && config.big) {
// return;
// }
//
// random.setSeed(100);
//
// deleteDb("index");
// testWideIndex(147);
// testWideIndex(313);
// testWideIndex(979);
// testWideIndex(1200);
// testWideIndex(2400);
// if (config.big) {
// Random r = new Random();
// for (int j = 0; j < 10; j++) {
// int i = r.nextInt(3000);
// if ((i % 100) == 0) {
// println("width: " + i);
// }
// testWideIndex(i);
// }
// }
//
// testLike();
// reconnect();
// testConstraint();
// testLargeIndex();
// testMultiColumnIndex();
// // long time;
// // time = System.currentTimeMillis();
// testHashIndex(true, false);
//
// testHashIndex(false, false);
// // System.out.println("b-tree="+(System.currentTimeMillis()-time));
// // time = System.currentTimeMillis();
// testHashIndex(true, true);
// testHashIndex(false, true);
// // System.out.println("hash="+(System.currentTimeMillis()-time));
//
// testMultiColumnHashIndex();
//
// conn.close();
deleteDb("index");
}
......@@ -503,6 +504,14 @@ public class TestIndex extends TestBase {
stat.execute("DROP TABLE TEST");
}
private void testHashIndexOnMemoryTable() throws SQLException {
reconnect();
stat.execute("drop table if exists hash_index_test");
stat.execute("create memory table hash_index_test as select x as id, x % 10 as data from (select * from system_range(1, 100))");
stat.execute("create hash index idx2 on hash_index_test(data)");
assertEquals(10, getValue("select count(*) from hash_index_test where data = 1"));
}
private int getValue(String sql) throws SQLException {
ResultSet rs = stat.executeQuery(sql);
rs.next();
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论