Unverified 提交 12f5bf71 authored 作者: Evgenij Ryazanov's avatar Evgenij Ryazanov 提交者: GitHub

Merge pull request #1325 from katzyn/misc

Optimize WITH TIES in some queries and specify data types for KEY_COLUMN_USAGE
...@@ -267,6 +267,11 @@ public class Insert extends Prepared implements ResultTarget { ...@@ -267,6 +267,11 @@ public class Insert extends Prepared implements ResultTarget {
return rowNumber; return rowNumber;
} }
@Override
public void limitsWereApplied() {
// Nothing to do
}
@Override @Override
public String getPlanSQL() { public String getPlanSQL() {
StatementBuilder buff = new StatementBuilder("INSERT INTO "); StatementBuilder buff = new StatementBuilder("INSERT INTO ");
......
...@@ -654,14 +654,30 @@ public class Select extends Query { ...@@ -654,14 +654,30 @@ public class Select extends Query {
if (result == null) { if (result == null) {
return lazyResult; return lazyResult;
} }
if (sort != null && !sortUsingIndex || limitRows < 0 || withTies) { if (limitRows < 0 || sort != null && !sortUsingIndex || withTies && !quickOffset) {
limitRows = Long.MAX_VALUE; limitRows = Long.MAX_VALUE;
} }
Value[] row = null;
while (result.getRowCount() < limitRows && lazyResult.next()) { while (result.getRowCount() < limitRows && lazyResult.next()) {
if (forUpdateRows != null) { if (forUpdateRows != null) {
topTableFilter.lockRowAdd(forUpdateRows); topTableFilter.lockRowAdd(forUpdateRows);
} }
result.addRow(lazyResult.currentRow()); row = lazyResult.currentRow();
result.addRow(row);
}
if (limitRows != Long.MAX_VALUE && withTies && sort != null && row != null) {
Value[] expected = row;
while (lazyResult.next()) {
row = lazyResult.currentRow();
if (sort.compare(expected, row) != 0) {
break;
}
if (forUpdateRows != null) {
topTableFilter.lockRowAdd(forUpdateRows);
}
result.addRow(row);
}
result.limitsWereApplied();
} }
if (forUpdateRows != null) { if (forUpdateRows != null) {
topTableFilter.lockRows(forUpdateRows); topTableFilter.lockRows(forUpdateRows);
......
...@@ -42,6 +42,7 @@ public class LocalResult implements ResultInterface, ResultTarget { ...@@ -42,6 +42,7 @@ public class LocalResult implements ResultInterface, ResultTarget {
private int offset; private int offset;
private int limit = -1; private int limit = -1;
private boolean withTies; private boolean withTies;
private boolean limitsWereApplied;
private ResultExternal external; private ResultExternal external;
private boolean distinct; private boolean distinct;
private int[] distinctIndexes; private int[] distinctIndexes;
...@@ -381,6 +382,9 @@ public class LocalResult implements ResultInterface, ResultTarget { ...@@ -381,6 +382,9 @@ public class LocalResult implements ResultInterface, ResultTarget {
} }
private void applyOffsetAndLimit() { private void applyOffsetAndLimit() {
if (limitsWereApplied) {
return;
}
int offset = Math.max(this.offset, 0); int offset = Math.max(this.offset, 0);
int limit = this.limit; int limit = this.limit;
if (offset == 0 && limit < 0 || rowCount == 0) { if (offset == 0 && limit < 0 || rowCount == 0) {
...@@ -411,8 +415,10 @@ public class LocalResult implements ResultInterface, ResultTarget { ...@@ -411,8 +415,10 @@ public class LocalResult implements ResultInterface, ResultTarget {
rowCount++; rowCount++;
} }
} }
// avoid copying the whole array for each row if (offset != 0 || to != rows.size()) {
rows = new ArrayList<>(rows.subList(offset, to)); // avoid copying the whole array for each row
rows = new ArrayList<>(rows.subList(offset, to));
}
} else { } else {
if (clearAll) { if (clearAll) {
external.close(); external.close();
...@@ -459,6 +465,11 @@ public class LocalResult implements ResultInterface, ResultTarget { ...@@ -459,6 +465,11 @@ public class LocalResult implements ResultInterface, ResultTarget {
return rowCount; return rowCount;
} }
@Override
public void limitsWereApplied() {
this.limitsWereApplied = true;
}
@Override @Override
public boolean hasNext() { public boolean hasNext() {
return !closed && rowId < rowCount - 1; return !closed && rowId < rowCount - 1;
......
...@@ -26,4 +26,11 @@ public interface ResultTarget { ...@@ -26,4 +26,11 @@ public interface ResultTarget {
*/ */
int getRowCount(); int getRowCount();
/**
* A hint that offset and limit may be ignored by this result because they
* were applied during the query. This is useful for WITH TIES clause
* because result may contain tied rows above limit.
*/
void limitsWereApplied();
} }
...@@ -590,8 +590,8 @@ public class MetaTable extends Table { ...@@ -590,8 +590,8 @@ public class MetaTable extends Table {
"TABLE_SCHEMA", "TABLE_SCHEMA",
"TABLE_NAME", "TABLE_NAME",
"COLUMN_NAME", "COLUMN_NAME",
"ORDINAL_POSITION", "ORDINAL_POSITION INT",
"POSITION_IN_UNIQUE_CONSTRAINT" "POSITION_IN_UNIQUE_CONSTRAINT INT"
); );
indexColumnName = "TABLE_NAME"; indexColumnName = "TABLE_NAME";
break; break;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论