001package org.postgresql.pljava.example.annotation;
002
003import java.sql.Array;
004import java.sql.ResultSet;
005import java.sql.SQLException;
006
007import org.postgresql.pljava.annotation.Function;
008import org.postgresql.pljava.annotation.SQLAction;
009
010/**
011 * A gnarly test of TupleDesc reference management, crafted by Johann Oskarsson
012 * for bug report 1010962 on pgFoundry.
013 */
014@SQLAction(requires="1010962 func",
015    install={
016        "CREATE TYPE javatest.B1010962 AS ( b1_val float8, b2_val int)",
017
018        "CREATE TYPE javatest.C1010962 AS ( c1_val float8, c2_val float8)",
019
020        "CREATE TYPE javatest.A1010962 as (" +
021        " b B1010962," +
022        " c C1010962," +
023        " a_val int" +
024        ")",
025
026        "SELECT javatest.complexParam(array_agg(" +
027        " CAST(" +
028        "  (" +
029        "   CAST((0.1, i)    AS javatest.B1010962)," +
030        "   CAST((0.1, 10/i) AS javatest.C1010962)," +
031        "   i" +
032        "  ) AS javatest.A1010962)" +
033        " ))" +
034        " FROM generate_series (1,10) i"
035    },
036    remove={
037        "DROP TYPE javatest.A1010962",
038        "DROP TYPE javatest.C1010962",
039        "DROP TYPE javatest.B1010962"
040    }
041)
042public class PGF1010962
043{
044    /**
045     * Test for bug 1010962: pass in an array of A1010962, expect no
046     * TupleDesc reference leak warnings.
047     * @param receiver Looks polymorphic, but expects an array of A1010962
048     * @return 0
049     */
050    @Function(schema="javatest", provides="1010962 func")
051    public static int complexParam( ResultSet receiver[] )
052    throws SQLException
053    {
054        for ( int i = 0; i < receiver.length; i++ )
055        {
056            ResultSet b = (ResultSet)receiver[ i ].getObject( 1 );
057            double b1_val = b.getDouble( 1 );
058            int b2_val = b.getInt( 2 );
059
060            ResultSet c = (ResultSet)receiver[ i ].getObject( 2 );
061            double c1_val = c.getDouble( 1 );
062            double c2_val = c.getDouble( 2 );
063
064            int a = receiver[ i ].getInt( 3 );
065        }
066
067        return 0;
068    }
069}