提交 8dc282eb authored 作者: noelgrandin's avatar noelgrandin

and fix a similar bug in unique hash indexes

上级 c5177149
...@@ -21,7 +21,7 @@ Change Log ...@@ -21,7 +21,7 @@ Change Log
<ul><li>Improved spatial index and data type. <ul><li>Improved spatial index and data type.
</li><li>Issue 467: OSGi Class Loader (ability to create reference to class </li><li>Issue 467: OSGi Class Loader (ability to create reference to class
in other ClassLoader, for example in another OSGi bundle). in other ClassLoader, for example in another OSGi bundle).
</li><li>Fix bug in non-unique hash index which manifested as incorrect results </li><li>Fix bug in unique and non-unique hash indexes which manifested as incorrect results
when the search key was a different cardinal type from the table index key. 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 e.g. where the one was INT and the other was LONG
</li></ul> </li></ul>
......
...@@ -68,8 +68,16 @@ public class HashIndex extends BaseIndex { ...@@ -68,8 +68,16 @@ public class HashIndex extends BaseIndex {
// TODO hash index: should additionally check if values are the same // TODO hash index: should additionally check if values are the same
throw DbException.throwInternalError(); throw DbException.throwInternalError();
} }
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());
Row result; Row result;
Long pos = rows.get(first.getValue(indexColumn)); Long pos = rows.get(v);
if (pos == null) { if (pos == null) {
result = null; result = null;
} else { } else {
......
...@@ -510,6 +510,10 @@ public class TestIndex extends TestBase { ...@@ -510,6 +510,10 @@ public class TestIndex extends TestBase {
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 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)"); stat.execute("create hash index idx2 on hash_index_test(data)");
assertEquals(10, getValue("select count(*) from hash_index_test where data = 1")); assertEquals(10, getValue("select count(*) from hash_index_test where data = 1"));
stat.execute("drop index idx2");
stat.execute("create unique hash index idx2 on hash_index_test(id)");
assertEquals(1, getValue("select count(*) from hash_index_test where id = 1"));
} }
private int getValue(String sql) throws SQLException { private int getValue(String sql) throws SQLException {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论