You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by kw...@apache.org on 2006/12/04 15:42:10 UTC

svn commit: r482189 [2/2] - in /incubator/openjpa/trunk: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/ openjpa-lib/src/main/java/org/apache/openjpa/lib/jdbc/

Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DB2Dictionary.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DB2Dictionary.java?view=diff&rev=482189&r1=482188&r2=482189
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DB2Dictionary.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DB2Dictionary.java Mon Dec  4 06:42:09 2006
@@ -1,144 +1,162 @@
-/*
- * Copyright 2006 The Apache Software Foundation.
- *
- * 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.openjpa.jdbc.sql;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.util.Arrays;
-
-import org.apache.openjpa.jdbc.schema.Sequence;
-
-/**
- * Dictionary for IBM DB2 database.
- */
-public class DB2Dictionary
-    extends AbstractDB2Dictionary {
-
-    public DB2Dictionary() {
-        platform = "DB2";
-        validationSQL = "SELECT DISTINCT(CURRENT TIMESTAMP) FROM "
-            + "SYSIBM.SYSTABLES";
-        supportsSelectEndIndex = true;
-
-        nextSequenceQuery = "VALUES NEXTVAL FOR {0}";
-
-        binaryTypeName = "BLOB(1M)";
-        longVarbinaryTypeName = "BLOB(1M)";
-        varbinaryTypeName = "BLOB(1M)";
-        clobTypeName = "CLOB(1M)";
-        longVarcharTypeName = "LONG VARCHAR";
-
-        fixedSizeTypeNameSet.addAll(Arrays.asList(new String[]{
-            "LONG VARCHAR FOR BIT DATA", "LONG VARCHAR", "LONG VARGRAPHIC",
-        }));
-
-        maxConstraintNameLength = 18;
-        maxIndexNameLength = 18;
-        maxColumnNameLength = 30;
-        supportsDeferredConstraints = false;
-        supportsDefaultDeleteAction = false;
-        supportsAlterTableWithDropColumn = false;
-
-        supportsNullTableForGetColumns = false;
-
-        reservedWordSet.addAll(Arrays.asList(new String[]{
-            "AFTER", "ALIAS", "ALLOW", "APPLICATION", "ASSOCIATE", "ASUTIME",
-            "AUDIT", "AUX", "AUXILIARY", "BEFORE", "BINARY", "BUFFERPOOL",
-            "CACHE", "CALL", "CALLED", "CAPTURE", "CARDINALITY", "CCSID",
-            "CLUSTER", "COLLECTION", "COLLID", "COMMENT", "CONCAT",
-            "CONDITION", "CONTAINS", "COUNT_BIG", "CURRENT_LC_CTYPE",
-            "CURRENT_PATH", "CURRENT_SERVER", "CURRENT_TIMEZONE", "CYCLE",
-            "DATA", "DATABASE", "DAYS", "DB2GENERAL", "DB2GENRL", "DB2SQL",
-            "DBINFO", "DEFAULTS", "DEFINITION", "DETERMINISTIC", "DISALLOW",
-            "DO", "DSNHATTR", "DSSIZE", "DYNAMIC", "EACH", "EDITPROC", "ELSEIF",
-            "ENCODING", "END-EXEC1", "ERASE", "EXCLUDING", "EXIT", "FENCED",
-            "FIELDPROC", "FILE", "FINAL", "FREE", "FUNCTION", "GENERAL",
-            "GENERATED", "GRAPHIC", "HANDLER", "HOLD", "HOURS", "IF",
-            "INCLUDING", "INCREMENT", "INDEX", "INHERIT", "INOUT", "INTEGRITY",
-            "ISOBID", "ITERATE", "JAR", "JAVA", "LABEL", "LC_CTYPE", "LEAVE",
-            "LINKTYPE", "LOCALE", "LOCATOR", "LOCATORS", "LOCK", "LOCKMAX",
-            "LOCKSIZE", "LONG", "LOOP", "MAXVALUE", "MICROSECOND",
-            "MICROSECONDS", "MINUTES", "MINVALUE", "MODE", "MODIFIES", "MONTHS",
-            "NEW", "NEW_TABLE", "NOCACHE", "NOCYCLE", "NODENAME", "NODENUMBER",
-            "NOMAXVALUE", "NOMINVALUE", "NOORDER", "NULLS", "NUMPARTS", "OBID",
-            "OLD", "OLD_TABLE", "OPTIMIZATION", "OPTIMIZE", "OUT", "OVERRIDING",
-            "PACKAGE", "PARAMETER", "PART", "PARTITION", "PATH", "PIECESIZE",
-            "PLAN", "PRIQTY", "PROGRAM", "PSID", "QUERYNO", "READS", "RECOVERY",
-            "REFERENCING", "RELEASE", "RENAME", "REPEAT", "RESET", "RESIGNAL",
-            "RESTART", "RESULT", "RESULT_SET_LOCATOR", "RETURN", "RETURNS",
-            "ROUTINE", "ROW", "RRN", "RUN", "SAVEPOINT", "SCRATCHPAD",
-            "SECONDS", "SECQTY", "SECURITY", "SENSITIVE", "SIGNAL", "SIMPLE",
-            "SOURCE", "SPECIFIC", "SQLID", "STANDARD", "START", "STATIC",
-            "STAY", "STOGROUP", "STORES", "STYLE", "SUBPAGES", "SYNONYM",
-            "SYSFUN", "SYSIBM", "SYSPROC", "SYSTEM", "TABLESPACE", "TRIGGER",
-            "TYPE", "UNDO", "UNTIL", "VALIDPROC", "VARIABLE", "VARIANT", "VCAT",
-            "VOLUMES", "WHILE", "WLM", "YEARS",
-        }));
-    }
-
-    public boolean supportsRandomAccessResultSet(Select sel,
-        boolean forUpdate) {
-        return !forUpdate
-            && super.supportsRandomAccessResultSet(sel, forUpdate);
-    }
-
-    protected void appendSelectRange(SQLBuffer buf, long start, long end) {
-        // appends the literal range string, since DB2 is unable to handle
-        // a bound parameter for it
-        buf.append(" FETCH FIRST ").append(Long.toString(end)).
-            append(" ROWS ONLY");
-    }
-
-    public String[] getCreateSequenceSQL(Sequence seq) {
-        String[] sql = super.getCreateSequenceSQL(seq);
-        if (seq.getAllocate() > 1)
-            sql[0] += " CACHE " + seq.getAllocate();
-        return sql;
-    }
-
-    protected String getSequencesSQL(String schemaName, String sequenceName) {
-        StringBuffer buf = new StringBuffer();
-        buf.append("SELECT SEQSCHEMA AS SEQUENCE_SCHEMA, ").
-            append("SEQNAME AS SEQUENCE_NAME FROM SYSCAT.SEQUENCES");
-        if (schemaName != null || sequenceName != null)
-            buf.append(" WHERE ");
-        if (schemaName != null) {
-            buf.append("SEQSCHEMA = ?");
-            if (sequenceName != null)
-                buf.append(" AND ");
-        }
-        if (sequenceName != null)
-            buf.append("SEQNAME = ?");
-        return buf.toString();
-    }
-
-    public Connection decorate(Connection conn)
-        throws SQLException {
-        // some versions of the DB2 driver seem to default to
-        // READ_UNCOMMITTED, which will prevent locking from working
-        // (multiple SELECT ... FOR UPDATE statements are allowed on
-        // the same instance); if we have not overridden the
-        // transaction isolation in the configuration, default to
-        // TRANSACTION_READ_COMMITTED
-        conn = super.decorate(conn);
-
-        if (conf.getTransactionIsolationConstant() == -1
-            && conn.getTransactionIsolation() < conn.TRANSACTION_READ_COMMITTED)
-            conn.setTransactionIsolation(conn.TRANSACTION_READ_COMMITTED);
-
-        return conn;
-    }
-}
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * 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.openjpa.jdbc.sql;
+
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.SQLException;
+import java.util.Arrays;
+
+import org.apache.openjpa.jdbc.schema.Sequence;
+
+/**
+ * Dictionary for IBM DB2 database.
+ */
+public class DB2Dictionary
+    extends AbstractDB2Dictionary {
+
+    public DB2Dictionary() {
+        platform = "DB2";
+        validationSQL = "SELECT DISTINCT(CURRENT TIMESTAMP) FROM "
+            + "SYSIBM.SYSTABLES";
+        supportsSelectEndIndex = true;
+
+        nextSequenceQuery = "VALUES NEXTVAL FOR {0}";
+
+        binaryTypeName = "BLOB(1M)";
+        longVarbinaryTypeName = "BLOB(1M)";
+        varbinaryTypeName = "BLOB(1M)";
+        clobTypeName = "CLOB(1M)";
+        longVarcharTypeName = "LONG VARCHAR";
+
+        fixedSizeTypeNameSet.addAll(Arrays.asList(new String[]{
+            "LONG VARCHAR FOR BIT DATA", "LONG VARCHAR", "LONG VARGRAPHIC",
+        }));
+
+        maxConstraintNameLength = 18;
+        maxIndexNameLength = 18;
+        maxColumnNameLength = 30;
+        supportsDeferredConstraints = false;
+        supportsDefaultDeleteAction = false;
+        supportsAlterTableWithDropColumn = false;
+
+        supportsNullTableForGetColumns = false;
+
+        reservedWordSet.addAll(Arrays.asList(new String[]{
+            "AFTER", "ALIAS", "ALLOW", "APPLICATION", "ASSOCIATE", "ASUTIME",
+            "AUDIT", "AUX", "AUXILIARY", "BEFORE", "BINARY", "BUFFERPOOL",
+            "CACHE", "CALL", "CALLED", "CAPTURE", "CARDINALITY", "CCSID",
+            "CLUSTER", "COLLECTION", "COLLID", "COMMENT", "CONCAT",
+            "CONDITION", "CONTAINS", "COUNT_BIG", "CURRENT_LC_CTYPE",
+            "CURRENT_PATH", "CURRENT_SERVER", "CURRENT_TIMEZONE", "CYCLE",
+            "DATA", "DATABASE", "DAYS", "DB2GENERAL", "DB2GENRL", "DB2SQL",
+            "DBINFO", "DEFAULTS", "DEFINITION", "DETERMINISTIC", "DISALLOW",
+            "DO", "DSNHATTR", "DSSIZE", "DYNAMIC", "EACH", "EDITPROC", "ELSEIF",
+            "ENCODING", "END-EXEC1", "ERASE", "EXCLUDING", "EXIT", "FENCED",
+            "FIELDPROC", "FILE", "FINAL", "FREE", "FUNCTION", "GENERAL",
+            "GENERATED", "GRAPHIC", "HANDLER", "HOLD", "HOURS", "IF",
+            "INCLUDING", "INCREMENT", "INDEX", "INHERIT", "INOUT", "INTEGRITY",
+            "ISOBID", "ITERATE", "JAR", "JAVA", "LABEL", "LC_CTYPE", "LEAVE",
+            "LINKTYPE", "LOCALE", "LOCATOR", "LOCATORS", "LOCK", "LOCKMAX",
+            "LOCKSIZE", "LONG", "LOOP", "MAXVALUE", "MICROSECOND",
+            "MICROSECONDS", "MINUTES", "MINVALUE", "MODE", "MODIFIES", "MONTHS",
+            "NEW", "NEW_TABLE", "NOCACHE", "NOCYCLE", "NODENAME", "NODENUMBER",
+            "NOMAXVALUE", "NOMINVALUE", "NOORDER", "NULLS", "NUMPARTS", "OBID",
+            "OLD", "OLD_TABLE", "OPTIMIZATION", "OPTIMIZE", "OUT", "OVERRIDING",
+            "PACKAGE", "PARAMETER", "PART", "PARTITION", "PATH", "PIECESIZE",
+            "PLAN", "PRIQTY", "PROGRAM", "PSID", "QUERYNO", "READS", "RECOVERY",
+            "REFERENCING", "RELEASE", "RENAME", "REPEAT", "RESET", "RESIGNAL",
+            "RESTART", "RESULT", "RESULT_SET_LOCATOR", "RETURN", "RETURNS",
+            "ROUTINE", "ROW", "RRN", "RUN", "SAVEPOINT", "SCRATCHPAD",
+            "SECONDS", "SECQTY", "SECURITY", "SENSITIVE", "SIGNAL", "SIMPLE",
+            "SOURCE", "SPECIFIC", "SQLID", "STANDARD", "START", "STATIC",
+            "STAY", "STOGROUP", "STORES", "STYLE", "SUBPAGES", "SYNONYM",
+            "SYSFUN", "SYSIBM", "SYSPROC", "SYSTEM", "TABLESPACE", "TRIGGER",
+            "TYPE", "UNDO", "UNTIL", "VALIDPROC", "VARIABLE", "VARIANT", "VCAT",
+            "VOLUMES", "WHILE", "WLM", "YEARS",
+        }));
+    }
+
+    public boolean supportsRandomAccessResultSet(Select sel,
+        boolean forUpdate) {
+        return !forUpdate
+            && super.supportsRandomAccessResultSet(sel, forUpdate);
+    }
+
+    protected void appendSelectRange(SQLBuffer buf, long start, long end) {
+        // appends the literal range string, since DB2 is unable to handle
+        // a bound parameter for it
+        buf.append(" FETCH FIRST ").append(Long.toString(end)).
+            append(" ROWS ONLY");
+    }
+
+    public String[] getCreateSequenceSQL(Sequence seq) {
+        String[] sql = super.getCreateSequenceSQL(seq);
+        if (seq.getAllocate() > 1)
+            sql[0] += " CACHE " + seq.getAllocate();
+        return sql;
+    }
+
+    protected String getSequencesSQL(String schemaName, String sequenceName) {
+        StringBuffer buf = new StringBuffer();
+        buf.append("SELECT SEQSCHEMA AS SEQUENCE_SCHEMA, ").
+            append("SEQNAME AS SEQUENCE_NAME FROM SYSCAT.SEQUENCES");
+        if (schemaName != null || sequenceName != null)
+            buf.append(" WHERE ");
+        if (schemaName != null) {
+            buf.append("SEQSCHEMA = ?");
+            if (sequenceName != null)
+                buf.append(" AND ");
+        }
+        if (sequenceName != null)
+            buf.append("SEQNAME = ?");
+        return buf.toString();
+    }
+
+    public Connection decorate(Connection conn)
+        throws SQLException {
+        // some versions of the DB2 driver seem to default to
+        // READ_UNCOMMITTED, which will prevent locking from working
+        // (multiple SELECT ... FOR UPDATE statements are allowed on
+        // the same instance); if we have not overridden the
+        // transaction isolation in the configuration, default to
+        // TRANSACTION_READ_COMMITTED
+        conn = super.decorate(conn);
+
+        if (conf.getTransactionIsolationConstant() == -1
+            && conn.getTransactionIsolation() < conn.TRANSACTION_READ_COMMITTED)
+            conn.setTransactionIsolation(conn.TRANSACTION_READ_COMMITTED);
+
+        return conn;
+    }
+
+    public void connectedConfiguration(Connection conn) throws SQLException {
+    	super.connectedConfiguration(conn);
+
+    	DatabaseMetaData metaData = conn.getMetaData();
+    	if (metaData.getJDBCMajorVersion() >= 3) {
+			int maj = metaData.getDatabaseMajorVersion();
+	    	int min = metaData.getDatabaseMinorVersion();
+
+	    	if (maj >= 9 || (maj == 8 && min >= 2)) {
+	    		supportsLockingWithMultipleTables = true;
+	    		supportsLockingWithInnerJoin = true;
+	    		supportsLockingWithOuterJoin = true;
+	    		forUpdateClause = "WITH RR USE AND KEEP UPDATE LOCKS";
+	    	}
+    	}
+    }
+}

Modified: incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/jdbc/DelegatingDatabaseMetaData.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/jdbc/DelegatingDatabaseMetaData.java?view=diff&rev=482189&r1=482188&r2=482189
==============================================================================
--- incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/jdbc/DelegatingDatabaseMetaData.java (original)
+++ incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/jdbc/DelegatingDatabaseMetaData.java Mon Dec  4 06:42:09 2006
@@ -1,770 +1,770 @@
-/*
- * Copyright 2006 The Apache Software Foundation.
- *
- * 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.openjpa.lib.jdbc;
-
-import java.sql.Connection;
-import java.sql.DatabaseMetaData;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-
-/**
- * Wrapper around a DatabaseMetadata instance.
- *
- * @author Marc Prud'hommeaux
- */
-public class DelegatingDatabaseMetaData implements DatabaseMetaData {
-
-    private final DatabaseMetaData _metaData;
-    private final Connection _conn;
-
-    public DelegatingDatabaseMetaData(DatabaseMetaData metaData,
-        Connection conn) {
-        _conn = conn;
-        _metaData = metaData;
-    }
-
-    /**
-     * Return the base underlying database metadata.
-     */
-    public DatabaseMetaData getInnermostDelegate() {
-        return _metaData instanceof DelegatingDatabaseMetaData ?
-            ((DelegatingDatabaseMetaData) _metaData).getInnermostDelegate()
-            : _metaData;
-    }
-
-    public int hashCode() {
-        return getInnermostDelegate().hashCode();
-    }
-
-    public boolean equals(Object other) {
-        if (other == this)
-            return true;
-        if (other instanceof DelegatingDatabaseMetaData)
-            other = ((DelegatingDatabaseMetaData) other)
-                .getInnermostDelegate();
-        return getInnermostDelegate().equals(other);
-    }
-
-    public String toString() {
-        StringBuffer buf = new StringBuffer("metadata ").append(hashCode());
-        buf.append("[").append(_metaData.toString()).append("]");
-        return buf.toString();
-    }
-
-    public boolean allProceduresAreCallable() throws SQLException {
-        return _metaData.allProceduresAreCallable();
-    }
-
-    public boolean allTablesAreSelectable() throws SQLException {
-        return _metaData.allTablesAreSelectable();
-    }
-
-    public boolean dataDefinitionCausesTransactionCommit() throws SQLException {
-        return _metaData.dataDefinitionCausesTransactionCommit();
-    }
-
-    public boolean dataDefinitionIgnoredInTransactions() throws SQLException {
-        return _metaData.dataDefinitionIgnoredInTransactions();
-    }
-
-    public boolean deletesAreDetected(int type) throws SQLException {
-        return _metaData.deletesAreDetected(type);
-    }
-
-    public boolean doesMaxRowSizeIncludeBlobs() throws SQLException {
-        return _metaData.doesMaxRowSizeIncludeBlobs();
-    }
-
-    public ResultSet getBestRowIdentifier(String catalog,
-        String schema, String table, int scope, boolean nullable)
-        throws SQLException {
-        return _metaData.getBestRowIdentifier(catalog, schema,
-            table, scope, nullable);
-    }
-
-    public ResultSet getCatalogs() throws SQLException {
-        return _metaData.getCatalogs();
-    }
-
-    public String getCatalogSeparator() throws SQLException {
-        return _metaData.getCatalogSeparator();
-    }
-
-    public String getCatalogTerm() throws SQLException {
-        return _metaData.getCatalogTerm();
-    }
-
-    public ResultSet getColumnPrivileges(String catalog, String schema,
-        String table, String columnNamePattern) throws SQLException {
-        return _metaData.getColumnPrivileges(catalog, schema,
-            table, columnNamePattern);
-    }
-
-    public ResultSet getColumns(String catalog, String schemaPattern,
-        String tableNamePattern, String columnNamePattern) throws SQLException {
-        return _metaData.getColumns(catalog, schemaPattern,
-            tableNamePattern, columnNamePattern);
-    }
-
-    public Connection getConnection() throws SQLException {
-        return _conn;
-    }
-
-    public ResultSet getCrossReference(String primaryCatalog,
-        String primarySchema, String primaryTable, String foreignCatalog,
-        String foreignSchema, String foreignTable) throws SQLException {
-        return _metaData.getCrossReference(primaryCatalog, primarySchema,
-            primaryTable, foreignCatalog, foreignSchema, foreignTable);
-    }
-
-    public String getDatabaseProductName() throws SQLException {
-        return _metaData.getDatabaseProductName();
-    }
-
-    public String getDatabaseProductVersion() throws SQLException {
-        return _metaData.getDatabaseProductVersion();
-    }
-
-    public int getDefaultTransactionIsolation() throws SQLException {
-        return _metaData.getDefaultTransactionIsolation();
-    }
-
-    public int getDriverMajorVersion() {
-        return _metaData.getDriverMajorVersion();
-    }
-
-    public int getDriverMinorVersion() {
-        return _metaData.getDriverMinorVersion();
-    }
-
-    public String getDriverName() throws SQLException {
-        return _metaData.getDriverName();
-    }
-
-    public String getDriverVersion() throws SQLException {
-        return _metaData.getDriverVersion();
-    }
-
-    public ResultSet getExportedKeys(String catalog, String schema,
-        String table) throws SQLException {
-        return _metaData.getExportedKeys(catalog, schema, table);
-    }
-
-    public String getExtraNameCharacters() throws SQLException {
-        return _metaData.getExtraNameCharacters();
-    }
-
-    public String getIdentifierQuoteString() throws SQLException {
-        return _metaData.getIdentifierQuoteString();
-    }
-
-    public ResultSet getImportedKeys(String catalog, String schema,
-        String table) throws SQLException {
-        return _metaData.getImportedKeys(catalog, schema, table);
-    }
-
-    public ResultSet getIndexInfo(String catalog, String schema,
-        String table, boolean unique, boolean approximate) throws SQLException {
-        return _metaData.getIndexInfo(catalog, schema, table, unique,
-            approximate);
-    }
-
-    public int getMaxBinaryLiteralLength() throws SQLException {
-        return _metaData.getMaxBinaryLiteralLength();
-    }
-
-    public int getMaxCatalogNameLength() throws SQLException {
-        return _metaData.getMaxCatalogNameLength();
-    }
-
-    public int getMaxCharLiteralLength() throws SQLException {
-        return _metaData.getMaxCharLiteralLength();
-    }
-
-    public int getMaxColumnNameLength() throws SQLException {
-        return _metaData.getMaxColumnNameLength();
-    }
-
-    public int getMaxColumnsInGroupBy() throws SQLException {
-        return _metaData.getMaxColumnsInGroupBy();
-    }
-
-    public int getMaxColumnsInIndex() throws SQLException {
-        return _metaData.getMaxColumnsInIndex();
-    }
-
-    public int getMaxColumnsInOrderBy() throws SQLException {
-        return _metaData.getMaxColumnsInOrderBy();
-    }
-
-    public int getMaxColumnsInSelect() throws SQLException {
-        return _metaData.getMaxColumnsInSelect();
-    }
-
-    public int getMaxColumnsInTable() throws SQLException {
-        return _metaData.getMaxColumnsInTable();
-    }
-
-    public int getMaxConnections() throws SQLException {
-        return _metaData.getMaxConnections();
-    }
-
-    public int getMaxCursorNameLength() throws SQLException {
-        return _metaData.getMaxCursorNameLength();
-    }
-
-    public int getMaxIndexLength() throws SQLException {
-        return _metaData.getMaxIndexLength();
-    }
-
-    public int getMaxProcedureNameLength() throws SQLException {
-        return _metaData.getMaxProcedureNameLength();
-    }
-
-    public int getMaxRowSize() throws SQLException {
-        return _metaData.getMaxRowSize();
-    }
-
-    public int getMaxSchemaNameLength() throws SQLException {
-        return _metaData.getMaxSchemaNameLength();
-    }
-
-    public int getMaxStatementLength() throws SQLException {
-        return _metaData.getMaxStatementLength();
-    }
-
-    public int getMaxStatements() throws SQLException {
-        return _metaData.getMaxStatements();
-    }
-
-    public int getMaxTableNameLength() throws SQLException {
-        return _metaData.getMaxTableNameLength();
-    }
-
-    public int getMaxTablesInSelect() throws SQLException {
-        return _metaData.getMaxTablesInSelect();
-    }
-
-    public int getMaxUserNameLength() throws SQLException {
-        return _metaData.getMaxUserNameLength();
-    }
-
-    public String getNumericFunctions() throws SQLException {
-        return _metaData.getNumericFunctions();
-    }
-
-    public ResultSet getPrimaryKeys(String catalog, String schema, String table)
-        throws SQLException {
-        return _metaData.getPrimaryKeys(catalog, schema, table);
-    }
-
-    public ResultSet getProcedureColumns(String catalog, String schemaPattern,
-        String procedureNamePattern, String columnNamePattern)
-        throws SQLException {
-        return _metaData.getProcedureColumns(catalog, schemaPattern,
-            procedureNamePattern, columnNamePattern);
-    }
-
-    public ResultSet getProcedures(String catalog, String schemaPattern,
-        String procedureNamePattern) throws SQLException {
-        return _metaData.getProcedures(catalog, schemaPattern,
-            procedureNamePattern);
-    }
-
-    public String getProcedureTerm() throws SQLException {
-        return _metaData.getProcedureTerm();
-    }
-
-    public ResultSet getSchemas() throws SQLException {
-        return _metaData.getSchemas();
-    }
-
-    public String getSchemaTerm() throws SQLException {
-        return _metaData.getSchemaTerm();
-    }
-
-    public String getSearchStringEscape() throws SQLException {
-        return _metaData.getSearchStringEscape();
-    }
-
-    public String getSQLKeywords() throws SQLException {
-        return _metaData.getSQLKeywords();
-    }
-
-    public String getStringFunctions() throws SQLException {
-        return _metaData.getStringFunctions();
-    }
-
-    public String getSystemFunctions() throws SQLException {
-        return _metaData.getSystemFunctions();
-    }
-
-    public ResultSet getTablePrivileges(String catalog,
-        String schemaPattern, String tableNamePattern) throws SQLException {
-        return _metaData.getTablePrivileges(catalog, schemaPattern,
-            tableNamePattern);
-    }
-
-    public ResultSet getTables(String catalog, String schemaPattern,
-        String tableNamePattern, String[] types) throws SQLException {
-        return _metaData.getTables(catalog, schemaPattern,
-            tableNamePattern, types);
-    }
-
-    public ResultSet getTableTypes() throws SQLException {
-        return _metaData.getTableTypes();
-    }
-
-    public String getTimeDateFunctions() throws SQLException {
-        return _metaData.getTimeDateFunctions();
-    }
-
-    public ResultSet getTypeInfo() throws SQLException {
-        return _metaData.getTypeInfo();
-    }
-
-    public ResultSet getUDTs(String catalog, String schemaPattern,
-        String typeNamePattern, int[] types) throws SQLException {
-        return _metaData.getUDTs(catalog, schemaPattern,
-            typeNamePattern, types);
-    }
-
-    public String getURL() throws SQLException {
-        return _metaData.getURL();
-    }
-
-    public String getUserName() throws SQLException {
-        return _metaData.getUserName();
-    }
-
-    public ResultSet getVersionColumns(String catalog,
-        String schema, String table) throws SQLException {
-        return _metaData.getVersionColumns(catalog, schema, table);
-    }
-
-    public boolean insertsAreDetected(int type) throws SQLException {
-        return _metaData.insertsAreDetected(type);
-    }
-
-    public boolean isCatalogAtStart() throws SQLException {
-        return _metaData.isCatalogAtStart();
-    }
-
-    public boolean isReadOnly() throws SQLException {
-        return _metaData.isReadOnly();
-    }
-
-    public boolean nullPlusNonNullIsNull() throws SQLException {
-        return _metaData.nullPlusNonNullIsNull();
-    }
-
-    public boolean nullsAreSortedAtEnd() throws SQLException {
-        return _metaData.nullsAreSortedAtEnd();
-    }
-
-    public boolean nullsAreSortedAtStart() throws SQLException {
-        return _metaData.nullsAreSortedAtStart();
-    }
-
-    public boolean nullsAreSortedHigh() throws SQLException {
-        return _metaData.nullsAreSortedHigh();
-    }
-
-    public boolean nullsAreSortedLow() throws SQLException {
-        return _metaData.nullsAreSortedLow();
-    }
-
-    public boolean othersDeletesAreVisible(int type) throws SQLException {
-        return _metaData.othersDeletesAreVisible(type);
-    }
-
-    public boolean othersInsertsAreVisible(int type) throws SQLException {
-        return _metaData.othersInsertsAreVisible(type);
-    }
-
-    public boolean othersUpdatesAreVisible(int type) throws SQLException {
-        return _metaData.othersUpdatesAreVisible(type);
-    }
-
-    public boolean ownDeletesAreVisible(int type) throws SQLException {
-        return _metaData.ownDeletesAreVisible(type);
-    }
-
-    public boolean ownInsertsAreVisible(int type) throws SQLException {
-        return _metaData.ownInsertsAreVisible(type);
-    }
-
-    public boolean ownUpdatesAreVisible(int type) throws SQLException {
-        return _metaData.ownUpdatesAreVisible(type);
-    }
-
-    public boolean storesLowerCaseIdentifiers() throws SQLException {
-        return _metaData.storesLowerCaseIdentifiers();
-    }
-
-    public boolean storesLowerCaseQuotedIdentifiers() throws SQLException {
-        return _metaData.storesLowerCaseQuotedIdentifiers();
-    }
-
-    public boolean storesMixedCaseIdentifiers() throws SQLException {
-        return _metaData.storesMixedCaseIdentifiers();
-    }
-
-    public boolean storesMixedCaseQuotedIdentifiers() throws SQLException {
-        return _metaData.storesMixedCaseQuotedIdentifiers();
-    }
-
-    public boolean storesUpperCaseIdentifiers() throws SQLException {
-        return _metaData.storesUpperCaseIdentifiers();
-    }
-
-    public boolean storesUpperCaseQuotedIdentifiers() throws SQLException {
-        return _metaData.storesUpperCaseQuotedIdentifiers();
-    }
-
-    public boolean supportsAlterTableWithAddColumn() throws SQLException {
-        return _metaData.supportsAlterTableWithAddColumn();
-    }
-
-    public boolean supportsAlterTableWithDropColumn() throws SQLException {
-        return _metaData.supportsAlterTableWithDropColumn();
-    }
-
-    public boolean supportsANSI92EntryLevelSQL() throws SQLException {
-        return _metaData.supportsANSI92EntryLevelSQL();
-    }
-
-    public boolean supportsANSI92FullSQL() throws SQLException {
-        return _metaData.supportsANSI92FullSQL();
-    }
-
-    public boolean supportsANSI92IntermediateSQL() throws SQLException {
-        return _metaData.supportsANSI92IntermediateSQL();
-    }
-
-    public boolean supportsBatchUpdates() throws SQLException {
-        return _metaData.supportsBatchUpdates();
-    }
-
-    public boolean supportsCatalogsInDataManipulation() throws SQLException {
-        return _metaData.supportsCatalogsInDataManipulation();
-    }
-
-    public boolean supportsCatalogsInIndexDefinitions() throws SQLException {
-        return _metaData.supportsCatalogsInIndexDefinitions();
-    }
-
-    public boolean supportsCatalogsInPrivilegeDefinitions()
-        throws SQLException {
-        return _metaData.supportsCatalogsInPrivilegeDefinitions();
-    }
-
-    public boolean supportsCatalogsInProcedureCalls() throws SQLException {
-        return _metaData.supportsCatalogsInProcedureCalls();
-    }
-
-    public boolean supportsCatalogsInTableDefinitions() throws SQLException {
-        return _metaData.supportsCatalogsInTableDefinitions();
-    }
-
-    public boolean supportsColumnAliasing() throws SQLException {
-        return _metaData.supportsColumnAliasing();
-    }
-
-    public boolean supportsConvert() throws SQLException {
-        return _metaData.supportsConvert();
-    }
-
-    public boolean supportsConvert(int fromType, int toType)
-        throws SQLException {
-        return _metaData.supportsConvert(fromType, toType);
-    }
-
-    public boolean supportsCoreSQLGrammar() throws SQLException {
-        return _metaData.supportsCoreSQLGrammar();
-    }
-
-    public boolean supportsCorrelatedSubqueries() throws SQLException {
-        return _metaData.supportsCorrelatedSubqueries();
-    }
-
-    public boolean supportsDataDefinitionAndDataManipulationTransactions()
-        throws SQLException {
-        return _metaData
-            .supportsDataDefinitionAndDataManipulationTransactions();
-    }
-
-    public boolean supportsDataManipulationTransactionsOnly()
-        throws SQLException {
-        return _metaData.supportsDataManipulationTransactionsOnly();
-    }
-
-    public boolean supportsDifferentTableCorrelationNames()
-        throws SQLException {
-        return _metaData.supportsDifferentTableCorrelationNames();
-    }
-
-    public boolean supportsExpressionsInOrderBy() throws SQLException {
-        return _metaData.supportsExpressionsInOrderBy();
-    }
-
-    public boolean supportsExtendedSQLGrammar() throws SQLException {
-        return _metaData.supportsExtendedSQLGrammar();
-    }
-
-    public boolean supportsFullOuterJoins() throws SQLException {
-        return _metaData.supportsFullOuterJoins();
-    }
-
-    public boolean supportsGroupBy() throws SQLException {
-        return _metaData.supportsGroupBy();
-    }
-
-    public boolean supportsGroupByBeyondSelect() throws SQLException {
-        return _metaData.supportsGroupByBeyondSelect();
-    }
-
-    public boolean supportsGroupByUnrelated() throws SQLException {
-        return _metaData.supportsGroupByUnrelated();
-    }
-
-    public boolean supportsIntegrityEnhancementFacility() throws SQLException {
-        return _metaData.supportsIntegrityEnhancementFacility();
-    }
-
-    public boolean supportsLikeEscapeClause() throws SQLException {
-        return _metaData.supportsLikeEscapeClause();
-    }
-
-    public boolean supportsLimitedOuterJoins() throws SQLException {
-        return _metaData.supportsLimitedOuterJoins();
-    }
-
-    public boolean supportsMinimumSQLGrammar() throws SQLException {
-        return _metaData.supportsMinimumSQLGrammar();
-    }
-
-    public boolean supportsMixedCaseIdentifiers() throws SQLException {
-        return _metaData.supportsMixedCaseIdentifiers();
-    }
-
-    public boolean supportsMixedCaseQuotedIdentifiers() throws SQLException {
-        return _metaData.supportsMixedCaseQuotedIdentifiers();
-    }
-
-    public boolean supportsMultipleResultSets() throws SQLException {
-        return _metaData.supportsMultipleResultSets();
-    }
-
-    public boolean supportsMultipleTransactions() throws SQLException {
-        return _metaData.supportsMultipleTransactions();
-    }
-
-    public boolean supportsNonNullableColumns() throws SQLException {
-        return _metaData.supportsNonNullableColumns();
-    }
-
-    public boolean supportsOpenCursorsAcrossCommit() throws SQLException {
-        return _metaData.supportsOpenCursorsAcrossCommit();
-    }
-
-    public boolean supportsOpenCursorsAcrossRollback() throws SQLException {
-        return _metaData.supportsOpenCursorsAcrossRollback();
-    }
-
-    public boolean supportsOpenStatementsAcrossCommit() throws SQLException {
-        return _metaData.supportsOpenStatementsAcrossCommit();
-    }
-
-    public boolean supportsOpenStatementsAcrossRollback() throws SQLException {
-        return _metaData.supportsOpenStatementsAcrossRollback();
-    }
-
-    public boolean supportsOrderByUnrelated() throws SQLException {
-        return _metaData.supportsOrderByUnrelated();
-    }
-
-    public boolean supportsOuterJoins() throws SQLException {
-        return _metaData.supportsOuterJoins();
-    }
-
-    public boolean supportsPositionedDelete() throws SQLException {
-        return _metaData.supportsPositionedDelete();
-    }
-
-    public boolean supportsPositionedUpdate() throws SQLException {
-        return _metaData.supportsPositionedUpdate();
-    }
-
-    public boolean supportsResultSetConcurrency(int type, int concurrency)
-        throws SQLException {
-        return _metaData.supportsResultSetConcurrency(type, concurrency);
-    }
-
-    public boolean supportsResultSetType(int type) throws SQLException {
-        return _metaData.supportsResultSetType(type);
-    }
-
-    public boolean supportsSchemasInDataManipulation() throws SQLException {
-        return _metaData.supportsSchemasInDataManipulation();
-    }
-
-    public boolean supportsSchemasInIndexDefinitions() throws SQLException {
-        return _metaData.supportsSchemasInIndexDefinitions();
-    }
-
-    public boolean supportsSchemasInPrivilegeDefinitions() throws SQLException {
-        return _metaData.supportsSchemasInPrivilegeDefinitions();
-    }
-
-    public boolean supportsSchemasInProcedureCalls() throws SQLException {
-        return _metaData.supportsSchemasInProcedureCalls();
-    }
-
-    public boolean supportsSchemasInTableDefinitions() throws SQLException {
-        return _metaData.supportsSchemasInTableDefinitions();
-    }
-
-    public boolean supportsSelectForUpdate() throws SQLException {
-        return _metaData.supportsSelectForUpdate();
-    }
-
-    public boolean supportsStoredProcedures() throws SQLException {
-        return _metaData.supportsStoredProcedures();
-    }
-
-    public boolean supportsSubqueriesInComparisons() throws SQLException {
-        return _metaData.supportsSubqueriesInComparisons();
-    }
-
-    public boolean supportsSubqueriesInExists() throws SQLException {
-        return _metaData.supportsSubqueriesInExists();
-    }
-
-    public boolean supportsSubqueriesInIns() throws SQLException {
-        return _metaData.supportsSubqueriesInIns();
-    }
-
-    public boolean supportsSubqueriesInQuantifieds() throws SQLException {
-        return _metaData.supportsSubqueriesInQuantifieds();
-    }
-
-    public boolean supportsTableCorrelationNames() throws SQLException {
-        return _metaData.supportsTableCorrelationNames();
-    }
-
-    public boolean supportsTransactionIsolationLevel(int level)
-        throws SQLException {
-        return _metaData.supportsTransactionIsolationLevel(level);
-    }
-
-    public boolean supportsTransactions() throws SQLException {
-        return _metaData.supportsTransactions();
-    }
-
-    public boolean supportsUnion() throws SQLException {
-        return _metaData.supportsUnion();
-    }
-
-    public boolean supportsUnionAll() throws SQLException {
-        return _metaData.supportsUnionAll();
-    }
-
-    public boolean updatesAreDetected(int type) throws SQLException {
-        return _metaData.updatesAreDetected(type);
-    }
-
-    public boolean usesLocalFilePerTable() throws SQLException {
-        return _metaData.usesLocalFilePerTable();
-    }
-
-    public boolean usesLocalFiles() throws SQLException {
-        return _metaData.usesLocalFiles();
-    }
-
-    // JDBC 3.0 methods(unsupported) follow; these are required to be able to
-    // compile against JDK 1.4
-
-    public boolean supportsSavepoints() throws SQLException {
-        throw new UnsupportedOperationException();
-    }
-
-    public boolean supportsNamedParameters() throws SQLException {
-        throw new UnsupportedOperationException();
-    }
-
-    public boolean supportsMultipleOpenResults() throws SQLException {
-        throw new UnsupportedOperationException();
-    }
-
-    public boolean supportsGetGeneratedKeys() throws SQLException {
-        throw new UnsupportedOperationException();
-    }
-
-    public ResultSet getSuperTypes(String catalog, String schemaPatter,
-        String typeNamePattern) throws SQLException {
-        throw new UnsupportedOperationException();
-    }
-
-    public ResultSet getSuperTables(String catalog, String schemaPatter,
-        String tableNamePattern) throws SQLException {
-        throw new UnsupportedOperationException();
-    }
-
-    public ResultSet getAttributes(String catalog, String schemaPatter,
-        String typeNamePattern, String attributeNamePattern)
-        throws SQLException {
-        throw new UnsupportedOperationException();
-    }
-
-    public boolean supportsResultSetHoldability(int holdability)
-        throws SQLException {
-        throw new UnsupportedOperationException();
-    }
-
-    public int getResultSetHoldability() throws SQLException {
-        throw new UnsupportedOperationException();
-    }
-
-    public int getDatabaseMajorVersion() throws SQLException {
-        throw new UnsupportedOperationException();
-    }
-
-    public int getDatabaseMinorVersion() throws SQLException {
-        throw new UnsupportedOperationException();
-    }
-
-    public int getJDBCMajorVersion() throws SQLException {
-        throw new UnsupportedOperationException();
-    }
-
-    public int getJDBCMinorVersion() throws SQLException {
-        throw new UnsupportedOperationException();
-    }
-
-    public int getSQLStateType() throws SQLException {
-        throw new UnsupportedOperationException();
-    }
-
-    public boolean locatorsUpdateCopy() throws SQLException {
-        throw new UnsupportedOperationException();
-    }
-
-    public boolean supportsStatementPooling() throws SQLException {
-        throw new UnsupportedOperationException();
-    }
-}
-
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * 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.openjpa.lib.jdbc;
+
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+/**
+ * Wrapper around a DatabaseMetadata instance.
+ *
+ * @author Marc Prud'hommeaux
+ */
+public class DelegatingDatabaseMetaData implements DatabaseMetaData {
+
+    private final DatabaseMetaData _metaData;
+    private final Connection _conn;
+
+    public DelegatingDatabaseMetaData(DatabaseMetaData metaData,
+        Connection conn) {
+        _conn = conn;
+        _metaData = metaData;
+    }
+
+    /**
+     * Return the base underlying database metadata.
+     */
+    public DatabaseMetaData getInnermostDelegate() {
+        return _metaData instanceof DelegatingDatabaseMetaData ?
+            ((DelegatingDatabaseMetaData) _metaData).getInnermostDelegate()
+            : _metaData;
+    }
+
+    public int hashCode() {
+        return getInnermostDelegate().hashCode();
+    }
+
+    public boolean equals(Object other) {
+        if (other == this)
+            return true;
+        if (other instanceof DelegatingDatabaseMetaData)
+            other = ((DelegatingDatabaseMetaData) other)
+                .getInnermostDelegate();
+        return getInnermostDelegate().equals(other);
+    }
+
+    public String toString() {
+        StringBuffer buf = new StringBuffer("metadata ").append(hashCode());
+        buf.append("[").append(_metaData.toString()).append("]");
+        return buf.toString();
+    }
+
+    public boolean allProceduresAreCallable() throws SQLException {
+        return _metaData.allProceduresAreCallable();
+    }
+
+    public boolean allTablesAreSelectable() throws SQLException {
+        return _metaData.allTablesAreSelectable();
+    }
+
+    public boolean dataDefinitionCausesTransactionCommit() throws SQLException {
+        return _metaData.dataDefinitionCausesTransactionCommit();
+    }
+
+    public boolean dataDefinitionIgnoredInTransactions() throws SQLException {
+        return _metaData.dataDefinitionIgnoredInTransactions();
+    }
+
+    public boolean deletesAreDetected(int type) throws SQLException {
+        return _metaData.deletesAreDetected(type);
+    }
+
+    public boolean doesMaxRowSizeIncludeBlobs() throws SQLException {
+        return _metaData.doesMaxRowSizeIncludeBlobs();
+    }
+
+    public ResultSet getBestRowIdentifier(String catalog,
+        String schema, String table, int scope, boolean nullable)
+        throws SQLException {
+        return _metaData.getBestRowIdentifier(catalog, schema,
+            table, scope, nullable);
+    }
+
+    public ResultSet getCatalogs() throws SQLException {
+        return _metaData.getCatalogs();
+    }
+
+    public String getCatalogSeparator() throws SQLException {
+        return _metaData.getCatalogSeparator();
+    }
+
+    public String getCatalogTerm() throws SQLException {
+        return _metaData.getCatalogTerm();
+    }
+
+    public ResultSet getColumnPrivileges(String catalog, String schema,
+        String table, String columnNamePattern) throws SQLException {
+        return _metaData.getColumnPrivileges(catalog, schema,
+            table, columnNamePattern);
+    }
+
+    public ResultSet getColumns(String catalog, String schemaPattern,
+        String tableNamePattern, String columnNamePattern) throws SQLException {
+        return _metaData.getColumns(catalog, schemaPattern,
+            tableNamePattern, columnNamePattern);
+    }
+
+    public Connection getConnection() throws SQLException {
+        return _conn;
+    }
+
+    public ResultSet getCrossReference(String primaryCatalog,
+        String primarySchema, String primaryTable, String foreignCatalog,
+        String foreignSchema, String foreignTable) throws SQLException {
+        return _metaData.getCrossReference(primaryCatalog, primarySchema,
+            primaryTable, foreignCatalog, foreignSchema, foreignTable);
+    }
+
+    public String getDatabaseProductName() throws SQLException {
+        return _metaData.getDatabaseProductName();
+    }
+
+    public String getDatabaseProductVersion() throws SQLException {
+        return _metaData.getDatabaseProductVersion();
+    }
+
+    public int getDefaultTransactionIsolation() throws SQLException {
+        return _metaData.getDefaultTransactionIsolation();
+    }
+
+    public int getDriverMajorVersion() {
+        return _metaData.getDriverMajorVersion();
+    }
+
+    public int getDriverMinorVersion() {
+        return _metaData.getDriverMinorVersion();
+    }
+
+    public String getDriverName() throws SQLException {
+        return _metaData.getDriverName();
+    }
+
+    public String getDriverVersion() throws SQLException {
+        return _metaData.getDriverVersion();
+    }
+
+    public ResultSet getExportedKeys(String catalog, String schema,
+        String table) throws SQLException {
+        return _metaData.getExportedKeys(catalog, schema, table);
+    }
+
+    public String getExtraNameCharacters() throws SQLException {
+        return _metaData.getExtraNameCharacters();
+    }
+
+    public String getIdentifierQuoteString() throws SQLException {
+        return _metaData.getIdentifierQuoteString();
+    }
+
+    public ResultSet getImportedKeys(String catalog, String schema,
+        String table) throws SQLException {
+        return _metaData.getImportedKeys(catalog, schema, table);
+    }
+
+    public ResultSet getIndexInfo(String catalog, String schema,
+        String table, boolean unique, boolean approximate) throws SQLException {
+        return _metaData.getIndexInfo(catalog, schema, table, unique,
+            approximate);
+    }
+
+    public int getMaxBinaryLiteralLength() throws SQLException {
+        return _metaData.getMaxBinaryLiteralLength();
+    }
+
+    public int getMaxCatalogNameLength() throws SQLException {
+        return _metaData.getMaxCatalogNameLength();
+    }
+
+    public int getMaxCharLiteralLength() throws SQLException {
+        return _metaData.getMaxCharLiteralLength();
+    }
+
+    public int getMaxColumnNameLength() throws SQLException {
+        return _metaData.getMaxColumnNameLength();
+    }
+
+    public int getMaxColumnsInGroupBy() throws SQLException {
+        return _metaData.getMaxColumnsInGroupBy();
+    }
+
+    public int getMaxColumnsInIndex() throws SQLException {
+        return _metaData.getMaxColumnsInIndex();
+    }
+
+    public int getMaxColumnsInOrderBy() throws SQLException {
+        return _metaData.getMaxColumnsInOrderBy();
+    }
+
+    public int getMaxColumnsInSelect() throws SQLException {
+        return _metaData.getMaxColumnsInSelect();
+    }
+
+    public int getMaxColumnsInTable() throws SQLException {
+        return _metaData.getMaxColumnsInTable();
+    }
+
+    public int getMaxConnections() throws SQLException {
+        return _metaData.getMaxConnections();
+    }
+
+    public int getMaxCursorNameLength() throws SQLException {
+        return _metaData.getMaxCursorNameLength();
+    }
+
+    public int getMaxIndexLength() throws SQLException {
+        return _metaData.getMaxIndexLength();
+    }
+
+    public int getMaxProcedureNameLength() throws SQLException {
+        return _metaData.getMaxProcedureNameLength();
+    }
+
+    public int getMaxRowSize() throws SQLException {
+        return _metaData.getMaxRowSize();
+    }
+
+    public int getMaxSchemaNameLength() throws SQLException {
+        return _metaData.getMaxSchemaNameLength();
+    }
+
+    public int getMaxStatementLength() throws SQLException {
+        return _metaData.getMaxStatementLength();
+    }
+
+    public int getMaxStatements() throws SQLException {
+        return _metaData.getMaxStatements();
+    }
+
+    public int getMaxTableNameLength() throws SQLException {
+        return _metaData.getMaxTableNameLength();
+    }
+
+    public int getMaxTablesInSelect() throws SQLException {
+        return _metaData.getMaxTablesInSelect();
+    }
+
+    public int getMaxUserNameLength() throws SQLException {
+        return _metaData.getMaxUserNameLength();
+    }
+
+    public String getNumericFunctions() throws SQLException {
+        return _metaData.getNumericFunctions();
+    }
+
+    public ResultSet getPrimaryKeys(String catalog, String schema, String table)
+        throws SQLException {
+        return _metaData.getPrimaryKeys(catalog, schema, table);
+    }
+
+    public ResultSet getProcedureColumns(String catalog, String schemaPattern,
+        String procedureNamePattern, String columnNamePattern)
+        throws SQLException {
+        return _metaData.getProcedureColumns(catalog, schemaPattern,
+            procedureNamePattern, columnNamePattern);
+    }
+
+    public ResultSet getProcedures(String catalog, String schemaPattern,
+        String procedureNamePattern) throws SQLException {
+        return _metaData.getProcedures(catalog, schemaPattern,
+            procedureNamePattern);
+    }
+
+    public String getProcedureTerm() throws SQLException {
+        return _metaData.getProcedureTerm();
+    }
+
+    public ResultSet getSchemas() throws SQLException {
+        return _metaData.getSchemas();
+    }
+
+    public String getSchemaTerm() throws SQLException {
+        return _metaData.getSchemaTerm();
+    }
+
+    public String getSearchStringEscape() throws SQLException {
+        return _metaData.getSearchStringEscape();
+    }
+
+    public String getSQLKeywords() throws SQLException {
+        return _metaData.getSQLKeywords();
+    }
+
+    public String getStringFunctions() throws SQLException {
+        return _metaData.getStringFunctions();
+    }
+
+    public String getSystemFunctions() throws SQLException {
+        return _metaData.getSystemFunctions();
+    }
+
+    public ResultSet getTablePrivileges(String catalog,
+        String schemaPattern, String tableNamePattern) throws SQLException {
+        return _metaData.getTablePrivileges(catalog, schemaPattern,
+            tableNamePattern);
+    }
+
+    public ResultSet getTables(String catalog, String schemaPattern,
+        String tableNamePattern, String[] types) throws SQLException {
+        return _metaData.getTables(catalog, schemaPattern,
+            tableNamePattern, types);
+    }
+
+    public ResultSet getTableTypes() throws SQLException {
+        return _metaData.getTableTypes();
+    }
+
+    public String getTimeDateFunctions() throws SQLException {
+        return _metaData.getTimeDateFunctions();
+    }
+
+    public ResultSet getTypeInfo() throws SQLException {
+        return _metaData.getTypeInfo();
+    }
+
+    public ResultSet getUDTs(String catalog, String schemaPattern,
+        String typeNamePattern, int[] types) throws SQLException {
+        return _metaData.getUDTs(catalog, schemaPattern,
+            typeNamePattern, types);
+    }
+
+    public String getURL() throws SQLException {
+        return _metaData.getURL();
+    }
+
+    public String getUserName() throws SQLException {
+        return _metaData.getUserName();
+    }
+
+    public ResultSet getVersionColumns(String catalog,
+        String schema, String table) throws SQLException {
+        return _metaData.getVersionColumns(catalog, schema, table);
+    }
+
+    public boolean insertsAreDetected(int type) throws SQLException {
+        return _metaData.insertsAreDetected(type);
+    }
+
+    public boolean isCatalogAtStart() throws SQLException {
+        return _metaData.isCatalogAtStart();
+    }
+
+    public boolean isReadOnly() throws SQLException {
+        return _metaData.isReadOnly();
+    }
+
+    public boolean nullPlusNonNullIsNull() throws SQLException {
+        return _metaData.nullPlusNonNullIsNull();
+    }
+
+    public boolean nullsAreSortedAtEnd() throws SQLException {
+        return _metaData.nullsAreSortedAtEnd();
+    }
+
+    public boolean nullsAreSortedAtStart() throws SQLException {
+        return _metaData.nullsAreSortedAtStart();
+    }
+
+    public boolean nullsAreSortedHigh() throws SQLException {
+        return _metaData.nullsAreSortedHigh();
+    }
+
+    public boolean nullsAreSortedLow() throws SQLException {
+        return _metaData.nullsAreSortedLow();
+    }
+
+    public boolean othersDeletesAreVisible(int type) throws SQLException {
+        return _metaData.othersDeletesAreVisible(type);
+    }
+
+    public boolean othersInsertsAreVisible(int type) throws SQLException {
+        return _metaData.othersInsertsAreVisible(type);
+    }
+
+    public boolean othersUpdatesAreVisible(int type) throws SQLException {
+        return _metaData.othersUpdatesAreVisible(type);
+    }
+
+    public boolean ownDeletesAreVisible(int type) throws SQLException {
+        return _metaData.ownDeletesAreVisible(type);
+    }
+
+    public boolean ownInsertsAreVisible(int type) throws SQLException {
+        return _metaData.ownInsertsAreVisible(type);
+    }
+
+    public boolean ownUpdatesAreVisible(int type) throws SQLException {
+        return _metaData.ownUpdatesAreVisible(type);
+    }
+
+    public boolean storesLowerCaseIdentifiers() throws SQLException {
+        return _metaData.storesLowerCaseIdentifiers();
+    }
+
+    public boolean storesLowerCaseQuotedIdentifiers() throws SQLException {
+        return _metaData.storesLowerCaseQuotedIdentifiers();
+    }
+
+    public boolean storesMixedCaseIdentifiers() throws SQLException {
+        return _metaData.storesMixedCaseIdentifiers();
+    }
+
+    public boolean storesMixedCaseQuotedIdentifiers() throws SQLException {
+        return _metaData.storesMixedCaseQuotedIdentifiers();
+    }
+
+    public boolean storesUpperCaseIdentifiers() throws SQLException {
+        return _metaData.storesUpperCaseIdentifiers();
+    }
+
+    public boolean storesUpperCaseQuotedIdentifiers() throws SQLException {
+        return _metaData.storesUpperCaseQuotedIdentifiers();
+    }
+
+    public boolean supportsAlterTableWithAddColumn() throws SQLException {
+        return _metaData.supportsAlterTableWithAddColumn();
+    }
+
+    public boolean supportsAlterTableWithDropColumn() throws SQLException {
+        return _metaData.supportsAlterTableWithDropColumn();
+    }
+
+    public boolean supportsANSI92EntryLevelSQL() throws SQLException {
+        return _metaData.supportsANSI92EntryLevelSQL();
+    }
+
+    public boolean supportsANSI92FullSQL() throws SQLException {
+        return _metaData.supportsANSI92FullSQL();
+    }
+
+    public boolean supportsANSI92IntermediateSQL() throws SQLException {
+        return _metaData.supportsANSI92IntermediateSQL();
+    }
+
+    public boolean supportsBatchUpdates() throws SQLException {
+        return _metaData.supportsBatchUpdates();
+    }
+
+    public boolean supportsCatalogsInDataManipulation() throws SQLException {
+        return _metaData.supportsCatalogsInDataManipulation();
+    }
+
+    public boolean supportsCatalogsInIndexDefinitions() throws SQLException {
+        return _metaData.supportsCatalogsInIndexDefinitions();
+    }
+
+    public boolean supportsCatalogsInPrivilegeDefinitions()
+        throws SQLException {
+        return _metaData.supportsCatalogsInPrivilegeDefinitions();
+    }
+
+    public boolean supportsCatalogsInProcedureCalls() throws SQLException {
+        return _metaData.supportsCatalogsInProcedureCalls();
+    }
+
+    public boolean supportsCatalogsInTableDefinitions() throws SQLException {
+        return _metaData.supportsCatalogsInTableDefinitions();
+    }
+
+    public boolean supportsColumnAliasing() throws SQLException {
+        return _metaData.supportsColumnAliasing();
+    }
+
+    public boolean supportsConvert() throws SQLException {
+        return _metaData.supportsConvert();
+    }
+
+    public boolean supportsConvert(int fromType, int toType)
+        throws SQLException {
+        return _metaData.supportsConvert(fromType, toType);
+    }
+
+    public boolean supportsCoreSQLGrammar() throws SQLException {
+        return _metaData.supportsCoreSQLGrammar();
+    }
+
+    public boolean supportsCorrelatedSubqueries() throws SQLException {
+        return _metaData.supportsCorrelatedSubqueries();
+    }
+
+    public boolean supportsDataDefinitionAndDataManipulationTransactions()
+        throws SQLException {
+        return _metaData
+            .supportsDataDefinitionAndDataManipulationTransactions();
+    }
+
+    public boolean supportsDataManipulationTransactionsOnly()
+        throws SQLException {
+        return _metaData.supportsDataManipulationTransactionsOnly();
+    }
+
+    public boolean supportsDifferentTableCorrelationNames()
+        throws SQLException {
+        return _metaData.supportsDifferentTableCorrelationNames();
+    }
+
+    public boolean supportsExpressionsInOrderBy() throws SQLException {
+        return _metaData.supportsExpressionsInOrderBy();
+    }
+
+    public boolean supportsExtendedSQLGrammar() throws SQLException {
+        return _metaData.supportsExtendedSQLGrammar();
+    }
+
+    public boolean supportsFullOuterJoins() throws SQLException {
+        return _metaData.supportsFullOuterJoins();
+    }
+
+    public boolean supportsGroupBy() throws SQLException {
+        return _metaData.supportsGroupBy();
+    }
+
+    public boolean supportsGroupByBeyondSelect() throws SQLException {
+        return _metaData.supportsGroupByBeyondSelect();
+    }
+
+    public boolean supportsGroupByUnrelated() throws SQLException {
+        return _metaData.supportsGroupByUnrelated();
+    }
+
+    public boolean supportsIntegrityEnhancementFacility() throws SQLException {
+        return _metaData.supportsIntegrityEnhancementFacility();
+    }
+
+    public boolean supportsLikeEscapeClause() throws SQLException {
+        return _metaData.supportsLikeEscapeClause();
+    }
+
+    public boolean supportsLimitedOuterJoins() throws SQLException {
+        return _metaData.supportsLimitedOuterJoins();
+    }
+
+    public boolean supportsMinimumSQLGrammar() throws SQLException {
+        return _metaData.supportsMinimumSQLGrammar();
+    }
+
+    public boolean supportsMixedCaseIdentifiers() throws SQLException {
+        return _metaData.supportsMixedCaseIdentifiers();
+    }
+
+    public boolean supportsMixedCaseQuotedIdentifiers() throws SQLException {
+        return _metaData.supportsMixedCaseQuotedIdentifiers();
+    }
+
+    public boolean supportsMultipleResultSets() throws SQLException {
+        return _metaData.supportsMultipleResultSets();
+    }
+
+    public boolean supportsMultipleTransactions() throws SQLException {
+        return _metaData.supportsMultipleTransactions();
+    }
+
+    public boolean supportsNonNullableColumns() throws SQLException {
+        return _metaData.supportsNonNullableColumns();
+    }
+
+    public boolean supportsOpenCursorsAcrossCommit() throws SQLException {
+        return _metaData.supportsOpenCursorsAcrossCommit();
+    }
+
+    public boolean supportsOpenCursorsAcrossRollback() throws SQLException {
+        return _metaData.supportsOpenCursorsAcrossRollback();
+    }
+
+    public boolean supportsOpenStatementsAcrossCommit() throws SQLException {
+        return _metaData.supportsOpenStatementsAcrossCommit();
+    }
+
+    public boolean supportsOpenStatementsAcrossRollback() throws SQLException {
+        return _metaData.supportsOpenStatementsAcrossRollback();
+    }
+
+    public boolean supportsOrderByUnrelated() throws SQLException {
+        return _metaData.supportsOrderByUnrelated();
+    }
+
+    public boolean supportsOuterJoins() throws SQLException {
+        return _metaData.supportsOuterJoins();
+    }
+
+    public boolean supportsPositionedDelete() throws SQLException {
+        return _metaData.supportsPositionedDelete();
+    }
+
+    public boolean supportsPositionedUpdate() throws SQLException {
+        return _metaData.supportsPositionedUpdate();
+    }
+
+    public boolean supportsResultSetConcurrency(int type, int concurrency)
+        throws SQLException {
+        return _metaData.supportsResultSetConcurrency(type, concurrency);
+    }
+
+    public boolean supportsResultSetType(int type) throws SQLException {
+        return _metaData.supportsResultSetType(type);
+    }
+
+    public boolean supportsSchemasInDataManipulation() throws SQLException {
+        return _metaData.supportsSchemasInDataManipulation();
+    }
+
+    public boolean supportsSchemasInIndexDefinitions() throws SQLException {
+        return _metaData.supportsSchemasInIndexDefinitions();
+    }
+
+    public boolean supportsSchemasInPrivilegeDefinitions() throws SQLException {
+        return _metaData.supportsSchemasInPrivilegeDefinitions();
+    }
+
+    public boolean supportsSchemasInProcedureCalls() throws SQLException {
+        return _metaData.supportsSchemasInProcedureCalls();
+    }
+
+    public boolean supportsSchemasInTableDefinitions() throws SQLException {
+        return _metaData.supportsSchemasInTableDefinitions();
+    }
+
+    public boolean supportsSelectForUpdate() throws SQLException {
+        return _metaData.supportsSelectForUpdate();
+    }
+
+    public boolean supportsStoredProcedures() throws SQLException {
+        return _metaData.supportsStoredProcedures();
+    }
+
+    public boolean supportsSubqueriesInComparisons() throws SQLException {
+        return _metaData.supportsSubqueriesInComparisons();
+    }
+
+    public boolean supportsSubqueriesInExists() throws SQLException {
+        return _metaData.supportsSubqueriesInExists();
+    }
+
+    public boolean supportsSubqueriesInIns() throws SQLException {
+        return _metaData.supportsSubqueriesInIns();
+    }
+
+    public boolean supportsSubqueriesInQuantifieds() throws SQLException {
+        return _metaData.supportsSubqueriesInQuantifieds();
+    }
+
+    public boolean supportsTableCorrelationNames() throws SQLException {
+        return _metaData.supportsTableCorrelationNames();
+    }
+
+    public boolean supportsTransactionIsolationLevel(int level)
+        throws SQLException {
+        return _metaData.supportsTransactionIsolationLevel(level);
+    }
+
+    public boolean supportsTransactions() throws SQLException {
+        return _metaData.supportsTransactions();
+    }
+
+    public boolean supportsUnion() throws SQLException {
+        return _metaData.supportsUnion();
+    }
+
+    public boolean supportsUnionAll() throws SQLException {
+        return _metaData.supportsUnionAll();
+    }
+
+    public boolean updatesAreDetected(int type) throws SQLException {
+        return _metaData.updatesAreDetected(type);
+    }
+
+    public boolean usesLocalFilePerTable() throws SQLException {
+        return _metaData.usesLocalFilePerTable();
+    }
+
+    public boolean usesLocalFiles() throws SQLException {
+        return _metaData.usesLocalFiles();
+    }
+
+    // JDBC 3.0 methods(unsupported) follow; these are required to be able to
+    // compile against JDK 1.4
+
+    public boolean supportsSavepoints() throws SQLException {
+        throw new UnsupportedOperationException();
+    }
+
+    public boolean supportsNamedParameters() throws SQLException {
+        throw new UnsupportedOperationException();
+    }
+
+    public boolean supportsMultipleOpenResults() throws SQLException {
+        throw new UnsupportedOperationException();
+    }
+
+    public boolean supportsGetGeneratedKeys() throws SQLException {
+        throw new UnsupportedOperationException();
+    }
+
+    public ResultSet getSuperTypes(String catalog, String schemaPatter,
+        String typeNamePattern) throws SQLException {
+        throw new UnsupportedOperationException();
+    }
+
+    public ResultSet getSuperTables(String catalog, String schemaPatter,
+        String tableNamePattern) throws SQLException {
+        throw new UnsupportedOperationException();
+    }
+
+    public ResultSet getAttributes(String catalog, String schemaPatter,
+        String typeNamePattern, String attributeNamePattern)
+        throws SQLException {
+        throw new UnsupportedOperationException();
+    }
+
+    public boolean supportsResultSetHoldability(int holdability)
+        throws SQLException {
+        throw new UnsupportedOperationException();
+    }
+
+    public int getResultSetHoldability() throws SQLException {
+        throw new UnsupportedOperationException();
+    }
+
+    public int getDatabaseMajorVersion() throws SQLException {
+        return _metaData.getDatabaseMajorVersion();
+    }
+
+    public int getDatabaseMinorVersion() throws SQLException {
+        return _metaData.getDatabaseMinorVersion();
+    }
+
+    public int getJDBCMajorVersion() throws SQLException {
+        return _metaData.getJDBCMajorVersion();
+    }
+
+    public int getJDBCMinorVersion() throws SQLException {
+        throw new UnsupportedOperationException();
+    }
+
+    public int getSQLStateType() throws SQLException {
+        throw new UnsupportedOperationException();
+    }
+
+    public boolean locatorsUpdateCopy() throws SQLException {
+        throw new UnsupportedOperationException();
+    }
+
+    public boolean supportsStatementPooling() throws SQLException {
+        throw new UnsupportedOperationException();
+    }
+}
+