提交 f6f3a3d8 authored 作者: Noel Grandin's avatar Noel Grandin

address review comments

上级 c3deabaa
...@@ -187,9 +187,7 @@ public class Select extends Query { ...@@ -187,9 +187,7 @@ public class Select extends Query {
public void setCurrentGroupExprData(Expression expr, Object obj) { public void setCurrentGroupExprData(Expression expr, Object obj) {
Integer index = exprToIndexInGroupByData.get(expr); Integer index = exprToIndexInGroupByData.get(expr);
if (index != null) { if (index != null) {
if (currentGroupByExprData[index] != null) { assert currentGroupByExprData[index] != null;
throw DbException.throwInternalError();
}
currentGroupByExprData[index] = obj; currentGroupByExprData[index] = obj;
return; return;
} }
...@@ -368,6 +366,7 @@ public class Select extends Query { ...@@ -368,6 +366,7 @@ public class Select extends Query {
currentGroupByExprData = null; currentGroupByExprData = null;
currentGroupsKey = null; currentGroupsKey = null;
exprToIndexInGroupByData.clear(); exprToIndexInGroupByData.clear();
try {
int rowNumber = 0; int rowNumber = 0;
setCurrentRowNumber(0); setCurrentRowNumber(0);
ValueArray defaultGroup = ValueArray.get(new Value[0]); ValueArray defaultGroup = ValueArray.get(new Value[0]);
...@@ -407,7 +406,8 @@ public class Select extends Query { ...@@ -407,7 +406,8 @@ public class Select extends Query {
} }
} }
if (groupIndex == null && groupByData.size() == 0) { if (groupIndex == null && groupByData.size() == 0) {
groupByData.put(defaultGroup, new Object[Math.max(exprToIndexInGroupByData.size(), expressions.size())]); groupByData.put(defaultGroup,
new Object[Math.max(exprToIndexInGroupByData.size(), expressions.size())]);
} }
ArrayList<Value> keys = groupByData.keys(); ArrayList<Value> keys = groupByData.keys();
for (Value v : keys) { for (Value v : keys) {
...@@ -431,11 +431,13 @@ public class Select extends Query { ...@@ -431,11 +431,13 @@ public class Select extends Query {
row = keepOnlyDistinct(row, columnCount); row = keepOnlyDistinct(row, columnCount);
result.addRow(row); result.addRow(row);
} }
} finally {
groupByData = null; groupByData = null;
currentGroupsKey = null; currentGroupsKey = null;
currentGroupByExprData = null; currentGroupByExprData = null;
exprToIndexInGroupByData.clear(); exprToIndexInGroupByData.clear();
} }
}
/** /**
* Get the index that matches the ORDER BY list, if one exists. This is to * Get the index that matches the ORDER BY list, if one exists. This is to
......
...@@ -19,14 +19,13 @@ import org.h2.value.ValueNull; ...@@ -19,14 +19,13 @@ import org.h2.value.ValueNull;
* <p> * <p>
* HashMap in archaic versions of Java have some overhead for allocation of * HashMap in archaic versions of Java have some overhead for allocation of
* entries, but slightly better behaviour with limited number of collisions, * entries, but slightly better behaviour with limited number of collisions,
* because collisions have no impact on non-colliding entires. HashMap in modern * because collisions have no impact on non-colliding entries. HashMap in modern
* versions of Java also have the same overhead, but it builds a trees of keys * versions of Java also have the same overhead, but it builds a trees of keys
* with colliding hashes, that's why even if the all keys have exactly the same * with colliding hashes, that's why even if the all keys have exactly the same
* hash code it still offers a good performance similar to TreeMap. So * hash code it still offers a good performance similar to TreeMap. So
* ValueHashMap is faster in typical cases, but may behave really bad in some * ValueHashMap is faster in typical cases, but may behave really bad in some
* cases. HashMap is slower in typical cases, but its performance does not * cases. HashMap is slower in typical cases, but its performance does not
* degrade too much even in the worst possible case (if keys are comparable, * degrade too much even in the worst possible case (if keys are comparable).
* like our Value class).
* *
* @param <V> the value type * @param <V> the value type
*/ */
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论