Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
为 GitLab 提交贡献
登录/注册
切换导航
H
h2database
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
Administrator
h2database
Commits
8304d409
提交
8304d409
authored
6 年前
作者:
Evgenij Ryazanov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Optimize IN(UNNEST(array)) with constant array
上级
ca80a773
隐藏空白字符变更
内嵌
并排
正在显示
4 个修改的文件
包含
44 行增加
和
5 行删除
+44
-5
ExpressionList.java
h2/src/main/org/h2/expression/ExpressionList.java
+10
-0
ConditionIn.java
h2/src/main/org/h2/expression/condition/ConditionIn.java
+22
-3
TableFunction.java
h2/src/main/org/h2/expression/function/TableFunction.java
+10
-0
unnest.sql
h2/src/test/org/h2/test/scripts/functions/system/unnest.sql
+2
-2
没有找到文件。
h2/src/main/org/h2/expression/ExpressionList.java
浏览文件 @
8304d409
...
...
@@ -132,6 +132,16 @@ public class ExpressionList extends Expression {
return
expr
;
}
@Override
public
boolean
isConstant
()
{
for
(
Expression
e
:
list
)
{
if
(!
e
.
isConstant
())
{
return
false
;
}
}
return
true
;
}
@Override
public
int
getSubexpressionCount
()
{
return
list
.
length
;
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/expression/condition/ConditionIn.java
浏览文件 @
8304d409
...
...
@@ -16,6 +16,7 @@ import org.h2.expression.ValueExpression;
import
org.h2.expression.function.Function
;
import
org.h2.expression.function.TableFunction
;
import
org.h2.index.IndexCondition
;
import
org.h2.result.ResultInterface
;
import
org.h2.table.ColumnResolver
;
import
org.h2.table.TableFilter
;
import
org.h2.value.Value
;
...
...
@@ -109,6 +110,19 @@ public class ConditionIn extends Condition {
}
}
}
if
(
tf
.
isConstant
())
{
boolean
allValuesNull
=
true
;
ResultInterface
ri
=
right
.
getValue
(
session
).
getResult
();
ArrayList
<
Expression
>
list
=
new
ArrayList
<>(
ri
.
getRowCount
());
while
(
ri
.
next
())
{
Value
v
=
ri
.
currentRow
()[
0
];
if
(
v
!=
ValueNull
.
INSTANCE
)
{
allValuesNull
=
false
;
}
list
.
add
(
ValueExpression
.
get
(
v
));
}
return
optimize2
(
session
,
constant
,
true
,
allValuesNull
,
list
);
}
return
this
;
}
}
...
...
@@ -129,11 +143,16 @@ public class ConditionIn extends Condition {
}
valueList
.
set
(
i
,
e
);
}
return
optimize2
(
session
,
constant
,
allValuesConstant
,
allValuesNull
,
valueList
);
}
private
Expression
optimize2
(
Session
session
,
boolean
constant
,
boolean
allValuesConstant
,
boolean
allValuesNull
,
ArrayList
<
Expression
>
values
)
{
if
(
constant
&&
allValuesConstant
)
{
return
ValueExpression
.
get
(
getValue
(
session
));
}
if
(
size
==
1
)
{
return
new
Comparison
(
session
,
Comparison
.
EQUAL
,
left
,
value
List
.
get
(
0
)).
optimize
(
session
);
if
(
values
.
size
()
==
1
)
{
return
new
Comparison
(
session
,
Comparison
.
EQUAL
,
left
,
value
s
.
get
(
0
)).
optimize
(
session
);
}
if
(
allValuesConstant
&&
!
allValuesNull
)
{
int
leftType
=
left
.
getType
();
...
...
@@ -143,7 +162,7 @@ public class ConditionIn extends Condition {
if
(
leftType
==
Value
.
ENUM
&&
!(
left
instanceof
ExpressionColumn
))
{
return
this
;
}
Expression
expr
=
new
ConditionInConstantSet
(
session
,
left
,
value
List
);
Expression
expr
=
new
ConditionInConstantSet
(
session
,
left
,
value
s
);
expr
=
expr
.
optimize
(
session
);
return
expr
;
}
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/expression/function/TableFunction.java
浏览文件 @
8304d409
...
...
@@ -146,4 +146,14 @@ public class TableFunction extends Function {
return
getExpressionColumns
(
session
,
getValueForColumnList
(
session
,
null
).
getResult
());
}
@Override
public
boolean
isConstant
()
{
for
(
Expression
e
:
args
)
{
if
(!
e
.
isConstant
())
{
return
false
;
}
}
return
true
;
}
}
This diff is collapsed.
Click to expand it.
h2/src/test/org/h2/test/scripts/functions/system/unnest.sql
浏览文件 @
8304d409
...
...
@@ -48,8 +48,8 @@ SELECT 4 IN(UNNEST(ARRAY[1, 2, 3]));
>>
FALSE
SELECT
X
,
X
IN
(
UNNEST
(
ARRAY
[
2
,
4
]))
FROM
SYSTEM_RANGE
(
1
,
5
);
>
X
X
IN
(
UNNEST
((
2
,
4
))
)
>
-
----------
----------
>
X
X
IN
(
2
,
4
)
>
-
----------
>
1
FALSE
>
2
TRUE
>
3
FALSE
...
...
This diff is collapsed.
Click to expand it.
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论