001: /*-------------------------------------------------------------------------
002: *
003: * Copyright (c) 2004-2005, PostgreSQL Global Development Group
004: *
005: * IDENTIFICATION
006: * $PostgreSQL: pgjdbc/org/postgresql/test/jdbc2/ResultSetMetaDataTest.java,v 1.15 2006/05/15 09:35:57 jurka Exp $
007: *
008: *-------------------------------------------------------------------------
009: */
010: package org.postgresql.test.jdbc2;
011:
012: import org.postgresql.PGResultSetMetaData;
013: import org.postgresql.test.TestUtil;
014: import junit.framework.TestCase;
015: import java.sql.*;
016:
017: public class ResultSetMetaDataTest extends TestCase {
018:
019: private Connection conn;
020:
021: public ResultSetMetaDataTest(String name) {
022: super (name);
023: }
024:
025: protected void setUp() throws Exception {
026: conn = TestUtil.openDB();
027: TestUtil.createTable(conn, "rsmd1",
028: "a int primary key, b text, c decimal(10,2)", true);
029: TestUtil
030: .createTable(
031: conn,
032: "timetest",
033: "tm time(3), tmtz timetz, ts timestamp without time zone, tstz timestamp(6) with time zone");
034:
035: TestUtil.dropSequence(conn, "serialtest_a_seq");
036: TestUtil.dropSequence(conn, "serialtest_b_seq");
037: TestUtil.createTable(conn, "serialtest",
038: "a serial, b bigserial, c int");
039: TestUtil
040: .createTable(
041: conn,
042: "alltypes",
043: "bool boolean, i2 int2, i4 int4, i8 int8, num numeric(10,2), re real, fl float, ch char(3), vc varchar(3), tx text, d date, t time without time zone, tz time with time zone, ts timestamp without time zone, tsz timestamp with time zone, bt bytea");
044: TestUtil
045: .createTable(
046: conn,
047: "sizetest",
048: "fixedchar char(5), fixedvarchar varchar(5), unfixedvarchar varchar, txt text, bytearr bytea, num64 numeric(6,4), num60 numeric(6,0), num numeric, ip inet");
049: }
050:
051: protected void tearDown() throws Exception {
052: TestUtil.dropTable(conn, "rsmd1");
053: TestUtil.dropTable(conn, "timetest");
054: TestUtil.dropTable(conn, "serialtest");
055: TestUtil.dropTable(conn, "alltypes");
056: TestUtil.dropTable(conn, "sizetest");
057: TestUtil.dropSequence(conn, "serialtest_a_seq");
058: TestUtil.dropSequence(conn, "serialtest_b_seq");
059: TestUtil.closeDB(conn);
060: }
061:
062: public void testStandardResultSet() throws SQLException {
063: Statement stmt = conn.createStatement();
064: ResultSet rs = stmt
065: .executeQuery("SELECT a,b,c,a+c as total,oid,b as d FROM rsmd1");
066: runStandardTests(rs.getMetaData());
067: rs.close();
068: stmt.close();
069: }
070:
071: public void testPreparedResultSet() throws SQLException {
072: if (!TestUtil.isProtocolVersion(conn, 3))
073: return;
074:
075: PreparedStatement pstmt = conn
076: .prepareStatement("SELECT a,b,c,a+c as total,oid,b as d FROM rsmd1 WHERE b = ?");
077: runStandardTests(pstmt.getMetaData());
078: pstmt.close();
079: }
080:
081: private void runStandardTests(ResultSetMetaData rsmd)
082: throws SQLException {
083: PGResultSetMetaData pgrsmd = (PGResultSetMetaData) rsmd;
084:
085: assertEquals(6, rsmd.getColumnCount());
086:
087: assertEquals("a", rsmd.getColumnLabel(1));
088: assertEquals("total", rsmd.getColumnLabel(4));
089:
090: assertEquals("a", rsmd.getColumnName(1));
091: assertEquals("oid", rsmd.getColumnName(5));
092: if (TestUtil.isProtocolVersion(conn, 3)) {
093: assertEquals("", pgrsmd.getBaseColumnName(4));
094: assertEquals("b", pgrsmd.getBaseColumnName(6));
095: }
096:
097: assertEquals(Types.INTEGER, rsmd.getColumnType(1));
098: assertEquals(Types.VARCHAR, rsmd.getColumnType(2));
099:
100: assertEquals("int4", rsmd.getColumnTypeName(1));
101: assertEquals("text", rsmd.getColumnTypeName(2));
102:
103: assertEquals(10, rsmd.getPrecision(3));
104:
105: assertEquals(2, rsmd.getScale(3));
106:
107: assertEquals("", rsmd.getSchemaName(1));
108: assertEquals("", rsmd.getSchemaName(4));
109: if (TestUtil.isProtocolVersion(conn, 3)) {
110: assertEquals("public", pgrsmd.getBaseSchemaName(1));
111: assertEquals("", pgrsmd.getBaseSchemaName(4));
112: }
113:
114: assertEquals("", rsmd.getTableName(1));
115: assertEquals("", rsmd.getTableName(4));
116: if (TestUtil.isProtocolVersion(conn, 3)) {
117: assertEquals("rsmd1", pgrsmd.getBaseTableName(1));
118: assertEquals("", pgrsmd.getBaseTableName(4));
119: }
120:
121: if (TestUtil.isProtocolVersion(conn, 3)) {
122: assertEquals(ResultSetMetaData.columnNoNulls, rsmd
123: .isNullable(1));
124: assertEquals(ResultSetMetaData.columnNullable, rsmd
125: .isNullable(2));
126: assertEquals(ResultSetMetaData.columnNullableUnknown, rsmd
127: .isNullable(4));
128: } else {
129: assertEquals(ResultSetMetaData.columnNullableUnknown, rsmd
130: .isNullable(1));
131: }
132: }
133:
134: // verify that a prepared update statement returns no metadata and doesn't execute.
135: public void testPreparedUpdate() throws SQLException {
136: PreparedStatement pstmt = conn
137: .prepareStatement("INSERT INTO rsmd1(a,b) VALUES(?,?)");
138: pstmt.setInt(1, 1);
139: pstmt.setString(2, "hello");
140: ResultSetMetaData rsmd = pstmt.getMetaData();
141: assertNull(rsmd);
142: pstmt.close();
143:
144: Statement stmt = conn.createStatement();
145: ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM rsmd1");
146: assertTrue(rs.next());
147: assertEquals(0, rs.getInt(1));
148: rs.close();
149: stmt.close();
150: }
151:
152: public void testDatabaseMetaDataNames() throws SQLException {
153: DatabaseMetaData databaseMetaData = conn.getMetaData();
154: ResultSet resultSet = databaseMetaData.getTableTypes();
155: ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
156: assertEquals(1, resultSetMetaData.getColumnCount());
157: assertEquals("TABLE_TYPE", resultSetMetaData.getColumnName(1));
158: resultSet.close();
159: }
160:
161: public void testTimestampInfo() throws SQLException {
162: Statement stmt = conn.createStatement();
163: ResultSet rs = stmt
164: .executeQuery("SELECT tm, tmtz, ts, tstz FROM timetest");
165: ResultSetMetaData rsmd = rs.getMetaData();
166:
167: // For reference:
168: // TestUtil.createTable(conn, "timetest", "tm time(3), tmtz timetz, ts timestamp without time zone, tstz timestamp(6) with time zone");
169:
170: assertEquals(3, rsmd.getScale(1));
171: assertEquals(6, rsmd.getScale(2));
172: assertEquals(6, rsmd.getScale(3));
173: assertEquals(6, rsmd.getScale(4));
174:
175: assertEquals(12, rsmd.getColumnDisplaySize(1));
176: assertEquals(21, rsmd.getColumnDisplaySize(2));
177: assertEquals(29, rsmd.getColumnDisplaySize(3));
178: assertEquals(35, rsmd.getColumnDisplaySize(4));
179:
180: rs.close();
181: stmt.close();
182: }
183:
184: public void testColumnDisplaySize() throws SQLException {
185: Statement stmt = conn.createStatement();
186: ResultSet rs = stmt
187: .executeQuery("SELECT fixedchar, fixedvarchar, unfixedvarchar, txt, bytearr, num64, num60, num, ip FROM sizetest");
188: ResultSetMetaData rsmd = rs.getMetaData();
189:
190: assertEquals(5, rsmd.getColumnDisplaySize(1));
191: assertEquals(5, rsmd.getColumnDisplaySize(2));
192: assertEquals(Integer.MAX_VALUE, rsmd.getColumnDisplaySize(3));
193: assertEquals(Integer.MAX_VALUE, rsmd.getColumnDisplaySize(4));
194: assertEquals(Integer.MAX_VALUE, rsmd.getColumnDisplaySize(5));
195: assertEquals(8, rsmd.getColumnDisplaySize(6));
196: assertEquals(7, rsmd.getColumnDisplaySize(7));
197: assertEquals(131089, rsmd.getColumnDisplaySize(8));
198: assertEquals(Integer.MAX_VALUE, rsmd.getColumnDisplaySize(9));
199: }
200:
201: public void testIsAutoIncrement() throws SQLException {
202: Statement stmt = conn.createStatement();
203: ResultSet rs = stmt
204: .executeQuery("SELECT c,b,a FROM serialtest");
205: ResultSetMetaData rsmd = rs.getMetaData();
206:
207: assertTrue(!rsmd.isAutoIncrement(1));
208: if (TestUtil.isProtocolVersion(conn, 3)) {
209: assertTrue(rsmd.isAutoIncrement(2));
210: assertTrue(rsmd.isAutoIncrement(3));
211: }
212:
213: rs.close();
214: stmt.close();
215: }
216:
217: public void testClassesMatch() throws SQLException {
218: Statement stmt = conn.createStatement();
219: stmt
220: .executeUpdate("INSERT INTO alltypes (bool, i2, i4, i8, num, re, fl, ch, vc, tx, d, t, tz, ts, tsz, bt) VALUES ('t', 2, 4, 8, 3.1, 3.14, 3.141, 'c', 'vc', 'tx', '2004-04-09', '09:01:00', '11:11:00-01','2004-04-09 09:01:00','1999-09-19 14:23:12-09', '\\\\123')");
221: ResultSet rs = stmt.executeQuery("SELECT * FROM alltypes");
222: ResultSetMetaData rsmd = rs.getMetaData();
223: assertTrue(rs.next());
224: for (int i = 0; i < rsmd.getColumnCount(); i++) {
225: assertEquals(rs.getObject(i + 1).getClass().getName(), rsmd
226: .getColumnClassName(i + 1));
227: }
228: }
229:
230: }
|