When a program uses JDBC to call a stored procedure written in PL/pgSQL and=
that procedure causes a referential integrity violation, a java.sql.Except=
ion isn't thrown. When a subsequent, unrelated call is made on the same co=
nnection, it will fail with a referential integrity exception.
Steps to reproduce:
1. Create two tables, foo and binky:
CREATE TABLE binky (id integer, primary key(id))
CREATE TABLE foo (id integer, binky_id integer REFERENCES binky)
2. Create stored procedure foo:
CREATE FUNCTION foo()
RETURNS INTEGER AS '
BEGIN
-- this should cause a referential integrity violation
INSERT INTO foo values(1, 3);
return 1;
END; ' LANGUAGE 'plpgsql';
3. Create a test class, Test1 and run it:
import java.sql.*;
public class Test {
=20=20=20=20
public static void main(String args[]) {
// fill this in with proper server, db, user, and password
String db =3D "jdbc:postgresql://postgres1/test;user=3Dtest;password=3D''";
try {
Class.forName("org.postgresql.Driver");
Connection c =3D DriverManager.getConnection(db);
Statement s =3D c.createStatement();
// this call should generate an exception but it doesn't
s.execute("select foo()");
ResultSet r =3D s.getResultSet();
while(r.next()) {
System.out.println("call to foo returned " + r.getInt(1));
}
// we should never make it this far but we do
System.out.println("about to call select");
s.execute("select * from binky");
} catch(Exception x) {
System.out.println(x);
}
}
}
Expected output:=20
java.sql.SQLException: ERROR: <unnamed> referential integrity violation - =
key referenced from foo not found in binky
Actual output:
First call to foo returned 1
about to call select
java.sql.SQLException: ERROR: <unnamed> referential integrity violation - =
key referenced from foo not found in binky
The problem:
One would expect the call to foo to generate an exception right away. Inst=
ead the program continues to run (it even gets the return value returned by=
foo). It isn't until the select call is made that the exception generated=
by the call to foo is thrown.
Platform details:
PostgreSQL 7.1.1 on i686-pc-linux-gnu, compiled by GCC egcs-2.91.66=20=20
Java version 1.3. I built the JDBC driver from the same sources used to com=
pile the sever. I'm running the Java client on Redhat Linux 7.1.
Other notes:
Calling foo from php gives proper results (i.e. the call fails right away) =
so I suspect this has something to do with the JDBC driver. By default, co=
nstraints should be checked immediately. However, just to make sure this w=
as in no way related to deffered constraint checking, I tried, "REFERENCES =
binky NOT DEFERRABLE," and the result was the same.