Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
为 GitLab 提交贡献
登录/注册
切换导航
H
h2database
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
Administrator
h2database
Commits
58a30eba
提交
58a30eba
authored
2月 09, 2018
作者:
Evgenij Ryazanov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Return generated keys only if explicitly requested
上级
6fc3314f
隐藏空白字符变更
内嵌
并排
正在显示
24 个修改的文件
包含
320 行增加
和
93 行删除
+320
-93
Command.java
h2/src/main/org/h2/command/Command.java
+4
-4
CommandInterface.java
h2/src/main/org/h2/command/CommandInterface.java
+8
-1
CommandList.java
h2/src/main/org/h2/command/CommandList.java
+1
-1
CommandRemote.java
h2/src/main/org/h2/command/CommandRemote.java
+24
-1
Insert.java
h2/src/main/org/h2/command/dml/Insert.java
+1
-0
Merge.java
h2/src/main/org/h2/command/dml/Merge.java
+1
-0
Constants.java
h2/src/main/org/h2/engine/Constants.java
+5
-0
Engine.java
h2/src/main/org/h2/engine/Engine.java
+2
-2
GeneratedKeys.java
h2/src/main/org/h2/engine/GeneratedKeys.java
+65
-5
Session.java
h2/src/main/org/h2/engine/Session.java
+10
-4
SessionRemote.java
h2/src/main/org/h2/engine/SessionRemote.java
+5
-5
SessionWithState.java
h2/src/main/org/h2/engine/SessionWithState.java
+1
-1
FullText.java
h2/src/main/org/h2/fulltext/FullText.java
+5
-2
JdbcCallableStatement.java
h2/src/main/org/h2/jdbc/JdbcCallableStatement.java
+1
-1
JdbcConnection.java
h2/src/main/org/h2/jdbc/JdbcConnection.java
+41
-19
JdbcPreparedStatement.java
h2/src/main/org/h2/jdbc/JdbcPreparedStatement.java
+5
-3
JdbcSavepoint.java
h2/src/main/org/h2/jdbc/JdbcSavepoint.java
+1
-1
JdbcStatement.java
h2/src/main/org/h2/jdbc/JdbcStatement.java
+17
-17
TcpServerThread.java
h2/src/main/org/h2/server/TcpServerThread.java
+38
-7
WebApp.java
h2/src/main/org/h2/server/web/WebApp.java
+4
-4
FileLock.java
h2/src/main/org/h2/store/FileLock.java
+1
-1
TestPreparedStatement.java
h2/src/test/org/h2/test/jdbc/TestPreparedStatement.java
+68
-8
TestResultSet.java
h2/src/test/org/h2/test/jdbc/TestResultSet.java
+4
-2
TestStatement.java
h2/src/test/org/h2/test/jdbc/TestStatement.java
+8
-4
没有找到文件。
h2/src/main/org/h2/command/Command.java
浏览文件 @
58a30eba
...
...
@@ -149,7 +149,7 @@ public abstract class Command implements CommandInterface {
@Override
public
void
stop
()
{
session
.
endStatement
();
session
.
setCurrentCommand
(
null
);
session
.
setCurrentCommand
(
null
,
false
);
if
(!
isTransactional
())
{
session
.
commit
(
true
);
}
else
if
(
session
.
getAutoCommit
())
{
...
...
@@ -193,7 +193,7 @@ public abstract class Command implements CommandInterface {
}
}
synchronized
(
sync
)
{
session
.
setCurrentCommand
(
this
);
session
.
setCurrentCommand
(
this
,
false
);
try
{
while
(
true
)
{
database
.
checkPowerOff
();
...
...
@@ -238,7 +238,7 @@ public abstract class Command implements CommandInterface {
}
@Override
public
int
executeUpdate
()
{
public
int
executeUpdate
(
Object
generatedKeysRequest
)
{
long
start
=
0
;
Database
database
=
session
.
getDatabase
();
Object
sync
=
database
.
isMultiThreaded
()
?
(
Object
)
session
:
(
Object
)
database
;
...
...
@@ -252,7 +252,7 @@ public abstract class Command implements CommandInterface {
}
synchronized
(
sync
)
{
Session
.
Savepoint
rollback
=
session
.
setSavepoint
();
session
.
setCurrentCommand
(
this
);
session
.
setCurrentCommand
(
this
,
generatedKeysRequest
);
try
{
while
(
true
)
{
database
.
checkPowerOff
();
...
...
h2/src/main/org/h2/command/CommandInterface.java
浏览文件 @
58a30eba
...
...
@@ -510,9 +510,16 @@ public interface CommandInterface {
/**
* Execute the statement
*
* @param generatedKeysRequest
* {@code false} if generated keys are not needed, {@code true} if
* generated keys should be configured automatically, {@code int[]}
* to specify column indices to return generated keys from, or
* {@code String[]} to specify column names to return generated keys
* from
*
* @return the update count
*/
int
executeUpdate
();
int
executeUpdate
(
Object
generatedKeysRequest
);
/**
* Stop the command execution, release all locks and resources
...
...
h2/src/main/org/h2/command/CommandList.java
浏览文件 @
58a30eba
...
...
@@ -39,7 +39,7 @@ class CommandList extends Command {
@Override
public
int
update
()
{
int
updateCount
=
command
.
executeUpdate
();
int
updateCount
=
command
.
executeUpdate
(
false
);
executeRemaining
();
return
updateCount
;
}
...
...
h2/src/main/org/h2/command/CommandRemote.java
浏览文件 @
58a30eba
...
...
@@ -194,7 +194,7 @@ public class CommandRemote implements CommandInterface {
}
@Override
public
int
executeUpdate
()
{
public
int
executeUpdate
(
Object
generatedKeys
)
{
checkParameters
();
synchronized
(
session
)
{
int
updateCount
=
0
;
...
...
@@ -206,6 +206,29 @@ public class CommandRemote implements CommandInterface {
session
.
traceOperation
(
"COMMAND_EXECUTE_UPDATE"
,
id
);
transfer
.
writeInt
(
SessionRemote
.
COMMAND_EXECUTE_UPDATE
).
writeInt
(
id
);
sendParameters
(
transfer
);
if
(
session
.
getClientVersion
()
>=
Constants
.
TCP_PROTOCOL_VERSION_17
)
{
if
(
Boolean
.
FALSE
.
equals
(
generatedKeys
))
{
transfer
.
writeInt
(
0
);
}
else
if
(
Boolean
.
TRUE
.
equals
(
generatedKeys
))
{
transfer
.
writeInt
(
1
);
}
else
if
(
generatedKeys
instanceof
int
[])
{
int
[]
keys
=
(
int
[])
generatedKeys
;
transfer
.
writeInt
(
2
);
transfer
.
writeInt
(
keys
.
length
);
for
(
int
key
:
keys
)
{
transfer
.
writeInt
(
key
);
}
}
else
if
(
generatedKeys
instanceof
String
[])
{
String
[]
keys
=
(
String
[])
generatedKeys
;
transfer
.
writeInt
(
3
);
transfer
.
writeInt
(
keys
.
length
);
for
(
String
key
:
keys
)
{
transfer
.
writeString
(
key
);
}
}
else
{
transfer
.
writeInt
(
0
);
}
}
session
.
done
(
transfer
);
updateCount
=
transfer
.
readInt
();
autoCommit
=
transfer
.
readBoolean
();
...
...
h2/src/main/org/h2/command/dml/Insert.java
浏览文件 @
58a30eba
...
...
@@ -148,6 +148,7 @@ public class Insert extends Prepared implements ResultTarget {
if
(
listSize
>
0
)
{
int
columnLen
=
columns
.
length
;
GeneratedKeys
generatedKeys
=
session
.
getGeneratedKeys
();
generatedKeys
.
initialize
(
table
);
for
(
int
x
=
0
;
x
<
listSize
;
x
++)
{
session
.
startStatementWithinTransaction
();
generatedKeys
.
nextRow
();
...
...
h2/src/main/org/h2/command/dml/Merge.java
浏览文件 @
58a30eba
...
...
@@ -90,6 +90,7 @@ public class Merge extends Prepared {
// process values in list
count
=
0
;
GeneratedKeys
generatedKeys
=
session
.
getGeneratedKeys
();
generatedKeys
.
initialize
(
targetTable
);
for
(
int
x
=
0
,
size
=
valuesExpressionList
.
size
();
x
<
size
;
x
++)
{
setCurrentRowNumber
(
x
+
1
);
generatedKeys
.
nextRow
();
...
...
h2/src/main/org/h2/engine/Constants.java
浏览文件 @
58a30eba
...
...
@@ -100,6 +100,11 @@ public class Constants {
*/
public
static
final
int
TCP_PROTOCOL_VERSION_16
=
16
;
/**
* The TCP protocol version number 17.
*/
public
static
final
int
TCP_PROTOCOL_VERSION_17
=
17
;
/**
* The major version of this database.
*/
...
...
h2/src/main/org/h2/engine/Engine.java
浏览文件 @
58a30eba
...
...
@@ -203,7 +203,7 @@ public class Engine implements SessionFactory {
CommandInterface
command
=
session
.
prepareCommand
(
"SET "
+
Parser
.
quoteIdentifier
(
setting
)
+
" "
+
value
,
Integer
.
MAX_VALUE
);
command
.
executeUpdate
();
command
.
executeUpdate
(
false
);
}
catch
(
DbException
e
)
{
if
(
e
.
getErrorCode
()
==
ErrorCode
.
ADMIN_RIGHTS_REQUIRED
)
{
session
.
getTrace
().
error
(
e
,
"admin rights required; user: \""
+
...
...
@@ -221,7 +221,7 @@ public class Engine implements SessionFactory {
try
{
CommandInterface
command
=
session
.
prepareCommand
(
init
,
Integer
.
MAX_VALUE
);
command
.
executeUpdate
();
command
.
executeUpdate
(
false
);
}
catch
(
DbException
e
)
{
if
(!
ignoreUnknownSetting
)
{
session
.
close
();
...
...
h2/src/main/org/h2/engine/GeneratedKeys.java
浏览文件 @
58a30eba
...
...
@@ -10,7 +10,9 @@ import java.util.Collections;
import
java.util.HashMap
;
import
java.util.Map
;
import
org.h2.message.DbException
;
import
org.h2.table.Column
;
import
org.h2.table.Table
;
import
org.h2.tools.SimpleResultSet
;
import
org.h2.util.MathUtils
;
import
org.h2.util.New
;
...
...
@@ -27,18 +29,34 @@ public final class GeneratedKeys {
private
final
ArrayList
<
Column
>
columns
=
New
.
arrayList
();
private
Object
generatedKeysRequest
;
private
Table
table
;
public
void
add
(
Column
column
,
Value
value
)
{
if
(
Boolean
.
FALSE
.
equals
(
generatedKeysRequest
))
{
return
;
}
row
.
add
(
column
);
row
.
add
(
value
.
getObject
());
}
public
void
clear
()
{
public
void
clear
(
Object
generatedKeysRequest
)
{
this
.
generatedKeysRequest
=
generatedKeysRequest
;
data
.
clear
();
row
.
clear
();
columns
.
clear
();
table
=
null
;
}
public
void
initialize
(
Table
table
)
{
this
.
table
=
table
;
}
public
void
confirmRow
()
{
if
(
Boolean
.
FALSE
.
equals
(
generatedKeysRequest
))
{
return
;
}
int
size
=
row
.
size
();
if
(
size
>
0
)
{
if
(
size
==
2
)
{
...
...
@@ -64,14 +82,56 @@ public final class GeneratedKeys {
public
SimpleResultSet
getKeys
()
{
SimpleResultSet
rs
=
new
SimpleResultSet
();
for
(
Column
column
:
columns
)
{
rs
.
addColumn
(
column
.
getName
(),
DataType
.
convertTypeToSQLType
(
column
.
getType
()),
MathUtils
.
convertLongToInt
(
column
.
getPrecision
()),
column
.
getScale
());
if
(
Boolean
.
FALSE
.
equals
(
generatedKeysRequest
))
{
return
rs
;
}
if
(
Boolean
.
TRUE
.
equals
(
generatedKeysRequest
))
{
for
(
Column
column
:
columns
)
{
rs
.
addColumn
(
column
.
getName
(),
DataType
.
convertTypeToSQLType
(
column
.
getType
()),
MathUtils
.
convertLongToInt
(
column
.
getPrecision
()),
column
.
getScale
());
}
}
else
if
(
generatedKeysRequest
instanceof
int
[])
{
if
(
table
!=
null
)
{
int
[]
indices
=
(
int
[])
generatedKeysRequest
;
Column
[]
columns
=
table
.
getColumns
();
int
cnt
=
columns
.
length
;
for
(
int
idx
:
indices
)
{
if
(
idx
>=
1
&&
idx
<=
cnt
)
{
Column
column
=
columns
[
idx
-
1
];
rs
.
addColumn
(
column
.
getName
(),
DataType
.
convertTypeToSQLType
(
column
.
getType
()),
MathUtils
.
convertLongToInt
(
column
.
getPrecision
()),
column
.
getScale
());
}
}
}
else
{
return
rs
;
}
}
else
if
(
generatedKeysRequest
instanceof
String
[])
{
if
(
table
!=
null
)
{
String
[]
names
=
(
String
[])
generatedKeysRequest
;
for
(
String
name
:
names
)
{
try
{
Column
column
=
table
.
getColumn
(
name
);
rs
.
addColumn
(
column
.
getName
(),
DataType
.
convertTypeToSQLType
(
column
.
getType
()),
MathUtils
.
convertLongToInt
(
column
.
getPrecision
()),
column
.
getScale
());
}
catch
(
DbException
e
)
{
}
}
}
else
{
return
rs
;
}
}
else
{
return
rs
;
}
if
(
rs
.
getColumnCount
()
==
0
)
{
return
rs
;
}
for
(
Map
<
Column
,
Object
>
map
:
data
)
{
Object
[]
row
=
new
Object
[
columns
.
size
()];
for
(
Map
.
Entry
<
Column
,
Object
>
entry
:
map
.
entrySet
())
{
row
[
columns
.
indexOf
(
entry
.
getKey
())]
=
entry
.
getValue
();
int
idx
=
columns
.
indexOf
(
entry
.
getKey
());
if
(
idx
>=
0
)
{
row
[
idx
]
=
entry
.
getValue
();
}
}
rs
.
addRow
(
row
);
}
...
...
h2/src/main/org/h2/engine/Session.java
浏览文件 @
58a30eba
...
...
@@ -1245,13 +1245,19 @@ public class Session extends SessionWithState {
* executing the statement.
*
* @param command the command
*/
public
void
setCurrentCommand
(
Command
command
)
{
* @param generated keys request
* {@code false} if generated keys are not needed, {@code true} if
* generated keys should be configured automatically, {@code int[]}
* to specify column indices to return generated keys from, or
* {@code String[]} to specify column names to return generated keys
* from
*/
public
void
setCurrentCommand
(
Command
command
,
Object
generatedKeysRequest
)
{
this
.
currentCommand
=
command
;
// Preserve generated keys in case of a new query so they can be read with
// CALL GET_GENERATED_KEYS()
if
(
command
!=
null
&&
!
command
.
isQuery
()
&&
generatedKeys
!=
null
)
{
ge
neratedKeys
.
clear
(
);
if
(
command
!=
null
&&
!
command
.
isQuery
())
{
ge
tGeneratedKeys
().
clear
(
generatedKeysRequest
);
}
if
(
queryTimeout
>
0
&&
command
!=
null
)
{
currentCommandStart
=
System
.
currentTimeMillis
();
...
...
h2/src/main/org/h2/engine/SessionRemote.java
浏览文件 @
58a30eba
...
...
@@ -118,7 +118,7 @@ public class SessionRemote extends SessionWithState implements DataHandler {
trans
.
setSSL
(
ci
.
isSSL
());
trans
.
init
();
trans
.
writeInt
(
Constants
.
TCP_PROTOCOL_VERSION_6
);
trans
.
writeInt
(
Constants
.
TCP_PROTOCOL_VERSION_1
6
);
trans
.
writeInt
(
Constants
.
TCP_PROTOCOL_VERSION_1
7
);
trans
.
writeString
(
db
);
trans
.
writeString
(
ci
.
getOriginalURL
());
trans
.
writeString
(
ci
.
getUserName
());
...
...
@@ -210,7 +210,7 @@ public class SessionRemote extends SessionWithState implements DataHandler {
CommandInterface
c
=
prepareCommand
(
"SET CLUSTER "
+
serverList
,
Integer
.
MAX_VALUE
);
// this will set autoCommit to false
c
.
executeUpdate
();
c
.
executeUpdate
(
false
);
// so we need to switch it on
autoCommit
=
true
;
cluster
=
true
;
...
...
@@ -265,13 +265,13 @@ public class SessionRemote extends SessionWithState implements DataHandler {
autoCommitTrue
=
prepareCommand
(
"SET AUTOCOMMIT TRUE"
,
Integer
.
MAX_VALUE
);
}
autoCommitTrue
.
executeUpdate
();
autoCommitTrue
.
executeUpdate
(
false
);
}
else
{
if
(
autoCommitFalse
==
null
)
{
autoCommitFalse
=
prepareCommand
(
"SET AUTOCOMMIT FALSE"
,
Integer
.
MAX_VALUE
);
}
autoCommitFalse
.
executeUpdate
();
autoCommitFalse
.
executeUpdate
(
false
);
}
}
}
...
...
@@ -468,7 +468,7 @@ public class SessionRemote extends SessionWithState implements DataHandler {
private
void
switchOffCluster
()
{
CommandInterface
ci
=
prepareCommand
(
"SET CLUSTER ''"
,
Integer
.
MAX_VALUE
);
ci
.
executeUpdate
();
ci
.
executeUpdate
(
false
);
}
/**
...
...
h2/src/main/org/h2/engine/SessionWithState.java
浏览文件 @
58a30eba
...
...
@@ -29,7 +29,7 @@ abstract class SessionWithState implements SessionInterface {
try
{
for
(
String
sql
:
sessionState
)
{
CommandInterface
ci
=
prepareCommand
(
sql
,
Integer
.
MAX_VALUE
);
ci
.
executeUpdate
();
ci
.
executeUpdate
(
false
);
}
}
finally
{
sessionStateUpdating
=
false
;
...
...
h2/src/main/org/h2/fulltext/FullText.java
浏览文件 @
58a30eba
...
...
@@ -950,7 +950,8 @@ public class FullText {
useOwnConnection
=
isMultiThread
(
conn
);
if
(!
useOwnConnection
)
{
for
(
int
i
=
0
;
i
<
SQL
.
length
;
i
++)
{
prepStatements
[
i
]
=
conn
.
prepareStatement
(
SQL
[
i
]);
prepStatements
[
i
]
=
conn
.
prepareStatement
(
SQL
[
i
],
Statement
.
RETURN_GENERATED_KEYS
);
}
}
}
...
...
@@ -1154,7 +1155,9 @@ public class FullText {
}
private
PreparedStatement
getStatement
(
Connection
conn
,
int
index
)
throws
SQLException
{
return
useOwnConnection
?
conn
.
prepareStatement
(
SQL
[
index
])
:
prepStatements
[
index
];
return
useOwnConnection
?
conn
.
prepareStatement
(
SQL
[
index
],
Statement
.
RETURN_GENERATED_KEYS
)
:
prepStatements
[
index
];
}
}
...
...
h2/src/main/org/h2/jdbc/JdbcCallableStatement.java
浏览文件 @
58a30eba
...
...
@@ -47,7 +47,7 @@ public class JdbcCallableStatement extends JdbcPreparedStatement implements
JdbcCallableStatement
(
JdbcConnection
conn
,
String
sql
,
int
id
,
int
resultSetType
,
int
resultSetConcurrency
)
{
super
(
conn
,
sql
,
id
,
resultSetType
,
resultSetConcurrency
,
false
);
super
(
conn
,
sql
,
id
,
resultSetType
,
resultSetConcurrency
,
false
,
false
);
setTrace
(
session
.
getTrace
(),
TraceObject
.
CALLABLE_STATEMENT
,
id
);
}
...
...
h2/src/main/org/h2/jdbc/JdbcConnection.java
浏览文件 @
58a30eba
...
...
@@ -300,7 +300,7 @@ public class JdbcConnection extends TraceObject
sql
=
translateSQL
(
sql
);
return
new
JdbcPreparedStatement
(
this
,
sql
,
id
,
ResultSet
.
TYPE_FORWARD_ONLY
,
Constants
.
DEFAULT_RESULT_SET_CONCURRENCY
,
false
);
Constants
.
DEFAULT_RESULT_SET_CONCURRENCY
,
false
,
false
);
}
catch
(
Exception
e
)
{
throw
logAndConvert
(
e
);
}
...
...
@@ -326,7 +326,7 @@ public class JdbcConnection extends TraceObject
sql
=
translateSQL
(
sql
);
return
new
JdbcPreparedStatement
(
this
,
sql
,
id
,
ResultSet
.
TYPE_FORWARD_ONLY
,
Constants
.
DEFAULT_RESULT_SET_CONCURRENCY
,
true
);
Constants
.
DEFAULT_RESULT_SET_CONCURRENCY
,
true
,
false
);
}
catch
(
Exception
e
)
{
throw
logAndConvert
(
e
);
}
...
...
@@ -491,7 +491,7 @@ public class JdbcConnection extends TraceObject
checkClosedForWrite
();
try
{
commit
=
prepareCommand
(
"COMMIT"
,
commit
);
commit
.
executeUpdate
();
commit
.
executeUpdate
(
false
);
}
finally
{
afterWriting
();
}
...
...
@@ -689,7 +689,7 @@ public class JdbcConnection extends TraceObject
checkClosed
();
sql
=
translateSQL
(
sql
);
return
new
JdbcPreparedStatement
(
this
,
sql
,
id
,
resultSetType
,
resultSetConcurrency
,
false
);
resultSetConcurrency
,
false
,
false
);
}
catch
(
Exception
e
)
{
throw
logAndConvert
(
e
);
}
...
...
@@ -744,7 +744,7 @@ public class JdbcConnection extends TraceObject
setLockMode
=
prepareCommand
(
"SET LOCK_MODE ?"
,
setLockMode
);
setLockMode
.
getParameters
().
get
(
0
).
setValue
(
ValueInt
.
get
(
lockMode
),
false
);
setLockMode
.
executeUpdate
();
setLockMode
.
executeUpdate
(
false
);
}
catch
(
Exception
e
)
{
throw
logAndConvert
(
e
);
}
...
...
@@ -761,7 +761,7 @@ public class JdbcConnection extends TraceObject
setQueryTimeout
);
setQueryTimeout
.
getParameters
().
get
(
0
)
.
setValue
(
ValueInt
.
get
(
seconds
*
1000
),
false
);
setQueryTimeout
.
executeUpdate
();
setQueryTimeout
.
executeUpdate
(
false
);
queryTimeoutCache
=
seconds
;
}
catch
(
Exception
e
)
{
throw
logAndConvert
(
e
);
...
...
@@ -1017,7 +1017,7 @@ public class JdbcConnection extends TraceObject
CommandInterface
set
=
prepareCommand
(
"SAVEPOINT "
+
JdbcSavepoint
.
getName
(
null
,
savepointId
),
Integer
.
MAX_VALUE
);
set
.
executeUpdate
();
set
.
executeUpdate
(
false
);
JdbcSavepoint
savepoint
=
new
JdbcSavepoint
(
this
,
savepointId
,
null
,
trace
,
id
);
savepointId
++;
...
...
@@ -1045,7 +1045,7 @@ public class JdbcConnection extends TraceObject
CommandInterface
set
=
prepareCommand
(
"SAVEPOINT "
+
JdbcSavepoint
.
getName
(
name
,
0
),
Integer
.
MAX_VALUE
);
set
.
executeUpdate
();
set
.
executeUpdate
(
false
);
JdbcSavepoint
savepoint
=
new
JdbcSavepoint
(
this
,
0
,
name
,
trace
,
id
);
return
savepoint
;
...
...
@@ -1131,7 +1131,7 @@ public class JdbcConnection extends TraceObject
checkClosed
();
sql
=
translateSQL
(
sql
);
return
new
JdbcPreparedStatement
(
this
,
sql
,
id
,
resultSetType
,
resultSetConcurrency
,
false
);
resultSetConcurrency
,
false
,
false
);
}
catch
(
Exception
e
)
{
throw
logAndConvert
(
e
);
}
...
...
@@ -1151,11 +1151,19 @@ public class JdbcConnection extends TraceObject
public
PreparedStatement
prepareStatement
(
String
sql
,
int
autoGeneratedKeys
)
throws
SQLException
{
try
{
int
id
=
getNextId
(
TraceObject
.
PREPARED_STATEMENT
);
if
(
isDebugEnabled
())
{
debugCode
(
"prepareStatement("
+
quote
(
sql
)
+
", "
+
autoGeneratedKeys
+
");"
);
debugCodeAssign
(
"PreparedStatement"
,
TraceObject
.
PREPARED_STATEMENT
,
id
,
"prepareStatement("
+
quote
(
sql
)
+
", "
+
autoGeneratedKeys
+
");"
);
}
return
prepareStatement
(
sql
);
checkClosed
();
sql
=
translateSQL
(
sql
);
return
new
JdbcPreparedStatement
(
this
,
sql
,
id
,
ResultSet
.
TYPE_FORWARD_ONLY
,
Constants
.
DEFAULT_RESULT_SET_CONCURRENCY
,
false
,
autoGeneratedKeys
==
Statement
.
RETURN_GENERATED_KEYS
);
}
catch
(
Exception
e
)
{
throw
logAndConvert
(
e
);
}
...
...
@@ -1175,11 +1183,18 @@ public class JdbcConnection extends TraceObject
public
PreparedStatement
prepareStatement
(
String
sql
,
int
[]
columnIndexes
)
throws
SQLException
{
try
{
int
id
=
getNextId
(
TraceObject
.
PREPARED_STATEMENT
);
if
(
isDebugEnabled
())
{
debugCode
(
"prepareStatement("
+
quote
(
sql
)
+
", "
+
quoteIntArray
(
columnIndexes
)
+
");"
);
debugCodeAssign
(
"PreparedStatement"
,
TraceObject
.
PREPARED_STATEMENT
,
id
,
"prepareStatement("
+
quote
(
sql
)
+
", "
+
quoteIntArray
(
columnIndexes
)
+
");"
);
}
return
prepareStatement
(
sql
);
checkClosed
();
sql
=
translateSQL
(
sql
);
return
new
JdbcPreparedStatement
(
this
,
sql
,
id
,
ResultSet
.
TYPE_FORWARD_ONLY
,
Constants
.
DEFAULT_RESULT_SET_CONCURRENCY
,
false
,
columnIndexes
);
}
catch
(
Exception
e
)
{
throw
logAndConvert
(
e
);
}
...
...
@@ -1199,11 +1214,18 @@ public class JdbcConnection extends TraceObject
public
PreparedStatement
prepareStatement
(
String
sql
,
String
[]
columnNames
)
throws
SQLException
{
try
{
int
id
=
getNextId
(
TraceObject
.
PREPARED_STATEMENT
);
if
(
isDebugEnabled
())
{
debugCode
(
"prepareStatement("
+
quote
(
sql
)
+
", "
+
quoteArray
(
columnNames
)
+
");"
);
debugCodeAssign
(
"PreparedStatement"
,
TraceObject
.
PREPARED_STATEMENT
,
id
,
"prepareStatement("
+
quote
(
sql
)
+
", "
+
quoteArray
(
columnNames
)
+
");"
);
}
return
prepareStatement
(
sql
);
checkClosed
();
sql
=
translateSQL
(
sql
);
return
new
JdbcPreparedStatement
(
this
,
sql
,
id
,
ResultSet
.
TYPE_FORWARD_ONLY
,
Constants
.
DEFAULT_RESULT_SET_CONCURRENCY
,
false
,
columnNames
);
}
catch
(
Exception
e
)
{
throw
logAndConvert
(
e
);
}
...
...
@@ -1530,7 +1552,7 @@ public class JdbcConnection extends TraceObject
private
void
rollbackInternal
()
{
rollback
=
prepareCommand
(
"ROLLBACK"
,
rollback
);
rollback
.
executeUpdate
();
rollback
.
executeUpdate
(
false
);
}
/**
...
...
h2/src/main/org/h2/jdbc/JdbcPreparedStatement.java
浏览文件 @
58a30eba
...
...
@@ -63,11 +63,13 @@ public class JdbcPreparedStatement extends JdbcStatement implements
private
ArrayList
<
Value
[]>
batchParameters
;
private
MergedResultSet
batchIdentities
;
private
HashMap
<
String
,
Integer
>
cachedColumnLabelMap
;
private
final
Object
generatedKeysRequest
;
JdbcPreparedStatement
(
JdbcConnection
conn
,
String
sql
,
int
id
,
int
resultSetType
,
int
resultSetConcurrency
,
boolean
closeWithResultSet
)
{
boolean
closeWithResultSet
,
Object
generatedKeysRequest
)
{
super
(
conn
,
id
,
resultSetType
,
resultSetConcurrency
,
closeWithResultSet
);
this
.
generatedKeysRequest
=
generatedKeysRequest
;
setTrace
(
session
.
getTrace
(),
TraceObject
.
PREPARED_STATEMENT
,
id
);
this
.
sqlStatement
=
sql
;
command
=
conn
.
prepareCommand
(
sql
,
fetchSize
);
...
...
@@ -193,7 +195,7 @@ public class JdbcPreparedStatement extends JdbcStatement implements
synchronized
(
session
)
{
try
{
setExecutingStatement
(
command
);
updateCount
=
command
.
executeUpdate
();
updateCount
=
command
.
executeUpdate
(
generatedKeysRequest
);
}
finally
{
setExecutingStatement
(
null
);
}
...
...
@@ -236,7 +238,7 @@ public class JdbcPreparedStatement extends JdbcStatement implements
updatable
,
cachedColumnLabelMap
);
}
else
{
returnsResultSet
=
false
;
updateCount
=
command
.
executeUpdate
();
updateCount
=
command
.
executeUpdate
(
generatedKeysRequest
);
}
}
finally
{
if
(!
lazy
)
{
...
...
h2/src/main/org/h2/jdbc/JdbcSavepoint.java
浏览文件 @
58a30eba
...
...
@@ -65,7 +65,7 @@ public class JdbcSavepoint extends TraceObject implements Savepoint {
checkValid
();
conn
.
prepareCommand
(
"ROLLBACK TO SAVEPOINT "
+
getName
(
name
,
savepointId
),
Integer
.
MAX_VALUE
).
executeUpdate
();
Integer
.
MAX_VALUE
).
executeUpdate
(
false
);
}
private
void
checkValid
()
{
...
...
h2/src/main/org/h2/jdbc/JdbcStatement.java
浏览文件 @
58a30eba
...
...
@@ -120,7 +120,7 @@ public class JdbcStatement extends TraceObject implements Statement, JdbcStateme
public
int
executeUpdate
(
String
sql
)
throws
SQLException
{
try
{
debugCodeCall
(
"executeUpdate"
,
sql
);
return
executeUpdateInternal
(
sql
);
return
executeUpdateInternal
(
sql
,
false
);
}
catch
(
Exception
e
)
{
throw
logAndConvert
(
e
);
}
...
...
@@ -148,13 +148,13 @@ public class JdbcStatement extends TraceObject implements Statement, JdbcStateme
public
long
executeLargeUpdate
(
String
sql
)
throws
SQLException
{
try
{
debugCodeCall
(
"executeLargeUpdate"
,
sql
);
return
executeUpdateInternal
(
sql
);
return
executeUpdateInternal
(
sql
,
false
);
}
catch
(
Exception
e
)
{
throw
logAndConvert
(
e
);
}
}
private
int
executeUpdateInternal
(
String
sql
)
throws
SQLException
{
private
int
executeUpdateInternal
(
String
sql
,
Object
generatedKeysRequest
)
throws
SQLException
{
checkClosedForWrite
();
try
{
closeOldResultSet
();
...
...
@@ -163,7 +163,7 @@ public class JdbcStatement extends TraceObject implements Statement, JdbcStateme
synchronized
(
session
)
{
setExecutingStatement
(
command
);
try
{
updateCount
=
command
.
executeUpdate
();
updateCount
=
command
.
executeUpdate
(
generatedKeysRequest
);
}
finally
{
setExecutingStatement
(
null
);
}
...
...
@@ -191,13 +191,13 @@ public class JdbcStatement extends TraceObject implements Statement, JdbcStateme
public
boolean
execute
(
String
sql
)
throws
SQLException
{
try
{
debugCodeCall
(
"execute"
,
sql
);
return
executeInternal
(
sql
);
return
executeInternal
(
sql
,
false
);
}
catch
(
Exception
e
)
{
throw
logAndConvert
(
e
);
}
}
private
boolean
executeInternal
(
String
sql
)
throws
SQLException
{
private
boolean
executeInternal
(
String
sql
,
Object
generatedKeysRequest
)
throws
SQLException
{
int
id
=
getNextId
(
TraceObject
.
RESULT_SET
);
checkClosedForWrite
();
try
{
...
...
@@ -219,7 +219,7 @@ public class JdbcStatement extends TraceObject implements Statement, JdbcStateme
closedByResultSet
,
scrollable
,
updatable
);
}
else
{
returnsResultSet
=
false
;
updateCount
=
command
.
executeUpdate
();
updateCount
=
command
.
executeUpdate
(
generatedKeysRequest
);
}
}
finally
{
if
(!
lazy
)
{
...
...
@@ -756,7 +756,7 @@ public class JdbcStatement extends TraceObject implements Statement, JdbcStateme
for
(
int
i
=
0
;
i
<
size
;
i
++)
{
String
sql
=
batchCommands
.
get
(
i
);
try
{
result
[
i
]
=
executeUpdateInternal
(
sql
);
result
[
i
]
=
executeUpdateInternal
(
sql
,
false
);
}
catch
(
Exception
re
)
{
SQLException
e
=
logAndConvert
(
re
);
if
(
next
==
null
)
{
...
...
@@ -894,7 +894,7 @@ public class JdbcStatement extends TraceObject implements Statement, JdbcStateme
if
(
isDebugEnabled
())
{
debugCode
(
"executeUpdate("
+
quote
(
sql
)+
", "
+
autoGeneratedKeys
+
");"
);
}
return
executeUpdateInternal
(
sql
);
return
executeUpdateInternal
(
sql
,
autoGeneratedKeys
==
RETURN_GENERATED_KEYS
);
}
catch
(
Exception
e
)
{
throw
logAndConvert
(
e
);
}
...
...
@@ -919,7 +919,7 @@ public class JdbcStatement extends TraceObject implements Statement, JdbcStateme
if
(
isDebugEnabled
())
{
debugCode
(
"executeLargeUpdate("
+
quote
(
sql
)+
", "
+
autoGeneratedKeys
+
");"
);
}
return
executeUpdateInternal
(
sql
);
return
executeUpdateInternal
(
sql
,
autoGeneratedKeys
==
RETURN_GENERATED_KEYS
);
}
catch
(
Exception
e
)
{
throw
logAndConvert
(
e
);
}
...
...
@@ -944,7 +944,7 @@ public class JdbcStatement extends TraceObject implements Statement, JdbcStateme
if
(
isDebugEnabled
())
{
debugCode
(
"executeUpdate("
+
quote
(
sql
)+
", "
+
quoteIntArray
(
columnIndexes
)+
");"
);
}
return
executeUpdateInternal
(
sql
);
return
executeUpdateInternal
(
sql
,
columnIndexes
);
}
catch
(
Exception
e
)
{
throw
logAndConvert
(
e
);
}
...
...
@@ -969,7 +969,7 @@ public class JdbcStatement extends TraceObject implements Statement, JdbcStateme
if
(
isDebugEnabled
())
{
debugCode
(
"executeLargeUpdate("
+
quote
(
sql
)+
", "
+
quoteIntArray
(
columnIndexes
)+
");"
);
}
return
executeUpdateInternal
(
sql
);
return
executeUpdateInternal
(
sql
,
columnIndexes
);
}
catch
(
Exception
e
)
{
throw
logAndConvert
(
e
);
}
...
...
@@ -994,7 +994,7 @@ public class JdbcStatement extends TraceObject implements Statement, JdbcStateme
if
(
isDebugEnabled
())
{
debugCode
(
"executeUpdate("
+
quote
(
sql
)+
", "
+
quoteArray
(
columnNames
)+
");"
);
}
return
executeUpdateInternal
(
sql
);
return
executeUpdateInternal
(
sql
,
columnNames
);
}
catch
(
Exception
e
)
{
throw
logAndConvert
(
e
);
}
...
...
@@ -1019,7 +1019,7 @@ public class JdbcStatement extends TraceObject implements Statement, JdbcStateme
if
(
isDebugEnabled
())
{
debugCode
(
"executeLargeUpdate("
+
quote
(
sql
)+
", "
+
quoteArray
(
columnNames
)+
");"
);
}
return
executeUpdateInternal
(
sql
);
return
executeUpdateInternal
(
sql
,
columnNames
);
}
catch
(
Exception
e
)
{
throw
logAndConvert
(
e
);
}
...
...
@@ -1044,7 +1044,7 @@ public class JdbcStatement extends TraceObject implements Statement, JdbcStateme
if
(
isDebugEnabled
())
{
debugCode
(
"execute("
+
quote
(
sql
)+
", "
+
autoGeneratedKeys
+
");"
);
}
return
executeInternal
(
sql
);
return
executeInternal
(
sql
,
autoGeneratedKeys
==
RETURN_GENERATED_KEYS
);
}
catch
(
Exception
e
)
{
throw
logAndConvert
(
e
);
}
...
...
@@ -1069,7 +1069,7 @@ public class JdbcStatement extends TraceObject implements Statement, JdbcStateme
if
(
isDebugEnabled
())
{
debugCode
(
"execute("
+
quote
(
sql
)+
", "
+
quoteIntArray
(
columnIndexes
)+
");"
);
}
return
executeInternal
(
sql
);
return
executeInternal
(
sql
,
columnIndexes
);
}
catch
(
Exception
e
)
{
throw
logAndConvert
(
e
);
}
...
...
@@ -1094,7 +1094,7 @@ public class JdbcStatement extends TraceObject implements Statement, JdbcStateme
if
(
isDebugEnabled
())
{
debugCode
(
"execute("
+
quote
(
sql
)+
", "
+
quoteArray
(
columnNames
)+
");"
);
}
return
executeInternal
(
sql
);
return
executeInternal
(
sql
,
columnNames
);
}
catch
(
Exception
e
)
{
throw
logAndConvert
(
e
);
}
...
...
h2/src/main/org/h2/server/TcpServerThread.java
浏览文件 @
58a30eba
...
...
@@ -91,12 +91,12 @@ public class TcpServerThread implements Runnable {
if
(
maxClientVersion
<
Constants
.
TCP_PROTOCOL_VERSION_6
)
{
throw
DbException
.
get
(
ErrorCode
.
DRIVER_VERSION_ERROR_2
,
""
+
clientVersion
,
""
+
Constants
.
TCP_PROTOCOL_VERSION_6
);
}
else
if
(
minClientVersion
>
Constants
.
TCP_PROTOCOL_VERSION_1
6
)
{
}
else
if
(
minClientVersion
>
Constants
.
TCP_PROTOCOL_VERSION_1
7
)
{
throw
DbException
.
get
(
ErrorCode
.
DRIVER_VERSION_ERROR_2
,
""
+
clientVersion
,
""
+
Constants
.
TCP_PROTOCOL_VERSION_1
6
);
""
+
clientVersion
,
""
+
Constants
.
TCP_PROTOCOL_VERSION_1
7
);
}
if
(
maxClientVersion
>=
Constants
.
TCP_PROTOCOL_VERSION_1
6
)
{
clientVersion
=
Constants
.
TCP_PROTOCOL_VERSION_1
6
;
if
(
maxClientVersion
>=
Constants
.
TCP_PROTOCOL_VERSION_1
7
)
{
clientVersion
=
Constants
.
TCP_PROTOCOL_VERSION_1
7
;
}
else
{
clientVersion
=
maxClientVersion
;
}
...
...
@@ -178,7 +178,7 @@ public class TcpServerThread implements Runnable {
RuntimeException
closeError
=
null
;
try
{
Command
rollback
=
session
.
prepareLocal
(
"ROLLBACK"
);
rollback
.
executeUpdate
();
rollback
.
executeUpdate
(
false
);
}
catch
(
RuntimeException
e
)
{
closeError
=
e
;
server
.
traceError
(
e
);
...
...
@@ -302,7 +302,7 @@ public class TcpServerThread implements Runnable {
commit
=
session
.
prepareLocal
(
"COMMIT"
);
}
int
old
=
session
.
getModificationId
();
commit
.
executeUpdate
();
commit
.
executeUpdate
(
false
);
transfer
.
writeInt
(
getState
(
old
)).
flush
();
break
;
}
...
...
@@ -353,10 +353,41 @@ public class TcpServerThread implements Runnable {
int
id
=
transfer
.
readInt
();
Command
command
=
(
Command
)
cache
.
getObject
(
id
,
false
);
setParameters
(
command
);
Object
generatedKeysRequest
;
if
(
clientVersion
>=
Constants
.
TCP_PROTOCOL_VERSION_17
)
{
int
type
=
transfer
.
readInt
();
switch
(
type
)
{
default
:
generatedKeysRequest
=
false
;
break
;
case
1
:
generatedKeysRequest
=
true
;
break
;
case
2
:
{
int
len
=
transfer
.
readInt
();
int
[]
keys
=
new
int
[
len
];
for
(
int
i
=
0
;
i
<
len
;
i
++)
{
keys
[
i
]
=
transfer
.
readInt
();
}
generatedKeysRequest
=
keys
;
break
;
}
case
3
:
{
int
len
=
transfer
.
readInt
();
String
[]
keys
=
new
String
[
len
];
for
(
int
i
=
0
;
i
<
len
;
i
++)
{
keys
[
i
]
=
transfer
.
readString
();
}
generatedKeysRequest
=
keys
;
}
}
}
else
{
generatedKeysRequest
=
true
;
}
int
old
=
session
.
getModificationId
();
int
updateCount
;
synchronized
(
session
)
{
updateCount
=
command
.
executeUpdate
();
updateCount
=
command
.
executeUpdate
(
generatedKeysRequest
);
}
int
status
;
if
(
session
.
isClosed
())
{
...
...
h2/src/main/org/h2/server/web/WebApp.java
浏览文件 @
58a30eba
...
...
@@ -1284,7 +1284,7 @@ public class WebApp {
ResultSet
rs
;
long
time
=
System
.
currentTimeMillis
();
boolean
metadata
=
false
;
boolean
generatedKeys
=
false
;
int
generatedKeys
=
Statement
.
NO_GENERATED_KEYS
;
boolean
edit
=
false
;
boolean
list
=
false
;
if
(
isBuiltIn
(
sql
,
"@autocommit_true"
))
{
...
...
@@ -1316,7 +1316,7 @@ public class WebApp {
sql
=
sql
.
substring
(
"@meta"
.
length
()).
trim
();
}
if
(
isBuiltIn
(
sql
,
"@generated"
))
{
generatedKeys
=
true
;
generatedKeys
=
Statement
.
RETURN_GENERATED_KEYS
;
sql
=
sql
.
substring
(
"@generated"
.
length
()).
trim
();
}
else
if
(
isBuiltIn
(
sql
,
"@history"
))
{
buff
.
append
(
getCommandHistoryString
());
...
...
@@ -1385,9 +1385,9 @@ public class WebApp {
int
maxrows
=
getMaxrows
();
stat
.
setMaxRows
(
maxrows
);
session
.
executingStatement
=
stat
;
boolean
isResultSet
=
stat
.
execute
(
sql
);
boolean
isResultSet
=
stat
.
execute
(
sql
,
generatedKeys
);
session
.
addCommand
(
sql
);
if
(
generatedKeys
)
{
if
(
generatedKeys
==
Statement
.
RETURN_GENERATED_KEYS
)
{
rs
=
null
;
rs
=
stat
.
getGeneratedKeys
();
}
else
{
...
...
h2/src/main/org/h2/store/FileLock.java
浏览文件 @
58a30eba
...
...
@@ -211,7 +211,7 @@ public class FileLock implements Runnable {
Transfer
transfer
=
new
Transfer
(
null
,
socket
);
transfer
.
init
();
transfer
.
writeInt
(
Constants
.
TCP_PROTOCOL_VERSION_6
);
transfer
.
writeInt
(
Constants
.
TCP_PROTOCOL_VERSION_1
6
);
transfer
.
writeInt
(
Constants
.
TCP_PROTOCOL_VERSION_1
7
);
transfer
.
writeString
(
null
);
transfer
.
writeString
(
null
);
transfer
.
writeString
(
id
);
...
...
h2/src/test/org/h2/test/jdbc/TestPreparedStatement.java
浏览文件 @
58a30eba
...
...
@@ -526,7 +526,7 @@ public class TestPreparedStatement extends TestBase {
Statement
stat
=
conn
.
createStatement
();
stat
.
execute
(
"CREATE TABLE TEST_UUID(id UUID DEFAULT "
+
"random_UUID() PRIMARY KEY)"
);
stat
.
execute
(
"INSERT INTO TEST_UUID() VALUES()"
);
stat
.
execute
(
"INSERT INTO TEST_UUID() VALUES()"
,
Statement
.
RETURN_GENERATED_KEYS
);
ResultSet
rs
=
stat
.
getGeneratedKeys
();
rs
.
next
();
byte
[]
data
=
rs
.
getBytes
(
1
);
...
...
@@ -573,7 +573,7 @@ public class TestPreparedStatement extends TestBase {
stat
.
execute
(
"create sequence seq start with 1000"
);
stat
.
execute
(
"create trigger test_ins after insert on test call \""
+
SequenceTrigger
.
class
.
getName
()
+
"\""
);
stat
.
execute
(
"insert into test values(null)"
);
stat
.
execute
(
"insert into test values(null)"
,
Statement
.
RETURN_GENERATED_KEYS
);
ResultSet
rs
=
stat
.
getGeneratedKeys
();
rs
.
next
();
// Generated key
...
...
@@ -1275,7 +1275,7 @@ public class TestPreparedStatement extends TestBase {
stat
.
execute
(
"CREATE TABLE TEST(ID INT)"
);
PreparedStatement
prep
;
prep
=
conn
.
prepareStatement
(
"INSERT INTO TEST VALUES(NEXT VALUE FOR SEQ)"
);
"INSERT INTO TEST VALUES(NEXT VALUE FOR SEQ)"
,
Statement
.
RETURN_GENERATED_KEYS
);
prep
.
execute
();
ResultSet
rs
=
prep
.
getGeneratedKeys
();
rs
.
next
();
...
...
@@ -1317,7 +1317,6 @@ public class TestPreparedStatement extends TestBase {
prep
.
execute
();
rs
=
prep
.
getGeneratedKeys
();
rs
.
next
();
assertEquals
(
5
,
rs
.
getInt
(
1
));
assertFalse
(
rs
.
next
());
stat
.
execute
(
"DROP TABLE TEST"
);
...
...
@@ -1369,7 +1368,8 @@ public class TestPreparedStatement extends TestBase {
stat
.
execute
(
"drop sequence seq"
);
stat
.
execute
(
"create table test(id bigint auto_increment, value int)"
);
stat
.
execute
(
"insert into test(value) values (1), (2)"
);
stat
.
execute
(
"insert into test(value) values (1), (2)"
,
Statement
.
RETURN_GENERATED_KEYS
);
rs
=
stat
.
getGeneratedKeys
();
rs
.
next
();
assertEquals
(
1L
,
rs
.
getLong
(
1
));
...
...
@@ -1409,7 +1409,8 @@ public class TestPreparedStatement extends TestBase {
assertFalse
(
u1
.
equals
(
u2
));
assertFalse
(
u2
.
equals
(
u3
));
assertFalse
(
u3
.
equals
(
u4
));
prep
=
conn
.
prepareStatement
(
"merge into test(id, value) key (id) values (?, ?)"
);
prep
=
conn
.
prepareStatement
(
"merge into test(id, value) key (id) values (?, ?)"
,
Statement
.
RETURN_GENERATED_KEYS
);
prep
.
setObject
(
1
,
2
);
prep
.
setInt
(
2
,
10
);
prep
.
execute
();
...
...
@@ -1427,7 +1428,8 @@ public class TestPreparedStatement extends TestBase {
stat
.
execute
(
"create trigger test_insert before insert on test for each row call \""
+
TestGeneratedKeysTrigger
.
class
.
getName
()
+
'"'
);
stat
.
executeUpdate
(
"insert into test(value) values (10), (20)"
);
stat
.
executeUpdate
(
"insert into test(value) values (10), (20)"
,
Statement
.
RETURN_GENERATED_KEYS
);
rs
=
stat
.
getGeneratedKeys
();
rs
.
next
();
u1
=
(
UUID
)
rs
.
getObject
(
1
);
...
...
@@ -1442,10 +1444,68 @@ public class TestPreparedStatement extends TestBase {
stat
.
execute
(
"drop trigger test_insert"
);
stat
.
execute
(
"drop table test"
);
stat
.
execute
(
"create table test(id bigint auto_increment, value int)"
);
stat
.
execute
(
"insert into test(value) values (1)"
);
assertFalse
(
stat
.
getGeneratedKeys
().
next
());
stat
.
execute
(
"insert into test(value) values (1)"
,
Statement
.
NO_GENERATED_KEYS
);
assertFalse
(
stat
.
getGeneratedKeys
().
next
());
stat
.
execute
(
"insert into test(value) values (1)"
,
Statement
.
RETURN_GENERATED_KEYS
);
rs
=
stat
.
getGeneratedKeys
();
assertTrue
(
rs
.
next
());
assertEquals
(
3
,
rs
.
getLong
(
1
));
assertFalse
(
rs
.
next
());
stat
.
execute
(
"insert into test(value) values (1)"
,
new
int
[
0
]);
assertFalse
(
stat
.
getGeneratedKeys
().
next
());
stat
.
execute
(
"insert into test(value) values (1)"
,
new
int
[]
{
1
});
rs
=
stat
.
getGeneratedKeys
();
assertTrue
(
rs
.
next
());
assertEquals
(
5
,
rs
.
getLong
(
1
));
assertFalse
(
rs
.
next
());
stat
.
execute
(
"insert into test(value) values (1)"
,
new
String
[
0
]);
assertFalse
(
stat
.
getGeneratedKeys
().
next
());
stat
.
execute
(
"insert into test(value) values (1)"
,
new
String
[]
{
"ID"
});
rs
=
stat
.
getGeneratedKeys
();
assertTrue
(
rs
.
next
());
assertEquals
(
7
,
rs
.
getLong
(
1
));
assertFalse
(
rs
.
next
());
prep
=
conn
.
prepareStatement
(
"insert into test(value) values (1)"
);
prep
.
execute
();
assertFalse
(
prep
.
getGeneratedKeys
().
next
());
prep
=
conn
.
prepareStatement
(
"insert into test(value) values (1)"
,
Statement
.
NO_GENERATED_KEYS
);
prep
.
execute
();
assertFalse
(
prep
.
getGeneratedKeys
().
next
());
prep
=
conn
.
prepareStatement
(
"insert into test(value) values (1)"
,
Statement
.
RETURN_GENERATED_KEYS
);
prep
.
execute
();
rs
=
prep
.
getGeneratedKeys
();
assertTrue
(
rs
.
next
());
assertEquals
(
10
,
rs
.
getLong
(
1
));
assertFalse
(
rs
.
next
());
prep
=
conn
.
prepareStatement
(
"insert into test(value) values (1)"
,
new
int
[
0
]);
prep
.
execute
();
assertFalse
(
prep
.
getGeneratedKeys
().
next
());
prep
=
conn
.
prepareStatement
(
"insert into test(value) values (1)"
,
new
int
[]
{
1
});
prep
.
execute
();
rs
=
prep
.
getGeneratedKeys
();
assertTrue
(
rs
.
next
());
assertEquals
(
12
,
rs
.
getLong
(
1
));
assertFalse
(
rs
.
next
());
prep
=
conn
.
prepareStatement
(
"insert into test(value) values (1)"
,
new
String
[
0
]);
prep
.
execute
();
assertFalse
(
prep
.
getGeneratedKeys
().
next
());
prep
=
conn
.
prepareStatement
(
"insert into test(value) values (1)"
,
new
String
[]
{
"ID"
});
prep
.
execute
();
rs
=
prep
.
getGeneratedKeys
();
assertTrue
(
rs
.
next
());
assertEquals
(
14
,
rs
.
getLong
(
1
));
assertFalse
(
rs
.
next
());
stat
.
execute
(
"drop table test"
);
stat
.
execute
(
"CREATE SEQUENCE SEQ"
);
stat
.
execute
(
"CREATE TABLE TEST(ID INT)"
);
prep
=
conn
.
prepareStatement
(
"INSERT INTO TEST VALUES(NEXT VALUE FOR SEQ)"
);
"INSERT INTO TEST VALUES(NEXT VALUE FOR SEQ)"
,
Statement
.
RETURN_GENERATED_KEYS
);
prep
.
addBatch
();
prep
.
addBatch
();
prep
.
addBatch
();
...
...
h2/src/test/org/h2/test/jdbc/TestResultSet.java
浏览文件 @
58a30eba
...
...
@@ -573,12 +573,14 @@ public class TestResultSet extends TestBase {
ResultSet
rs
;
stat
.
execute
(
"CREATE TABLE TEST(ID IDENTITY NOT NULL, NAME VARCHAR NULL)"
);
stat
.
execute
(
"INSERT INTO TEST(NAME) VALUES('Hello')"
);
stat
.
execute
(
"INSERT INTO TEST(NAME) VALUES('Hello')"
,
Statement
.
RETURN_GENERATED_KEYS
);
rs
=
stat
.
getGeneratedKeys
();
assertTrue
(
rs
.
next
());
assertEquals
(
1
,
rs
.
getInt
(
1
));
stat
.
execute
(
"INSERT INTO TEST(NAME) VALUES('World')"
);
stat
.
execute
(
"INSERT INTO TEST(NAME) VALUES('World')"
,
Statement
.
RETURN_GENERATED_KEYS
);
rs
=
stat
.
getGeneratedKeys
();
assertTrue
(
rs
.
next
());
assertEquals
(
2
,
rs
.
getInt
(
1
));
...
...
h2/src/test/org/h2/test/jdbc/TestStatement.java
浏览文件 @
58a30eba
...
...
@@ -351,16 +351,19 @@ public class TestStatement extends TestBase {
stat
.
execute
(
"create table test1(id identity, x int)"
);
stat
.
execute
(
"drop table if exists test2"
);
stat
.
execute
(
"create table test2(id identity, x int)"
);
stat
.
execute
(
"merge into test1(x) key(x) values(5)"
);
stat
.
execute
(
"merge into test1(x) key(x) values(5)"
,
Statement
.
RETURN_GENERATED_KEYS
);
ResultSet
keys
;
keys
=
stat
.
getGeneratedKeys
();
keys
.
next
();
assertEquals
(
1
,
keys
.
getInt
(
1
));
stat
.
execute
(
"insert into test2(x) values(10), (11), (12)"
);
stat
.
execute
(
"merge into test1(x) key(x) values(5)"
);
stat
.
execute
(
"merge into test1(x) key(x) values(5)"
,
Statement
.
RETURN_GENERATED_KEYS
);
keys
=
stat
.
getGeneratedKeys
();
assertFalse
(
keys
.
next
());
stat
.
execute
(
"merge into test1(x) key(x) values(6)"
);
stat
.
execute
(
"merge into test1(x) key(x) values(6)"
,
Statement
.
RETURN_GENERATED_KEYS
);
keys
=
stat
.
getGeneratedKeys
();
keys
.
next
();
assertEquals
(
2
,
keys
.
getInt
(
1
));
...
...
@@ -371,7 +374,8 @@ public class TestStatement extends TestBase {
Statement
stat
=
conn
.
createStatement
();
stat
.
execute
(
"CREATE SEQUENCE SEQ"
);
stat
.
execute
(
"CREATE TABLE TEST(ID INT)"
);
stat
.
execute
(
"INSERT INTO TEST VALUES(NEXT VALUE FOR SEQ)"
);
stat
.
execute
(
"INSERT INTO TEST VALUES(NEXT VALUE FOR SEQ)"
,
Statement
.
RETURN_GENERATED_KEYS
);
ResultSet
rs
=
stat
.
getGeneratedKeys
();
rs
.
next
();
assertEquals
(
1
,
rs
.
getInt
(
1
));
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论