提交 1cd15c03 authored 作者: Evgenij Ryazanov's avatar Evgenij Ryazanov

Do not allocate a new ValueArray in convertPrecision if not required

上级 206c716f
......@@ -7,13 +7,12 @@ package org.h2.value;
import java.lang.reflect.Array;
import java.sql.PreparedStatement;
import java.util.ArrayList;
import java.util.Arrays;
import org.h2.engine.Constants;
import org.h2.engine.SysProperties;
import org.h2.util.MathUtils;
import org.h2.util.StatementBuilder;
import org.h2.util.Utils;
/**
* Implementation of the ARRAY data type.
......@@ -207,18 +206,28 @@ public class ValueArray extends Value {
if (!force) {
return this;
}
ArrayList<Value> list = Utils.newSmallArrayList();
for (Value v : values) {
v = v.convertPrecision(precision, true);
int length = values.length;
Value[] newValues = new Value[length];
int i = 0;
boolean modified = false;
for (; i < length; i++) {
Value old = values[i];
Value v = old.convertPrecision(precision, true);
if (v != old) {
modified = true;
}
// empty byte arrays or strings have precision 0
// they count as precision 1 here
precision -= Math.max(1, v.getPrecision());
if (precision < 0) {
break;
}
list.add(v);
newValues[i] = v;
}
if (i < length) {
return get(Arrays.copyOf(newValues, i));
}
return get(list.toArray(new Value[0]));
return modified ? get(newValues) : this;
}
}
......@@ -336,7 +336,7 @@ public class TestValue extends TestBase {
new Value[] {ValueString.get("1"), ValueString.get("22"), ValueString.get("333")});
assertEquals(6, src.getPrecision());
assertSame(src, src.convertPrecision(5, false));
assertEquals(src, src.convertPrecision(6, true));
assertSame(src, src.convertPrecision(6, true));
ValueArray exp = ValueArray.get(
new Value[] {ValueString.get("1"), ValueString.get("22"), ValueString.get("33")});
assertEquals(exp, src.convertPrecision(5, true));
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论