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

Merge pull request #1564 from katzyn/expression

Refactor Expression implementations
...@@ -531,7 +531,7 @@ CREATE AGGREGATE [ IF NOT EXISTS ] newAggregateName FOR className ...@@ -531,7 +531,7 @@ CREATE AGGREGATE [ IF NOT EXISTS ] newAggregateName FOR className
"," ","
Creates a new user-defined aggregate function. The method name must be the full Creates a new user-defined aggregate function. The method name must be the full
qualified class name. The class must implement the interface qualified class name. The class must implement the interface
""org.h2.api.AggregateFunction"". ""org.h2.api.Aggregate"" or ""org.h2.api.AggregateFunction"".
Admin rights are required to execute this command. Admin rights are required to execute this command.
This command commits an open transaction in this connection. This command commits an open transaction in this connection.
......
...@@ -180,7 +180,8 @@ Areas considered experimental are: ...@@ -180,7 +180,8 @@ Areas considered experimental are:
<li>The PostgreSQL server <li>The PostgreSQL server
</li><li>Clustering (there are cases were transaction isolation can be broken </li><li>Clustering (there are cases were transaction isolation can be broken
due to timing issues, for example one session overtaking another session). due to timing issues, for example one session overtaking another session).
</li><li>Multi-threading within the engine using <code>SET MULTI_THREADED=1</code>. </li><li>Multi-threading within the old PageStore engine using <code>SET MULTI_THREADED=1</code>.
Default MVStore engine is multi-threaded by default.
</li><li>Compatibility modes for other databases (only some features are implemented). </li><li>Compatibility modes for other databases (only some features are implemented).
</li><li>The soft reference cache (<code>CACHE_TYPE=SOFT_LRU</code>). It might not improve performance, </li><li>The soft reference cache (<code>CACHE_TYPE=SOFT_LRU</code>). It might not improve performance,
and out of memory issues have been reported. and out of memory issues have been reported.
......
...@@ -160,14 +160,10 @@ import org.h2.expression.ConditionNot; ...@@ -160,14 +160,10 @@ import org.h2.expression.ConditionNot;
import org.h2.expression.Expression; import org.h2.expression.Expression;
import org.h2.expression.ExpressionColumn; import org.h2.expression.ExpressionColumn;
import org.h2.expression.ExpressionList; import org.h2.expression.ExpressionList;
import org.h2.expression.Function;
import org.h2.expression.FunctionCall;
import org.h2.expression.JavaFunction;
import org.h2.expression.Parameter; import org.h2.expression.Parameter;
import org.h2.expression.Rownum; import org.h2.expression.Rownum;
import org.h2.expression.SequenceValue; import org.h2.expression.SequenceValue;
import org.h2.expression.Subquery; import org.h2.expression.Subquery;
import org.h2.expression.TableFunction;
import org.h2.expression.UnaryOperation; import org.h2.expression.UnaryOperation;
import org.h2.expression.ValueExpression; import org.h2.expression.ValueExpression;
import org.h2.expression.Variable; import org.h2.expression.Variable;
...@@ -175,16 +171,21 @@ import org.h2.expression.Wildcard; ...@@ -175,16 +171,21 @@ import org.h2.expression.Wildcard;
import org.h2.expression.aggregate.AbstractAggregate; import org.h2.expression.aggregate.AbstractAggregate;
import org.h2.expression.aggregate.Aggregate; import org.h2.expression.aggregate.Aggregate;
import org.h2.expression.aggregate.Aggregate.AggregateType; import org.h2.expression.aggregate.Aggregate.AggregateType;
import org.h2.expression.aggregate.DataAnalysisOperation;
import org.h2.expression.aggregate.JavaAggregate; import org.h2.expression.aggregate.JavaAggregate;
import org.h2.expression.aggregate.Window; import org.h2.expression.analysis.DataAnalysisOperation;
import org.h2.expression.aggregate.WindowFrame; import org.h2.expression.analysis.Window;
import org.h2.expression.aggregate.WindowFrameBound; import org.h2.expression.analysis.WindowFrame;
import org.h2.expression.aggregate.WindowFrameBoundType; import org.h2.expression.analysis.WindowFrameBound;
import org.h2.expression.aggregate.WindowFrameExclusion; import org.h2.expression.analysis.WindowFrameBoundType;
import org.h2.expression.aggregate.WindowFrameUnits; import org.h2.expression.analysis.WindowFrameExclusion;
import org.h2.expression.aggregate.WindowFunction; import org.h2.expression.analysis.WindowFrameUnits;
import org.h2.expression.aggregate.WindowFunctionType; import org.h2.expression.analysis.WindowFunction;
import org.h2.expression.analysis.WindowFunctionType;
import org.h2.expression.function.DateTimeFunctions;
import org.h2.expression.function.Function;
import org.h2.expression.function.FunctionCall;
import org.h2.expression.function.JavaFunction;
import org.h2.expression.function.TableFunction;
import org.h2.index.Index; import org.h2.index.Index;
import org.h2.message.DbException; import org.h2.message.DbException;
import org.h2.result.SortOrder; import org.h2.result.SortOrder;
...@@ -199,7 +200,6 @@ import org.h2.table.Table; ...@@ -199,7 +200,6 @@ import org.h2.table.Table;
import org.h2.table.TableFilter; import org.h2.table.TableFilter;
import org.h2.table.TableFilter.TableFilterVisitor; import org.h2.table.TableFilter.TableFilterVisitor;
import org.h2.table.TableView; import org.h2.table.TableView;
import org.h2.util.DateTimeFunctions;
import org.h2.util.IntervalUtils; import org.h2.util.IntervalUtils;
import org.h2.util.MathUtils; import org.h2.util.MathUtils;
import org.h2.util.ParserUtil; import org.h2.util.ParserUtil;
......
...@@ -305,15 +305,7 @@ public class Insert extends Prepared implements ResultTarget { ...@@ -305,15 +305,7 @@ public class Insert extends Prepared implements ResultTarget {
buff.append(",\n"); buff.append(",\n");
} }
buff.append('('); buff.append('(');
buff.resetCount(); Expression.writeExpressions(buff.builder(), expr);
for (Expression e : expr) {
buff.appendExceptFirst(", ");
if (e == null) {
buff.append("DEFAULT");
} else {
e.getSQL(buff.builder());
}
}
buff.append(')'); buff.append(')');
} }
} else { } else {
......
...@@ -242,15 +242,7 @@ public class Merge extends Prepared { ...@@ -242,15 +242,7 @@ public class Merge extends Prepared {
buff.append(", "); buff.append(", ");
} }
buff.append('('); buff.append('(');
buff.resetCount(); Expression.writeExpressions(buff.builder(), expr);
for (Expression e : expr) {
buff.appendExceptFirst(", ");
if (e == null) {
buff.append("DEFAULT");
} else {
e.getSQL(buff.builder());
}
}
buff.append(')'); buff.append(')');
} }
} else { } else {
......
...@@ -19,9 +19,9 @@ import org.h2.expression.Alias; ...@@ -19,9 +19,9 @@ import org.h2.expression.Alias;
import org.h2.expression.Expression; import org.h2.expression.Expression;
import org.h2.expression.ExpressionColumn; import org.h2.expression.ExpressionColumn;
import org.h2.expression.ExpressionVisitor; import org.h2.expression.ExpressionVisitor;
import org.h2.expression.Function;
import org.h2.expression.Parameter; import org.h2.expression.Parameter;
import org.h2.expression.ValueExpression; import org.h2.expression.ValueExpression;
import org.h2.expression.function.FunctionCall;
import org.h2.message.DbException; import org.h2.message.DbException;
import org.h2.result.ResultInterface; import org.h2.result.ResultInterface;
import org.h2.result.ResultTarget; import org.h2.result.ResultTarget;
...@@ -555,8 +555,8 @@ public abstract class Query extends Prepared { ...@@ -555,8 +555,8 @@ public abstract class Query extends Prepared {
} }
} }
int count = expr.getSubexpressionCount(); int count = expr.getSubexpressionCount();
if (expr instanceof Function) { if (expr instanceof FunctionCall) {
if (!((Function) expr).isDeterministic()) { if (!((FunctionCall) expr).isDeterministic()) {
return false; return false;
} }
} else if (count <= 0) { } else if (count <= 0) {
......
...@@ -222,15 +222,7 @@ public class Replace extends Prepared { ...@@ -222,15 +222,7 @@ public class Replace extends Prepared {
buff.append(", "); buff.append(", ");
} }
buff.append('('); buff.append('(');
buff.resetCount(); Expression.writeExpressions(buff.builder(), expr);
for (Expression e : expr) {
buff.appendExceptFirst(", ");
if (e == null) {
buff.append("DEFAULT");
} else {
e.getSQL(buff.builder());
}
}
buff.append(')'); buff.append(')');
} }
} else { } else {
......
...@@ -25,8 +25,8 @@ import org.h2.expression.ExpressionColumn; ...@@ -25,8 +25,8 @@ import org.h2.expression.ExpressionColumn;
import org.h2.expression.ExpressionVisitor; import org.h2.expression.ExpressionVisitor;
import org.h2.expression.Parameter; import org.h2.expression.Parameter;
import org.h2.expression.Wildcard; import org.h2.expression.Wildcard;
import org.h2.expression.aggregate.Aggregate; import org.h2.expression.analysis.DataAnalysisOperation;
import org.h2.expression.aggregate.Window; import org.h2.expression.analysis.Window;
import org.h2.index.Cursor; import org.h2.index.Cursor;
import org.h2.index.Index; import org.h2.index.Index;
import org.h2.index.IndexType; import org.h2.index.IndexType;
...@@ -389,7 +389,7 @@ public class Select extends Query { ...@@ -389,7 +389,7 @@ public class Select extends Query {
private void queryWindow(int columnCount, LocalResult result, long offset, boolean quickOffset) { private void queryWindow(int columnCount, LocalResult result, long offset, boolean quickOffset) {
initGroupData(columnCount); initGroupData(columnCount);
try { try {
gatherGroup(columnCount, Aggregate.STAGE_WINDOW); gatherGroup(columnCount, DataAnalysisOperation.STAGE_WINDOW);
processGroupResult(columnCount, result, offset, quickOffset); processGroupResult(columnCount, result, offset, quickOffset);
} finally { } finally {
groupData.reset(); groupData.reset();
...@@ -399,12 +399,12 @@ public class Select extends Query { ...@@ -399,12 +399,12 @@ public class Select extends Query {
private void queryGroupWindow(int columnCount, LocalResult result, long offset, boolean quickOffset) { private void queryGroupWindow(int columnCount, LocalResult result, long offset, boolean quickOffset) {
initGroupData(columnCount); initGroupData(columnCount);
try { try {
gatherGroup(columnCount, Aggregate.STAGE_GROUP); gatherGroup(columnCount, DataAnalysisOperation.STAGE_GROUP);
try { try {
isGroupWindowStage2 = true; isGroupWindowStage2 = true;
while (groupData.next() != null) { while (groupData.next() != null) {
if (havingIndex < 0 || expressions.get(havingIndex).getBooleanValue(session)) { if (havingIndex < 0 || expressions.get(havingIndex).getBooleanValue(session)) {
updateAgg(columnCount, Aggregate.STAGE_WINDOW); updateAgg(columnCount, DataAnalysisOperation.STAGE_WINDOW);
} else { } else {
groupData.remove(); groupData.remove();
} }
...@@ -422,7 +422,7 @@ public class Select extends Query { ...@@ -422,7 +422,7 @@ public class Select extends Query {
private void queryGroup(int columnCount, LocalResult result, long offset, boolean quickOffset) { private void queryGroup(int columnCount, LocalResult result, long offset, boolean quickOffset) {
initGroupData(columnCount); initGroupData(columnCount);
try { try {
gatherGroup(columnCount, Aggregate.STAGE_GROUP); gatherGroup(columnCount, DataAnalysisOperation.STAGE_GROUP);
processGroupResult(columnCount, result, offset, quickOffset); processGroupResult(columnCount, result, offset, quickOffset);
} finally { } finally {
groupData.reset(); groupData.reset();
...@@ -433,7 +433,7 @@ public class Select extends Query { ...@@ -433,7 +433,7 @@ public class Select extends Query {
if (groupData == null) { if (groupData == null) {
groupData = SelectGroups.getInstance(session, expressions, isGroupQuery, groupIndex); groupData = SelectGroups.getInstance(session, expressions, isGroupQuery, groupIndex);
} else { } else {
updateAgg(columnCount, Aggregate.STAGE_RESET); updateAgg(columnCount, DataAnalysisOperation.STAGE_RESET);
} }
groupData.reset(); groupData.reset();
} }
...@@ -1742,7 +1742,7 @@ public class Select extends Query { ...@@ -1742,7 +1742,7 @@ public class Select extends Query {
groupData = SelectGroups.getInstance(getSession(), Select.this.expressions, isGroupQuery, groupIndex); groupData = SelectGroups.getInstance(getSession(), Select.this.expressions, isGroupQuery, groupIndex);
} else { } else {
// TODO is this branch possible? // TODO is this branch possible?
updateAgg(columnCount, Aggregate.STAGE_RESET); updateAgg(columnCount, DataAnalysisOperation.STAGE_RESET);
groupData.resetLazy(); groupData.resetLazy();
} }
} }
...@@ -1778,7 +1778,7 @@ public class Select extends Query { ...@@ -1778,7 +1778,7 @@ public class Select extends Query {
groupData.nextLazyGroup(); groupData.nextLazyGroup();
} }
groupData.nextLazyRow(); groupData.nextLazyRow();
updateAgg(columnCount, Aggregate.STAGE_GROUP); updateAgg(columnCount, DataAnalysisOperation.STAGE_GROUP);
if (row != null) { if (row != null) {
return row; return row;
} }
......
...@@ -14,8 +14,8 @@ import java.util.Map.Entry; ...@@ -14,8 +14,8 @@ import java.util.Map.Entry;
import org.h2.engine.Session; import org.h2.engine.Session;
import org.h2.expression.Expression; import org.h2.expression.Expression;
import org.h2.expression.aggregate.DataAnalysisOperation; import org.h2.expression.analysis.DataAnalysisOperation;
import org.h2.expression.aggregate.PartitionData; import org.h2.expression.analysis.PartitionData;
import org.h2.util.ValueHashMap; import org.h2.util.ValueHashMap;
import org.h2.value.Value; import org.h2.value.Value;
import org.h2.value.ValueArray; import org.h2.value.ValueArray;
......
...@@ -8,6 +8,7 @@ package org.h2.expression; ...@@ -8,6 +8,7 @@ package org.h2.expression;
import org.h2.engine.Mode; import org.h2.engine.Mode;
import org.h2.engine.Session; import org.h2.engine.Session;
import org.h2.expression.IntervalOperation.IntervalOpType; import org.h2.expression.IntervalOperation.IntervalOpType;
import org.h2.expression.function.Function;
import org.h2.message.DbException; import org.h2.message.DbException;
import org.h2.table.ColumnResolver; import org.h2.table.ColumnResolver;
import org.h2.table.TableFilter; import org.h2.table.TableFilter;
......
...@@ -517,4 +517,26 @@ public class CompareLike extends Condition { ...@@ -517,4 +517,26 @@ public class CompareLike extends Condition {
return left.getCost() + right.getCost() + 3; return left.getCost() + right.getCost() + 3;
} }
@Override
public int getSubexpressionCount() {
return escape == null ? 2 : 3;
}
@Override
public Expression getSubexpression(int index) {
switch (index) {
case 0:
return left;
case 1:
return right;
case 2:
if (escape != null) {
return escape;
}
//$FALL-THROUGH$
default:
throw new IndexOutOfBoundsException();
}
}
} }
...@@ -207,4 +207,20 @@ public class ConditionIn extends Condition { ...@@ -207,4 +207,20 @@ public class ConditionIn extends Condition {
} }
return null; return null;
} }
@Override
public int getSubexpressionCount() {
return 1 + valueList.size();
}
@Override
public Expression getSubexpression(int index) {
if (index == 0) {
return left;
} else if (index > 0 && index <= valueList.size()) {
return valueList.get(index - 1);
}
throw new IndexOutOfBoundsException();
}
} }
...@@ -176,4 +176,20 @@ public class ConditionInConstantSet extends Condition { ...@@ -176,4 +176,20 @@ public class ConditionInConstantSet extends Condition {
} }
return null; return null;
} }
@Override
public int getSubexpressionCount() {
return 1 + valueList.size();
}
@Override
public Expression getSubexpression(int index) {
if (index == 0) {
return left;
} else if (index > 0 && index <= valueList.size()) {
return valueList.get(index - 1);
}
throw new IndexOutOfBoundsException();
}
} }
...@@ -54,7 +54,12 @@ public abstract class Expression { ...@@ -54,7 +54,12 @@ public abstract class Expression {
if (i > 0) { if (i > 0) {
builder.append(", "); builder.append(", ");
} }
expressions[i].getSQL(builder); Expression e = expressions[i];
if (e == null) {
builder.append("DEFAULT");
} else {
e.getSQL(builder);
}
} }
} }
...@@ -373,7 +378,7 @@ public abstract class Expression { ...@@ -373,7 +378,7 @@ public abstract class Expression {
* @param value the value to extract columns from * @param value the value to extract columns from
* @return array of expression columns * @return array of expression columns
*/ */
static Expression[] getExpressionColumns(Session session, ValueArray value) { protected static Expression[] getExpressionColumns(Session session, ValueArray value) {
Value[] list = value.getList(); Value[] list = value.getList();
ExpressionColumn[] expr = new ExpressionColumn[list.length]; ExpressionColumn[] expr = new ExpressionColumn[list.length];
for (int i = 0, len = list.length; i < len; i++) { for (int i = 0, len = list.length; i < len; i++) {
......
...@@ -132,4 +132,14 @@ public class ExpressionList extends Expression { ...@@ -132,4 +132,14 @@ public class ExpressionList extends Expression {
return expr; return expr;
} }
@Override
public int getSubexpressionCount() {
return list.length;
}
@Override
public Expression getSubexpression(int index) {
return list[index];
}
} }
...@@ -20,10 +20,10 @@ import java.math.BigInteger; ...@@ -20,10 +20,10 @@ import java.math.BigInteger;
import org.h2.api.ErrorCode; import org.h2.api.ErrorCode;
import org.h2.api.IntervalQualifier; import org.h2.api.IntervalQualifier;
import org.h2.engine.Session; import org.h2.engine.Session;
import org.h2.expression.function.DateTimeFunctions;
import org.h2.message.DbException; import org.h2.message.DbException;
import org.h2.table.ColumnResolver; import org.h2.table.ColumnResolver;
import org.h2.table.TableFilter; import org.h2.table.TableFilter;
import org.h2.util.DateTimeFunctions;
import org.h2.util.IntervalUtils; import org.h2.util.IntervalUtils;
import org.h2.value.DataType; import org.h2.value.DataType;
import org.h2.value.Value; import org.h2.value.Value;
...@@ -312,22 +312,21 @@ public class IntervalOperation extends Expression { ...@@ -312,22 +312,21 @@ public class IntervalOperation extends Expression {
return left.getCost() + 1 + right.getCost(); return left.getCost() + 1 + right.getCost();
} }
/** @Override
* Get the left sub-expression of this operation. public int getSubexpressionCount() {
* return 2;
* @return the left sub-expression
*/
public Expression getLeftSubExpression() {
return left;
} }
/** @Override
* Get the right sub-expression of this operation. public Expression getSubexpression(int index) {
* switch (index) {
* @return the right sub-expression case 0:
*/ return left;
public Expression getRightSubExpression() { case 1:
return right; return right;
default:
throw new IndexOutOfBoundsException();
}
} }
} }
...@@ -14,6 +14,8 @@ import org.h2.command.dml.SelectGroups; ...@@ -14,6 +14,8 @@ import org.h2.command.dml.SelectGroups;
import org.h2.command.dml.SelectOrderBy; import org.h2.command.dml.SelectOrderBy;
import org.h2.engine.Session; import org.h2.engine.Session;
import org.h2.expression.Expression; import org.h2.expression.Expression;
import org.h2.expression.analysis.DataAnalysisOperation;
import org.h2.expression.analysis.WindowFrame;
import org.h2.table.ColumnResolver; import org.h2.table.ColumnResolver;
import org.h2.table.TableFilter; import org.h2.table.TableFilter;
import org.h2.value.Value; import org.h2.value.Value;
......
...@@ -19,6 +19,7 @@ import org.h2.engine.Session; ...@@ -19,6 +19,7 @@ import org.h2.engine.Session;
import org.h2.expression.Expression; import org.h2.expression.Expression;
import org.h2.expression.ExpressionColumn; import org.h2.expression.ExpressionColumn;
import org.h2.expression.ExpressionVisitor; import org.h2.expression.ExpressionVisitor;
import org.h2.expression.analysis.Window;
import org.h2.index.Cursor; import org.h2.index.Cursor;
import org.h2.index.Index; import org.h2.index.Index;
import org.h2.message.DbException; import org.h2.message.DbException;
...@@ -154,21 +155,6 @@ public class Aggregate extends AbstractAggregate { ...@@ -154,21 +155,6 @@ public class Aggregate extends AbstractAggregate {
ENVELOPE, ENVELOPE,
} }
/**
* Reset stage. Used to reset internal data to its initial state.
*/
public static final int STAGE_RESET = 0;
/**
* Group stage, used for explicit or implicit GROUP BY operation.
*/
public static final int STAGE_GROUP = 1;
/**
* Window processing stage.
*/
public static final int STAGE_WINDOW = 2;
private static final HashMap<String, AggregateType> AGGREGATES = new HashMap<>(64); private static final HashMap<String, AggregateType> AGGREGATES = new HashMap<>(64);
private final AggregateType type; private final AggregateType type;
......
...@@ -9,6 +9,6 @@ Initial Developer: H2 Group ...@@ -9,6 +9,6 @@ Initial Developer: H2 Group
Javadoc package documentation Javadoc package documentation
</title></head><body style="font: 9pt/130% Tahoma, Arial, Helvetica, sans-serif; font-weight: normal;"><p> </title></head><body style="font: 9pt/130% Tahoma, Arial, Helvetica, sans-serif; font-weight: normal;"><p>
Aggregate and window functions. Aggregate functions.
</p></body></html> </p></body></html>
\ No newline at end of file
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* and the EPL 1.0 (http://h2database.com/html/license.html). * and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group * Initial Developer: H2 Group
*/ */
package org.h2.expression.aggregate; package org.h2.expression.analysis;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
...@@ -29,6 +29,21 @@ import org.h2.value.ValueInt; ...@@ -29,6 +29,21 @@ import org.h2.value.ValueInt;
*/ */
public abstract class DataAnalysisOperation extends Expression { public abstract class DataAnalysisOperation extends Expression {
/**
* Reset stage. Used to reset internal data to its initial state.
*/
public static final int STAGE_RESET = 0;
/**
* Group stage, used for explicit or implicit GROUP BY operation.
*/
public static final int STAGE_GROUP = 1;
/**
* Window processing stage.
*/
public static final int STAGE_WINDOW = 2;
protected final Select select; protected final Select select;
protected Window over; protected Window over;
...@@ -49,7 +64,7 @@ public abstract class DataAnalysisOperation extends Expression { ...@@ -49,7 +64,7 @@ public abstract class DataAnalysisOperation extends Expression {
return new SortOrder(session.getDatabase(), index, sortType, null); return new SortOrder(session.getDatabase(), index, sortType, null);
} }
DataAnalysisOperation(Select select) { protected DataAnalysisOperation(Select select) {
this.select = select; this.select = select;
} }
...@@ -76,7 +91,7 @@ public abstract class DataAnalysisOperation extends Expression { ...@@ -76,7 +91,7 @@ public abstract class DataAnalysisOperation extends Expression {
* *
* @return the sort order for OVER clause * @return the sort order for OVER clause
*/ */
SortOrder getOverOrderBySort() { protected SortOrder getOverOrderBySort() {
return overOrderBySort; return overOrderBySort;
} }
...@@ -125,12 +140,12 @@ public abstract class DataAnalysisOperation extends Expression { ...@@ -125,12 +140,12 @@ public abstract class DataAnalysisOperation extends Expression {
@Override @Override
public final void updateAggregate(Session session, int stage) { public final void updateAggregate(Session session, int stage) {
if (stage == Aggregate.STAGE_RESET) { if (stage == STAGE_RESET) {
updateGroupAggregates(session, Aggregate.STAGE_RESET); updateGroupAggregates(session, STAGE_RESET);
lastGroupRowId = 0; lastGroupRowId = 0;
return; return;
} }
boolean window = stage == Aggregate.STAGE_WINDOW; boolean window = stage == STAGE_WINDOW;
if (window != (over != null)) { if (window != (over != null)) {
if (!window && select.isWindowQuery()) { if (!window && select.isWindowQuery()) {
updateGroupAggregates(session, stage); updateGroupAggregates(session, stage);
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* and the EPL 1.0 (http://h2database.com/html/license.html). * and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group * Initial Developer: H2 Group
*/ */
package org.h2.expression.aggregate; package org.h2.expression.analysis;
import java.util.HashMap; import java.util.HashMap;
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* and the EPL 1.0 (http://h2database.com/html/license.html). * and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group * Initial Developer: H2 Group
*/ */
package org.h2.expression.aggregate; package org.h2.expression.analysis;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -32,12 +32,14 @@ public final class Window { ...@@ -32,12 +32,14 @@ public final class Window {
private String parent; private String parent;
/** /**
* Appends ORDER BY clause to the specified builder.
*
* @param builder * @param builder
* string builder * string builder
* @param orderBy * @param orderBy
* ORDER BY clause, or null * ORDER BY clause, or null
*/ */
static void appendOrderBy(StringBuilder builder, ArrayList<SelectOrderBy> orderBy) { public static void appendOrderBy(StringBuilder builder, ArrayList<SelectOrderBy> orderBy) {
if (orderBy != null && !orderBy.isEmpty()) { if (orderBy != null && !orderBy.isEmpty()) {
if (builder.charAt(builder.length() - 1) != '(') { if (builder.charAt(builder.length() - 1) != '(') {
builder.append(' '); builder.append(' ');
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* and the EPL 1.0 (http://h2database.com/html/license.html). * and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group * Initial Developer: H2 Group
*/ */
package org.h2.expression.aggregate; package org.h2.expression.analysis;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* and the EPL 1.0 (http://h2database.com/html/license.html). * and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group * Initial Developer: H2 Group
*/ */
package org.h2.expression.aggregate; package org.h2.expression.analysis;
import org.h2.expression.Expression; import org.h2.expression.Expression;
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* and the EPL 1.0 (http://h2database.com/html/license.html). * and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group * Initial Developer: H2 Group
*/ */
package org.h2.expression.aggregate; package org.h2.expression.analysis;
/** /**
* Window frame bound type. * Window frame bound type.
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* and the EPL 1.0 (http://h2database.com/html/license.html). * and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group * Initial Developer: H2 Group
*/ */
package org.h2.expression.aggregate; package org.h2.expression.analysis;
/** /**
* Window frame exclusion clause. * Window frame exclusion clause.
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* and the EPL 1.0 (http://h2database.com/html/license.html). * and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group * Initial Developer: H2 Group
*/ */
package org.h2.expression.aggregate; package org.h2.expression.analysis;
/** /**
* Window frame units. * Window frame units.
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* and the EPL 1.0 (http://h2database.com/html/license.html). * and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group * Initial Developer: H2 Group
*/ */
package org.h2.expression.aggregate; package org.h2.expression.analysis;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* and the EPL 1.0 (http://h2database.com/html/license.html). * and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group * Initial Developer: H2 Group
*/ */
package org.h2.expression.aggregate; package org.h2.expression.analysis;
/** /**
* A type of a window function. * A type of a window function.
......
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!--
Copyright 2004-2018 H2 Group. Multiple-Licensed under the MPL 2.0, Version 1.0,
and under the Eclipse Public License, Version 1.0
Initial Developer: H2 Group
-->
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head><meta http-equiv="Content-Type" content="text/html;charset=utf-8" /><title>
Javadoc package documentation
</title></head><body style="font: 9pt/130% Tahoma, Arial, Helvetica, sans-serif; font-weight: normal;"><p>
Base classes for data analysis operations and implementations of window functions.
</p></body></html>
\ No newline at end of file
...@@ -3,30 +3,30 @@ ...@@ -3,30 +3,30 @@
* and the EPL 1.0 (http://h2database.com/html/license.html). * and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group * Initial Developer: H2 Group
*/ */
package org.h2.util; package org.h2.expression.function;
import static org.h2.expression.Function.CENTURY; import static org.h2.expression.function.Function.CENTURY;
import static org.h2.expression.Function.DAY_OF_MONTH; import static org.h2.expression.function.Function.DAY_OF_MONTH;
import static org.h2.expression.Function.DAY_OF_WEEK; import static org.h2.expression.function.Function.DAY_OF_WEEK;
import static org.h2.expression.Function.DAY_OF_YEAR; import static org.h2.expression.function.Function.DAY_OF_YEAR;
import static org.h2.expression.Function.DECADE; import static org.h2.expression.function.Function.DECADE;
import static org.h2.expression.Function.EPOCH; import static org.h2.expression.function.Function.EPOCH;
import static org.h2.expression.Function.HOUR; import static org.h2.expression.function.Function.HOUR;
import static org.h2.expression.Function.ISO_DAY_OF_WEEK; import static org.h2.expression.function.Function.ISO_DAY_OF_WEEK;
import static org.h2.expression.Function.ISO_WEEK; import static org.h2.expression.function.Function.ISO_WEEK;
import static org.h2.expression.Function.ISO_YEAR; import static org.h2.expression.function.Function.ISO_YEAR;
import static org.h2.expression.Function.MICROSECOND; import static org.h2.expression.function.Function.MICROSECOND;
import static org.h2.expression.Function.MILLENNIUM; import static org.h2.expression.function.Function.MILLENNIUM;
import static org.h2.expression.Function.MILLISECOND; import static org.h2.expression.function.Function.MILLISECOND;
import static org.h2.expression.Function.MINUTE; import static org.h2.expression.function.Function.MINUTE;
import static org.h2.expression.Function.MONTH; import static org.h2.expression.function.Function.MONTH;
import static org.h2.expression.Function.NANOSECOND; import static org.h2.expression.function.Function.NANOSECOND;
import static org.h2.expression.Function.QUARTER; import static org.h2.expression.function.Function.QUARTER;
import static org.h2.expression.Function.SECOND; import static org.h2.expression.function.Function.SECOND;
import static org.h2.expression.Function.TIMEZONE_HOUR; import static org.h2.expression.function.Function.TIMEZONE_HOUR;
import static org.h2.expression.Function.TIMEZONE_MINUTE; import static org.h2.expression.function.Function.TIMEZONE_MINUTE;
import static org.h2.expression.Function.WEEK; import static org.h2.expression.function.Function.WEEK;
import static org.h2.expression.Function.YEAR; import static org.h2.expression.function.Function.YEAR;
import static org.h2.util.DateTimeUtils.MILLIS_PER_DAY; import static org.h2.util.DateTimeUtils.MILLIS_PER_DAY;
import static org.h2.util.DateTimeUtils.NANOS_PER_DAY; import static org.h2.util.DateTimeUtils.NANOS_PER_DAY;
import static org.h2.util.DateTimeUtils.NANOS_PER_HOUR; import static org.h2.util.DateTimeUtils.NANOS_PER_HOUR;
...@@ -43,8 +43,10 @@ import java.util.TimeZone; ...@@ -43,8 +43,10 @@ import java.util.TimeZone;
import org.h2.api.ErrorCode; import org.h2.api.ErrorCode;
import org.h2.api.IntervalQualifier; import org.h2.api.IntervalQualifier;
import org.h2.expression.Function;
import org.h2.message.DbException; import org.h2.message.DbException;
import org.h2.util.DateTimeUtils;
import org.h2.util.IntervalUtils;
import org.h2.util.StringUtils;
import org.h2.value.Value; import org.h2.value.Value;
import org.h2.value.ValueDate; import org.h2.value.ValueDate;
import org.h2.value.ValueDecimal; import org.h2.value.ValueDecimal;
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* and the EPL 1.0 (http://h2database.com/html/license.html). * and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group * Initial Developer: H2 Group
*/ */
package org.h2.expression; package org.h2.expression.function;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
...@@ -28,6 +28,12 @@ import org.h2.engine.Constants; ...@@ -28,6 +28,12 @@ import org.h2.engine.Constants;
import org.h2.engine.Database; import org.h2.engine.Database;
import org.h2.engine.Mode; import org.h2.engine.Mode;
import org.h2.engine.Session; import org.h2.engine.Session;
import org.h2.expression.Expression;
import org.h2.expression.ExpressionColumn;
import org.h2.expression.ExpressionVisitor;
import org.h2.expression.SequenceValue;
import org.h2.expression.ValueExpression;
import org.h2.expression.Variable;
import org.h2.index.Index; import org.h2.index.Index;
import org.h2.message.DbException; import org.h2.message.DbException;
import org.h2.mode.FunctionsMSSQLServer; import org.h2.mode.FunctionsMSSQLServer;
...@@ -46,14 +52,11 @@ import org.h2.table.TableFilter; ...@@ -46,14 +52,11 @@ import org.h2.table.TableFilter;
import org.h2.tools.CompressTool; import org.h2.tools.CompressTool;
import org.h2.tools.Csv; import org.h2.tools.Csv;
import org.h2.util.Bits; import org.h2.util.Bits;
import org.h2.util.DateTimeFunctions;
import org.h2.util.DateTimeUtils; import org.h2.util.DateTimeUtils;
import org.h2.util.IOUtils; import org.h2.util.IOUtils;
import org.h2.util.JdbcUtils; import org.h2.util.JdbcUtils;
import org.h2.util.MathUtils; import org.h2.util.MathUtils;
import org.h2.util.StringUtils; import org.h2.util.StringUtils;
import org.h2.util.ToChar;
import org.h2.util.ToDateParser;
import org.h2.util.Utils; import org.h2.util.Utils;
import org.h2.value.DataType; import org.h2.value.DataType;
import org.h2.value.ExtTypeInfo; import org.h2.value.ExtTypeInfo;
......
...@@ -3,9 +3,10 @@ ...@@ -3,9 +3,10 @@
* and the EPL 1.0 (http://h2database.com/html/license.html). * and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group * Initial Developer: H2 Group
*/ */
package org.h2.expression; package org.h2.expression.function;
import org.h2.engine.Session; import org.h2.engine.Session;
import org.h2.expression.Expression;
import org.h2.value.ValueResultSet; import org.h2.value.ValueResultSet;
/** /**
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* and the EPL 1.0 (http://h2database.com/html/license.html). * and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group * Initial Developer: H2 Group
*/ */
package org.h2.expression; package org.h2.expression.function;
/** /**
* This class contains information about a built-in function. * This class contains information about a built-in function.
......
...@@ -3,12 +3,15 @@ ...@@ -3,12 +3,15 @@
* and the EPL 1.0 (http://h2database.com/html/license.html). * and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group * Initial Developer: H2 Group
*/ */
package org.h2.expression; package org.h2.expression.function;
import org.h2.command.Parser; import org.h2.command.Parser;
import org.h2.engine.Constants; import org.h2.engine.Constants;
import org.h2.engine.FunctionAlias; import org.h2.engine.FunctionAlias;
import org.h2.engine.Session; import org.h2.engine.Session;
import org.h2.expression.Expression;
import org.h2.expression.ExpressionVisitor;
import org.h2.expression.ValueExpression;
import org.h2.table.ColumnResolver; import org.h2.table.ColumnResolver;
import org.h2.table.TableFilter; import org.h2.table.TableFilter;
import org.h2.value.DataType; import org.h2.value.DataType;
...@@ -178,4 +181,14 @@ public class JavaFunction extends Expression implements FunctionCall { ...@@ -178,4 +181,14 @@ public class JavaFunction extends Expression implements FunctionCall {
return functionAlias.isBufferResultSetToLocalTemp(); return functionAlias.isBufferResultSetToLocalTemp();
} }
@Override
public int getSubexpressionCount() {
return args.length;
}
@Override
public Expression getSubexpression(int index) {
return args[index];
}
} }
...@@ -3,13 +3,15 @@ ...@@ -3,13 +3,15 @@
* and the EPL 1.0 (http://h2database.com/html/license.html). * and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group * Initial Developer: H2 Group
*/ */
package org.h2.expression; package org.h2.expression.function;
import java.util.ArrayList; import java.util.ArrayList;
import org.h2.api.ErrorCode; import org.h2.api.ErrorCode;
import org.h2.engine.Database; import org.h2.engine.Database;
import org.h2.engine.Session; import org.h2.engine.Session;
import org.h2.expression.Expression;
import org.h2.expression.ExpressionColumn;
import org.h2.message.DbException; import org.h2.message.DbException;
import org.h2.result.LocalResult; import org.h2.result.LocalResult;
import org.h2.table.Column; import org.h2.table.Column;
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* and the EPL 1.0 (http://h2database.com/html/license.html). * and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: Daniel Gredler * Initial Developer: Daniel Gredler
*/ */
package org.h2.util; package org.h2.expression.function;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.text.DateFormatSymbols; import java.text.DateFormatSymbols;
...@@ -17,6 +17,8 @@ import java.util.TimeZone; ...@@ -17,6 +17,8 @@ import java.util.TimeZone;
import org.h2.api.ErrorCode; import org.h2.api.ErrorCode;
import org.h2.message.DbException; import org.h2.message.DbException;
import org.h2.util.DateTimeUtils;
import org.h2.util.StringUtils;
import org.h2.value.Value; import org.h2.value.Value;
import org.h2.value.ValueTimestampTimeZone; import org.h2.value.ValueTimestampTimeZone;
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* and the EPL 1.0 (http://h2database.com/html/license.html). * and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: Daniel Gredler * Initial Developer: Daniel Gredler
*/ */
package org.h2.util; package org.h2.expression.function;
import static java.lang.String.format; import static java.lang.String.format;
...@@ -12,6 +12,7 @@ import java.util.GregorianCalendar; ...@@ -12,6 +12,7 @@ import java.util.GregorianCalendar;
import java.util.List; import java.util.List;
import java.util.TimeZone; import java.util.TimeZone;
import org.h2.util.DateTimeUtils;
import org.h2.value.ValueTimestamp; import org.h2.value.ValueTimestamp;
import org.h2.value.ValueTimestampTimeZone; import org.h2.value.ValueTimestampTimeZone;
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* and the EPL 1.0 (http://h2database.com/html/license.html). * and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: Daniel Gredler * Initial Developer: Daniel Gredler
*/ */
package org.h2.util; package org.h2.expression.function;
import static java.lang.String.format; import static java.lang.String.format;
import java.util.ArrayList; import java.util.ArrayList;
......
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!--
Copyright 2004-2018 H2 Group. Multiple-Licensed under the MPL 2.0, Version 1.0,
and under the Eclipse Public License, Version 1.0
Initial Developer: H2 Group
-->
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head><meta http-equiv="Content-Type" content="text/html;charset=utf-8" /><title>
Javadoc package documentation
</title></head><body style="font: 9pt/130% Tahoma, Arial, Helvetica, sans-serif; font-weight: normal;"><p>
Functions.
</p></body></html>
\ No newline at end of file
...@@ -9,6 +9,6 @@ Initial Developer: H2 Group ...@@ -9,6 +9,6 @@ Initial Developer: H2 Group
Javadoc package documentation Javadoc package documentation
</title></head><body style="font: 9pt/130% Tahoma, Arial, Helvetica, sans-serif; font-weight: normal;"><p> </title></head><body style="font: 9pt/130% Tahoma, Arial, Helvetica, sans-serif; font-weight: normal;"><p>
Expressions include mathematical operations, conditions, simple values, and functions. Expressions include mathematical operations, conditions, simple values, and others.
</p></body></html> </p></body></html>
\ No newline at end of file
...@@ -8,8 +8,8 @@ package org.h2.mode; ...@@ -8,8 +8,8 @@ package org.h2.mode;
import java.util.HashMap; import java.util.HashMap;
import org.h2.engine.Database; import org.h2.engine.Database;
import org.h2.expression.Function; import org.h2.expression.function.Function;
import org.h2.expression.FunctionInfo; import org.h2.expression.function.FunctionInfo;
/** /**
* Base class for mode-specific functions. * Base class for mode-specific functions.
......
...@@ -8,8 +8,8 @@ package org.h2.mode; ...@@ -8,8 +8,8 @@ package org.h2.mode;
import java.util.HashMap; import java.util.HashMap;
import org.h2.engine.Database; import org.h2.engine.Database;
import org.h2.expression.Function; import org.h2.expression.function.Function;
import org.h2.expression.FunctionInfo; import org.h2.expression.function.FunctionInfo;
/** /**
* Functions for {@link org.h2.engine.Mode.ModeEnum#MSSQLServer} compatibility * Functions for {@link org.h2.engine.Mode.ModeEnum#MSSQLServer} compatibility
......
...@@ -14,9 +14,9 @@ import org.h2.api.ErrorCode; ...@@ -14,9 +14,9 @@ import org.h2.api.ErrorCode;
import org.h2.engine.Database; import org.h2.engine.Database;
import org.h2.engine.Session; import org.h2.engine.Session;
import org.h2.expression.Expression; import org.h2.expression.Expression;
import org.h2.expression.Function;
import org.h2.expression.FunctionInfo;
import org.h2.expression.ValueExpression; import org.h2.expression.ValueExpression;
import org.h2.expression.function.Function;
import org.h2.expression.function.FunctionInfo;
import org.h2.message.DbException; import org.h2.message.DbException;
import org.h2.util.StringUtils; import org.h2.util.StringUtils;
import org.h2.value.DataType; import org.h2.value.DataType;
......
...@@ -1538,7 +1538,7 @@ public class MVStore { ...@@ -1538,7 +1538,7 @@ public class MVStore {
} }
} }
private void registerChunk(int chunkId) { void registerChunk(int chunkId) {
if (referencedChunks.put(chunkId, 1) == null && parent != null) { if (referencedChunks.put(chunkId, 1) == null && parent != null) {
parent.registerChunk(chunkId); parent.registerChunk(chunkId);
} }
......
...@@ -9,8 +9,8 @@ import java.util.ArrayList; ...@@ -9,8 +9,8 @@ import java.util.ArrayList;
import org.h2.api.ErrorCode; import org.h2.api.ErrorCode;
import org.h2.engine.Session; import org.h2.engine.Session;
import org.h2.expression.Expression; import org.h2.expression.Expression;
import org.h2.expression.FunctionCall; import org.h2.expression.function.FunctionCall;
import org.h2.expression.TableFunction; import org.h2.expression.function.TableFunction;
import org.h2.index.FunctionIndex; import org.h2.index.FunctionIndex;
import org.h2.index.Index; import org.h2.index.Index;
import org.h2.index.IndexType; import org.h2.index.IndexType;
......
...@@ -46,6 +46,8 @@ import org.h2.api.Aggregate; ...@@ -46,6 +46,8 @@ import org.h2.api.Aggregate;
import org.h2.api.AggregateFunction; import org.h2.api.AggregateFunction;
import org.h2.api.ErrorCode; import org.h2.api.ErrorCode;
import org.h2.engine.Constants; import org.h2.engine.Constants;
import org.h2.expression.function.ToDateParser;
import org.h2.expression.function.ToChar.Capitalization;
import org.h2.message.DbException; import org.h2.message.DbException;
import org.h2.store.fs.FileUtils; import org.h2.store.fs.FileUtils;
import org.h2.test.TestBase; import org.h2.test.TestBase;
...@@ -55,8 +57,6 @@ import org.h2.tools.SimpleResultSet; ...@@ -55,8 +57,6 @@ import org.h2.tools.SimpleResultSet;
import org.h2.util.DateTimeUtils; import org.h2.util.DateTimeUtils;
import org.h2.util.IOUtils; import org.h2.util.IOUtils;
import org.h2.util.StringUtils; import org.h2.util.StringUtils;
import org.h2.util.ToChar.Capitalization;
import org.h2.util.ToDateParser;
import org.h2.value.Value; import org.h2.value.Value;
import org.h2.value.ValueTimestamp; import org.h2.value.ValueTimestamp;
import org.h2.value.ValueTimestampTimeZone; import org.h2.value.ValueTimestampTimeZone;
......
...@@ -26,6 +26,8 @@ public class TestClearReferences extends TestBase { ...@@ -26,6 +26,8 @@ public class TestClearReferences extends TestBase {
"org.h2.compress.CompressLZF.cachedHashTable", "org.h2.compress.CompressLZF.cachedHashTable",
"org.h2.engine.DbSettings.defaultSettings", "org.h2.engine.DbSettings.defaultSettings",
"org.h2.engine.SessionRemote.sessionFactory", "org.h2.engine.SessionRemote.sessionFactory",
"org.h2.expression.function.DateTimeFunctions.MONTHS_AND_WEEKS",
"org.h2.expression.function.ToChar.NAMES",
"org.h2.jdbcx.JdbcDataSourceFactory.cachedTraceSystem", "org.h2.jdbcx.JdbcDataSourceFactory.cachedTraceSystem",
"org.h2.store.RecoverTester.instance", "org.h2.store.RecoverTester.instance",
"org.h2.store.fs.FilePath.defaultProvider", "org.h2.store.fs.FilePath.defaultProvider",
...@@ -36,7 +38,6 @@ public class TestClearReferences extends TestBase { ...@@ -36,7 +38,6 @@ public class TestClearReferences extends TestBase {
"org.h2.tools.CompressTool.cachedBuffer", "org.h2.tools.CompressTool.cachedBuffer",
"org.h2.util.CloseWatcher.queue", "org.h2.util.CloseWatcher.queue",
"org.h2.util.CloseWatcher.refs", "org.h2.util.CloseWatcher.refs",
"org.h2.util.DateTimeFunctions.MONTHS_AND_WEEKS",
"org.h2.util.DateTimeUtils.timeZone", "org.h2.util.DateTimeUtils.timeZone",
"org.h2.util.MathUtils.cachedSecureRandom", "org.h2.util.MathUtils.cachedSecureRandom",
"org.h2.util.NetUtils.cachedLocalAddress", "org.h2.util.NetUtils.cachedLocalAddress",
...@@ -45,7 +46,6 @@ public class TestClearReferences extends TestBase { ...@@ -45,7 +46,6 @@ public class TestClearReferences extends TestBase {
"org.h2.util.JdbcUtils.allowedClassNamePrefixes", "org.h2.util.JdbcUtils.allowedClassNamePrefixes",
"org.h2.util.JdbcUtils.userClassFactories", "org.h2.util.JdbcUtils.userClassFactories",
"org.h2.util.Task.counter", "org.h2.util.Task.counter",
"org.h2.util.ToChar.NAMES",
"org.h2.value.CompareMode.lastUsed", "org.h2.value.CompareMode.lastUsed",
"org.h2.value.Value.softCache", "org.h2.value.Value.softCache",
}; };
......
...@@ -10,10 +10,10 @@ import java.net.URLDecoder; ...@@ -10,10 +10,10 @@ import java.net.URLDecoder;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.util.Date; import java.util.Date;
import java.util.Random; import java.util.Random;
import org.h2.expression.function.DateTimeFunctions;
import org.h2.message.DbException; import org.h2.message.DbException;
import org.h2.test.TestBase; import org.h2.test.TestBase;
import org.h2.test.utils.AssertThrows; import org.h2.test.utils.AssertThrows;
import org.h2.util.DateTimeFunctions;
import org.h2.util.StringUtils; import org.h2.util.StringUtils;
/** /**
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论