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