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]