You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafodion.apache.org by db...@apache.org on 2016/05/02 18:12:07 UTC

[28/60] incubator-trafodion git commit: TRAFODION-1933 JDBC TYpe4 driver build scripts migrated to use maven instead of ant

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/72e17019/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/T4DatabaseMetaData.java
----------------------------------------------------------------------
diff --git a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/T4DatabaseMetaData.java b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/T4DatabaseMetaData.java
new file mode 100644
index 0000000..d3b916d
--- /dev/null
+++ b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/T4DatabaseMetaData.java
@@ -0,0 +1,5901 @@
+// @@@ START COPYRIGHT @@@
+//
+// 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.
+//
+// @@@ END COPYRIGHT @@@
+
+package org.trafodion.jdbc.t4;
+
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.ResultSet;
+import java.sql.RowIdLifetime;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+
+/**
+ * <p>
+ * JDBC Type 4 driver DataBaseMetaData class.
+ * </p>
+ * Comprehensive information about the database and Type 4 driver as
+ * a whole. This class lets applications users know the capabilities of database
+ * in combination with the Type 4 driver. Information returned
+ * by methods in this class applies to the capabilities of a Type 4 driver and
+ * Database working together. A user for this class is commonly a
+ * tool that needs to discover how to deal with the underlying 
+ * Database. This is especially true for applications that are intended to be
+ * used with more than one DBMS. For example, a tool might use the method
+ * <code>getTypeInfo</code> to find out what data types can be used in a
+ * CREATE TABLE statement. Or a user might call the method
+ * <code>supportsCorrelatedSubqueries</code> to see if it is possible to use a
+ * correlated subquery or <code>supportsBatchUpdates</code> to see if it is
+ * possible to use batch updates. Some DatabaseMetaData methods return lists of
+ * information in the form of ResultSet objects. Regular ResultSet methods, such
+ * as getString and getInt, can be used to retrieve the data from these
+ * ResultSet objects. If a given form of metadata is not available, the
+ * ResultSet getter methods throw an SQLException. Some DatabaseMetaData methods
+ * take arguments that are String patterns. These arguments all have names such
+ * as fooPattern. Within a pattern String, "%" means match any substring of 0 or
+ * more characters, and "_" means match any one character. Only metadata entries
+ * matching the search pattern are returned. If a search pattern argument is set
+ * to null, that argument's criterion will be dropped from the search. A method
+ * that gets information about a feature that the Type 4 driver does not support
+ * will throw an SQLException. In the case of methods that return a ResultSet
+ * object, either a ResultSet object (which might be empty) is returned, or an
+ * SQLException is thrown.
+ * 
+ * <p>
+ * Description: JDBC Type 4 Driver
+ * </p>
+ * <p>
+ * </p>
+ */
+public class T4DatabaseMetaData extends HPT4Handle implements java.sql.DatabaseMetaData {
+
+	// ----------------------------------------------------------------------
+	// First, a variety of minor information about the target database.
+
+	/*
+	 * Can all the procedures returned by getProcedures be called by the current
+	 * user?
+	 * 
+	 * @return true if so
+	 */
+	public boolean allProceduresAreCallable() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "allProceduresAreCallable", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("allProceduresAreCallable");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return false;
+	}
+
+	/*
+	 * Can all the tables returned by getTable be SELECTed by the current user?
+	 * 
+	 * @return true if so
+	 */
+	public boolean allTablesAreSelectable() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "allTablesAreSelectable", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("allTablesAreSelectable");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * What's the url for this database?
+	 * 
+	 * @return the url or null if it can't be generated * "TCP:<hostname>:<portnumber>/JDBC"
+	 * is good enough.
+	 */
+	public String getURL() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "getURL", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("getURL");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return connection_.getT4Properties().getUrl();
+	}
+
+	/*
+	 * What's our user name as known to the database?
+	 * 
+	 * @return our database user name *
+	 * 
+	 */
+	public String getUserName() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "getUserName", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("getUserName");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return connection_.getServerHandle().getUid();
+	}
+
+	/*
+	 * Is the database in read-only mode?
+	 * 
+	 * @return true if so *
+	 * 
+	 */
+	public boolean isReadOnly() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "isReadOnly", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("isReadOnly");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return false;
+	}
+
+	/*
+	 * Are NULL values sorted high?
+	 * 
+	 * @return true if so
+	 * 
+	 */
+	public boolean nullsAreSortedHigh() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "nullsAreSortedHigh", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("nullsAreSortedHigh");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return false;
+	}
+
+	/*
+	 * Are NULL values sorted low?
+	 * 
+	 * @return true if so
+	 */
+	public boolean nullsAreSortedLow() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "nullsAreSortedLow", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("nullsAreSortedLow");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * Are NULL values sorted at the start regardless of sort order?
+	 * 
+	 * @return true if so
+	 */
+	public boolean nullsAreSortedAtStart() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "nullsAreSortedAtStart", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("nullsAreSortedAtStart");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return false;
+	}
+
+	/*
+	 * Are NULL values sorted at the end regardless of sort order?
+	 * 
+	 * @return true if so
+	 */
+	public boolean nullsAreSortedAtEnd() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "nullsAreSortedAtEnd", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("nullsAreSortedAtEnd");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return false;
+	}
+
+	/*
+	 * What's the name of this database product?
+	 * 
+	 * @return database product name
+	 */
+	public String getDatabaseProductName() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "getDatabaseProductName", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("getDatabaseProductName");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return new String("Trafodion");
+	}
+
+	/*
+	 * What's the version of this database product?
+	 * 
+	 * @return database version *
+	 * 
+	 */
+	public String getDatabaseProductVersion() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "getDatabaseProductVersion", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("getDatabaseProductVersion");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return new String("" + getDatabaseMajorVersion() + "." + getDatabaseMinorVersion());
+	}
+
+	/*
+	 * What's the name of this JDBC driver?
+	 * 
+	 * @return JDBC driver name
+	 */
+	public String getDriverName() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "getDriverName", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("getDriverName");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return new String("org.trafodion.jdbc.t4.T4Driver");
+	}
+
+	/*
+	 * What's the version of this JDBC driver?
+	 * 
+	 * @return JDBC driver version
+	 */
+	public String getDriverVersion() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "getDriverVersion", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("getDriverVersion");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return Vproc.getVproc();
+	}
+
+	/*
+	 * What's this JDBC driver's major version number?
+	 * 
+	 * @return JDBC driver major version
+	 */
+	public int getDriverMajorVersion() {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "getDriverMajorVersion", "", p);
+		}
+		try {
+			if (connection_.props_.getLogWriter() != null) {
+				LogRecord lr = new LogRecord(Level.FINE, "");
+				Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+				lr.setParameters(p);
+				lr.setSourceClassName("T4DatabaseMetaData");
+				lr.setSourceMethodName("getDriverMajorVersion");
+				T4LogFormatter lf = new T4LogFormatter();
+				String temp = lf.format(lr);
+				connection_.props_.getLogWriter().println(temp);
+			}
+		} catch (SQLException se) {
+			// ignore
+		}
+                return Vproc.jdbcMajorVersion;
+	}
+
+	/*
+	 * What's this JDBC driver's minor version number?
+	 * 
+	 * @return JDBC driver minor version number
+	 */
+	public int getDriverMinorVersion() {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "getDriverMinorVersion", "", p);
+		}
+		try {
+			if (connection_.props_.getLogWriter() != null) {
+				LogRecord lr = new LogRecord(Level.FINE, "");
+				Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+				lr.setParameters(p);
+				lr.setSourceClassName("T4DatabaseMetaData");
+				lr.setSourceMethodName("getDriverMinorVersion");
+				T4LogFormatter lf = new T4LogFormatter();
+				String temp = lf.format(lr);
+				connection_.props_.getLogWriter().println(temp);
+			}
+		} catch (SQLException se) {
+			// ignore
+		}
+                return Vproc.jdbcMinorVersion;
+	}
+
+	/*
+	 * Does the database store tables in a local file?
+	 * 
+	 * @return true if so
+	 */
+	public boolean usesLocalFiles() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "usesLocalFiles", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("usesLocalFiles");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * Does the database use a file for each table?
+	 * 
+	 * @return true if the database uses a local file for each table
+	 */
+	public boolean usesLocalFilePerTable() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "usesLocalFilePerTable", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("usesLocalFilePerTable");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * Database does not treat the mixed case unquoted SQL
+	 * identifiers as case sensitive and does not store the result in mixed
+	 * case.
+	 * 
+	 * @return false always for the Type 4 driver.
+	 */
+	public boolean supportsMixedCaseIdentifiers() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_
+					.logp(Level.FINE, "T4DatabaseMetaData", "supportsMixedCaseIdentifiers", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsMixedCaseIdentifiers");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return false;
+	}
+
+	/*
+	 * Database treat mixed case unquoted SQL identifiers as case
+	 * insensitive and store them in upper case.
+	 * @return true always for the Type 4 driver.
+	 */
+	public boolean storesUpperCaseIdentifiers() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "storesUpperCaseIdentifiers", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("storesUpperCaseIdentifiers");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * Does the database treat mixed case unquoted SQL identifiers as case
+	 * insensitive and store them in lower case?
+	 * 
+	 * @return true if so
+	 */
+	public boolean storesLowerCaseIdentifiers() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "storesLowerCaseIdentifiers", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("storesLowerCaseIdentifiers");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return false;
+	}
+
+	/*
+	 * Does the database treat mixed case unquoted SQL identifiers as case
+	 * insensitive and store them in mixed case?
+	 * 
+	 * @return true if so
+	 */
+	public boolean storesMixedCaseIdentifiers() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "storesMixedCaseIdentifiers", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("storesMixedCaseIdentifiers");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return false;
+	}
+
+	/*
+	 * Database treat mixed case quoted SQL identifiers as case
+	 * sensitive and as a result store them in mixed case.
+	 * A JDBC-Compliant driver will always return false.
+	 * 
+	 * @return true always true for the Type 4 drive.
+	 */
+	public boolean supportsMixedCaseQuotedIdentifiers() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsMixedCaseQuotedIdentifiers",
+					"", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsMixedCaseQuotedIdentifiers");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * Does the database treat mixed case quoted SQL identifiers as case
+	 * insensitive and store them in upper case?
+	 * 
+	 * @return true if so
+	 */
+	public boolean storesUpperCaseQuotedIdentifiers() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "storesUpperCaseQuotedIdentifiers",
+					"", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("storesUpperCaseQuotedIdentifiers");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * Does the database treat mixed case quoted SQL identifiers as case
+	 * insensitive and store them in lower case?
+	 * 
+	 * @return true if so
+	 */
+	public boolean storesLowerCaseQuotedIdentifiers() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "storesLowerCaseQuotedIdentifiers",
+					"", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("storesLowerCaseQuotedIdentifiers");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return false;
+	}
+
+	/*
+	 * Does the database treat mixed case quoted SQL identifiers as case
+	 * insensitive and store them in mixed case?
+	 * 
+	 * @return true if so
+	 */
+	public boolean storesMixedCaseQuotedIdentifiers() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", " storesMixedCaseQuotedIdentifiers",
+					"", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName(" storesMixedCaseQuotedIdentifiers");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return false;
+	}
+
+	/*
+	 * Database uses the " string to quote SQL identifiers. This call
+	 * returns a space " " if identifier quoting isn't supported.
+	 * A JDBC-Compliant driver always uses a double quote character.
+	 * 
+	 * @return the quoting string ".
+	 */
+	public String getIdentifierQuoteString() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "getIdentifierQuoteString", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("getIdentifierQuoteString");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return new String("\"");
+	}
+
+	/*
+	 * Get a comma separated list of all a database's SQL keywords that are NOT
+	 * also SQL92 keywords.
+	 * 
+	 * @return the list *
+	 * 
+	 */
+	public String getSQLKeywords() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "getSQLKeywords", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("getSQLKeywords");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return "DATETIME,FRACTION,PROTOTYPE,SQL_CHAR,SQL_DATE,SQL_DECIMAL,SQL_DOUBLE,SQL_FLOAT"
+				+ ",SQL_INT,SQL_INTEGER,SQL_REAL,SQL_SMALLINT,SQL_TIME,SQL_TIMESTAMP,SQL_VARCHAR"
+				+ ",TRANSPOSE,UPSHIFT";
+	}
+
+	/*
+	 * Get a comma separated list of math functions.
+	 * 
+	 * @return the list *
+	 * 
+	 */
+	public String getNumericFunctions() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "getNumericFunctions", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("getNumericFunctions");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return new String(
+				"ABS,ACOS,ASIN,ATAN,ATAN2,CEILING,COS,COSH,DEGREES,EXP,FLOOR,LOG,LOG10,MOD,PI,POWER,RADIANS,RAND"
+						+ "SIGN,SIN,SINH,SORT,TAN,TANH");
+	}
+
+	/*
+	 * Get a comma separated list of string functions.
+	 * 
+	 * @return the list *
+	 * 
+	 */
+	public String getStringFunctions() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "getStringFunctions", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("getStringFunctions");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return new String("ASCII,CHAR,CHAR_LENGTH,CONCAT,INSERT,LCASE,LEFT,LOCATE,LOWER,LPAD,LTRIM,OCTET_LENGTH"
+				+ "POSITION,REPEAT,REPLACE,RIGHT,RPAD,RTRIM,SPACE,SUBSTRING,TRIM,UCASE,UPPER,UPSHIFT");
+	}
+
+	/*
+	 * Get a comma separated list of system functions.
+	 * 
+	 * @return the list *
+	 * 
+	 */
+	public String getSystemFunctions() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "getSystemFunctions", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("getSystemFunctions");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return new String("CURRENT_USER,USER");
+	}
+
+	/*
+	 * Get a comma separated list of time and date functions.
+	 * 
+	 * @return the list *
+	 * 
+	 */
+	public String getTimeDateFunctions() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "getTimeDateFunctions", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("getTimeDateFunctions");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+
+		return new String("CONVERTTIMESTAMP,CURRENT,CURRENT_DATE,CURRENT_TIME,CURRENT_TIMESTAMP"
+				+ "DATEFORMAT,DAY,DAYNAME,DAYOFMONTH,DAYOFWEEK,DAYOFYEAR,EXTRACT,HOUR,JULIANTIMESTAMP,MINUTE"
+				+ "MONTH,MONTHNAME,QUARTER,SECOND,WEEK,YEAR");
+	}
+
+	/*
+	 * This is the string that can be used to escape '_' or '%' in the string
+	 * pattern style catalog search parameters.
+	 * 
+	 * <P>The '_' character represents any single character. <P>The '%'
+	 * character represents any sequence of zero or more characters. @return the
+	 * string used to escape wildcard characters *
+	 * 
+	 */
+	public String getSearchStringEscape() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "getSearchStringEscape", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("getSearchStringEscape");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return new String("\\");
+	}
+
+	/*
+	 * Get all the "extra" characters that can be used in unquoted identifier
+	 * names (those beyond a-z, A-Z, 0-9 and _).
+	 * 
+	 * @return the string containing the extra characters
+	 */
+	public String getExtraNameCharacters() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "getExtraNameCharacters", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("getExtraNameCharacters");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return null;
+	}
+
+	// --------------------------------------------------------------------
+	// Functions describing which features are supported.
+
+	/*
+	 * Is "ALTER TABLE" with add column supported?
+	 * 
+	 * @return true if so
+	 */
+	public boolean supportsAlterTableWithAddColumn() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsAlterTableWithAddColumn",
+					"", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsAlterTableWithAddColumn");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return false;
+	}
+
+	/*
+	 * Is "ALTER TABLE" with drop column supported?
+	 * 
+	 * @return true if so
+	 */
+	public boolean supportsAlterTableWithDropColumn() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsAlterTableWithDropColumn",
+					"", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsAlterTableWithDropColumn");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return false;
+	}
+
+	/*
+	 * Is column aliasing supported?
+	 * 
+	 * <P>If so, the SQL AS clause can be used to provide names for computed
+	 * columns or to provide alias names for columns as required.
+	 * 
+	 * A JDBC-Compliant driver always returns true.
+	 * 
+	 * @return true if so
+	 */
+	public boolean supportsColumnAliasing() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsColumnAliasing", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsColumnAliasing");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * Database concatenations between NULL and non-NULL values is
+	 * NULL.
+	 * 
+	 * A JDBC-Compliant driver always returns true.
+	 * 
+	 * @return true always for the Type 4 driver.
+	 */
+	public boolean nullPlusNonNullIsNull() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "nullPlusNonNullIsNull", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("nullPlusNonNullIsNull");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * Is the CONVERT function between SQL types supported?
+	 * 
+	 * @return true if so
+	 */
+	public boolean supportsConvert() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsConvert", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsConvert");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * Is CONVERT between the given SQL types supported?
+	 * 
+	 * @param fromType the type to convert from @param toType the type to
+	 * convert to @return true if so
+	 * 
+	 * @see Types
+	 */
+	public boolean supportsConvert(int fromType, int toType) throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_, fromType, toType);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsConvert", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_, fromType, toType);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsConvert");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		switch (fromType) {
+		case Types.BIGINT:
+		case Types.DECIMAL:
+		case Types.DOUBLE:
+		case Types.FLOAT:
+		case Types.INTEGER:
+		case Types.NUMERIC:
+		case Types.REAL:
+		case Types.SMALLINT:
+			switch (toType) {
+			case Types.CHAR:
+			case Types.NUMERIC:
+			case Types.DECIMAL:
+			case Types.INTEGER:
+			case Types.SMALLINT:
+			case Types.FLOAT:
+			case Types.REAL:
+			case Types.DOUBLE:
+			case Types.VARCHAR:
+			case Types.LONGVARCHAR:
+			case Types.BIGINT:
+				return true;
+			default:
+				return false;
+			}
+		case Types.CHAR:
+		case Types.VARCHAR:
+		case Types.LONGVARCHAR:
+			switch (toType) {
+			case Types.CHAR:
+			case Types.NUMERIC:
+			case Types.DECIMAL:
+			case Types.INTEGER:
+			case Types.SMALLINT:
+			case Types.FLOAT:
+			case Types.REAL:
+			case Types.DOUBLE:
+			case Types.VARCHAR:
+			case Types.LONGVARCHAR:
+			case Types.BIGINT:
+			case Types.DATE:
+			case Types.TIME:
+			case Types.TIMESTAMP:
+				return true;
+			default:
+				return false;
+			}
+		case Types.DATE:
+			switch (toType) {
+			case Types.CHAR:
+			case Types.VARCHAR:
+			case Types.LONGVARCHAR:
+			case Types.DATE:
+			case Types.TIMESTAMP:
+				return true;
+			default:
+				return false;
+			}
+		case Types.TIME:
+			switch (toType) {
+			case Types.CHAR:
+			case Types.VARCHAR:
+			case Types.LONGVARCHAR:
+			case Types.TIME:
+			case Types.TIMESTAMP:
+				return true;
+			default:
+				return false;
+			}
+		case Types.TIMESTAMP:
+			switch (toType) {
+			case Types.CHAR:
+			case Types.VARCHAR:
+			case Types.LONGVARCHAR:
+			case Types.DATE:
+			case Types.TIME:
+			case Types.TIMESTAMP:
+				return true;
+			default:
+				return false;
+			}
+		case Types.BIT:
+		case Types.BINARY:
+		case Types.VARBINARY:
+		case Types.LONGVARBINARY:
+		case Types.TINYINT:
+			return false;
+		default:
+			return false;
+		}
+	}
+
+	/*
+	 * Type 4 driver supports table correlation names. Type 4 driver always
+	 * returns true.
+	 * 
+	 * @return true for Type 4 driver
+	 */
+	public boolean supportsTableCorrelationNames() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsTableCorrelationNames", "",
+					p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsTableCorrelationNames");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * Database table correlation names are supported, and they are
+	 * not restricted to be different from the names of the Database
+	 * tables.
+	 * 
+	 * @return false always for Type 4 driver.
+	 */
+	public boolean supportsDifferentTableCorrelationNames() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData",
+					"supportsDifferentTableCorrelationNames", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsDifferentTableCorrelationNames");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return false;
+	}
+
+	/*
+	 * SQL expressions in "ORDER BY" lists are not supported by the
+	 * Database and Type 4 driver.
+	 * 
+	 * @return false always for Type 4 driver.
+	 */
+	public boolean supportsExpressionsInOrderBy() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_
+					.logp(Level.FINE, "T4DatabaseMetaData", "supportsExpressionsInOrderBy", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsExpressionsInOrderBy");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return false;
+	}
+
+	/*
+	 * Can an "ORDER BY" clause use columns not in the SELECT?
+	 * 
+	 * @return true if so
+	 */
+	public boolean supportsOrderByUnrelated() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsOrderByUnrelated", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsOrderByUnrelated");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * Is some form of "GROUP BY" clause supported?
+	 * 
+	 * @return true if so
+	 */
+	public boolean supportsGroupBy() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsGroupBy", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsGroupBy");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * Can a "GROUP BY" clause use columns not in the SELECT?
+	 * 
+	 * @return true if so
+	 */
+	public boolean supportsGroupByUnrelated() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsGroupByUnrelated", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsGroupByUnrelated");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return false;
+	}
+
+	/*
+	 * Can a "GROUP BY" clause add columns not in the SELECT provided it
+	 * specifies all the columns in the SELECT?
+	 * 
+	 * @return true if so
+	 */
+	public boolean supportsGroupByBeyondSelect() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsGroupByBeyondSelect", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsGroupByBeyondSelect");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return false;
+	}
+
+	/*
+	 * Database supports escape character in "LIKE" clauses.
+	 * A JDBC-Compliant driver always returns true.
+	 * 
+	 * @return true always true for the Type 4 driver.
+	 */
+	public boolean supportsLikeEscapeClause() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsLikeEscapeClause", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsLikeEscapeClause");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * Are multiple ResultSets from a single execute supported?
+	 * 
+	 * @return true if so
+	 */
+	public boolean supportsMultipleResultSets() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsMultipleResultSets", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsMultipleResultSets");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * Can we have multiple transactions open at once (on different
+	 * connections)?
+	 * 
+	 * @return true if so
+	 */
+	public boolean supportsMultipleTransactions() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_
+					.logp(Level.FINE, "T4DatabaseMetaData", "supportsMultipleTransactions", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsMultipleTransactions");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}		
+		// Need to change it 'true' once Database fixes this problem
+		return false;
+	}
+
+	/*
+	 * Database table columns can be defined as non-nullable.
+	 * @return true always for the Type 4 driver.
+	 */
+	public boolean supportsNonNullableColumns() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsNonNullableColumns", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsNonNullableColumns");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * Type 4 driver supports the ODBC Minimum SQL grammar.
+	 * 
+	 * All JDBC-Compliant drivers must return true.
+	 * 
+	 * @return true always for the Type 4 driver.
+	 */
+	public boolean supportsMinimumSQLGrammar() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsMinimumSQLGrammar", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsMinimumSQLGrammar");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * Is the ODBC Core SQL grammar supported?
+	 * 
+	 * @return true if so
+	 */
+	public boolean supportsCoreSQLGrammar() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsCoreSQLGrammar", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsCoreSQLGrammar");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * Is the ODBC Extended SQL grammar supported?
+	 * 
+	 * @return true if so
+	 */
+	public boolean supportsExtendedSQLGrammar() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsExtendedSQLGrammar", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsExtendedSQLGrammar");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return false;
+	}
+
+	/*
+	 * Database supports the ANSI92 entry level SQL grammar.
+	 * All JDBC-Compliant drivers must return true.
+	 * 
+	 * @return true always for the Type 4 driver.
+	 */
+	public boolean supportsANSI92EntryLevelSQL() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsANSI92EntryLevelSQL", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsANSI92EntryLevelSQL");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * Is the ANSI92 intermediate SQL grammar supported?
+	 * 
+	 * @return true if so
+	 */
+	public boolean supportsANSI92IntermediateSQL() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsANSI92IntermediateSQL", "",
+					p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsANSI92IntermediateSQL");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return false;
+	}
+
+	/*
+	 * Is the ANSI92 full SQL grammar supported?
+	 * 
+	 * @return true if so
+	 */
+	public boolean supportsANSI92FullSQL() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsANSI92FullSQL", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsANSI92FullSQL");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return false;
+	}
+
+	/*
+	 * Is the SQL Integrity Enhancement Facility supported?
+	 * 
+	 * @return true if so
+	 */
+	public boolean supportsIntegrityEnhancementFacility() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData",
+					"supportsIntegrityEnhancementFacility", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsIntegrityEnhancementFacility");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return false;
+	}
+
+	/*
+	 * Is some form of outer join supported?
+	 * 
+	 * @return true if so
+	 */
+	public boolean supportsOuterJoins() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsOuterJoins", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsOuterJoins");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * Are full nested outer joins supported?
+	 * 
+	 * @return true if so
+	 */
+	public boolean supportsFullOuterJoins() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsFullOuterJoins", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsFullOuterJoins");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return false;
+	}
+
+	/*
+	 * Database provides the limited support for outer joins. This
+	 * will be true if supportFullOuterJoins is true.
+	 * @return true always for the Type 4 driver.
+	 */
+	public boolean supportsLimitedOuterJoins() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsLimitedOuterJoins", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsLimitedOuterJoins");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * What's the database vendor's preferred term for "schema"?
+	 * 
+	 * @return the vendor term
+	 */
+	public String getSchemaTerm() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "getSchemaTerm", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("getSchemaTerm");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return new String("SCHEMA");
+	}
+
+	/*
+	 * What's the database vendor's preferred term for "procedure"?
+	 * 
+	 * @return the vendor term
+	 */
+	public String getProcedureTerm() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "getProcedureTerm", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("getProcedureTerm");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return new String("PROCEDURE");
+	}
+
+	/*
+	 * What's the database vendor's preferred term for "catalog"?
+	 * 
+	 * @return the vendor term
+	 */
+	public String getCatalogTerm() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "getCatalogTerm", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("getCatalogTerm");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return new String("CATALOG");
+	}
+
+	/*
+	 * Database catalog name appear at the start of a qualified table
+	 * name. (Otherwise it appears at the end)
+	 * @return true always for the Type 4 driver.
+	 */
+	public boolean isCatalogAtStart() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "isCatalogAtStart", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("isCatalogAtStart");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * What's the separator between catalog and table name?
+	 * 
+	 * @return the separator string
+	 */
+	public String getCatalogSeparator() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "getCatalogSeparator", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("getCatalogSeparator");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return new String(".");
+	}
+
+	/*
+	 * Can a schema name be used in a data manipulation statement?
+	 * 
+	 * @return true if so
+	 */
+	public boolean supportsSchemasInDataManipulation() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsSchemasInDataManipulation",
+					"", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsSchemasInDataManipulation");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * Can a schema name be used in a procedure call statement?
+	 * 
+	 * @return true if so
+	 */
+	public boolean supportsSchemasInProcedureCalls() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsSchemasInProcedureCalls",
+					"", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsSchemasInProcedureCalls");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * Can a schema name be used in a table definition statement?
+	 * 
+	 * @return true if so
+	 */
+	public boolean supportsSchemasInTableDefinitions() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsSchemasInTableDefinitions",
+					"", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsSchemasInTableDefinitions");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * Can a schema name be used in an index definition statement?
+	 * 
+	 * @return true if so
+	 */
+	public boolean supportsSchemasInIndexDefinitions() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsSchemasInIndexDefinitions",
+					"", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsSchemasInIndexDefinitions");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * Can a schema name be used in a privilege definition statement?
+	 * 
+	 * @return true if so
+	 */
+	public boolean supportsSchemasInPrivilegeDefinitions() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData",
+					"supportsSchemasInPrivilegeDefinitions", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsSchemasInPrivilegeDefinitions");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * Can a catalog name be used in a data manipulation statement?
+	 * 
+	 * @return true if so
+	 */
+	public boolean supportsCatalogsInDataManipulation() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsCatalogsInDataManipulation",
+					"", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsCatalogsInDataManipulation");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * Can a catalog name be used in a procedure call statement?
+	 * 
+	 * @return true if so
+	 */
+	public boolean supportsCatalogsInProcedureCalls() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsCatalogsInProcedureCalls",
+					"", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsCatalogsInProcedureCalls");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * Can a catalog name be used in a table definition statement?
+	 * 
+	 * @return true if so
+	 */
+	public boolean supportsCatalogsInTableDefinitions() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsCatalogsInTableDefinitions",
+					"", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsCatalogsInTableDefinitions");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * Can a catalog name be used in an index definition statement?
+	 * 
+	 * @return true if so
+	 */
+	public boolean supportsCatalogsInIndexDefinitions() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsCatalogsInIndexDefinitions",
+					"", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsCatalogsInIndexDefinitions");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * Can a catalog name be used in a privilege definition statement?
+	 * 
+	 * @return true if so
+	 */
+	public boolean supportsCatalogsInPrivilegeDefinitions() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData",
+					"supportsCatalogsInPrivilegeDefinitions", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsCatalogsInPrivilegeDefinitions");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * Is positioned DELETE supported?
+	 * 
+	 * @return true if so
+	 */
+	public boolean supportsPositionedDelete() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsPositionedDelete", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsPositionedDelete");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * Database supports positioned UPDATE supported through the Type
+	 * 4 driver.
+	 * @return true always for the Type 4 driver.
+	 */
+	public boolean supportsPositionedUpdate() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsPositionedUpdate", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsPositionedUpdate");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * Database supports SELECT for UPDATE through the Type 4 driver.
+	 * @return true always for the Type 4 driver.
+	 */
+	public boolean supportsSelectForUpdate() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsSelectForUpdate", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsSelectForUpdate");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * stored procedure calls using the stored procedure escape syntax
+	 * are supported.
+	 * 
+	 * @return true always for the Type 4 driver.
+	 */
+	public boolean supportsStoredProcedures() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsStoredProcedures", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsStoredProcedures");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * Trafodion Database Database subqueries in comparison expressions are supported
+	 * through the Type 4 driver.
+	 * @return true always for the Type 4 driver.
+	 */
+	public boolean supportsSubqueriesInComparisons() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsSubqueriesInComparisons",
+					"", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsSubqueriesInComparisons");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * Trafodion Database supports subqueries in 'exists' expressions through
+	 * Type 4 driver.
+	 * @return true always for the Type 4 driver.
+	 */
+	public boolean supportsSubqueriesInExists() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsSubqueriesInExists", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsSubqueriesInExists");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * Trafodion Database supports subqueries in 'in' statements through the
+	 * Type 4 driver.
+	 * @return true always for the Type 4 driver.
+	 */
+	public boolean supportsSubqueriesInIns() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsSubqueriesInIns", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsSubqueriesInIns");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * The subqueries in quantified expressions supported in Trafodion Database
+	 * and Type 4 driver.
+	 * @return true always for Type 4 driver.
+	 */
+	public boolean supportsSubqueriesInQuantifieds() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsSubqueriesInQuantifieds",
+					"", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsSubqueriesInQuantifieds");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * Trafodion Database supports correlated subqueries.
+	 * A JDBC-Compliant driver always returns true.
+	 * 
+	 * @return true always for the Type 4 driver.
+	 */
+	public boolean supportsCorrelatedSubqueries() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_
+					.logp(Level.FINE, "T4DatabaseMetaData", "supportsCorrelatedSubqueries", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsCorrelatedSubqueries");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * Is SQL UNION supported?
+	 * 
+	 * @return true if so
+	 */
+	public boolean supportsUnion() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsUnion", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsUnion");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * Is SQL UNION ALL supported?
+	 * 
+	 * @return true if so
+	 */
+	public boolean supportsUnionAll() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsUnionAll", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsUnionAll");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * Can cursors remain open across commits?
+	 * 
+	 * @return true if cursors always remain open; false if they might not
+	 * remain open
+	 */
+	public boolean supportsOpenCursorsAcrossCommit() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsOpenCursorsAcrossCommit",
+					"", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsOpenCursorsAcrossCommit");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return false;
+	}
+
+	/*
+	 * Can cursors remain open across rollbacks?
+	 * 
+	 * @return true if cursors always remain open; false if they might not
+	 * remain open
+	 */
+	public boolean supportsOpenCursorsAcrossRollback() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsOpenCursorsAcrossRollback",
+					"", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsOpenCursorsAcrossRollback");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return false;
+	}
+
+	/*
+	 * Can statements remain open across commits?
+	 * 
+	 * @return true if statements always remain open; false if they might not
+	 * remain open
+	 */
+	public boolean supportsOpenStatementsAcrossCommit() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData", "supportsOpenStatementsAcrossCommit",
+					"", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsOpenStatementsAcrossCommit");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	/*
+	 * Can statements remain open across rollbacks?
+	 * 
+	 * @return true if statements always remain open; false if they might not
+	 * remain open
+	 */
+	public boolean supportsOpenStatementsAcrossRollback() throws SQLException {
+		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			connection_.props_.t4Logger_.logp(Level.FINE, "T4DatabaseMetaData",
+					"supportsOpenStatementsAcrossRollback", "", p);
+		}
+		if (connection_.props_.getLogWriter() != null) {
+			LogRecord lr = new LogRecord(Level.FINE, "");
+			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
+			lr.setParameters(p);
+			lr.setSourceClassName("T4DatabaseMetaData");
+			lr.setSourceMethodName("supportsOpenStatementsAcrossRollback");
+			T4LogFormatter lf = new T4LogFormatter();
+			String temp = lf.format(lr);
+			connection_.props_.getLogWriter().println(temp);
+		}
+		return true;
+	}
+
+	// -------------------------------------

<TRUNCATED>