提交 0cdcb78c authored 作者: Thomas Mueller's avatar Thomas Mueller

Issue 350: when using instead of triggers, executeUpdate for delete operations always returned 0.

上级 cf0fe420
......@@ -66,6 +66,7 @@ public class Delete extends Prepared {
}
try {
setCurrentRowNumber(0);
int count = 0;
while (limitRows != 0 && tableFilter.next()) {
setCurrentRowNumber(rows.size() + 1);
if (condition == null || Boolean.TRUE.equals(condition.getBooleanValue(session))) {
......@@ -76,9 +77,10 @@ public class Delete extends Prepared {
}
if (!done) {
rows.add(row);
if (limitRows >= 0 && rows.size() >= limitRows) {
break;
}
}
count++;
if (limitRows >= 0 && count >= limitRows) {
break;
}
}
}
......@@ -92,15 +94,13 @@ public class Delete extends Prepared {
session.log(table, UndoLogRecord.DELETE, row);
}
if (table.fireRow()) {
int count = 0;
for (rows.reset(); rows.hasNext();) {
Row row = rows.next();
table.fireAfterRow(session, row, null, false);
count++;
}
}
table.fire(session, Trigger.DELETE, false);
return rows.size();
return count;
} finally {
rows.close();
}
......
......@@ -149,16 +149,21 @@ public class TestTriggersConstraints extends TestBase implements Trigger {
stat.execute("create view test_view as select * from test");
stat.execute("create trigger test_view_insert " +
"instead of insert on test_view for each row call \"" + TestView.class.getName() + "\"");
stat.execute("create trigger test_view_delete " +
"instead of delete on test_view for each row call \"" + TestView.class.getName() + "\"");
if (!config.memory) {
conn.close();
conn = getConnection("trigger");
stat = conn.createStatement();
}
stat.execute("insert into test_view values(1)");
int count = stat.executeUpdate("insert into test_view values(1)");
assertEquals(1, count);
ResultSet rs;
rs = stat.executeQuery("select * from test");
assertTrue(rs.next());
assertFalse(rs.next());
count = stat.executeUpdate("delete from test_view");
assertEquals(1, count);
stat.execute("drop view test_view");
stat.execute("drop table test");
conn.close();
......@@ -195,8 +200,10 @@ public class TestTriggersConstraints extends TestBase implements Trigger {
}
public void fire(Connection conn, Object[] oldRow, Object[] newRow) throws SQLException {
prepInsert.setInt(1, (Integer) newRow[0]);
prepInsert.execute();
if (newRow != null) {
prepInsert.setInt(1, (Integer) newRow[0]);
prepInsert.execute();
}
}
public void close() {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论