Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
为 GitLab 提交贡献
登录/注册
切换导航
H
h2database
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
Administrator
h2database
Commits
3d365e4c
Unverified
提交
3d365e4c
authored
11月 22, 2018
作者:
Evgenij Ryazanov
提交者:
GitHub
11月 22, 2018
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #1567 from katzyn/any
Add ANY, UNNEST, and fix SOME parsing
上级
f33de19b
2798f095
隐藏空白字符变更
内嵌
并排
正在显示
48 个修改的文件
包含
480 行增加
和
158 行删除
+480
-158
help.csv
h2/src/docsrc/help/help.csv
+19
-7
changelog.html
h2/src/docsrc/html/changelog.html
+12
-0
features.html
h2/src/docsrc/html/features.html
+4
-3
performance.html
h2/src/docsrc/html/performance.html
+1
-1
Parser.java
h2/src/main/org/h2/command/Parser.java
+26
-9
Insert.java
h2/src/main/org/h2/command/dml/Insert.java
+2
-2
MergeUsing.java
h2/src/main/org/h2/command/dml/MergeUsing.java
+1
-1
Select.java
h2/src/main/org/h2/command/dml/Select.java
+2
-2
Mode.java
h2/src/main/org/h2/engine/Mode.java
+7
-0
ExpressionColumn.java
h2/src/main/org/h2/expression/ExpressionColumn.java
+1
-0
ExpressionList.java
h2/src/main/org/h2/expression/ExpressionList.java
+10
-0
ExpressionVisitor.java
h2/src/main/org/h2/expression/ExpressionVisitor.java
+1
-1
Parameter.java
h2/src/main/org/h2/expression/Parameter.java
+1
-0
ValueExpression.java
h2/src/main/org/h2/expression/ValueExpression.java
+1
-0
Aggregate.java
h2/src/main/org/h2/expression/aggregate/Aggregate.java
+17
-16
AggregateData.java
h2/src/main/org/h2/expression/aggregate/AggregateData.java
+2
-2
AggregateDataDefault.java
...ain/org/h2/expression/aggregate/AggregateDataDefault.java
+4
-4
CompareLike.java
h2/src/main/org/h2/expression/condition/CompareLike.java
+5
-1
Comparison.java
h2/src/main/org/h2/expression/condition/Comparison.java
+6
-1
Condition.java
h2/src/main/org/h2/expression/condition/Condition.java
+2
-1
ConditionAndOr.java
h2/src/main/org/h2/expression/condition/ConditionAndOr.java
+4
-1
ConditionExists.java
h2/src/main/org/h2/expression/condition/ConditionExists.java
+3
-1
ConditionIn.java
h2/src/main/org/h2/expression/condition/ConditionIn.java
+56
-9
ConditionInConstantSet.java
...n/org/h2/expression/condition/ConditionInConstantSet.java
+4
-1
ConditionInParameter.java
...ain/org/h2/expression/condition/ConditionInParameter.java
+48
-31
ConditionInSelect.java
...c/main/org/h2/expression/condition/ConditionInSelect.java
+4
-1
ConditionNot.java
h2/src/main/org/h2/expression/condition/ConditionNot.java
+4
-1
package.html
h2/src/main/org/h2/expression/condition/package.html
+14
-0
Function.java
h2/src/main/org/h2/expression/function/Function.java
+6
-5
TableFunction.java
h2/src/main/org/h2/expression/function/TableFunction.java
+49
-28
package.html
h2/src/main/org/h2/expression/package.html
+1
-1
FullText.java
h2/src/main/org/h2/fulltext/FullText.java
+2
-2
IndexCondition.java
h2/src/main/org/h2/index/IndexCondition.java
+1
-1
IndexCursor.java
h2/src/main/org/h2/index/IndexCursor.java
+1
-1
ViewIndex.java
h2/src/main/org/h2/index/ViewIndex.java
+1
-1
Page.java
h2/src/main/org/h2/mvstore/Page.java
+1
-1
Column.java
h2/src/main/org/h2/table/Column.java
+1
-1
TableFilter.java
h2/src/main/org/h2/table/TableFilter.java
+2
-2
TestPreparedStatement.java
h2/src/test/org/h2/test/jdbc/TestPreparedStatement.java
+7
-0
TestScript.java
h2/src/test/org/h2/test/scripts/TestScript.java
+3
-3
any.sql
h2/src/test/org/h2/test/scripts/functions/aggregate/any.sql
+21
-0
bool-and.sql
...test/org/h2/test/scripts/functions/aggregate/bool-and.sql
+0
-4
bool-or.sql
.../test/org/h2/test/scripts/functions/aggregate/bool-or.sql
+0
-4
every.sql
...rc/test/org/h2/test/scripts/functions/aggregate/every.sql
+21
-0
unnest.sql
h2/src/test/org/h2/test/scripts/functions/system/unnest.sql
+88
-0
testScript.sql
h2/src/test/org/h2/test/scripts/testScript.sql
+12
-6
TestPattern.java
h2/src/test/org/h2/test/unit/TestPattern.java
+1
-1
dictionary.txt
h2/src/tools/org/h2/build/doc/dictionary.txt
+1
-1
没有找到文件。
h2/src/docsrc/help/help.csv
浏览文件 @
3d365e4c
...
...
@@ -2152,7 +2152,7 @@ ID<>2
"
"Other Grammar","Condition Right Hand Side","
compare { {
{ ALL | ANY | SOME }
( select ) } | operand }
compare { {
ALL
( select ) } | operand }
| IS [ NOT ] NULL
| IS [ NOT ] [ DISTINCT FROM ] operand
| BETWEEN operand AND operand
...
...
@@ -3444,26 +3444,26 @@ Aggregates are only allowed in select statements.
BIT_OR(ID)
"
"Functions (Aggregate)","
BOOL_AND
","
BOOL_AND
(boolean)
"Functions (Aggregate)","
EVERY
","
{EVERY|BOOL_AND}
(boolean)
[FILTER (WHERE expression)] [OVER windowNameOrSpecification]
","
Returns true if all expressions are true.
If no rows are selected, the result is NULL.
Aggregates are only allowed in select statements.
","
BOOL_AND
(ID>10)
EVERY
(ID>10)
"
"Functions (Aggregate)","
BOOL_OR
","
BOOL_OR
(boolean)
"Functions (Aggregate)","
ANY
","
{ANY|SOME|BOOL_OR}
(boolean)
[FILTER (WHERE expression)] [OVER windowNameOrSpecification]
","
Returns true if any expression is true.
If no rows are selected, the result is NULL.
Aggregates are only allowed in select statements.
","
BOOL_OR
(NAME LIKE 'W%')
ANY
(NAME LIKE 'W%')
"
"Functions (Aggregate)","COUNT","
...
...
@@ -5215,6 +5215,18 @@ The method returns a value with the same data type as the first parameter.
CALL TRUNCATE_VALUE(X, 10, TRUE);
"
"Functions (System)","UNNEST","
UNNEST(array, [,...]) [WITH ORDINALITY]
","
Returns the result set.
Number of columns is equal to number of arguments,
plus one additional column with row number if WITH ORDINALITY is specified.
Number of rows is equal to length of longest specified array.
If multiple arguments are specified and they have different length, cells with missing values will contain null values.
","
SELECT * FROM UNNEST(ARRAY['a', 'b', 'c']);
"
"Functions (System)","USER","
{ USER | CURRENT_USER } ()
","
...
...
h2/src/docsrc/html/changelog.html
浏览文件 @
3d365e4c
...
...
@@ -21,6 +21,18 @@ Change Log
<h2>
Next Version (unreleased)
</h2>
<ul>
<li>
Issue #1565: SOME / ANY conflict
</li>
<li>
PR #1564: Refactor Expression implementations
</li>
<li>
Issue #1561: Incorrect documentation and strange fallback value of SysProperties.FILE_ENCODING
</li>
<li>
Issue #1566: MVStore implements Closeable/AutoCloseable
</li>
<li>
Issue #1550: OutOfMemoryError during "shutdown defrag"
</li>
<li>
Issue #1440: OOM when executing "shutdown compact" in server mode
</li>
<li>
Issue #1561: Incorrect documentation and strange fallback value of SysProperties.FILE_ENCODING
</li>
<li>
PR #1557: increase lock timeout to TestConcurrentUpdate due to Travis failures
...
...
h2/src/docsrc/html/features.html
浏览文件 @
3d365e4c
...
...
@@ -952,13 +952,14 @@ or the SQL statement <code>SET MODE PostgreSQL</code>.
</li><li>
LOG(x) is base 10 in this mode.
</li><li>
REGEXP_REPLACE():
<ul>
<li>
Uses \ for back-references
</li>
<li>
Will not throw an exception when the
<code>
flagsString
</code>
parameter contains a 'g'
</li>
<li>
In the absence of the 'g' flag in the
<code>
flagsString
</code>
parameter, only the first-matched substring will be replaced
</li>
<li>
uses \ for back-references;
</li>
<li>
does not throw an exception when the
<code>
flagsString
</code>
parameter contains a 'g';
</li>
<li>
replaces only the first matched substring in the absence of the 'g' flag in the
<code>
flagsString
</code>
parameter.
</li>
</ul>
</li><li>
Fixed-width strings are padded with spaces.
</li><li>
MONEY data type is treated like NUMERIC(19, 2) data type.
</li><li>
Datetime value functions return the same value within a transaction.
</li><li>
ANY and SOME after comparison operators are parsed as array comparison operators.
</li></ul>
<h3>
Ignite Compatibility Mode
</h3>
...
...
h2/src/docsrc/html/performance.html
浏览文件 @
3d365e4c
...
...
@@ -490,7 +490,7 @@ Instead, use a prepared statement with arrays as in the following example:
</p>
<pre>
PreparedStatement prep = conn.prepareStatement(
"SELECT * FROM TEST WHERE ID
= ANY(?
)");
"SELECT * FROM TEST WHERE ID
IN(UNNEST(?)
)");
prep.setObject(1, new Object[] { "1", "2" });
ResultSet rs = prep.executeQuery();
</pre>
...
...
h2/src/main/org/h2/command/Parser.java
浏览文件 @
3d365e4c
...
...
@@ -149,14 +149,6 @@ import org.h2.engine.UserAggregate;
import
org.h2.expression.Alias
;
import
org.h2.expression.BinaryOperation
;
import
org.h2.expression.BinaryOperation.OpType
;
import
org.h2.expression.CompareLike
;
import
org.h2.expression.Comparison
;
import
org.h2.expression.ConditionAndOr
;
import
org.h2.expression.ConditionExists
;
import
org.h2.expression.ConditionIn
;
import
org.h2.expression.ConditionInParameter
;
import
org.h2.expression.ConditionInSelect
;
import
org.h2.expression.ConditionNot
;
import
org.h2.expression.Expression
;
import
org.h2.expression.ExpressionColumn
;
import
org.h2.expression.ExpressionList
;
...
...
@@ -181,6 +173,14 @@ import org.h2.expression.analysis.WindowFrameExclusion;
import
org.h2.expression.analysis.WindowFrameUnits
;
import
org.h2.expression.analysis.WindowFunction
;
import
org.h2.expression.analysis.WindowFunctionType
;
import
org.h2.expression.condition.CompareLike
;
import
org.h2.expression.condition.Comparison
;
import
org.h2.expression.condition.ConditionAndOr
;
import
org.h2.expression.condition.ConditionExists
;
import
org.h2.expression.condition.ConditionIn
;
import
org.h2.expression.condition.ConditionInParameter
;
import
org.h2.expression.condition.ConditionInSelect
;
import
org.h2.expression.condition.ConditionNot
;
import
org.h2.expression.function.DateTimeFunctions
;
import
org.h2.expression.function.Function
;
import
org.h2.expression.function.FunctionCall
;
...
...
@@ -2857,7 +2857,7 @@ public class Parser {
r
=
new
ConditionInSelect
(
database
,
r
,
query
,
true
,
compareType
);
read
(
CLOSE_PAREN
);
}
else
if
(
readIf
(
"ANY"
)
||
readIf
(
"SOME"
))
{
}
else
if
(
database
.
getMode
().
anyAndSomeAreComparisons
&&
(
readIf
(
"ANY"
)
||
readIf
(
"SOME"
)
))
{
read
(
OPEN_PAREN
);
if
(
currentTokenType
==
PARAMETER
&&
compareType
==
0
)
{
Parameter
p
=
readParameter
();
...
...
@@ -3406,6 +3406,23 @@ public class Parser {
tf
.
setColumns
(
columns
);
break
;
}
case
Function
.
UNNEST
:
{
ArrayList
<
Column
>
columns
=
Utils
.
newSmallArrayList
();
if
(!
readIf
(
CLOSE_PAREN
))
{
int
i
=
0
;
do
{
function
.
setParameter
(
i
++,
readExpression
());
columns
.
add
(
new
Column
(
"C"
+
i
,
Value
.
NULL
));
}
while
(
readIfMore
(
true
));
}
if
(
readIf
(
WITH
))
{
read
(
"ORDINALITY"
);
columns
.
add
(
new
Column
(
"NORD"
,
Value
.
INT
));
}
TableFunction
tf
=
(
TableFunction
)
function
;
tf
.
setColumns
(
columns
);
break
;
}
default
:
if
(!
readIf
(
CLOSE_PAREN
))
{
int
i
=
0
;
...
...
h2/src/main/org/h2/command/dml/Insert.java
浏览文件 @
3d365e4c
...
...
@@ -18,12 +18,12 @@ import org.h2.engine.Mode;
import
org.h2.engine.Right
;
import
org.h2.engine.Session
;
import
org.h2.engine.UndoLogRecord
;
import
org.h2.expression.Comparison
;
import
org.h2.expression.ConditionAndOr
;
import
org.h2.expression.Expression
;
import
org.h2.expression.ExpressionColumn
;
import
org.h2.expression.Parameter
;
import
org.h2.expression.ValueExpression
;
import
org.h2.expression.condition.Comparison
;
import
org.h2.expression.condition.ConditionAndOr
;
import
org.h2.index.Index
;
import
org.h2.index.PageDataIndex
;
import
org.h2.message.DbException
;
...
...
h2/src/main/org/h2/command/dml/MergeUsing.java
浏览文件 @
3d365e4c
...
...
@@ -16,9 +16,9 @@ import org.h2.command.Prepared;
import
org.h2.engine.Right
;
import
org.h2.engine.Session
;
import
org.h2.engine.User
;
import
org.h2.expression.ConditionAndOr
;
import
org.h2.expression.Expression
;
import
org.h2.expression.ExpressionColumn
;
import
org.h2.expression.condition.ConditionAndOr
;
import
org.h2.message.DbException
;
import
org.h2.result.ResultInterface
;
import
org.h2.result.Row
;
...
...
h2/src/main/org/h2/command/dml/Select.java
浏览文件 @
3d365e4c
...
...
@@ -18,8 +18,6 @@ import org.h2.engine.Database;
import
org.h2.engine.Session
;
import
org.h2.engine.SysProperties
;
import
org.h2.expression.Alias
;
import
org.h2.expression.Comparison
;
import
org.h2.expression.ConditionAndOr
;
import
org.h2.expression.Expression
;
import
org.h2.expression.ExpressionColumn
;
import
org.h2.expression.ExpressionVisitor
;
...
...
@@ -27,6 +25,8 @@ import org.h2.expression.Parameter;
import
org.h2.expression.Wildcard
;
import
org.h2.expression.analysis.DataAnalysisOperation
;
import
org.h2.expression.analysis.Window
;
import
org.h2.expression.condition.Comparison
;
import
org.h2.expression.condition.ConditionAndOr
;
import
org.h2.index.Cursor
;
import
org.h2.index.Index
;
import
org.h2.index.IndexType
;
...
...
h2/src/main/org/h2/engine/Mode.java
浏览文件 @
3d365e4c
...
...
@@ -209,6 +209,12 @@ public class Mode {
*/
public
boolean
dateTimeValueWithinTransaction
;
/**
* If {@code true}, ANY and SOME after comparison operators are parsed as
* array comparison operators.
*/
public
boolean
anyAndSomeAreComparisons
;
/**
* An optional Set of hidden/disallowed column types.
* Certain DBMSs don't support all column types provided by H2, such as
...
...
@@ -354,6 +360,7 @@ public class Mode {
dt
.
name
=
"MONEY"
;
mode
.
typeByNameMap
.
put
(
"MONEY"
,
dt
);
mode
.
dateTimeValueWithinTransaction
=
true
;
mode
.
anyAndSomeAreComparisons
=
true
;
add
(
mode
);
mode
=
new
Mode
(
ModeEnum
.
Ignite
);
...
...
h2/src/main/org/h2/expression/ExpressionColumn.java
浏览文件 @
3d365e4c
...
...
@@ -12,6 +12,7 @@ import org.h2.command.dml.SelectGroups;
import
org.h2.command.dml.SelectListColumnResolver
;
import
org.h2.engine.Database
;
import
org.h2.engine.Session
;
import
org.h2.expression.condition.Comparison
;
import
org.h2.index.IndexCondition
;
import
org.h2.message.DbException
;
import
org.h2.schema.Constant
;
...
...
h2/src/main/org/h2/expression/ExpressionList.java
浏览文件 @
3d365e4c
...
...
@@ -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
;
...
...
h2/src/main/org/h2/expression/ExpressionVisitor.java
浏览文件 @
3d365e4c
...
...
@@ -220,7 +220,7 @@ public class ExpressionVisitor {
* @param resolver the resolver
* @return the new visitor
*/
static
ExpressionVisitor
getNotFromResolverVisitor
(
ColumnResolver
resolver
)
{
public
static
ExpressionVisitor
getNotFromResolverVisitor
(
ColumnResolver
resolver
)
{
return
new
ExpressionVisitor
(
NOT_FROM_RESOLVER
,
0
,
null
,
null
,
null
,
resolver
,
null
,
null
);
}
...
...
h2/src/main/org/h2/expression/Parameter.java
浏览文件 @
3d365e4c
...
...
@@ -7,6 +7,7 @@ package org.h2.expression;
import
org.h2.api.ErrorCode
;
import
org.h2.engine.Session
;
import
org.h2.expression.condition.Comparison
;
import
org.h2.message.DbException
;
import
org.h2.table.Column
;
import
org.h2.table.ColumnResolver
;
...
...
h2/src/main/org/h2/expression/ValueExpression.java
浏览文件 @
3d365e4c
...
...
@@ -6,6 +6,7 @@
package
org
.
h2
.
expression
;
import
org.h2.engine.Session
;
import
org.h2.expression.condition.Comparison
;
import
org.h2.index.IndexCondition
;
import
org.h2.message.DbException
;
import
org.h2.table.ColumnResolver
;
...
...
h2/src/main/org/h2/expression/aggregate/Aggregate.java
浏览文件 @
3d365e4c
...
...
@@ -105,14 +105,14 @@ public class Aggregate extends AbstractAggregate {
VAR_SAMP
,
/**
* The aggregate type for
BOOL_OR
(expression).
* The aggregate type for
ANY
(expression).
*/
BOOL_OR
,
ANY
,
/**
* The aggregate type for
BOOL_AND
(expression).
* The aggregate type for
EVERY
(expression).
*/
BOOL_AND
,
EVERY
,
/**
* The aggregate type for BOOL_OR(expression).
...
...
@@ -209,12 +209,13 @@ public class Aggregate extends AbstractAggregate {
addAggregate
(
"VAR_SAMP"
,
AggregateType
.
VAR_SAMP
);
addAggregate
(
"VAR"
,
AggregateType
.
VAR_SAMP
);
addAggregate
(
"VARIANCE"
,
AggregateType
.
VAR_SAMP
);
addAggregate
(
"BOOL_OR"
,
AggregateType
.
BOOL_OR
);
// HSQLDB compatibility, but conflicts with x > EVERY(...)
addAggregate
(
"SOME"
,
AggregateType
.
BOOL_OR
);
addAggregate
(
"BOOL_AND"
,
AggregateType
.
BOOL_AND
);
// HSQLDB compatibility, but conflicts with x > SOME(...)
addAggregate
(
"EVERY"
,
AggregateType
.
BOOL_AND
);
addAggregate
(
"ANY"
,
AggregateType
.
ANY
);
addAggregate
(
"SOME"
,
AggregateType
.
ANY
);
// PostgreSQL compatibility
addAggregate
(
"BOOL_OR"
,
AggregateType
.
ANY
);
addAggregate
(
"EVERY"
,
AggregateType
.
EVERY
);
// PostgreSQL compatibility
addAggregate
(
"BOOL_AND"
,
AggregateType
.
EVERY
);
addAggregate
(
"SELECTIVITY"
,
AggregateType
.
SELECTIVITY
);
addAggregate
(
"HISTOGRAM"
,
AggregateType
.
HISTOGRAM
);
addAggregate
(
"BIT_OR"
,
AggregateType
.
BIT_OR
);
...
...
@@ -652,8 +653,8 @@ public class Aggregate extends AbstractAggregate {
displaySize
=
ValueDouble
.
DISPLAY_SIZE
;
scale
=
0
;
break
;
case
BOOL_AND
:
case
BOOL_OR
:
case
EVERY
:
case
ANY
:
dataType
=
Value
.
BOOLEAN
;
precision
=
ValueBoolean
.
PRECISION
;
displaySize
=
ValueBoolean
.
DISPLAY_SIZE
;
...
...
@@ -779,11 +780,11 @@ public class Aggregate extends AbstractAggregate {
case
VAR_SAMP:
text
=
"VAR_SAMP"
;
break
;
case
BOOL_AND
:
text
=
"
BOOL_AND
"
;
case
EVERY
:
text
=
"
EVERY
"
;
break
;
case
BOOL_OR
:
text
=
"
BOOL_OR
"
;
case
ANY
:
text
=
"
ANY
"
;
break
;
case
BIT_AND:
text
=
"BIT_AND"
;
...
...
h2/src/main/org/h2/expression/aggregate/AggregateData.java
浏览文件 @
3d365e4c
...
...
@@ -40,8 +40,8 @@ abstract class AggregateData {
case
MAX:
case
BIT_OR:
case
BIT_AND:
case
BOOL_OR
:
case
BOOL_AND
:
case
ANY
:
case
EVERY
:
return
new
AggregateDataDefault
(
aggregateType
);
case
SUM:
case
AVG:
...
...
h2/src/main/org/h2/expression/aggregate/AggregateDataDefault.java
浏览文件 @
3d365e4c
...
...
@@ -83,7 +83,7 @@ class AggregateDataDefault extends AggregateData {
}
break
;
}
case
BOOL_AND
:
case
EVERY
:
v
=
v
.
convertTo
(
Value
.
BOOLEAN
);
if
(
value
==
null
)
{
value
=
v
;
...
...
@@ -91,7 +91,7 @@ class AggregateDataDefault extends AggregateData {
value
=
ValueBoolean
.
get
(
value
.
getBoolean
()
&&
v
.
getBoolean
());
}
break
;
case
BOOL_OR
:
case
ANY
:
v
=
v
.
convertTo
(
Value
.
BOOLEAN
);
if
(
value
==
null
)
{
value
=
v
;
...
...
@@ -127,8 +127,8 @@ class AggregateDataDefault extends AggregateData {
case
MAX:
case
BIT_OR:
case
BIT_AND:
case
BOOL_OR
:
case
BOOL_AND
:
case
ANY
:
case
EVERY
:
v
=
value
;
break
;
case
AVG:
...
...
h2/src/main/org/h2/expression/CompareLike.java
→
h2/src/main/org/h2/expression/
condition/
CompareLike.java
浏览文件 @
3d365e4c
...
...
@@ -3,13 +3,17 @@
* and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package
org
.
h2
.
expression
;
package
org
.
h2
.
expression
.
condition
;
import
java.util.regex.Pattern
;
import
java.util.regex.PatternSyntaxException
;
import
org.h2.api.ErrorCode
;
import
org.h2.engine.Database
;
import
org.h2.engine.Session
;
import
org.h2.expression.Expression
;
import
org.h2.expression.ExpressionColumn
;
import
org.h2.expression.ExpressionVisitor
;
import
org.h2.expression.ValueExpression
;
import
org.h2.index.IndexCondition
;
import
org.h2.message.DbException
;
import
org.h2.table.ColumnResolver
;
...
...
h2/src/main/org/h2/expression/Comparison.java
→
h2/src/main/org/h2/expression/
condition/
Comparison.java
浏览文件 @
3d365e4c
...
...
@@ -3,7 +3,7 @@
* and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package
org
.
h2
.
expression
;
package
org
.
h2
.
expression
.
condition
;
import
java.util.ArrayList
;
import
java.util.Arrays
;
...
...
@@ -11,6 +11,11 @@ import org.h2.api.ErrorCode;
import
org.h2.engine.Database
;
import
org.h2.engine.Session
;
import
org.h2.engine.SysProperties
;
import
org.h2.expression.Expression
;
import
org.h2.expression.ExpressionColumn
;
import
org.h2.expression.ExpressionVisitor
;
import
org.h2.expression.Parameter
;
import
org.h2.expression.ValueExpression
;
import
org.h2.index.IndexCondition
;
import
org.h2.message.DbException
;
import
org.h2.table.Column
;
...
...
h2/src/main/org/h2/expression/Condition.java
→
h2/src/main/org/h2/expression/
condition/
Condition.java
浏览文件 @
3d365e4c
...
...
@@ -3,8 +3,9 @@
* and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package
org
.
h2
.
expression
;
package
org
.
h2
.
expression
.
condition
;
import
org.h2.expression.Expression
;
import
org.h2.value.Value
;
import
org.h2.value.ValueBoolean
;
...
...
h2/src/main/org/h2/expression/ConditionAndOr.java
→
h2/src/main/org/h2/expression/
condition/
ConditionAndOr.java
浏览文件 @
3d365e4c
...
...
@@ -3,10 +3,13 @@
* and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package
org
.
h2
.
expression
;
package
org
.
h2
.
expression
.
condition
;
import
org.h2.engine.Session
;
import
org.h2.engine.SysProperties
;
import
org.h2.expression.Expression
;
import
org.h2.expression.ExpressionVisitor
;
import
org.h2.expression.ValueExpression
;
import
org.h2.message.DbException
;
import
org.h2.table.ColumnResolver
;
import
org.h2.table.TableFilter
;
...
...
h2/src/main/org/h2/expression/ConditionExists.java
→
h2/src/main/org/h2/expression/
condition/
ConditionExists.java
浏览文件 @
3d365e4c
...
...
@@ -3,10 +3,12 @@
* and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package
org
.
h2
.
expression
;
package
org
.
h2
.
expression
.
condition
;
import
org.h2.command.dml.Query
;
import
org.h2.engine.Session
;
import
org.h2.expression.Expression
;
import
org.h2.expression.ExpressionVisitor
;
import
org.h2.result.ResultInterface
;
import
org.h2.table.ColumnResolver
;
import
org.h2.table.TableFilter
;
...
...
h2/src/main/org/h2/expression/ConditionIn.java
→
h2/src/main/org/h2/expression/
condition/
ConditionIn.java
浏览文件 @
3d365e4c
...
...
@@ -3,12 +3,20 @@
* and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package
org
.
h2
.
expression
;
package
org
.
h2
.
expression
.
condition
;
import
java.util.ArrayList
;
import
org.h2.engine.Database
;
import
org.h2.engine.Session
;
import
org.h2.expression.Expression
;
import
org.h2.expression.ExpressionColumn
;
import
org.h2.expression.ExpressionVisitor
;
import
org.h2.expression.Parameter
;
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
;
...
...
@@ -47,7 +55,15 @@ public class ConditionIn extends Condition {
}
boolean
result
=
false
;
boolean
hasNull
=
false
;
for
(
Expression
e
:
valueList
)
{
int
size
=
valueList
.
size
();
if
(
size
==
1
)
{
Expression
e
=
valueList
.
get
(
0
);
if
(
e
instanceof
TableFunction
)
{
return
ConditionInParameter
.
getValue
(
database
,
l
,
e
.
getValue
(
session
));
}
}
for
(
int
i
=
0
;
i
<
size
;
i
++)
{
Expression
e
=
valueList
.
get
(
i
);
Value
r
=
e
.
getValue
(
session
);
if
(
r
==
ValueNull
.
INSTANCE
)
{
hasNull
=
true
;
...
...
@@ -80,9 +96,38 @@ public class ConditionIn extends Condition {
if
(
constant
&&
left
==
ValueExpression
.
getNull
())
{
return
left
;
}
int
size
=
valueList
.
size
();
if
(
size
==
1
)
{
Expression
right
=
valueList
.
get
(
0
);
if
(
right
instanceof
TableFunction
)
{
TableFunction
tf
=
(
TableFunction
)
right
;
if
(
tf
.
getFunctionType
()
==
Function
.
UNNEST
)
{
Expression
[]
args
=
tf
.
getArgs
();
if
(
args
.
length
==
1
)
{
Expression
arg
=
args
[
0
];
if
(
arg
instanceof
Parameter
)
{
return
new
ConditionInParameter
(
database
,
left
,
(
Parameter
)
arg
);
}
}
}
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
;
}
}
boolean
allValuesConstant
=
true
;
boolean
allValuesNull
=
true
;
int
size
=
valueList
.
size
();
for
(
int
i
=
0
;
i
<
size
;
i
++)
{
Expression
e
=
valueList
.
get
(
i
);
e
=
e
.
optimize
(
session
);
...
...
@@ -98,14 +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
)
{
Expression
right
=
valueList
.
get
(
0
);
Expression
expr
=
new
Comparison
(
session
,
Comparison
.
EQUAL
,
left
,
right
);
expr
=
expr
.
optimize
(
session
);
return
expr
;
if
(
values
.
size
()
==
1
)
{
return
new
Comparison
(
session
,
Comparison
.
EQUAL
,
left
,
values
.
get
(
0
)).
optimize
(
session
);
}
if
(
allValuesConstant
&&
!
allValuesNull
)
{
int
leftType
=
left
.
getType
();
...
...
@@ -115,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
;
}
...
...
h2/src/main/org/h2/expression/ConditionInConstantSet.java
→
h2/src/main/org/h2/expression/
condition/
ConditionInConstantSet.java
浏览文件 @
3d365e4c
...
...
@@ -3,7 +3,7 @@
* and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package
org
.
h2
.
expression
;
package
org
.
h2
.
expression
.
condition
;
import
java.util.ArrayList
;
import
java.util.TreeSet
;
...
...
@@ -11,6 +11,9 @@ import java.util.TreeSet;
import
org.h2.engine.Database
;
import
org.h2.engine.Mode
;
import
org.h2.engine.Session
;
import
org.h2.expression.Expression
;
import
org.h2.expression.ExpressionColumn
;
import
org.h2.expression.ExpressionVisitor
;
import
org.h2.index.IndexCondition
;
import
org.h2.message.DbException
;
import
org.h2.table.ColumnResolver
;
...
...
h2/src/main/org/h2/expression/ConditionInParameter.java
→
h2/src/main/org/h2/expression/
condition/
ConditionInParameter.java
浏览文件 @
3d365e4c
...
...
@@ -3,13 +3,19 @@
* and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package
org
.
h2
.
expression
;
package
org
.
h2
.
expression
.
condition
;
import
java.util.AbstractList
;
import
org.h2.engine.Database
;
import
org.h2.engine.Session
;
import
org.h2.expression.Expression
;
import
org.h2.expression.ExpressionColumn
;
import
org.h2.expression.ExpressionVisitor
;
import
org.h2.expression.Parameter
;
import
org.h2.expression.ValueExpression
;
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
;
...
...
@@ -18,7 +24,7 @@ import org.h2.value.ValueBoolean;
import
org.h2.value.ValueNull
;
/**
* A condition with parameter as {@code
= ANY(?
)}.
* A condition with parameter as {@code
IN(UNNEST(?)
)}.
*/
public
class
ConditionInParameter
extends
Condition
{
private
static
final
class
ParameterList
extends
AbstractList
<
Expression
>
{
...
...
@@ -59,13 +65,48 @@ public class ConditionInParameter extends Condition {
private
final
Parameter
parameter
;
static
Value
getValue
(
Database
database
,
Value
l
,
Value
value
)
{
boolean
result
=
false
;
boolean
hasNull
=
false
;
if
(
value
==
ValueNull
.
INSTANCE
)
{
hasNull
=
true
;
}
else
if
(
value
.
getType
()
==
Value
.
RESULT_SET
)
{
for
(
ResultInterface
ri
=
value
.
getResult
();
ri
.
next
();)
{
Value
r
=
ri
.
currentRow
()[
0
];
if
(
r
==
ValueNull
.
INSTANCE
)
{
hasNull
=
true
;
}
else
{
result
=
Comparison
.
compareNotNull
(
database
,
l
,
r
,
Comparison
.
EQUAL
);
if
(
result
)
{
break
;
}
}
}
}
else
{
for
(
Value
r
:
((
ValueArray
)
value
.
convertTo
(
Value
.
ARRAY
)).
getList
())
{
if
(
r
==
ValueNull
.
INSTANCE
)
{
hasNull
=
true
;
}
else
{
result
=
Comparison
.
compareNotNull
(
database
,
l
,
r
,
Comparison
.
EQUAL
);
if
(
result
)
{
break
;
}
}
}
}
if
(!
result
&&
hasNull
)
{
return
ValueNull
.
INSTANCE
;
}
return
ValueBoolean
.
get
(
result
);
}
/**
* Create a new {@code
= ANY(?
)} condition.
* Create a new {@code
IN(UNNEST(?)
)} condition.
*
* @param database
* the database
* @param left
* the expression before {@code
= ANY(?
)}
* the expression before {@code
IN(UNNEST(?)
)}
* @param parameter
* parameter
*/
...
...
@@ -81,31 +122,7 @@ public class ConditionInParameter extends Condition {
if
(
l
==
ValueNull
.
INSTANCE
)
{
return
l
;
}
boolean
result
=
false
;
boolean
hasNull
=
false
;
Value
value
=
parameter
.
getValue
(
session
);
if
(
value
instanceof
ValueArray
)
{
for
(
Value
r
:
((
ValueArray
)
value
).
getList
())
{
if
(
r
==
ValueNull
.
INSTANCE
)
{
hasNull
=
true
;
}
else
{
result
=
Comparison
.
compareNotNull
(
database
,
l
,
r
,
Comparison
.
EQUAL
);
if
(
result
)
{
break
;
}
}
}
}
else
{
if
(
value
==
ValueNull
.
INSTANCE
)
{
hasNull
=
true
;
}
else
{
result
=
Comparison
.
compareNotNull
(
database
,
l
,
value
,
Comparison
.
EQUAL
);
}
}
if
(!
result
&&
hasNull
)
{
return
ValueNull
.
INSTANCE
;
}
return
ValueBoolean
.
get
(
result
);
return
getValue
(
database
,
l
,
parameter
.
getValue
(
session
));
}
@Override
...
...
@@ -142,8 +159,8 @@ public class ConditionInParameter extends Condition {
@Override
public
StringBuilder
getSQL
(
StringBuilder
builder
)
{
builder
.
append
(
'('
);
left
.
getSQL
(
builder
).
append
(
"
= ANY
("
);
return
parameter
.
getSQL
(
builder
).
append
(
"))"
);
left
.
getSQL
(
builder
).
append
(
"
IN(UNNEST
("
);
return
parameter
.
getSQL
(
builder
).
append
(
"))
)
"
);
}
@Override
...
...
h2/src/main/org/h2/expression/ConditionInSelect.java
→
h2/src/main/org/h2/expression/
condition/
ConditionInSelect.java
浏览文件 @
3d365e4c
...
...
@@ -3,12 +3,15 @@
* and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package
org
.
h2
.
expression
;
package
org
.
h2
.
expression
.
condition
;
import
org.h2.api.ErrorCode
;
import
org.h2.command.dml.Query
;
import
org.h2.engine.Database
;
import
org.h2.engine.Session
;
import
org.h2.expression.Expression
;
import
org.h2.expression.ExpressionColumn
;
import
org.h2.expression.ExpressionVisitor
;
import
org.h2.index.IndexCondition
;
import
org.h2.message.DbException
;
import
org.h2.result.LocalResult
;
...
...
h2/src/main/org/h2/expression/ConditionNot.java
→
h2/src/main/org/h2/expression/
condition/
ConditionNot.java
浏览文件 @
3d365e4c
...
...
@@ -3,9 +3,12 @@
* and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package
org
.
h2
.
expression
;
package
org
.
h2
.
expression
.
condition
;
import
org.h2.engine.Session
;
import
org.h2.expression.Expression
;
import
org.h2.expression.ExpressionVisitor
;
import
org.h2.expression.ValueExpression
;
import
org.h2.table.ColumnResolver
;
import
org.h2.table.TableFilter
;
import
org.h2.value.Value
;
...
...
h2/src/main/org/h2/expression/condition/package.html
0 → 100644
浏览文件 @
3d365e4c
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!--
Copyright 2004-2018 H2 Group. Multiple-Licensed under the MPL 2.0, Version 1.0,
and under the Eclipse Public License, Version 1.0
Initial Developer: H2 Group
-->
<html
xmlns=
"http://www.w3.org/1999/xhtml"
lang=
"en"
xml:lang=
"en"
>
<head><meta
http-equiv=
"Content-Type"
content=
"text/html;charset=utf-8"
/><title>
Javadoc package documentation
</title></head><body
style=
"font: 9pt/130% Tahoma, Arial, Helvetica, sans-serif; font-weight: normal;"
><p>
Condition expressions.
</p></body></html>
\ No newline at end of file
h2/src/main/org/h2/expression/function/Function.java
浏览文件 @
3d365e4c
...
...
@@ -134,7 +134,8 @@ public class Function extends Expression implements FunctionCall {
ARRAY_LENGTH
=
217
,
LINK_SCHEMA
=
218
,
GREATEST
=
219
,
LEAST
=
220
,
CANCEL_SESSION
=
221
,
SET
=
222
,
TABLE
=
223
,
TABLE_DISTINCT
=
224
,
FILE_READ
=
225
,
TRANSACTION_ID
=
226
,
TRUNCATE_VALUE
=
227
,
NVL2
=
228
,
DECODE
=
229
,
ARRAY_CONTAINS
=
230
,
FILE_WRITE
=
232
;
NVL2
=
228
,
DECODE
=
229
,
ARRAY_CONTAINS
=
230
,
FILE_WRITE
=
232
,
UNNEST
=
233
;
public
static
final
int
REGEXP_LIKE
=
240
;
...
...
@@ -459,10 +460,9 @@ public class Function extends Expression implements FunctionCall {
addFunction
(
"H2VERSION"
,
H2VERSION
,
0
,
Value
.
STRING
);
// TableFunction
addFunctionWithNull
(
"TABLE"
,
TABLE
,
VAR_ARGS
,
Value
.
RESULT_SET
);
addFunctionWithNull
(
"TABLE_DISTINCT"
,
TABLE_DISTINCT
,
VAR_ARGS
,
Value
.
RESULT_SET
);
addFunctionWithNull
(
"TABLE"
,
TABLE
,
VAR_ARGS
,
Value
.
RESULT_SET
);
addFunctionWithNull
(
"TABLE_DISTINCT"
,
TABLE_DISTINCT
,
VAR_ARGS
,
Value
.
RESULT_SET
);
addFunctionWithNull
(
"UNNEST"
,
UNNEST
,
VAR_ARGS
,
Value
.
RESULT_SET
);
// ON DUPLICATE KEY VALUES function
addFunction
(
"VALUES"
,
VALUES
,
1
,
Value
.
NULL
,
false
,
true
,
false
,
true
);
...
...
@@ -538,6 +538,7 @@ public class Function extends Expression implements FunctionCall {
switch
(
info
.
type
)
{
case
TABLE:
case
TABLE_DISTINCT:
case
UNNEST:
return
new
TableFunction
(
database
,
info
,
Long
.
MAX_VALUE
);
default
:
return
new
Function
(
database
,
info
);
...
...
h2/src/main/org/h2/expression/function/TableFunction.java
浏览文件 @
3d365e4c
...
...
@@ -17,6 +17,7 @@ import org.h2.result.LocalResult;
import
org.h2.table.Column
;
import
org.h2.value.Value
;
import
org.h2.value.ValueArray
;
import
org.h2.value.ValueInt
;
import
org.h2.value.ValueNull
;
import
org.h2.value.ValueResultSet
;
...
...
@@ -24,19 +25,17 @@ import org.h2.value.ValueResultSet;
* Implementation of the functions TABLE(..) and TABLE_DISTINCT(..).
*/
public
class
TableFunction
extends
Function
{
private
final
boolean
distinct
;
private
final
long
rowCount
;
private
Column
[]
column
List
;
private
Column
[]
column
s
;
TableFunction
(
Database
database
,
FunctionInfo
info
,
long
rowCount
)
{
super
(
database
,
info
);
distinct
=
info
.
type
==
Function
.
TABLE_DISTINCT
;
this
.
rowCount
=
rowCount
;
}
@Override
public
Value
getValue
(
Session
session
)
{
return
getTable
(
session
,
args
,
false
,
distinct
);
return
getTable
(
session
,
false
);
}
@Override
...
...
@@ -48,52 +47,60 @@ public class TableFunction extends Function {
@Override
public
StringBuilder
getSQL
(
StringBuilder
builder
)
{
if
(
info
.
type
==
UNNEST
)
{
super
.
getSQL
(
builder
);
if
(
args
.
length
<
columns
.
length
)
{
builder
.
append
(
" WITH ORDINALITY"
);
}
return
builder
;
}
builder
.
append
(
getName
()).
append
(
'('
);
for
(
int
i
=
0
;
i
<
args
.
length
;
i
++)
{
if
(
i
>
0
)
{
builder
.
append
(
", "
);
}
builder
.
append
(
column
List
[
i
].
getCreateSQL
()).
append
(
'='
);
builder
.
append
(
column
s
[
i
].
getCreateSQL
()).
append
(
'='
);
args
[
i
].
getSQL
(
builder
);
}
return
builder
.
append
(
')'
);
}
@Override
public
String
getName
()
{
return
distinct
?
"TABLE_DISTINCT"
:
"TABLE"
;
}
@Override
public
ValueResultSet
getValueForColumnList
(
Session
session
,
Expression
[]
nullArgs
)
{
return
getTable
(
session
,
args
,
true
,
fals
e
);
return
getTable
(
session
,
tru
e
);
}
public
void
setColumns
(
ArrayList
<
Column
>
columns
)
{
this
.
column
List
=
columns
.
toArray
(
new
Column
[
0
]);
this
.
column
s
=
columns
.
toArray
(
new
Column
[
0
]);
}
private
ValueResultSet
getTable
(
Session
session
,
Expression
[]
argList
,
boolean
onlyColumnList
,
boolean
distinctRows
)
{
int
len
=
columnList
.
length
;
Expression
[]
header
=
new
Expression
[
len
];
private
ValueResultSet
getTable
(
Session
session
,
boolean
onlyColumnList
)
{
int
totalColumns
=
columns
.
length
;
Expression
[]
header
=
new
Expression
[
totalColumns
];
Database
db
=
session
.
getDatabase
();
for
(
int
i
=
0
;
i
<
len
;
i
++)
{
Column
c
=
column
List
[
i
];
for
(
int
i
=
0
;
i
<
totalColumns
;
i
++)
{
Column
c
=
column
s
[
i
];
ExpressionColumn
col
=
new
ExpressionColumn
(
db
,
c
);
header
[
i
]
=
col
;
}
LocalResult
result
=
db
.
getResultFactory
().
create
(
session
,
header
,
len
);
if
(
distinctRows
)
{
LocalResult
result
=
db
.
getResultFactory
().
create
(
session
,
header
,
totalColumns
);
if
(
!
onlyColumnList
&&
info
.
type
==
TABLE_DISTINCT
)
{
result
.
setDistinct
();
}
if
(!
onlyColumnList
)
{
int
len
=
totalColumns
;
boolean
unnest
=
info
.
type
==
UNNEST
,
addNumber
=
false
;
if
(
unnest
)
{
len
=
args
.
length
;
if
(
len
<
totalColumns
)
{
addNumber
=
true
;
}
}
Value
[][]
list
=
new
Value
[
len
][];
int
rows
=
0
;
for
(
int
i
=
0
;
i
<
len
;
i
++)
{
Value
v
=
arg
List
[
i
].
getValue
(
session
);
Value
v
=
arg
s
[
i
].
getValue
(
session
);
if
(
v
==
ValueNull
.
INSTANCE
)
{
list
[
i
]
=
new
Value
[
0
];
}
else
{
...
...
@@ -104,21 +111,25 @@ public class TableFunction extends Function {
}
}
for
(
int
row
=
0
;
row
<
rows
;
row
++)
{
Value
[]
r
=
new
Value
[
len
];
Value
[]
r
=
new
Value
[
totalColumns
];
for
(
int
j
=
0
;
j
<
len
;
j
++)
{
Value
[]
l
=
list
[
j
];
Value
v
;
if
(
l
.
length
<=
row
)
{
v
=
ValueNull
.
INSTANCE
;
}
else
{
Column
c
=
column
List
[
j
];
Column
c
=
column
s
[
j
];
v
=
l
[
row
];
v
=
c
.
convert
(
v
);
v
=
v
.
convertPrecision
(
c
.
getPrecision
(),
false
);
v
=
v
.
convertScale
(
true
,
c
.
getScale
());
if
(!
unnest
)
{
v
=
c
.
convert
(
v
).
convertPrecision
(
c
.
getPrecision
(),
false
)
.
convertScale
(
true
,
c
.
getScale
());
}
}
r
[
j
]
=
v
;
}
if
(
addNumber
)
{
r
[
len
]
=
ValueInt
.
get
(
row
+
1
);
}
result
.
addRow
(
r
);
}
}
...
...
@@ -132,7 +143,17 @@ public class TableFunction extends Function {
@Override
public
Expression
[]
getExpressionColumns
(
Session
session
)
{
return
getExpressionColumns
(
session
,
getTable
(
session
,
getArgs
(),
true
,
false
).
getResult
());
return
getExpressionColumns
(
session
,
getValueForColumnList
(
session
,
null
).
getResult
());
}
@Override
public
boolean
isConstant
()
{
for
(
Expression
e
:
args
)
{
if
(!
e
.
isConstant
())
{
return
false
;
}
}
return
true
;
}
}
h2/src/main/org/h2/expression/package.html
浏览文件 @
3d365e4c
...
...
@@ -9,6 +9,6 @@ Initial Developer: H2 Group
Javadoc package documentation
</title></head><body
style=
"font: 9pt/130% Tahoma, Arial, Helvetica, sans-serif; font-weight: normal;"
><p>
Expressions include mathematical operations,
conditions,
simple values, and others.
Expressions include mathematical operations, simple values, and others.
</p></body></html>
\ No newline at end of file
h2/src/main/org/h2/fulltext/FullText.java
浏览文件 @
3d365e4c
...
...
@@ -27,11 +27,11 @@ import java.util.UUID;
import
org.h2.api.Trigger
;
import
org.h2.command.Parser
;
import
org.h2.engine.Session
;
import
org.h2.expression.Comparison
;
import
org.h2.expression.ConditionAndOr
;
import
org.h2.expression.Expression
;
import
org.h2.expression.ExpressionColumn
;
import
org.h2.expression.ValueExpression
;
import
org.h2.expression.condition.Comparison
;
import
org.h2.expression.condition.ConditionAndOr
;
import
org.h2.jdbc.JdbcConnection
;
import
org.h2.message.DbException
;
import
org.h2.tools.SimpleResultSet
;
...
...
h2/src/main/org/h2/index/IndexCondition.java
浏览文件 @
3d365e4c
...
...
@@ -11,10 +11,10 @@ import java.util.HashSet;
import
java.util.List
;
import
org.h2.command.dml.Query
;
import
org.h2.engine.Session
;
import
org.h2.expression.Comparison
;
import
org.h2.expression.Expression
;
import
org.h2.expression.ExpressionColumn
;
import
org.h2.expression.ExpressionVisitor
;
import
org.h2.expression.condition.Comparison
;
import
org.h2.message.DbException
;
import
org.h2.result.ResultInterface
;
import
org.h2.table.Column
;
...
...
h2/src/main/org/h2/index/IndexCursor.java
浏览文件 @
3d365e4c
...
...
@@ -9,7 +9,7 @@ import java.util.ArrayList;
import
java.util.HashSet
;
import
org.h2.engine.Session
;
import
org.h2.expression.Comparison
;
import
org.h2.expression.
condition.
Comparison
;
import
org.h2.message.DbException
;
import
org.h2.result.ResultInterface
;
import
org.h2.result.Row
;
...
...
h2/src/main/org/h2/index/ViewIndex.java
浏览文件 @
3d365e4c
...
...
@@ -16,8 +16,8 @@ import org.h2.command.dml.Query;
import
org.h2.command.dml.SelectUnion
;
import
org.h2.engine.Constants
;
import
org.h2.engine.Session
;
import
org.h2.expression.Comparison
;
import
org.h2.expression.Parameter
;
import
org.h2.expression.condition.Comparison
;
import
org.h2.message.DbException
;
import
org.h2.result.LocalResult
;
import
org.h2.result.ResultInterface
;
...
...
h2/src/main/org/h2/mvstore/Page.java
浏览文件 @
3d365e4c
...
...
@@ -936,7 +936,7 @@ public abstract class Page implements Cloneable
super
(
map
);
}
private
NonLeaf
(
MVMap
<?,
?>
map
,
NonLeaf
source
,
PageReference
[]
children
,
long
totalCount
)
{
NonLeaf
(
MVMap
<?,
?>
map
,
NonLeaf
source
,
PageReference
[]
children
,
long
totalCount
)
{
super
(
map
,
source
);
this
.
children
=
children
;
this
.
totalCount
=
totalCount
;
...
...
h2/src/main/org/h2/table/Column.java
浏览文件 @
3d365e4c
...
...
@@ -15,11 +15,11 @@ import org.h2.engine.Constants;
import
org.h2.engine.Domain
;
import
org.h2.engine.Mode
;
import
org.h2.engine.Session
;
import
org.h2.expression.ConditionAndOr
;
import
org.h2.expression.Expression
;
import
org.h2.expression.ExpressionVisitor
;
import
org.h2.expression.SequenceValue
;
import
org.h2.expression.ValueExpression
;
import
org.h2.expression.condition.ConditionAndOr
;
import
org.h2.message.DbException
;
import
org.h2.result.Row
;
import
org.h2.schema.Schema
;
...
...
h2/src/main/org/h2/table/TableFilter.java
浏览文件 @
3d365e4c
...
...
@@ -15,10 +15,10 @@ import org.h2.command.dml.Select;
import
org.h2.engine.Right
;
import
org.h2.engine.Session
;
import
org.h2.engine.SysProperties
;
import
org.h2.expression.Comparison
;
import
org.h2.expression.ConditionAndOr
;
import
org.h2.expression.Expression
;
import
org.h2.expression.ExpressionColumn
;
import
org.h2.expression.condition.Comparison
;
import
org.h2.expression.condition.ConditionAndOr
;
import
org.h2.index.Index
;
import
org.h2.index.IndexCondition
;
import
org.h2.index.IndexCursor
;
...
...
h2/src/test/org/h2/test/jdbc/TestPreparedStatement.java
浏览文件 @
3d365e4c
...
...
@@ -1635,7 +1635,14 @@ public class TestPreparedStatement extends TestDb {
anyParameterCheck
(
ps
,
values
,
expected
);
ps
=
conn
.
prepareStatement
(
"SELECT ID FROM TEST INNER JOIN TABLE(X INT=?) T ON TEST.VALUE = T.X"
);
anyParameterCheck
(
ps
,
values
,
expected
);
// Test expression IN(UNNEST(?))
ps
=
conn
.
prepareStatement
(
"SELECT ID FROM TEST WHERE VALUE IN(UNNEST(?))"
);
assertThrows
(
ErrorCode
.
PARAMETER_NOT_SET_1
,
ps
).
executeQuery
();
anyParameterCheck
(
ps
,
values
,
expected
);
anyParameterCheck
(
ps
,
300
,
new
int
[]
{
30
});
anyParameterCheck
(
ps
,
-
5
,
new
int
[
0
]);
// Test expression = ANY(?)
conn
.
createStatement
().
execute
(
"SET MODE PostgreSQL"
);
ps
=
conn
.
prepareStatement
(
"SELECT ID FROM TEST WHERE VALUE = ANY(?)"
);
assertThrows
(
ErrorCode
.
PARAMETER_NOT_SET_1
,
ps
).
executeQuery
();
anyParameterCheck
(
ps
,
values
,
expected
);
...
...
h2/src/test/org/h2/test/scripts/TestScript.java
浏览文件 @
3d365e4c
...
...
@@ -161,8 +161,8 @@ public class TestScript extends TestDb {
for
(
String
s
:
new
String
[]
{
"help"
})
{
testScript
(
"other/"
+
s
+
".sql"
);
}
for
(
String
s
:
new
String
[]
{
"array-agg"
,
"avg"
,
"bit-and"
,
"bit-or"
,
"count"
,
"envelope"
,
"group-concat"
,
"histogram"
,
"max"
,
"median"
,
"min"
,
"mode"
,
"selectivity"
,
"stddev-pop"
,
for
(
String
s
:
new
String
[]
{
"a
ny"
,
"a
rray-agg"
,
"avg"
,
"bit-and"
,
"bit-or"
,
"count"
,
"envelope"
,
"
every"
,
"
group-concat"
,
"histogram"
,
"max"
,
"median"
,
"min"
,
"mode"
,
"selectivity"
,
"stddev-pop"
,
"stddev-samp"
,
"sum"
,
"var-pop"
,
"var-samp"
})
{
testScript
(
"functions/aggregate/"
+
s
+
".sql"
);
}
...
...
@@ -194,7 +194,7 @@ public class TestScript extends TestDb {
"ifnull"
,
"least"
,
"link-schema"
,
"lock-mode"
,
"lock-timeout"
,
"memory-free"
,
"memory-used"
,
"nextval"
,
"nullif"
,
"nvl2"
,
"readonly"
,
"rownum"
,
"schema"
,
"scope-identity"
,
"session-id"
,
"set"
,
"table"
,
"transaction-id"
,
"truncate-value"
,
"user"
})
{
"set"
,
"table"
,
"transaction-id"
,
"truncate-value"
,
"u
nnest"
,
"u
ser"
})
{
testScript
(
"functions/system/"
+
s
+
".sql"
);
}
for
(
String
s
:
new
String
[]
{
"add_months"
,
"current_date"
,
"current_timestamp"
,
...
...
h2/src/test/org/h2/test/scripts/functions/aggregate/any.sql
0 → 100644
浏览文件 @
3d365e4c
-- Copyright 2004-2018 H2 Group. Multiple-Licensed under the MPL 2.0,
-- and the EPL 1.0 (http://h2database.com/html/license.html).
-- Initial Developer: H2 Group
--
CREATE
TABLE
TEST
(
A
INT
,
B
INT
);
>
ok
INSERT
INTO
TEST
VALUES
(
1
,
1
),
(
1
,
3
),
(
2
,
1
),
(
2
,
5
),
(
3
,
4
);
>
update
count
:
5
SELECT
A
,
ANY
(
B
<
2
),
SOME
(
B
>
3
),
BOOL_OR
(
B
=
1
),
ANY
(
B
=
1
)
FILTER
(
WHERE
A
=
1
)
FROM
TEST
GROUP
BY
A
;
>
A
ANY
(
B
<
2
)
ANY
(
B
>
3
)
ANY
(
B
=
1
)
ANY
(
B
=
1
)
FILTER
(
WHERE
(
A
=
1
))
>
-
---------- ---------- ---------- ---------------------------------
>
1
TRUE
FALSE
TRUE
TRUE
>
2
TRUE
TRUE
TRUE
null
>
3
FALSE
TRUE
FALSE
null
>
rows
:
3
DROP
TABLE
TEST
;
>
ok
h2/src/test/org/h2/test/scripts/functions/aggregate/bool-and.sql
deleted
100644 → 0
浏览文件 @
f33de19b
-- Copyright 2004-2018 H2 Group. Multiple-Licensed under the MPL 2.0,
-- and the EPL 1.0 (http://h2database.com/html/license.html).
-- Initial Developer: H2 Group
--
h2/src/test/org/h2/test/scripts/functions/aggregate/bool-or.sql
deleted
100644 → 0
浏览文件 @
f33de19b
-- Copyright 2004-2018 H2 Group. Multiple-Licensed under the MPL 2.0,
-- and the EPL 1.0 (http://h2database.com/html/license.html).
-- Initial Developer: H2 Group
--
h2/src/test/org/h2/test/scripts/functions/aggregate/every.sql
0 → 100644
浏览文件 @
3d365e4c
-- Copyright 2004-2018 H2 Group. Multiple-Licensed under the MPL 2.0,
-- and the EPL 1.0 (http://h2database.com/html/license.html).
-- Initial Developer: H2 Group
--
CREATE
TABLE
TEST
(
A
INT
,
B
INT
);
>
ok
INSERT
INTO
TEST
VALUES
(
1
,
1
),
(
1
,
3
),
(
2
,
1
),
(
2
,
5
),
(
3
,
4
);
>
update
count
:
5
SELECT
A
,
EVERY
(
B
<
5
),
BOOL_AND
(
B
>
1
),
EVERY
(
B
>=
1
)
FILTER
(
WHERE
A
=
1
)
FROM
TEST
GROUP
BY
A
;
>
A
EVERY
(
B
<
5
)
EVERY
(
B
>
1
)
EVERY
(
B
>=
1
)
FILTER
(
WHERE
(
A
=
1
))
>
-
------------ ------------ ------------------------------------
>
1
TRUE
FALSE
TRUE
>
2
FALSE
FALSE
null
>
3
TRUE
TRUE
null
>
rows
:
3
DROP
TABLE
TEST
;
>
ok
h2/src/test/org/h2/test/scripts/functions/system/unnest.sql
0 → 100644
浏览文件 @
3d365e4c
-- Copyright 2004-2018 H2 Group. Multiple-Licensed under the MPL 2.0,
-- and the EPL 1.0 (http://h2database.com/html/license.html).
-- Initial Developer: H2 Group
--
SELECT
*
FROM
UNNEST
();
>
exception
INVALID_PARAMETER_COUNT_2
SELECT
*
FROM
UNNEST
(
ARRAY
[]);
>
C1
>
--
>
rows
:
0
SELECT
*
FROM
UNNEST
(
ARRAY
[
1
,
2
,
3
]);
>
C1
>
--
>
1
>
2
>
3
>
rows
:
3
SELECT
*
FROM
UNNEST
(
ARRAY
[
1
],
ARRAY
[
2
,
3
,
4
],
ARRAY
[
5
,
6
]);
>
C1
C2
C3
>
---- -- ----
>
1
2
5
>
null
3
6
>
null
4
null
>
rows
:
3
SELECT
*
FROM
UNNEST
(
ARRAY
[
1
],
ARRAY
[
2
,
3
,
4
],
ARRAY
[
5
,
6
])
WITH
ORDINALITY
;
>
C1
C2
C3
NORD
>
---- -- ---- ----
>
1
2
5
1
>
null
3
6
2
>
null
4
null
3
>
rows
:
3
EXPLAIN
SELECT
*
FROM
UNNEST
(
ARRAY
[
1
]);
>>
SELECT
UNNEST
.
C1
FROM
UNNEST
((
1
,))
/* function */
EXPLAIN
SELECT
*
FROM
UNNEST
(
ARRAY
[
1
])
WITH
ORDINALITY
;
>>
SELECT
UNNEST
.
C1
,
UNNEST
.
NORD
FROM
UNNEST
((
1
,))
WITH
ORDINALITY
/* function */
SELECT
1
IN
(
UNNEST
(
ARRAY
[
1
,
2
,
3
]));
>>
TRUE
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
(
2
,
4
)
>
-
----------
>
1
FALSE
>
2
TRUE
>
3
FALSE
>
4
TRUE
>
5
FALSE
>
rows
:
5
SELECT
X
,
X
IN
(
UNNEST
(
?
))
FROM
SYSTEM_RANGE
(
1
,
5
);
{
2
>
X
X
IN
(
UNNEST
(
?
1
))
>
-
----------------
>
1
FALSE
>
2
TRUE
>
3
FALSE
>
4
FALSE
>
5
FALSE
>
rows
:
5
}
;
>
update
count
:
0
CREATE
TABLE
TEST
(
A
INT
,
B
ARRAY
);
>
ok
INSERT
INTO
TEST
VALUES
(
2
,
ARRAY
[
2
,
4
]),
(
3
,
ARRAY
[
2
,
5
]);
>
update
count
:
2
SELECT
A
,
B
,
A
IN
(
UNNEST
(
B
))
FROM
TEST
;
>
A
B
A
IN
(
UNNEST
(
B
))
>
-
------ ---------------
>
2
(
2
,
4
)
TRUE
>
3
(
2
,
5
)
FALSE
>
rows
:
2
DROP
TABLE
TEST
;
>
ok
h2/src/test/org/h2/test/scripts/testScript.sql
浏览文件 @
3d365e4c
...
...
@@ -6513,6 +6513,9 @@ SELECT * FROM CUSTOMER WHERE NAME NOT IN(SELECT NAME FROM CUSTOMER);
>
-- ----
>
rows
:
0
SET
MODE
PostgreSQL
;
>
ok
SELECT
*
FROM
CUSTOMER
WHERE
NAME
=
ANY
(
SELECT
NAME
FROM
CUSTOMER
);
>
ID
NAME
>
-- -------
...
...
@@ -6545,6 +6548,9 @@ SELECT * FROM CUSTOMER WHERE NAME < ANY(SELECT NAME FROM CUSTOMER);
>
2
Meier
>
rows
:
2
SET
MODE
Regular
;
>
ok
DROP
TABLE
INVOICE
;
>
ok
...
...
@@ -6576,9 +6582,9 @@ select * from s;
>
rows
:
1
select
some
(
y
>
10
),
every
(
y
>
10
),
min
(
y
),
max
(
y
)
from
t
;
>
BOOL_OR
(
Y
>
10
.
0
)
BOOL_AND
(
Y
>
10
.
0
)
MIN
(
Y
)
MAX
(
Y
)
>
-------------
---- ---
--------------- ------ ------
>
null
null
null
null
>
ANY
(
Y
>
10
.
0
)
EVERY
(
Y
>
10
.
0
)
MIN
(
Y
)
MAX
(
Y
)
>
-------------
--------------- ------ ------
>
null
null
null
null
>
rows
:
1
insert
into
t
values
(
1000000004
,
4
);
...
...
@@ -6634,9 +6640,9 @@ stddev_pop(distinct y) s_py, stddev_samp(distinct y) s_sy, var_pop(distinct y) v
>
rows
:
1
select
some
(
y
>
10
),
every
(
y
>
10
),
min
(
y
),
max
(
y
)
from
t
;
>
BOOL_OR
(
Y
>
10
.
0
)
BOOL_AND
(
Y
>
10
.
0
)
MIN
(
Y
)
MAX
(
Y
)
>
-------------
---- ---
--------------- ------ ------
>
TRUE
FALSE
4
.
0
16
.
0
>
ANY
(
Y
>
10
.
0
)
EVERY
(
Y
>
10
.
0
)
MIN
(
Y
)
MAX
(
Y
)
>
-------------
--------------- ------ ------
>
TRUE
FALSE
4
.
0
16
.
0
>
rows
:
1
drop
view
s
;
...
...
h2/src/test/org/h2/test/unit/TestPattern.java
浏览文件 @
3d365e4c
...
...
@@ -6,7 +6,7 @@
package
org
.
h2
.
test
.
unit
;
import
java.text.Collator
;
import
org.h2.expression.CompareLike
;
import
org.h2.expression.
condition.
CompareLike
;
import
org.h2.test.TestBase
;
import
org.h2.value.CompareMode
;
...
...
h2/src/tools/org/h2/build/doc/dictionary.txt
浏览文件 @
3d365e4c
...
...
@@ -802,4 +802,4 @@ partitioned tri partitions
discard enhancements nolock surefire logarithm
qualification opportunity jumping exploited unacceptable vrs duplicated
queryparser tokenized freeze factorings recompilation unenclosed rfe dsync
econd irst bcef
econd irst bcef
ordinality nord unnest
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论