Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
为 GitLab 提交贡献
登录/注册
切换导航
H
h2database
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
Administrator
h2database
Commits
52b412bd
提交
52b412bd
authored
6 年前
作者:
Evgenij Ryazanov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix HASH indexes for data types without total ordering
上级
da92e62b
显示空白字符变更
内嵌
并排
正在显示
4 个修改的文件
包含
99 行增加
和
12 行删除
+99
-12
HashIndex.java
h2/src/main/org/h2/index/HashIndex.java
+11
-7
NonUniqueHashIndex.java
h2/src/main/org/h2/index/NonUniqueHashIndex.java
+12
-5
DataType.java
h2/src/main/org/h2/value/DataType.java
+45
-0
decimal.sql
h2/src/test/org/h2/test/scripts/datatypes/decimal.sql
+31
-0
没有找到文件。
h2/src/main/org/h2/index/HashIndex.java
浏览文件 @
52b412bd
...
...
@@ -5,6 +5,9 @@
*/
package
org
.
h2
.
index
;
import
java.util.HashMap
;
import
java.util.Map
;
import
java.util.TreeMap
;
import
org.h2.command.dml.AllColumnsForPlan
;
import
org.h2.engine.Session
;
import
org.h2.message.DbException
;
...
...
@@ -15,7 +18,7 @@ import org.h2.table.Column;
import
org.h2.table.IndexColumn
;
import
org.h2.table.RegularTable
;
import
org.h2.table.TableFilter
;
import
org.h2.
util.ValueHashMap
;
import
org.h2.
value.DataType
;
import
org.h2.value.Value
;
/**
...
...
@@ -27,20 +30,21 @@ public class HashIndex extends BaseIndex {
* The index of the indexed column.
*/
private
final
int
indexColumn
;
private
final
boolean
totalOrdering
;
private
final
RegularTable
tableData
;
private
ValueHashMap
<
Long
>
rows
;
private
Map
<
Value
,
Long
>
rows
;
public
HashIndex
(
RegularTable
table
,
int
id
,
String
indexName
,
IndexColumn
[]
columns
,
IndexType
indexType
)
{
public
HashIndex
(
RegularTable
table
,
int
id
,
String
indexName
,
IndexColumn
[]
columns
,
IndexType
indexType
)
{
super
(
table
,
id
,
indexName
,
columns
,
indexType
);
this
.
indexColumn
=
columns
[
0
].
column
.
getColumnId
();
Column
column
=
columns
[
0
].
column
;
indexColumn
=
column
.
getColumnId
();
totalOrdering
=
DataType
.
hasTotalOrdering
(
column
.
getType
().
getValueType
());
this
.
tableData
=
table
;
reset
();
}
private
void
reset
()
{
rows
=
new
ValueHashMap
<>(
);
rows
=
totalOrdering
?
new
HashMap
<
Value
,
Long
>()
:
new
TreeMap
<
Value
,
Long
>(
database
.
getCompareMode
()
);
}
@Override
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/index/NonUniqueHashIndex.java
浏览文件 @
52b412bd
...
...
@@ -6,6 +6,9 @@
package
org
.
h2
.
index
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.Map
;
import
java.util.TreeMap
;
import
org.h2.command.dml.AllColumnsForPlan
;
import
org.h2.engine.Session
;
...
...
@@ -18,7 +21,7 @@ import org.h2.table.IndexColumn;
import
org.h2.table.RegularTable
;
import
org.h2.table.TableFilter
;
import
org.h2.util.Utils
;
import
org.h2.
util.ValueHashMap
;
import
org.h2.
value.DataType
;
import
org.h2.value.Value
;
/**
...
...
@@ -32,20 +35,24 @@ public class NonUniqueHashIndex extends BaseIndex {
* The index of the indexed column.
*/
private
final
int
indexColumn
;
private
ValueHashMap
<
ArrayList
<
Long
>>
rows
;
private
final
boolean
totalOrdering
;
private
Map
<
Value
,
ArrayList
<
Long
>>
rows
;
private
final
RegularTable
tableData
;
private
long
rowCount
;
public
NonUniqueHashIndex
(
RegularTable
table
,
int
id
,
String
indexName
,
IndexColumn
[]
columns
,
IndexType
indexType
)
{
super
(
table
,
id
,
indexName
,
columns
,
indexType
);
this
.
indexColumn
=
columns
[
0
].
column
.
getColumnId
();
this
.
tableData
=
table
;
Column
column
=
columns
[
0
].
column
;
indexColumn
=
column
.
getColumnId
();
totalOrdering
=
DataType
.
hasTotalOrdering
(
column
.
getType
().
getValueType
());
tableData
=
table
;
reset
();
}
private
void
reset
()
{
rows
=
new
ValueHashMap
<>();
rows
=
totalOrdering
?
new
HashMap
<
Value
,
ArrayList
<
Long
>>()
:
new
TreeMap
<
Value
,
ArrayList
<
Long
>>(
database
.
getCompareMode
());
rowCount
=
0
;
}
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/value/DataType.java
浏览文件 @
52b412bd
...
...
@@ -1454,6 +1454,51 @@ public class DataType {
return
type
==
Value
.
GEOMETRY
||
type
==
Value
.
ENUM
;
}
/**
* Check if the given type has total ordering.
*
* @param type the value type
* @return true if the value type has total ordering
*/
public
static
boolean
hasTotalOrdering
(
int
type
)
{
switch
(
type
)
{
case
Value
.
BOOLEAN
:
case
Value
.
BYTE
:
case
Value
.
SHORT
:
case
Value
.
INT
:
case
Value
.
LONG
:
// Negative zeroes and NaNs are normalized
case
Value
.
DOUBLE
:
case
Value
.
FLOAT
:
case
Value
.
TIME
:
case
Value
.
DATE
:
case
Value
.
TIMESTAMP
:
case
Value
.
BYTES
:
// Serialized data is compared
case
Value
.
JAVA_OBJECT
:
case
Value
.
UUID
:
// EWKB is used
case
Value
.
GEOMETRY
:
case
Value
.
ENUM
:
case
Value
.
INTERVAL_YEAR
:
case
Value
.
INTERVAL_MONTH
:
case
Value
.
INTERVAL_DAY
:
case
Value
.
INTERVAL_HOUR
:
case
Value
.
INTERVAL_MINUTE
:
case
Value
.
INTERVAL_SECOND
:
case
Value
.
INTERVAL_YEAR_TO_MONTH
:
case
Value
.
INTERVAL_DAY_TO_HOUR
:
case
Value
.
INTERVAL_DAY_TO_MINUTE
:
case
Value
.
INTERVAL_DAY_TO_SECOND
:
case
Value
.
INTERVAL_HOUR_TO_MINUTE
:
case
Value
.
INTERVAL_HOUR_TO_SECOND
:
case
Value
.
INTERVAL_MINUTE_TO_SECOND
:
return
true
;
default
:
return
false
;
}
}
/**
* Check if the given value type supports the add operation.
*
...
...
This diff is collapsed.
Click to expand it.
h2/src/test/org/h2/test/scripts/datatypes/decimal.sql
浏览文件 @
52b412bd
...
...
@@ -58,3 +58,34 @@ CREATE UNIQUE INDEX TEST_IDX ON TEST(N);
DROP
TABLE
TEST
;
>
ok
CREATE
MEMORY
TABLE
TEST
(
N
NUMERIC
)
AS
VALUES
(
0
),
(
0
.
0
),
(
2
),
(
NULL
);
>
ok
CREATE
HASH
INDEX
TEST_IDX
ON
TEST
(
N
);
>
ok
SELECT
N
FROM
TEST
WHERE
N
=
0
;
>
N
>
---
>
0
>
0
.
0
>
rows
:
2
DROP
INDEX
TEST_IDX
;
>
ok
CREATE
UNIQUE
HASH
INDEX
TEST_IDX
ON
TEST
(
N
);
>
exception
DUPLICATE_KEY_1
DELETE
FROM
TEST
WHERE
N
=
0
LIMIT
1
;
>
update
count
:
1
CREATE
UNIQUE
HASH
INDEX
TEST_IDX
ON
TEST
(
N
);
>
ok
SELECT
1
FROM
TEST
WHERE
N
=
0
;
>>
1
DROP
TABLE
TEST
;
>
ok
This diff is collapsed.
Click to expand it.
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论