Unverified 提交 7a2a5446 authored 作者: Evgenij Ryazanov's avatar Evgenij Ryazanov 提交者: GitHub

Merge pull request #1141 from katzyn/misc

Assorted optimizations and fixes
......@@ -21,6 +21,24 @@ Change Log
<h2>Next Version (unreleased)</h2>
<ul>
<li>PR #1138, #1139: Fix a memory leak caused by DatabaseCloser objects
</li>
<li>PR #1137: Step toward making transaction commit atomic
</li>
<li>PR #1136: Assorted minor optimizations
</li>
<li>PR #1134: Detect possible overflow in integer division and optimize some code
</li>
<li>PR #1133: Implement Comparable&lt;Value&gt; in CompareMode and optimize ValueHashMap.keys()
</li>
<li>PR #1132: Reduce allocation of ExpressionVisitor instances
</li>
<li>PR #1130: Improve TestScript and TestCrashAPI
</li>
<li>PR #1128: Fix ON DUPLICATE KEY UPDATE with ENUM
</li>
<li>PR #1127: Update JdbcDatabaseMetaData.getSQLKeywords() and perform some minor optimizations
</li>
<li>PR #1126: Fix an issue with code coverage and building of documentation
</li>
<li>PR #1123: Fix TCP version check
......
......@@ -2062,7 +2062,7 @@ public class ErrorCode {
case FEATURE_NOT_SUPPORTED_1: return "HYC00";
case LOCK_TIMEOUT_1: return "HYT00";
default:
return "" + errorCode;
return Integer.toString(errorCode);
}
}
......
......@@ -343,7 +343,7 @@ public abstract class Prepared {
*
* @param rowNumber the row number
*/
protected void setCurrentRowNumber(int rowNumber) {
public void setCurrentRowNumber(int rowNumber) {
if ((++rowScanCount & 127) == 0) {
checkCanceled();
}
......
......@@ -520,7 +520,7 @@ public abstract class Query extends Prepared {
}
idx -= 1;
if (idx < 0 || idx >= expressionCount) {
throw DbException.get(ErrorCode.ORDER_BY_NOT_IN_RESULT, "" + (idx + 1));
throw DbException.get(ErrorCode.ORDER_BY_NOT_IN_RESULT, Integer.toString(idx + 1));
}
}
index[i] = idx;
......
......@@ -411,7 +411,7 @@ public class Database implements DataHandler {
if (now > reconnectCheckNext) {
if (pending) {
String pos = pageStore == null ?
null : "" + pageStore.getWriteCountTotal();
null : Long.toString(pageStore.getWriteCountTotal());
lock.setProperty("logPos", pos);
lock.save();
}
......@@ -433,7 +433,7 @@ public class Database implements DataHandler {
}
}
String pos = pageStore == null ?
null : "" + pageStore.getWriteCountTotal();
null : Long.toString(pageStore.getWriteCountTotal());
lock.setProperty("logPos", pos);
if (pending) {
lock.setProperty("changePending", "true-" + Math.random());
......@@ -2646,7 +2646,7 @@ public class Database implements DataHandler {
long now = System.nanoTime();
if (now > reconnectCheckNext + reconnectCheckDelayNs) {
if (SysProperties.CHECK && checkpointAllowed < 0) {
DbException.throwInternalError("" + checkpointAllowed);
DbException.throwInternalError(Integer.toString(checkpointAllowed));
}
synchronized (reconnectSync) {
if (checkpointAllowed > 0) {
......@@ -2716,7 +2716,7 @@ public class Database implements DataHandler {
if (reconnectModified(true)) {
checkpointAllowed++;
if (SysProperties.CHECK && checkpointAllowed > 20) {
throw DbException.throwInternalError("" + checkpointAllowed);
throw DbException.throwInternalError(Integer.toString(checkpointAllowed));
}
return true;
}
......@@ -2738,7 +2738,7 @@ public class Database implements DataHandler {
checkpointAllowed--;
}
if (SysProperties.CHECK && checkpointAllowed < 0) {
throw DbException.throwInternalError("" + checkpointAllowed);
throw DbException.throwInternalError(Integer.toString(checkpointAllowed));
}
}
......
......@@ -20,7 +20,13 @@ class OnExitDatabaseCloser extends Thread {
private static boolean registered;
private static boolean terminated;
static synchronized void register(Database db) {
if (terminated) {
// Shutdown in progress
return;
}
DATABASES.put(db, null);
if (!registered) {
// Mark as registered unconditionally to avoid further attempts to register a
......@@ -41,6 +47,11 @@ class OnExitDatabaseCloser extends Thread {
}
static synchronized void unregister(Database db) {
if (terminated) {
// Shutdown in progress, do nothing
// This method can be called from the onShutdown()
return;
}
DATABASES.remove(db);
if (DATABASES.isEmpty() && registered) {
try {
......@@ -54,11 +65,8 @@ class OnExitDatabaseCloser extends Thread {
}
}
private OnExitDatabaseCloser() {
}
@Override
public void run() {
private static synchronized void onShutdown() {
terminated = true;
RuntimeException root = null;
for (Database database : DATABASES.keySet()) {
try {
......@@ -86,4 +94,12 @@ class OnExitDatabaseCloser extends Thread {
}
}
private OnExitDatabaseCloser() {
}
@Override
public void run() {
onShutdown();
}
}
......@@ -75,7 +75,7 @@ public class Right extends DbObjectBase {
public Right(Database db, int id, RightOwner grantee, int grantedRight,
DbObject grantedObject) {
initDbObjectBase(db, id, "" + id, Trace.USER);
initDbObjectBase(db, id, Integer.toString(id), Trace.USER);
this.grantee = grantee;
this.grantedRight = grantedRight;
this.grantedObject = grantedObject;
......
......@@ -47,7 +47,7 @@ public class SettingsBase {
* @return the setting
*/
protected int get(String key, int defaultValue) {
String s = get(key, "" + defaultValue);
String s = get(key, Integer.toString(defaultValue));
try {
return Integer.decode(s);
} catch (NumberFormatException e) {
......
......@@ -333,7 +333,7 @@ public class CompareLike extends Condition {
}
return false;
default:
DbException.throwInternalError("" + types[pi]);
DbException.throwInternalError(Integer.toString(types[pi]));
}
}
return si == sLen;
......
......@@ -557,7 +557,7 @@ public class Function extends Expression implements FunctionCall {
} else {
if (index >= args.length) {
throw DbException.get(ErrorCode.INVALID_PARAMETER_COUNT_2,
info.name, "" + args.length);
info.name, Integer.toString(args.length));
}
args[index] = param;
}
......@@ -2165,7 +2165,7 @@ public class Function extends Expression implements FunctionCall {
if (len > 0 && args[len - 1] == null) {
throw DbException.get(
ErrorCode.INVALID_PARAMETER_COUNT_2,
info.name, "" + len);
info.name, Integer.toString(len));
}
}
}
......
......@@ -100,7 +100,7 @@ public class Wildcard extends Expression {
if (visitor.getType() == ExpressionVisitor.QUERY_COMPARABLE) {
return true;
}
throw DbException.throwInternalError("" + visitor.getType());
throw DbException.throwInternalError(Integer.toString(visitor.getType()));
}
@Override
......
......@@ -176,7 +176,7 @@ public class PageBtreeLeaf extends PageBtree {
written = false;
changeCount = index.getPageStore().getChangeCount();
if (entryCount <= 0) {
DbException.throwInternalError("" + entryCount);
DbException.throwInternalError(Integer.toString(entryCount));
}
int startNext = at > 0 ? offsets[at - 1] : index.getPageStore().getPageSize();
int rowLength = startNext - offsets[at];
......
......@@ -474,7 +474,7 @@ public class PageBtreeNode extends PageBtree {
written = false;
changeCount = index.getPageStore().getChangeCount();
if (entryCount < 0) {
DbException.throwInternalError("" + entryCount);
DbException.throwInternalError(Integer.toString(entryCount));
}
if (entryCount > i) {
int startNext = i > 0 ? offsets[i - 1] : index.getPageStore().getPageSize();
......
......@@ -220,7 +220,7 @@ public class PageDataLeaf extends PageData {
if (offset < start) {
writtenData = false;
if (entryCount > 1) {
DbException.throwInternalError("" + entryCount);
DbException.throwInternalError(Integer.toString(entryCount));
}
// need to write the overflow page id
start += 4;
......@@ -283,7 +283,7 @@ public class PageDataLeaf extends PageData {
}
entryCount--;
if (entryCount < 0) {
DbException.throwInternalError("" + entryCount);
DbException.throwInternalError(Integer.toString(entryCount));
}
if (firstOverflowPageId != 0) {
start -= 4;
......
......@@ -388,7 +388,7 @@ public class PageDataNode extends PageData {
entryCount--;
length -= 4 + Data.getVarLongLen(keys[removedKeyIndex]);
if (entryCount < 0) {
DbException.throwInternalError("" + entryCount);
DbException.throwInternalError(Integer.toString(entryCount));
}
keys = remove(keys, entryCount + 1, removedKeyIndex);
childPageIds = remove(childPageIds, entryCount + 2, i);
......
......@@ -46,7 +46,7 @@ public class JdbcSQLException extends SQLException {
this.originalMessage = message;
this.cause = cause;
this.stackTrace = stackTrace;
// setSQL() invokes buildBessage() by itself
// setSQL() invokes buildMessage() by itself
setSQL(sql);
initCause(cause);
}
......
......@@ -281,7 +281,8 @@ public class TransactionMap<K, V> {
Page mapRootPage = mapRootReference.root;
current = map.get(mapRootPage, key);
VersionedValue old = getValue(mapRootPage, undoLogRootReference.root, key, readLogId, current, committingTransactions);
VersionedValue old = getValue(mapRootPage, undoLogRootReference.root, key, readLogId, current,
committingTransactions);
if (!map.areValuesEqual(old, current)) {
assert current != null;
long tx = TransactionStore.getTransactionId(current.getOperationId());
......@@ -432,7 +433,7 @@ public class TransactionMap<K, V> {
* at the time when snapshot was taken
* @return the value
*/
private VersionedValue getValue(Page root, Page undoRoot, K key, long maxLog,
VersionedValue getValue(Page root, Page undoRoot, K key, long maxLog,
VersionedValue data, BitSet committingTransactions) {
while (true) {
if (data == null) {
......@@ -681,8 +682,7 @@ public class TransactionMap<K, V> {
private static final class KeyIterator<K> extends TMIterator<K,K> {
public KeyIterator(TransactionMap<K, ?> transactionMap,
K from, K to, boolean includeUncommitted) {
public KeyIterator(TransactionMap<K, ?> transactionMap, K from, K to, boolean includeUncommitted) {
super(transactionMap, from, to, includeUncommitted);
}
......@@ -714,8 +714,7 @@ public class TransactionMap<K, V> {
private final boolean includeAllUncommitted;
private X current;
protected TMIterator(TransactionMap<K,?> transactionMap, K from, K to, boolean includeAllUncommitted)
{
protected TMIterator(TransactionMap<K,?> transactionMap, K from, K to, boolean includeAllUncommitted) {
this.transactionMap = transactionMap;
TransactionStore store = transactionMap.transaction.store;
MVMap<K, VersionedValue> map = transactionMap.map;
......@@ -726,7 +725,8 @@ public class TransactionMap<K, V> {
committingTransactions = store.committingTransactions.get();
undoRoot = store.undoLog.getRootPage();
mapRootReference = map.getRoot();
} while(committingTransactions != store.committingTransactions.get() || undoRoot != store.undoLog.getRootPage());
} while (committingTransactions != store.committingTransactions.get()
|| undoRoot != store.undoLog.getRootPage());
this.root = mapRootReference.root;
this.undoRoot = undoRoot;
......
......@@ -91,15 +91,15 @@ public class TcpServerThread implements Runnable {
int minClientVersion = transfer.readInt();
if (minClientVersion < 6) {
throw DbException.get(ErrorCode.DRIVER_VERSION_ERROR_2,
"" + minClientVersion, "" + Constants.TCP_PROTOCOL_VERSION_MIN_SUPPORTED);
Integer.toString(minClientVersion), "" + Constants.TCP_PROTOCOL_VERSION_MIN_SUPPORTED);
}
int maxClientVersion = transfer.readInt();
if (maxClientVersion < Constants.TCP_PROTOCOL_VERSION_MIN_SUPPORTED) {
throw DbException.get(ErrorCode.DRIVER_VERSION_ERROR_2,
"" + maxClientVersion, "" + Constants.TCP_PROTOCOL_VERSION_MIN_SUPPORTED);
Integer.toString(maxClientVersion), "" + Constants.TCP_PROTOCOL_VERSION_MIN_SUPPORTED);
} else if (minClientVersion > Constants.TCP_PROTOCOL_VERSION_MAX_SUPPORTED) {
throw DbException.get(ErrorCode.DRIVER_VERSION_ERROR_2,
"" + minClientVersion, "" + Constants.TCP_PROTOCOL_VERSION_MAX_SUPPORTED);
Integer.toString(minClientVersion), "" + Constants.TCP_PROTOCOL_VERSION_MAX_SUPPORTED);
}
if (maxClientVersion >= Constants.TCP_PROTOCOL_VERSION_MAX_SUPPORTED) {
clientVersion = Constants.TCP_PROTOCOL_VERSION_MAX_SUPPORTED;
......
......@@ -338,8 +338,8 @@ public class WebApp {
}
private String admin() {
session.put("port", "" + server.getPort());
session.put("allowOthers", "" + server.getAllowOthers());
session.put("port", Integer.toString(server.getPort()));
session.put("allowOthers", Boolean.toString(server.getAllowOthers()));
session.put("ssl", String.valueOf(server.getSSL()));
session.put("sessions", server.getSessions());
return "admin.jsp";
......@@ -1172,16 +1172,16 @@ public class WebApp {
SimpleResultSet rs = new SimpleResultSet();
rs.addColumn("Type", Types.VARCHAR, 0, 0);
rs.addColumn("KB", Types.VARCHAR, 0, 0);
rs.addRow("Used Memory", "" + Utils.getMemoryUsed());
rs.addRow("Free Memory", "" + Utils.getMemoryFree());
rs.addRow("Used Memory", Integer.toString(Utils.getMemoryUsed()));
rs.addRow("Free Memory", Integer.toString(Utils.getMemoryFree()));
return rs;
} else if (isBuiltIn(sql, "@info")) {
SimpleResultSet rs = new SimpleResultSet();
rs.addColumn("KEY", Types.VARCHAR, 0, 0);
rs.addColumn("VALUE", Types.VARCHAR, 0, 0);
rs.addRow("conn.getCatalog", conn.getCatalog());
rs.addRow("conn.getAutoCommit", "" + conn.getAutoCommit());
rs.addRow("conn.getTransactionIsolation", "" + conn.getTransactionIsolation());
rs.addRow("conn.getAutoCommit", Boolean.toString(conn.getAutoCommit()));
rs.addRow("conn.getTransactionIsolation", Integer.toString(conn.getTransactionIsolation()));
rs.addRow("conn.getWarnings", "" + conn.getWarnings());
String map;
try {
......@@ -1190,8 +1190,8 @@ public class WebApp {
map = e.toString();
}
rs.addRow("conn.getTypeMap", "" + map);
rs.addRow("conn.isReadOnly", "" + conn.isReadOnly());
rs.addRow("conn.getHoldability", "" + conn.getHoldability());
rs.addRow("conn.isReadOnly", Boolean.toString(conn.isReadOnly()));
rs.addRow("conn.getHoldability", Integer.toString(conn.getHoldability()));
addDatabaseMetaData(rs, meta);
return rs;
} else if (isBuiltIn(sql, "@attributes")) {
......@@ -1328,7 +1328,7 @@ public class WebApp {
} else if (isBuiltIn(sql, "@maxrows")) {
int maxrows = (int) Double.parseDouble(
sql.substring("@maxrows".length()).trim());
session.put("maxrows", "" + maxrows);
session.put("maxrows", Integer.toString(maxrows));
return "${text.result.maxrowsSet}";
} else if (isBuiltIn(sql, "@parameter_meta")) {
sql = sql.substring("@parameter_meta".length()).trim();
......
......@@ -672,14 +672,11 @@ public class WebServer implements Service {
Properties old = loadProperties();
prop = new SortedProperties();
prop.setProperty("webPort",
"" + SortedProperties.getIntProperty(old,
"webPort", port));
Integer.toString(SortedProperties.getIntProperty(old, "webPort", port)));
prop.setProperty("webAllowOthers",
"" + SortedProperties.getBooleanProperty(old,
"webAllowOthers", allowOthers));
Boolean.toString(SortedProperties.getBooleanProperty(old, "webAllowOthers", allowOthers)));
prop.setProperty("webSSL",
"" + SortedProperties.getBooleanProperty(old,
"webSSL", ssl));
Boolean.toString(SortedProperties.getBooleanProperty(old, "webSSL", ssl)));
if (commandHistoryString != null) {
prop.setProperty(COMMAND_HISTORY, commandHistoryString);
}
......
......@@ -808,7 +808,7 @@ public class TableFilter implements ColumnResolver {
IndexLookupBatch lookupBatch = joinBatch.getLookupBatch(joinFilterId);
if (lookupBatch == null) {
if (joinFilterId != 0) {
throw DbException.throwInternalError("" + joinFilterId);
throw DbException.throwInternalError(Integer.toString(joinFilterId));
}
} else {
planBuff.append("batched:");
......
......@@ -264,7 +264,7 @@ public class CompressTool {
default:
throw DbException.get(
ErrorCode.UNSUPPORTED_COMPRESSION_ALGORITHM_1,
"" + algorithm);
Integer.toString(algorithm));
}
}
......
......@@ -65,7 +65,7 @@ public class MultiDimension implements Comparator<long[]> {
*/
public int getMaxValue(int dimensions) {
if (dimensions < 2 || dimensions > 32) {
throw new IllegalArgumentException("" + dimensions);
throw new IllegalArgumentException(Integer.toString(dimensions));
}
int bitsPerValue = getBitsPerValue(dimensions);
return (int) ((1L << bitsPerValue) - 1);
......@@ -270,18 +270,18 @@ public class MultiDimension implements Comparator<long[]> {
private void addMortonRanges(ArrayList<long[]> list, int[] min, int[] max,
int len, int level) {
if (level > 100) {
throw new IllegalArgumentException("" + level);
throw new IllegalArgumentException(Integer.toString(level));
}
int largest = 0, largestDiff = 0;
long size = 1;
for (int i = 0; i < len; i++) {
int diff = max[i] - min[i];
if (diff < 0) {
throw new IllegalArgumentException(""+ diff);
throw new IllegalArgumentException(Integer.toString(diff));
}
size *= diff + 1;
if (size < 0) {
throw new IllegalArgumentException("" + size);
throw new IllegalArgumentException(Long.toString(size));
}
if (diff > largestDiff) {
largestDiff = diff;
......
......@@ -102,7 +102,8 @@ public class ColumnNamer {
}
// go with a innocuous default name pattern
if (columnName == null) {
columnName = configuration.getDefaultColumnNamePattern().replace("$$", "" + (indexOfColumn + 1));
columnName = configuration.getDefaultColumnNamePattern()
.replace("$$", Integer.toString(indexOfColumn + 1));
}
if (existingColumnNames.contains(columnName) && configuration.isGenerateUniqueColumnNames()) {
columnName = generateUniqueName(columnName);
......
......@@ -86,7 +86,7 @@ public abstract class LazyFuture<T> implements Future<T> {
case S_CANCELED:
throw new CancellationException();
default:
throw DbException.throwInternalError("" + state);
throw DbException.throwInternalError(Integer.toString(state));
}
}
......
......@@ -178,7 +178,7 @@ public class NetUtils {
return new ServerSocket(port, 0, bindAddress);
} catch (BindException be) {
throw DbException.get(ErrorCode.EXCEPTION_OPENING_PORT_2,
be, "" + port, be.toString());
be, Integer.toString(port), be.toString());
} catch (IOException e) {
throw DbException.convertIOException(e, "port: " + port + " ssl: " + ssl);
}
......
......@@ -207,7 +207,7 @@ public class Profiler implements Runnable {
private static List<Object[]> readRunnableStackTraces(int pid) {
try {
String jstack = exec("jstack", "" + pid);
String jstack = exec("jstack", Integer.toString(pid));
LineNumberReader r = new LineNumberReader(
new StringReader(jstack));
return readStackTrace(r);
......
......@@ -69,7 +69,7 @@ public class SortedProperties extends Properties {
* @return the value if set, or the default value if not
*/
public static int getIntProperty(Properties prop, String key, int def) {
String value = prop.getProperty(key, "" + def);
String value = prop.getProperty(key, Integer.toString(def));
try {
return Integer.decode(value);
} catch (Exception e) {
......
......@@ -948,7 +948,7 @@ public class DataType {
return Value.RESULT_SET;
default:
throw DbException.get(
ErrorCode.UNKNOWN_DATA_TYPE_1, "" + sqlType);
ErrorCode.UNKNOWN_DATA_TYPE_1, Integer.toString(sqlType));
}
}
......
......@@ -779,7 +779,7 @@ public abstract class Value {
double d = getDouble();
if (Double.isInfinite(d) || Double.isNaN(d)) {
throw DbException.get(
ErrorCode.DATA_CONVERSION_ERROR_1, "" + d);
ErrorCode.DATA_CONVERSION_ERROR_1, Double.toString(d));
}
return ValueDecimal.get(BigDecimal.valueOf(d));
}
......@@ -787,7 +787,7 @@ public abstract class Value {
float f = getFloat();
if (Float.isInfinite(f) || Float.isNaN(f)) {
throw DbException.get(
ErrorCode.DATA_CONVERSION_ERROR_1, "" + f);
ErrorCode.DATA_CONVERSION_ERROR_1, Float.toString(f));
}
// better rounding behavior than BigDecimal.valueOf(f)
return ValueDecimal.get(new BigDecimal(Float.toString(f)));
......
......@@ -13,6 +13,7 @@ import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Time;
import java.sql.Timestamp;
import java.sql.Types;
import org.h2.engine.Mode;
import org.h2.message.DbException;
......@@ -160,7 +161,7 @@ public class ValueNull extends Value {
@Override
public void set(PreparedStatement prep, int parameterIndex)
throws SQLException {
prep.setNull(parameterIndex, DataType.convertTypeToSQLType(Value.NULL));
prep.setNull(parameterIndex, Types.NULL);
}
@Override
......
......@@ -776,3 +776,5 @@ geometries sourceschema destschema generatedcolumn alphanumerically usages
sizable instantiates renders sdt txcommit unhelpful optimiser treats rejects referring untrusted computes vacate inverted
reordered colliding evgenij archaic invocations apostrophe hypothetically testref ryazanov useless completes highlighting tends degrade
summands minuend subtrahend
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论