Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
为 GitLab 提交贡献
登录/注册
切换导航
H
h2database
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
Administrator
h2database
Commits
a4ce10d0
提交
a4ce10d0
authored
7 年前
作者:
andrei
浏览文件
操作
浏览文件
下载
差异文件
Merge remote-tracking branch 'h2database/master' into issue#499.2
上级
dc642580
8fbe0e15
显示空白字符变更
内嵌
并排
正在显示
18 个修改的文件
包含
314 行增加
和
28 行删除
+314
-28
changelog.html
h2/src/docsrc/html/changelog.html
+4
-0
MANIFEST.MF
h2/src/main/META-INF/MANIFEST.MF
+1
-0
Parser.java
h2/src/main/org/h2/command/Parser.java
+35
-1
CreateIndex.java
h2/src/main/org/h2/command/ddl/CreateIndex.java
+7
-1
CreateTableData.java
h2/src/main/org/h2/command/ddl/CreateTableData.java
+0
-1
Mode.java
h2/src/main/org/h2/engine/Mode.java
+11
-0
IndexType.java
h2/src/main/org/h2/index/IndexType.java
+20
-1
TraceSystem.java
h2/src/main/org/h2/message/TraceSystem.java
+3
-0
WriteBuffer.java
h2/src/main/org/h2/mvstore/WriteBuffer.java
+1
-1
help.csv
h2/src/main/org/h2/res/help.csv
+2
-2
JoinBatch.java
h2/src/main/org/h2/table/JoinBatch.java
+3
-0
LinkSchema.java
h2/src/main/org/h2/table/LinkSchema.java
+6
-1
MetaTable.java
h2/src/main/org/h2/table/MetaTable.java
+6
-2
TableLink.java
h2/src/main/org/h2/table/TableLink.java
+2
-1
TestCompatibility.java
h2/src/test/org/h2/test/db/TestCompatibility.java
+23
-0
TestQueryCache.java
h2/src/test/org/h2/test/db/TestQueryCache.java
+24
-9
TestTableEngines.java
h2/src/test/org/h2/test/db/TestTableEngines.java
+159
-7
TestTraceSystem.java
h2/src/test/org/h2/test/unit/TestTraceSystem.java
+7
-1
没有找到文件。
h2/src/docsrc/html/changelog.html
浏览文件 @
a4ce10d0
...
@@ -21,10 +21,14 @@ Change Log
...
@@ -21,10 +21,14 @@ Change Log
<h2>
Next Version (unreleased)
</h2>
<h2>
Next Version (unreleased)
</h2>
<ul>
<ul>
<li>
Fix startup issue when using "CHECK" as a column name.
</li>
<li>
Issue #423: ANALYZE performed multiple times on one table during execution of the same statement.
<li>
Issue #423: ANALYZE performed multiple times on one table during execution of the same statement.
</li>
</li>
<li>
Issue #426: Support ANALYZE TABLE statement
<li>
Issue #426: Support ANALYZE TABLE statement
</li>
</li>
<li>
Issue #438: Fix slow logging via SLF4J (TRACE_LEVEL_FILE=4).
</li>
<li>
Issue #472: Support CREATE SEQUENCE ... ORDER as a NOOP for Oracle compatibility
<li>
Issue #472: Support CREATE SEQUENCE ... ORDER as a NOOP for Oracle compatibility
</li>
</li>
</ul>
</ul>
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/META-INF/MANIFEST.MF
浏览文件 @
a4ce10d0
...
@@ -58,4 +58,5 @@ Export-Package: org.h2;version="${version}",
...
@@ -58,4 +58,5 @@ Export-Package: org.h2;version="${version}",
org.h2.mvstore.db;version="${version}",
org.h2.mvstore.db;version="${version}",
org.h2.mvstore.type;version="${version}",
org.h2.mvstore.type;version="${version}",
org.h2.mvstore.rtree;version="${version}"
org.h2.mvstore.rtree;version="${version}"
Provide-Capability: osgi.service;objectClass:List<String>=org.osgi.service.jdbc.DataSourceFactory
Premain-Class: org.h2.util.Profiler
Premain-Class: org.h2.util.Profiler
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/command/Parser.java
浏览文件 @
a4ce10d0
...
@@ -3884,7 +3884,9 @@ public class Parser {
...
@@ -3884,7 +3884,9 @@ public class Parser {
private
static
int
getSaveTokenType
(
String
s
,
boolean
supportOffsetFetch
)
{
private
static
int
getSaveTokenType
(
String
s
,
boolean
supportOffsetFetch
)
{
switch
(
s
.
charAt
(
0
))
{
switch
(
s
.
charAt
(
0
))
{
case
'C'
:
case
'C'
:
if
(
s
.
equals
(
"CURRENT_TIMESTAMP"
))
{
if
(
s
.
equals
(
"CHECK"
))
{
return
KEYWORD
;
}
else
if
(
s
.
equals
(
"CURRENT_TIMESTAMP"
))
{
return
CURRENT_TIMESTAMP
;
return
CURRENT_TIMESTAMP
;
}
else
if
(
s
.
equals
(
"CURRENT_TIME"
))
{
}
else
if
(
s
.
equals
(
"CURRENT_TIME"
))
{
return
CURRENT_TIME
;
return
CURRENT_TIME
;
...
@@ -4681,6 +4683,10 @@ public class Parser {
...
@@ -4681,6 +4683,10 @@ public class Parser {
return
false
;
return
false
;
}
}
private
boolean
readIfAffinity
()
{
return
readIf
(
"AFFINITY"
)
||
readIf
(
"SHARD"
);
}
private
CreateConstant
parseCreateConstant
()
{
private
CreateConstant
parseCreateConstant
()
{
boolean
ifNotExists
=
readIfNotExists
();
boolean
ifNotExists
=
readIfNotExists
();
String
constantName
=
readIdentifierWithSchema
();
String
constantName
=
readIdentifierWithSchema
();
...
@@ -5905,6 +5911,7 @@ public class Parser {
...
@@ -5905,6 +5911,7 @@ public class Parser {
String
constraintName
=
null
,
comment
=
null
;
String
constraintName
=
null
,
comment
=
null
;
boolean
ifNotExists
=
false
;
boolean
ifNotExists
=
false
;
boolean
allowIndexDefinition
=
database
.
getMode
().
indexDefinitionInCreateTable
;
boolean
allowIndexDefinition
=
database
.
getMode
().
indexDefinitionInCreateTable
;
boolean
allowAffinityKey
=
database
.
getMode
().
allowAffinityKey
;
if
(
readIf
(
"CONSTRAINT"
))
{
if
(
readIf
(
"CONSTRAINT"
))
{
ifNotExists
=
readIfNotExists
();
ifNotExists
=
readIfNotExists
();
constraintName
=
readIdentifierWithSchema
(
schema
.
getName
());
constraintName
=
readIdentifierWithSchema
(
schema
.
getName
());
...
@@ -5956,6 +5963,12 @@ public class Parser {
...
@@ -5956,6 +5963,12 @@ public class Parser {
read
(
"BTREE"
);
read
(
"BTREE"
);
}
}
return
command
;
return
command
;
}
else
if
(
allowAffinityKey
&&
readIfAffinity
())
{
read
(
"KEY"
);
read
(
"("
);
CreateIndex
command
=
createAffinityIndex
(
schema
,
tableName
,
parseIndexColumnList
());
command
.
setIfTableExists
(
ifTableExists
);
return
command
;
}
}
AlterTableAddConstraint
command
;
AlterTableAddConstraint
command
;
if
(
readIf
(
"CHECK"
))
{
if
(
readIf
(
"CHECK"
))
{
...
@@ -6123,6 +6136,9 @@ public class Parser {
...
@@ -6123,6 +6136,9 @@ public class Parser {
if
(
readIf
(
"CONSTRAINT"
))
{
if
(
readIf
(
"CONSTRAINT"
))
{
constraintName
=
readColumnIdentifier
();
constraintName
=
readColumnIdentifier
();
}
}
// For compatibility with Apache Ignite.
boolean
allowAffinityKey
=
database
.
getMode
().
allowAffinityKey
;
boolean
affinity
=
allowAffinityKey
&&
readIfAffinity
();
if
(
readIf
(
"PRIMARY"
))
{
if
(
readIf
(
"PRIMARY"
))
{
read
(
"KEY"
);
read
(
"KEY"
);
boolean
hash
=
readIf
(
"HASH"
);
boolean
hash
=
readIf
(
"HASH"
);
...
@@ -6138,6 +6154,16 @@ public class Parser {
...
@@ -6138,6 +6154,16 @@ public class Parser {
if
(
readIf
(
"AUTO_INCREMENT"
))
{
if
(
readIf
(
"AUTO_INCREMENT"
))
{
parseAutoIncrement
(
column
);
parseAutoIncrement
(
column
);
}
}
if
(
affinity
)
{
CreateIndex
idx
=
createAffinityIndex
(
schema
,
tableName
,
cols
);
command
.
addConstraintCommand
(
idx
);
}
}
else
if
(
affinity
)
{
read
(
"KEY"
);
IndexColumn
[]
cols
=
{
new
IndexColumn
()
};
cols
[
0
].
columnName
=
column
.
getName
();
CreateIndex
idx
=
createAffinityIndex
(
schema
,
tableName
,
cols
);
command
.
addConstraintCommand
(
idx
);
}
else
if
(
readIf
(
"UNIQUE"
))
{
}
else
if
(
readIf
(
"UNIQUE"
))
{
AlterTableAddConstraint
unique
=
new
AlterTableAddConstraint
(
AlterTableAddConstraint
unique
=
new
AlterTableAddConstraint
(
session
,
schema
,
false
);
session
,
schema
,
false
);
...
@@ -6256,6 +6282,14 @@ public class Parser {
...
@@ -6256,6 +6282,14 @@ public class Parser {
return
command
;
return
command
;
}
}
private
CreateIndex
createAffinityIndex
(
Schema
schema
,
String
tableName
,
IndexColumn
[]
indexColumns
)
{
CreateIndex
idx
=
new
CreateIndex
(
session
,
schema
);
idx
.
setTableName
(
tableName
);
idx
.
setIndexColumns
(
indexColumns
);
idx
.
setAffinity
(
true
);
return
idx
;
}
private
static
int
getCompareType
(
int
tokenType
)
{
private
static
int
getCompareType
(
int
tokenType
)
{
switch
(
tokenType
)
{
switch
(
tokenType
)
{
case
EQUAL:
case
EQUAL:
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/command/ddl/CreateIndex.java
浏览文件 @
a4ce10d0
...
@@ -26,7 +26,7 @@ public class CreateIndex extends SchemaCommand {
...
@@ -26,7 +26,7 @@ public class CreateIndex extends SchemaCommand {
private
String
tableName
;
private
String
tableName
;
private
String
indexName
;
private
String
indexName
;
private
IndexColumn
[]
indexColumns
;
private
IndexColumn
[]
indexColumns
;
private
boolean
primaryKey
,
unique
,
hash
,
spatial
;
private
boolean
primaryKey
,
unique
,
hash
,
spatial
,
affinity
;
private
boolean
ifTableExists
;
private
boolean
ifTableExists
;
private
boolean
ifNotExists
;
private
boolean
ifNotExists
;
private
String
comment
;
private
String
comment
;
...
@@ -98,6 +98,8 @@ public class CreateIndex extends SchemaCommand {
...
@@ -98,6 +98,8 @@ public class CreateIndex extends SchemaCommand {
indexType
=
IndexType
.
createPrimaryKey
(
persistent
,
hash
);
indexType
=
IndexType
.
createPrimaryKey
(
persistent
,
hash
);
}
else
if
(
unique
)
{
}
else
if
(
unique
)
{
indexType
=
IndexType
.
createUnique
(
persistent
,
hash
);
indexType
=
IndexType
.
createUnique
(
persistent
,
hash
);
}
else
if
(
affinity
)
{
indexType
=
IndexType
.
createAffinity
();
}
else
{
}
else
{
indexType
=
IndexType
.
createNonUnique
(
persistent
,
hash
,
spatial
);
indexType
=
IndexType
.
createNonUnique
(
persistent
,
hash
,
spatial
);
}
}
...
@@ -123,6 +125,10 @@ public class CreateIndex extends SchemaCommand {
...
@@ -123,6 +125,10 @@ public class CreateIndex extends SchemaCommand {
this
.
spatial
=
b
;
this
.
spatial
=
b
;
}
}
public
void
setAffinity
(
boolean
b
)
{
this
.
affinity
=
b
;
}
public
void
setComment
(
String
comment
)
{
public
void
setComment
(
String
comment
)
{
this
.
comment
=
comment
;
this
.
comment
=
comment
;
}
}
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/command/ddl/CreateTableData.java
浏览文件 @
a4ce10d0
...
@@ -80,5 +80,4 @@ public class CreateTableData {
...
@@ -80,5 +80,4 @@ public class CreateTableData {
* The table is hidden.
* The table is hidden.
*/
*/
public
boolean
isHidden
;
public
boolean
isHidden
;
}
}
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/engine/Mode.java
浏览文件 @
a4ce10d0
...
@@ -155,6 +155,11 @@ public class Mode {
...
@@ -155,6 +155,11 @@ public class Mode {
*/
*/
public
boolean
prohibitEmptyInPredicate
;
public
boolean
prohibitEmptyInPredicate
;
/**
* Whether AFFINITY KEY keywords are supported.
*/
public
boolean
allowAffinityKey
;
private
final
String
name
;
private
final
String
name
;
static
{
static
{
...
@@ -252,6 +257,12 @@ public class Mode {
...
@@ -252,6 +257,12 @@ public class Mode {
Pattern
.
compile
(
"ApplicationName"
);
Pattern
.
compile
(
"ApplicationName"
);
mode
.
prohibitEmptyInPredicate
=
true
;
mode
.
prohibitEmptyInPredicate
=
true
;
add
(
mode
);
add
(
mode
);
mode
=
new
Mode
(
"Ignite"
);
mode
.
nullConcatIsNull
=
true
;
mode
.
allowAffinityKey
=
true
;
mode
.
indexDefinitionInCreateTable
=
true
;
add
(
mode
);
}
}
private
Mode
(
String
name
)
{
private
Mode
(
String
name
)
{
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/index/IndexType.java
浏览文件 @
a4ce10d0
...
@@ -10,7 +10,7 @@ package org.h2.index;
...
@@ -10,7 +10,7 @@ package org.h2.index;
*/
*/
public
class
IndexType
{
public
class
IndexType
{
private
boolean
primaryKey
,
persistent
,
unique
,
hash
,
scan
,
spatial
;
private
boolean
primaryKey
,
persistent
,
unique
,
hash
,
scan
,
spatial
,
affinity
;
private
boolean
belongsToConstraint
;
private
boolean
belongsToConstraint
;
/**
/**
...
@@ -71,6 +71,16 @@ public class IndexType {
...
@@ -71,6 +71,16 @@ public class IndexType {
return
type
;
return
type
;
}
}
/**
* Create an affinity index.
*
*/
public
static
IndexType
createAffinity
()
{
IndexType
type
=
new
IndexType
();
type
.
affinity
=
true
;
return
type
;
}
/**
/**
* Create a scan pseudo-index.
* Create a scan pseudo-index.
*
*
...
@@ -148,6 +158,15 @@ public class IndexType {
...
@@ -148,6 +158,15 @@ public class IndexType {
return
unique
;
return
unique
;
}
}
/**
* Does this index represent an affinity key?
*
* @return true if it does
*/
public
boolean
isAffinity
()
{
return
affinity
;
}
/**
/**
* Get the SQL snippet to create such an index.
* Get the SQL snippet to create such an index.
*
*
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/message/TraceSystem.java
浏览文件 @
a4ce10d0
...
@@ -146,6 +146,9 @@ public class TraceSystem implements TraceWriter {
...
@@ -146,6 +146,9 @@ public class TraceSystem implements TraceWriter {
@Override
@Override
public
boolean
isEnabled
(
int
level
)
{
public
boolean
isEnabled
(
int
level
)
{
if
(
levelMax
==
ADAPTER
)
{
return
writer
.
isEnabled
(
level
);
}
return
level
<=
this
.
levelMax
;
return
level
<=
this
.
levelMax
;
}
}
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/mvstore/WriteBuffer.java
浏览文件 @
a4ce10d0
...
@@ -185,7 +185,7 @@ public class WriteBuffer {
...
@@ -185,7 +185,7 @@ public class WriteBuffer {
* @return this
* @return this
*/
*/
public
WriteBuffer
put
(
ByteBuffer
src
)
{
public
WriteBuffer
put
(
ByteBuffer
src
)
{
ensureCapacity
(
buff
.
remaining
()).
put
(
src
);
ensureCapacity
(
src
.
remaining
()).
put
(
src
);
return
this
;
return
this
;
}
}
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/res/help.csv
浏览文件 @
a4ce10d0
...
@@ -149,9 +149,9 @@ ALTER VIEW [ IF EXISTS ] viewName RECOMPILE
...
@@ -149,9 +149,9 @@ ALTER VIEW [ IF EXISTS ] viewName RECOMPILE
","
","
Recompiles a view after the underlying tables have been changed or created."
Recompiles a view after the underlying tables have been changed or created."
"Commands (DDL)","ANALYZE","
"Commands (DDL)","ANALYZE","
ANALYZE [ SAMPLE_SIZE rowCountInt ]
ANALYZE [
TABLE tableName ] [
SAMPLE_SIZE rowCountInt ]
","
","
Updates the selectivity statistics of
all
tables."
Updates the selectivity statistics of tables."
"Commands (DDL)","COMMENT","
"Commands (DDL)","COMMENT","
COMMENT ON
COMMENT ON
{ { COLUMN [ schemaName. ] tableName.columnName }
{ { COLUMN [ schemaName. ] tableName.columnName }
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/table/JoinBatch.java
浏览文件 @
a4ce10d0
...
@@ -167,6 +167,9 @@ public final class JoinBatch {
...
@@ -167,6 +167,9 @@ public final class JoinBatch {
* @return column value for current row
* @return column value for current row
*/
*/
public
Value
getValue
(
int
filterId
,
Column
column
)
{
public
Value
getValue
(
int
filterId
,
Column
column
)
{
if
(
current
==
null
)
{
return
null
;
}
Object
x
=
current
.
row
(
filterId
);
Object
x
=
current
.
row
(
filterId
);
assert
x
!=
null
;
assert
x
!=
null
;
Row
row
=
current
.
isRow
(
filterId
)
?
(
Row
)
x
:
((
Cursor
)
x
).
get
();
Row
row
=
current
.
isRow
(
filterId
)
?
(
Row
)
x
:
((
Cursor
)
x
).
get
();
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/table/LinkSchema.java
浏览文件 @
a4ce10d0
...
@@ -52,7 +52,12 @@ public class LinkSchema {
...
@@ -52,7 +52,12 @@ public class LinkSchema {
stat
=
conn
.
createStatement
();
stat
=
conn
.
createStatement
();
stat
.
execute
(
"CREATE SCHEMA IF NOT EXISTS "
+
stat
.
execute
(
"CREATE SCHEMA IF NOT EXISTS "
+
StringUtils
.
quoteIdentifier
(
targetSchema
));
StringUtils
.
quoteIdentifier
(
targetSchema
));
//Workaround for PostgreSQL to avoid index names
if
(
url
.
startsWith
(
"jdbc:postgresql:"
))
{
rs
=
c2
.
getMetaData
().
getTables
(
null
,
sourceSchema
,
null
,
new
String
[]{
"TABLE"
,
"LINKED TABLE"
,
"VIEW"
,
"EXTERNAL"
});
}
else
{
rs
=
c2
.
getMetaData
().
getTables
(
null
,
sourceSchema
,
null
,
null
);
rs
=
c2
.
getMetaData
().
getTables
(
null
,
sourceSchema
,
null
,
null
);
}
while
(
rs
.
next
())
{
while
(
rs
.
next
())
{
String
table
=
rs
.
getString
(
"TABLE_NAME"
);
String
table
=
rs
.
getString
(
"TABLE_NAME"
);
StringBuilder
buff
=
new
StringBuilder
();
StringBuilder
buff
=
new
StringBuilder
();
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/table/MetaTable.java
浏览文件 @
a4ce10d0
...
@@ -200,7 +200,8 @@ public class MetaTable extends Table {
...
@@ -200,7 +200,8 @@ public class MetaTable extends Table {
"ID INT"
,
"ID INT"
,
"SORT_TYPE INT"
,
"SORT_TYPE INT"
,
"CONSTRAINT_NAME"
,
"CONSTRAINT_NAME"
,
"INDEX_CLASS"
"INDEX_CLASS"
,
"AFFINITY BIT"
);
);
indexColumnName
=
"TABLE_NAME"
;
indexColumnName
=
"TABLE_NAME"
;
break
;
break
;
...
@@ -912,7 +913,10 @@ public class MetaTable extends Table {
...
@@ -912,7 +913,10 @@ public class MetaTable extends Table {
// CONSTRAINT_NAME
// CONSTRAINT_NAME
constraintName
,
constraintName
,
// INDEX_CLASS
// INDEX_CLASS
indexClass
indexClass
,
// AFFINITY
index
.
getIndexType
().
isAffinity
()
?
"TRUE"
:
"FALSE"
);
);
}
}
}
}
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/table/TableLink.java
浏览文件 @
a4ce10d0
...
@@ -445,7 +445,8 @@ public class TableLink extends Table {
...
@@ -445,7 +445,8 @@ public class TableLink extends Table {
@Override
@Override
public
synchronized
long
getRowCount
(
Session
session
)
{
public
synchronized
long
getRowCount
(
Session
session
)
{
String
sql
=
"SELECT COUNT(*) FROM "
+
qualifiedTableName
;
//The foo alias is used to support the PostgreSQL syntax
String
sql
=
"SELECT COUNT(*) FROM "
+
qualifiedTableName
+
" as foo"
;
try
{
try
{
PreparedStatement
prep
=
execute
(
sql
,
null
,
false
);
PreparedStatement
prep
=
execute
(
sql
,
null
,
false
);
ResultSet
rs
=
prep
.
getResultSet
();
ResultSet
rs
=
prep
.
getResultSet
();
...
...
This diff is collapsed.
Click to expand it.
h2/src/test/org/h2/test/db/TestCompatibility.java
浏览文件 @
a4ce10d0
...
@@ -50,6 +50,7 @@ public class TestCompatibility extends TestBase {
...
@@ -50,6 +50,7 @@ public class TestCompatibility extends TestBase {
testDB2
();
testDB2
();
testDerby
();
testDerby
();
testSybaseAndMSSQLServer
();
testSybaseAndMSSQLServer
();
testIgnite
();
conn
.
close
();
conn
.
close
();
deleteDb
(
"compatibility"
);
deleteDb
(
"compatibility"
);
...
@@ -487,4 +488,26 @@ public class TestCompatibility extends TestBase {
...
@@ -487,4 +488,26 @@ public class TestCompatibility extends TestBase {
conn
.
close
();
conn
.
close
();
conn
=
getConnection
(
"compatibility"
);
conn
=
getConnection
(
"compatibility"
);
}
}
private
void
testIgnite
()
throws
SQLException
{
Statement
stat
=
conn
.
createStatement
();
stat
.
execute
(
"SET MODE Ignite"
);
stat
.
execute
(
"DROP TABLE IF EXISTS TEST"
);
stat
.
execute
(
"create table test(id int affinity key)"
);
stat
.
execute
(
"DROP TABLE IF EXISTS TEST"
);
stat
.
execute
(
"create table test(id int affinity primary key)"
);
stat
.
execute
(
"DROP TABLE IF EXISTS TEST"
);
stat
.
execute
(
"create table test(id int, v1 varchar, v2 long affinity key, primary key(v1, id))"
);
stat
.
execute
(
"DROP TABLE IF EXISTS TEST"
);
stat
.
execute
(
"create table test(id int, v1 varchar, v2 long, primary key(v1, id), affinity key (id))"
);
stat
.
execute
(
"DROP TABLE IF EXISTS TEST"
);
stat
.
execute
(
"create table test(id int shard key)"
);
stat
.
execute
(
"DROP TABLE IF EXISTS TEST"
);
stat
.
execute
(
"create table test(id int shard primary key)"
);
stat
.
execute
(
"DROP TABLE IF EXISTS TEST"
);
stat
.
execute
(
"create table test(id int, v1 varchar, v2 long shard key, primary key(v1, id))"
);
stat
.
execute
(
"DROP TABLE IF EXISTS TEST"
);
stat
.
execute
(
"create table test(id int, v1 varchar, v2 long, primary key(v1, id), shard key (id))"
);
}
}
}
This diff is collapsed.
Click to expand it.
h2/src/test/org/h2/test/db/TestQueryCache.java
浏览文件 @
a4ce10d0
...
@@ -38,30 +38,45 @@ public class TestQueryCache extends TestBase {
...
@@ -38,30 +38,45 @@ public class TestQueryCache extends TestBase {
private
void
test1
()
throws
Exception
{
private
void
test1
()
throws
Exception
{
Connection
conn
=
getConnection
(
"queryCache;QUERY_CACHE_SIZE=10"
);
Connection
conn
=
getConnection
(
"queryCache;QUERY_CACHE_SIZE=10"
);
Statement
stat
=
conn
.
createStatement
();
Statement
stat
=
conn
.
createStatement
();
stat
.
execute
(
"create table test(id int, name varchar) "
+
stat
.
execute
(
"create table test(id int, name varchar)"
);
"as select x, space(100) from system_range(1, 1000)"
);
PreparedStatement
prep
;
PreparedStatement
prep
;
conn
.
prepareStatement
(
"select count(*) from test t1, test t2"
);
// query execution may be fast here but the parsing must be slow
StringBuilder
queryBuilder
=
new
StringBuilder
(
"select count(*) from test t1 where \n"
);
for
(
int
i
=
0
;
i
<
1000
;
i
++)
{
if
(
i
!=
0
)
{
queryBuilder
.
append
(
" and "
);
}
queryBuilder
.
append
(
" TIMESTAMP '2005-12-31 23:59:59' = TIMESTAMP '2005-12-31 23:59:59' "
);
}
String
query
=
queryBuilder
.
toString
();
conn
.
prepareStatement
(
query
);
long
time
;
long
time
;
ResultSet
rs
;
ResultSet
rs
;
long
first
=
0
;
long
first
=
0
;
for
(
int
i
=
0
;
i
<
4
;
i
++)
{
// 1000 iterations to warm up and avoid JIT effects
for
(
int
i
=
0
;
i
<
1005
;
i
++)
{
// this should both ensure results are not re-used
// this should both ensure results are not re-used
// stat.execute("set mode regular");
// stat.execute("set mode regular");
// stat.execute("create table x()");
// stat.execute("create table x()");
// stat.execute("drop table x");
// stat.execute("drop table x");
time
=
System
.
nanoTime
();
time
=
System
.
nanoTime
();
prep
=
conn
.
prepareStatement
(
"select count(*) from test t1, test t2"
);
prep
=
conn
.
prepareStatement
(
query
);
execute
(
prep
);
execute
(
prep
);
rs
=
stat
.
executeQuery
(
"select count(*) from test t1, test t2"
);
prep
.
close
();
rs
=
stat
.
executeQuery
(
query
);
rs
.
next
();
rs
.
next
();
int
c
=
rs
.
getInt
(
1
);
int
c
=
rs
.
getInt
(
1
);
rs
.
close
();
rs
.
close
();
assertEquals
(
100000
0
,
c
);
assertEquals
(
0
,
c
);
time
=
System
.
nanoTime
()
-
time
;
time
=
System
.
nanoTime
()
-
time
;
if
(
first
==
0
)
{
if
(
i
==
1000
)
{
// take from cache and do not close, so that next iteration will have a cache miss
prep
=
conn
.
prepareStatement
(
query
);
}
else
if
(
i
==
1001
)
{
first
=
time
;
first
=
time
;
}
else
{
// try to avoid pauses in subsequent iterations
System
.
gc
();
}
else
if
(
i
>
1001
)
{
assertSmaller
(
time
,
first
);
assertSmaller
(
time
,
first
);
}
}
}
}
...
...
This diff is collapsed.
Click to expand it.
h2/src/test/org/h2/test/db/TestTableEngines.java
浏览文件 @
a4ce10d0
...
@@ -41,13 +41,7 @@ import org.h2.message.DbException;
...
@@ -41,13 +41,7 @@ import org.h2.message.DbException;
import
org.h2.result.Row
;
import
org.h2.result.Row
;
import
org.h2.result.SearchRow
;
import
org.h2.result.SearchRow
;
import
org.h2.result.SortOrder
;
import
org.h2.result.SortOrder
;
import
org.h2.table.Column
;
import
org.h2.table.*
;
import
org.h2.table.IndexColumn
;
import
org.h2.table.SubQueryInfo
;
import
org.h2.table.Table
;
import
org.h2.table.TableBase
;
import
org.h2.table.TableFilter
;
import
org.h2.table.TableType
;
import
org.h2.test.TestBase
;
import
org.h2.test.TestBase
;
import
org.h2.util.DoneFuture
;
import
org.h2.util.DoneFuture
;
import
org.h2.util.New
;
import
org.h2.util.New
;
...
@@ -82,6 +76,7 @@ public class TestTableEngines extends TestBase {
...
@@ -82,6 +76,7 @@ public class TestTableEngines extends TestBase {
testSimpleQuery
();
testSimpleQuery
();
testMultiColumnTreeSetIndex
();
testMultiColumnTreeSetIndex
();
testBatchedJoin
();
testBatchedJoin
();
testAffinityKey
();
}
}
private
void
testEarlyFilter
()
throws
SQLException
{
private
void
testEarlyFilter
()
throws
SQLException
{
...
@@ -504,6 +499,25 @@ public class TestTableEngines extends TestBase {
...
@@ -504,6 +499,25 @@ public class TestTableEngines extends TestBase {
deleteDb
(
"testBatchedJoin"
);
deleteDb
(
"testBatchedJoin"
);
}
}
private
void
testAffinityKey
()
throws
SQLException
{
deleteDb
(
"tableEngine"
);
Connection
conn
=
getConnection
(
"tableEngine;mode=Ignite;MV_STORE=FALSE"
);
Statement
stat
=
conn
.
createStatement
();
stat
.
executeUpdate
(
"CREATE TABLE T(ID INT AFFINITY PRIMARY KEY, NAME VARCHAR, AGE INT)"
+
" ENGINE \""
+
AffinityTableEngine
.
class
.
getName
()
+
"\""
);
Table
tbl
=
AffinityTableEngine
.
createdTbl
;
assertTrue
(
tbl
!=
null
);
assertEquals
(
3
,
tbl
.
getIndexes
().
size
());
Index
aff
=
tbl
.
getIndexes
().
get
(
2
);
assertTrue
(
aff
.
getIndexType
().
isAffinity
());
assertEquals
(
"T_AFF"
,
aff
.
getName
());
assertEquals
(
1
,
aff
.
getIndexColumns
().
length
);
assertEquals
(
"ID"
,
aff
.
getIndexColumns
()[
0
].
columnName
);
conn
.
close
();
deleteDb
(
"tableEngine"
);
}
private
static
void
forceJoinOrder
(
Statement
s
,
boolean
force
)
throws
SQLException
{
private
static
void
forceJoinOrder
(
Statement
s
,
boolean
force
)
throws
SQLException
{
s
.
executeUpdate
(
"SET FORCE_JOIN_ORDER "
+
force
);
s
.
executeUpdate
(
"SET FORCE_JOIN_ORDER "
+
force
);
}
}
...
@@ -1098,6 +1112,144 @@ public class TestTableEngines extends TestBase {
...
@@ -1098,6 +1112,144 @@ public class TestTableEngines extends TestBase {
}
}
/**
* A test table factory producing affinity aware tables.
*/
public
static
class
AffinityTableEngine
implements
TableEngine
{
public
static
Table
createdTbl
;
/**
* A table able to handle affinity indexes.
*/
private
static
class
AffinityTable
extends
RegularTable
{
/**
* A (no-op) affinity index.
*/
public
class
AffinityIndex
extends
BaseIndex
{
AffinityIndex
(
Table
table
,
int
id
,
String
name
,
IndexColumn
[]
newIndexColumns
)
{
initBaseIndex
(
table
,
id
,
name
,
newIndexColumns
,
IndexType
.
createAffinity
());
}
@Override
public
long
getRowCountApproximation
()
{
return
table
.
getRowCountApproximation
();
}
@Override
public
long
getDiskSpaceUsed
()
{
return
table
.
getDiskSpaceUsed
();
}
@Override
public
long
getRowCount
(
Session
session
)
{
return
table
.
getRowCount
(
session
);
}
@Override
public
void
checkRename
()
{
// do nothing
}
@Override
public
void
truncate
(
Session
session
)
{
// do nothing
}
@Override
public
void
remove
(
Session
session
)
{
// do nothing
}
@Override
public
void
remove
(
Session
session
,
Row
r
)
{
// do nothing
}
@Override
public
boolean
needRebuild
()
{
return
false
;
}
@Override
public
double
getCost
(
Session
session
,
int
[]
masks
,
TableFilter
[]
filters
,
int
filter
,
SortOrder
sortOrder
,
HashSet
<
Column
>
allColumnsSet
)
{
return
0
;
}
@Override
public
Cursor
findFirstOrLast
(
Session
session
,
boolean
first
)
{
throw
DbException
.
getUnsupportedException
(
"TEST"
);
}
@Override
public
Cursor
find
(
Session
session
,
SearchRow
first
,
SearchRow
last
)
{
throw
DbException
.
getUnsupportedException
(
"TEST"
);
}
@Override
public
void
close
(
Session
session
)
{
// do nothing
}
@Override
public
boolean
canGetFirstOrLast
()
{
return
false
;
}
@Override
public
void
add
(
Session
session
,
Row
r
)
{
// do nothing
}
}
AffinityTable
(
CreateTableData
data
)
{
super
(
data
);
}
@Override
public
Index
addIndex
(
Session
session
,
String
indexName
,
int
indexId
,
IndexColumn
[]
cols
,
IndexType
indexType
,
boolean
create
,
String
indexComment
)
{
if
(!
indexType
.
isAffinity
())
{
return
super
.
addIndex
(
session
,
indexName
,
indexId
,
cols
,
indexType
,
create
,
indexComment
);
}
boolean
isSessionTemporary
=
isTemporary
()
&&
!
isGlobalTemporary
();
if
(!
isSessionTemporary
)
{
database
.
lockMeta
(
session
);
}
AffinityIndex
index
=
new
AffinityIndex
(
this
,
indexId
,
getName
()
+
"_AFF"
,
cols
);
index
.
setTemporary
(
isTemporary
());
if
(
index
.
getCreateSQL
()
!=
null
)
{
index
.
setComment
(
indexComment
);
if
(
isSessionTemporary
)
{
session
.
addLocalTempTableIndex
(
index
);
}
else
{
database
.
addSchemaObject
(
session
,
index
);
}
}
getIndexes
().
add
(
index
);
setModified
();
return
index
;
}
}
/**
* Create a new OneRowTable.
*
* @param data the meta data of the table to create
* @return the new table
*/
@Override
public
Table
createTable
(
CreateTableData
data
)
{
return
(
createdTbl
=
new
AffinityTable
(
data
));
}
}
/**
/**
* A test table factory.
* A test table factory.
*/
*/
...
...
This diff is collapsed.
Click to expand it.
h2/src/test/org/h2/test/unit/TestTraceSystem.java
浏览文件 @
a4ce10d0
...
@@ -32,13 +32,19 @@ public class TestTraceSystem extends TestBase {
...
@@ -32,13 +32,19 @@ public class TestTraceSystem extends TestBase {
testAdapter
();
testAdapter
();
}
}
private
static
void
testAdapter
()
{
private
void
testAdapter
()
{
TraceSystem
ts
=
new
TraceSystem
(
null
);
TraceSystem
ts
=
new
TraceSystem
(
null
);
ts
.
setName
(
"test"
);
ts
.
setName
(
"test"
);
ts
.
setLevelFile
(
TraceSystem
.
ADAPTER
);
ts
.
setLevelFile
(
TraceSystem
.
ADAPTER
);
ts
.
getTrace
(
"test"
).
debug
(
"test"
);
ts
.
getTrace
(
"test"
).
debug
(
"test"
);
ts
.
getTrace
(
"test"
).
info
(
"test"
);
ts
.
getTrace
(
"test"
).
info
(
"test"
);
ts
.
getTrace
(
"test"
).
error
(
new
Exception
(),
"test"
);
ts
.
getTrace
(
"test"
).
error
(
new
Exception
(),
"test"
);
// The used SLF4J-nop logger has all log levels disabled,
// so this should be reflected in the trace system.
assertFalse
(
ts
.
isEnabled
(
TraceSystem
.
INFO
));
assertFalse
(
ts
.
getTrace
(
"test"
).
isInfoEnabled
());
ts
.
close
();
ts
.
close
();
}
}
...
...
This diff is collapsed.
Click to expand it.
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论