Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
为 GitLab 提交贡献
登录/注册
切换导航
H
h2database
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
Administrator
h2database
Commits
0d4c16fe
提交
0d4c16fe
authored
7 年前
作者:
Evgenij Ryazanov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Merge order by lists for ARRAY_AGG and GROUP_CONCAT
上级
24e0ae0c
master
version-1.4.198
无相关合并请求
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
35 行增加
和
69 行删除
+35
-69
Parser.java
h2/src/main/org/h2/command/Parser.java
+3
-3
Aggregate.java
h2/src/main/org/h2/expression/Aggregate.java
+32
-66
没有找到文件。
h2/src/main/org/h2/command/Parser.java
浏览文件 @
0d4c16fe
...
@@ -2628,7 +2628,7 @@ public class Parser {
...
@@ -2628,7 +2628,7 @@ public class Parser {
readExpression
(),
currentSelect
,
distinct
);
readExpression
(),
currentSelect
,
distinct
);
if
(
readIf
(
"ORDER"
))
{
if
(
readIf
(
"ORDER"
))
{
read
(
"BY"
);
read
(
"BY"
);
r
.
set
GroupConcatOrder
(
parseSimpleOrderList
());
r
.
set
OrderByList
(
parseSimpleOrderList
());
}
}
if
(
readIf
(
"SEPARATOR"
))
{
if
(
readIf
(
"SEPARATOR"
))
{
...
@@ -2642,7 +2642,7 @@ public class Parser {
...
@@ -2642,7 +2642,7 @@ public class Parser {
r
.
setGroupConcatSeparator
(
readExpression
());
r
.
setGroupConcatSeparator
(
readExpression
());
if
(
readIf
(
"ORDER"
))
{
if
(
readIf
(
"ORDER"
))
{
read
(
"BY"
);
read
(
"BY"
);
r
.
set
GroupConcatOrder
(
parseSimpleOrderList
());
r
.
set
OrderByList
(
parseSimpleOrderList
());
}
}
}
else
{
}
else
{
r
=
null
;
r
=
null
;
...
@@ -2654,7 +2654,7 @@ public class Parser {
...
@@ -2654,7 +2654,7 @@ public class Parser {
readExpression
(),
currentSelect
,
distinct
);
readExpression
(),
currentSelect
,
distinct
);
if
(
readIf
(
"ORDER"
))
{
if
(
readIf
(
"ORDER"
))
{
read
(
"BY"
);
read
(
"BY"
);
r
.
set
ArrayAggOrder
(
parseSimpleOrderList
());
r
.
set
OrderByList
(
parseSimpleOrderList
());
}
}
}
else
{
}
else
{
boolean
distinct
=
readIf
(
"DISTINCT"
);
boolean
distinct
=
readIf
(
"DISTINCT"
);
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/expression/Aggregate.java
浏览文件 @
0d4c16fe
...
@@ -143,10 +143,8 @@ public class Aggregate extends Expression {
...
@@ -143,10 +143,8 @@ public class Aggregate extends Expression {
private
Expression
on
;
private
Expression
on
;
private
Expression
groupConcatSeparator
;
private
Expression
groupConcatSeparator
;
private
ArrayList
<
SelectOrderBy
>
groupConcatOrderList
;
private
ArrayList
<
SelectOrderBy
>
orderByList
;
private
ArrayList
<
SelectOrderBy
>
arrayAggOrderList
;
private
SortOrder
orderBySort
;
private
SortOrder
groupConcatSort
;
private
SortOrder
arrayOrderSort
;
private
int
dataType
,
scale
;
private
int
dataType
,
scale
;
private
long
precision
;
private
long
precision
;
private
int
displaySize
;
private
int
displaySize
;
...
@@ -220,21 +218,12 @@ public class Aggregate extends Expression {
...
@@ -220,21 +218,12 @@ public class Aggregate extends Expression {
}
}
/**
/**
* Set the order for GROUP_CONCAT() aggregate.
* Set the order for
ARRAY_AGG() or
GROUP_CONCAT() aggregate.
*
*
* @param orderBy the order by list
* @param orderBy
List
the order by list
*/
*/
public
void
setGroupConcatOrder
(
ArrayList
<
SelectOrderBy
>
orderBy
)
{
public
void
setOrderByList
(
ArrayList
<
SelectOrderBy
>
orderByList
)
{
this
.
groupConcatOrderList
=
orderBy
;
this
.
orderByList
=
orderByList
;
}
/**
* Set the order for ARRAY_AGG() aggregate.
*
* @param orderBy the order by list
*/
public
void
setArrayAggOrder
(
ArrayList
<
SelectOrderBy
>
orderBy
)
{
this
.
arrayAggOrderList
=
orderBy
;
}
}
/**
/**
...
@@ -255,12 +244,12 @@ public class Aggregate extends Expression {
...
@@ -255,12 +244,12 @@ public class Aggregate extends Expression {
this
.
filterCondition
=
filterCondition
;
this
.
filterCondition
=
filterCondition
;
}
}
private
SortOrder
initOrder
(
ArrayList
<
SelectOrderBy
>
orderList
,
Session
session
)
{
private
SortOrder
initOrder
(
Session
session
)
{
int
size
=
orderList
.
size
();
int
size
=
order
By
List
.
size
();
int
[]
index
=
new
int
[
size
];
int
[]
index
=
new
int
[
size
];
int
[]
sortType
=
new
int
[
size
];
int
[]
sortType
=
new
int
[
size
];
for
(
int
i
=
0
;
i
<
size
;
i
++)
{
for
(
int
i
=
0
;
i
<
size
;
i
++)
{
SelectOrderBy
o
=
orderList
.
get
(
i
);
SelectOrderBy
o
=
order
By
List
.
get
(
i
);
index
[
i
]
=
i
+
1
;
index
[
i
]
=
i
+
1
;
int
order
=
o
.
descending
?
SortOrder
.
DESCENDING
:
SortOrder
.
ASCENDING
;
int
order
=
o
.
descending
?
SortOrder
.
DESCENDING
:
SortOrder
.
ASCENDING
;
sortType
[
i
]
=
order
;
sortType
[
i
]
=
order
;
...
@@ -296,12 +285,12 @@ public class Aggregate extends Expression {
...
@@ -296,12 +285,12 @@ public class Aggregate extends Expression {
if
(
type
==
AggregateType
.
GROUP_CONCAT
)
{
if
(
type
==
AggregateType
.
GROUP_CONCAT
)
{
if
(
v
!=
ValueNull
.
INSTANCE
)
{
if
(
v
!=
ValueNull
.
INSTANCE
)
{
v
=
v
.
convertTo
(
Value
.
STRING
);
v
=
v
.
convertTo
(
Value
.
STRING
);
if
(
groupConcatOrder
List
!=
null
)
{
if
(
orderBy
List
!=
null
)
{
int
size
=
groupConcatOrder
List
.
size
();
int
size
=
orderBy
List
.
size
();
Value
[]
array
=
new
Value
[
1
+
size
];
Value
[]
array
=
new
Value
[
1
+
size
];
array
[
0
]
=
v
;
array
[
0
]
=
v
;
for
(
int
i
=
0
;
i
<
size
;
i
++)
{
for
(
int
i
=
0
;
i
<
size
;
i
++)
{
SelectOrderBy
o
=
groupConcatOrder
List
.
get
(
i
);
SelectOrderBy
o
=
orderBy
List
.
get
(
i
);
array
[
i
+
1
]
=
o
.
expression
.
getValue
(
session
);
array
[
i
+
1
]
=
o
.
expression
.
getValue
(
session
);
}
}
v
=
ValueArray
.
get
(
array
);
v
=
ValueArray
.
get
(
array
);
...
@@ -310,12 +299,12 @@ public class Aggregate extends Expression {
...
@@ -310,12 +299,12 @@ public class Aggregate extends Expression {
}
}
if
(
type
==
AggregateType
.
ARRAY_AGG
)
{
if
(
type
==
AggregateType
.
ARRAY_AGG
)
{
if
(
v
!=
ValueNull
.
INSTANCE
)
{
if
(
v
!=
ValueNull
.
INSTANCE
)
{
if
(
arrayAggOrder
List
!=
null
)
{
if
(
orderBy
List
!=
null
)
{
int
size
=
arrayAggOrder
List
.
size
();
int
size
=
orderBy
List
.
size
();
Value
[]
array
=
new
Value
[
1
+
size
];
Value
[]
array
=
new
Value
[
1
+
size
];
array
[
0
]
=
v
;
array
[
0
]
=
v
;
for
(
int
i
=
0
;
i
<
size
;
i
++)
{
for
(
int
i
=
0
;
i
<
size
;
i
++)
{
SelectOrderBy
o
=
arrayAggOrder
List
.
get
(
i
);
SelectOrderBy
o
=
orderBy
List
.
get
(
i
);
array
[
i
+
1
]
=
o
.
expression
.
getValue
(
session
);
array
[
i
+
1
]
=
o
.
expression
.
getValue
(
session
);
}
}
v
=
ValueArray
.
get
(
array
);
v
=
ValueArray
.
get
(
array
);
...
@@ -377,8 +366,8 @@ public class Aggregate extends Expression {
...
@@ -377,8 +366,8 @@ public class Aggregate extends Expression {
if
(
list
==
null
||
list
.
isEmpty
())
{
if
(
list
==
null
||
list
.
isEmpty
())
{
return
ValueNull
.
INSTANCE
;
return
ValueNull
.
INSTANCE
;
}
}
if
(
groupConcatOrder
List
!=
null
)
{
if
(
orderBy
List
!=
null
)
{
final
SortOrder
sortOrder
=
groupConcat
Sort
;
final
SortOrder
sortOrder
=
orderBy
Sort
;
Collections
.
sort
(
list
,
new
Comparator
<
Value
>()
{
Collections
.
sort
(
list
,
new
Comparator
<
Value
>()
{
@Override
@Override
public
int
compare
(
Value
v1
,
Value
v2
)
{
public
int
compare
(
Value
v1
,
Value
v2
)
{
...
@@ -412,8 +401,8 @@ public class Aggregate extends Expression {
...
@@ -412,8 +401,8 @@ public class Aggregate extends Expression {
if
(
list
==
null
||
list
.
isEmpty
())
{
if
(
list
==
null
||
list
.
isEmpty
())
{
return
ValueNull
.
INSTANCE
;
return
ValueNull
.
INSTANCE
;
}
}
if
(
arrayAggOrder
List
!=
null
)
{
if
(
orderBy
List
!=
null
)
{
final
SortOrder
sortOrder
=
arrayOrder
Sort
;
final
SortOrder
sortOrder
=
orderBy
Sort
;
Collections
.
sort
(
list
,
new
Comparator
<
Value
>()
{
Collections
.
sort
(
list
,
new
Comparator
<
Value
>()
{
@Override
@Override
public
int
compare
(
Value
v1
,
Value
v2
)
{
public
int
compare
(
Value
v1
,
Value
v2
)
{
...
@@ -438,13 +427,8 @@ public class Aggregate extends Expression {
...
@@ -438,13 +427,8 @@ public class Aggregate extends Expression {
if
(
on
!=
null
)
{
if
(
on
!=
null
)
{
on
.
mapColumns
(
resolver
,
level
);
on
.
mapColumns
(
resolver
,
level
);
}
}
if
(
groupConcatOrderList
!=
null
)
{
if
(
orderByList
!=
null
)
{
for
(
SelectOrderBy
o
:
groupConcatOrderList
)
{
for
(
SelectOrderBy
o
:
orderByList
)
{
o
.
expression
.
mapColumns
(
resolver
,
level
);
}
}
if
(
arrayAggOrderList
!=
null
)
{
for
(
SelectOrderBy
o
:
arrayAggOrderList
)
{
o
.
expression
.
mapColumns
(
resolver
,
level
);
o
.
expression
.
mapColumns
(
resolver
,
level
);
}
}
}
}
...
@@ -465,17 +449,11 @@ public class Aggregate extends Expression {
...
@@ -465,17 +449,11 @@ public class Aggregate extends Expression {
precision
=
on
.
getPrecision
();
precision
=
on
.
getPrecision
();
displaySize
=
on
.
getDisplaySize
();
displaySize
=
on
.
getDisplaySize
();
}
}
if
(
groupConcatOrder
List
!=
null
)
{
if
(
orderBy
List
!=
null
)
{
for
(
SelectOrderBy
o
:
groupConcatOrder
List
)
{
for
(
SelectOrderBy
o
:
orderBy
List
)
{
o
.
expression
=
o
.
expression
.
optimize
(
session
);
o
.
expression
=
o
.
expression
.
optimize
(
session
);
}
}
groupConcatSort
=
initOrder
(
groupConcatOrderList
,
session
);
orderBySort
=
initOrder
(
session
);
}
if
(
arrayAggOrderList
!=
null
)
{
for
(
SelectOrderBy
o
:
arrayAggOrderList
)
{
o
.
expression
=
o
.
expression
.
optimize
(
session
);
}
arrayOrderSort
=
initOrder
(
arrayAggOrderList
,
session
);
}
}
if
(
groupConcatSeparator
!=
null
)
{
if
(
groupConcatSeparator
!=
null
)
{
groupConcatSeparator
=
groupConcatSeparator
.
optimize
(
session
);
groupConcatSeparator
=
groupConcatSeparator
.
optimize
(
session
);
...
@@ -564,13 +542,8 @@ public class Aggregate extends Expression {
...
@@ -564,13 +542,8 @@ public class Aggregate extends Expression {
if
(
on
!=
null
)
{
if
(
on
!=
null
)
{
on
.
setEvaluatable
(
tableFilter
,
b
);
on
.
setEvaluatable
(
tableFilter
,
b
);
}
}
if
(
groupConcatOrderList
!=
null
)
{
if
(
orderByList
!=
null
)
{
for
(
SelectOrderBy
o
:
groupConcatOrderList
)
{
for
(
SelectOrderBy
o
:
orderByList
)
{
o
.
expression
.
setEvaluatable
(
tableFilter
,
b
);
}
}
if
(
arrayAggOrderList
!=
null
)
{
for
(
SelectOrderBy
o
:
arrayAggOrderList
)
{
o
.
expression
.
setEvaluatable
(
tableFilter
,
b
);
o
.
expression
.
setEvaluatable
(
tableFilter
,
b
);
}
}
}
}
...
@@ -603,9 +576,9 @@ public class Aggregate extends Expression {
...
@@ -603,9 +576,9 @@ public class Aggregate extends Expression {
buff
.
append
(
"DISTINCT "
);
buff
.
append
(
"DISTINCT "
);
}
}
buff
.
append
(
on
.
getSQL
());
buff
.
append
(
on
.
getSQL
());
if
(
groupConcatOrder
List
!=
null
)
{
if
(
orderBy
List
!=
null
)
{
buff
.
append
(
" ORDER BY "
);
buff
.
append
(
" ORDER BY "
);
for
(
SelectOrderBy
o
:
groupConcatOrder
List
)
{
for
(
SelectOrderBy
o
:
orderBy
List
)
{
buff
.
appendExceptFirst
(
", "
);
buff
.
appendExceptFirst
(
", "
);
buff
.
append
(
o
.
expression
.
getSQL
());
buff
.
append
(
o
.
expression
.
getSQL
());
if
(
o
.
descending
)
{
if
(
o
.
descending
)
{
...
@@ -629,9 +602,9 @@ public class Aggregate extends Expression {
...
@@ -629,9 +602,9 @@ public class Aggregate extends Expression {
buff
.
append
(
"DISTINCT "
);
buff
.
append
(
"DISTINCT "
);
}
}
buff
.
append
(
on
.
getSQL
());
buff
.
append
(
on
.
getSQL
());
if
(
arrayAggOrder
List
!=
null
)
{
if
(
orderBy
List
!=
null
)
{
buff
.
append
(
" ORDER BY "
);
buff
.
append
(
" ORDER BY "
);
for
(
SelectOrderBy
o
:
arrayAggOrder
List
)
{
for
(
SelectOrderBy
o
:
orderBy
List
)
{
buff
.
appendExceptFirst
(
", "
);
buff
.
appendExceptFirst
(
", "
);
buff
.
append
(
o
.
expression
.
getSQL
());
buff
.
append
(
o
.
expression
.
getSQL
());
if
(
o
.
descending
)
{
if
(
o
.
descending
)
{
...
@@ -765,15 +738,8 @@ public class Aggregate extends Expression {
...
@@ -765,15 +738,8 @@ public class Aggregate extends Expression {
!
groupConcatSeparator
.
isEverything
(
visitor
))
{
!
groupConcatSeparator
.
isEverything
(
visitor
))
{
return
false
;
return
false
;
}
}
if
(
groupConcatOrderList
!=
null
)
{
if
(
orderByList
!=
null
)
{
for
(
SelectOrderBy
o
:
groupConcatOrderList
)
{
for
(
SelectOrderBy
o
:
orderByList
)
{
if
(!
o
.
expression
.
isEverything
(
visitor
))
{
return
false
;
}
}
}
if
(
arrayAggOrderList
!=
null
)
{
for
(
SelectOrderBy
o
:
arrayAggOrderList
)
{
if
(!
o
.
expression
.
isEverything
(
visitor
))
{
if
(!
o
.
expression
.
isEverything
(
visitor
))
{
return
false
;
return
false
;
}
}
...
...
This diff is collapsed.
Click to expand it.
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论