blob: 110172240d4505db8d2c28fe231707aa9511081e [file] [log] [blame]
/*
*
* Derby - Classs org.apache.derbyTesting.functionTests.tests.jdbcapi.PrepStmtMetaDataTest
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific
* language governing permissions and limitations under the License.
*/
package org.apache.derbyTesting.functionTests.tests.jdbcapi;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import junit.framework.Test;
import org.apache.derbyTesting.junit.BaseJDBCTestCase;
import org.apache.derbyTesting.junit.JDBC;
import org.apache.derbyTesting.junit.SQLUtilities;
import org.apache.derbyTesting.junit.TestConfiguration;
public class PrepStmtMetaDataTest extends BaseJDBCTestCase {
public PrepStmtMetaDataTest(String name) {
super(name);
}
/**
* Test getMetaData calls on prepared statements that do not return a
* ResultSet
*/
public void testNoResultSetMeta() throws SQLException {
// test MetaData with statements that
// do not return a ResultSet
checkEmptyMetaData("create table ab(a int)", true);
checkEmptyMetaData("alter table ab add column b int", true);
Statement s = createStatement();
s
.execute("create procedure testproc() language java external name "
+ "'org.apache.derbyTesting.functionTests.tests.jdbcapi.PrepStmtMetaDataTest.tstmeth'"
+ " parameter style java");
// test call statement - shouldn't have meta data
checkEmptyMetaData("call testproc()", false);
// test drop procedure - meta data should be null
checkEmptyMetaData("drop procedure testproc", true);
// test create schema - meta data should be null
checkEmptyMetaData("create schema myschema", true);
// test drop schema - meta data should be null
checkEmptyMetaData("drop schema myschema restrict", true);
s.execute("CREATE TABLE TRIGTAB (i int)");
// test create trigger - meta data should be null
checkEmptyMetaData(
"create trigger mytrig after insert on ab for each row insert into trigtab values(1)",
true);
// test drop trigger - meta data should be null
checkEmptyMetaData("drop trigger mytrig", true);
// test create view - meta data should be null
checkEmptyMetaData("create view myview as select * from ab", true);
// test drop view - meta data should be null
checkEmptyMetaData("drop view myview", true);
// test drop table - meta data should be null
checkEmptyMetaData("drop table ab", false);
// test create index - meta data should be null
checkEmptyMetaData("create index aindex on ab(a)", true);
// test drop index - meta data should be null
checkEmptyMetaData("drop index aindex", false);
// test insert - meta data should be null
checkEmptyMetaData("insert into ab values(1,1)", true);
// test update - meta data should be null
checkEmptyMetaData("update ab set a = 2", false);
// test delete - meta data should be null
checkEmptyMetaData("delete from ab", false);
s.executeUpdate("drop table ab");
s.close();
}
public void testAlterTableMeta() throws SQLException {
Statement s = createStatement();
s.executeUpdate("create table bug4579 (c11 int)");
s.executeUpdate("insert into bug4579 values (1)");
PreparedStatement ps = prepareStatement("select * from bug4579");
ResultSetMetaData rsmd = ps.getMetaData();
assertEquals(1, rsmd.getColumnCount());
assertEquals(java.sql.Types.INTEGER, rsmd.getColumnType(1));
assertEquals("C11", rsmd.getColumnName(1));
s.executeUpdate("alter table bug4579 add column c12 int");
if (usingDerbyNetClient()) {
// DERBY-2402 Client does not report added columns.
// Take out check when DERBY-2402 is fixed
//
} else {
rsmd = ps.getMetaData();
assertEquals(2, rsmd.getColumnCount());
assertEquals(java.sql.Types.INTEGER, rsmd.getColumnType(1));
assertEquals("C11", rsmd.getColumnName(1));
assertEquals(java.sql.Types.INTEGER, rsmd.getColumnType(2));
assertEquals("C12", rsmd.getColumnName(2));
}
// ResultSetMetaData for select * after alter table and
// executeQuery.
s.executeUpdate("alter table bug4579 add column c13 int");
ResultSet rs = ps.executeQuery();
rsmd = ps.getMetaData();
assertEquals(3, rsmd.getColumnCount());
assertEquals(java.sql.Types.INTEGER, rsmd.getColumnType(1));
assertEquals("C11", rsmd.getColumnName(1));
assertEquals(java.sql.Types.INTEGER, rsmd.getColumnType(2));
assertEquals("C12", rsmd.getColumnName(2));
assertEquals(java.sql.Types.INTEGER, rsmd.getColumnType(3));
assertEquals("C13", rsmd.getColumnName(3));
// Check ps metadata again
rsmd = ps.getMetaData();
assertEquals(3, rsmd.getColumnCount());
assertEquals(java.sql.Types.INTEGER, rsmd.getColumnType(1));
assertEquals("C11", rsmd.getColumnName(1));
assertEquals(java.sql.Types.INTEGER, rsmd.getColumnType(2));
assertEquals("C12", rsmd.getColumnName(2));
assertEquals(java.sql.Types.INTEGER, rsmd.getColumnType(3));
assertEquals("C13", rsmd.getColumnName(3));
rs.close();
ps.close();
s.executeUpdate("drop table bug4579");
s.close();
}
/**
* Check the metatdata for a prepared statement that does not return a
* ResultSet is empty
*
* @param sql
* sql for prepared statement
* @param execute
* execute PreparedStatement if true
* @throws SQLException
*/
private void checkEmptyMetaData(String sql, boolean execute)
throws SQLException {
PreparedStatement ps = prepareStatement(sql);
ResultSetMetaData rsmd = ps.getMetaData();
assertEmptyResultSetMetaData(rsmd);
if (execute)
ps.executeUpdate();
ps.close();
}
public void testAllDataTypesMetaData() throws SQLException
{
Statement s = createStatement();
SQLUtilities.createAndPopulateAllDataTypesTable(s);
s.close();
PreparedStatement ps = prepareStatement("SELECT * from AllDataTypesTable");
ResultSetMetaData rsmd = ps.getMetaData();
int colCount = rsmd.getColumnCount();
assertEquals(17, colCount);
// Column 1 SMALLINT
assertEquals("",rsmd.getCatalogName(1));
assertEquals("java.lang.Integer", rsmd.getColumnClassName(1));
assertEquals(6, rsmd.getColumnDisplaySize(1));
assertEquals("SMALLINTCOL", rsmd.getColumnLabel(1));
assertEquals(java.sql.Types.SMALLINT,rsmd.getColumnType(1));
assertEquals("SMALLINT", rsmd.getColumnTypeName(1));
assertEquals(5,rsmd.getPrecision(1));
assertEquals(0, rsmd.getScale(1));
assertEquals("APP", rsmd.getSchemaName(1));
assertEquals("ALLDATATYPESTABLE",rsmd.getTableName(1));
assertFalse(rsmd.isAutoIncrement(1));
assertFalse(rsmd.isCurrency(1));
assertFalse(rsmd.isDefinitelyWritable(1));
assertEquals(ResultSetMetaData.columnNullable, rsmd.isNullable(1));
// DERBY-142 client returns incorrect value for isReadOnly
if (usingEmbedded())
assertFalse(rsmd.isReadOnly(1));
assertTrue(rsmd.isSearchable(1));
assertTrue(rsmd.isSigned(1));
assertFalse(rsmd.isWritable(1));
// COLUMN 2 INTEGER
assertEquals("java.lang.Integer", rsmd.getColumnClassName(2));
assertEquals(11, rsmd.getColumnDisplaySize(2));
assertEquals("INTEGERCOL", rsmd.getColumnLabel(2));
assertEquals(java.sql.Types.INTEGER,rsmd.getColumnType(2));
assertEquals("INTEGER", rsmd.getColumnTypeName(2));
assertEquals(10,rsmd.getPrecision(2));
assertEquals(0, rsmd.getScale(2));
// COLUMN 3 BIGINT
assertEquals("java.lang.Long", rsmd.getColumnClassName(3));
assertEquals(20, rsmd.getColumnDisplaySize(3));
assertEquals("BIGINTCOL", rsmd.getColumnLabel(3));
assertEquals(java.sql.Types.BIGINT,rsmd.getColumnType(3));
assertEquals("BIGINT", rsmd.getColumnTypeName(3));
assertEquals(19,rsmd.getPrecision(3));
assertEquals(0, rsmd.getScale(3));
// COLUMN 4 DECIMAL
assertEquals("java.math.BigDecimal", rsmd.getColumnClassName(4));
assertEquals(12, rsmd.getColumnDisplaySize(4));
assertEquals("DECIMALCOL", rsmd.getColumnLabel(4));
assertEquals(java.sql.Types.DECIMAL,rsmd.getColumnType(4));
assertEquals("DECIMAL", rsmd.getColumnTypeName(4));
assertEquals(10,rsmd.getPrecision(4));
assertEquals(5, rsmd.getScale(4));
// COLUMN 5 REAL
assertEquals("java.lang.Float", rsmd.getColumnClassName(5));
assertEquals(15, rsmd.getColumnDisplaySize(5));
assertEquals("REALCOL", rsmd.getColumnLabel(5));
assertEquals(java.sql.Types.REAL,rsmd.getColumnType(5));
assertEquals("REAL", rsmd.getColumnTypeName(5));
assertEquals(7,rsmd.getPrecision(5));
assertEquals(0, rsmd.getScale(5));
// COLUMN 6 DOUBLE
assertEquals("java.lang.Double", rsmd.getColumnClassName(6));
assertEquals(24, rsmd.getColumnDisplaySize(6));
assertEquals("DOUBLECOL", rsmd.getColumnLabel(6));
assertEquals(java.sql.Types.DOUBLE,rsmd.getColumnType(6));
assertEquals("DOUBLE", rsmd.getColumnTypeName(6));
assertEquals(15,rsmd.getPrecision(6));
assertEquals(0, rsmd.getScale(6));
// COLUMN 7 CHAR (60)
assertEquals("java.lang.String", rsmd.getColumnClassName(7));
assertEquals(60, rsmd.getColumnDisplaySize(7));
assertEquals("CHARCOL", rsmd.getColumnLabel(7));
assertEquals(java.sql.Types.CHAR,rsmd.getColumnType(7));
assertEquals("CHAR", rsmd.getColumnTypeName(7));
assertEquals(60,rsmd.getPrecision(7));
assertEquals(0, rsmd.getScale(7));
// COLUMN 8 VARCHAR (60)
assertEquals("java.lang.String", rsmd.getColumnClassName(8));
assertEquals(60, rsmd.getColumnDisplaySize(8));
assertEquals("VARCHARCOL", rsmd.getColumnLabel(8));
assertEquals(java.sql.Types.VARCHAR,rsmd.getColumnType(8));
assertEquals("VARCHAR", rsmd.getColumnTypeName(8));
assertEquals(60,rsmd.getPrecision(8));
assertEquals(0, rsmd.getScale(8));
// COLUMN 9 LONG VARCHAR
assertEquals("java.lang.String", rsmd.getColumnClassName(9));
assertEquals(32700, rsmd.getColumnDisplaySize(9));
assertEquals("LONGVARCHARCOL", rsmd.getColumnLabel(9));
assertEquals(java.sql.Types.LONGVARCHAR,rsmd.getColumnType(9));
assertEquals("LONG VARCHAR", rsmd.getColumnTypeName(9));
assertEquals(32700,rsmd.getPrecision(9));
assertEquals(0, rsmd.getScale(9));
// COLUMN 10 CHAR FOR BIT DATA
assertEquals("byte[]", rsmd.getColumnClassName(10));
assertEquals(120, rsmd.getColumnDisplaySize(10));
assertEquals("CHARFORBITCOL", rsmd.getColumnLabel(10));
assertEquals(java.sql.Types.BINARY,rsmd.getColumnType(10));
if (usingEmbedded())
assertEquals("CHAR () FOR BIT DATA", rsmd.getColumnTypeName(10));
else
assertEquals("CHAR FOR BIT DATA", rsmd.getColumnTypeName(10));
assertEquals(60,rsmd.getPrecision(10));
assertEquals(0, rsmd.getScale(10));
// COLUMN 11 VARCHAR FOR BIT DATA
assertEquals("byte[]", rsmd.getColumnClassName(11));
assertEquals(120, rsmd.getColumnDisplaySize(11));
assertEquals("VARCHARFORBITCOL", rsmd.getColumnLabel(11));
assertEquals(java.sql.Types.VARBINARY,rsmd.getColumnType(11));
if (usingEmbedded())
assertEquals("VARCHAR () FOR BIT DATA", rsmd.getColumnTypeName(11));
else
assertEquals("VARCHAR FOR BIT DATA", rsmd.getColumnTypeName(11));
assertEquals(60,rsmd.getPrecision(11));
assertEquals(0, rsmd.getScale(11));
// COLUMN 12 LONG VARCHAR FOR BIT DATA
assertEquals("byte[]", rsmd.getColumnClassName(12));
assertEquals(65400, rsmd.getColumnDisplaySize(12));
assertEquals("LVARCHARFORBITCOL", rsmd.getColumnLabel(12));
assertEquals(java.sql.Types.LONGVARBINARY,rsmd.getColumnType(12));
assertEquals("LONG VARCHAR FOR BIT DATA", rsmd.getColumnTypeName(12));
assertEquals(32700,rsmd.getPrecision(12));
assertEquals(0, rsmd.getScale(12));
// COLUMN 13 CLOB
assertEquals("java.sql.Clob", rsmd.getColumnClassName(13));
assertEquals(1024, rsmd.getColumnDisplaySize(13));
assertEquals("CLOBCOL", rsmd.getColumnLabel(13));
assertEquals(java.sql.Types.CLOB,rsmd.getColumnType(13));
assertEquals("CLOB", rsmd.getColumnTypeName(13));
assertEquals(1024,rsmd.getPrecision(13));
assertEquals(0, rsmd.getScale(13));
// COLUMN 14 DATE
assertEquals("java.sql.Date", rsmd.getColumnClassName(14));
assertEquals(10, rsmd.getColumnDisplaySize(14));
assertEquals("DATECOL", rsmd.getColumnLabel(14));
assertEquals(java.sql.Types.DATE,rsmd.getColumnType(14));
assertEquals("DATE", rsmd.getColumnTypeName(14));
assertEquals(10,rsmd.getPrecision(14));
assertEquals(0, rsmd.getScale(14));
// COLUMN 15 TIME
assertEquals("java.sql.Time", rsmd.getColumnClassName(15));
assertEquals(8, rsmd.getColumnDisplaySize(15));
assertEquals("TIMECOL", rsmd.getColumnLabel(15));
assertEquals(java.sql.Types.TIME,rsmd.getColumnType(15));
assertEquals("TIME", rsmd.getColumnTypeName(15));
assertEquals(8,rsmd.getPrecision(15));
assertEquals(0, rsmd.getScale(15));
// COLUMN 16 TIMESTAMP
assertEquals("java.sql.Timestamp", rsmd.getColumnClassName(16));
assertEquals(29, rsmd.getColumnDisplaySize(16));
assertEquals("TIMESTAMPCOL", rsmd.getColumnLabel(16));
assertEquals(java.sql.Types.TIMESTAMP,rsmd.getColumnType(16));
assertEquals("TIMESTAMP", rsmd.getColumnTypeName(16));
assertEquals(29,rsmd.getPrecision(16));
assertEquals(9, rsmd.getScale(16));
// COLUMN 17 BLOB
assertEquals("java.sql.Blob", rsmd.getColumnClassName(17));
assertEquals(2048, rsmd.getColumnDisplaySize(17));
assertEquals("BLOBCOL", rsmd.getColumnLabel(17));
assertEquals(java.sql.Types.BLOB,rsmd.getColumnType(17));
assertEquals("BLOB", rsmd.getColumnTypeName(17));
assertEquals(1024,rsmd.getPrecision(17));
assertEquals(0, rsmd.getScale(17));
ps.close();
}
/**
* Assert that ResultSetMetaData is null or empty
*
* @param rsmd
* ResultSetMetaData to check
* @throws SQLException
*/
private void assertEmptyResultSetMetaData(ResultSetMetaData rsmd)
throws SQLException {
if (rsmd != null)
assertEquals(0, rsmd.getColumnCount());
}
public static Test suite() {
return TestConfiguration.defaultSuite(PrepStmtMetaDataTest.class);
}
public static void tstmeth() {
// for purpose of test, method may do nothing
}
}