postgresql-jdbc.git / summary / log / commit / refs
commit d2e372b80d7c3a8ab82e5b34f0d9d06dcedd84a1
Author: Kris Jurka <books@ejurka.com>
Date: Sat Dec 01 12:50:45 2007 +0000
Implement the JDBC4 method Connection.createArrayOf. Now people
don't have to implement java.sql.Array themselves.
org/postgresql/jdbc2/AbstractJdbc2Array.java | 22 ++--
org/postgresql/jdbc2/AbstractJdbc2Connection.java | 11 +-
org/postgresql/jdbc2/Jdbc2Array.java | 6 +-
org/postgresql/jdbc2/Jdbc2ResultSet.java | 6 +-
org/postgresql/jdbc2/TypeInfoCache.java | 26 +++-
org/postgresql/jdbc3/Jdbc3Array.java | 6 +-
org/postgresql/jdbc3/Jdbc3ResultSet.java | 6 +-
org/postgresql/jdbc3g/Jdbc3gArray.java | 6 +-
org/postgresql/jdbc3g/Jdbc3gResultSet.java | 6 +-
org/postgresql/jdbc4/AbstractJdbc4Connection.java | 40 +++++-
org/postgresql/jdbc4/Jdbc4Array.java | 6 +-
org/postgresql/jdbc4/Jdbc4ResultSet.java | 6 +-
org/postgresql/test/jdbc4/ArrayTest.java | 142 ++++++++++++++++++++++
org/postgresql/test/jdbc4/Jdbc4TestSuite.java | 3 +-
org/postgresql/util/PSQLState.java | 3 +-
15 files changed, 258 insertions(+), 37 deletions(-)
diff --git a/org/postgresql/jdbc2/AbstractJdbc2Array.java b/org/postgresql/jdbc2/AbstractJdbc2Array.java
index 03bef53c..c87c2532 100644
--- a/org/postgresql/jdbc2/AbstractJdbc2Array.java
+++ b/org/postgresql/jdbc2/AbstractJdbc2Array.java
@@ -3,7 +3,7 @@
* Copyright (c) 2004-2005, PostgreSQL Global Development Group
*
* IDENTIFICATION
-* $PostgreSQL: pgjdbc/org/postgresql/jdbc2/AbstractJdbc2Array.java,v 1.18 2005/12/04 21:40:33 jurka Exp $
+* $PostgreSQL: pgjdbc/org/postgresql/jdbc2/AbstractJdbc2Array.java,v 1.21 2007/12/01 11:07:12 jurka Exp $
*
*-------------------------------------------------------------------------
*/
@@ -61,9 +61,9 @@ public abstract class AbstractJdbc2Array
private BaseConnection connection = null;
/**
- * The Field descriptor for the field to load into this Array.
+ * The OID of this field.
*/
- private Field field = null;
+ private int oid;
/**
* Field value as String.
@@ -98,10 +98,10 @@ public abstract class AbstractJdbc2Array
* @param field the Field descriptor for the field to load into this Array
* @param result the ResultSet from which to get the data for this Array
*/
- public AbstractJdbc2Array(BaseConnection connection, int index, Field field, BaseResultSet result) throws SQLException {
+ public AbstractJdbc2Array(BaseConnection connection, int oid, String fieldString) throws SQLException {
this.connection = connection;
- this.field = field;
- this.fieldString = result.getFixedString(index);
+ this.oid = oid;
+ this.fieldString = fieldString;
this.useObjects = connection.haveMinimumCompatibleVersion("8.3");
this.haveMinServer82 = connection.haveMinimumServerVersion("8.2");
}
@@ -319,7 +319,7 @@ public abstract class AbstractJdbc2Array
int length = 0;
// array elements type
- final int type = connection.getSQLType(connection.getPGArrayElement(field.getOID()));
+ final int type = connection.getSQLType(connection.getPGArrayElement(oid));
if (type == Types.BIT)
{
@@ -548,7 +548,7 @@ ret = oa = (dims > 1 ? (Object[]) java.lang.reflect.Array.newInstance(useObjects
public String getBaseTypeName() throws SQLException
{
buildArrayList();
- return connection.getPGType(connection.getPGArrayElement(field.getOID()));
+ return connection.getPGType(connection.getPGArrayElement(oid));
}
public java.sql.ResultSet getResultSet() throws SQLException
@@ -602,7 +602,7 @@ ret = oa = (dims > 1 ? (Object[]) java.lang.reflect.Array.newInstance(useObjects
if (arrayList.dimensionsCount <= 1)
{
// array element type
- final int baseOid = connection.getPGArrayElement(field.getOID());
+ final int baseOid = connection.getPGArrayElement(oid);
fields[0] = new Field("INDEX", Oid.INT4);
fields[1] = new Field("VALUE", baseOid);
@@ -621,7 +621,7 @@ ret = oa = (dims > 1 ? (Object[]) java.lang.reflect.Array.newInstance(useObjects
else
{
fields[0] = new Field("INDEX", Oid.INT4);
- fields[1] = new Field("VALUE", field.getOID());
+ fields[1] = new Field("VALUE", oid);
for (int i = 0; i < count; i++)
{
int offset = (int)index + i;
@@ -672,7 +672,7 @@ ret = oa = (dims > 1 ? (Object[]) java.lang.reflect.Array.newInstance(useObjects
return b.toString();
}
- private static void escapeArrayElement(StringBuffer b, String s)
+ public static void escapeArrayElement(StringBuffer b, String s)
{
b.append('"');
for (int j = 0; j < s.length(); j++) {
diff --git a/org/postgresql/jdbc2/AbstractJdbc2Connection.java b/org/postgresql/jdbc2/AbstractJdbc2Connection.java
index b2c489cf..bd2d5eeb 100644
--- a/org/postgresql/jdbc2/AbstractJdbc2Connection.java
+++ b/org/postgresql/jdbc2/AbstractJdbc2Connection.java
@@ -3,7 +3,7 @@
* Copyright (c) 2004-2005, PostgreSQL Global Development Group
*
* IDENTIFICATION
-* $PostgreSQL: pgjdbc/org/postgresql/jdbc2/AbstractJdbc2Connection.java,v 1.42 2007/04/16 18:31:38 jurka Exp $
+* $PostgreSQL: pgjdbc/org/postgresql/jdbc2/AbstractJdbc2Connection.java,v 1.45 2007/12/01 09:17:28 jurka Exp $
*
*-------------------------------------------------------------------------
*/
@@ -971,6 +971,15 @@ public abstract class AbstractJdbc2Connection implements BaseConnection
return _typeCache.getPGType(typeName);
}
+ /**
+ * Return the oid of the array type of the given base type.
+ */
+ public int getPGArrayType(String elementTypeName) throws SQLException
+ {
+ elementTypeName = _typeCache.getTypeForAlias(elementTypeName);
+ return getPGType("_" + elementTypeName);
+ }
+
public String getJavaClass(int oid) throws SQLException
{
return _typeCache.getJavaClass(oid);
diff --git a/org/postgresql/jdbc2/Jdbc2Array.java b/org/postgresql/jdbc2/Jdbc2Array.java
index e03da081..48c58087 100644
--- a/org/postgresql/jdbc2/Jdbc2Array.java
+++ b/org/postgresql/jdbc2/Jdbc2Array.java
@@ -3,7 +3,7 @@
* Copyright (c) 2004-2005, PostgreSQL Global Development Group
*
* IDENTIFICATION
-* $PostgreSQL: pgjdbc/org/postgresql/jdbc2/Jdbc2Array.java,v 1.3 2004/11/09 08:49:01 jurka Exp $
+* $PostgreSQL: pgjdbc/org/postgresql/jdbc2/Jdbc2Array.java,v 1.4 2005/01/11 08:25:46 jurka Exp $
*
*-------------------------------------------------------------------------
*/
@@ -16,9 +16,9 @@ import java.sql.ResultSet;
public class Jdbc2Array extends AbstractJdbc2Array implements java.sql.Array
{
- public Jdbc2Array(BaseConnection conn, int idx, Field field, BaseResultSet rs) throws SQLException
+ public Jdbc2Array(BaseConnection conn, int oid, String fieldString) throws SQLException
{
- super(conn, idx, field, rs);
+ super(conn, oid, fieldString);
}
public Object getArray(Map map) throws SQLException
diff --git a/org/postgresql/jdbc2/Jdbc2ResultSet.java b/org/postgresql/jdbc2/Jdbc2ResultSet.java
index cd749373..68db5d61 100644
--- a/org/postgresql/jdbc2/Jdbc2ResultSet.java
+++ b/org/postgresql/jdbc2/Jdbc2ResultSet.java
@@ -3,7 +3,7 @@
* Copyright (c) 2004-2005, PostgreSQL Global Development Group
*
* IDENTIFICATION
-* $PostgreSQL: pgjdbc/org/postgresql/jdbc2/Jdbc2ResultSet.java,v 1.17 2007/02/19 06:00:24 jurka Exp $
+* $PostgreSQL: pgjdbc/org/postgresql/jdbc2/Jdbc2ResultSet.java,v 1.18 2007/07/27 08:54:54 jurka Exp $
*
*-------------------------------------------------------------------------
*/
@@ -55,7 +55,9 @@ public class Jdbc2ResultSet extends org.postgresql.jdbc2.AbstractJdbc2ResultSet
public java.sql.Array createArray(int i) throws SQLException
{
checkResultSet(i);
- return new org.postgresql.jdbc2.Jdbc2Array(connection, i, fields[i - 1], this);
+ int oid = fields[i - 1].getOID();
+ String value = getFixedString(i);
+ return new Jdbc2Array(connection, oid, value);
}
public Object getObject(String s, Map map) throws SQLException
diff --git a/org/postgresql/jdbc2/TypeInfoCache.java b/org/postgresql/jdbc2/TypeInfoCache.java
index d59b97ac..375f12dd 100644
--- a/org/postgresql/jdbc2/TypeInfoCache.java
+++ b/org/postgresql/jdbc2/TypeInfoCache.java
@@ -3,7 +3,7 @@
* Copyright (c) 2005, PostgreSQL Global Development Group
*
* IDENTIFICATION
- * $PostgreSQL: pgjdbc/org/postgresql/jdbc2/TypeInfoCache.java,v 1.7 2007/02/19 05:57:53 jurka Exp $
+ * $PostgreSQL: pgjdbc/org/postgresql/jdbc2/TypeInfoCache.java,v 1.9 2007/12/01 08:28:58 jurka Exp $
*
*-------------------------------------------------------------------------
*/
@@ -83,6 +83,23 @@ public class TypeInfoCache {
{"timestamptz", new Integer(Oid.TIMESTAMPTZ), new Integer(Types.TIMESTAMP), "java.sql.Timestamp", new Integer(Oid.TIMESTAMPTZ_ARRAY)}
};
+ /**
+ * PG maps several alias to real type names. When we do queries
+ * against pg_catalog, we must use the real type, not an alias, so
+ * use this mapping.
+ */
+ private final static HashMap typeAliases;
+ static {
+ typeAliases = new HashMap();
+ typeAliases.put("smallint", "int2");
+ typeAliases.put("integer", "int4");
+ typeAliases.put("int", "int4");
+ typeAliases.put("bigint", "int8");
+ typeAliases.put("float", "float8");
+ typeAliases.put("boolean", "bool");
+ typeAliases.put("decimal", "numeric");
+ }
+
public TypeInfoCache(BaseConnection conn)
{
_conn = conn;
@@ -304,6 +321,13 @@ public class TypeInfoCache {
return result;
}
+ public static String getTypeForAlias(String alias) {
+ String type = (String) typeAliases.get(alias);
+ if (type != null)
+ return type;
+ return alias;
+ }
+
public static int getPrecision(int oid, int typmod) {
switch (oid) {
case Oid.INT2:
diff --git a/org/postgresql/jdbc3/Jdbc3Array.java b/org/postgresql/jdbc3/Jdbc3Array.java
index 35d37067..4ade0f5b 100644
--- a/org/postgresql/jdbc3/Jdbc3Array.java
+++ b/org/postgresql/jdbc3/Jdbc3Array.java
@@ -3,7 +3,7 @@
* Copyright (c) 2004-2005, PostgreSQL Global Development Group
*
* IDENTIFICATION
-* $PostgreSQL: pgjdbc/org/postgresql/jdbc3/Jdbc3Array.java,v 1.3 2004/11/09 08:50:10 jurka Exp $
+* $PostgreSQL: pgjdbc/org/postgresql/jdbc3/Jdbc3Array.java,v 1.4 2005/01/11 08:25:46 jurka Exp $
*
*-------------------------------------------------------------------------
*/
@@ -16,9 +16,9 @@ import java.sql.ResultSet;
public class Jdbc3Array extends org.postgresql.jdbc2.AbstractJdbc2Array implements java.sql.Array
{
- public Jdbc3Array(BaseConnection conn, int idx, Field field, BaseResultSet rs) throws SQLException
+ public Jdbc3Array(BaseConnection conn, int oid, String fieldString) throws SQLException
{
- super(conn, idx, field, rs);
+ super(conn, oid, fieldString);
}
public Object getArray(Map map) throws SQLException
diff --git a/org/postgresql/jdbc3/Jdbc3ResultSet.java b/org/postgresql/jdbc3/Jdbc3ResultSet.java
index bbdb6338..535a960c 100644
--- a/org/postgresql/jdbc3/Jdbc3ResultSet.java
+++ b/org/postgresql/jdbc3/Jdbc3ResultSet.java
@@ -3,7 +3,7 @@
* Copyright (c) 2004-2005, PostgreSQL Global Development Group
*
* IDENTIFICATION
-* $PostgreSQL: pgjdbc/org/postgresql/jdbc3/Jdbc3ResultSet.java,v 1.14 2007/02/19 06:00:25 jurka Exp $
+* $PostgreSQL: pgjdbc/org/postgresql/jdbc3/Jdbc3ResultSet.java,v 1.15 2007/07/27 08:54:54 jurka Exp $
*
*-------------------------------------------------------------------------
*/
@@ -55,7 +55,9 @@ public class Jdbc3ResultSet extends org.postgresql.jdbc3.AbstractJdbc3ResultSet
public Array createArray(int i) throws SQLException
{
checkResultSet(i);
- return new Jdbc3Array(connection, i, fields[i - 1], this);
+ int oid = fields[i - 1].getOID();
+ String value = getFixedString(i);
+ return new Jdbc3Array(connection, oid, value);
}
public Object getObject(String s, Map map) throws SQLException
diff --git a/org/postgresql/jdbc3g/Jdbc3gArray.java b/org/postgresql/jdbc3g/Jdbc3gArray.java
index f4fee5e4..2021e720 100644
--- a/org/postgresql/jdbc3g/Jdbc3gArray.java
+++ b/org/postgresql/jdbc3g/Jdbc3gArray.java
@@ -3,7 +3,7 @@
* Copyright (c) 2004-2005, PostgreSQL Global Development Group
*
* IDENTIFICATION
-* $PostgreSQL: pgjdbc/org/postgresql/jdbc3g/Jdbc3gArray.java,v 1.3 2004/11/09 08:51:22 jurka Exp $
+* $PostgreSQL: pgjdbc/org/postgresql/jdbc3g/Jdbc3gArray.java,v 1.4 2005/01/11 08:25:47 jurka Exp $
*
*-------------------------------------------------------------------------
*/
@@ -16,9 +16,9 @@ import java.sql.ResultSet;
public class Jdbc3gArray extends org.postgresql.jdbc2.AbstractJdbc2Array implements java.sql.Array
{
- public Jdbc3gArray(BaseConnection conn, int idx, Field field, BaseResultSet rs) throws SQLException
+ public Jdbc3gArray(BaseConnection conn, int oid, String fieldString) throws SQLException
{
- super(conn, idx, field, rs);
+ super(conn, oid, fieldString);
}
public Object getArray(Map < String, Class < ? >> map) throws SQLException
diff --git a/org/postgresql/jdbc3g/Jdbc3gResultSet.java b/org/postgresql/jdbc3g/Jdbc3gResultSet.java
index 63780381..e313ceb3 100644
--- a/org/postgresql/jdbc3g/Jdbc3gResultSet.java
+++ b/org/postgresql/jdbc3g/Jdbc3gResultSet.java
@@ -3,7 +3,7 @@
* Copyright (c) 2004-2005, PostgreSQL Global Development Group
*
* IDENTIFICATION
-* $PostgreSQL: pgjdbc/org/postgresql/jdbc3g/Jdbc3gResultSet.java,v 1.6 2007/02/19 06:00:25 jurka Exp $
+* $PostgreSQL: pgjdbc/org/postgresql/jdbc3g/Jdbc3gResultSet.java,v 1.7 2007/07/27 08:54:54 jurka Exp $
*
*-------------------------------------------------------------------------
*/
@@ -55,7 +55,9 @@ public class Jdbc3gResultSet extends org.postgresql.jdbc3.AbstractJdbc3ResultSet
public Array createArray(int i) throws SQLException
{
checkResultSet(i);
- return new Jdbc3gArray(connection, i, fields[i - 1], this);
+ int oid = fields[i - 1].getOID();
+ String value = getFixedString(i);
+ return new Jdbc3gArray(connection, oid, value);
}
public Object getObject(String s, Map < String, Class < ? >> map) throws SQLException
diff --git a/org/postgresql/jdbc4/AbstractJdbc4Connection.java b/org/postgresql/jdbc4/AbstractJdbc4Connection.java
index 1f8708b2..578b6e71 100644
--- a/org/postgresql/jdbc4/AbstractJdbc4Connection.java
+++ b/org/postgresql/jdbc4/AbstractJdbc4Connection.java
@@ -3,7 +3,7 @@
* Copyright (c) 2004-2005, PostgreSQL Global Development Group
*
* IDENTIFICATION
-* $PostgreSQL: pgjdbc/org/postgresql/jdbc4/AbstractJdbc4Connection.java,v 1.2 2006/10/31 06:12:46 jurka Exp $
+* $PostgreSQL: pgjdbc/org/postgresql/jdbc4/AbstractJdbc4Connection.java,v 1.3 2007/10/07 19:40:02 jurka Exp $
*
*-------------------------------------------------------------------------
*/
@@ -15,7 +15,11 @@ import java.util.HashMap;
import java.util.Iterator;
import java.util.Properties;
+import org.postgresql.core.Oid;
import org.postgresql.util.GT;
+import org.postgresql.util.PSQLState;
+import org.postgresql.util.PSQLException;
+import org.postgresql.jdbc2.AbstractJdbc2Array;
abstract class AbstractJdbc4Connection extends org.postgresql.jdbc3.AbstractJdbc3Connection
{
@@ -52,7 +56,39 @@ abstract class AbstractJdbc4Connection extends org.postgresql.jdbc3.AbstractJdbc
public Array createArrayOf(String typeName, Object[] elements) throws SQLException
{
- throw org.postgresql.Driver.notImplemented(this.getClass(), "createArrayOf(String, Object[])");
+ int oid = getPGArrayType(typeName);
+ if (oid == Oid.UNSPECIFIED)
+ throw new PSQLException(GT.tr("Unable to find server array type for provided name {0}.", typeName), PSQLState.INVALID_NAME);
+
+ StringBuffer sb = new StringBuffer();
+ appendArray(sb, elements);
+
+ // This will not work once we have a JDBC 5,
+ // but it'll do for now.
+ return new Jdbc4Array(this, oid, sb.toString());
+ }
+
+ private static void appendArray(StringBuffer sb, Object elements)
+ {
+ sb.append('{');
+
+ int nElements = java.lang.reflect.Array.getLength(elements);
+ for (int i=0; i<nElements; i++) {
+ if (i > 0) {
+ sb.append(',');
+ }
+
+ Object o = java.lang.reflect.Array.get(elements, i);
+ if (o == null) {
+ sb.append("NULL");
+ } else if (o.getClass().isArray()) {
+ appendArray(sb, o);
+ } else {
+ String s = o.toString();
+ AbstractJdbc2Array.escapeArrayElement(sb, s);
+ }
+ }
+ sb.append('}');
}
public boolean isValid(int timeout) throws SQLException
diff --git a/org/postgresql/jdbc4/Jdbc4Array.java b/org/postgresql/jdbc4/Jdbc4Array.java
index 2e27d54c..bb6a6937 100644
--- a/org/postgresql/jdbc4/Jdbc4Array.java
+++ b/org/postgresql/jdbc4/Jdbc4Array.java
@@ -3,7 +3,7 @@
* Copyright (c) 2004-2005, PostgreSQL Global Development Group
*
* IDENTIFICATION
-* $PostgreSQL: pgjdbc/org/postgresql/jdbc4/Jdbc4Array.java,v 1.1 2006/06/08 10:34:52 jurka Exp $
+* $PostgreSQL: pgjdbc/org/postgresql/jdbc4/Jdbc4Array.java,v 1.2 2006/10/31 06:12:47 jurka Exp $
*
*-------------------------------------------------------------------------
*/
@@ -16,9 +16,9 @@ import java.sql.ResultSet;
public class Jdbc4Array extends org.postgresql.jdbc2.AbstractJdbc2Array implements java.sql.Array
{
- public Jdbc4Array(BaseConnection conn, int idx, Field field, BaseResultSet rs) throws SQLException
+ public Jdbc4Array(BaseConnection conn, int oid, String fieldString) throws SQLException
{
- super(conn, idx, field, rs);
+ super(conn, oid, fieldString);
}
public Object getArray(Map < String, Class < ? >> map) throws SQLException
diff --git a/org/postgresql/jdbc4/Jdbc4ResultSet.java b/org/postgresql/jdbc4/Jdbc4ResultSet.java
index 1103222a..b8664d4d 100644
--- a/org/postgresql/jdbc4/Jdbc4ResultSet.java
+++ b/org/postgresql/jdbc4/Jdbc4ResultSet.java
@@ -3,7 +3,7 @@
* Copyright (c) 2004-2005, PostgreSQL Global Development Group
*
* IDENTIFICATION
-* $PostgreSQL: pgjdbc/org/postgresql/jdbc4/Jdbc4ResultSet.java,v 1.2 2007/02/19 06:00:32 jurka Exp $
+* $PostgreSQL: pgjdbc/org/postgresql/jdbc4/Jdbc4ResultSet.java,v 1.3 2007/07/27 08:54:54 jurka Exp $
*
*-------------------------------------------------------------------------
*/
@@ -55,7 +55,9 @@ public class Jdbc4ResultSet extends AbstractJdbc4ResultSet implements java.sql.R
public Array createArray(int i) throws SQLException
{
checkResultSet(i);
- return new Jdbc4Array(connection, i, fields[i - 1], this);
+ int oid = fields[i - 1].getOID();
+ String value = getFixedString(i);
+ return new Jdbc4Array(connection, oid, value);
}
public Object getObject(String s, Map < String, Class < ? >> map) throws SQLException
diff --git a/org/postgresql/test/jdbc4/ArrayTest.java b/org/postgresql/test/jdbc4/ArrayTest.java
new file mode 100644
index 00000000..dabe3c2c
--- /dev/null
+++ b/org/postgresql/test/jdbc4/ArrayTest.java
@@ -0,0 +1,142 @@
+/*-------------------------------------------------------------------------
+*
+* Copyright (c) 2007, PostgreSQL Global Development Group
+*
+* IDENTIFICATION
+* $PostgreSQL$
+*
+*-------------------------------------------------------------------------
+*/
+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();
+ }
+
+ protected void tearDown() throws SQLException {
+ TestUtil.closeDB(_conn);
+ }
+
+ public void testCreateArrayOfInt() throws SQLException {
+ PreparedStatement pstmt = _conn.prepareStatement("SELECT ?");
+ 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 ?");
+ 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;
+
+ PreparedStatement pstmt = _conn.prepareStatement("SELECT ?");
+ 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 ?");
+ 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);
+ }
+
+ 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);
+ }
+
+}
diff --git a/org/postgresql/test/jdbc4/Jdbc4TestSuite.java b/org/postgresql/test/jdbc4/Jdbc4TestSuite.java
index 09a2533b..2e8e03fe 100644
--- a/org/postgresql/test/jdbc4/Jdbc4TestSuite.java
+++ b/org/postgresql/test/jdbc4/Jdbc4TestSuite.java
@@ -3,7 +3,7 @@
* Copyright (c) 2007, PostgreSQL Global Development Group
*
* IDENTIFICATION
-* $PostgreSQL: pgjdbc/org/postgresql/test/jdbc4/Jdbc4TestSuite.java,v 1.2 2007/07/27 10:15:38 jurka Exp $
+* $PostgreSQL: pgjdbc/org/postgresql/test/jdbc4/Jdbc4TestSuite.java,v 1.3 2007/10/07 19:40:02 jurka Exp $
*
*-------------------------------------------------------------------------
*/
@@ -27,6 +27,7 @@ public class Jdbc4TestSuite extends TestSuite
suite.addTestSuite(LOBTest.class);
suite.addTestSuite(DatabaseMetaDataTest.class);
+ suite.addTestSuite(ArrayTest.class);
return suite;
}
}
diff --git a/org/postgresql/util/PSQLState.java b/org/postgresql/util/PSQLState.java
index 1a55c4b0..3d7015ec 100644
--- a/org/postgresql/util/PSQLState.java
+++ b/org/postgresql/util/PSQLState.java
@@ -3,7 +3,7 @@
* Copyright (c) 2003-2005, PostgreSQL Global Development Group
*
* IDENTIFICATION
-* $PostgreSQL: pgjdbc/org/postgresql/util/PSQLState.java,v 1.10 2006/04/29 00:06:52 jurka Exp $
+* $PostgreSQL: pgjdbc/org/postgresql/util/PSQLState.java,v 1.11 2006/04/29 13:30:24 jurka Exp $
*
*-------------------------------------------------------------------------
*/
@@ -70,6 +70,7 @@ public class PSQLState implements java.io.Serializable
public final static PSQLState NUMERIC_CONSTANT_OUT_OF_RANGE = new PSQLState("42820");
public final static PSQLState DATA_TYPE_MISMATCH = new PSQLState("42821");
public final static PSQLState UNDEFINED_FUNCTION = new PSQLState("42883");
+ public final static PSQLState INVALID_NAME = new PSQLState("42602");
public final static PSQLState OUT_OF_MEMORY = new PSQLState("53200");
public final static PSQLState OBJECT_NOT_IN_STATE = new PSQLState("55000");
[parent: 4f7cc8033d63]