提交 87f1e630 authored 作者: Evgenij Ryazanov's avatar Evgenij Ryazanov

Try to prevent incorrect usage of Prepared.getObjectId() and add some comments

上级 5252e594
......@@ -54,6 +54,11 @@ public abstract class Prepared {
private long modificationMetaId;
private Command command;
/**
* Used to preserve object identities on database startup. {@code 0} if
* object is not stored, {@code -1} if object is stored and its ID is
* already read, {@code >0} if object is stored and its id is not yet read.
*/
private int objectId;
private int currentRowNumber;
private int rowScanCount;
......@@ -245,12 +250,14 @@ public abstract class Prepared {
* @return the object id or 0 if not set
*/
protected int getCurrentObjectId() {
return objectId;
int id = objectId;
return id >= 0 ? id : 0;
}
/**
* Get the current object id, or get a new id from the database. The object
* id is used when creating new database object (CREATE statement).
* id is used when creating new database object (CREATE statement). This
* method may be called only once.
*
* @return the object id
*/
......@@ -258,9 +265,10 @@ public abstract class Prepared {
int id = objectId;
if (id == 0) {
id = session.getDatabase().allocateObjectId();
} else {
objectId = 0;
} else if (id < 0) {
throw DbException.throwInternalError("Prepared.getObjectId() was called before");
}
objectId = -1;
return id;
}
......
......@@ -103,7 +103,7 @@ public abstract class CommandWithColumns extends SchemaCommand {
if (columns != null) {
for (Column c : columns) {
if (c.isAutoIncrement()) {
int objId = getObjectId();
int objId = session.getDatabase().allocateObjectId();
c.convertAutoIncrementToSequence(session, getSchema(), objId, temporary);
if (!Constants.CLUSTERING_DISABLED.equals(session.getDatabase().getCluster())) {
throw DbException.getUnsupportedException("CLUSTERING && auto-increment columns");
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论