Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
为 GitLab 提交贡献
登录/注册
切换导航
H
h2database
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
Administrator
h2database
Commits
e8b7f57d
Unverified
提交
e8b7f57d
authored
9月 23, 2018
作者:
Evgenij Ryazanov
提交者:
GitHub
9月 23, 2018
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #1469 from katzyn/window
Forbid incorrect nesting of aggregates and window functions
上级
f30a0ba7
0d26b305
显示空白字符变更
内嵌
并排
正在显示
41 个修改的文件
包含
132 行增加
和
93 行删除
+132
-93
AlterTableAddConstraint.java
h2/src/main/org/h2/command/ddl/AlterTableAddConstraint.java
+1
-1
Delete.java
h2/src/main/org/h2/command/dml/Delete.java
+2
-2
Insert.java
h2/src/main/org/h2/command/dml/Insert.java
+1
-1
MergeUsing.java
h2/src/main/org/h2/command/dml/MergeUsing.java
+2
-2
Select.java
h2/src/main/org/h2/command/dml/Select.java
+3
-3
Update.java
h2/src/main/org/h2/command/dml/Update.java
+3
-3
Alias.java
h2/src/main/org/h2/expression/Alias.java
+2
-2
BinaryOperation.java
h2/src/main/org/h2/expression/BinaryOperation.java
+3
-3
CompareLike.java
h2/src/main/org/h2/expression/CompareLike.java
+4
-4
Comparison.java
h2/src/main/org/h2/expression/Comparison.java
+3
-3
ConditionAndOr.java
h2/src/main/org/h2/expression/ConditionAndOr.java
+3
-3
ConditionExists.java
h2/src/main/org/h2/expression/ConditionExists.java
+1
-1
ConditionIn.java
h2/src/main/org/h2/expression/ConditionIn.java
+3
-3
ConditionInConstantSet.java
h2/src/main/org/h2/expression/ConditionInConstantSet.java
+2
-2
ConditionInParameter.java
h2/src/main/org/h2/expression/ConditionInParameter.java
+2
-2
ConditionInSelect.java
h2/src/main/org/h2/expression/ConditionInSelect.java
+2
-2
ConditionNot.java
h2/src/main/org/h2/expression/ConditionNot.java
+2
-2
Expression.java
h2/src/main/org/h2/expression/Expression.java
+20
-1
ExpressionColumn.java
h2/src/main/org/h2/expression/ExpressionColumn.java
+1
-1
ExpressionList.java
h2/src/main/org/h2/expression/ExpressionList.java
+2
-2
Function.java
h2/src/main/org/h2/expression/Function.java
+2
-2
IntervalOperation.java
h2/src/main/org/h2/expression/IntervalOperation.java
+3
-3
JavaFunction.java
h2/src/main/org/h2/expression/JavaFunction.java
+2
-2
Parameter.java
h2/src/main/org/h2/expression/Parameter.java
+1
-1
Rownum.java
h2/src/main/org/h2/expression/Rownum.java
+1
-1
SequenceValue.java
h2/src/main/org/h2/expression/SequenceValue.java
+1
-1
Subquery.java
h2/src/main/org/h2/expression/Subquery.java
+1
-1
UnaryOperation.java
h2/src/main/org/h2/expression/UnaryOperation.java
+2
-2
ValueExpression.java
h2/src/main/org/h2/expression/ValueExpression.java
+1
-1
Variable.java
h2/src/main/org/h2/expression/Variable.java
+1
-1
Wildcard.java
h2/src/main/org/h2/expression/Wildcard.java
+1
-1
AbstractAggregate.java
...c/main/org/h2/expression/aggregate/AbstractAggregate.java
+3
-3
Aggregate.java
h2/src/main/org/h2/expression/aggregate/Aggregate.java
+5
-5
DataAnalysisOperation.java
...in/org/h2/expression/aggregate/DataAnalysisOperation.java
+17
-6
JavaAggregate.java
h2/src/main/org/h2/expression/aggregate/JavaAggregate.java
+3
-3
PartitionData.java
h2/src/main/org/h2/expression/aggregate/PartitionData.java
+3
-1
Window.java
h2/src/main/org/h2/expression/aggregate/Window.java
+3
-3
WindowFunction.java
h2/src/main/org/h2/expression/aggregate/WindowFunction.java
+4
-6
Column.java
h2/src/main/org/h2/table/Column.java
+3
-3
TableFilter.java
h2/src/main/org/h2/table/TableFilter.java
+4
-4
window.sql
h2/src/test/org/h2/test/scripts/window.sql
+9
-0
没有找到文件。
h2/src/main/org/h2/command/ddl/AlterTableAddConstraint.java
浏览文件 @
e8b7f57d
...
@@ -191,7 +191,7 @@ public class AlterTableAddConstraint extends SchemaCommand {
...
@@ -191,7 +191,7 @@ public class AlterTableAddConstraint extends SchemaCommand {
String
name
=
generateConstraintName
(
table
);
String
name
=
generateConstraintName
(
table
);
ConstraintCheck
check
=
new
ConstraintCheck
(
getSchema
(),
id
,
name
,
table
);
ConstraintCheck
check
=
new
ConstraintCheck
(
getSchema
(),
id
,
name
,
table
);
TableFilter
filter
=
new
TableFilter
(
session
,
table
,
null
,
false
,
null
,
0
,
null
);
TableFilter
filter
=
new
TableFilter
(
session
,
table
,
null
,
false
,
null
,
0
,
null
);
checkExpression
.
mapColumns
(
filter
,
0
);
checkExpression
.
mapColumns
(
filter
,
0
,
Expression
.
MAP_INITIAL
);
checkExpression
=
checkExpression
.
optimize
(
session
);
checkExpression
=
checkExpression
.
optimize
(
session
);
check
.
setExpression
(
checkExpression
);
check
.
setExpression
(
checkExpression
);
check
.
setTableFilter
(
filter
);
check
.
setTableFilter
(
filter
);
...
...
h2/src/main/org/h2/command/dml/Delete.java
浏览文件 @
e8b7f57d
...
@@ -133,9 +133,9 @@ public class Delete extends Prepared {
...
@@ -133,9 +133,9 @@ public class Delete extends Prepared {
@Override
@Override
public
void
prepare
()
{
public
void
prepare
()
{
if
(
condition
!=
null
)
{
if
(
condition
!=
null
)
{
condition
.
mapColumns
(
targetTableFilter
,
0
);
condition
.
mapColumns
(
targetTableFilter
,
0
,
Expression
.
MAP_INITIAL
);
if
(
sourceTableFilter
!=
null
)
{
if
(
sourceTableFilter
!=
null
)
{
condition
.
mapColumns
(
sourceTableFilter
,
0
);
condition
.
mapColumns
(
sourceTableFilter
,
0
,
Expression
.
MAP_INITIAL
);
}
}
condition
=
condition
.
optimize
(
session
);
condition
=
condition
.
optimize
(
session
);
condition
.
createIndexConditions
(
session
,
targetTableFilter
);
condition
.
createIndexConditions
(
session
,
targetTableFilter
);
...
...
h2/src/main/org/h2/command/dml/Insert.java
浏览文件 @
e8b7f57d
...
@@ -333,7 +333,7 @@ public class Insert extends Prepared implements ResultTarget {
...
@@ -333,7 +333,7 @@ public class Insert extends Prepared implements ResultTarget {
Expression
e
=
expr
[
i
];
Expression
e
=
expr
[
i
];
if
(
e
!=
null
)
{
if
(
e
!=
null
)
{
if
(
sourceTableFilter
!=
null
){
if
(
sourceTableFilter
!=
null
){
e
.
mapColumns
(
sourceTableFilter
,
0
);
e
.
mapColumns
(
sourceTableFilter
,
0
,
Expression
.
MAP_INITIAL
);
}
}
e
=
e
.
optimize
(
session
);
e
=
e
.
optimize
(
session
);
if
(
e
instanceof
Parameter
)
{
if
(
e
instanceof
Parameter
)
{
...
...
h2/src/main/org/h2/command/dml/MergeUsing.java
浏览文件 @
e8b7f57d
...
@@ -319,8 +319,8 @@ public class MergeUsing extends Prepared {
...
@@ -319,8 +319,8 @@ public class MergeUsing extends Prepared {
onCondition
.
addFilterConditions
(
sourceTableFilter
,
true
);
onCondition
.
addFilterConditions
(
sourceTableFilter
,
true
);
onCondition
.
addFilterConditions
(
targetTableFilter
,
true
);
onCondition
.
addFilterConditions
(
targetTableFilter
,
true
);
onCondition
.
mapColumns
(
sourceTableFilter
,
2
);
onCondition
.
mapColumns
(
sourceTableFilter
,
2
,
Expression
.
MAP_INITIAL
);
onCondition
.
mapColumns
(
targetTableFilter
,
1
);
onCondition
.
mapColumns
(
targetTableFilter
,
1
,
Expression
.
MAP_INITIAL
);
if
(
keys
==
null
)
{
if
(
keys
==
null
)
{
keys
=
buildColumnListFromOnCondition
(
targetTableFilter
.
getTable
());
keys
=
buildColumnListFromOnCondition
(
targetTableFilter
.
getTable
());
...
...
h2/src/main/org/h2/command/dml/Select.java
浏览文件 @
e8b7f57d
...
@@ -1043,7 +1043,7 @@ public class Select extends Query {
...
@@ -1043,7 +1043,7 @@ public class Select extends Query {
if
(
havingIndex
>=
0
)
{
if
(
havingIndex
>=
0
)
{
Expression
expr
=
expressions
.
get
(
havingIndex
);
Expression
expr
=
expressions
.
get
(
havingIndex
);
SelectListColumnResolver
res
=
new
SelectListColumnResolver
(
this
);
SelectListColumnResolver
res
=
new
SelectListColumnResolver
(
this
);
expr
.
mapColumns
(
res
,
0
);
expr
.
mapColumns
(
res
,
0
,
Expression
.
MAP_INITIAL
);
}
}
checkInit
=
true
;
checkInit
=
true
;
}
}
...
@@ -1448,10 +1448,10 @@ public class Select extends Query {
...
@@ -1448,10 +1448,10 @@ public class Select extends Query {
@Override
@Override
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
)
{
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
)
{
for
(
Expression
e
:
expressions
)
{
for
(
Expression
e
:
expressions
)
{
e
.
mapColumns
(
resolver
,
level
);
e
.
mapColumns
(
resolver
,
level
,
Expression
.
MAP_INITIAL
);
}
}
if
(
condition
!=
null
)
{
if
(
condition
!=
null
)
{
condition
.
mapColumns
(
resolver
,
level
);
condition
.
mapColumns
(
resolver
,
level
,
Expression
.
MAP_INITIAL
);
}
}
}
}
...
...
h2/src/main/org/h2/command/dml/Update.java
浏览文件 @
e8b7f57d
...
@@ -216,15 +216,15 @@ public class Update extends Prepared {
...
@@ -216,15 +216,15 @@ public class Update extends Prepared {
@Override
@Override
public
void
prepare
()
{
public
void
prepare
()
{
if
(
condition
!=
null
)
{
if
(
condition
!=
null
)
{
condition
.
mapColumns
(
targetTableFilter
,
0
);
condition
.
mapColumns
(
targetTableFilter
,
0
,
Expression
.
MAP_INITIAL
);
condition
=
condition
.
optimize
(
session
);
condition
=
condition
.
optimize
(
session
);
condition
.
createIndexConditions
(
session
,
targetTableFilter
);
condition
.
createIndexConditions
(
session
,
targetTableFilter
);
}
}
for
(
Column
c
:
columns
)
{
for
(
Column
c
:
columns
)
{
Expression
e
=
expressionMap
.
get
(
c
);
Expression
e
=
expressionMap
.
get
(
c
);
e
.
mapColumns
(
targetTableFilter
,
0
);
e
.
mapColumns
(
targetTableFilter
,
0
,
Expression
.
MAP_INITIAL
);
if
(
sourceTableFilter
!=
null
){
if
(
sourceTableFilter
!=
null
){
e
.
mapColumns
(
sourceTableFilter
,
0
);
e
.
mapColumns
(
sourceTableFilter
,
0
,
Expression
.
MAP_INITIAL
);
}
}
expressionMap
.
put
(
c
,
e
.
optimize
(
session
));
expressionMap
.
put
(
c
,
e
.
optimize
(
session
));
}
}
...
...
h2/src/main/org/h2/expression/Alias.java
浏览文件 @
e8b7f57d
...
@@ -42,8 +42,8 @@ public class Alias extends Expression {
...
@@ -42,8 +42,8 @@ public class Alias extends Expression {
}
}
@Override
@Override
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
)
{
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
,
int
state
)
{
expr
.
mapColumns
(
resolver
,
level
);
expr
.
mapColumns
(
resolver
,
level
,
state
);
}
}
@Override
@Override
...
...
h2/src/main/org/h2/expression/BinaryOperation.java
浏览文件 @
e8b7f57d
...
@@ -150,9 +150,9 @@ public class BinaryOperation extends Expression {
...
@@ -150,9 +150,9 @@ public class BinaryOperation extends Expression {
}
}
@Override
@Override
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
)
{
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
,
int
state
)
{
left
.
mapColumns
(
resolver
,
level
);
left
.
mapColumns
(
resolver
,
level
,
state
);
right
.
mapColumns
(
resolver
,
level
);
right
.
mapColumns
(
resolver
,
level
,
state
);
}
}
@Override
@Override
...
...
h2/src/main/org/h2/expression/CompareLike.java
浏览文件 @
e8b7f57d
...
@@ -477,11 +477,11 @@ public class CompareLike extends Condition {
...
@@ -477,11 +477,11 @@ public class CompareLike extends Condition {
}
}
@Override
@Override
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
)
{
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
,
int
state
)
{
left
.
mapColumns
(
resolver
,
level
);
left
.
mapColumns
(
resolver
,
level
,
state
);
right
.
mapColumns
(
resolver
,
level
);
right
.
mapColumns
(
resolver
,
level
,
state
);
if
(
escape
!=
null
)
{
if
(
escape
!=
null
)
{
escape
.
mapColumns
(
resolver
,
level
);
escape
.
mapColumns
(
resolver
,
level
,
state
);
}
}
}
}
...
...
h2/src/main/org/h2/expression/Comparison.java
浏览文件 @
e8b7f57d
...
@@ -497,10 +497,10 @@ public class Comparison extends Condition {
...
@@ -497,10 +497,10 @@ public class Comparison extends Condition {
}
}
@Override
@Override
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
)
{
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
,
int
state
)
{
left
.
mapColumns
(
resolver
,
level
);
left
.
mapColumns
(
resolver
,
level
,
state
);
if
(
right
!=
null
)
{
if
(
right
!=
null
)
{
right
.
mapColumns
(
resolver
,
level
);
right
.
mapColumns
(
resolver
,
level
,
state
);
}
}
}
}
...
...
h2/src/main/org/h2/expression/ConditionAndOr.java
浏览文件 @
e8b7f57d
...
@@ -256,9 +256,9 @@ public class ConditionAndOr extends Condition {
...
@@ -256,9 +256,9 @@ public class ConditionAndOr extends Condition {
}
}
@Override
@Override
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
)
{
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
,
int
state
)
{
left
.
mapColumns
(
resolver
,
level
);
left
.
mapColumns
(
resolver
,
level
,
state
);
right
.
mapColumns
(
resolver
,
level
);
right
.
mapColumns
(
resolver
,
level
,
state
);
}
}
@Override
@Override
...
...
h2/src/main/org/h2/expression/ConditionExists.java
浏览文件 @
e8b7f57d
...
@@ -54,7 +54,7 @@ public class ConditionExists extends Condition {
...
@@ -54,7 +54,7 @@ public class ConditionExists extends Condition {
}
}
@Override
@Override
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
)
{
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
,
int
state
)
{
query
.
mapColumns
(
resolver
,
level
+
1
);
query
.
mapColumns
(
resolver
,
level
+
1
);
}
}
...
...
h2/src/main/org/h2/expression/ConditionIn.java
浏览文件 @
e8b7f57d
...
@@ -66,10 +66,10 @@ public class ConditionIn extends Condition {
...
@@ -66,10 +66,10 @@ public class ConditionIn extends Condition {
}
}
@Override
@Override
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
)
{
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
,
int
state
)
{
left
.
mapColumns
(
resolver
,
level
);
left
.
mapColumns
(
resolver
,
level
,
state
);
for
(
Expression
e
:
valueList
)
{
for
(
Expression
e
:
valueList
)
{
e
.
mapColumns
(
resolver
,
level
);
e
.
mapColumns
(
resolver
,
level
,
state
);
}
}
this
.
queryLevel
=
Math
.
max
(
level
,
this
.
queryLevel
);
this
.
queryLevel
=
Math
.
max
(
level
,
this
.
queryLevel
);
}
}
...
...
h2/src/main/org/h2/expression/ConditionInConstantSet.java
浏览文件 @
e8b7f57d
...
@@ -83,8 +83,8 @@ public class ConditionInConstantSet extends Condition {
...
@@ -83,8 +83,8 @@ public class ConditionInConstantSet extends Condition {
}
}
@Override
@Override
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
)
{
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
,
int
state
)
{
left
.
mapColumns
(
resolver
,
level
);
left
.
mapColumns
(
resolver
,
level
,
state
);
this
.
queryLevel
=
Math
.
max
(
level
,
this
.
queryLevel
);
this
.
queryLevel
=
Math
.
max
(
level
,
this
.
queryLevel
);
}
}
...
...
h2/src/main/org/h2/expression/ConditionInParameter.java
浏览文件 @
e8b7f57d
...
@@ -109,8 +109,8 @@ public class ConditionInParameter extends Condition {
...
@@ -109,8 +109,8 @@ public class ConditionInParameter extends Condition {
}
}
@Override
@Override
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
)
{
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
,
int
state
)
{
left
.
mapColumns
(
resolver
,
level
);
left
.
mapColumns
(
resolver
,
level
,
state
);
}
}
@Override
@Override
...
...
h2/src/main/org/h2/expression/ConditionInSelect.java
浏览文件 @
e8b7f57d
...
@@ -101,8 +101,8 @@ public class ConditionInSelect extends Condition {
...
@@ -101,8 +101,8 @@ public class ConditionInSelect extends Condition {
}
}
@Override
@Override
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
)
{
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
,
int
state
)
{
left
.
mapColumns
(
resolver
,
level
);
left
.
mapColumns
(
resolver
,
level
,
state
);
query
.
mapColumns
(
resolver
,
level
+
1
);
query
.
mapColumns
(
resolver
,
level
+
1
);
this
.
queryLevel
=
Math
.
max
(
level
,
this
.
queryLevel
);
this
.
queryLevel
=
Math
.
max
(
level
,
this
.
queryLevel
);
}
}
...
...
h2/src/main/org/h2/expression/ConditionNot.java
浏览文件 @
e8b7f57d
...
@@ -37,8 +37,8 @@ public class ConditionNot extends Condition {
...
@@ -37,8 +37,8 @@ public class ConditionNot extends Condition {
}
}
@Override
@Override
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
)
{
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
,
int
state
)
{
condition
.
mapColumns
(
resolver
,
level
);
condition
.
mapColumns
(
resolver
,
level
,
state
);
}
}
@Override
@Override
...
...
h2/src/main/org/h2/expression/Expression.java
浏览文件 @
e8b7f57d
...
@@ -24,6 +24,23 @@ import org.h2.value.ValueArray;
...
@@ -24,6 +24,23 @@ import org.h2.value.ValueArray;
*/
*/
public
abstract
class
Expression
{
public
abstract
class
Expression
{
/**
* Initial state for {@link #mapColumns(ColumnResolver, int, int)}.
*/
public
static
final
int
MAP_INITIAL
=
0
;
/**
* State for expressions inside a window function for
* {@link #mapColumns(ColumnResolver, int, int)}.
*/
public
static
final
int
MAP_IN_WINDOW
=
1
;
/**
* State for expressions inside an aggregate for
* {@link #mapColumns(ColumnResolver, int, int)}.
*/
public
static
final
int
MAP_IN_AGGREGATE
=
2
;
private
boolean
addedToFilter
;
private
boolean
addedToFilter
;
/**
/**
...
@@ -47,8 +64,10 @@ public abstract class Expression {
...
@@ -47,8 +64,10 @@ public abstract class Expression {
*
*
* @param resolver the column resolver
* @param resolver the column resolver
* @param level the subquery nesting level
* @param level the subquery nesting level
* @param state current state for nesting checks, initial value is
* {@link #MAP_INITIAL}
*/
*/
public
abstract
void
mapColumns
(
ColumnResolver
resolver
,
int
level
);
public
abstract
void
mapColumns
(
ColumnResolver
resolver
,
int
level
,
int
state
);
/**
/**
* Try to optimize the expression.
* Try to optimize the expression.
...
...
h2/src/main/org/h2/expression/ExpressionColumn.java
浏览文件 @
e8b7f57d
...
@@ -79,7 +79,7 @@ public class ExpressionColumn extends Expression {
...
@@ -79,7 +79,7 @@ public class ExpressionColumn extends Expression {
}
}
@Override
@Override
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
)
{
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
,
int
state
)
{
if
(
tableAlias
!=
null
&&
!
database
.
equalsIdentifiers
(
if
(
tableAlias
!=
null
&&
!
database
.
equalsIdentifiers
(
tableAlias
,
resolver
.
getTableAlias
()))
{
tableAlias
,
resolver
.
getTableAlias
()))
{
return
;
return
;
...
...
h2/src/main/org/h2/expression/ExpressionList.java
浏览文件 @
e8b7f57d
...
@@ -40,9 +40,9 @@ public class ExpressionList extends Expression {
...
@@ -40,9 +40,9 @@ public class ExpressionList extends Expression {
}
}
@Override
@Override
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
)
{
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
,
int
state
)
{
for
(
Expression
e
:
list
)
{
for
(
Expression
e
:
list
)
{
e
.
mapColumns
(
resolver
,
level
);
e
.
mapColumns
(
resolver
,
level
,
state
);
}
}
}
}
...
...
h2/src/main/org/h2/expression/Function.java
浏览文件 @
e8b7f57d
...
@@ -2062,10 +2062,10 @@ public class Function extends Expression implements FunctionCall {
...
@@ -2062,10 +2062,10 @@ public class Function extends Expression implements FunctionCall {
}
}
@Override
@Override
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
)
{
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
,
int
state
)
{
for
(
Expression
e
:
args
)
{
for
(
Expression
e
:
args
)
{
if
(
e
!=
null
)
{
if
(
e
!=
null
)
{
e
.
mapColumns
(
resolver
,
level
);
e
.
mapColumns
(
resolver
,
level
,
state
);
}
}
}
}
}
}
...
...
h2/src/main/org/h2/expression/IntervalOperation.java
浏览文件 @
e8b7f57d
...
@@ -249,10 +249,10 @@ public class IntervalOperation extends Expression {
...
@@ -249,10 +249,10 @@ public class IntervalOperation extends Expression {
}
}
@Override
@Override
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
)
{
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
,
int
state
)
{
left
.
mapColumns
(
resolver
,
level
);
left
.
mapColumns
(
resolver
,
level
,
state
);
if
(
right
!=
null
)
{
if
(
right
!=
null
)
{
right
.
mapColumns
(
resolver
,
level
);
right
.
mapColumns
(
resolver
,
level
,
state
);
}
}
}
}
...
...
h2/src/main/org/h2/expression/JavaFunction.java
浏览文件 @
e8b7f57d
...
@@ -44,9 +44,9 @@ public class JavaFunction extends Expression implements FunctionCall {
...
@@ -44,9 +44,9 @@ public class JavaFunction extends Expression implements FunctionCall {
}
}
@Override
@Override
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
)
{
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
,
int
state
)
{
for
(
Expression
e
:
args
)
{
for
(
Expression
e
:
args
)
{
e
.
mapColumns
(
resolver
,
level
);
e
.
mapColumns
(
resolver
,
level
,
state
);
}
}
}
}
...
...
h2/src/main/org/h2/expression/Parameter.java
浏览文件 @
e8b7f57d
...
@@ -71,7 +71,7 @@ public class Parameter extends Expression implements ParameterInterface {
...
@@ -71,7 +71,7 @@ public class Parameter extends Expression implements ParameterInterface {
}
}
@Override
@Override
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
)
{
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
,
int
state
)
{
// can't map
// can't map
}
}
...
...
h2/src/main/org/h2/expression/Rownum.java
浏览文件 @
e8b7f57d
...
@@ -38,7 +38,7 @@ public class Rownum extends Expression {
...
@@ -38,7 +38,7 @@ public class Rownum extends Expression {
}
}
@Override
@Override
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
)
{
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
,
int
state
)
{
// nothing to do
// nothing to do
}
}
...
...
h2/src/main/org/h2/expression/SequenceValue.java
浏览文件 @
e8b7f57d
...
@@ -37,7 +37,7 @@ public class SequenceValue extends Expression {
...
@@ -37,7 +37,7 @@ public class SequenceValue extends Expression {
}
}
@Override
@Override
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
)
{
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
,
int
state
)
{
// nothing to do
// nothing to do
}
}
...
...
h2/src/main/org/h2/expression/Subquery.java
浏览文件 @
e8b7f57d
...
@@ -58,7 +58,7 @@ public class Subquery extends Expression {
...
@@ -58,7 +58,7 @@ public class Subquery extends Expression {
}
}
@Override
@Override
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
)
{
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
,
int
state
)
{
query
.
mapColumns
(
resolver
,
level
+
1
);
query
.
mapColumns
(
resolver
,
level
+
1
);
}
}
...
...
h2/src/main/org/h2/expression/UnaryOperation.java
浏览文件 @
e8b7f57d
...
@@ -37,8 +37,8 @@ public class UnaryOperation extends Expression {
...
@@ -37,8 +37,8 @@ public class UnaryOperation extends Expression {
}
}
@Override
@Override
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
)
{
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
,
int
state
)
{
arg
.
mapColumns
(
resolver
,
level
);
arg
.
mapColumns
(
resolver
,
level
,
state
);
}
}
@Override
@Override
...
...
h2/src/main/org/h2/expression/ValueExpression.java
浏览文件 @
e8b7f57d
...
@@ -95,7 +95,7 @@ public class ValueExpression extends Expression {
...
@@ -95,7 +95,7 @@ public class ValueExpression extends Expression {
}
}
@Override
@Override
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
)
{
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
,
int
state
)
{
// nothing to do
// nothing to do
}
}
...
...
h2/src/main/org/h2/expression/Variable.java
浏览文件 @
e8b7f57d
...
@@ -86,7 +86,7 @@ public class Variable extends Expression {
...
@@ -86,7 +86,7 @@ public class Variable extends Expression {
}
}
@Override
@Override
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
)
{
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
,
int
state
)
{
// nothing to do
// nothing to do
}
}
...
...
h2/src/main/org/h2/expression/Wildcard.java
浏览文件 @
e8b7f57d
...
@@ -43,7 +43,7 @@ public class Wildcard extends Expression {
...
@@ -43,7 +43,7 @@ public class Wildcard extends Expression {
}
}
@Override
@Override
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
)
{
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
,
int
state
)
{
throw
DbException
.
get
(
ErrorCode
.
SYNTAX_ERROR_1
,
table
);
throw
DbException
.
get
(
ErrorCode
.
SYNTAX_ERROR_1
,
table
);
}
}
...
...
h2/src/main/org/h2/expression/aggregate/AbstractAggregate.java
浏览文件 @
e8b7f57d
...
@@ -48,11 +48,11 @@ public abstract class AbstractAggregate extends DataAnalysisOperation {
...
@@ -48,11 +48,11 @@ public abstract class AbstractAggregate extends DataAnalysisOperation {
}
}
@Override
@Override
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
)
{
public
void
mapColumns
Analysis
(
ColumnResolver
resolver
,
int
level
,
int
innerState
)
{
if
(
filterCondition
!=
null
)
{
if
(
filterCondition
!=
null
)
{
filterCondition
.
mapColumns
(
resolver
,
level
);
filterCondition
.
mapColumns
(
resolver
,
level
,
innerState
);
}
}
super
.
mapColumns
(
resolver
,
level
);
super
.
mapColumns
Analysis
(
resolver
,
level
,
innerState
);
}
}
@Override
@Override
...
...
h2/src/main/org/h2/expression/aggregate/Aggregate.java
浏览文件 @
e8b7f57d
...
@@ -512,19 +512,19 @@ public class Aggregate extends AbstractAggregate {
...
@@ -512,19 +512,19 @@ public class Aggregate extends AbstractAggregate {
}
}
@Override
@Override
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
)
{
public
void
mapColumns
Analysis
(
ColumnResolver
resolver
,
int
level
,
int
innerState
)
{
if
(
on
!=
null
)
{
if
(
on
!=
null
)
{
on
.
mapColumns
(
resolver
,
level
);
on
.
mapColumns
(
resolver
,
level
,
innerState
);
}
}
if
(
orderByList
!=
null
)
{
if
(
orderByList
!=
null
)
{
for
(
SelectOrderBy
o
:
orderByList
)
{
for
(
SelectOrderBy
o
:
orderByList
)
{
o
.
expression
.
mapColumns
(
resolver
,
level
);
o
.
expression
.
mapColumns
(
resolver
,
level
,
innerState
);
}
}
}
}
if
(
groupConcatSeparator
!=
null
)
{
if
(
groupConcatSeparator
!=
null
)
{
groupConcatSeparator
.
mapColumns
(
resolver
,
level
);
groupConcatSeparator
.
mapColumns
(
resolver
,
level
,
innerState
);
}
}
super
.
mapColumns
(
resolver
,
level
);
super
.
mapColumns
Analysis
(
resolver
,
level
,
innerState
);
}
}
@Override
@Override
...
...
h2/src/main/org/h2/expression/aggregate/DataAnalysisOperation.java
浏览文件 @
e8b7f57d
...
@@ -81,7 +81,22 @@ public abstract class DataAnalysisOperation extends Expression {
...
@@ -81,7 +81,22 @@ public abstract class DataAnalysisOperation extends Expression {
}
}
@Override
@Override
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
)
{
public
final
void
mapColumns
(
ColumnResolver
resolver
,
int
level
,
int
state
)
{
if
(
over
!=
null
)
{
if
(
state
!=
MAP_INITIAL
)
{
throw
DbException
.
get
(
ErrorCode
.
INVALID_USE_OF_AGGREGATE_FUNCTION_1
,
getSQL
());
}
state
=
MAP_IN_WINDOW
;
}
else
{
if
(
state
==
MAP_IN_AGGREGATE
)
{
throw
DbException
.
get
(
ErrorCode
.
INVALID_USE_OF_AGGREGATE_FUNCTION_1
,
getSQL
());
}
state
=
MAP_IN_AGGREGATE
;
}
mapColumnsAnalysis
(
resolver
,
level
,
state
);
}
protected
void
mapColumnsAnalysis
(
ColumnResolver
resolver
,
int
level
,
int
innerState
)
{
if
(
over
!=
null
)
{
if
(
over
!=
null
)
{
over
.
mapColumns
(
resolver
,
level
);
over
.
mapColumns
(
resolver
,
level
);
}
}
...
@@ -109,7 +124,7 @@ public abstract class DataAnalysisOperation extends Expression {
...
@@ -109,7 +124,7 @@ public abstract class DataAnalysisOperation extends Expression {
}
}
@Override
@Override
public
void
updateAggregate
(
Session
session
,
int
stage
)
{
public
final
void
updateAggregate
(
Session
session
,
int
stage
)
{
if
(
stage
==
Aggregate
.
STAGE_RESET
)
{
if
(
stage
==
Aggregate
.
STAGE_RESET
)
{
updateGroupAggregates
(
session
,
Aggregate
.
STAGE_RESET
);
updateGroupAggregates
(
session
,
Aggregate
.
STAGE_RESET
);
lastGroupRowId
=
0
;
lastGroupRowId
=
0
;
...
@@ -122,10 +137,6 @@ public abstract class DataAnalysisOperation extends Expression {
...
@@ -122,10 +137,6 @@ public abstract class DataAnalysisOperation extends Expression {
}
}
return
;
return
;
}
}
// TODO aggregates: check nested MIN(MAX(ID)) and so on
// if (on != null) {
// on.updateAggregate();
// }
SelectGroups
groupData
=
select
.
getGroupDataIfCurrent
(
window
);
SelectGroups
groupData
=
select
.
getGroupDataIfCurrent
(
window
);
if
(
groupData
==
null
)
{
if
(
groupData
==
null
)
{
// this is a different level (the enclosing query)
// this is a different level (the enclosing query)
...
...
h2/src/main/org/h2/expression/aggregate/JavaAggregate.java
浏览文件 @
e8b7f57d
...
@@ -110,11 +110,11 @@ public class JavaAggregate extends AbstractAggregate {
...
@@ -110,11 +110,11 @@ public class JavaAggregate extends AbstractAggregate {
}
}
@Override
@Override
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
)
{
public
void
mapColumns
Analysis
(
ColumnResolver
resolver
,
int
level
,
int
innerState
)
{
for
(
Expression
arg
:
args
)
{
for
(
Expression
arg
:
args
)
{
arg
.
mapColumns
(
resolver
,
level
);
arg
.
mapColumns
(
resolver
,
level
,
innerState
);
}
}
super
.
mapColumns
(
resolver
,
level
);
super
.
mapColumns
Analysis
(
resolver
,
level
,
innerState
);
}
}
@Override
@Override
...
...
h2/src/main/org/h2/expression/aggregate/PartitionData.java
浏览文件 @
e8b7f57d
...
@@ -17,7 +17,7 @@ public final class PartitionData {
...
@@ -17,7 +17,7 @@ public final class PartitionData {
/**
/**
* Aggregate data.
* Aggregate data.
*/
*/
private
final
Object
data
;
private
Object
data
;
/**
/**
* Evaluated result.
* Evaluated result.
...
@@ -65,6 +65,7 @@ public final class PartitionData {
...
@@ -65,6 +65,7 @@ public final class PartitionData {
*/
*/
void
setResult
(
Value
result
)
{
void
setResult
(
Value
result
)
{
this
.
result
=
result
;
this
.
result
=
result
;
data
=
null
;
}
}
/**
/**
...
@@ -84,6 +85,7 @@ public final class PartitionData {
...
@@ -84,6 +85,7 @@ public final class PartitionData {
*/
*/
void
setOrderedResult
(
HashMap
<
Integer
,
Value
>
orderedResult
)
{
void
setOrderedResult
(
HashMap
<
Integer
,
Value
>
orderedResult
)
{
this
.
orderedResult
=
orderedResult
;
this
.
orderedResult
=
orderedResult
;
data
=
null
;
}
}
}
}
h2/src/main/org/h2/expression/aggregate/Window.java
浏览文件 @
e8b7f57d
...
@@ -82,18 +82,18 @@ public final class Window {
...
@@ -82,18 +82,18 @@ public final class Window {
* the column resolver
* the column resolver
* @param level
* @param level
* the subquery nesting level
* the subquery nesting level
* @see Expression#mapColumns(ColumnResolver, int)
* @see Expression#mapColumns(ColumnResolver, int
, int
)
*/
*/
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
)
{
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
)
{
resolveWindows
(
resolver
);
resolveWindows
(
resolver
);
if
(
partitionBy
!=
null
)
{
if
(
partitionBy
!=
null
)
{
for
(
Expression
e
:
partitionBy
)
{
for
(
Expression
e
:
partitionBy
)
{
e
.
mapColumns
(
resolver
,
level
);
e
.
mapColumns
(
resolver
,
level
,
Expression
.
MAP_IN_WINDOW
);
}
}
}
}
if
(
orderBy
!=
null
)
{
if
(
orderBy
!=
null
)
{
for
(
SelectOrderBy
o
:
orderBy
)
{
for
(
SelectOrderBy
o
:
orderBy
)
{
o
.
expression
.
mapColumns
(
resolver
,
level
);
o
.
expression
.
mapColumns
(
resolver
,
level
,
Expression
.
MAP_IN_WINDOW
);
}
}
}
}
}
}
...
...
h2/src/main/org/h2/expression/aggregate/WindowFunction.java
浏览文件 @
e8b7f57d
...
@@ -11,7 +11,6 @@ import java.util.Iterator;
...
@@ -11,7 +11,6 @@ import java.util.Iterator;
import
org.h2.command.dml.Select
;
import
org.h2.command.dml.Select
;
import
org.h2.command.dml.SelectGroups
;
import
org.h2.command.dml.SelectGroups
;
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.message.DbException
;
import
org.h2.message.DbException
;
...
@@ -383,13 +382,13 @@ public class WindowFunction extends DataAnalysisOperation {
...
@@ -383,13 +382,13 @@ public class WindowFunction extends DataAnalysisOperation {
}
}
@Override
@Override
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
)
{
public
void
mapColumns
Analysis
(
ColumnResolver
resolver
,
int
level
,
int
innerState
)
{
if
(
args
!=
null
)
{
if
(
args
!=
null
)
{
for
(
Expression
arg
:
args
)
{
for
(
Expression
arg
:
args
)
{
arg
.
mapColumns
(
resolver
,
level
);
arg
.
mapColumns
(
resolver
,
level
,
innerState
);
}
}
}
}
super
.
mapColumns
(
resolver
,
level
);
super
.
mapColumns
Analysis
(
resolver
,
level
,
innerState
);
}
}
@Override
@Override
...
@@ -405,8 +404,7 @@ public class WindowFunction extends DataAnalysisOperation {
...
@@ -405,8 +404,7 @@ public class WindowFunction extends DataAnalysisOperation {
throw
DbException
.
getSyntaxError
(
sql
,
sql
.
length
()
-
1
);
throw
DbException
.
getSyntaxError
(
sql
,
sql
.
length
()
-
1
);
}
}
}
}
ArrayList
<
SelectOrderBy
>
orderBy
=
over
.
getOrderBy
();
if
(
over
.
getOrderBy
()
==
null
)
{
if
(
orderBy
==
null
||
orderBy
.
isEmpty
())
{
switch
(
type
)
{
switch
(
type
)
{
case
RANK:
case
RANK:
case
DENSE_RANK:
case
DENSE_RANK:
...
...
h2/src/main/org/h2/table/Column.java
浏览文件 @
e8b7f57d
...
@@ -475,11 +475,11 @@ public class Column {
...
@@ -475,11 +475,11 @@ public class Column {
if
(
defaultExpression
!=
null
||
onUpdateExpression
!=
null
)
{
if
(
defaultExpression
!=
null
||
onUpdateExpression
!=
null
)
{
computeTableFilter
=
new
TableFilter
(
session
,
table
,
null
,
false
,
null
,
0
,
null
);
computeTableFilter
=
new
TableFilter
(
session
,
table
,
null
,
false
,
null
,
0
,
null
);
if
(
defaultExpression
!=
null
)
{
if
(
defaultExpression
!=
null
)
{
defaultExpression
.
mapColumns
(
computeTableFilter
,
0
);
defaultExpression
.
mapColumns
(
computeTableFilter
,
0
,
Expression
.
MAP_INITIAL
);
defaultExpression
=
defaultExpression
.
optimize
(
session
);
defaultExpression
=
defaultExpression
.
optimize
(
session
);
}
}
if
(
onUpdateExpression
!=
null
)
{
if
(
onUpdateExpression
!=
null
)
{
onUpdateExpression
.
mapColumns
(
computeTableFilter
,
0
);
onUpdateExpression
.
mapColumns
(
computeTableFilter
,
0
,
Expression
.
MAP_INITIAL
);
onUpdateExpression
=
onUpdateExpression
.
optimize
(
session
);
onUpdateExpression
=
onUpdateExpression
.
optimize
(
session
);
}
}
}
}
...
@@ -683,7 +683,7 @@ public class Column {
...
@@ -683,7 +683,7 @@ public class Column {
if
(
name
==
null
)
{
if
(
name
==
null
)
{
name
=
"VALUE"
;
name
=
"VALUE"
;
}
}
expr
.
mapColumns
(
resolver
,
0
);
expr
.
mapColumns
(
resolver
,
0
,
Expression
.
MAP_INITIAL
);
name
=
oldName
;
name
=
oldName
;
}
}
expr
=
expr
.
optimize
(
session
);
expr
=
expr
.
optimize
(
session
);
...
...
h2/src/main/org/h2/table/TableFilter.java
浏览文件 @
e8b7f57d
...
@@ -663,7 +663,7 @@ public class TableFilter implements ColumnResolver {
...
@@ -663,7 +663,7 @@ public class TableFilter implements ColumnResolver {
*/
*/
public
void
addJoin
(
TableFilter
filter
,
boolean
outer
,
Expression
on
)
{
public
void
addJoin
(
TableFilter
filter
,
boolean
outer
,
Expression
on
)
{
if
(
on
!=
null
)
{
if
(
on
!=
null
)
{
on
.
mapColumns
(
this
,
0
);
on
.
mapColumns
(
this
,
0
,
Expression
.
MAP_INITIAL
);
TableFilterVisitor
visitor
=
new
MapColumnsVisitor
(
on
);
TableFilterVisitor
visitor
=
new
MapColumnsVisitor
(
on
);
visit
(
visitor
);
visit
(
visitor
);
filter
.
visit
(
visitor
);
filter
.
visit
(
visitor
);
...
@@ -697,11 +697,11 @@ public class TableFilter implements ColumnResolver {
...
@@ -697,11 +697,11 @@ public class TableFilter implements ColumnResolver {
* @param on the condition
* @param on the condition
*/
*/
public
void
mapAndAddFilter
(
Expression
on
)
{
public
void
mapAndAddFilter
(
Expression
on
)
{
on
.
mapColumns
(
this
,
0
);
on
.
mapColumns
(
this
,
0
,
Expression
.
MAP_INITIAL
);
addFilterCondition
(
on
,
true
);
addFilterCondition
(
on
,
true
);
on
.
createIndexConditions
(
session
,
this
);
on
.
createIndexConditions
(
session
,
this
);
if
(
nestedJoin
!=
null
)
{
if
(
nestedJoin
!=
null
)
{
on
.
mapColumns
(
nestedJoin
,
0
);
on
.
mapColumns
(
nestedJoin
,
0
,
Expression
.
MAP_INITIAL
);
on
.
createIndexConditions
(
session
,
nestedJoin
);
on
.
createIndexConditions
(
session
,
nestedJoin
);
}
}
if
(
join
!=
null
)
{
if
(
join
!=
null
)
{
...
@@ -1219,7 +1219,7 @@ public class TableFilter implements ColumnResolver {
...
@@ -1219,7 +1219,7 @@ public class TableFilter implements ColumnResolver {
@Override
@Override
public
void
accept
(
TableFilter
f
)
{
public
void
accept
(
TableFilter
f
)
{
on
.
mapColumns
(
f
,
0
);
on
.
mapColumns
(
f
,
0
,
Expression
.
MAP_INITIAL
);
}
}
}
}
...
...
h2/src/test/org/h2/test/scripts/window.sql
浏览文件 @
e8b7f57d
...
@@ -41,3 +41,12 @@ SELECT *, LAST_VALUE(ID) OVER W FROM TEST
...
@@ -41,3 +41,12 @@ SELECT *, LAST_VALUE(ID) OVER W FROM TEST
DROP
TABLE
TEST
;
DROP
TABLE
TEST
;
>
ok
>
ok
SELECT
MAX
(
MAX
(
X
)
OVER
())
OVER
()
FROM
VALUES
(
1
);
>
exception
INVALID_USE_OF_AGGREGATE_FUNCTION_1
SELECT
MAX
(
MAX
(
X
)
OVER
())
FROM
VALUES
(
1
);
>
exception
INVALID_USE_OF_AGGREGATE_FUNCTION_1
SELECT
MAX
(
MAX
(
X
))
FROM
VALUES
(
1
);
>
exception
INVALID_USE_OF_AGGREGATE_FUNCTION_1
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论