Add compatibility flag for generated keys

上级 d48c679b
......@@ -5651,6 +5651,10 @@ public class Parser {
readIfEqualOrTo();
read();
return new NoOperation(session);
} else if (readIf("SCOPE_GENERATED_KEYS")) {
readIfEqualOrTo();
read();
return new NoOperation(session);
} else if (readIf("SCHEMA")) {
readIfEqualOrTo();
Set command = new Set(session, SetTypes.SCHEMA);
......
......@@ -96,7 +96,8 @@ public class ConnectionInfo implements Cloneable {
"CREATE", "CACHE_TYPE", "FILE_LOCK", "IGNORE_UNKNOWN_SETTINGS",
"IFEXISTS", "INIT", "PASSWORD", "RECOVER", "RECOVER_TEST",
"USER", "AUTO_SERVER", "AUTO_SERVER_PORT", "NO_UPGRADE",
"AUTO_RECONNECT", "OPEN_NEW", "PAGE_SIZE", "PASSWORD_HASH", "JMX" };
"AUTO_RECONNECT", "OPEN_NEW", "PAGE_SIZE", "PASSWORD_HASH", "JMX",
"SCOPE_GENERATED_KEYS" };
HashSet<String> set = new HashSet<>(list.size() + connectionTime.length);
set.addAll(list);
for (String key : connectionTime) {
......
......@@ -94,6 +94,7 @@ public class JdbcConnection extends TraceObject
private Map<String, String> clientInfo;
private String mode;
private final boolean scopeGeneratedKeys;
/**
* INTERNAL
......@@ -132,6 +133,7 @@ public class JdbcConnection extends TraceObject
+ ", \"\");");
}
this.url = ci.getURL();
scopeGeneratedKeys = ci.getProperty("SCOPE_GENERATED_KEYS", false);
closeOld();
watcher = CloseWatcher.register(this, session, keepOpenStackTrace);
} catch (Exception e) {
......@@ -156,6 +158,7 @@ public class JdbcConnection extends TraceObject
this.getQueryTimeout = clone.getQueryTimeout;
this.getReadOnly = clone.getReadOnly;
this.rollback = clone.rollback;
this.scopeGeneratedKeys = clone.scopeGeneratedKeys;
this.watcher = null;
if (clone.clientInfo != null) {
this.clientInfo = new HashMap<>(clone.clientInfo);
......@@ -172,6 +175,7 @@ public class JdbcConnection extends TraceObject
setTrace(trace, TraceObject.CONNECTION, id);
this.user = user;
this.url = url;
this.scopeGeneratedKeys = false;
this.watcher = null;
}
......@@ -1578,6 +1582,13 @@ public class JdbcConnection extends TraceObject
executingStatement = stat;
}
/**
* INTERNAL
*/
boolean scopeGeneratedKeys() {
return scopeGeneratedKeys;
}
/**
* INTERNAL
*/
......
......@@ -70,7 +70,7 @@ public class JdbcPreparedStatement extends JdbcStatement implements
int resultSetType, int resultSetConcurrency,
boolean closeWithResultSet, Object generatedKeysRequest) {
super(conn, id, resultSetType, resultSetConcurrency, closeWithResultSet);
this.generatedKeysRequest = generatedKeysRequest;
this.generatedKeysRequest = conn.scopeGeneratedKeys() ? false : generatedKeysRequest;
setTrace(session.getTrace(), TraceObject.PREPARED_STATEMENT, id);
this.sqlStatement = sql;
command = conn.prepareCommand(sql, fetchSize);
......
......@@ -166,7 +166,8 @@ public class JdbcStatement extends TraceObject implements Statement, JdbcStateme
synchronized (session) {
setExecutingStatement(command);
try {
ResultWithGeneratedKeys result = command.executeUpdate(generatedKeysRequest);
ResultWithGeneratedKeys result = command.executeUpdate(
conn.scopeGeneratedKeys() ? false : generatedKeysRequest);
updateCount = result.getUpdateCount();
ResultInterface gk = result.getGeneratedKeys();
if (gk != null) {
......@@ -229,7 +230,8 @@ public class JdbcStatement extends TraceObject implements Statement, JdbcStateme
closedByResultSet, scrollable, updatable);
} else {
returnsResultSet = false;
ResultWithGeneratedKeys result = command.executeUpdate(generatedKeysRequest);
ResultWithGeneratedKeys result = command.executeUpdate(
conn.scopeGeneratedKeys() ? false : generatedKeysRequest);
updateCount = result.getUpdateCount();
ResultInterface gk = result.getGeneratedKeys();
if (gk != null) {
......@@ -832,13 +834,15 @@ public class JdbcStatement extends TraceObject implements Statement, JdbcStateme
debugCodeAssign("ResultSet", TraceObject.RESULT_SET, id, "getGeneratedKeys()");
}
checkClosed();
if (generatedKeys != null) {
return generatedKeys;
}
if (session.isSupportsGeneratedKeys()) {
return new SimpleResultSet();
if (!conn.scopeGeneratedKeys()) {
if (generatedKeys != null) {
return generatedKeys;
}
if (session.isSupportsGeneratedKeys()) {
return new SimpleResultSet();
}
}
// Old server, so use SCOPE_IDENTITY()
// Compatibility mode or an old server, so use SCOPE_IDENTITY()
return conn.getGeneratedKeys(this, id);
} catch (Exception e) {
throw logAndConvert(e);
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论