1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
|
/*-------------------------------------------------------------------------
*
* Copyright (c) 2007-2011, PostgreSQL Global Development Group
*
*
*-------------------------------------------------------------------------
*/
package org.postgresql.test.jdbc4;
import java.sql.*;
import junit.framework.TestCase;
import org.postgresql.test.TestUtil;
public class ArrayTest extends TestCase {
private Connection _conn;
public ArrayTest(String name) {
super(name);
}
protected void setUp() throws Exception {
_conn = TestUtil.openDB();
TestUtil.createTable(_conn, "arrtest", "intarr int[], decarr decimal(2,1)[], strarr text[]");
}
protected void tearDown() throws SQLException {
TestUtil.dropTable(_conn, "arrtest");
TestUtil.closeDB(_conn);
}
public void testCreateArrayOfInt() throws SQLException {
PreparedStatement pstmt = _conn.prepareStatement("SELECT ?::int[]");
Integer in[] = new Integer[3];
in[0] = 0;
in[1] = -1;
in[2] = 2;
pstmt.setArray(1, _conn.createArrayOf("int4", in));
ResultSet rs = pstmt.executeQuery();
assertTrue(rs.next());
Array arr = rs.getArray(1);
Integer out[] = (Integer [])arr.getArray();
assertEquals(3, out.length);
assertEquals(0, out[0].intValue());
assertEquals(-1, out[1].intValue());
assertEquals(2, out[2].intValue());
}
public void testCreateArrayOfMultiString() throws SQLException {
PreparedStatement pstmt = _conn.prepareStatement("SELECT ?::text[]");
String in[][] = new String[2][2];
in[0][0] = "a";
in[0][1] = "";
in[1][0] = "\\";
in[1][1] = "\"\\'z";
pstmt.setArray(1, _conn.createArrayOf("text", in));
ResultSet rs = pstmt.executeQuery();
assertTrue(rs.next());
Array arr = rs.getArray(1);
String out[][] = (String [][])arr.getArray();
assertEquals(2, out.length);
assertEquals(2, out[0].length);
assertEquals("a", out[0][0]);
assertEquals("", out[0][1]);
assertEquals("\\", out[1][0]);
assertEquals("\"\\'z", out[1][1]);
}
public void testCreateArrayOfNull() throws SQLException {
if (!TestUtil.haveMinimumServerVersion(_conn, "8.2"))
return;
String sql = "SELECT ?";
// We must provide the type information for V2 protocol
if (TestUtil.isProtocolVersion(_conn, 2)) {
sql = "SELECT ?::int8[]";
}
PreparedStatement pstmt = _conn.prepareStatement(sql);
String in[] = new String[2];
in[0] = null;
in[1] = null;
pstmt.setArray(1, _conn.createArrayOf("int8", in));
ResultSet rs = pstmt.executeQuery();
assertTrue(rs.next());
Array arr = rs.getArray(1);
Long out[] = (Long [])arr.getArray();
assertEquals(2, out.length);
assertNull(out[0]);
assertNull(out[1]);
}
public void testCreateEmptyArrayOfIntViaAlias() throws SQLException {
PreparedStatement pstmt = _conn.prepareStatement("SELECT ?::int[]");
Integer in[] = new Integer[0];
pstmt.setArray(1, _conn.createArrayOf("integer", in));
ResultSet rs = pstmt.executeQuery();
assertTrue(rs.next());
Array arr = rs.getArray(1);
Integer out[] = (Integer [])arr.getArray();
assertEquals(0, out.length);
ResultSet arrRs = arr.getResultSet();
assertFalse(arrRs.next());
}
public void testCreateArrayWithoutServer() throws SQLException {
String in[][] = new String[2][2];
in[0][0] = "a";
in[0][1] = "";
in[1][0] = "\\";
in[1][1] = "\"\\'z";
Array arr = _conn.createArrayOf("varchar", in);
String out[][] = (String [][])arr.getArray();
assertEquals(2, out.length);
assertEquals(2, out[0].length);
assertEquals("a", out[0][0]);
assertEquals("", out[0][1]);
assertEquals("\\", out[1][0]);
assertEquals("\"\\'z", out[1][1]);
}
public void testCreatePrimitiveArray() throws SQLException {
double in[][] = new double[2][2];
in[0][0] = 3.5;
in[0][1] = -4.5;
in[1][0] = 10.0/3;
in[1][1] = 77;
Array arr = _conn.createArrayOf("float8", in);
Double out[][] = (Double [][])arr.getArray();
assertEquals(2, out.length);
assertEquals(2, out[0].length);
assertEquals(3.5, out[0][0], 0.00001);
assertEquals(-4.5, out[0][1], 0.00001);
assertEquals(10.0/3, out[1][0], 0.00001);
assertEquals(77, out[1][1], 0.00001);
}
public void testSetObjectFromJavaArray() throws SQLException {
String[] strArray = new String[]{"a","b","c"};
PreparedStatement pstmt = _conn.prepareStatement("INSERT INTO arrtest(strarr) VALUES (?)");
// Incorrect, but commonly attempted by many ORMs:
try {
pstmt.setObject(1, strArray, Types.ARRAY);
pstmt.executeUpdate();
fail("setObject() with a Java array parameter and Types.ARRAY shouldn't succeed");
} catch (org.postgresql.util.PSQLException ex) {
// Expected failure.
}
// Also incorrect, but commonly attempted by many ORMs:
try {
pstmt.setObject(1, strArray);
pstmt.executeUpdate();
fail("setObject() with a Java array parameter and no Types argument shouldn't succeed");
} catch (org.postgresql.util.PSQLException ex) {
// Expected failure.
}
// Correct way, though the use of "text" as a type is non-portable.
// Only supported for JDK 1.6 and JDBC4
Array sqlArray = _conn.createArrayOf("text", strArray);
pstmt.setArray(1, sqlArray);
pstmt.executeUpdate();
pstmt.close();
}
}
|