package org.postgresql.pljava.example.annotation;
import java.sql.Array;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.postgresql.pljava.annotation.Function;
import org.postgresql.pljava.annotation.SQLAction;
/**
* A gnarly test of TupleDesc reference management, crafted by Johann Oskarsson
* for bug report 1010962 on pgFoundry.
*/
@SQLAction(requires="1010962 func",
install={
"CREATE TYPE javatest.B1010962 AS ( b1_val float8, b2_val int)",
"CREATE TYPE javatest.C1010962 AS ( c1_val float8, c2_val float8)",
"CREATE TYPE javatest.A1010962 as (" +
" b B1010962," +
" c C1010962," +
" a_val int" +
")",
"SELECT javatest.complexParam(array_agg(" +
" CAST(" +
" (" +
" CAST((0.1, i) AS javatest.B1010962)," +
" CAST((0.1, 10/i) AS javatest.C1010962)," +
" i" +
" ) AS javatest.A1010962)" +
" ))" +
" FROM generate_series (1,10) i"
},
remove={
"DROP TYPE javatest.A1010962",
"DROP TYPE javatest.C1010962",
"DROP TYPE javatest.B1010962"
}
)
public class PGF1010962
{
/**
* Test for bug 1010962: pass in an array of A1010962, expect no
* TupleDesc reference leak warnings.
* @param receiver Looks polymorphic, but expects an array of A1010962
* @return 0
*/
@Function(schema="javatest", provides="1010962 func")
public static int complexParam( ResultSet receiver[] )
throws SQLException
{
for ( int i = 0; i < receiver.length; i++ )
{
ResultSet b = (ResultSet)receiver[ i ].getObject( 1 );
double b1_val = b.getDouble( 1 );
int b2_val = b.getInt( 2 );
ResultSet c = (ResultSet)receiver[ i ].getObject( 2 );
double c1_val = c.getDouble( 1 );
double c2_val = c.getDouble( 2 );
int a = receiver[ i ].getInt( 3 );
}
return 0;
}
}