You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by ba...@apache.org on 2005/03/05 01:21:08 UTC

svn commit: r156209 [3/4] - in incubator/derby/code/trunk: java/build/org/apache/derbyBuild/ java/drda/ java/engine/org/apache/derby/catalog/ java/engine/org/apache/derby/impl/jdbc/ java/testing/org/apache/derbyTesting/functionTests/master/ java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/ java/testing/org/apache/derbyTesting/functionTests/suites/ java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/ tools/ant/properties/

Modified: incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/metadata.java
URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/metadata.java?view=diff&r1=156208&r2=156209
==============================================================================
--- incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/metadata.java (original)
+++ incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/metadata.java Fri Mar  4 16:20:59 2005
@@ -47,778 +47,108 @@
  * @author alan
  */
 
-public class metadata {
+public class metadata extends metadata_test {
 
-	public static void main(String[] args) {
+	/**
+	 * Constructor:
+	 * Just intializes the Connection and Statement fields
+	 * to be used through the test.
+	 */
+	public metadata(String [] args) {
 
-		DatabaseMetaData met;
-		Connection con;
-		Statement  s;
-		ResultSet rs;
-		ResultSetMetaData rsmet;
-
-		System.out.println("Test metadata starting");
-
-		try
-		{
-			// use the ij utility to read the property file and
-			// make the initial connection.
-			ij.getPropertyArg(args);
-			con = ij.startJBMS();
-			//con.setAutoCommit(true); // make sure it is true
-			con.setAutoCommit(false);
+		try {
 
-			// Create a table with a primary key and some unique keys
-			// and a default
+			con = createConnection(args);
 			s = con.createStatement();
 
-			// test decimal type and other numeric types precision, scale,
-			// and display width after operations, beetle 3875, 3906
-			s.execute("create table t (i int, s smallint, r real, "+
-				"d double precision, dt date, t time, ts timestamp, "+
-				"c char(10), v varchar(40) not null, dc dec(10,2))");
-			s.execute("insert into t values(1,2,3.3,4.4,date('1990-05-05'),"+
-						 "time('12:06:06'),timestamp('1990-07-07 07:07:07.07'),"+
-						 "'eight','nine', 11.1)");
-
-			// test decimal type and other numeric types precision, scale,
-			// and display width after operations, beetle 3875, 3906
-			//rs = s.executeQuery("select dc from t where tn = 10 union select dc from t where i = 1");
-			rs = s.executeQuery("select dc from t where dc = 11.1 union select dc from t where i = 1");
-			rsmet = rs.getMetaData();
-			System.out.println("Column display size of the union result is: " + rsmet.getColumnDisplaySize(1));
-			rs.close();
-
-			rs = s.executeQuery("select dc, dc, r+dc, d-dc, dc-d from t");
-			rsmet = rs.getMetaData();
-			System.out.println("dec(10,2) -- precision: " + rsmet.getPrecision(1) + " scale: " + rsmet.getScale(1) + " display size: " + rsmet.getColumnDisplaySize(1) + " type name: " + rsmet.getColumnTypeName(1));
-			System.out.println("dec(10,2) -- precision: " + rsmet.getPrecision(2) + " scale: " + rsmet.getScale(2) + " display size: " + rsmet.getColumnDisplaySize(2) + " type name: " + rsmet.getColumnTypeName(2));
-			System.out.println("real + dec(10,2) -- precision: " + rsmet.getPrecision(3) + " scale: " + rsmet.getScale(3) + " display size: " + rsmet.getColumnDisplaySize(3) + " type name: " + rsmet.getColumnTypeName(3));
-			System.out.println("double precision - dec(10,2) -- precision: " + rsmet.getPrecision(4) + " scale: " + rsmet.getScale(4) + " display size: " + rsmet.getColumnDisplaySize(4) + " type name: " + rsmet.getColumnTypeName(4));
-			// result is double, precision/scale don't make sense
-			System.out.println("dec(10,2) - double precision -- precision: " + rsmet.getPrecision(5) + " scale: " + rsmet.getScale(5) + " display size: " + rsmet.getColumnDisplaySize(5) + " type name: " + rsmet.getColumnTypeName(5));
-			while (rs.next())
-				System.out.println("result row: " + rs.getString(1) + " " + rs.getString(2) + " " + rs.getString(3) + " " + rs.getString(4) + " " + rs.getString(5));
-			rs.close();
-
-			s.execute("insert into t values(1,2,3.3,4.4,date('1990-05-05'),"+
-						 "time('12:06:06'),timestamp('1990-07-07 07:07:07.07'),"+
-						 "'eight','nine', 11.11)");
-
-			// test decimal/integer static column result scale consistent
-			// with result set metadata after division, beetle 3901
-			rs = s.executeQuery("select dc / 2 from t");
-			rsmet = rs.getMetaData();
-			System.out.println("Column result scale after division is: " + rsmet.getScale(1));
-			while (rs.next())
-				System.out.println("dc / 2 = " + rs.getString(1));
-			rs.close();
-
-
-			s.execute("create table louie (i int not null default 10, s smallint not null, " +
-				      "c30 char(30) not null, " +
-					  "vc10 varchar(10) not null default 'asdf', " +
-					  "constraint PRIMKEY primary key(vc10, i), " +
-					  "constraint UNIQUEKEY unique(c30, s), " + 
-					  "ai bigint generated always as identity (start with -10, increment by 2001))");
-
-			// Create another unique index on louie
-			s.execute("create unique index u1 on louie(s, i)");
-			// Create a non-unique index on louie
-			s.execute("create index u2 on louie(s)");
-			// Create a view on louie
-			s.execute("create view screwie as select * from louie");
-
-			// Create a foreign key
-			s.execute("create table reftab (vc10 varchar(10), i int, " +
-					  "s smallint, c30 char(30), " +
-					  "s2 smallint, c302 char(30), " +
-					  "dprim decimal(5,1) not null, dfor decimal(5,1) not null, "+
-					  "constraint PKEY_REFTAB	primary key (dprim), " + 
-					  "constraint FKEYSELF 		foreign key (dfor) references reftab, "+
-					  "constraint FKEY1 		foreign key(vc10, i) references louie, " + 
-				  	  "constraint FKEY2 		foreign key(c30, s2) references louie (c30, s), "+
-				  	  "constraint FKEY3 		foreign key(c30, s) references louie (c30, s))");
-
-			s.execute("create table reftab2 (t2_vc10 varchar(10), t2_i int, " +
-					  "constraint T2_FKEY1 		foreign key(t2_vc10, t2_i) references louie)");
-
-			// Create a table with all types
-			s.execute("create table alltypes ( "+
-							//"bitcol16_______ bit(16), "+
-							//"bitvaryingcol32 bit varying(32), "+ 
-							//"tinyintcol tinyint, "+
-							"smallintcol smallint, "+
-							"intcol int default 20, "+
-							"bigintcol bigint, "+
-							"realcol real, "+
-							"doublepreccol double precision default 10, "+
-							"decimalcol10p4s decimal(10,4), "+
-							"numericcol20p2s numeric(20,2), "+
-							"char8col___ char(8), "+
-							"varchar9col varchar(9), "+
-							"longvarcharcol long varchar,"+
-							//"longvarbinarycol long bit varying,"+
-							//"nchar10col nchar(10)"
-					  //+ ", nvarchar8col nvarchar(8)"
-					  //+ ", longnvarchar long nvarchar"
-					  //+ ", 
-						"blobcol blob(3K)"
-					  + ")" );
-			// test for beetle 4620
-			s.execute("CREATE TABLE INFLIGHT(FLT_NUM CHAR(20) NOT NULL," + 
-						"FLT_ORIGIN CHAR(6), " +
-						"FLT_DEST CHAR(6),  " +
-						"FLT_AIRCRAFT CHAR(20), " +
-						"FLT_FLYING_TIME VARCHAR(22), "+
-						"FLT_DEPT_TIME CHAR(8),  "+
-						"FLT_ARR_TIME CHAR(8),  "+
-						"FLT_NOTES VARCHAR(510), "+ 
-						"FLT_DAYS_OF_WK CHAR(14), "+ 
-						"FLT_CRAFT_PIC VARCHAR(32672), "+
-						"PRIMARY KEY(FLT_NUM))");
-
-			// Create procedures so we can test 
-			// getProcedureColumns()
-                        s.execute("create procedure GETPCTEST1 (" +
-				// for creating, the procedure's params do not need to exactly match the method's
-				"out outb VARCHAR(3), a VARCHAR(3), b NUMERIC, c SMALLINT, " +
-				"e SMALLINT, f INTEGER, g BIGINT, h FLOAT, i DOUBLE PRECISION, " +
-				"k DATE, l TIME, T TIMESTAMP )"+
-				"language java external name " +
-				"'org.apache.derbyTesting.functionTests.tests.jdbcapi.metadata.getpc'" +
-							" parameter style java"); 
-                        s.execute("create procedure GETPCTEST2 (pa INTEGER, pb BIGINT)"+
-				"language java external name " +
-				"'org.apache.derbyTesting.functionTests.tests.jdbcapi.metadata.getpc'" +
-				" parameter style java"); 
-                        s.execute("create procedure GETPCTEST3A (STRING1 VARCHAR(5), out STRING2 VARCHAR(5))"+
-				"language java external name " +
-				"'org.apache.derbyTesting.functionTests.tests.jdbcapi.metadata.getpc'" +
-				" parameter style java"); 
-                        s.execute("create procedure GETPCTEST3B (in STRING3 VARCHAR(5), inout STRING4 VARCHAR(5))"+
-				"language java external name " +
-				"'org.apache.derbyTesting.functionTests.tests.jdbcapi.metadata.getpc'" +
-				" parameter style java"); 
-                        s.execute("create procedure GETPCTEST4A()  "+
-				"language java external name " +
-				"'org.apache.derbyTesting.functionTests.tests.jdbcapi.metadata.getpc4a'"+
-				" parameter style java"); 
-                        s.execute("create procedure GETPCTEST4B() "+
-				"language java external name " +
-				"'org.apache.derbyTesting.functionTests.tests.jdbcapi.metadata.getpc4b'" +
-				" parameter style java"); 
-                        s.execute("create procedure GETPCTEST4Bx(out retparam INTEGER) "+
-				"language java external name " +
-				"'org.apache.derbyTesting.functionTests.tests.jdbcapi.metadata.getpc4b'" +
-				" parameter style java"); 
-
-			met = con.getMetaData();
-
-			System.out.println("JDBC Driver '" + met.getDriverName() +
-							   "', version " + met.getDriverMajorVersion() +
-							   "." + met.getDriverMinorVersion() +
-							   " (" + met.getDriverVersion() + ")");
-
-			try {
-			    System.out.println("The URL is: " + met.getURL());
-			} catch (Throwable err) {
-			    System.out.println("%%getURL() gave the exception: " + err);
-			}
+		} catch (SQLException e) {
+			dumpSQLExceptions(e);
+		}
+		catch (Throwable e) {
+			System.out.println("FAIL -- unexpected exception:");
+			e.printStackTrace(System.out);
+		}
 
-			System.out.println("allTablesAreSelectable(): " +
-							   met.allTablesAreSelectable());
-			
-			System.out.println("maxColumnNameLength(): " + met.getMaxColumnNameLength());
+	}
 
-			System.out.println();
-			System.out.println("getSchemas():");
-			dumpRS(met.getSchemas());
+	/**
+	 * Makes a call to the "runTest" method in metadata_test.java,
+	 * which will in turn call back here for implementations of
+	 * the abstract methods.
+	 */
+	public static void main(String[] args) {
 
-			System.out.println();
-			System.out.println("getCatalogs():");
-			dumpRS(met.getCatalogs());
+		new metadata(args).runTest();
 
-			System.out.println("getSearchStringEscape(): " +
-							   met.getSearchStringEscape());
+	}
 
-			System.out.println("getSQLKeywords(): " +
-							   met.getSQLKeywords());
+	/**
+	 * This method is responsible for executing a metadata query and returning
+	 * a result set that complies with the JDBC specification.
+	 */
+	protected ResultSet getMetaDataRS(DatabaseMetaData dmd, int procId,
+		String [] sArgs, String [] argArray, int [] iArgs, boolean [] bArgs)
+		throws SQLException
+	{
 
-			System.out.println("getDefaultTransactionIsolation(): " +
-							   met.getDefaultTransactionIsolation());
-
-			System.out.println("getProcedures():");
-			dumpRS(met.getProcedures(null, "%", "GETPCTEST%"));
-
-
-			/*
-			 * any methods that were not tested above using code written
-			 * specifically for it will now be tested in a generic way.
-			 */
-
-
-			System.out.println("allProceduresAreCallable(): " +
-							   met.allProceduresAreCallable());
-			System.out.println("getUserName(): " +
-							   met.getUserName());
-			System.out.println("isReadOnly(): " +
-							   met.isReadOnly());
-			System.out.println("nullsAreSortedHigh(): " +
-							   met.nullsAreSortedHigh());
-			System.out.println("nullsAreSortedLow(): " +
-							   met.nullsAreSortedLow());
-			System.out.println("nullsAreSortedAtStart(): " +
-							   met.nullsAreSortedAtStart());
-			System.out.println("nullsAreSortedAtEnd(): " +
-							   met.nullsAreSortedAtEnd());
-
-
-			System.out.println("getDatabaseProductName(): " + met.getDatabaseProductName());
-
-			String v = met.getDatabaseProductVersion();
-			int l = v.indexOf('(');
-			if (l<0) l = v.length();
-			v = v.substring(0,l);
-			System.out.println("getDatabaseProductVersion(): " + v);
-			System.out.println("getDriverVersion(): " +
-							   met.getDriverVersion());
-			System.out.println("usesLocalFiles(): " +
-							   met.usesLocalFiles());
-			System.out.println("usesLocalFilePerTable(): " +
-							   met.usesLocalFilePerTable());
-			System.out.println("supportsMixedCaseIdentifiers(): " +
-							   met.supportsMixedCaseIdentifiers());
-			System.out.println("storesUpperCaseIdentifiers(): " +
-							   met.storesUpperCaseIdentifiers());
-			System.out.println("storesLowerCaseIdentifiers(): " +
-							   met.storesLowerCaseIdentifiers());
-			System.out.println("storesMixedCaseIdentifiers(): " +
-							   met.storesMixedCaseIdentifiers());
-			System.out.println("supportsMixedCaseQuotedIdentifiers(): " +
-							   met.supportsMixedCaseQuotedIdentifiers());
-			System.out.println("storesUpperCaseQuotedIdentifiers(): " +
-							   met.storesUpperCaseQuotedIdentifiers());
-			System.out.println("storesLowerCaseQuotedIdentifiers(): " +
-							   met.storesLowerCaseQuotedIdentifiers());
-			System.out.println("storesMixedCaseQuotedIdentifiers(): " +
-							   met.storesMixedCaseQuotedIdentifiers());
-			System.out.println("getIdentifierQuoteString(): " +
-							   met.getIdentifierQuoteString());
-			System.out.println("getNumericFunctions(): " +
-							   met.getNumericFunctions());
-			System.out.println("getStringFunctions(): " +
-							   met.getStringFunctions());
-			System.out.println("getSystemFunctions(): " +
-							   met.getSystemFunctions());
-			System.out.println("getTimeDateFunctions(): " +
-							   met.getTimeDateFunctions());
-			System.out.println("getExtraNameCharacters(): " +
-							   met.getExtraNameCharacters());
-			System.out.println("supportsAlterTableWithAddColumn(): " +
-							   met.supportsAlterTableWithAddColumn());
-			System.out.println("supportsAlterTableWithDropColumn(): " +
-							   met.supportsAlterTableWithDropColumn());
-			System.out.println("supportsColumnAliasing(): " +
-							   met.supportsColumnAliasing());
-			System.out.println("nullPlusNonNullIsNull(): " +
-							   met.nullPlusNonNullIsNull());
-			System.out.println("supportsConvert(): " +
-							   met.supportsConvert());
-			System.out.println("supportsConvert(Types.INTEGER, Types.SMALLINT): " +
-							   met.supportsConvert(Types.INTEGER, Types.SMALLINT));
-			System.out.println("supportsTableCorrelationNames(): " +
-							   met.supportsTableCorrelationNames());
-			System.out.println("supportsDifferentTableCorrelationNames(): " +
-							   met.supportsDifferentTableCorrelationNames());
-			System.out.println("supportsExpressionsInOrderBy(): " +
-							   met.supportsExpressionsInOrderBy());
-			System.out.println("supportsOrderByUnrelated(): " +
-							   met.supportsOrderByUnrelated());
-			System.out.println("supportsGroupBy(): " +
-							   met.supportsGroupBy());
-			System.out.println("supportsGroupByUnrelated(): " +
-							   met.supportsGroupByUnrelated());
-			System.out.println("supportsGroupByBeyondSelect(): " +
-							   met.supportsGroupByBeyondSelect());
-			System.out.println("supportsLikeEscapeClause(): " +
-							   met.supportsLikeEscapeClause());
-			System.out.println("supportsMultipleResultSets(): " +
-							   met.supportsMultipleResultSets());
-			System.out.println("supportsMultipleTransactions(): " +
-							   met.supportsMultipleTransactions());
-			System.out.println("supportsNonNullableColumns(): " +
-							   met.supportsNonNullableColumns());
-			System.out.println("supportsMinimumSQLGrammar(): " +
-							   met.supportsMinimumSQLGrammar());
-			System.out.println("supportsCoreSQLGrammar(): " +
-							   met.supportsCoreSQLGrammar());
-			System.out.println("supportsExtendedSQLGrammar(): " +
-							   met.supportsExtendedSQLGrammar());
-			System.out.println("supportsANSI92EntryLevelSQL(): " +
-							   met.supportsANSI92EntryLevelSQL());
-			System.out.println("supportsANSI92IntermediateSQL(): " +
-							   met.supportsANSI92IntermediateSQL());
-			System.out.println("supportsANSI92FullSQL(): " +
-							   met.supportsANSI92FullSQL());
-			System.out.println("supportsIntegrityEnhancementFacility(): " +
-							   met.supportsIntegrityEnhancementFacility());
-			System.out.println("supportsOuterJoins(): " +
-							   met.supportsOuterJoins());
-			System.out.println("supportsFullOuterJoins(): " +
-							   met.supportsFullOuterJoins());
-			System.out.println("supportsLimitedOuterJoins(): " +
-							   met.supportsLimitedOuterJoins());
-			System.out.println("getSchemaTerm(): " +
-							   met.getSchemaTerm());
-			System.out.println("getProcedureTerm(): " +
-							   met.getProcedureTerm());
-			System.out.println("getCatalogTerm(): " +
-							   met.getCatalogTerm());
-			System.out.println("isCatalogAtStart(): " +
-							   met.isCatalogAtStart());
-			System.out.println("getCatalogSeparator(): " +
-							   met.getCatalogSeparator());
-			System.out.println("supportsSchemasInDataManipulation(): " +
-							   met.supportsSchemasInDataManipulation());
-			System.out.println("supportsSchemasInProcedureCalls(): " +
-							   met.supportsSchemasInProcedureCalls());
-			System.out.println("supportsSchemasInTableDefinitions(): " +
-							   met.supportsSchemasInTableDefinitions());
-			System.out.println("supportsSchemasInIndexDefinitions(): " +
-							   met.supportsSchemasInIndexDefinitions());
-			System.out.println("supportsSchemasInPrivilegeDefinitions(): " +
-							   met.supportsSchemasInPrivilegeDefinitions());
-			System.out.println("supportsCatalogsInDataManipulation(): " +
-							   met.supportsCatalogsInDataManipulation());
-			System.out.println("supportsCatalogsInProcedureCalls(): " +
-							   met.supportsCatalogsInProcedureCalls());
-			System.out.println("supportsCatalogsInTableDefinitions(): " +
-							   met.supportsCatalogsInTableDefinitions());
-			System.out.println("supportsCatalogsInIndexDefinitions(): " +
-							   met.supportsCatalogsInIndexDefinitions());
-			System.out.println("supportsCatalogsInPrivilegeDefinitions(): " +
-							   met.supportsCatalogsInPrivilegeDefinitions());
-			System.out.println("supportsPositionedDelete(): " +
-							   met.supportsPositionedDelete());
-			System.out.println("supportsPositionedUpdate(): " +
-							   met.supportsPositionedUpdate());
-			System.out.println("supportsSelectForUpdate(): " +
-							   met.supportsSelectForUpdate());
-			System.out.println("supportsStoredProcedures(): " +
-							   met.supportsStoredProcedures());
-			System.out.println("supportsSubqueriesInComparisons(): " +
-							   met.supportsSubqueriesInComparisons());
-			System.out.println("supportsSubqueriesInExists(): " +
-							   met.supportsSubqueriesInExists());
-			System.out.println("supportsSubqueriesInIns(): " +
-							   met.supportsSubqueriesInIns());
-			System.out.println("supportsSubqueriesInQuantifieds(): " +
-							   met.supportsSubqueriesInQuantifieds());
-			System.out.println("supportsCorrelatedSubqueries(): " +
-							   met.supportsCorrelatedSubqueries());
-			System.out.println("supportsUnion(): " +
-							   met.supportsUnion());
-			System.out.println("supportsUnionAll(): " +
-							   met.supportsUnionAll());
-			System.out.println("supportsOpenCursorsAcrossCommit(): " +
-							   met.supportsOpenCursorsAcrossCommit());
-			System.out.println("supportsOpenCursorsAcrossRollback(): " +
-							   met.supportsOpenCursorsAcrossRollback());
-			System.out.println("supportsOpenStatementsAcrossCommit(): " +
-							   met.supportsOpenStatementsAcrossCommit());
-			System.out.println("supportsOpenStatementsAcrossRollback(): " +
-							   met.supportsOpenStatementsAcrossRollback());
-			System.out.println("getMaxBinaryLiteralLength(): " +
-							   met.getMaxBinaryLiteralLength());
-			System.out.println("getMaxCharLiteralLength(): " +
-							   met.getMaxCharLiteralLength());
-			System.out.println("getMaxColumnsInGroupBy(): " +
-							   met.getMaxColumnsInGroupBy());
-			System.out.println("getMaxColumnsInIndex(): " +
-							   met.getMaxColumnsInIndex());
-			System.out.println("getMaxColumnsInOrderBy(): " +
-							   met.getMaxColumnsInOrderBy());
-			System.out.println("getMaxColumnsInSelect(): " +
-							   met.getMaxColumnsInSelect());
-			System.out.println("getMaxColumnsInTable(): " +
-							   met.getMaxColumnsInTable());
-			System.out.println("getMaxConnections(): " +
-							   met.getMaxConnections());
-			System.out.println("getMaxCursorNameLength(): " +
-							   met.getMaxCursorNameLength());
-			System.out.println("getMaxIndexLength(): " +
-							   met.getMaxIndexLength());
-			System.out.println("getMaxSchemaNameLength(): " +
-							   met.getMaxSchemaNameLength());
-			System.out.println("getMaxProcedureNameLength(): " +
-							   met.getMaxProcedureNameLength());
-			System.out.println("getMaxCatalogNameLength(): " +
-							   met.getMaxCatalogNameLength());
-			System.out.println("getMaxRowSize(): " +
-							   met.getMaxRowSize());
-			System.out.println("doesMaxRowSizeIncludeBlobs(): " +
-							   met.doesMaxRowSizeIncludeBlobs());
-			System.out.println("getMaxStatementLength(): " +
-							   met.getMaxStatementLength());
-			System.out.println("getMaxStatements(): " +
-							   met.getMaxStatements());
-			System.out.println("getMaxTableNameLength(): " +
-							   met.getMaxTableNameLength());
-			System.out.println("getMaxTablesInSelect(): " +
-							   met.getMaxTablesInSelect());
-			System.out.println("getMaxUserNameLength(): " +
-							   met.getMaxUserNameLength());
-			System.out.println("supportsTransactions(): " +
-							   met.supportsTransactions());
-			System.out.println("supportsTransactionIsolationLevel(Connection.TRANSACTION_NONE): " +
-							   met.supportsTransactionIsolationLevel(Connection.TRANSACTION_NONE));
-			System.out.println("supportsTransactionIsolationLevel(Connection.TRANSACTION_REPEATABLE_READ): " +
-							   met.supportsTransactionIsolationLevel(Connection.TRANSACTION_REPEATABLE_READ));
-			System.out.println("supportsTransactionIsolationLevel(Connection.TRANSACTION_SERIALIZABLE): " +
-							   met.supportsTransactionIsolationLevel(Connection.TRANSACTION_SERIALIZABLE));
-			System.out.println("supportsDataDefinitionAndDataManipulationTransactions(): " +
-							   met.supportsDataDefinitionAndDataManipulationTransactions());
-			System.out.println("supportsDataManipulationTransactionsOnly(): " +
-							   met.supportsDataManipulationTransactionsOnly());
-			System.out.println("dataDefinitionCausesTransactionCommit(): " +
-							   met.dataDefinitionCausesTransactionCommit());
-			System.out.println("dataDefinitionIgnoredInTransactions(): " +
-							   met.dataDefinitionIgnoredInTransactions());
-
-			System.out.println("getConnection(): "+
-					   ((met.getConnection()==con)?"same connection":"different connection") );
-			System.out.println("getProcedureColumns():");
-			dumpRS(met.getProcedureColumns(null, "%", "GETPCTEST%", "%"));
-
- 			System.out.println("getTables() with TABLE_TYPE in ('SYSTEM TABLE') :");
- 			String[] tabTypes = new String[1];
- 			tabTypes[0] = "SYSTEM TABLE";
- 			dumpRS(met.getTables(null, null, null,
- 								 tabTypes));
-			System.out.println("getTables() with no types:");
- 			dumpRS(met.getTables("", null, "%", null));
-
- 			System.out.println("getTables() with TABLE_TYPE in ('VIEW','TABLE') :");
- 			tabTypes = new String[2];
- 			tabTypes[0] = "VIEW";
- 			tabTypes[1] = "TABLE";
- 			dumpRS(met.getTables(null, null, null, tabTypes));
-
-			System.out.println("getTableTypes():");
-			dumpRS(met.getTableTypes());
-
-			System.out.println("getColumns():");
-			dumpRS(met.getColumns("", null, "", ""));
-
-			System.out.println("getColumns('SYSTABLES'):");
-			dumpRS(met.getColumns("", "SYS", "SYSTABLES", null));
-
-			System.out.println("getColumns('ALLTYPES'):");
-			dumpRS(met.getColumns("", "APP", "ALLTYPES", null));
-
-			System.out.println("getColumns('LOUIE'):");
-			dumpRS(met.getColumns("", "APP", "LOUIE", null));
-
-			// test for beetle 4620
-			System.out.println("getColumns('INFLIGHT'):");
-			dumpRS(met.getColumns("", "APP", "INFLIGHT", null));
-
-			System.out.println("getColumnPrivileges():");
-			dumpRS(met.getColumnPrivileges("Huey", "Dewey", "Louie", "Frooey"));
-
-			System.out.println("getTablePrivileges():");
-			dumpRS(met.getTablePrivileges("Huey", "Dewey", "Louie"));
-
-			System.out.println("getBestRowIdentifier(\"\",null,\"LOUIE\"):");
-			dumpRS(met.getBestRowIdentifier("", null, "LOUIE", 
-											DatabaseMetaData.bestRowTransaction, 
-											true));
-
-			System.out.println("getBestRowIdentifier(\"\",\"SYS\",\"SYSTABLES\"):");
-			dumpRS(met.getBestRowIdentifier("", "SYS", "SYSTABLES",
-											DatabaseMetaData.bestRowTransaction,
-											true));
-
-			System.out.println("getVersionColumns():");
-			dumpRS(met.getVersionColumns("Huey", "Dewey", "Louie"));
-
-			System.out.println("getPrimaryKeys():");
-			dumpRS(met.getPrimaryKeys("", "%", "LOUIE"));
-
-			//beetle 4571
-			System.out.println("getPrimaryKeys(null, null, tablename):");
-			dumpRS(met.getPrimaryKeys(null, null, "LOUIE"));
-
-			System.out.println("getImportedKeys():");
-			dumpRS(met.getImportedKeys(null, null, "%"));
-
-			System.out.println("getExportedKeys():");
-			dumpRS(met.getExportedKeys(null, null, "%"));
-
-			System.out.println("---------------------------------------");
-			System.out.println("getCrossReference('',null,'louie','',null,'reftab' ):");
-			dumpRS(met.getCrossReference("", null, "LOUIE",
-										 "", null, "REFTAB"));
-
-			System.out.println("\ngetCrossReference('','APP','reftab','',null,'reftab' ):");
-			dumpRS(met.getCrossReference("", "APP", "REFTAB",
-										 "", null, "REFTAB"));
-
-			System.out.println("\ngetCrossReference('',null,null,'','APP','reftab' ):");
-			dumpRS(met.getCrossReference("", null, "%",
-										 "", "APP", "REFTAB"));
-			System.out.println("\ngetImportedKeys('',null,null,'','APP','reftab' ):");
-			dumpRS(met.getImportedKeys("", "APP", "REFTAB"));
-
-
-			System.out.println("\ngetCrossReference('',null,'louie','','APP',null):");
-			dumpRS(met.getCrossReference("", null, "LOUIE",
-										 "", "APP", "%"));
-			System.out.println("\ngetExportedKeys('',null,'louie,'','APP',null ):");
-			dumpRS(met.getExportedKeys("", null, "LOUIE"));
-
-
-			System.out.println("\ngetCrossReference('','badschema','LOUIE','','APP','REFTAB' ):");
-			dumpRS(met.getCrossReference("", "BADSCHEMA", "LOUIE",
-										 "", "APP", "REFTAB"));
-
-
-			System.out.println("getTypeInfo():");
-			dumpRS(met.getTypeInfo());
-
-			/* NOTE - we call getIndexInfo() only on system tables here
- 			 * so that there will be no diffs due to generated names.
-			 */
-			// unique indexes on SYSCOLUMNS
-			System.out.println("getIndexInfo():");
-			dumpRS(met.getIndexInfo("", "SYS", "SYSCOLUMNS", true, false));
-
-			// all indexes on SYSCOLUMNS
-			System.out.println("getIndexInfo():");
-			dumpRS(met.getIndexInfo("", "SYS", "SYSCOLUMNS", false, false));
-
-			System.out.println("getIndexInfo():");
-			dumpRS(met.getIndexInfo("", "SYS", "SYSTABLES", true, false));
-
-			rs = s.executeQuery("SELECT * FROM SYS.SYSTABLES");
-
-			System.out.println("getColumns('SYSTABLES'):");
-			dumpRS(met.getColumns("", "SYS", "SYSTABLES", null));
-			
-			if (!rs.next()) {
-				System.out.println("FAIL -- user result set closed by"+
-					" intervening getColumns request");
-			}
-			rs.close();
-			//
-			// Test referential actions on delete
-			//
-			System.out.println("---------------------------------------");
-			//create tables to test that we get the delete and update 
-			// referential action correct
-			System.out.println("Referential action values");
-			System.out.println("RESTRICT = "+ DatabaseMetaData.importedKeyRestrict);
-			System.out.println("NO ACTION = "+ DatabaseMetaData.importedKeyNoAction);
-			System.out.println("CASCADE = "+ DatabaseMetaData.importedKeyCascade);
-			System.out.println("SETNULL = "+ DatabaseMetaData.importedKeySetNull);
-			System.out.println("SETDEFAULT = "+ DatabaseMetaData.importedKeySetDefault);
-			s.execute("create table refaction1(a int not null primary key)");
-			s.execute("create table refactnone(a int references refaction1(a))");
-			s.execute("create table refactrestrict(a int references refaction1(a) on delete restrict)");
-			s.execute("create table refactnoaction(a int references refaction1(a) on delete no action)");
-			s.execute("create table refactcascade(a int references refaction1(a) on delete cascade)");
-			s.execute("create table refactsetnull(a int references refaction1(a) on delete set null)");
-			System.out.println("getCrossReference('','APP','REFACTION1','','APP','REFACTIONNONE' ):");
-			s.execute("create table refactupdrestrict(a int references refaction1(a) on update restrict)");
-			s.execute("create table refactupdnoaction(a int references refaction1(a) on update no action)");
-			dumpRS(met.getCrossReference("", "APP", "REFACTION1", "", "APP", "REFACTNONE"));
-			System.out.println("\ngetCrossReference('','APP','REFACTION1','','APP','REFACTRESTRICT' ):");
-			dumpRS(met.getCrossReference("", "APP", "REFACTION1", "", "APP", "REFACTRESTRICT"));
-			System.out.println("\ngetCrossReference('','APP','REFACTION1','','APP','REFACTNOACTION' ):");
-			dumpRS(met.getCrossReference("", "APP", "REFACTION1", "", "APP", "REFACTNOACTION"));
-			System.out.println("\ngetCrossReference('','APP','REFACTION1','','APP','REFACTCASCADE' ):");
-			dumpRS(met.getCrossReference("", "APP", "REFACTION1", "", "APP", "REFACTCASCADE"));
-			System.out.println("\ngetCrossReference('','APP','REFACTION1','','APP','REFACTSETNULL' ):");
-			dumpRS(met.getCrossReference("", "APP", "REFACTION1", "", "APP", "REFACTSETNULL"));
-			System.out.println("\ngetCrossReference('','APP','REFACTION1','','APP','REFACTUPDRESTRICT' ):");
-			dumpRS(met.getCrossReference("", "APP", "REFACTION1", "", "APP", "REFACTUPDRESTRICT"));
-			System.out.println("\ngetCrossReference('','APP','REFACTION1','','APP','REFACTUPDNOACTION' ):");
-			dumpRS(met.getCrossReference("", "APP", "REFACTION1", "", "APP", "REFACTUPDNOACTION"));
-			ResultSet refrs = met.getImportedKeys("", "APP", "REFACTNONE");
-			if (refrs.next())
-			{
-				//check update rule
-				if (refrs.getShort(11) != DatabaseMetaData.importedKeyNoAction)
-					System.out.println("\ngetImportedKeys - none update Failed - action = " + refrs.getShort(11) + " required value = " + DatabaseMetaData.importedKeyNoAction);
-				else
-					System.out.println("\ngetImportedKeys - none update Passed");
-				//check delete rule
-				if (refrs.getShort(11) != DatabaseMetaData.importedKeyNoAction)
-					System.out.println("\ngetImportedKeys - none delete Failed - action = " + refrs.getShort(11) + " required value = " + DatabaseMetaData.importedKeyNoAction);
-				else
-					System.out.println("\ngetImportedKeys - none delete Passed");
-			}
-			else
-					System.out.println("\ngetImportedKeys - none Failed no rows");
-					
-			refrs.close();
-
-			refrs = met.getImportedKeys("", "APP", "REFACTRESTRICT");
-			if (refrs.next())
-			{
-				if (refrs.getShort(11) != DatabaseMetaData.importedKeyRestrict)
-					System.out.println("\ngetImportedKeys - delete Restrict Failed - action = " + refrs.getShort(11) + " required value = " + DatabaseMetaData.importedKeyRestrict);
-				else
-					System.out.println("\ngetImportedKeys - delete Restrict Passed");
-			}
-			else
-					System.out.println("\ngetImportedKeys - delete Restrict Failed no rows");
-			refrs.close();
-
-			refrs = met.getImportedKeys("", "APP", "REFACTNOACTION");
-			if (refrs.next())
-			{
-				if (refrs.getShort(11) != DatabaseMetaData.importedKeyNoAction)
-					System.out.println("\ngetImportedKeys - delete NO ACTION Failed - action = " + refrs.getShort(11) + " required value = " + DatabaseMetaData.importedKeyNoAction);
-				else
-					System.out.println("\ngetImportedKeys - delete NO ACTION Passed");
-			}
-			else
-					System.out.println("\ngetImportedKeys - delete NO ACTION Failed no rows");
-			refrs.close();
-
-			refrs = met.getImportedKeys("", "APP", "REFACTCASCADE");
-			if (refrs.next())
-			{
-				if (refrs.getShort(11) != DatabaseMetaData.importedKeyCascade)
-					System.out.println("\ngetImportedKeys - delete CASCADE Failed - action = " + refrs.getShort(11) + " required value = " + DatabaseMetaData.importedKeyCascade);
-				else
-					System.out.println("\ngetImportedKeys - delete CASCADE Passed");
-			}
-			else
-					System.out.println("\ngetImportedKeys - delete CASCADE Failed no rows");
-			refrs.close();
-
-			refrs = met.getImportedKeys("", "APP", "REFACTSETNULL");
-			if (refrs.next())
-			{
-				if (refrs.getShort(11) != DatabaseMetaData.importedKeySetNull)
-					System.out.println("\ngetImportedKeys - delete SET NULL Failed - action = " + refrs.getShort(11) + " required value = " + DatabaseMetaData.importedKeySetNull);
-				else
-					System.out.println("\ngetImportedKeys - delete SET NULL Passed");
-			}
-			else
-					System.out.println("\ngetImportedKeys - SET NULL Failed no rows");
-			refrs.close();
-			refrs = met.getImportedKeys("", "APP", "REFACTRESTRICT");
-			if (refrs.next())
-			{
-				// test update rule
-				if (refrs.getShort(11) != DatabaseMetaData.importedKeyRestrict)
-					System.out.println("\ngetImportedKeys - update Restrict Failed - action = " + refrs.getShort(11) + " required value = " + DatabaseMetaData.importedKeyRestrict);
-				else
-					System.out.println("\ngetImportedKeys - update Restrict Passed");
-			}
-			else
-					System.out.println("\ngetImportedKeys - update Restrict Failed no rows");
-			refrs.close();
-
-			refrs = met.getImportedKeys("", "APP", "REFACTNOACTION");
-			if (refrs.next())
-			{
-				if (refrs.getShort(11) != DatabaseMetaData.importedKeyNoAction)
-					System.out.println("\ngetImportedKeys - update NO ACTION Failed - action = " + refrs.getShort(11) + " required value = " + DatabaseMetaData.importedKeyNoAction);
-				else
-					System.out.println("\ngetImportedKeys - update NO ACTION Passed");
-			}
-			else
-					System.out.println("\ngetImportedKeys - update NO ACTION Failed no rows");
-			refrs.close();
-
-			System.out.println("\ngetExportedKeys('',null,null,'','APP','REFACTION1' ):");
-			dumpRS(met.getExportedKeys("", "APP", "REFACTION1"));
-			System.out.println("---------------------------------------");
-
-			// drop referential action test tables
-			s.execute("drop table refactnone");
-			s.execute("drop table refactupdrestrict");
-			s.execute("drop table refactupdnoaction");
-			s.execute("drop table refactrestrict");
-			s.execute("drop table refactnoaction");
-			s.execute("drop table refactcascade");
-			s.execute("drop table refactsetnull");
-			s.execute("drop table refaction1");
-
-			// test beetle 5195
-			s.execute("create table t1 (c1 int not null, c2 int, c3 int default null, c4 char(10) not null, c5 char(10) default null, c6 char(10) default 'NULL', c7 int default 88)");
-
-			String schema = "APP";
-			String tableName = "T1";
-			DatabaseMetaData dmd = con.getMetaData();
-
-			System.out.println("getColumns for '" + tableName + "'");
-
-			rs = dmd.getColumns(null, schema, tableName, null);
-			try
-			{
-				while (rs.next())
-				{
-					String col = rs.getString(4);
-					String type = rs.getString(6);
-					String defval = rs.getString(13);
-					if (defval == null)
-						System.out.println("  Next line is real null.");
-					System.out.println("defval for col " + col + 
-						" type " + type + " DEFAULT '" + defval + "' wasnull " + rs.wasNull());
-				}
-		
-			}
-			finally
-			{
-				if (rs != null)
-					rs.close();
-			}
-			s.execute("drop table t1");
+		switch (procId) {
 
-			// tiny test moved over from no longer used metadata2.sql
-			// This checks for a bug where you get incorrect behavior on a nested connection.
-			// if you do not get an error, the bug does not occur.			
-                        s.execute("create procedure isReadO() "+
-				"language java external name " +
-				"'org.apache.derbyTesting.functionTests.tests.jdbcapi.metadata.isro'" +
-				" parameter style java"); 
-			s.execute("call isReadO()");
-			
-	
-			s.close();
-			if (con.getAutoCommit() == false)
-				con.commit();
+			case GET_PROCEDURES:
+				return dmd.getProcedures(sArgs[0], sArgs[1], sArgs[2]);
 
-			con.close();
+			case GET_PROCEDURE_COLUMNS:
+				return dmd.getProcedureColumns(sArgs[0], sArgs[1], sArgs[2], sArgs[3]);
 
-		}
-		catch (SQLException e) {
-			dumpSQLExceptions(e);
-		}
-		catch (Throwable e) {
-			System.out.println("FAIL -- unexpected exception:");
-			e.printStackTrace(System.out);
-		}
+			case GET_TABLES:
+				return dmd.getTables(sArgs[0], sArgs[1], sArgs[2], argArray);
 
-		System.out.println("Test metadata finished");
-    }
+			case GET_COLUMNS:
+				return dmd.getColumns(sArgs[0], sArgs[1], sArgs[2], sArgs[3]);
+
+			case GET_COLUMN_PRIVILEGES:
+				return dmd.getColumnPrivileges(sArgs[0], sArgs[1], sArgs[2], sArgs[3]);
 
-	static private void dumpSQLExceptions (SQLException se) {
-		System.out.println("FAIL -- unexpected exception");
-		while (se != null) {
-			System.out.print("SQLSTATE("+se.getSQLState()+"):");
-			se.printStackTrace(System.out);
-			se = se.getNextException();
+			case GET_TABLE_PRIVILEGES:
+				return dmd.getTablePrivileges(sArgs[0], sArgs[1], sArgs[2]);
+
+			case GET_BEST_ROW_IDENTIFIER:
+				return dmd.getBestRowIdentifier(sArgs[0], sArgs[1], sArgs[2],
+					iArgs[0], bArgs[0]);
+
+			case GET_VERSION_COLUMNS:
+				return dmd.getVersionColumns(sArgs[0], sArgs[1], sArgs[2]);
+
+			case GET_PRIMARY_KEYS:
+				return dmd.getPrimaryKeys(sArgs[0], sArgs[1], sArgs[2]);
+
+			case GET_IMPORTED_KEYS:
+				return dmd.getImportedKeys(sArgs[0], sArgs[1], sArgs[2]);
+
+			case GET_EXPORTED_KEYS:
+				return dmd.getExportedKeys(sArgs[0], sArgs[1], sArgs[2]);
+
+			case GET_CROSS_REFERENCE:
+				return dmd.getCrossReference(sArgs[0], sArgs[1], sArgs[2],
+					sArgs[3], sArgs[4], sArgs[5]);
+
+			case GET_TYPE_INFO:
+				return dmd.getTypeInfo();
+
+			case GET_INDEX_INFO:
+				return dmd.getIndexInfo(sArgs[0], sArgs[1], sArgs[2],
+					bArgs[0], bArgs[1]);
+
+			default:
+			// shouldn't get here.
+
+				System.out.println("*** UNEXPECTED PROCEDURE ID ENCOUNTERED: " + procId + ".");
+				return null;
 		}
+
 	}
 
-	static void dumpRS(ResultSet s) throws SQLException {
+	protected void dumpRS(int procId, ResultSet s) throws SQLException {
+
 		ResultSetMetaData rsmd = s.getMetaData ();
 
 		// Get the number of columns in the result set
@@ -841,9 +171,11 @@
 		System.out.println();
 	
 		// Display data, fetching until end of the result set
+		StringBuffer errorColumns;
 		while (s.next()) {
 			// Loop through each column, getting the
 			// column data and displaying
+			errorColumns = new StringBuffer();
 			String value;
 			for (int i=1; i<=numCols; i++) {
 				if (i > 1) System.out.print(",");
@@ -855,10 +187,11 @@
 						(Integer.valueOf(value).intValue() == -7))
 						System.out.print("**BOOLEAN_TYPE for VM**");
 					else
-						System.out.print(s.getString(i));
+						System.out.print(value);
 				}
 				else
-					System.out.print(s.getString(i));
+					System.out.print(value);
+
 			}
 			System.out.println();
 		}
@@ -906,5 +239,6 @@
 	public static void isro() throws SQLException {
 		DriverManager.getConnection("jdbc:default:connection").getMetaData().isReadOnly();
 	}
+
 }
 

Added: incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/metadata_test.java
URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/metadata_test.java?view=auto&rev=156209
==============================================================================
--- incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/metadata_test.java (added)
+++ incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/metadata_test.java Fri Mar  4 16:20:59 2005
@@ -0,0 +1,973 @@
+/*
+
+   Derby - Class org.apache.derbyTesting.functionTests.tests.jdbcapi.metadata_test
+
+   Copyright 1999, 2004 The Apache Software Foundation or its licensors, as applicable.
+
+   Licensed 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.DriverManager;
+import java.sql.DatabaseMetaData;
+import java.sql.ResultSetMetaData;
+import java.sql.Statement;
+import java.sql.CallableStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.sql.Timestamp;
+import java.sql.Time;
+import java.sql.Date;
+import java.math.BigDecimal;
+
+import java.util.Properties;
+
+import org.apache.derby.tools.ij;
+
+/**
+ * Test of database meta-data.  This program simply calls each of the meta-data
+ * methods, one by one, and prints the results.  The test passes if the printed
+ * results match a previously stored "master".  Thus this test cannot actually
+ * discern whether it passes or not.
+ *
+ */
+
+public abstract class metadata_test {
+
+	// Ids for the Derby internal procedures that are used to fetch
+	// some of the metadata.
+
+	protected static final int GET_PROCEDURES = 0;
+ 	protected static final int GET_PROCEDURE_COLUMNS = 1;
+ 	protected static final int GET_TABLES = 2;
+ 	protected static final int GET_COLUMNS = 3;
+ 	protected static final int GET_COLUMN_PRIVILEGES = 5;
+ 	protected static final int GET_TABLE_PRIVILEGES = 6;
+ 	protected static final int GET_BEST_ROW_IDENTIFIER = 7;
+ 	protected static final int GET_VERSION_COLUMNS = 8;
+ 	protected static final int GET_PRIMARY_KEYS = 9;
+ 	protected static final int GET_IMPORTED_KEYS = 10;
+ 	protected static final int GET_EXPORTED_KEYS = 11;
+ 	protected static final int GET_CROSS_REFERENCE = 12;
+ 	protected static final int GET_TYPE_INFO = 13;
+ 	protected static final int GET_INDEX_INFO = 14;
+
+	protected static final int IGNORE_PROC_ID = -1;
+
+	// We leave it up to the classes which extend this one to
+	// initialize the following fields at contruct time.
+	protected Connection con;
+	protected static Statement s;
+
+	protected void runTest() {
+
+		DatabaseMetaData met;
+		ResultSet rs;
+		ResultSetMetaData rsmet;
+
+		System.out.println("Test metadata starting");
+
+		try
+		{
+
+			// test decimal type and other numeric types precision, scale,
+			// and display width after operations, beetle 3875, 3906
+			s.execute("create table t (i int, s smallint, r real, "+
+				"d double precision, dt date, t time, ts timestamp, "+
+				"c char(10), v varchar(40) not null, dc dec(10,2))");
+			s.execute("insert into t values(1,2,3.3,4.4,date('1990-05-05'),"+
+						 "time('12:06:06'),timestamp('1990-07-07 07:07:07.07'),"+
+						 "'eight','nine', 11.1)");
+
+			// test decimal type and other numeric types precision, scale,
+			// and display width after operations, beetle 3875, 3906
+			//rs = s.executeQuery("select dc from t where tn = 10 union select dc from t where i = 1");
+			rs = s.executeQuery("select dc from t where dc = 11.1 union select dc from t where i = 1");
+			rsmet = rs.getMetaData();
+			System.out.println("Column display size of the union result is: " + rsmet.getColumnDisplaySize(1));
+			rs.close();
+
+			rs = s.executeQuery("select dc, dc, r+dc, d-dc, dc-d from t");
+			rsmet = rs.getMetaData();
+			System.out.println("dec(10,2) -- precision: " + rsmet.getPrecision(1) + " scale: " + rsmet.getScale(1) + " display size: " + rsmet.getColumnDisplaySize(1) + " type name: " + rsmet.getColumnTypeName(1));
+			System.out.println("dec(10,2) -- precision: " + rsmet.getPrecision(2) + " scale: " + rsmet.getScale(2) + " display size: " + rsmet.getColumnDisplaySize(2) + " type name: " + rsmet.getColumnTypeName(2));
+			System.out.println("real + dec(10,2) -- precision: " + rsmet.getPrecision(3) + " scale: " + rsmet.getScale(3) + " display size: " + rsmet.getColumnDisplaySize(3) + " type name: " + rsmet.getColumnTypeName(3));
+			System.out.println("double precision - dec(10,2) -- precision: " + rsmet.getPrecision(4) + " scale: " + rsmet.getScale(4) + " display size: " + rsmet.getColumnDisplaySize(4) + " type name: " + rsmet.getColumnTypeName(4));
+			// result is double, precision/scale don't make sense
+			System.out.println("dec(10,2) - double precision -- precision: " + rsmet.getPrecision(5) + " scale: " + rsmet.getScale(5) + " display size: " + rsmet.getColumnDisplaySize(5) + " type name: " + rsmet.getColumnTypeName(5));
+			while (rs.next())
+				System.out.println("result row: " + rs.getString(1) + " " + rs.getString(2) + " " + rs.getString(3) + " " + rs.getString(4) + " " + rs.getString(5));
+			rs.close();
+
+			s.execute("insert into t values(1,2,3.3,4.4,date('1990-05-05'),"+
+						 "time('12:06:06'),timestamp('1990-07-07 07:07:07.07'),"+
+						 "'eight','nine', 11.11)");
+
+			// test decimal/integer static column result scale consistent
+			// with result set metadata after division, beetle 3901
+			rs = s.executeQuery("select dc / 2 from t");
+			rsmet = rs.getMetaData();
+			System.out.println("Column result scale after division is: " + rsmet.getScale(1));
+			while (rs.next())
+				System.out.println("dc / 2 = " + rs.getString(1));
+			rs.close();
+
+
+			s.execute("create table louie (i int not null default 10, s smallint not null, " +
+				      "c30 char(30) not null, " +
+					  "vc10 varchar(10) not null default 'asdf', " +
+					  "constraint PRIMKEY primary key(vc10, i), " +
+					  "constraint UNIQUEKEY unique(c30, s), " + 
+					  "ai bigint generated always as identity (start with -10, increment by 2001))");
+
+			// Create another unique index on louie
+			s.execute("create unique index u1 on louie(s, i)");
+			// Create a non-unique index on louie
+			s.execute("create index u2 on louie(s)");
+			// Create a view on louie
+			s.execute("create view screwie as select * from louie");
+
+			// Create a foreign key
+			s.execute("create table reftab (vc10 varchar(10), i int, " +
+					  "s smallint, c30 char(30), " +
+					  "s2 smallint, c302 char(30), " +
+					  "dprim decimal(5,1) not null, dfor decimal(5,1) not null, "+
+					  "constraint PKEY_REFTAB	primary key (dprim), " + 
+					  "constraint FKEYSELF 		foreign key (dfor) references reftab, "+
+					  "constraint FKEY1 		foreign key(vc10, i) references louie, " + 
+				  	  "constraint FKEY2 		foreign key(c30, s2) references louie (c30, s), "+
+				  	  "constraint FKEY3 		foreign key(c30, s) references louie (c30, s))");
+
+			s.execute("create table reftab2 (t2_vc10 varchar(10), t2_i int, " +
+					  "constraint T2_FKEY1 		foreign key(t2_vc10, t2_i) references louie)");
+
+			// Create a table with all types
+			s.execute("create table alltypes ( "+
+							//"bitcol16_______ bit(16), "+
+							//"bitvaryingcol32 bit varying(32), "+ 
+							//"tinyintcol tinyint, "+
+							"smallintcol smallint, "+
+							"intcol int default 20, "+
+							"bigintcol bigint, "+
+							"realcol real, "+
+							"doublepreccol double precision default 10, "+
+							"decimalcol10p4s decimal(10,4), "+
+							"numericcol20p2s numeric(20,2), "+
+							"char8col___ char(8), "+
+							"varchar9col varchar(9), "+
+							"longvarcharcol long varchar,"+
+							//"longvarbinarycol long bit varying,"+
+							//"nchar10col nchar(10)"
+					  //+ ", nvarchar8col nvarchar(8)"
+					  //+ ", longnvarchar long nvarchar"
+					  //+ ", 
+						"blobcol blob(3K)"
+					  + ")" );
+			// test for beetle 4620
+			s.execute("CREATE TABLE INFLIGHT(FLT_NUM CHAR(20) NOT NULL," + 
+						"FLT_ORIGIN CHAR(6), " +
+						"FLT_DEST CHAR(6),  " +
+						"FLT_AIRCRAFT CHAR(20), " +
+						"FLT_FLYING_TIME VARCHAR(22), "+
+						"FLT_DEPT_TIME CHAR(8),  "+
+						"FLT_ARR_TIME CHAR(8),  "+
+						"FLT_NOTES VARCHAR(510), "+ 
+						"FLT_DAYS_OF_WK CHAR(14), "+ 
+						"FLT_CRAFT_PIC VARCHAR(32672), "+
+						"PRIMARY KEY(FLT_NUM))");
+
+			// Create procedures so we can test 
+			// getProcedureColumns()
+                        s.execute("create procedure GETPCTEST1 (" +
+				// for creating, the procedure's params do not need to exactly match the method's
+				"out outb VARCHAR(3), a VARCHAR(3), b NUMERIC, c SMALLINT, " +
+				"e SMALLINT, f INTEGER, g BIGINT, h FLOAT, i DOUBLE PRECISION, " +
+				"k DATE, l TIME, T TIMESTAMP )"+
+				"language java external name " +
+				"'org.apache.derbyTesting.functionTests.tests.jdbcapi.metadata.getpc'" +
+							" parameter style java"); 
+                        s.execute("create procedure GETPCTEST2 (pa INTEGER, pb BIGINT)"+
+				"language java external name " +
+				"'org.apache.derbyTesting.functionTests.tests.jdbcapi.metadata.getpc'" +
+				" parameter style java"); 
+                        s.execute("create procedure GETPCTEST3A (STRING1 VARCHAR(5), out STRING2 VARCHAR(5))"+
+				"language java external name " +
+				"'org.apache.derbyTesting.functionTests.tests.jdbcapi.metadata.getpc'" +
+				" parameter style java"); 
+                        s.execute("create procedure GETPCTEST3B (in STRING3 VARCHAR(5), inout STRING4 VARCHAR(5))"+
+				"language java external name " +
+				"'org.apache.derbyTesting.functionTests.tests.jdbcapi.metadata.getpc'" +
+				" parameter style java"); 
+                        s.execute("create procedure GETPCTEST4A()  "+
+				"language java external name " +
+				"'org.apache.derbyTesting.functionTests.tests.jdbcapi.metadata.getpc4a'"+
+				" parameter style java"); 
+                        s.execute("create procedure GETPCTEST4B() "+
+				"language java external name " +
+				"'org.apache.derbyTesting.functionTests.tests.jdbcapi.metadata.getpc4b'" +
+				" parameter style java"); 
+                        s.execute("create procedure GETPCTEST4Bx(out retparam INTEGER) "+
+				"language java external name " +
+				"'org.apache.derbyTesting.functionTests.tests.jdbcapi.metadata.getpc4b'" +
+				" parameter style java"); 
+
+			met = con.getMetaData();
+
+			System.out.println("JDBC Driver '" + met.getDriverName() +
+							   "', version " + met.getDriverMajorVersion() +
+							   "." + met.getDriverMinorVersion() +
+							   " (" + met.getDriverVersion() + ")");
+
+			try {
+			    System.out.println("The URL is: " + met.getURL());
+			} catch (Throwable err) {
+			    System.out.println("%%getURL() gave the exception: " + err);
+			}
+
+			System.out.println("allTablesAreSelectable(): " +
+							   met.allTablesAreSelectable());
+			
+			System.out.println("maxColumnNameLength(): " + met.getMaxColumnNameLength());
+
+			System.out.println();
+			System.out.println("getSchemas():");
+			dumpRS(met.getSchemas());
+
+			System.out.println();
+			System.out.println("getCatalogs():");
+			dumpRS(met.getCatalogs());
+
+			System.out.println("getSearchStringEscape(): " +
+							   met.getSearchStringEscape());
+
+			System.out.println("getSQLKeywords(): " +
+							   met.getSQLKeywords());
+
+			System.out.println("getDefaultTransactionIsolation(): " +
+							   met.getDefaultTransactionIsolation());
+
+			System.out.println("getProcedures():");
+			dumpRS(GET_PROCEDURES, getMetaDataRS(met, GET_PROCEDURES,
+				new String [] {null, "%", "GETPCTEST%"},
+				null, null, null));
+
+
+			/*
+			 * any methods that were not tested above using code written
+			 * specifically for it will now be tested in a generic way.
+			 */
+
+
+			System.out.println("allProceduresAreCallable(): " +
+							   met.allProceduresAreCallable());
+			System.out.println("getUserName(): " +
+							   met.getUserName());
+			System.out.println("isReadOnly(): " +
+							   met.isReadOnly());
+			System.out.println("nullsAreSortedHigh(): " +
+							   met.nullsAreSortedHigh());
+			System.out.println("nullsAreSortedLow(): " +
+							   met.nullsAreSortedLow());
+			System.out.println("nullsAreSortedAtStart(): " +
+							   met.nullsAreSortedAtStart());
+			System.out.println("nullsAreSortedAtEnd(): " +
+							   met.nullsAreSortedAtEnd());
+
+
+			System.out.println("getDatabaseProductName(): " + met.getDatabaseProductName());
+
+			String v = met.getDatabaseProductVersion();
+			int l = v.indexOf('(');
+			if (l<0) l = v.length();
+			v = v.substring(0,l);
+			System.out.println("getDatabaseProductVersion(): " + v);
+			System.out.println("getDriverVersion(): " +
+							   met.getDriverVersion());
+			System.out.println("usesLocalFiles(): " +
+							   met.usesLocalFiles());
+			System.out.println("usesLocalFilePerTable(): " +
+							   met.usesLocalFilePerTable());
+			System.out.println("supportsMixedCaseIdentifiers(): " +
+							   met.supportsMixedCaseIdentifiers());
+			System.out.println("storesUpperCaseIdentifiers(): " +
+							   met.storesUpperCaseIdentifiers());
+			System.out.println("storesLowerCaseIdentifiers(): " +
+							   met.storesLowerCaseIdentifiers());
+			System.out.println("storesMixedCaseIdentifiers(): " +
+							   met.storesMixedCaseIdentifiers());
+			System.out.println("supportsMixedCaseQuotedIdentifiers(): " +
+							   met.supportsMixedCaseQuotedIdentifiers());
+			System.out.println("storesUpperCaseQuotedIdentifiers(): " +
+							   met.storesUpperCaseQuotedIdentifiers());
+			System.out.println("storesLowerCaseQuotedIdentifiers(): " +
+							   met.storesLowerCaseQuotedIdentifiers());
+			System.out.println("storesMixedCaseQuotedIdentifiers(): " +
+							   met.storesMixedCaseQuotedIdentifiers());
+			System.out.println("getIdentifierQuoteString(): " +
+							   met.getIdentifierQuoteString());
+			System.out.println("getNumericFunctions(): " +
+							   met.getNumericFunctions());
+			System.out.println("getStringFunctions(): " +
+							   met.getStringFunctions());
+			System.out.println("getSystemFunctions(): " +
+							   met.getSystemFunctions());
+			System.out.println("getTimeDateFunctions(): " +
+							   met.getTimeDateFunctions());
+			System.out.println("getExtraNameCharacters(): " +
+							   met.getExtraNameCharacters());
+			System.out.println("supportsAlterTableWithAddColumn(): " +
+							   met.supportsAlterTableWithAddColumn());
+			System.out.println("supportsAlterTableWithDropColumn(): " +
+							   met.supportsAlterTableWithDropColumn());
+			System.out.println("supportsColumnAliasing(): " +
+							   met.supportsColumnAliasing());
+			System.out.println("nullPlusNonNullIsNull(): " +
+							   met.nullPlusNonNullIsNull());
+			System.out.println("supportsConvert(): " +
+							   met.supportsConvert());
+			System.out.println("supportsConvert(Types.INTEGER, Types.SMALLINT): " +
+							   met.supportsConvert(Types.INTEGER, Types.SMALLINT));
+			System.out.println("supportsTableCorrelationNames(): " +
+							   met.supportsTableCorrelationNames());
+			System.out.println("supportsDifferentTableCorrelationNames(): " +
+							   met.supportsDifferentTableCorrelationNames());
+			System.out.println("supportsExpressionsInOrderBy(): " +
+							   met.supportsExpressionsInOrderBy());
+			System.out.println("supportsOrderByUnrelated(): " +
+							   met.supportsOrderByUnrelated());
+			System.out.println("supportsGroupBy(): " +
+							   met.supportsGroupBy());
+			System.out.println("supportsGroupByUnrelated(): " +
+							   met.supportsGroupByUnrelated());
+			System.out.println("supportsGroupByBeyondSelect(): " +
+							   met.supportsGroupByBeyondSelect());
+			System.out.println("supportsLikeEscapeClause(): " +
+							   met.supportsLikeEscapeClause());
+			System.out.println("supportsMultipleResultSets(): " +
+							   met.supportsMultipleResultSets());
+			System.out.println("supportsMultipleTransactions(): " +
+							   met.supportsMultipleTransactions());
+			System.out.println("supportsNonNullableColumns(): " +
+							   met.supportsNonNullableColumns());
+			System.out.println("supportsMinimumSQLGrammar(): " +
+							   met.supportsMinimumSQLGrammar());
+			System.out.println("supportsCoreSQLGrammar(): " +
+							   met.supportsCoreSQLGrammar());
+			System.out.println("supportsExtendedSQLGrammar(): " +
+							   met.supportsExtendedSQLGrammar());
+			System.out.println("supportsANSI92EntryLevelSQL(): " +
+							   met.supportsANSI92EntryLevelSQL());
+			System.out.println("supportsANSI92IntermediateSQL(): " +
+							   met.supportsANSI92IntermediateSQL());
+			System.out.println("supportsANSI92FullSQL(): " +
+							   met.supportsANSI92FullSQL());
+			System.out.println("supportsIntegrityEnhancementFacility(): " +
+							   met.supportsIntegrityEnhancementFacility());
+			System.out.println("supportsOuterJoins(): " +
+							   met.supportsOuterJoins());
+			System.out.println("supportsFullOuterJoins(): " +
+							   met.supportsFullOuterJoins());
+			System.out.println("supportsLimitedOuterJoins(): " +
+							   met.supportsLimitedOuterJoins());
+			System.out.println("getSchemaTerm(): " +
+							   met.getSchemaTerm());
+			System.out.println("getProcedureTerm(): " +
+							   met.getProcedureTerm());
+			System.out.println("getCatalogTerm(): " +
+							   met.getCatalogTerm());
+			System.out.println("isCatalogAtStart(): " +
+							   met.isCatalogAtStart());
+			System.out.println("getCatalogSeparator(): " +
+							   met.getCatalogSeparator());
+			System.out.println("supportsSchemasInDataManipulation(): " +
+							   met.supportsSchemasInDataManipulation());
+			System.out.println("supportsSchemasInProcedureCalls(): " +
+							   met.supportsSchemasInProcedureCalls());
+			System.out.println("supportsSchemasInTableDefinitions(): " +
+							   met.supportsSchemasInTableDefinitions());
+			System.out.println("supportsSchemasInIndexDefinitions(): " +
+							   met.supportsSchemasInIndexDefinitions());
+			System.out.println("supportsSchemasInPrivilegeDefinitions(): " +
+							   met.supportsSchemasInPrivilegeDefinitions());
+			System.out.println("supportsCatalogsInDataManipulation(): " +
+							   met.supportsCatalogsInDataManipulation());
+			System.out.println("supportsCatalogsInProcedureCalls(): " +
+							   met.supportsCatalogsInProcedureCalls());
+			System.out.println("supportsCatalogsInTableDefinitions(): " +
+							   met.supportsCatalogsInTableDefinitions());
+			System.out.println("supportsCatalogsInIndexDefinitions(): " +
+							   met.supportsCatalogsInIndexDefinitions());
+			System.out.println("supportsCatalogsInPrivilegeDefinitions(): " +
+							   met.supportsCatalogsInPrivilegeDefinitions());
+			System.out.println("supportsPositionedDelete(): " +
+							   met.supportsPositionedDelete());
+			System.out.println("supportsPositionedUpdate(): " +
+							   met.supportsPositionedUpdate());
+			System.out.println("supportsSelectForUpdate(): " +
+							   met.supportsSelectForUpdate());
+			System.out.println("supportsStoredProcedures(): " +
+							   met.supportsStoredProcedures());
+			System.out.println("supportsSubqueriesInComparisons(): " +
+							   met.supportsSubqueriesInComparisons());
+			System.out.println("supportsSubqueriesInExists(): " +
+							   met.supportsSubqueriesInExists());
+			System.out.println("supportsSubqueriesInIns(): " +
+							   met.supportsSubqueriesInIns());
+			System.out.println("supportsSubqueriesInQuantifieds(): " +
+							   met.supportsSubqueriesInQuantifieds());
+			System.out.println("supportsCorrelatedSubqueries(): " +
+							   met.supportsCorrelatedSubqueries());
+			System.out.println("supportsUnion(): " +
+							   met.supportsUnion());
+			System.out.println("supportsUnionAll(): " +
+							   met.supportsUnionAll());
+			System.out.println("supportsOpenCursorsAcrossCommit(): " +
+							   met.supportsOpenCursorsAcrossCommit());
+			System.out.println("supportsOpenCursorsAcrossRollback(): " +
+							   met.supportsOpenCursorsAcrossRollback());
+			System.out.println("supportsOpenStatementsAcrossCommit(): " +
+							   met.supportsOpenStatementsAcrossCommit());
+			System.out.println("supportsOpenStatementsAcrossRollback(): " +
+							   met.supportsOpenStatementsAcrossRollback());
+			System.out.println("getMaxBinaryLiteralLength(): " +
+							   met.getMaxBinaryLiteralLength());
+			System.out.println("getMaxCharLiteralLength(): " +
+							   met.getMaxCharLiteralLength());
+			System.out.println("getMaxColumnsInGroupBy(): " +
+							   met.getMaxColumnsInGroupBy());
+			System.out.println("getMaxColumnsInIndex(): " +
+							   met.getMaxColumnsInIndex());
+			System.out.println("getMaxColumnsInOrderBy(): " +
+							   met.getMaxColumnsInOrderBy());
+			System.out.println("getMaxColumnsInSelect(): " +
+							   met.getMaxColumnsInSelect());
+			System.out.println("getMaxColumnsInTable(): " +
+							   met.getMaxColumnsInTable());
+			System.out.println("getMaxConnections(): " +
+							   met.getMaxConnections());
+			System.out.println("getMaxCursorNameLength(): " +
+							   met.getMaxCursorNameLength());
+			System.out.println("getMaxIndexLength(): " +
+							   met.getMaxIndexLength());
+			System.out.println("getMaxSchemaNameLength(): " +
+							   met.getMaxSchemaNameLength());
+			System.out.println("getMaxProcedureNameLength(): " +
+							   met.getMaxProcedureNameLength());
+			System.out.println("getMaxCatalogNameLength(): " +
+							   met.getMaxCatalogNameLength());
+			System.out.println("getMaxRowSize(): " +
+							   met.getMaxRowSize());
+			System.out.println("doesMaxRowSizeIncludeBlobs(): " +
+							   met.doesMaxRowSizeIncludeBlobs());
+			System.out.println("getMaxStatementLength(): " +
+							   met.getMaxStatementLength());
+			System.out.println("getMaxStatements(): " +
+							   met.getMaxStatements());
+			System.out.println("getMaxTableNameLength(): " +
+							   met.getMaxTableNameLength());
+			System.out.println("getMaxTablesInSelect(): " +
+							   met.getMaxTablesInSelect());
+			System.out.println("getMaxUserNameLength(): " +
+							   met.getMaxUserNameLength());
+			System.out.println("supportsTransactions(): " +
+							   met.supportsTransactions());
+			System.out.println("supportsTransactionIsolationLevel(Connection.TRANSACTION_NONE): " +
+							   met.supportsTransactionIsolationLevel(Connection.TRANSACTION_NONE));
+			System.out.println("supportsTransactionIsolationLevel(Connection.TRANSACTION_REPEATABLE_READ): " +
+							   met.supportsTransactionIsolationLevel(Connection.TRANSACTION_REPEATABLE_READ));
+			System.out.println("supportsTransactionIsolationLevel(Connection.TRANSACTION_SERIALIZABLE): " +
+							   met.supportsTransactionIsolationLevel(Connection.TRANSACTION_SERIALIZABLE));
+			System.out.println("supportsDataDefinitionAndDataManipulationTransactions(): " +
+							   met.supportsDataDefinitionAndDataManipulationTransactions());
+			System.out.println("supportsDataManipulationTransactionsOnly(): " +
+							   met.supportsDataManipulationTransactionsOnly());
+			System.out.println("dataDefinitionCausesTransactionCommit(): " +
+							   met.dataDefinitionCausesTransactionCommit());
+			System.out.println("dataDefinitionIgnoredInTransactions(): " +
+							   met.dataDefinitionIgnoredInTransactions());
+
+			System.out.println("getConnection(): "+
+					   ((met.getConnection()==con)?"same connection":"different connection") );
+			System.out.println("getProcedureColumns():");
+			dumpRS(GET_PROCEDURE_COLUMNS, getMetaDataRS(met, GET_PROCEDURE_COLUMNS,
+				new String [] {null, "%", "GETPCTEST%", "%"},
+				null, null, null));
+
+ 			System.out.println("getTables() with TABLE_TYPE in ('SYSTEM TABLE') :");
+ 			String[] tabTypes = new String[1];
+ 			tabTypes[0] = "SYSTEM TABLE";
+ 			dumpRS(GET_TABLES, getMetaDataRS(met, GET_TABLES,
+				new String [] {null, null, null},
+ 				tabTypes, null, null));
+
+			System.out.println("getTables() with no types:");
+ 			dumpRS(GET_TABLES, getMetaDataRS(met, GET_TABLES,
+				new String [] {"", null, "%"},
+				null, null, null));
+
+ 			System.out.println("getTables() with TABLE_TYPE in ('VIEW','TABLE') :");
+ 			tabTypes = new String[2];
+ 			tabTypes[0] = "VIEW";
+ 			tabTypes[1] = "TABLE";
+ 			dumpRS(GET_TABLES, getMetaDataRS(met, GET_TABLES,
+				new String [] {null, null, null},
+ 				tabTypes, null, null));
+
+
+			System.out.println("getTableTypes():");
+			dumpRS(met.getTableTypes());
+
+			System.out.println("getColumns():");
+			dumpRS(GET_COLUMNS, getMetaDataRS(met, GET_COLUMNS,
+				new String [] {"", null, "", ""},
+				null, null, null));
+
+			System.out.println("getColumns('SYSTABLES'):");
+			dumpRS(GET_COLUMNS, getMetaDataRS(met, GET_COLUMNS,
+				new String [] {"", "SYS", "SYSTABLES", null},
+				null, null, null));
+
+			System.out.println("getColumns('ALLTYPES'):");
+			dumpRS(GET_COLUMNS, getMetaDataRS(met, GET_COLUMNS,
+				new String [] {"", "APP", "ALLTYPES", null},
+				null, null, null));
+
+			System.out.println("getColumns('LOUIE'):");
+			dumpRS(GET_COLUMNS, getMetaDataRS(met, GET_COLUMNS,
+				new String [] {"", "APP", "LOUIE", null},
+				null, null, null));
+
+			// test for beetle 4620
+			System.out.println("getColumns('INFLIGHT'):");
+			dumpRS(GET_COLUMNS, getMetaDataRS(met, GET_COLUMNS,
+				new String [] {"", "APP", "INFLIGHT", null},
+				null, null, null));
+
+			System.out.println("getColumnPrivileges():");
+			dumpRS(GET_COLUMN_PRIVILEGES, getMetaDataRS(met, GET_COLUMN_PRIVILEGES,
+				new String [] {"Huey", "Dewey", "Louie", "Frooey"},
+				null, null, null));
+
+			System.out.println("getTablePrivileges():");
+			dumpRS(GET_TABLE_PRIVILEGES, getMetaDataRS(met, GET_TABLE_PRIVILEGES,
+				new String [] {"Huey", "Dewey", "Louie"},
+				null, null, null));
+
+			System.out.println("getBestRowIdentifier(\"\",null,\"LOUIE\"):");
+			dumpRS(GET_BEST_ROW_IDENTIFIER, getMetaDataRS(met, GET_BEST_ROW_IDENTIFIER,
+				new String [] {"", null, "LOUIE"}, null,
+				new int [] {DatabaseMetaData.bestRowTransaction},
+				new boolean [] {true}));
+
+			System.out.println("getBestRowIdentifier(\"\",\"SYS\",\"SYSTABLES\"):");
+			dumpRS(GET_BEST_ROW_IDENTIFIER, getMetaDataRS(met, GET_BEST_ROW_IDENTIFIER,
+				new String [] {"", "SYS", "SYSTABLES"}, null,
+				new int [] {DatabaseMetaData.bestRowTransaction},
+				new boolean [] {true}));
+
+			System.out.println("getVersionColumns():");
+			dumpRS(GET_VERSION_COLUMNS, getMetaDataRS(met, GET_VERSION_COLUMNS,
+				new String [] {"Huey", "Dewey", "Louie"},
+				null, null, null));
+
+			System.out.println("getPrimaryKeys():");
+			dumpRS(GET_PRIMARY_KEYS, getMetaDataRS(met, GET_PRIMARY_KEYS,
+				new String [] {"", "%", "LOUIE"},
+				null, null, null));
+
+			//beetle 4571
+			System.out.println("getPrimaryKeys(null, null, tablename):");
+			dumpRS(GET_PRIMARY_KEYS, getMetaDataRS(met, GET_PRIMARY_KEYS,
+				new String [] {null, null, "LOUIE"},
+				null, null, null));
+
+			System.out.println("getImportedKeys():");
+			dumpRS(GET_IMPORTED_KEYS, getMetaDataRS(met, GET_IMPORTED_KEYS,
+				new String [] {null, null, "%"},
+				null, null, null));
+
+			System.out.println("getExportedKeys():");
+			dumpRS(GET_EXPORTED_KEYS, getMetaDataRS(met, GET_EXPORTED_KEYS,
+				new String [] {null, null, "%"},
+				null, null, null));
+
+			System.out.println("---------------------------------------");
+			System.out.println("getCrossReference('',null,'louie','',null,'reftab' ):");
+			dumpRS(GET_CROSS_REFERENCE, getMetaDataRS(met, GET_CROSS_REFERENCE,
+				new String [] {"", null, "LOUIE", "", null, "REFTAB"},
+				null, null, null));
+
+			System.out.println("\ngetCrossReference('','APP','reftab','',null,'reftab' ):");
+			dumpRS(GET_CROSS_REFERENCE, getMetaDataRS(met, GET_CROSS_REFERENCE,
+				new String [] {"", "APP", "REFTAB", "", null, "REFTAB"},
+				null, null, null));
+
+			System.out.println("\ngetCrossReference('',null,null,'','APP','reftab' ):");
+			dumpRS(GET_CROSS_REFERENCE, getMetaDataRS(met, GET_CROSS_REFERENCE,
+				new String [] {"", null, "%", "", "APP", "REFTAB"},
+				null, null, null));
+
+			System.out.println("\ngetImportedKeys('',null,null,'','APP','reftab' ):");
+			dumpRS(GET_IMPORTED_KEYS, getMetaDataRS(met, GET_IMPORTED_KEYS,
+				new String [] {"", "APP", "REFTAB"},
+				null, null, null));
+
+			System.out.println("\ngetCrossReference('',null,'louie','','APP',null):");
+			dumpRS(GET_CROSS_REFERENCE, getMetaDataRS(met, GET_CROSS_REFERENCE,
+				new String [] {"", null, "LOUIE", "", "APP", "%"},
+				null, null, null));
+
+			System.out.println("\ngetExportedKeys('',null,'louie,'','APP',null ):");
+			dumpRS(GET_EXPORTED_KEYS, getMetaDataRS(met, GET_EXPORTED_KEYS,
+				new String [] {"", null, "LOUIE"},
+				null, null, null));
+
+			System.out.println("\ngetCrossReference('','badschema','LOUIE','','APP','REFTAB' ):");
+			dumpRS(GET_CROSS_REFERENCE, getMetaDataRS(met, GET_CROSS_REFERENCE,
+				new String [] {"", "BADSCHEMA", "LOUIE", "", "APP", "REFTAB"},
+				null, null, null));
+
+			System.out.println("getTypeInfo():");
+			dumpRS(GET_TYPE_INFO, getMetaDataRS(met, GET_TYPE_INFO, null, null, null, null));
+
+			/* NOTE - we call getIndexInfo() only on system tables here
+ 			 * so that there will be no diffs due to generated names.
+			 */
+			// unique indexes on SYSCOLUMNS
+			System.out.println("getIndexInfo():");
+			dumpRS(GET_INDEX_INFO, getMetaDataRS(met, GET_INDEX_INFO,
+				new String [] {"", "SYS", "SYSCOLUMNS"},
+				null, null, new boolean [] {true, false}));
+
+			// all indexes on SYSCOLUMNS
+			System.out.println("getIndexInfo():");
+			dumpRS(GET_INDEX_INFO, getMetaDataRS(met, GET_INDEX_INFO,
+				new String [] {"", "SYS", "SYSCOLUMNS"},
+				null, null, new boolean [] {false, false}));
+
+			System.out.println("getIndexInfo():");
+			dumpRS(GET_INDEX_INFO, getMetaDataRS(met, GET_INDEX_INFO,
+				new String [] {"", "SYS", "SYSTABLES"},
+				null, null, new boolean [] {true, false}));
+
+			rs = s.executeQuery("SELECT * FROM SYS.SYSTABLES");
+
+			System.out.println("getColumns('SYSTABLES'):");
+			dumpRS(GET_COLUMNS, getMetaDataRS(met, GET_COLUMNS,
+				new String [] {"", "SYS", "SYSTABLES", null},
+				null, null, null));
+			
+			try {
+				if (!rs.next()) {
+					System.out.println("FAIL -- user result set closed by"+
+					" intervening getColumns request");
+				}
+			} catch (SQLException se) {
+				if (this instanceof metadata) {
+					System.out.println("FAIL -- user result set closed by"+
+					" intervening getColumns request");
+				}
+				else {
+					System.out.println("OK -- user result set closed by"+
+					" intervening OBDC getColumns request; this was" +
+					" expected because of the way the test works.");
+				}
+			}
+			rs.close();
+			//
+			// Test referential actions on delete
+			//
+			System.out.println("---------------------------------------");
+			//create tables to test that we get the delete and update 
+			// referential action correct
+			System.out.println("Referential action values");
+			System.out.println("RESTRICT = "+ DatabaseMetaData.importedKeyRestrict);
+			System.out.println("NO ACTION = "+ DatabaseMetaData.importedKeyNoAction);
+			System.out.println("CASCADE = "+ DatabaseMetaData.importedKeyCascade);
+			System.out.println("SETNULL = "+ DatabaseMetaData.importedKeySetNull);
+			System.out.println("SETDEFAULT = "+ DatabaseMetaData.importedKeySetDefault);
+			s.execute("create table refaction1(a int not null primary key)");
+			s.execute("create table refactnone(a int references refaction1(a))");
+			s.execute("create table refactrestrict(a int references refaction1(a) on delete restrict)");
+			s.execute("create table refactnoaction(a int references refaction1(a) on delete no action)");
+			s.execute("create table refactcascade(a int references refaction1(a) on delete cascade)");
+			s.execute("create table refactsetnull(a int references refaction1(a) on delete set null)");
+			System.out.println("getCrossReference('','APP','REFACTION1','','APP','REFACTIONNONE' ):");
+			s.execute("create table refactupdrestrict(a int references refaction1(a) on update restrict)");
+			s.execute("create table refactupdnoaction(a int references refaction1(a) on update no action)");
+			dumpRS(GET_CROSS_REFERENCE, getMetaDataRS(met, GET_CROSS_REFERENCE,
+				new String [] {"", "APP", "REFACTION1", "", "APP", "REFACTNONE"},
+				null, null, null));
+			System.out.println("\ngetCrossReference('','APP','REFACTION1','','APP','REFACTRESTRICT' ):");
+			dumpRS(GET_CROSS_REFERENCE, getMetaDataRS(met, GET_CROSS_REFERENCE,
+				new String [] {"", "APP", "REFACTION1", "", "APP", "REFACTRESTRICT"},
+				null, null, null));
+			System.out.println("\ngetCrossReference('','APP','REFACTION1','','APP','REFACTNOACTION' ):");
+			dumpRS(GET_CROSS_REFERENCE, getMetaDataRS(met, GET_CROSS_REFERENCE,
+				new String [] {"", "APP", "REFACTION1", "", "APP", "REFACTNOACTION"},
+				null, null, null));
+			System.out.println("\ngetCrossReference('','APP','REFACTION1','','APP','REFACTCASCADE' ):");
+			dumpRS(GET_CROSS_REFERENCE, getMetaDataRS(met, GET_CROSS_REFERENCE,
+				new String [] {"", "APP", "REFACTION1", "", "APP", "REFACTCASCADE"},
+				null, null, null));
+			System.out.println("\ngetCrossReference('','APP','REFACTION1','','APP','REFACTSETNULL' ):");
+			dumpRS(GET_CROSS_REFERENCE, getMetaDataRS(met, GET_CROSS_REFERENCE,
+				new String [] {"", "APP", "REFACTION1", "", "APP", "REFACTSETNULL"},
+				null, null, null));
+			System.out.println("\ngetCrossReference('','APP','REFACTION1','','APP','REFACTUPDRESTRICT' ):");
+			dumpRS(GET_CROSS_REFERENCE, getMetaDataRS(met, GET_CROSS_REFERENCE,
+				new String [] {"", "APP", "REFACTION1", "", "APP", "REFACTUPDRESTRICT"},
+				null, null, null));
+			System.out.println("\ngetCrossReference('','APP','REFACTION1','','APP','REFACTUPDNOACTION' ):");
+			dumpRS(GET_CROSS_REFERENCE, getMetaDataRS(met, GET_CROSS_REFERENCE,
+				new String [] {"", "APP", "REFACTION1", "", "APP", "REFACTUPDNOACTION"},
+				null, null, null));
+
+			ResultSet refrs = getMetaDataRS(met, GET_IMPORTED_KEYS,
+				new String [] {"", "APP", "REFACTNONE"}, null, null, null);
+
+			if (refrs.next())
+			{
+				//check update rule
+				if (refrs.getShort(11) != DatabaseMetaData.importedKeyNoAction)
+					System.out.println("\ngetImportedKeys - none update Failed - action = " + refrs.getShort(11) + " required value = " + DatabaseMetaData.importedKeyNoAction);
+				else
+					System.out.println("\ngetImportedKeys - none update Passed");
+				//check delete rule
+				if (refrs.getShort(11) != DatabaseMetaData.importedKeyNoAction)
+					System.out.println("\ngetImportedKeys - none delete Failed - action = " + refrs.getShort(11) + " required value = " + DatabaseMetaData.importedKeyNoAction);
+				else
+					System.out.println("\ngetImportedKeys - none delete Passed");
+			}
+			else
+					System.out.println("\ngetImportedKeys - none Failed no rows");
+					
+			refrs.close();
+			refrs = getMetaDataRS(met, GET_IMPORTED_KEYS,
+				new String [] {"", "APP", "REFACTRESTRICT"}, null, null, null);
+
+			if (refrs.next())
+			{
+				if (refrs.getShort(11) != DatabaseMetaData.importedKeyRestrict)
+					System.out.println("\ngetImportedKeys - delete Restrict Failed - action = " + refrs.getShort(11) + " required value = " + DatabaseMetaData.importedKeyRestrict);
+				else
+					System.out.println("\ngetImportedKeys - delete Restrict Passed");
+			}
+			else
+					System.out.println("\ngetImportedKeys - delete Restrict Failed no rows");
+
+			refrs.close();
+			refrs = getMetaDataRS(met, GET_IMPORTED_KEYS,
+				new String [] {"", "APP", "REFACTNOACTION"}, null, null, null);
+
+			if (refrs.next())
+			{
+				if (refrs.getShort(11) != DatabaseMetaData.importedKeyNoAction)
+					System.out.println("\ngetImportedKeys - delete NO ACTION Failed - action = " + refrs.getShort(11) + " required value = " + DatabaseMetaData.importedKeyNoAction);
+				else
+					System.out.println("\ngetImportedKeys - delete NO ACTION Passed");
+			}
+			else
+					System.out.println("\ngetImportedKeys - delete NO ACTION Failed no rows");
+
+			refrs.close();
+			refrs = getMetaDataRS(met, GET_IMPORTED_KEYS,
+				new String [] {"", "APP", "REFACTCASCADE"}, null, null, null);
+
+			if (refrs.next())
+			{
+				if (refrs.getShort(11) != DatabaseMetaData.importedKeyCascade)
+					System.out.println("\ngetImportedKeys - delete CASCADE Failed - action = " + refrs.getShort(11) + " required value = " + DatabaseMetaData.importedKeyCascade);
+				else
+					System.out.println("\ngetImportedKeys - delete CASCADE Passed");
+			}
+			else
+					System.out.println("\ngetImportedKeys - delete CASCADE Failed no rows");
+
+			refrs.close();
+			refrs = getMetaDataRS(met, GET_IMPORTED_KEYS,
+				new String [] {"", "APP", "REFACTSETNULL"}, null, null, null);
+
+			if (refrs.next())
+			{
+				if (refrs.getShort(11) != DatabaseMetaData.importedKeySetNull)
+					System.out.println("\ngetImportedKeys - delete SET NULL Failed - action = " + refrs.getShort(11) + " required value = " + DatabaseMetaData.importedKeySetNull);
+				else
+					System.out.println("\ngetImportedKeys - delete SET NULL Passed");
+			}
+			else
+					System.out.println("\ngetImportedKeys - SET NULL Failed no rows");
+
+			refrs.close();
+			refrs = getMetaDataRS(met, GET_IMPORTED_KEYS,
+				new String [] {"", "APP", "REFACTRESTRICT"}, null, null, null);
+
+			if (refrs.next())
+			{
+				// test update rule
+				if (refrs.getShort(11) != DatabaseMetaData.importedKeyRestrict)
+					System.out.println("\ngetImportedKeys - update Restrict Failed - action = " + refrs.getShort(11) + " required value = " + DatabaseMetaData.importedKeyRestrict);
+				else
+					System.out.println("\ngetImportedKeys - update Restrict Passed");
+			}
+			else
+					System.out.println("\ngetImportedKeys - update Restrict Failed no rows");
+
+			refrs.close();
+			refrs = getMetaDataRS(met, GET_IMPORTED_KEYS,
+				new String [] {"", "APP", "REFACTNOACTION"}, null, null, null);
+
+			if (refrs.next())
+			{
+				if (refrs.getShort(11) != DatabaseMetaData.importedKeyNoAction)
+					System.out.println("\ngetImportedKeys - update NO ACTION Failed - action = " + refrs.getShort(11) + " required value = " + DatabaseMetaData.importedKeyNoAction);
+				else
+					System.out.println("\ngetImportedKeys - update NO ACTION Passed");
+			}
+			else
+					System.out.println("\ngetImportedKeys - update NO ACTION Failed no rows");
+			refrs.close();
+
+			System.out.println("\ngetExportedKeys('',null,null,'','APP','REFACTION1' ):");
+			dumpRS(GET_EXPORTED_KEYS, getMetaDataRS(met, GET_EXPORTED_KEYS,
+				new String [] {"", "APP", "REFACTION1"},
+				null, null, null));
+
+			System.out.println("---------------------------------------");
+
+			// drop referential action test tables
+			s.execute("drop table refactnone");
+			s.execute("drop table refactupdrestrict");
+			s.execute("drop table refactupdnoaction");
+			s.execute("drop table refactrestrict");
+			s.execute("drop table refactnoaction");
+			s.execute("drop table refactcascade");
+			s.execute("drop table refactsetnull");
+			s.execute("drop table refaction1");
+
+			// test beetle 5195
+			s.execute("create table t1 (c1 int not null, c2 int, c3 int default null, c4 char(10) not null, c5 char(10) default null, c6 char(10) default 'NULL', c7 int default 88)");
+
+			String schema = "APP";
+			String tableName = "T1";
+			DatabaseMetaData dmd = con.getMetaData();
+
+			System.out.println("getColumns for '" + tableName + "'");
+
+			rs = getMetaDataRS(dmd, GET_COLUMNS,
+				new String [] {null, schema, tableName, null},
+				null, null, null);
+
+			try
+			{
+				while (rs.next())
+				{
+					String col = rs.getString(4);
+					String type = rs.getString(6);
+					String defval = rs.getString(13);
+					if (defval == null)
+						System.out.println("  Next line is real null.");
+					System.out.println("defval for col " + col + 
+						" type " + type + " DEFAULT '" + defval + "' wasnull " + rs.wasNull());
+				}
+		
+			}
+			finally
+			{
+				if (rs != null)
+					rs.close();
+			}
+			s.execute("drop table t1");
+
+			// tiny test moved over from no longer used metadata2.sql
+			// This checks for a bug where you get incorrect behavior on a nested connection.
+			// if you do not get an error, the bug does not occur.			
+                        s.execute("create procedure isReadO() "+
+				"language java external name " +
+				"'org.apache.derbyTesting.functionTests.tests.jdbcapi.metadata.isro'" +
+				" parameter style java"); 
+			s.execute("call isReadO()");
+			
+			s.close();
+			if (con.getAutoCommit() == false)
+				con.commit();
+
+			con.close();
+
+		}
+		catch (SQLException e) {
+			dumpSQLExceptions(e);
+		}
+		catch (Throwable e) {
+			System.out.println("FAIL -- unexpected exception:");
+			e.printStackTrace(System.out);
+		}
+
+		System.out.println("Test metadata finished");
+    }
+
+	static protected void dumpSQLExceptions (SQLException se) {
+		System.out.println("FAIL -- unexpected exception");
+		while (se != null) {
+			System.out.print("SQLSTATE("+se.getSQLState()+"):");
+			se.printStackTrace(System.out);
+			se = se.getNextException();
+		}
+	}
+
+	/**
+	 * This method is responsible for executing a metadata query and returning
+	 * the result set.  We do it like this so that the metadata.java and
+	 * odbc_metadata.java classes can implement this method in their
+	 * own ways (which is needed because we have to extra work to
+	 * get the ODBC versions of the metadata).
+	 */
+	abstract protected ResultSet getMetaDataRS(DatabaseMetaData dmd, int procId,
+		String [] sArgs, String [] argArray, int [] iArgs, boolean [] bArgs)
+		throws SQLException;
+
+	/**
+	 * Dump the values in the received result set to output.
+	 */
+	protected void dumpRS(ResultSet rs) throws SQLException {
+		dumpRS(IGNORE_PROC_ID, rs);
+	}
+
+	/**
+	 * Dump the values in the received result set to output.
+	 */
+	abstract protected void dumpRS(int procId, ResultSet s) throws SQLException;
+
+	/**
+	 * Create a connect based on the test arguments passed in.
+	 */
+	protected Connection createConnection(String[] args) throws Exception {
+
+		Connection con;
+
+		// use the ij utility to read the property file and
+		// make the initial connection.
+		ij.getPropertyArg(args);
+		con = ij.startJBMS();
+		//con.setAutoCommit(true); // make sure it is true
+		con.setAutoCommit(false);
+
+		return con;
+
+	}
+}
+

Propchange: incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/metadata_test.java
------------------------------------------------------------------------------
    svn:eol-style = native