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}