提交 9947934e authored 作者: Evgenij Ryazanov's avatar Evgenij Ryazanov

Optimize MergeUsing.isTargetRowFound()

上级 47ff9145
...@@ -240,44 +240,38 @@ public class MergeUsing extends Prepared { ...@@ -240,44 +240,38 @@ public class MergeUsing extends Prepared {
} }
private boolean isTargetRowFound() { private boolean isTargetRowFound() {
ResultInterface rows = targetMatchQuery.query(0); try (ResultInterface rows = targetMatchQuery.query(0)) {
int countTargetRowsFound = 0; if (!rows.next()) {
Value[] targetRowIdValue = null; return false;
}
while (rows.next()) { Value targetRowId = rows.currentRow()[0];
countTargetRowsFound++; Integer number = targetRowidsRemembered.get(targetRowId);
targetRowIdValue = rows.currentRow();
// throw and exception if we have processed this _ROWID_ before... // throw and exception if we have processed this _ROWID_ before...
if (targetRowidsRemembered.containsKey(targetRowIdValue[0])) { if (number != null) {
throw DbException.get(ErrorCode.DUPLICATE_KEY_1, throw DbException.get(ErrorCode.DUPLICATE_KEY_1,
"Merge using ON column expression, " + "Merge using ON column expression, " +
"duplicate _ROWID_ target record already updated, deleted or inserted:_ROWID_=" "duplicate _ROWID_ target record already updated, deleted or inserted:_ROWID_="
+ targetRowIdValue[0].toString() + ":in:" + targetRowId + ":in:"
+ targetTableFilter.getTable() + targetTableFilter.getTable()
+ ":conflicting source row number:" + ":conflicting source row number:"
+ targetRowidsRemembered + number);
.get(targetRowIdValue[0]));
} else {
// remember the source column values we have used before (they
// are the effective ON clause keys
// and should not be repeated
targetRowidsRemembered.put(targetRowIdValue[0],
sourceQueryRowNumber);
} }
// remember the source column values we have used before (they
// are the effective ON clause keys
// and should not be repeated
targetRowidsRemembered.put(targetRowId, sourceQueryRowNumber);
if (rows.next()) {
throw DbException.get(ErrorCode.DUPLICATE_KEY_1,
"Duplicate key updated "
+ rows.getRowCount()
+ " rows at once, only 1 expected:_ROWID_="
+ targetRowId + ":in:"
+ targetTableFilter.getTable()
+ ":conflicting source row number:"
+ targetRowidsRemembered.get(targetRowId));
}
return true;
} }
rows.close();
if (countTargetRowsFound > 1) {
throw DbException.get(ErrorCode.DUPLICATE_KEY_1,
"Duplicate key updated " + countTargetRowsFound
+ " rows at once, only 1 expected:_ROWID_="
+ targetRowIdValue[0].toString() + ":in:"
+ targetTableFilter.getTable()
+ ":conflicting source row number:"
+ targetRowidsRemembered.get(targetRowIdValue[0]));
}
return countTargetRowsFound > 0;
} }
private int addRowByCommandInsert(Row sourceRow) { private int addRowByCommandInsert(Row sourceRow) {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论