Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
为 GitLab 提交贡献
登录/注册
切换导航
H
h2database
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
Administrator
h2database
Commits
a45f14e4
提交
a45f14e4
authored
12 年前
作者:
Thomas Mueller
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
MVStore: support statements (WIP)
上级
f4d347df
全部展开
显示空白字符变更
内嵌
并排
正在显示
14 个修改的文件
包含
1138 行增加
和
152 行删除
+1138
-152
Session.java
h2/src/main/org/h2/engine/Session.java
+22
-0
MVMap.java
h2/src/main/org/h2/mvstore/MVMap.java
+14
-1
MVStore.java
h2/src/main/org/h2/mvstore/MVStore.java
+12
-0
Page.java
h2/src/main/org/h2/mvstore/Page.java
+16
-1
TransactionStore.java
h2/src/main/org/h2/mvstore/TransactionStore.java
+250
-54
MVPrimaryIndex.java
h2/src/main/org/h2/mvstore/db/MVPrimaryIndex.java
+61
-39
MVSecondaryIndex.java
h2/src/main/org/h2/mvstore/db/MVSecondaryIndex.java
+58
-41
MVTable.java
h2/src/main/org/h2/mvstore/db/MVTable.java
+8
-0
MVTableEngine.java
h2/src/main/org/h2/mvstore/db/MVTableEngine.java
+2
-1
ValueDataType.java
h2/src/main/org/h2/mvstore/db/ValueDataType.java
+681
-0
help.csv
h2/src/main/org/h2/res/help.csv
+1
-5
Table.java
h2/src/main/org/h2/table/Table.java
+4
-0
TestMVTableEngine.java
h2/src/test/org/h2/test/store/TestMVTableEngine.java
+2
-2
TestTransactionStore.java
h2/src/test/org/h2/test/store/TestTransactionStore.java
+7
-8
没有找到文件。
h2/src/main/org/h2/engine/Session.java
浏览文件 @
a45f14e4
...
...
@@ -105,6 +105,8 @@ public class Session extends SessionWithState {
private
final
int
queryCacheSize
;
private
SmallLRUCache
<
String
,
Command
>
queryCache
;
private
Transaction
transaction
;
private
long
startStatement
=
-
1
;
private
long
statementVersion
;
public
Session
(
Database
database
,
User
user
,
int
id
)
{
this
.
database
=
database
;
...
...
@@ -446,6 +448,10 @@ public class Session extends SessionWithState {
checkCommitRollback
();
currentTransactionName
=
null
;
transactionStart
=
0
;
if
(
transaction
!=
null
)
{
transaction
.
commit
();
transaction
=
null
;
}
if
(
containsUncommitted
())
{
// need to commit even if rollback is not possible
// (create/drop table and so on)
...
...
@@ -503,6 +509,10 @@ public class Session extends SessionWithState {
*/
public
void
rollback
()
{
checkCommitRollback
();
if
(
transaction
!=
null
)
{
transaction
.
rollback
();
transaction
=
null
;
}
currentTransactionName
=
null
;
boolean
needCommit
=
false
;
if
(
undoLog
.
size
()
>
0
)
{
...
...
@@ -592,6 +602,9 @@ public class Session extends SessionWithState {
* @param row the row
*/
public
void
log
(
Table
table
,
short
operation
,
Row
row
)
{
if
(
table
.
isMVStore
())
{
return
;
}
if
(
undoLogEnabled
)
{
UndoLogRecord
log
=
new
UndoLogRecord
(
table
,
operation
,
row
);
// called _after_ the row was inserted successfully into the table,
...
...
@@ -1248,8 +1261,17 @@ public class Session extends SessionWithState {
public
Transaction
getTransaction
(
TransactionStore
store
)
{
if
(
transaction
==
null
)
{
transaction
=
store
.
begin
();
statementVersion
=
-
1
;
}
return
transaction
;
}
public
long
getStatementVersion
()
{
if
(
startStatement
==
-
1
)
{
startStatement
=
transaction
.
setSavepoint
();
statementVersion
=
transaction
.
getCurrentVersion
();
}
return
statementVersion
;
}
}
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/mvstore/MVMap.java
浏览文件 @
a45f14e4
...
...
@@ -892,6 +892,10 @@ public class MVMap<K, V> extends AbstractMap<K, V>
}
int
i
=
searchRoot
(
oldest
);
if
(
i
<
0
)
{
i
=
-
i
-
1
;
}
i
--;
if
(
i
<=
0
)
{
return
;
}
// create a new instance
...
...
@@ -1019,7 +1023,8 @@ public class MVMap<K, V> extends AbstractMap<K, V>
// need to copy because it can change
Page
r
=
root
;
if
(
version
>=
r
.
getVersion
()
&&
(
r
.
getVersion
()
>=
0
||
(
version
==
store
.
getCurrentVersion
()
||
r
.
getVersion
()
>=
0
||
version
<=
createVersion
||
store
.
getFile
()
==
null
))
{
newest
=
r
;
...
...
@@ -1184,6 +1189,14 @@ public class MVMap<K, V> extends AbstractMap<K, V>
return
this
;
}
public
DataType
getKeyType
()
{
return
keyType
;
}
public
DataType
getValueType
()
{
return
valueType
;
}
/**
* Set the key data type.
*
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/mvstore/MVStore.java
浏览文件 @
a45f14e4
...
...
@@ -776,6 +776,9 @@ public class MVStore {
if
(!
hasUnsavedChanges
())
{
return
currentVersion
;
}
if
(
readOnly
)
{
throw
DataUtils
.
newIllegalStateException
(
"This store is read-only"
);
}
int
currentUnsavedPageCount
=
unsavedPageCount
;
long
storeVersion
=
currentStoreVersion
=
currentVersion
;
long
version
=
incrementVersion
();
...
...
@@ -938,6 +941,15 @@ public class MVStore {
writeFileHeader
();
shrinkFileIfPossible
(
1
);
}
for
(
MVMap
<?,
?>
m
:
changed
)
{
Page
p
=
m
.
getRoot
();
if
(
p
.
getTotalCount
()
>
0
)
{
p
.
writeEnd
();
}
}
meta
.
getRoot
().
writeEnd
();
// some pages might have been changed in the meantime (in the newest version)
unsavedPageCount
=
Math
.
max
(
0
,
unsavedPageCount
-
currentUnsavedPageCount
);
currentStoreVersion
=
-
1
;
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/mvstore/Page.java
浏览文件 @
a45f14e4
...
...
@@ -838,13 +838,28 @@ public class Page {
if
(
p
!=
null
)
{
buff
=
p
.
writeUnsavedRecursive
(
chunk
,
buff
);
children
[
i
]
=
p
.
getPos
();
childrenPages
[
i
]
=
null
;
}
}
}
return
write
(
chunk
,
buff
);
}
/**
* Unlink the children recursively after all data is written.
*/
void
writeEnd
()
{
if
(!
isLeaf
())
{
int
len
=
children
.
length
;
for
(
int
i
=
0
;
i
<
len
;
i
++)
{
Page
p
=
childrenPages
[
i
];
if
(
p
!=
null
)
{
p
.
writeEnd
();
childrenPages
[
i
]
=
null
;
}
}
}
}
long
getVersion
()
{
return
version
;
}
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/mvstore/TransactionStore.java
浏览文件 @
a45f14e4
差异被折叠。
点击展开。
h2/src/main/org/h2/mvstore/db/MVPrimaryIndex.java
浏览文件 @
a45f14e4
...
...
@@ -18,12 +18,16 @@ import org.h2.index.Cursor;
import
org.h2.index.IndexType
;
import
org.h2.message.DbException
;
import
org.h2.mvstore.MVMap
;
import
org.h2.mvstore.TransactionStore.Transaction
;
import
org.h2.mvstore.TransactionStore.TransactionMap
;
import
org.h2.result.Row
;
import
org.h2.result.SearchRow
;
import
org.h2.result.SortOrder
;
import
org.h2.table.Column
;
import
org.h2.table.IndexColumn
;
import
org.h2.value.Value
;
import
org.h2.value.ValueArray
;
import
org.h2.value.ValueLong
;
import
org.h2.value.ValueNull
;
/**
...
...
@@ -32,7 +36,8 @@ import org.h2.value.ValueNull;
public
class
MVPrimaryIndex
extends
BaseIndex
{
private
final
MVTable
mvTable
;
private
MVMap
<
Long
,
Value
[]>
map
;
private
String
mapName
;
private
MVMap
.
Builder
<
Value
,
Value
>
mapBuilder
;
private
long
lastKey
;
private
int
mainIndexColumn
=
-
1
;
...
...
@@ -44,12 +49,18 @@ public class MVPrimaryIndex extends BaseIndex {
for
(
int
i
=
0
;
i
<
columns
.
length
;
i
++)
{
sortTypes
[
i
]
=
SortOrder
.
ASCENDING
;
}
ValueArrayDataType
t
=
new
ValueArrayDataType
(
ValueDataType
keyType
=
new
ValueDataType
(
null
,
null
,
null
);
ValueDataType
valueType
=
new
ValueDataType
(
db
.
getCompareMode
(),
db
,
sortTypes
);
map
=
table
.
getStore
().
openMap
(
getName
()
+
"_"
+
getId
(),
new
MVMap
.
Builder
<
Long
,
Value
[]>().
valueType
(
t
));
Long
k
=
map
.
lastKey
();
lastKey
=
k
==
null
?
0
:
k
;
mapName
=
getName
()
+
"_"
+
getId
();
mapBuilder
=
new
MVMap
.
Builder
<
Value
,
Value
>().
keyType
(
keyType
).
valueType
(
valueType
);
TransactionMap
<
Value
,
Value
>
map
=
getMap
(
null
);
Value
k
=
map
.
lastKey
();
map
.
getTransaction
().
commit
();
lastKey
=
k
==
null
?
0
:
k
.
getLong
();
}
/**
...
...
@@ -58,9 +69,12 @@ public class MVPrimaryIndex extends BaseIndex {
* @param newName the new name
*/
public
void
renameTable
(
String
newName
)
{
MVMap
<
Long
,
Value
[]
>
map
=
getMap
(
null
);
TransactionMap
<
Value
,
Value
>
map
=
getMap
(
null
);
rename
(
newName
+
"_DATA"
);
map
.
renameMap
(
newName
+
"_DATA_"
+
getId
());
String
newMapName
=
newName
+
"_DATA_"
+
getId
();
map
.
renameMap
(
newMapName
);
map
.
getTransaction
().
commit
();
mapName
=
newMapName
;
}
public
String
getCreateSQL
()
{
...
...
@@ -98,8 +112,8 @@ public class MVPrimaryIndex extends BaseIndex {
for
(
int
i
=
0
;
i
<
array
.
length
;
i
++)
{
array
[
i
]
=
row
.
getValue
(
i
);
}
MVMap
<
Long
,
Value
[]
>
map
=
getMap
(
session
);
if
(
map
.
containsKey
(
row
.
getKey
(
)))
{
TransactionMap
<
Value
,
Value
>
map
=
getMap
(
session
);
if
(
map
.
containsKey
(
ValueLong
.
get
(
row
.
getKey
()
)))
{
String
sql
=
"PRIMARY KEY ON "
+
table
.
getSQL
();
if
(
mainIndexColumn
>=
0
&&
mainIndexColumn
<
indexColumns
.
length
)
{
sql
+=
"("
+
indexColumns
[
mainIndexColumn
].
getSQL
()
+
")"
;
...
...
@@ -108,14 +122,14 @@ public class MVPrimaryIndex extends BaseIndex {
e
.
setSource
(
this
);
throw
e
;
}
map
.
put
(
row
.
getKey
(),
array
);
map
.
put
(
ValueLong
.
get
(
row
.
getKey
()),
ValueArray
.
get
(
array
)
);
lastKey
=
Math
.
max
(
lastKey
,
row
.
getKey
());
}
@Override
public
void
remove
(
Session
session
,
Row
row
)
{
MVMap
<
Long
,
Value
[]
>
map
=
getMap
(
session
);
Value
[]
old
=
map
.
remove
(
row
.
getKey
(
));
TransactionMap
<
Value
,
Value
>
map
=
getMap
(
session
);
Value
old
=
map
.
remove
(
ValueLong
.
get
(
row
.
getKey
()
));
if
(
old
==
null
)
{
throw
DbException
.
get
(
ErrorCode
.
ROW_NOT_FOUND_WHEN_DELETING_1
,
getSQL
()
+
": "
+
row
.
getKey
());
...
...
@@ -145,8 +159,9 @@ public class MVPrimaryIndex extends BaseIndex {
max
=
v
.
getLong
();
}
}
MVMap
<
Long
,
Value
[]>
map
=
getMap
(
session
);
return
new
MVStoreCursor
(
session
,
map
.
keyIterator
(
min
),
max
);
TransactionMap
<
Value
,
Value
>
map
=
getMap
(
session
);
return
new
MVStoreCursor
(
session
,
map
.
keyIterator
(
ValueLong
.
get
(
min
)),
max
);
}
public
MVTable
getTable
()
{
...
...
@@ -154,16 +169,16 @@ public class MVPrimaryIndex extends BaseIndex {
}
public
Row
getRow
(
Session
session
,
long
key
)
{
MVMap
<
Long
,
Value
[]
>
map
=
getMap
(
session
);
Value
[]
array
=
map
.
get
(
key
);
Row
row
=
new
Row
(
array
,
0
);
TransactionMap
<
Value
,
Value
>
map
=
getMap
(
session
);
Value
Array
array
=
(
ValueArray
)
map
.
get
(
ValueLong
.
get
(
key
)
);
Row
row
=
new
Row
(
array
.
getList
()
,
0
);
row
.
setKey
(
key
);
return
row
;
}
@Override
public
double
getCost
(
Session
session
,
int
[]
masks
)
{
MVMap
<
Long
,
Value
[]
>
map
=
getMap
(
session
);
TransactionMap
<
Value
,
Value
>
map
=
getMap
(
session
);
long
cost
=
10
*
(
map
.
getSize
()
+
Constants
.
COST_ROW_OFFSET
);
return
cost
;
}
...
...
@@ -176,7 +191,7 @@ public class MVPrimaryIndex extends BaseIndex {
@Override
public
void
remove
(
Session
session
)
{
MVMap
<
Long
,
Value
[]
>
map
=
getMap
(
session
);
TransactionMap
<
Value
,
Value
>
map
=
getMap
(
session
);
if
(!
map
.
isClosed
())
{
map
.
removeMap
();
}
...
...
@@ -184,7 +199,7 @@ public class MVPrimaryIndex extends BaseIndex {
@Override
public
void
truncate
(
Session
session
)
{
MVMap
<
Long
,
Value
[]
>
map
=
getMap
(
session
);
TransactionMap
<
Value
,
Value
>
map
=
getMap
(
session
);
if
(
mvTable
.
getContainsLargeObject
())
{
database
.
getLobStorage
().
removeAllForTable
(
table
.
getId
());
}
...
...
@@ -198,12 +213,13 @@ public class MVPrimaryIndex extends BaseIndex {
@Override
public
Cursor
findFirstOrLast
(
Session
session
,
boolean
first
)
{
MVMap
<
Long
,
Value
[]
>
map
=
getMap
(
session
);
TransactionMap
<
Value
,
Value
>
map
=
getMap
(
session
);
if
(
map
.
getSize
()
==
0
)
{
return
new
MVStoreCursor
(
session
,
Collections
.<
Long
>
emptyList
().
iterator
(),
0
);
return
new
MVStoreCursor
(
session
,
Collections
.<
Value
>
emptyList
().
iterator
(),
0
);
}
long
key
=
first
?
map
.
firstKey
()
:
map
.
lastKey
();
MVStoreCursor
cursor
=
new
MVStoreCursor
(
session
,
Arrays
.
asList
(
key
).
iterator
(),
key
);
long
key
=
first
?
map
.
firstKey
().
getLong
()
:
map
.
lastKey
().
getLong
();
MVStoreCursor
cursor
=
new
MVStoreCursor
(
session
,
Arrays
.
asList
((
Value
)
ValueLong
.
get
(
key
)).
iterator
(),
key
);
cursor
.
next
();
return
cursor
;
}
...
...
@@ -215,14 +231,16 @@ public class MVPrimaryIndex extends BaseIndex {
@Override
public
long
getRowCount
(
Session
session
)
{
MVMap
<
Long
,
Value
[]
>
map
=
getMap
(
session
);
TransactionMap
<
Value
,
Value
>
map
=
getMap
(
session
);
return
map
.
getSize
();
}
@Override
public
long
getRowCountApproximation
()
{
MVMap
<
Long
,
Value
[]>
map
=
getMap
(
null
);
return
map
.
getSize
();
TransactionMap
<
Value
,
Value
>
map
=
getMap
(
null
);
long
size
=
map
.
getSize
();
map
.
getTransaction
().
commit
();
return
size
;
}
public
long
getDiskSpaceUsed
()
{
...
...
@@ -265,8 +283,8 @@ public class MVPrimaryIndex extends BaseIndex {
* @return the cursor
*/
Cursor
find
(
Session
session
,
long
first
,
long
last
)
{
MVMap
<
Long
,
Value
[]
>
map
=
getMap
(
session
);
return
new
MVStoreCursor
(
session
,
map
.
keyIterator
(
first
),
last
);
TransactionMap
<
Value
,
Value
>
map
=
getMap
(
session
);
return
new
MVStoreCursor
(
session
,
map
.
keyIterator
(
ValueLong
.
get
(
first
)
),
last
);
}
/**
...
...
@@ -275,12 +293,12 @@ public class MVPrimaryIndex extends BaseIndex {
class
MVStoreCursor
implements
Cursor
{
private
final
Session
session
;
private
final
Iterator
<
Long
>
it
;
private
final
Iterator
<
Value
>
it
;
private
final
long
last
;
private
Long
current
;
private
Value
Long
current
;
private
Row
row
;
public
MVStoreCursor
(
Session
session
,
Iterator
<
Long
>
it
,
long
last
)
{
public
MVStoreCursor
(
Session
session
,
Iterator
<
Value
>
it
,
long
last
)
{
this
.
session
=
session
;
this
.
it
=
it
;
this
.
last
=
last
;
...
...
@@ -290,7 +308,7 @@ public class MVPrimaryIndex extends BaseIndex {
public
Row
get
()
{
if
(
row
==
null
)
{
if
(
current
!=
null
)
{
row
=
getRow
(
session
,
current
);
row
=
getRow
(
session
,
current
.
getLong
()
);
}
}
return
row
;
...
...
@@ -303,8 +321,8 @@ public class MVPrimaryIndex extends BaseIndex {
@Override
public
boolean
next
()
{
current
=
it
.
next
();
if
(
current
!=
null
&&
current
>
last
)
{
current
=
(
ValueLong
)
it
.
next
();
if
(
current
!=
null
&&
current
.
getLong
()
>
last
)
{
current
=
null
;
}
row
=
null
;
...
...
@@ -329,9 +347,13 @@ public class MVPrimaryIndex extends BaseIndex {
* @param session the session
* @return the map
*/
MVMap
<
Long
,
Value
[]>
getMap
(
Session
session
)
{
// return mvTable.getTransaction(session).openMap(name)
return
map
;
TransactionMap
<
Value
,
Value
>
getMap
(
Session
session
)
{
if
(
session
==
null
)
{
return
mvTable
.
getTransaction
(
null
).
openMap
(
mapName
,
-
1
,
mapBuilder
);
}
Transaction
t
=
mvTable
.
getTransaction
(
session
);
long
version
=
session
.
getStatementVersion
();
return
t
.
openMap
(
mapName
,
version
,
mapBuilder
);
}
}
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/mvstore/db/MVSecondaryIndex.java
浏览文件 @
a45f14e4
...
...
@@ -17,6 +17,8 @@ import org.h2.index.Cursor;
import
org.h2.index.IndexType
;
import
org.h2.message.DbException
;
import
org.h2.mvstore.MVMap
;
import
org.h2.mvstore.TransactionStore.Transaction
;
import
org.h2.mvstore.TransactionStore.TransactionMap
;
import
org.h2.result.Row
;
import
org.h2.result.SearchRow
;
import
org.h2.result.SortOrder
;
...
...
@@ -24,6 +26,7 @@ import org.h2.table.Column;
import
org.h2.table.IndexColumn
;
import
org.h2.util.New
;
import
org.h2.value.Value
;
import
org.h2.value.ValueArray
;
import
org.h2.value.ValueLong
;
import
org.h2.value.ValueNull
;
...
...
@@ -38,7 +41,8 @@ public class MVSecondaryIndex extends BaseIndex {
final
MVTable
mvTable
;
private
final
int
keyColumns
;
private
MVMap
<
Value
[],
Long
>
map2
;
private
String
mapName
;
private
MVMap
.
Builder
<
Value
,
Value
>
mapBuilder
;
public
MVSecondaryIndex
(
Database
db
,
MVTable
table
,
int
id
,
String
indexName
,
IndexColumn
[]
columns
,
IndexType
indexType
)
{
...
...
@@ -55,12 +59,13 @@ public class MVSecondaryIndex extends BaseIndex {
sortTypes
[
i
]
=
columns
[
i
].
sortType
;
}
sortTypes
[
keyColumns
-
1
]
=
SortOrder
.
ASCENDING
;
String
n
ame
=
getName
()
+
"_"
+
getId
();
Value
ArrayDataType
t
=
new
ValueArray
DataType
(
mapN
ame
=
getName
()
+
"_"
+
getId
();
Value
DataType
keyType
=
new
Value
DataType
(
db
.
getCompareMode
(),
db
,
sortTypes
);
map2
=
table
.
getStore
().
openMap
(
name
,
new
MVMap
.
Builder
<
Value
[],
Long
>().
keyType
(
t
));
ValueDataType
valueType
=
new
ValueDataType
(
null
,
null
,
null
);
mapBuilder
=
new
MVMap
.
Builder
<
Value
,
Value
>().
keyType
(
keyType
).
valueType
(
valueType
);
}
private
static
void
checkIndexColumnTypes
(
IndexColumn
[]
columns
)
{
...
...
@@ -78,20 +83,23 @@ public class MVSecondaryIndex extends BaseIndex {
}
public
void
rename
(
String
newName
)
{
MVMap
<
Value
[],
Long
>
map
=
getMap
(
null
);
map
.
renameMap
(
newName
+
"_"
+
getId
());
TransactionMap
<
Value
,
Value
>
map
=
getMap
(
null
);
String
newMapName
=
newName
+
"_"
+
getId
();
map
.
renameMap
(
newMapName
);
map
.
getTransaction
().
commit
();
mapName
=
newMapName
;
super
.
rename
(
newName
);
}
@Override
public
void
add
(
Session
session
,
Row
row
)
{
MVMap
<
Value
[],
Long
>
map
=
getMap
(
session
);
Value
[]
array
=
getKey
(
row
);
TransactionMap
<
Value
,
Value
>
map
=
getMap
(
session
);
Value
Array
array
=
getKey
(
row
);
if
(
indexType
.
isUnique
())
{
array
[
keyColumns
-
1
]
=
ValueLong
.
get
(
0
);
Value
[]
key
=
map
.
ceilingKey
(
array
);
array
.
getList
()
[
keyColumns
-
1
]
=
ValueLong
.
get
(
0
);
Value
Array
key
=
(
ValueArray
)
map
.
ceilingKey
(
array
);
if
(
key
!=
null
)
{
SearchRow
r2
=
getRow
(
key
);
SearchRow
r2
=
getRow
(
key
.
getList
()
);
if
(
compareRows
(
row
,
r2
)
==
0
)
{
if
(!
containsNullAndAllowMultipleNull
(
r2
))
{
throw
getDuplicateKeyException
();
...
...
@@ -99,15 +107,15 @@ public class MVSecondaryIndex extends BaseIndex {
}
}
}
array
[
keyColumns
-
1
]
=
ValueLong
.
get
(
row
.
getKey
());
map
.
put
(
array
,
Long
.
valueOf
(
0
));
array
.
getList
()
[
keyColumns
-
1
]
=
ValueLong
.
get
(
row
.
getKey
());
map
.
put
(
array
,
ValueLong
.
get
(
0
));
}
@Override
public
void
remove
(
Session
session
,
Row
row
)
{
Value
[]
array
=
getKey
(
row
);
MVMap
<
Value
[],
Long
>
map
=
getMap
(
session
);
Long
old
=
map
.
remove
(
array
);
Value
Array
array
=
getKey
(
row
);
TransactionMap
<
Value
,
Value
>
map
=
getMap
(
session
);
Value
old
=
map
.
remove
(
array
);
if
(
old
==
null
)
{
if
(
old
==
null
)
{
throw
DbException
.
get
(
ErrorCode
.
ROW_NOT_FOUND_WHEN_DELETING_1
,
...
...
@@ -118,12 +126,12 @@ public class MVSecondaryIndex extends BaseIndex {
@Override
public
Cursor
find
(
Session
session
,
SearchRow
first
,
SearchRow
last
)
{
Value
[]
min
=
getKey
(
first
);
MVMap
<
Value
[],
Long
>
map
=
getMap
(
session
);
Value
min
=
getKey
(
first
);
TransactionMap
<
Value
,
Value
>
map
=
getMap
(
session
);
return
new
MVStoreCursor
(
session
,
map
.
keyIterator
(
min
),
last
);
}
private
Value
[]
getKey
(
SearchRow
r
)
{
private
Value
Array
getKey
(
SearchRow
r
)
{
if
(
r
==
null
)
{
return
null
;
}
...
...
@@ -136,7 +144,7 @@ public class MVSecondaryIndex extends BaseIndex {
}
}
array
[
keyColumns
-
1
]
=
ValueLong
.
get
(
r
.
getKey
());
return
array
;
return
ValueArray
.
get
(
array
)
;
}
/**
...
...
@@ -164,13 +172,13 @@ public class MVSecondaryIndex extends BaseIndex {
@Override
public
double
getCost
(
Session
session
,
int
[]
masks
)
{
MVMap
<
Value
[],
Long
>
map
=
getMap
(
session
);
TransactionMap
<
Value
,
Value
>
map
=
getMap
(
session
);
return
10
*
getCostRangeIndex
(
masks
,
map
.
getSize
());
}
@Override
public
void
remove
(
Session
session
)
{
MVMap
<
Value
[],
Long
>
map
=
getMap
(
session
);
TransactionMap
<
Value
,
Value
>
map
=
getMap
(
session
);
if
(!
map
.
isClosed
())
{
map
.
removeMap
();
}
...
...
@@ -178,7 +186,7 @@ public class MVSecondaryIndex extends BaseIndex {
@Override
public
void
truncate
(
Session
session
)
{
MVMap
<
Value
[],
Long
>
map
=
getMap
(
session
);
TransactionMap
<
Value
,
Value
>
map
=
getMap
(
session
);
map
.
clear
();
}
...
...
@@ -189,18 +197,18 @@ public class MVSecondaryIndex extends BaseIndex {
@Override
public
Cursor
findFirstOrLast
(
Session
session
,
boolean
first
)
{
MVMap
<
Value
[],
Long
>
map
=
getMap
(
session
);
Value
[]
key
=
first
?
map
.
firstKey
()
:
map
.
lastKey
();
TransactionMap
<
Value
,
Value
>
map
=
getMap
(
session
);
Value
key
=
first
?
map
.
firstKey
()
:
map
.
lastKey
();
while
(
true
)
{
if
(
key
==
null
)
{
return
new
MVStoreCursor
(
session
,
Collections
.<
Value
[]
>
emptyList
().
iterator
(),
null
);
return
new
MVStoreCursor
(
session
,
Collections
.<
Value
>
emptyList
().
iterator
(),
null
);
}
if
(
key
[
0
]
!=
ValueNull
.
INSTANCE
)
{
if
(
((
ValueArray
)
key
).
getList
()
[
0
]
!=
ValueNull
.
INSTANCE
)
{
break
;
}
key
=
first
?
map
.
higherKey
(
key
)
:
map
.
lowerKey
(
key
);
}
ArrayList
<
Value
[]
>
list
=
New
.
arrayList
();
ArrayList
<
Value
>
list
=
New
.
arrayList
();
list
.
add
(
key
);
MVStoreCursor
cursor
=
new
MVStoreCursor
(
session
,
list
.
iterator
(),
null
);
cursor
.
next
();
...
...
@@ -209,20 +217,24 @@ public class MVSecondaryIndex extends BaseIndex {
@Override
public
boolean
needRebuild
()
{
MVMap
<
Value
[],
Long
>
map
=
getMap
(
null
);
return
map
.
getSize
()
==
0
;
TransactionMap
<
Value
,
Value
>
map
=
getMap
(
null
);
boolean
result
=
map
.
getSize
()
==
0
;
map
.
getTransaction
().
commit
();
return
result
;
}
@Override
public
long
getRowCount
(
Session
session
)
{
MVMap
<
Value
[],
Long
>
map
=
getMap
(
session
);
TransactionMap
<
Value
,
Value
>
map
=
getMap
(
session
);
return
map
.
getSize
();
}
@Override
public
long
getRowCountApproximation
()
{
MVMap
<
Value
[],
Long
>
map
=
getMap
(
null
);
return
map
.
getSize
();
TransactionMap
<
Value
,
Value
>
map
=
getMap
(
null
);
long
size
=
map
.
getSize
();
map
.
getTransaction
().
commit
();
return
size
;
}
public
long
getDiskSpaceUsed
()
{
...
...
@@ -241,13 +253,13 @@ public class MVSecondaryIndex extends BaseIndex {
class
MVStoreCursor
implements
Cursor
{
private
final
Session
session
;
private
final
Iterator
<
Value
[]
>
it
;
private
final
Iterator
<
Value
>
it
;
private
final
SearchRow
last
;
private
Value
[]
current
;
private
Value
current
;
private
SearchRow
searchRow
;
private
Row
row
;
public
MVStoreCursor
(
Session
session
,
Iterator
<
Value
[]
>
it
,
SearchRow
last
)
{
public
MVStoreCursor
(
Session
session
,
Iterator
<
Value
>
it
,
SearchRow
last
)
{
this
.
session
=
session
;
this
.
it
=
it
;
this
.
last
=
last
;
...
...
@@ -268,7 +280,7 @@ public class MVSecondaryIndex extends BaseIndex {
public
SearchRow
getSearchRow
()
{
if
(
searchRow
==
null
)
{
if
(
current
!=
null
)
{
searchRow
=
getRow
(
current
);
searchRow
=
getRow
(
((
ValueArray
)
current
).
getList
()
);
}
}
return
searchRow
;
...
...
@@ -302,8 +314,13 @@ public class MVSecondaryIndex extends BaseIndex {
* @param session the session
* @return the map
*/
MVMap
<
Value
[],
Long
>
getMap
(
Session
session
)
{
return
map2
;
TransactionMap
<
Value
,
Value
>
getMap
(
Session
session
)
{
if
(
session
==
null
)
{
return
mvTable
.
getTransaction
(
null
).
openMap
(
mapName
,
-
1
,
mapBuilder
);
}
Transaction
t
=
mvTable
.
getTransaction
(
session
);
long
version
=
session
.
getStatementVersion
();
return
t
.
openMap
(
mapName
,
version
,
mapBuilder
);
}
}
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/mvstore/db/MVTable.java
浏览文件 @
a45f14e4
...
...
@@ -680,6 +680,10 @@ public class MVTable extends TableBase {
* @return the transaction
*/
Transaction
getTransaction
(
Session
session
)
{
if
(
session
==
null
)
{
// TODO need to commit/rollback the transaction
return
store
.
begin
();
}
return
session
.
getTransaction
(
store
);
}
...
...
@@ -699,4 +703,8 @@ public class MVTable extends TableBase {
return
getSQL
();
}
public
boolean
isMVStore
()
{
return
true
;
}
}
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/mvstore/db/MVTableEngine.java
浏览文件 @
a45f14e4
...
...
@@ -148,7 +148,8 @@ public class MVTableEngine implements TableEngine {
public
Store
(
Database
db
,
MVStore
store
)
{
this
.
db
=
db
;
this
.
store
=
store
;
this
.
transactionStore
=
new
TransactionStore
(
store
);
this
.
transactionStore
=
new
TransactionStore
(
store
,
new
ValueDataType
(
null
,
null
,
null
));
}
public
MVStore
getStore
()
{
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/mvstore/db/ValueDataType.java
0 → 100644
浏览文件 @
a45f14e4
差异被折叠。
点击展开。
h2/src/main/org/h2/res/help.csv
浏览文件 @
a45f14e4
...
...
@@ -976,7 +976,7 @@ HASH(algorithmString, dataBytes, iterationInt)
","
Calculate the hash value using an algorithm, and repeat this process for a number of iterations."
"Functions (Numeric)","TRUNCATE","
{ TRUNC | TRUNCATE } (
numeric, digitsInt
)
{ TRUNC | TRUNCATE } (
{numeric, digitsInt} | timestamp
)
","
Truncates to a number of digits (to the next value closer to 0)."
"Functions (Numeric)","COMPRESS","
...
...
@@ -1223,10 +1223,6 @@ Returns the quarter (1-4) from a timestamp."
SECOND(timestamp)
","
Returns the second (0-59) from a timestamp."
"Functions (Time and Date)","TRUNCATE","
TRUNCATE(timestamp)
","
Truncates a timestamp to a date (day) value."
"Functions (Time and Date)","WEEK","
WEEK(timestamp)
","
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/table/Table.java
浏览文件 @
a45f14e4
...
...
@@ -1087,4 +1087,8 @@ public abstract class Table extends SchemaObjectBase {
this
.
isHidden
=
hidden
;
}
public
boolean
isMVStore
()
{
return
false
;
}
}
This diff is collapsed.
Click to expand it.
h2/src/test/org/h2/test/store/TestMVTableEngine.java
浏览文件 @
a45f14e4
...
...
@@ -36,7 +36,7 @@ public class TestMVTableEngine extends TestBase {
public
void
test
()
throws
Exception
{
testEncryption
();
testReadOnly
();
testReuseDiskSpace
();
//
testReuseDiskSpace();
testDataTypes
();
testLocking
();
testSimple
();
...
...
@@ -103,7 +103,7 @@ public class TestMVTableEngine extends TestBase {
if
(
i
<
6
)
{
maxSizeHalf
=
Math
.
max
(
size
,
maxSizeHalf
);
}
else
if
(
size
>
maxSizeHalf
)
{
fail
(
"
size: "
+
size
+
" max: "
+
maxSizeHalf
);
fail
(
i
+
"
size: "
+
size
+
" max: "
+
maxSizeHalf
);
}
}
}
...
...
This diff is collapsed.
Click to expand it.
h2/src/test/org/h2/test/store/TestTransactionStore.java
浏览文件 @
a45f14e4
...
...
@@ -38,6 +38,8 @@ public class TestTransactionStore extends TestBase {
}
public
void
test
()
throws
Exception
{
FileUtils
.
createDirectories
(
getBaseDir
());
testMultiStatement
();
testTwoPhaseCommit
();
testSavepoint
();
...
...
@@ -69,7 +71,8 @@ public class TestTransactionStore extends TestBase {
// start of statement
// create table test
startUpdate
=
tx
.
setSavepoint
();
tx
.
openMap
(
"test"
);
version
=
s
.
getCurrentVersion
();
tx
.
openMap
(
"test"
,
version
);
// start of statement
// insert into test(id, name) values(1, 'Hello'), (2, 'World')
...
...
@@ -174,18 +177,14 @@ public class TestTransactionStore extends TestBase {
m
=
tx
.
openMap
(
"test"
);
assertEquals
(
null
,
m
.
get
(
"1"
));
list
=
ts
.
getOpenTransactions
();
assertEquals
(
2
,
list
.
size
());
// only one was writing
assertEquals
(
1
,
list
.
size
());
txOld
=
list
.
get
(
0
);
assertEquals
(
0
,
txOld
.
getId
());
assertEquals
(
Transaction
.
STATUS_OPEN
,
txOld
.
getStatus
());
assertEquals
(
"first transaction"
,
txOld
.
getName
());
txOld
.
prepare
();
assertEquals
(
Transaction
.
STATUS_PREPARED
,
txOld
.
getStatus
());
txOld
=
list
.
get
(
1
);
assertEquals
(
1
,
txOld
.
getId
());
assertNull
(
txOld
.
getName
());
assertEquals
(
Transaction
.
STATUS_OPEN
,
txOld
.
getStatus
());
txOld
.
rollback
();
s
.
commit
();
s
.
close
();
...
...
@@ -196,7 +195,7 @@ public class TestTransactionStore extends TestBase {
// TransactionStore was not closed, so we lost some ids
assertEquals
(
33
,
tx
.
getId
());
list
=
ts
.
getOpenTransactions
();
assertEquals
(
2
,
list
.
size
());
assertEquals
(
1
,
list
.
size
());
txOld
=
list
.
get
(
0
);
assertEquals
(
0
,
txOld
.
getId
());
assertEquals
(
Transaction
.
STATUS_PREPARED
,
txOld
.
getStatus
());
...
...
This diff is collapsed.
Click to expand it.
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论