提交 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,9 +153,14 @@ public class ResultTempTable implements ResultExternal { ...@@ -152,9 +153,14 @@ public class ResultTempTable implements ResultExternal {
return; return;
} }
try { try {
table.truncate(session);
Database database = session.getDatabase(); Database database = session.getDatabase();
// Need to lock because not all of the code-paths that reach here have already taken this lock,
// notably via the close() paths.
synchronized(session) {
synchronized (database) { synchronized (database) {
table.truncate(session);
}
}
// This session may not lock the sys table (except if it already has locked it) // This session may not lock the sys table (except if it already has locked it)
// because it must be committed immediately, // because it must be committed immediately,
// otherwise other threads can not access the sys table. // otherwise other threads can not access the sys table.
...@@ -168,7 +174,6 @@ public class ResultTempTable implements ResultExternal { ...@@ -168,7 +174,6 @@ public class ResultTempTable implements ResultExternal {
// the transaction must be committed immediately // the transaction must be committed immediately
sysSession.commit(false); sysSession.commit(false);
} }
}
} finally { } finally {
table = null; table = null;
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论