Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
为 GitLab 提交贡献
登录/注册
切换导航
H
h2database
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
Administrator
h2database
Commits
8949f340
Unverified
提交
8949f340
authored
6 年前
作者:
Evgenij Ryazanov
提交者:
GitHub
6 年前
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #1447 from katzyn/aggregate
Refactor OVER() processing code and fix some issues
上级
ca53a732
4b02e36f
全部展开
显示空白字符变更
内嵌
并排
正在显示
35 个修改的文件
包含
414 行增加
和
234 行删除
+414
-234
Query.java
h2/src/main/org/h2/command/dml/Query.java
+2
-1
Select.java
h2/src/main/org/h2/command/dml/Select.java
+18
-28
SelectGroups.java
h2/src/main/org/h2/command/dml/SelectGroups.java
+194
-80
SelectUnion.java
h2/src/main/org/h2/command/dml/SelectUnion.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
+3
-3
ConditionNot.java
h2/src/main/org/h2/expression/ConditionNot.java
+2
-2
Expression.java
h2/src/main/org/h2/expression/Expression.java
+2
-1
ExpressionColumn.java
h2/src/main/org/h2/expression/ExpressionColumn.java
+4
-4
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
+2
-2
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
+21
-0
Aggregate.java
h2/src/main/org/h2/expression/aggregate/Aggregate.java
+40
-46
JavaAggregate.java
h2/src/main/org/h2/expression/aggregate/JavaAggregate.java
+20
-22
Window.java
h2/src/main/org/h2/expression/aggregate/Window.java
+37
-0
array-agg.sql
...est/org/h2/test/scripts/functions/aggregate/array-agg.sql
+11
-0
count.sql
...rc/test/org/h2/test/scripts/functions/aggregate/count.sql
+15
-2
没有找到文件。
h2/src/main/org/h2/command/dml/Query.java
浏览文件 @
8949f340
...
@@ -276,8 +276,9 @@ public abstract class Query extends Prepared {
...
@@ -276,8 +276,9 @@ public abstract class Query extends Prepared {
* Update all aggregate function values.
* Update all aggregate function values.
*
*
* @param s the session
* @param s the session
* @param window true for window processing stage, false for group stage
*/
*/
public
abstract
void
updateAggregate
(
Session
s
);
public
abstract
void
updateAggregate
(
Session
s
,
boolean
window
);
/**
/**
* Call the before triggers on all tables.
* Call the before triggers on all tables.
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/command/dml/Select.java
浏览文件 @
8949f340
...
@@ -8,7 +8,6 @@ package org.h2.command.dml;
...
@@ -8,7 +8,6 @@ package org.h2.command.dml;
import
java.util.ArrayList
;
import
java.util.ArrayList
;
import
java.util.Arrays
;
import
java.util.Arrays
;
import
java.util.BitSet
;
import
java.util.BitSet
;
import
java.util.HashMap
;
import
java.util.HashSet
;
import
java.util.HashSet
;
import
org.h2.api.ErrorCode
;
import
org.h2.api.ErrorCode
;
import
org.h2.api.Trigger
;
import
org.h2.api.Trigger
;
...
@@ -105,7 +104,8 @@ public class Select extends Query {
...
@@ -105,7 +104,8 @@ public class Select extends Query {
SelectGroups
groupData
;
SelectGroups
groupData
;
private
int
havingIndex
;
private
int
havingIndex
;
private
boolean
isGroupQuery
,
isGroupSortedQuery
;
boolean
isGroupQuery
;
private
boolean
isGroupSortedQuery
;
private
boolean
isWindowQuery
;
private
boolean
isWindowQuery
;
private
boolean
isForUpdate
,
isForUpdateMvcc
;
private
boolean
isForUpdate
,
isForUpdateMvcc
;
private
double
cost
;
private
double
cost
;
...
@@ -177,8 +177,8 @@ public class Select extends Query {
...
@@ -177,8 +177,8 @@ public class Select extends Query {
return
group
;
return
group
;
}
}
public
SelectGroups
getGroupDataIfCurrent
(
boolean
forAggregate
)
{
public
SelectGroups
getGroupDataIfCurrent
(
boolean
window
)
{
return
groupData
!=
null
&&
(
forAggregate
||
!
isWindowQuery
)
&&
groupData
.
isCurrentGroup
(
)
?
groupData
:
null
;
return
groupData
!=
null
&&
(
window
||
groupData
.
isCurrentGroup
()
)
?
groupData
:
null
;
}
}
@Override
@Override
...
@@ -357,10 +357,9 @@ public class Select extends Query {
...
@@ -357,10 +357,9 @@ 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
)
{
if
(
groupData
==
null
)
{
if
(
groupData
==
null
)
{
groupData
=
new
SelectGroups
(
session
,
expressions
,
groupIndex
);
groupData
=
SelectGroups
.
getInstance
(
session
,
expressions
,
isGroupQuery
,
groupIndex
);
}
}
groupData
.
reset
();
groupData
.
reset
();
HashMap
<
ValueArray
,
ArrayList
<
Row
>>
rows
=
new
HashMap
<>();
try
{
try
{
int
rowNumber
=
0
;
int
rowNumber
=
0
;
setCurrentRowNumber
(
0
);
setCurrentRowNumber
(
0
);
...
@@ -369,14 +368,8 @@ public class Select extends Query {
...
@@ -369,14 +368,8 @@ public class Select extends Query {
setCurrentRowNumber
(
rowNumber
+
1
);
setCurrentRowNumber
(
rowNumber
+
1
);
if
(
isConditionMet
())
{
if
(
isConditionMet
())
{
rowNumber
++;
rowNumber
++;
ValueArray
key
=
groupData
.
nextSource
();
groupData
.
nextSource
();
ArrayList
<
Row
>
groupRows
=
rows
.
get
(
key
);
updateAgg
(
columnCount
,
true
);
if
(
groupRows
==
null
)
{
groupRows
=
Utils
.
newSmallArrayList
();
rows
.
put
(
key
,
groupRows
);
}
groupRows
.
add
(
topTableFilter
.
get
());
updateAgg
(
columnCount
);
if
(
sampleSize
>
0
&&
rowNumber
>=
sampleSize
)
{
if
(
sampleSize
>
0
&&
rowNumber
>=
sampleSize
)
{
break
;
break
;
}
}
...
@@ -384,11 +377,8 @@ public class Select extends Query {
...
@@ -384,11 +377,8 @@ public class Select extends Query {
}
}
groupData
.
done
();
groupData
.
done
();
for
(
ValueArray
currentGroupsKey
;
(
currentGroupsKey
=
groupData
.
next
())
!=
null
;)
{
for
(
ValueArray
currentGroupsKey
;
(
currentGroupsKey
=
groupData
.
next
())
!=
null
;)
{
for
(
Row
originalRow
:
rows
.
get
(
currentGroupsKey
))
{
topTableFilter
.
set
(
originalRow
);
offset
=
processGroupedRow
(
columnCount
,
result
,
offset
,
quickOffset
,
currentGroupsKey
);
offset
=
processGroupedRow
(
columnCount
,
result
,
offset
,
quickOffset
,
currentGroupsKey
);
}
}
}
}
finally
{
}
finally
{
groupData
.
reset
();
groupData
.
reset
();
}
}
...
@@ -396,7 +386,7 @@ public class Select extends Query {
...
@@ -396,7 +386,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
)
{
if
(
groupData
==
null
)
{
if
(
groupData
==
null
)
{
groupData
=
new
SelectGroups
(
session
,
expressions
,
groupIndex
);
groupData
=
SelectGroups
.
getInstance
(
session
,
expressions
,
isGroupQuery
,
groupIndex
);
}
}
groupData
.
reset
();
groupData
.
reset
();
try
{
try
{
...
@@ -408,7 +398,7 @@ public class Select extends Query {
...
@@ -408,7 +398,7 @@ public class Select extends Query {
if
(
isConditionMet
())
{
if
(
isConditionMet
())
{
rowNumber
++;
rowNumber
++;
groupData
.
nextSource
();
groupData
.
nextSource
();
updateAgg
(
columnCount
);
updateAgg
(
columnCount
,
false
);
if
(
sampleSize
>
0
&&
rowNumber
>=
sampleSize
)
{
if
(
sampleSize
>
0
&&
rowNumber
>=
sampleSize
)
{
break
;
break
;
}
}
...
@@ -423,11 +413,11 @@ public class Select extends Query {
...
@@ -423,11 +413,11 @@ public class Select extends Query {
}
}
}
}
private
void
updateAgg
(
int
columnCount
)
{
private
void
updateAgg
(
int
columnCount
,
boolean
window
)
{
for
(
int
i
=
0
;
i
<
columnCount
;
i
++)
{
for
(
int
i
=
0
;
i
<
columnCount
;
i
++)
{
if
(
groupByExpression
==
null
||
!
groupByExpression
[
i
])
{
if
(
groupByExpression
==
null
||
!
groupByExpression
[
i
])
{
Expression
expr
=
expressions
.
get
(
i
);
Expression
expr
=
expressions
.
get
(
i
);
expr
.
updateAggregate
(
session
);
expr
.
updateAggregate
(
session
,
window
);
}
}
}
}
}
}
...
@@ -1492,15 +1482,15 @@ public class Select extends Query {
...
@@ -1492,15 +1482,15 @@ public class Select extends Query {
}
}
@Override
@Override
public
void
updateAggregate
(
Session
s
)
{
public
void
updateAggregate
(
Session
s
,
boolean
window
)
{
for
(
Expression
e
:
expressions
)
{
for
(
Expression
e
:
expressions
)
{
e
.
updateAggregate
(
s
);
e
.
updateAggregate
(
s
,
window
);
}
}
if
(
condition
!=
null
)
{
if
(
condition
!=
null
)
{
condition
.
updateAggregate
(
s
);
condition
.
updateAggregate
(
s
,
window
);
}
}
if
(
having
!=
null
)
{
if
(
having
!=
null
)
{
having
.
updateAggregate
(
s
);
having
.
updateAggregate
(
s
,
window
);
}
}
}
}
...
@@ -1654,7 +1644,7 @@ public class Select extends Query {
...
@@ -1654,7 +1644,7 @@ public class Select extends Query {
LazyResultGroupSorted
(
Expression
[]
expressions
,
int
columnCount
)
{
LazyResultGroupSorted
(
Expression
[]
expressions
,
int
columnCount
)
{
super
(
expressions
,
columnCount
);
super
(
expressions
,
columnCount
);
if
(
groupData
==
null
)
{
if
(
groupData
==
null
)
{
groupData
=
new
SelectGroups
(
getSession
(),
Select
.
this
.
expressions
,
groupIndex
);
groupData
=
SelectGroups
.
getInstance
(
getSession
(),
Select
.
this
.
expressions
,
isGroupQuery
,
groupIndex
);
}
else
{
}
else
{
// TODO is this branch possible?
// TODO is this branch possible?
groupData
.
resetLazy
();
groupData
.
resetLazy
();
...
@@ -1696,7 +1686,7 @@ public class Select extends Query {
...
@@ -1696,7 +1686,7 @@ public class Select extends Query {
for
(
int
i
=
0
;
i
<
columnCount
;
i
++)
{
for
(
int
i
=
0
;
i
<
columnCount
;
i
++)
{
if
(
groupByExpression
==
null
||
!
groupByExpression
[
i
])
{
if
(
groupByExpression
==
null
||
!
groupByExpression
[
i
])
{
Expression
expr
=
expressions
.
get
(
i
);
Expression
expr
=
expressions
.
get
(
i
);
expr
.
updateAggregate
(
getSession
());
expr
.
updateAggregate
(
getSession
()
,
false
);
}
}
}
}
if
(
row
!=
null
)
{
if
(
row
!=
null
)
{
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/command/dml/SelectGroups.java
浏览文件 @
8949f340
差异被折叠。
点击展开。
h2/src/main/org/h2/command/dml/SelectUnion.java
浏览文件 @
8949f340
...
@@ -449,9 +449,9 @@ public class SelectUnion extends Query {
...
@@ -449,9 +449,9 @@ public class SelectUnion extends Query {
}
}
@Override
@Override
public
void
updateAggregate
(
Session
s
)
{
public
void
updateAggregate
(
Session
s
,
boolean
window
)
{
left
.
updateAggregate
(
s
);
left
.
updateAggregate
(
s
,
window
);
right
.
updateAggregate
(
s
);
right
.
updateAggregate
(
s
,
window
);
}
}
@Override
@Override
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/expression/Alias.java
浏览文件 @
8949f340
...
@@ -83,8 +83,8 @@ public class Alias extends Expression {
...
@@ -83,8 +83,8 @@ public class Alias extends Expression {
}
}
@Override
@Override
public
void
updateAggregate
(
Session
session
)
{
public
void
updateAggregate
(
Session
session
,
boolean
window
)
{
expr
.
updateAggregate
(
session
);
expr
.
updateAggregate
(
session
,
window
);
}
}
@Override
@Override
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/expression/BinaryOperation.java
浏览文件 @
8949f340
...
@@ -436,9 +436,9 @@ public class BinaryOperation extends Expression {
...
@@ -436,9 +436,9 @@ public class BinaryOperation extends Expression {
}
}
@Override
@Override
public
void
updateAggregate
(
Session
session
)
{
public
void
updateAggregate
(
Session
session
,
boolean
window
)
{
left
.
updateAggregate
(
session
);
left
.
updateAggregate
(
session
,
window
);
right
.
updateAggregate
(
session
);
right
.
updateAggregate
(
session
,
window
);
}
}
@Override
@Override
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/expression/CompareLike.java
浏览文件 @
8949f340
...
@@ -495,11 +495,11 @@ public class CompareLike extends Condition {
...
@@ -495,11 +495,11 @@ public class CompareLike extends Condition {
}
}
@Override
@Override
public
void
updateAggregate
(
Session
session
)
{
public
void
updateAggregate
(
Session
session
,
boolean
window
)
{
left
.
updateAggregate
(
session
);
left
.
updateAggregate
(
session
,
window
);
right
.
updateAggregate
(
session
);
right
.
updateAggregate
(
session
,
window
);
if
(
escape
!=
null
)
{
if
(
escape
!=
null
)
{
escape
.
updateAggregate
(
session
);
escape
.
updateAggregate
(
session
,
window
);
}
}
}
}
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/expression/Comparison.java
浏览文件 @
8949f340
...
@@ -475,10 +475,10 @@ public class Comparison extends Condition {
...
@@ -475,10 +475,10 @@ public class Comparison extends Condition {
}
}
@Override
@Override
public
void
updateAggregate
(
Session
session
)
{
public
void
updateAggregate
(
Session
session
,
boolean
window
)
{
left
.
updateAggregate
(
session
);
left
.
updateAggregate
(
session
,
window
);
if
(
right
!=
null
)
{
if
(
right
!=
null
)
{
right
.
updateAggregate
(
session
);
right
.
updateAggregate
(
session
,
window
);
}
}
}
}
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/expression/ConditionAndOr.java
浏览文件 @
8949f340
...
@@ -268,9 +268,9 @@ public class ConditionAndOr extends Condition {
...
@@ -268,9 +268,9 @@ public class ConditionAndOr extends Condition {
}
}
@Override
@Override
public
void
updateAggregate
(
Session
session
)
{
public
void
updateAggregate
(
Session
session
,
boolean
window
)
{
left
.
updateAggregate
(
session
);
left
.
updateAggregate
(
session
,
window
);
right
.
updateAggregate
(
session
);
right
.
updateAggregate
(
session
,
window
);
}
}
@Override
@Override
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/expression/ConditionExists.java
浏览文件 @
8949f340
...
@@ -46,7 +46,7 @@ public class ConditionExists extends Condition {
...
@@ -46,7 +46,7 @@ public class ConditionExists extends Condition {
}
}
@Override
@Override
public
void
updateAggregate
(
Session
session
)
{
public
void
updateAggregate
(
Session
session
,
boolean
window
)
{
// TODO exists: is it allowed that the subquery contains aggregates?
// TODO exists: is it allowed that the subquery contains aggregates?
// probably not
// probably not
// select id from test group by id having exists (select * from test2
// select id from test group by id having exists (select * from test2
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/expression/ConditionIn.java
浏览文件 @
8949f340
...
@@ -163,10 +163,10 @@ public class ConditionIn extends Condition {
...
@@ -163,10 +163,10 @@ public class ConditionIn extends Condition {
}
}
@Override
@Override
public
void
updateAggregate
(
Session
session
)
{
public
void
updateAggregate
(
Session
session
,
boolean
window
)
{
left
.
updateAggregate
(
session
);
left
.
updateAggregate
(
session
,
window
);
for
(
Expression
e
:
valueList
)
{
for
(
Expression
e
:
valueList
)
{
e
.
updateAggregate
(
session
);
e
.
updateAggregate
(
session
,
window
);
}
}
}
}
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/expression/ConditionInConstantSet.java
浏览文件 @
8949f340
...
@@ -125,8 +125,8 @@ public class ConditionInConstantSet extends Condition {
...
@@ -125,8 +125,8 @@ public class ConditionInConstantSet extends Condition {
}
}
@Override
@Override
public
void
updateAggregate
(
Session
session
)
{
public
void
updateAggregate
(
Session
session
,
boolean
window
)
{
left
.
updateAggregate
(
session
);
left
.
updateAggregate
(
session
,
window
);
}
}
@Override
@Override
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/expression/ConditionInParameter.java
浏览文件 @
8949f340
...
@@ -145,8 +145,8 @@ public class ConditionInParameter extends Condition {
...
@@ -145,8 +145,8 @@ public class ConditionInParameter extends Condition {
}
}
@Override
@Override
public
void
updateAggregate
(
Session
session
)
{
public
void
updateAggregate
(
Session
session
,
boolean
window
)
{
left
.
updateAggregate
(
session
);
left
.
updateAggregate
(
session
,
window
);
}
}
@Override
@Override
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/expression/ConditionInSelect.java
浏览文件 @
8949f340
...
@@ -146,9 +146,9 @@ public class ConditionInSelect extends Condition {
...
@@ -146,9 +146,9 @@ public class ConditionInSelect extends Condition {
}
}
@Override
@Override
public
void
updateAggregate
(
Session
session
)
{
public
void
updateAggregate
(
Session
session
,
boolean
window
)
{
left
.
updateAggregate
(
session
);
left
.
updateAggregate
(
session
,
window
);
query
.
updateAggregate
(
session
);
query
.
updateAggregate
(
session
,
window
);
}
}
@Override
@Override
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/expression/ConditionNot.java
浏览文件 @
8949f340
...
@@ -70,8 +70,8 @@ public class ConditionNot extends Condition {
...
@@ -70,8 +70,8 @@ public class ConditionNot extends Condition {
}
}
@Override
@Override
public
void
updateAggregate
(
Session
session
)
{
public
void
updateAggregate
(
Session
session
,
boolean
window
)
{
condition
.
updateAggregate
(
session
);
condition
.
updateAggregate
(
session
,
window
);
}
}
@Override
@Override
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/expression/Expression.java
浏览文件 @
8949f340
...
@@ -105,8 +105,9 @@ public abstract class Expression {
...
@@ -105,8 +105,9 @@ public abstract class Expression {
* be used to make sure the internal state is only updated once.
* be used to make sure the internal state is only updated once.
*
*
* @param session the session
* @param session the session
* @param window true for window processing stage, false for group stage
*/
*/
public
abstract
void
updateAggregate
(
Session
session
);
public
abstract
void
updateAggregate
(
Session
session
,
boolean
window
);
/**
/**
* Check if this expression and all sub-expressions can fulfill a criteria.
* Check if this expression and all sub-expressions can fulfill a criteria.
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/expression/ExpressionColumn.java
浏览文件 @
8949f340
...
@@ -153,7 +153,7 @@ public class ExpressionColumn extends Expression {
...
@@ -153,7 +153,7 @@ public class ExpressionColumn extends Expression {
}
}
@Override
@Override
public
void
updateAggregate
(
Session
session
)
{
public
void
updateAggregate
(
Session
session
,
boolean
window
)
{
Value
now
=
columnResolver
.
getValue
(
column
);
Value
now
=
columnResolver
.
getValue
(
column
);
Select
select
=
columnResolver
.
getSelect
();
Select
select
=
columnResolver
.
getSelect
();
if
(
select
==
null
)
{
if
(
select
==
null
)
{
...
@@ -164,9 +164,9 @@ public class ExpressionColumn extends Expression {
...
@@ -164,9 +164,9 @@ public class ExpressionColumn extends Expression {
// this is a different level (the enclosing query)
// this is a different level (the enclosing query)
return
;
return
;
}
}
Value
v
=
(
Value
)
groupData
.
getCurrentGroupExprData
(
this
);
Value
v
=
(
Value
)
groupData
.
getCurrentGroupExprData
(
this
,
false
);
if
(
v
==
null
)
{
if
(
v
==
null
)
{
groupData
.
setCurrentGroupExprData
(
this
,
now
);
groupData
.
setCurrentGroupExprData
(
this
,
now
,
false
);
}
else
{
}
else
{
if
(!
database
.
areEqual
(
now
,
v
))
{
if
(!
database
.
areEqual
(
now
,
v
))
{
throw
DbException
.
get
(
ErrorCode
.
MUST_GROUP_BY_COLUMN_1
,
getSQL
());
throw
DbException
.
get
(
ErrorCode
.
MUST_GROUP_BY_COLUMN_1
,
getSQL
());
...
@@ -180,7 +180,7 @@ public class ExpressionColumn extends Expression {
...
@@ -180,7 +180,7 @@ public class ExpressionColumn extends Expression {
if
(
select
!=
null
)
{
if
(
select
!=
null
)
{
SelectGroups
groupData
=
select
.
getGroupDataIfCurrent
(
false
);
SelectGroups
groupData
=
select
.
getGroupDataIfCurrent
(
false
);
if
(
groupData
!=
null
)
{
if
(
groupData
!=
null
)
{
Value
v
=
(
Value
)
groupData
.
getCurrentGroupExprData
(
this
);
Value
v
=
(
Value
)
groupData
.
getCurrentGroupExprData
(
this
,
false
);
if
(
v
!=
null
)
{
if
(
v
!=
null
)
{
return
v
;
return
v
;
}
}
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/expression/ExpressionList.java
浏览文件 @
8949f340
...
@@ -98,9 +98,9 @@ public class ExpressionList extends Expression {
...
@@ -98,9 +98,9 @@ public class ExpressionList extends Expression {
}
}
@Override
@Override
public
void
updateAggregate
(
Session
session
)
{
public
void
updateAggregate
(
Session
session
,
boolean
window
)
{
for
(
Expression
e
:
list
)
{
for
(
Expression
e
:
list
)
{
e
.
updateAggregate
(
session
);
e
.
updateAggregate
(
session
,
window
);
}
}
}
}
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/expression/Function.java
浏览文件 @
8949f340
...
@@ -2633,10 +2633,10 @@ public class Function extends Expression implements FunctionCall {
...
@@ -2633,10 +2633,10 @@ public class Function extends Expression implements FunctionCall {
}
}
@Override
@Override
public
void
updateAggregate
(
Session
session
)
{
public
void
updateAggregate
(
Session
session
,
boolean
window
)
{
for
(
Expression
e
:
args
)
{
for
(
Expression
e
:
args
)
{
if
(
e
!=
null
)
{
if
(
e
!=
null
)
{
e
.
updateAggregate
(
session
);
e
.
updateAggregate
(
session
,
window
);
}
}
}
}
}
}
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/expression/IntervalOperation.java
浏览文件 @
8949f340
...
@@ -291,9 +291,9 @@ public class IntervalOperation extends Expression {
...
@@ -291,9 +291,9 @@ public class IntervalOperation extends Expression {
}
}
@Override
@Override
public
void
updateAggregate
(
Session
session
)
{
public
void
updateAggregate
(
Session
session
,
boolean
window
)
{
left
.
updateAggregate
(
session
);
left
.
updateAggregate
(
session
,
window
);
right
.
updateAggregate
(
session
);
right
.
updateAggregate
(
session
,
window
);
}
}
@Override
@Override
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/expression/JavaFunction.java
浏览文件 @
8949f340
...
@@ -107,10 +107,10 @@ public class JavaFunction extends Expression implements FunctionCall {
...
@@ -107,10 +107,10 @@ public class JavaFunction extends Expression implements FunctionCall {
}
}
@Override
@Override
public
void
updateAggregate
(
Session
session
)
{
public
void
updateAggregate
(
Session
session
,
boolean
window
)
{
for
(
Expression
e
:
args
)
{
for
(
Expression
e
:
args
)
{
if
(
e
!=
null
)
{
if
(
e
!=
null
)
{
e
.
updateAggregate
(
session
);
e
.
updateAggregate
(
session
,
window
);
}
}
}
}
}
}
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/expression/Parameter.java
浏览文件 @
8949f340
...
@@ -141,7 +141,7 @@ public class Parameter extends Expression implements ParameterInterface {
...
@@ -141,7 +141,7 @@ public class Parameter extends Expression implements ParameterInterface {
}
}
@Override
@Override
public
void
updateAggregate
(
Session
session
)
{
public
void
updateAggregate
(
Session
session
,
boolean
window
)
{
// nothing to do
// nothing to do
}
}
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/expression/Rownum.java
浏览文件 @
8949f340
...
@@ -73,7 +73,7 @@ public class Rownum extends Expression {
...
@@ -73,7 +73,7 @@ public class Rownum extends Expression {
}
}
@Override
@Override
public
void
updateAggregate
(
Session
session
)
{
public
void
updateAggregate
(
Session
session
,
boolean
window
)
{
// nothing to do
// nothing to do
}
}
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/expression/SequenceValue.java
浏览文件 @
8949f340
...
@@ -72,7 +72,7 @@ public class SequenceValue extends Expression {
...
@@ -72,7 +72,7 @@ public class SequenceValue extends Expression {
}
}
@Override
@Override
public
void
updateAggregate
(
Session
session
)
{
public
void
updateAggregate
(
Session
session
,
boolean
window
)
{
// nothing to do
// nothing to do
}
}
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/expression/Subquery.java
浏览文件 @
8949f340
...
@@ -94,8 +94,8 @@ public class Subquery extends Expression {
...
@@ -94,8 +94,8 @@ public class Subquery extends Expression {
}
}
@Override
@Override
public
void
updateAggregate
(
Session
session
)
{
public
void
updateAggregate
(
Session
session
,
boolean
window
)
{
query
.
updateAggregate
(
session
);
query
.
updateAggregate
(
session
,
window
);
}
}
private
Expression
getExpression
()
{
private
Expression
getExpression
()
{
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/expression/UnaryOperation.java
浏览文件 @
8949f340
...
@@ -82,8 +82,8 @@ public class UnaryOperation extends Expression {
...
@@ -82,8 +82,8 @@ public class UnaryOperation extends Expression {
}
}
@Override
@Override
public
void
updateAggregate
(
Session
session
)
{
public
void
updateAggregate
(
Session
session
,
boolean
window
)
{
arg
.
updateAggregate
(
session
);
arg
.
updateAggregate
(
session
,
window
);
}
}
@Override
@Override
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/expression/ValueExpression.java
浏览文件 @
8949f340
...
@@ -143,7 +143,7 @@ public class ValueExpression extends Expression {
...
@@ -143,7 +143,7 @@ public class ValueExpression extends Expression {
}
}
@Override
@Override
public
void
updateAggregate
(
Session
session
)
{
public
void
updateAggregate
(
Session
session
,
boolean
window
)
{
// nothing to do
// nothing to do
}
}
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/expression/Variable.java
浏览文件 @
8949f340
...
@@ -101,7 +101,7 @@ public class Variable extends Expression {
...
@@ -101,7 +101,7 @@ public class Variable extends Expression {
}
}
@Override
@Override
public
void
updateAggregate
(
Session
session
)
{
public
void
updateAggregate
(
Session
session
,
boolean
window
)
{
// nothing to do
// nothing to do
}
}
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/expression/Wildcard.java
浏览文件 @
8949f340
...
@@ -91,7 +91,7 @@ public class Wildcard extends Expression {
...
@@ -91,7 +91,7 @@ public class Wildcard extends Expression {
}
}
@Override
@Override
public
void
updateAggregate
(
Session
session
)
{
public
void
updateAggregate
(
Session
session
,
boolean
window
)
{
DbException
.
throwInternalError
(
toString
());
DbException
.
throwInternalError
(
toString
());
}
}
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/expression/aggregate/AbstractAggregate.java
浏览文件 @
8949f340
...
@@ -7,6 +7,7 @@ package org.h2.expression.aggregate;
...
@@ -7,6 +7,7 @@ package org.h2.expression.aggregate;
import
org.h2.expression.Expression
;
import
org.h2.expression.Expression
;
import
org.h2.table.ColumnResolver
;
import
org.h2.table.ColumnResolver
;
import
org.h2.table.TableFilter
;
/**
/**
* A base class for aggregates.
* A base class for aggregates.
...
@@ -47,4 +48,24 @@ public abstract class AbstractAggregate extends Expression {
...
@@ -47,4 +48,24 @@ public abstract class AbstractAggregate extends Expression {
}
}
}
}
@Override
public
void
setEvaluatable
(
TableFilter
tableFilter
,
boolean
b
)
{
if
(
filterCondition
!=
null
)
{
filterCondition
.
setEvaluatable
(
tableFilter
,
b
);
}
if
(
over
!=
null
)
{
over
.
setEvaluatable
(
tableFilter
,
b
);
}
}
protected
StringBuilder
appendTailConditions
(
StringBuilder
builder
)
{
if
(
filterCondition
!=
null
)
{
builder
.
append
(
" FILTER (WHERE "
).
append
(
filterCondition
.
getSQL
()).
append
(
')'
);
}
if
(
over
!=
null
)
{
builder
.
append
(
' '
).
append
(
over
.
getSQL
());
}
return
builder
;
}
}
}
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/expression/aggregate/Aggregate.java
浏览文件 @
8949f340
...
@@ -170,10 +170,14 @@ public class Aggregate extends AbstractAggregate {
...
@@ -170,10 +170,14 @@ public class Aggregate extends AbstractAggregate {
/**
/**
* Create a new aggregate object.
* Create a new aggregate object.
*
*
* @param type the aggregate type
* @param type
* @param on the aggregated expression
* the aggregate type
* @param select the select statement
* @param on
* @param distinct if distinct is used
* the aggregated expression
* @param select
* the select statement
* @param distinct
* if distinct is used
*/
*/
public
Aggregate
(
AggregateType
type
,
Expression
on
,
Select
select
,
boolean
distinct
)
{
public
Aggregate
(
AggregateType
type
,
Expression
on
,
Select
select
,
boolean
distinct
)
{
this
.
type
=
type
;
this
.
type
=
type
;
...
@@ -229,8 +233,10 @@ public class Aggregate extends AbstractAggregate {
...
@@ -229,8 +233,10 @@ public class Aggregate extends AbstractAggregate {
* Get the aggregate type for this name, or -1 if no aggregate has been
* Get the aggregate type for this name, or -1 if no aggregate has been
* found.
* found.
*
*
* @param name the aggregate function name
* @param name
* @return null if no aggregate function has been found, or the aggregate type
* the aggregate function name
* @return null if no aggregate function has been found, or the aggregate
* type
*/
*/
public
static
AggregateType
getAggregateType
(
String
name
)
{
public
static
AggregateType
getAggregateType
(
String
name
)
{
return
AGGREGATES
.
get
(
name
);
return
AGGREGATES
.
get
(
name
);
...
@@ -239,7 +245,8 @@ public class Aggregate extends AbstractAggregate {
...
@@ -239,7 +245,8 @@ public class Aggregate extends AbstractAggregate {
/**
/**
* Set the order for ARRAY_AGG() or GROUP_CONCAT() aggregate.
* Set the order for ARRAY_AGG() or GROUP_CONCAT() aggregate.
*
*
* @param orderByList the order by list
* @param orderByList
* the order by list
*/
*/
public
void
setOrderByList
(
ArrayList
<
SelectOrderBy
>
orderByList
)
{
public
void
setOrderByList
(
ArrayList
<
SelectOrderBy
>
orderByList
)
{
this
.
orderByList
=
orderByList
;
this
.
orderByList
=
orderByList
;
...
@@ -248,7 +255,8 @@ public class Aggregate extends AbstractAggregate {
...
@@ -248,7 +255,8 @@ public class Aggregate extends AbstractAggregate {
/**
/**
* Set the separator for the GROUP_CONCAT() aggregate.
* Set the separator for the GROUP_CONCAT() aggregate.
*
*
* @param separator the separator expression
* @param separator
* the separator expression
*/
*/
public
void
setGroupConcatSeparator
(
Expression
separator
)
{
public
void
setGroupConcatSeparator
(
Expression
separator
)
{
this
.
groupConcatSeparator
=
separator
;
this
.
groupConcatSeparator
=
separator
;
...
@@ -281,12 +289,15 @@ public class Aggregate extends AbstractAggregate {
...
@@ -281,12 +289,15 @@ public class Aggregate extends AbstractAggregate {
}
}
@Override
@Override
public
void
updateAggregate
(
Session
session
)
{
public
void
updateAggregate
(
Session
session
,
boolean
window
)
{
if
(
window
!=
(
over
!=
null
))
{
return
;
}
// TODO aggregates: check nested MIN(MAX(ID)) and so on
// TODO aggregates: check nested MIN(MAX(ID)) and so on
// if (on != null) {
// if (on != null) {
// on.updateAggregate();
// on.updateAggregate();
// }
// }
SelectGroups
groupData
=
select
.
getGroupDataIfCurrent
(
true
);
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)
return
;
return
;
...
@@ -299,6 +310,9 @@ public class Aggregate extends AbstractAggregate {
...
@@ -299,6 +310,9 @@ public class Aggregate extends AbstractAggregate {
}
}
lastGroupRowId
=
groupRowId
;
lastGroupRowId
=
groupRowId
;
if
(
over
!=
null
)
{
over
.
updateAggregate
(
session
,
true
);
}
if
(
filterCondition
!=
null
)
{
if
(
filterCondition
!=
null
)
{
if
(!
filterCondition
.
getBooleanValue
(
session
))
{
if
(!
filterCondition
.
getBooleanValue
(
session
))
{
return
;
return
;
...
@@ -366,7 +380,7 @@ public class Aggregate extends AbstractAggregate {
...
@@ -366,7 +380,7 @@ public class Aggregate extends AbstractAggregate {
DbException
.
throwInternalError
(
"type="
+
type
);
DbException
.
throwInternalError
(
"type="
+
type
);
}
}
}
}
SelectGroups
groupData
=
select
.
getGroupDataIfCurrent
(
true
);
SelectGroups
groupData
=
select
.
getGroupDataIfCurrent
(
over
!=
null
);
if
(
groupData
==
null
)
{
if
(
groupData
==
null
)
{
throw
DbException
.
get
(
ErrorCode
.
INVALID_USE_OF_AGGREGATE_FUNCTION_1
,
getSQL
());
throw
DbException
.
get
(
ErrorCode
.
INVALID_USE_OF_AGGREGATE_FUNCTION_1
,
getSQL
());
}
}
...
@@ -381,8 +395,7 @@ public class Aggregate extends AbstractAggregate {
...
@@ -381,8 +395,7 @@ public class Aggregate extends AbstractAggregate {
sortWithOrderBy
(
array
);
sortWithOrderBy
(
array
);
}
}
StatementBuilder
buff
=
new
StatementBuilder
();
StatementBuilder
buff
=
new
StatementBuilder
();
String
sep
=
groupConcatSeparator
==
null
?
String
sep
=
groupConcatSeparator
==
null
?
","
:
groupConcatSeparator
.
getValue
(
session
).
getString
();
","
:
groupConcatSeparator
.
getValue
(
session
).
getString
();
for
(
Value
val
:
array
)
{
for
(
Value
val
:
array
)
{
String
s
;
String
s
;
if
(
val
.
getType
()
==
Value
.
ARRAY
)
{
if
(
val
.
getType
()
==
Value
.
ARRAY
)
{
...
@@ -431,10 +444,11 @@ public class Aggregate extends AbstractAggregate {
...
@@ -431,10 +444,11 @@ public class Aggregate extends AbstractAggregate {
ValueArray
key
;
ValueArray
key
;
if
(
over
!=
null
&&
(
key
=
over
.
getCurrentKey
(
session
))
!=
null
)
{
if
(
over
!=
null
&&
(
key
=
over
.
getCurrentKey
(
session
))
!=
null
)
{
@SuppressWarnings
(
"unchecked"
)
@SuppressWarnings
(
"unchecked"
)
ValueHashMap
<
AggregateData
>
map
=
(
ValueHashMap
<
AggregateData
>)
groupData
.
getCurrentGroupExprData
(
this
);
ValueHashMap
<
AggregateData
>
map
=
(
ValueHashMap
<
AggregateData
>)
groupData
.
getCurrentGroupExprData
(
this
,
true
);
if
(
map
==
null
)
{
if
(
map
==
null
)
{
map
=
new
ValueHashMap
<>();
map
=
new
ValueHashMap
<>();
groupData
.
setCurrentGroupExprData
(
this
,
map
);
groupData
.
setCurrentGroupExprData
(
this
,
map
,
true
);
}
}
data
=
map
.
get
(
key
);
data
=
map
.
get
(
key
);
if
(
data
==
null
)
{
if
(
data
==
null
)
{
...
@@ -442,10 +456,10 @@ public class Aggregate extends AbstractAggregate {
...
@@ -442,10 +456,10 @@ public class Aggregate extends AbstractAggregate {
map
.
put
(
key
,
data
);
map
.
put
(
key
,
data
);
}
}
}
else
{
}
else
{
data
=
(
AggregateData
)
groupData
.
getCurrentGroupExprData
(
this
);
data
=
(
AggregateData
)
groupData
.
getCurrentGroupExprData
(
this
,
over
!=
null
);
if
(
data
==
null
)
{
if
(
data
==
null
)
{
data
=
AggregateData
.
create
(
type
);
data
=
AggregateData
.
create
(
type
);
groupData
.
setCurrentGroupExprData
(
this
,
data
);
groupData
.
setCurrentGroupExprData
(
this
,
data
,
over
!=
null
);
}
}
}
}
return
data
;
return
data
;
...
@@ -588,9 +602,7 @@ public class Aggregate extends AbstractAggregate {
...
@@ -588,9 +602,7 @@ public class Aggregate extends AbstractAggregate {
if
(
groupConcatSeparator
!=
null
)
{
if
(
groupConcatSeparator
!=
null
)
{
groupConcatSeparator
.
setEvaluatable
(
tableFilter
,
b
);
groupConcatSeparator
.
setEvaluatable
(
tableFilter
,
b
);
}
}
if
(
filterCondition
!=
null
)
{
super
.
setEvaluatable
(
tableFilter
,
b
);
filterCondition
.
setEvaluatable
(
tableFilter
,
b
);
}
}
}
@Override
@Override
...
@@ -626,13 +638,7 @@ public class Aggregate extends AbstractAggregate {
...
@@ -626,13 +638,7 @@ public class Aggregate extends AbstractAggregate {
buff
.
append
(
" SEPARATOR "
).
append
(
groupConcatSeparator
.
getSQL
());
buff
.
append
(
" SEPARATOR "
).
append
(
groupConcatSeparator
.
getSQL
());
}
}
buff
.
append
(
')'
);
buff
.
append
(
')'
);
if
(
filterCondition
!=
null
)
{
return
appendTailConditions
(
buff
.
builder
()).
toString
();
buff
.
append
(
" FILTER (WHERE "
).
append
(
filterCondition
.
getSQL
()).
append
(
')'
);
}
if
(
over
!=
null
)
{
buff
.
append
(
' '
).
append
(
over
.
getSQL
());
}
return
buff
.
toString
();
}
}
private
String
getSQLArrayAggregate
()
{
private
String
getSQLArrayAggregate
()
{
...
@@ -650,13 +656,7 @@ public class Aggregate extends AbstractAggregate {
...
@@ -650,13 +656,7 @@ public class Aggregate extends AbstractAggregate {
}
}
}
}
buff
.
append
(
')'
);
buff
.
append
(
')'
);
if
(
filterCondition
!=
null
)
{
return
appendTailConditions
(
buff
.
builder
()).
toString
();
buff
.
append
(
" FILTER (WHERE "
).
append
(
filterCondition
.
getSQL
()).
append
(
')'
);
}
if
(
over
!=
null
)
{
buff
.
append
(
' '
).
append
(
over
.
getSQL
());
}
return
buff
.
toString
();
}
}
@Override
@Override
...
@@ -666,7 +666,7 @@ public class Aggregate extends AbstractAggregate {
...
@@ -666,7 +666,7 @@ public class Aggregate extends AbstractAggregate {
case
GROUP_CONCAT:
case
GROUP_CONCAT:
return
getSQLGroupConcat
();
return
getSQLGroupConcat
();
case
COUNT_ALL:
case
COUNT_ALL:
return
"COUNT(*)"
;
return
appendTailConditions
(
new
StringBuilder
().
append
(
"COUNT(*)"
)).
toString
()
;
case
COUNT:
case
COUNT:
text
=
"COUNT"
;
text
=
"COUNT"
;
break
;
break
;
...
@@ -726,18 +726,13 @@ public class Aggregate extends AbstractAggregate {
...
@@ -726,18 +726,13 @@ public class Aggregate extends AbstractAggregate {
default
:
default
:
throw
DbException
.
throwInternalError
(
"type="
+
type
);
throw
DbException
.
throwInternalError
(
"type="
+
type
);
}
}
StringBuilder
builder
=
new
StringBuilder
().
append
(
text
);
if
(
distinct
)
{
if
(
distinct
)
{
text
+=
"(DISTINCT "
+
on
.
getSQL
()
+
')'
;
builder
.
append
(
"(DISTINCT "
).
append
(
on
.
getSQL
()).
append
(
')'
)
;
}
else
{
}
else
{
text
+=
StringUtils
.
enclose
(
on
.
getSQL
());
builder
.
append
(
StringUtils
.
enclose
(
on
.
getSQL
()));
}
if
(
filterCondition
!=
null
)
{
text
+=
" FILTER (WHERE "
+
filterCondition
.
getSQL
()
+
')'
;
}
if
(
over
!=
null
)
{
text
+=
' '
+
over
.
getSQL
();
}
}
return
text
;
return
appendTailConditions
(
builder
).
toString
()
;
}
}
private
Index
getMinMaxColumnIndex
()
{
private
Index
getMinMaxColumnIndex
()
{
...
@@ -785,8 +780,7 @@ public class Aggregate extends AbstractAggregate {
...
@@ -785,8 +780,7 @@ public class Aggregate extends AbstractAggregate {
if
(
on
!=
null
&&
!
on
.
isEverything
(
visitor
))
{
if
(
on
!=
null
&&
!
on
.
isEverything
(
visitor
))
{
return
false
;
return
false
;
}
}
if
(
groupConcatSeparator
!=
null
&&
if
(
groupConcatSeparator
!=
null
&&
!
groupConcatSeparator
.
isEverything
(
visitor
))
{
!
groupConcatSeparator
.
isEverything
(
visitor
))
{
return
false
;
return
false
;
}
}
if
(
orderByList
!=
null
)
{
if
(
orderByList
!=
null
)
{
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/expression/aggregate/JavaAggregate.java
浏览文件 @
8949f340
...
@@ -83,13 +83,7 @@ public class JavaAggregate extends AbstractAggregate {
...
@@ -83,13 +83,7 @@ public class JavaAggregate extends AbstractAggregate {
buff
.
append
(
e
.
getSQL
());
buff
.
append
(
e
.
getSQL
());
}
}
buff
.
append
(
')'
);
buff
.
append
(
')'
);
if
(
filterCondition
!=
null
)
{
return
appendTailConditions
(
buff
.
builder
()).
toString
();
buff
.
append
(
" FILTER (WHERE "
).
append
(
filterCondition
.
getSQL
()).
append
(
')'
);
}
if
(
over
!=
null
)
{
buff
.
append
(
' '
).
append
(
over
.
getSQL
());
}
return
buff
.
toString
();
}
}
@Override
@Override
...
@@ -155,9 +149,7 @@ public class JavaAggregate extends AbstractAggregate {
...
@@ -155,9 +149,7 @@ public class JavaAggregate extends AbstractAggregate {
for
(
Expression
e
:
args
)
{
for
(
Expression
e
:
args
)
{
e
.
setEvaluatable
(
tableFilter
,
b
);
e
.
setEvaluatable
(
tableFilter
,
b
);
}
}
if
(
filterCondition
!=
null
)
{
super
.
setEvaluatable
(
tableFilter
,
b
);
filterCondition
.
setEvaluatable
(
tableFilter
,
b
);
}
}
}
private
Aggregate
getInstance
()
throws
SQLException
{
private
Aggregate
getInstance
()
throws
SQLException
{
...
@@ -168,7 +160,7 @@ public class JavaAggregate extends AbstractAggregate {
...
@@ -168,7 +160,7 @@ public class JavaAggregate extends AbstractAggregate {
@Override
@Override
public
Value
getValue
(
Session
session
)
{
public
Value
getValue
(
Session
session
)
{
SelectGroups
groupData
=
select
.
getGroupDataIfCurrent
(
true
);
SelectGroups
groupData
=
select
.
getGroupDataIfCurrent
(
over
!=
null
);
if
(
groupData
==
null
)
{
if
(
groupData
==
null
)
{
throw
DbException
.
get
(
ErrorCode
.
INVALID_USE_OF_AGGREGATE_FUNCTION_1
,
getSQL
());
throw
DbException
.
get
(
ErrorCode
.
INVALID_USE_OF_AGGREGATE_FUNCTION_1
,
getSQL
());
}
}
...
@@ -208,8 +200,11 @@ public class JavaAggregate extends AbstractAggregate {
...
@@ -208,8 +200,11 @@ public class JavaAggregate extends AbstractAggregate {
}
}
@Override
@Override
public
void
updateAggregate
(
Session
session
)
{
public
void
updateAggregate
(
Session
session
,
boolean
window
)
{
SelectGroups
groupData
=
select
.
getGroupDataIfCurrent
(
true
);
if
(
window
!=
(
over
!=
null
))
{
return
;
}
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)
return
;
return
;
...
@@ -222,6 +217,9 @@ public class JavaAggregate extends AbstractAggregate {
...
@@ -222,6 +217,9 @@ public class JavaAggregate extends AbstractAggregate {
}
}
lastGroupRowId
=
groupRowId
;
lastGroupRowId
=
groupRowId
;
if
(
over
!=
null
)
{
over
.
updateAggregate
(
session
,
true
);
}
if
(
filterCondition
!=
null
)
{
if
(
filterCondition
!=
null
)
{
if
(!
filterCondition
.
getBooleanValue
(
session
))
{
if
(!
filterCondition
.
getBooleanValue
(
session
))
{
return
;
return
;
...
@@ -261,13 +259,13 @@ public class JavaAggregate extends AbstractAggregate {
...
@@ -261,13 +259,13 @@ public class JavaAggregate extends AbstractAggregate {
ValueArray
key
;
ValueArray
key
;
if
(
over
!=
null
&&
(
key
=
over
.
getCurrentKey
(
session
))
!=
null
)
{
if
(
over
!=
null
&&
(
key
=
over
.
getCurrentKey
(
session
))
!=
null
)
{
@SuppressWarnings
(
"unchecked"
)
@SuppressWarnings
(
"unchecked"
)
ValueHashMap
<
Aggregate
>
map
=
(
ValueHashMap
<
Aggregate
>)
groupData
.
getCurrentGroupExprData
(
this
);
ValueHashMap
<
Aggregate
>
map
=
(
ValueHashMap
<
Aggregate
>)
groupData
.
getCurrentGroupExprData
(
this
,
true
);
if
(
map
==
null
)
{
if
(
map
==
null
)
{
if
(
ifExists
)
{
if
(
ifExists
)
{
return
null
;
return
null
;
}
}
map
=
new
ValueHashMap
<>();
map
=
new
ValueHashMap
<>();
groupData
.
setCurrentGroupExprData
(
this
,
map
);
groupData
.
setCurrentGroupExprData
(
this
,
map
,
true
);
}
}
data
=
map
.
get
(
key
);
data
=
map
.
get
(
key
);
if
(
data
==
null
)
{
if
(
data
==
null
)
{
...
@@ -278,13 +276,13 @@ public class JavaAggregate extends AbstractAggregate {
...
@@ -278,13 +276,13 @@ public class JavaAggregate extends AbstractAggregate {
map
.
put
(
key
,
data
);
map
.
put
(
key
,
data
);
}
}
}
else
{
}
else
{
data
=
(
Aggregate
)
groupData
.
getCurrentGroupExprData
(
this
);
data
=
(
Aggregate
)
groupData
.
getCurrentGroupExprData
(
this
,
over
!=
null
);
if
(
data
==
null
)
{
if
(
data
==
null
)
{
if
(
ifExists
)
{
if
(
ifExists
)
{
return
null
;
return
null
;
}
}
data
=
getInstance
();
data
=
getInstance
();
groupData
.
setCurrentGroupExprData
(
this
,
data
);
groupData
.
setCurrentGroupExprData
(
this
,
data
,
over
!=
null
);
}
}
}
}
return
data
;
return
data
;
...
@@ -295,14 +293,14 @@ public class JavaAggregate extends AbstractAggregate {
...
@@ -295,14 +293,14 @@ public class JavaAggregate extends AbstractAggregate {
ValueArray
key
;
ValueArray
key
;
if
(
over
!=
null
&&
(
key
=
over
.
getCurrentKey
(
session
))
!=
null
)
{
if
(
over
!=
null
&&
(
key
=
over
.
getCurrentKey
(
session
))
!=
null
)
{
@SuppressWarnings
(
"unchecked"
)
@SuppressWarnings
(
"unchecked"
)
ValueHashMap
<
AggregateDataCollecting
>
map
=
ValueHashMap
<
AggregateDataCollecting
>
map
=
(
ValueHashMap
<
AggregateDataCollecting
>)
groupData
(
ValueHashMap
<
AggregateDataCollecting
>)
groupData
.
getCurrentGroupExprData
(
this
);
.
getCurrentGroupExprData
(
this
,
true
);
if
(
map
==
null
)
{
if
(
map
==
null
)
{
if
(
ifExists
)
{
if
(
ifExists
)
{
return
null
;
return
null
;
}
}
map
=
new
ValueHashMap
<>();
map
=
new
ValueHashMap
<>();
groupData
.
setCurrentGroupExprData
(
this
,
map
);
groupData
.
setCurrentGroupExprData
(
this
,
map
,
true
);
}
}
data
=
map
.
get
(
key
);
data
=
map
.
get
(
key
);
if
(
data
==
null
)
{
if
(
data
==
null
)
{
...
@@ -313,13 +311,13 @@ public class JavaAggregate extends AbstractAggregate {
...
@@ -313,13 +311,13 @@ public class JavaAggregate extends AbstractAggregate {
map
.
put
(
key
,
data
);
map
.
put
(
key
,
data
);
}
}
}
else
{
}
else
{
data
=
(
AggregateDataCollecting
)
groupData
.
getCurrentGroupExprData
(
this
);
data
=
(
AggregateDataCollecting
)
groupData
.
getCurrentGroupExprData
(
this
,
over
!=
null
);
if
(
data
==
null
)
{
if
(
data
==
null
)
{
if
(
ifExists
)
{
if
(
ifExists
)
{
return
null
;
return
null
;
}
}
data
=
new
AggregateDataCollecting
();
data
=
new
AggregateDataCollecting
();
groupData
.
setCurrentGroupExprData
(
this
,
data
);
groupData
.
setCurrentGroupExprData
(
this
,
data
,
over
!=
null
);
}
}
}
}
return
data
;
return
data
;
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/expression/aggregate/Window.java
浏览文件 @
8949f340
...
@@ -10,6 +10,7 @@ import java.util.ArrayList;
...
@@ -10,6 +10,7 @@ import java.util.ArrayList;
import
org.h2.engine.Session
;
import
org.h2.engine.Session
;
import
org.h2.expression.Expression
;
import
org.h2.expression.Expression
;
import
org.h2.table.ColumnResolver
;
import
org.h2.table.ColumnResolver
;
import
org.h2.table.TableFilter
;
import
org.h2.util.StringUtils
;
import
org.h2.util.StringUtils
;
import
org.h2.value.Value
;
import
org.h2.value.Value
;
import
org.h2.value.ValueArray
;
import
org.h2.value.ValueArray
;
...
@@ -38,6 +39,7 @@ public final class Window {
...
@@ -38,6 +39,7 @@ 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)
*/
*/
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
)
{
public
void
mapColumns
(
ColumnResolver
resolver
,
int
level
)
{
if
(
partitionBy
!=
null
)
{
if
(
partitionBy
!=
null
)
{
...
@@ -47,6 +49,24 @@ public final class Window {
...
@@ -47,6 +49,24 @@ public final class Window {
}
}
}
}
/**
* Tell the expression columns whether the table filter can return values
* now. This is used when optimizing the query.
*
* @param tableFilter
* the table filter
* @param value
* true if the table filter can return value
* @see Expression#setEvaluatable(TableFilter, boolean)
*/
public
void
setEvaluatable
(
TableFilter
tableFilter
,
boolean
value
)
{
if
(
partitionBy
!=
null
)
{
for
(
Expression
e
:
partitionBy
)
{
e
.
setEvaluatable
(
tableFilter
,
value
);
}
}
}
/**
/**
* Returns the key for the current group.
* Returns the key for the current group.
*
*
...
@@ -72,6 +92,7 @@ public final class Window {
...
@@ -72,6 +92,7 @@ public final class Window {
* Returns SQL representation.
* Returns SQL representation.
*
*
* @return SQL representation.
* @return SQL representation.
* @see Expression#getSQL()
*/
*/
public
String
getSQL
()
{
public
String
getSQL
()
{
if
(
partitionBy
==
null
)
{
if
(
partitionBy
==
null
)
{
...
@@ -87,6 +108,22 @@ public final class Window {
...
@@ -87,6 +108,22 @@ public final class Window {
return
builder
.
append
(
')'
).
toString
();
return
builder
.
append
(
')'
).
toString
();
}
}
/**
* Update an aggregate value.
*
* @param session
* the session
* @param window true for window processing stage, false for group stage
* @see Expression#updateAggregate(Session, boolean)
*/
public
void
updateAggregate
(
Session
session
,
boolean
window
)
{
if
(
partitionBy
!=
null
)
{
for
(
Expression
expr
:
partitionBy
)
{
expr
.
updateAggregate
(
session
,
window
);
}
}
}
@Override
@Override
public
String
toString
()
{
public
String
toString
()
{
return
getSQL
();
return
getSQL
();
...
...
This diff is collapsed.
Click to expand it.
h2/src/test/org/h2/test/scripts/functions/aggregate/array-agg.sql
浏览文件 @
8949f340
...
@@ -107,6 +107,17 @@ SELECT ARRAY_AGG(ID) OVER (PARTITION BY NAME), NAME FROM TEST;
...
@@ -107,6 +107,17 @@ SELECT ARRAY_AGG(ID) OVER (PARTITION BY NAME), NAME FROM TEST;
>
(
4
,
5
,
6
)
c
>
(
4
,
5
,
6
)
c
>
rows
:
6
>
rows
:
6
SELECT
ARRAY_AGG
(
ID
)
FILTER
(
WHERE
ID
<
3
OR
ID
>
4
)
OVER
(
PARTITION
BY
NAME
),
NAME
FROM
TEST
ORDER
BY
NAME
;
>
ARRAY_AGG
(
ID
)
FILTER
(
WHERE
((
ID
<
3
)
OR
(
ID
>
4
)))
OVER
(
PARTITION
BY
NAME
)
NAME
>
---------------------------------------------------------------------------- ----
>
(
1
,
2
)
a
>
(
1
,
2
)
a
>
null
b
>
(
5
,
6
)
c
>
(
5
,
6
)
c
>
(
5
,
6
)
c
>
rows
(
ordered
):
6
SELECT
ARRAY_AGG
(
SUM
(
ID
))
OVER
()
FROM
TEST
;
SELECT
ARRAY_AGG
(
SUM
(
ID
))
OVER
()
FROM
TEST
;
>
exception
FEATURE_NOT_SUPPORTED_1
>
exception
FEATURE_NOT_SUPPORTED_1
...
...
This diff is collapsed.
Click to expand it.
h2/src/test/org/h2/test/scripts/functions/aggregate/count.sql
浏览文件 @
8949f340
...
@@ -8,8 +8,8 @@
...
@@ -8,8 +8,8 @@
create
table
test
(
v
int
);
create
table
test
(
v
int
);
>
ok
>
ok
insert
into
test
values
(
1
),
(
2
),
(
3
),
(
4
),
(
5
),
(
6
),
(
7
),
(
8
),
(
9
),
(
10
),
(
11
),
(
12
);
insert
into
test
values
(
1
),
(
2
),
(
3
),
(
4
),
(
5
),
(
6
),
(
7
),
(
8
),
(
9
),
(
10
),
(
11
),
(
12
)
,
(
null
)
;
>
update
count
:
1
2
>
update
count
:
1
3
select
count
(
v
),
count
(
v
)
filter
(
where
v
>=
4
)
from
test
where
v
<=
10
;
select
count
(
v
),
count
(
v
)
filter
(
where
v
>=
4
)
from
test
where
v
<=
10
;
>
COUNT
(
V
)
COUNT
(
V
)
FILTER
(
WHERE
(
V
>=
4
))
>
COUNT
(
V
)
COUNT
(
V
)
FILTER
(
WHERE
(
V
>=
4
))
...
@@ -17,6 +17,19 @@ select count(v), count(v) filter (where v >= 4) from test where v <= 10;
...
@@ -17,6 +17,19 @@ select count(v), count(v) filter (where v >= 4) from test where v <= 10;
>
10
7
>
10
7
>
rows
:
1
>
rows
:
1
select
count
(
*
),
count
(
*
)
filter
(
where
v
>=
4
)
from
test
;
>
COUNT
(
*
)
COUNT
(
*
)
FILTER
(
WHERE
(
V
>=
4
))
>
-------- --------------------------------
>
13
9
>
rows
:
1
select
count
(
*
),
count
(
*
)
filter
(
where
v
>=
4
)
from
test
where
v
<=
10
;
>
COUNT
(
*
)
COUNT
(
*
)
FILTER
(
WHERE
(
V
>=
4
))
>
-------- --------------------------------
>
10
7
>
rows
:
1
create
index
test_idx
on
test
(
v
);
create
index
test_idx
on
test
(
v
);
>
ok
>
ok
...
...
This diff is collapsed.
Click to expand it.
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论