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 {
return rowNumber;
}
@Override
public void limitsWereApplied() {
// Nothing to do
}
@Override
public String getPlanSQL() {
StatementBuilder buff = new StatementBuilder("INSERT INTO ");
......
......@@ -654,14 +654,30 @@ public class Select extends Query {
if (result == null) {
return lazyResult;
}
if (sort != null && !sortUsingIndex || limitRows < 0 || withTies) {
if (limitRows < 0 || sort != null && !sortUsingIndex || withTies && !quickOffset) {
limitRows = Long.MAX_VALUE;
}
Value[] row = null;
while (result.getRowCount() < limitRows && lazyResult.next()) {
if (forUpdateRows != null) {
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) {
topTableFilter.lockRows(forUpdateRows);
......
......@@ -42,6 +42,7 @@ public class LocalResult implements ResultInterface, ResultTarget {
private int offset;
private int limit = -1;
private boolean withTies;
private boolean limitsWereApplied;
private ResultExternal external;
private boolean distinct;
private int[] distinctIndexes;
......@@ -381,6 +382,9 @@ public class LocalResult implements ResultInterface, ResultTarget {
}
private void applyOffsetAndLimit() {
if (limitsWereApplied) {
return;
}
int offset = Math.max(this.offset, 0);
int limit = this.limit;
if (offset == 0 && limit < 0 || rowCount == 0) {
......@@ -411,8 +415,10 @@ public class LocalResult implements ResultInterface, ResultTarget {
rowCount++;
}
}
// avoid copying the whole array for each row
rows = new ArrayList<>(rows.subList(offset, to));
if (offset != 0 || to != rows.size()) {
// avoid copying the whole array for each row
rows = new ArrayList<>(rows.subList(offset, to));
}
} else {
if (clearAll) {
external.close();
......@@ -459,6 +465,11 @@ public class LocalResult implements ResultInterface, ResultTarget {
return rowCount;
}
@Override
public void limitsWereApplied() {
this.limitsWereApplied = true;
}
@Override
public boolean hasNext() {
return !closed && rowId < rowCount - 1;
......
......@@ -26,4 +26,11 @@ public interface ResultTarget {
*/
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 {
"TABLE_SCHEMA",
"TABLE_NAME",
"COLUMN_NAME",
"ORDINAL_POSITION",
"POSITION_IN_UNIQUE_CONSTRAINT"
"ORDINAL_POSITION INT",
"POSITION_IN_UNIQUE_CONSTRAINT INT"
);
indexColumnName = "TABLE_NAME";
break;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论