提交 1cba07fa authored 作者: noelgrandin's avatar noelgrandin

Fix corruption resulting from a mix of the "WRITE_DELAY=0" option and "SELECT DISTINCT" queries

上级 8552a872
...@@ -52,6 +52,7 @@ Change Log ...@@ -52,6 +52,7 @@ Change Log
</li><li>Fix a NullPointerException when attempting to add foreign key reference to a view. </li><li>Fix a NullPointerException when attempting to add foreign key reference to a view.
</li><li>Add sufficient ClientInfo support to our javax.sql.Connection implementation to make WebSphere happy. </li><li>Add sufficient ClientInfo support to our javax.sql.Connection implementation to make WebSphere happy.
</li><li>Issue 482: class LobStorageBackend$LobInputStream does not override the method InputStream.available(). </li><li>Issue 482: class LobStorageBackend$LobInputStream does not override the method InputStream.available().
</li><li>Fix corruption resulting from a mix of the "WRITE_DELAY=0" option and "SELECT DISTINCT" queries
</li></ul> </li></ul>
<h2>Version 1.3.172 (2013-05-25)</h2> <h2>Version 1.3.172 (2013-05-25)</h2>
......
...@@ -15,6 +15,7 @@ import org.h2.index.Cursor; ...@@ -15,6 +15,7 @@ import org.h2.index.Cursor;
import org.h2.index.Index; import org.h2.index.Index;
import org.h2.index.IndexType; import org.h2.index.IndexType;
import org.h2.index.PageBtreeIndex; import org.h2.index.PageBtreeIndex;
import org.h2.message.DbException;
import org.h2.schema.Schema; import org.h2.schema.Schema;
import org.h2.table.Column; import org.h2.table.Column;
import org.h2.table.IndexColumn; import org.h2.table.IndexColumn;
...@@ -152,23 +153,27 @@ public class ResultTempTable implements ResultExternal { ...@@ -152,23 +153,27 @@ public class ResultTempTable implements ResultExternal {
return; return;
} }
try { try {
table.truncate(session);
Database database = session.getDatabase(); Database database = session.getDatabase();
synchronized (database) { // Need to lock because not all of the code-paths that reach here have already taken this lock,
// This session may not lock the sys table (except if it already has locked it) // notably via the close() paths.
// because it must be committed immediately, synchronized(session) {
// otherwise other threads can not access the sys table. synchronized (database) {
// If the table is not removed now, it will be when the database table.truncate(session);
// is opened the next time.
// (the table is truncated, so this is just one record)
if (!database.isSysTableLocked()) {
Session sysSession = database.getSystemSession();
index.removeChildrenAndResources(sysSession);
table.removeChildrenAndResources(sysSession);
// the transaction must be committed immediately
sysSession.commit(false);
} }
} }
// This session may not lock the sys table (except if it already has locked it)
// because it must be committed immediately,
// otherwise other threads can not access the sys table.
// If the table is not removed now, it will be when the database
// is opened the next time.
// (the table is truncated, so this is just one record)
if (!database.isSysTableLocked()) {
Session sysSession = database.getSystemSession();
index.removeChildrenAndResources(sysSession);
table.removeChildrenAndResources(sysSession);
// the transaction must be committed immediately
sysSession.commit(false);
}
} finally { } finally {
table = null; table = null;
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论