[Pljava-dev] Stale Handle to native structure?

From: mitchchapman at earthlink(dot)net (Mitch Chapman)
To:
Subject: [Pljava-dev] Stale Handle to native structure?
Date: 2005-07-22 00:55:01
Message-ID: 7D0D6BCD-95F7-4AF7-9B44-5EB7ED912590@earthlink.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pljava-dev

Hi list,

I'm having problems with a PL/Java extension function which returns a
SETOF records. When I join the results from this function with
another table, specifying an ORDER BY clause, I get the traceback
seen below.

This is with pljava-1.0.0, on a Redhat Linux system running JRE 1.4.2-
b28 and PostgreSQL 8.0.3. The same function, and the same query,
running on a Mac OS X 10.4.1 system with pljava-1.0.0, JRE 1.4.2_07,
and PostgreSQL 8.0.3, produces no errors.

Thanks for any help. Please let me know if you need more info.

Here's the traceback from the postmaster:
LOG: Exception
LOG: in thread "main"
java.sql.SQLException: Stale Handle to native structure
at org.postgresql.pljava.internal.Tuple._getObject(Native
Method)
at org.postgresql.pljava.internal.Tuple.getObject(Tuple.java:
32)
at org.postgresql.pljava.jdbc.SPIResultSet.peekNext
(SPIResultSet.java:172)
at org.postgresql.pljava.jdbc.SPIResultSet.next
(SPIResultSet.java:80)
at org.postgresql.pljava.sqlj.Loader.getSchemaLoader
(Loader.java:88)
ERROR: java.sql.SQLException: Stale Handle to native structure

The function itself performs database queries to produce its results,
but I don't have access to the relevant source code. Here's a
paraphrase of my code, modified to hide proprietary info (but
hopefully not modified so much as to hide the cause of the problem):

public class plJavaExampleSearch extends MySearchAlgorithm
implements ResultSetProvider {
public plJavaExampleSearch(String pattern, float threshold)
throws Exception {
super();
searchFor(pattern, threshold);
}

public boolean assignRowValues(ResultSet receiver, int currentRow)
throws SQLException
{
boolean result = false;

if ((0 <= currentRow) && (currentRow < getter.getResultCount
())) {
int record_id = getter.getResult(currentRow);
float similarity = getter.getSimilarity(currentRow);
receiver.updateInt(1, record_id);
receiver.updateFloat(2, similarity);
result = true;
}
return result;
}

public static ResultSetProvider findMatches(String pattern,
float threshold) {
ResultSetProvider result;

try {
result = new plJavaExampleSearch(pattern, threshold);
} catch (Exception e) {
result = new EmptyResultSetProvider();
}
return result;
}

And here's the DDR with which it is installed:

SQLActions[] = {
"BEGIN INSTALL
CREATE TYPE searchResult
AS (record_id integer, similarity real);

CREATE FUNCTION findMatches(varchar, float4, int4, int4)
RETURNS SETOF searchResult
AS 'plJavaExampleSearch.findMatches'
IMMUTABLE LANGUAGE java;
END INSTALL",

"BEGIN REMOVE
DROP FUNCTION findMatches(varchar, float4, int4, int4);
DROP TYPE searchResult;
END REMOVE"
}

This query (again, paraphrased, sorry) produces good results:

SELECT findMatches('abcd', 0.5);

This query does not:

SELECT fss.record_id, fss.similarity, src_table.another_attribute
FROM findMatches('abcd', 0.5) AS fss, src_table
WHERE fss.record_id = src_table.record_id
AND src_table.another_attribute > 1.2
ORDER BY fss.similarity DESC;

--
Mitch

Responses

Browse pljava-dev by date

  From Date Subject
Next Message Shunsuke Ikegami 2005-07-22 02:41:26 [Pljava-dev] create oid and WARNING
Previous Message Ilia Chipitsine 2005-07-15 13:32:22 [Pljava-dev] running pljava under FreeBSD ?