content: /*
   * Copyright 2021 4Paradigm
   *
   * 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 com._4paradigm.openmldb.jdbc;
  
  import java.sql.Connection;
  import java.sql.JDBCType;
  import java.sql.ResultSet;
  import java.sql.RowIdLifetime;
  import java.sql.SQLException;
  import java.sql.Types;
  import java.util.ArrayList;
  import java.util.Arrays;
  import java.util.Collections;
  import java.util.List;
  import java.util.regex.Pattern;
  
  import com._4paradigm.openmldb.sdk.Column;
  import com._4paradigm.openmldb.sdk.Schema;
  
  public class DatabaseMetaData implements java.sql.DatabaseMetaData {
      public static final String DRIVER_NAME = "OpenMLDB Connector/J";
      private final SQLConnection connection;
  
      public static List<Column> tableRsCols = Arrays.asList(
              new Column("TABLE_CAT", Types.VARCHAR),
              new Column("TABLE_SCHEM", Types.VARCHAR),
              new Column("TABLE_NAME", Types.VARCHAR),
              new Column("TABLE_TYPE", Types.VARCHAR),
              new Column("REMARKS", Types.VARCHAR),
              new Column("TYPE_CAT", Types.VARCHAR),
              new Column("TYPE_SCHEM", Types.VARCHAR),
              new Column("TYPE_NAME", Types.VARCHAR),
              new Column("SELF_REFERENCING_COL_NAME", Types.VARCHAR),
              new Column("REF_GENERATION", Types.VARCHAR)
      );
      public static List<Column> columnRsCols = Arrays.asList(
              new Column("TABLE_CAT", Types.VARCHAR),
              new Column("TABLE_SCHEM", Types.VARCHAR),
              new Column("TABLE_NAME", Types.VARCHAR),
              new Column("COLUMN_NAME", Types.VARCHAR),
              new Column("DATA_TYPE", Types.INTEGER),
              new Column("TYPE_NAME", Types.VARCHAR),
              new Column("COLUMN_SIZE", Types.INTEGER),
              new Column("BUFFER_LENGTH", Types.INTEGER),
              new Column("DECIMAL_DIGITS", Types.INTEGER),
              new Column("NUM_PREC_RADIX", Types.INTEGER),
              new Column("NULLABLE", Types.INTEGER),
              new Column("REMARKS", Types.VARCHAR),
              new Column("COLUMN_DEF", Types.VARCHAR),
              new Column("SQL_DATA_TYPE", Types.INTEGER),
              new Column("SQL_DATETIME_SUB", Types.INTEGER),
              new Column("CHAR_OCTET_LENGTH", Types.INTEGER),
              new Column("ORDINAL_POSITION", Types.INTEGER),
              new Column("IS_NULLABLE", Types.VARCHAR),
              new Column("SCOPE_CATALOG", Types.VARCHAR),
              new Column("SCOPE_SCHEMA", Types.VARCHAR),
              new Column("SCOPE_TABLE", Types.VARCHAR),
              new Column("SOURCE_DATA_TYPE", Types.SMALLINT),
              new Column("IS_AUTOINCREMENT", Types.VARCHAR),
              new Column("IS_GENERATEDCOLUMN", Types.VARCHAR)
      );
  
      public DatabaseMetaData(SQLConnection connection) {
          this.connection = connection;
      }
  
      @Override
      public boolean allProceduresAreCallable() throws SQLException {
          return false;
      }
  
      @Override
      public boolean allTablesAreSelectable() throws SQLException {
          return false;
      }
  
      @Override
      public String getURL() throws SQLException {
          return null;
      }
  
      @Override
      public String getUserName() throws SQLException {
          return null;
      }
  
      @Override
      public boolean isReadOnly() throws SQLException {
          return false;
      }
  
      @Override
      public boolean nullsAreSortedHigh() throws SQLException {
          return false;
      }
  
      @Override
      public boolean nullsAreSortedLow() throws SQLException {
          return false;
      }
  
      @Override
      public boolean nullsAreSortedAtStart() throws SQLException {
          return false;
      }
  
      @Override
      public boolean nullsAreSortedAtEnd() throws SQLException {
          return false;
      }
  
      @Override
      public String getDatabaseProductName() throws SQLException {
          return "OpenMLDB";
      }
  
      @Override
      public String getDatabaseProductVersion() throws SQLException {
          return "unknown";
      }
  
      @Override
      public String getDriverName() throws SQLException {
          return DRIVER_NAME;
      }
  
      @Override
      public String getDriverVersion() throws SQLException {
          int n = getDriverMinorVersion();
          String s = getDriverMajorVersion() + ".";
          s += "" + n;
          return s;
      }
  
      @Override
      public int getDriverMajorVersion() {
          return 0;
      }
  
      @Override
      public int getDriverMinorVersion() {
          return 4;
      }
  
      @Override
      public boolean usesLocalFiles() throws SQLException {
          return false;
      }
  
      @Override
      public boolean usesLocalFilePerTable() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsMixedCaseIdentifiers() throws SQLException {
          return false;
      }
  
      @Override
      public boolean storesUpperCaseIdentifiers() throws SQLException {
          return false;
      }
  
      @Override
      public boolean storesLowerCaseIdentifiers() throws SQLException {
          return false;
      }
  
      @Override
      public boolean storesMixedCaseIdentifiers() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsMixedCaseQuotedIdentifiers() throws SQLException {
          return false;
      }
  
      @Override
      public boolean storesUpperCaseQuotedIdentifiers() throws SQLException {
          return false;
      }
  
      @Override
      public boolean storesLowerCaseQuotedIdentifiers() throws SQLException {
          return false;
      }
  
      @Override
      public boolean storesMixedCaseQuotedIdentifiers() throws SQLException {
          return false;
      }
  
      @Override
      public String getIdentifierQuoteString() throws SQLException {
          return "`";
      }
  
      @Override
      public String getSQLKeywords() throws SQLException {
          return null;
      }
  
      @Override
      public String getNumericFunctions() throws SQLException {
          return null;
      }
  
      @Override
      public String getStringFunctions() throws SQLException {
          return null;
      }
  
      @Override
      public String getSystemFunctions() throws SQLException {
          return null;
      }
  
      @Override
      public String getTimeDateFunctions() throws SQLException {
          return null;
      }
  
      @Override
      public String getSearchStringEscape() throws SQLException {
          return null;
      }
  
      @Override
      public String getExtraNameCharacters() throws SQLException {
          return null;
      }
  
      @Override
      public boolean supportsAlterTableWithAddColumn() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsAlterTableWithDropColumn() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsColumnAliasing() throws SQLException {
          return false;
      }
  
      @Override
      public boolean nullPlusNonNullIsNull() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsConvert() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsConvert(int fromType, int toType) throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsTableCorrelationNames() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsDifferentTableCorrelationNames() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsExpressionsInOrderBy() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsOrderByUnrelated() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsGroupBy() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsGroupByUnrelated() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsGroupByBeyondSelect() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsLikeEscapeClause() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsMultipleResultSets() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsMultipleTransactions() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsNonNullableColumns() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsMinimumSQLGrammar() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsCoreSQLGrammar() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsExtendedSQLGrammar() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsANSI92EntryLevelSQL() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsANSI92IntermediateSQL() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsANSI92FullSQL() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsIntegrityEnhancementFacility() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsOuterJoins() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsFullOuterJoins() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsLimitedOuterJoins() throws SQLException {
          return false;
      }
  
      @Override
      public String getSchemaTerm() throws SQLException {
          return null;
      }
  
      @Override
      public String getProcedureTerm() throws SQLException {
          return null;
      }
  
      @Override
      public String getCatalogTerm() throws SQLException {
          return null;
      }
  
      @Override
      public boolean isCatalogAtStart() throws SQLException {
          return false;
      }
  
      @Override
      public String getCatalogSeparator() throws SQLException {
          return ".";
      }
  
      @Override
      public boolean supportsSchemasInDataManipulation() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsSchemasInProcedureCalls() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsSchemasInTableDefinitions() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsSchemasInIndexDefinitions() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsSchemasInPrivilegeDefinitions() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsCatalogsInDataManipulation() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsCatalogsInProcedureCalls() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsCatalogsInTableDefinitions() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsCatalogsInIndexDefinitions() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsCatalogsInPrivilegeDefinitions() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsPositionedDelete() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsPositionedUpdate() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsSelectForUpdate() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsStoredProcedures() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsSubqueriesInComparisons() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsSubqueriesInExists() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsSubqueriesInIns() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsSubqueriesInQuantifieds() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsCorrelatedSubqueries() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsUnion() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsUnionAll() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsOpenCursorsAcrossCommit() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsOpenCursorsAcrossRollback() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsOpenStatementsAcrossCommit() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsOpenStatementsAcrossRollback() throws SQLException {
          return false;
      }
  
      @Override
      public int getMaxBinaryLiteralLength() throws SQLException {
          return 0;
      }
  
      @Override
      public int getMaxCharLiteralLength() throws SQLException {
          return 0;
      }
  
      @Override
      public int getMaxColumnNameLength() throws SQLException {
          return 0;
      }
  
      @Override
      public int getMaxColumnsInGroupBy() throws SQLException {
          return 0;
      }
  
      @Override
      public int getMaxColumnsInIndex() throws SQLException {
          return 0;
      }
  
      @Override
      public int getMaxColumnsInOrderBy() throws SQLException {
          return 0;
      }
  
      @Override
      public int getMaxColumnsInSelect() throws SQLException {
          return 0;
      }
  
      @Override
      public int getMaxColumnsInTable() throws SQLException {
          return 0;
      }
  
      @Override
      public int getMaxConnections() throws SQLException {
          return 0;
      }
  
      @Override
      public int getMaxCursorNameLength() throws SQLException {
          return 0;
      }
  
      @Override
      public int getMaxIndexLength() throws SQLException {
          return 0;
      }
  
      @Override
      public int getMaxSchemaNameLength() throws SQLException {
          return 0;
      }
  
      @Override
      public int getMaxProcedureNameLength() throws SQLException {
          return 0;
      }
  
      @Override
      public int getMaxCatalogNameLength() throws SQLException {
          return 0;
      }
  
      @Override
      public int getMaxRowSize() throws SQLException {
          return 0;
      }
  
      @Override
      public boolean doesMaxRowSizeIncludeBlobs() throws SQLException {
          return false;
      }
  
      @Override
      public int getMaxStatementLength() throws SQLException {
          return 0;
      }
  
      @Override
      public int getMaxStatements() throws SQLException {
          return 0;
      }
  
      @Override
      public int getMaxTableNameLength() throws SQLException {
          return 0;
      }
  
      @Override
      public int getMaxTablesInSelect() throws SQLException {
          return 0;
      }
  
      @Override
      public int getMaxUserNameLength() throws SQLException {
          return 0;
      }
  
      @Override
      public int getDefaultTransactionIsolation() throws SQLException {
          return 0;
      }
  
      @Override
      public boolean supportsTransactions() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsTransactionIsolationLevel(int level) throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsDataDefinitionAndDataManipulationTransactions() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsDataManipulationTransactionsOnly() throws SQLException {
          return false;
      }
  
      @Override
      public boolean dataDefinitionCausesTransactionCommit() throws SQLException {
          return false;
      }
  
      @Override
      public boolean dataDefinitionIgnoredInTransactions() throws SQLException {
          return false;
      }
  
      @Override
      public ResultSet getProcedures(String catalog, String schemaPattern, String procedureNamePattern) throws SQLException {
          return null;
      }
  
      @Override
      public ResultSet getProcedureColumns(String catalog, String schemaPattern, String procedureNamePattern, String columnNamePattern) throws SQLException {
          return null;
      }
  
      // only has: TABLE_CAT=null, TABLE_SCHEM=null, TABLE_NAME, TABLE_TYPE='TABLE'
      @Override
      public ResultSet getTables(String catalog, String schemaPattern, String tableNamePattern, String[] types) throws SQLException {
          // TODO(hw): catalog unsupported, schema == openmldb db? Ref https://dev.mysql.com/doc/refman/8.0/en/glossary.html#glos_schema
          // hard to impl when 'SHOW xxx WHERE'
          if (catalog != null || schemaPattern != null) {
              throw new SQLException("unsupported");
          }
  
          // we'll use regex to match, tableNamePattern needs fix
          String regexPattern = tableNamePattern;
          if (regexPattern != null) {
              regexPattern = regexPattern.replace("_", ".");
              regexPattern = regexPattern.replace("%", ".+");
          }
          List<String> allTables = connection.getClient().getTableNames(connection.getDefaultDatabase());
  
          List<List<String>> table = new ArrayList<>();
          for (String tableName : allTables) {
              if (regexPattern != null && !Pattern.matches(regexPattern, tableName)) {
                  continue;
              }
  
              List<String> row = new ArrayList<>();
              // TABLE_CAT
              row.add(null);
              // TABLE_SCHEM schema name
              row.add(null);
              // TABLE_NAME table name
              row.add(tableName);
              // table type
              row.add("TABLE");
              // extra 6 columns
              for (int i = 0; i < 6; i++) {
                  row.add(null);
              }
              table.add(row);
          }
  
          return SimpleResultSet.createResultSet(tableRsCols, table);
      }
  
      @Override
      public ResultSet getSchemas() throws SQLException {
          return null;
      }
  
      @Override
      public ResultSet getCatalogs() throws SQLException {
          return null;
      }
  
      @Override
      public ResultSet getTableTypes() throws SQLException {
          List<List<String>> table = new ArrayList<>();
          table.add(Collections.singletonList("TABLE"));
          return SimpleResultSet.createResultSet(Collections.singletonList("TABLE_TYPE"),
                  Collections.singletonList(Types.VARCHAR), table);
      }
  
      @Override
      public ResultSet getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern) throws SQLException {
          // hard to impl when 'SHOW xxx WHERE'
          // Note: If catalog, schemaPattern, tableNamePattern, columnNamePattern are null, they should be null, not a
          // string "null"
          if (catalog != null || schemaPattern != null || columnNamePattern != null) {
              throw new SQLException("unsupported");
          }
  
          // must use this to get database name, and then get table schema.
          List<String> allTables = connection.getClient().getTableNames(connection.getDefaultDatabase());
          List<List<String>> table = new ArrayList<>();
          for (String tableName : allTables) {
              if (tableNamePattern != null && !tableName.equals(tableNamePattern)) {
                  continue;
              }
  
              List<String> rowFirstPart = new ArrayList<>();
  
              // TABLE_CAT
              rowFirstPart.add(null);
              // TABLE_SCHEM schema name
              rowFirstPart.add(null);
  
              String dbName = connection.getDefaultDatabase();
              // TABLE_NAME table name
              rowFirstPart.add(tableName);
              Schema schema = connection.getClient().getTableSchema(dbName, tableName);
              List<Column> cols = schema.getColumnList();
              for (int i = 0; i < cols.size(); i++) {
                  Column col = cols.get(i);
                  List<String> colParts = new ArrayList<>();
                  // COLUMN_NAME
                  colParts.add(col.getColumnName());
                  // DATA_TYPE int
                  colParts.add(Integer.toString(col.getSqlType()));
                  // TYPE_NAME
                  colParts.add(JDBCType.valueOf(col.getSqlType()).getName());
                  // TODO(hw): COLUMN_SIZE precision
                  colParts.add("0");
                  // BUFFER_LENGTH
                  colParts.add("0");
                  // TODO(hw): DECIMAL_DIGITS
                  colParts.add("0");
                  // NUM_PREC_RADIX
                  colParts.add("10");
                  // NULLABLE
                  colParts.add(col.isNotNull() ? "0" : "1");
                  // REMARKS, COLUMN_DEF string
                  colParts.add(null);
                  colParts.add(null);
                  // SQL_DATA_TYPE, SQL_DATETIME_SUB unused
                  colParts.add("0");
                  colParts.add("0");
                  // TODO(hw): CHAR_OCTET_LENGTH
                  colParts.add("0");
                  // ORDINAL_POSITION (starting at 1)
                  colParts.add(Integer.toString(i + 1));
                  // IS_NULLABLE
                  colParts.add(col.isNotNull() ? "NO" : "YES");
                  // extra 4 columns
                  for (int k = 0; k < 4; k++) {
                      colParts.add(null);
                  }
                  // IS_AUTOINCREMENT
                  colParts.add("NO");
                  // IS_GENERATEDCOLUMN
                  colParts.add("NO");
                  // append this column info
                  colParts.addAll(0, rowFirstPart);
                  table.add(colParts);
              }
  
          }
  
          return new SimpleResultSet(columnRsCols, table);
      }
  
      @Override
      public ResultSet getColumnPrivileges(String catalog, String schema, String table, String columnNamePattern) throws SQLException {
          return null;
      }
  
      @Override
      public ResultSet getTablePrivileges(String catalog, String schemaPattern, String tableNamePattern) throws SQLException {
          return null;
      }
  
      @Override
      public ResultSet getBestRowIdentifier(String catalog, String schema, String table, int scope, boolean nullable) throws SQLException {
          return null;
      }
  
      @Override
      public ResultSet getVersionColumns(String catalog, String schema, String table) throws SQLException {
          return null;
      }
  
      @Override
      public ResultSet getPrimaryKeys(String catalog, String schema, String table) throws SQLException {
          // no primary keys
          List<String> columns = Arrays.asList("TABLE_CAT", "TABLE_SCHEM", "TABLE_NAME", "COLUMN_NAME", "KEY_SEQ", "PK_NAME");
          List<Integer> types = Arrays.asList(Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.SMALLINT,
                  Types.VARCHAR);
          List<List<String>> rsTable = new ArrayList<>();
          // TODO(hw):
          return SimpleResultSet.createResultSet(columns, types, rsTable);
      }
  
      @Override
      public ResultSet getImportedKeys(String catalog, String schema, String table) throws SQLException {
          return null;
      }
  
      @Override
      public ResultSet getExportedKeys(String catalog, String schema, String table) throws SQLException {
          return null;
      }
  
      @Override
      public ResultSet getCrossReference(String parentCatalog, String parentSchema, String parentTable, String foreignCatalog, String foreignSchema, String foreignTable) throws SQLException {
          return null;
      }
  
      @Override
      public ResultSet getTypeInfo() throws SQLException {
          return null;
      }
  
      @Override
      public ResultSet getIndexInfo(String catalog, String schema, String table, boolean unique, boolean approximate) throws SQLException {
          return null;
      }
  
      @Override
      public boolean supportsResultSetType(int type) throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsResultSetConcurrency(int type, int concurrency) throws SQLException {
          return false;
      }
  
      @Override
      public boolean ownUpdatesAreVisible(int type) throws SQLException {
          return false;
      }
  
      @Override
      public boolean ownDeletesAreVisible(int type) throws SQLException {
          return false;
      }
  
      @Override
      public boolean ownInsertsAreVisible(int type) throws SQLException {
          return false;
      }
  
      @Override
      public boolean othersUpdatesAreVisible(int type) throws SQLException {
          return false;
      }
  
      @Override
      public boolean othersDeletesAreVisible(int type) throws SQLException {
          return false;
      }
  
      @Override
      public boolean othersInsertsAreVisible(int type) throws SQLException {
          return false;
      }
  
      @Override
      public boolean updatesAreDetected(int type) throws SQLException {
          return false;
      }
  
      @Override
      public boolean deletesAreDetected(int type) throws SQLException {
          return false;
      }
  
      @Override
      public boolean insertsAreDetected(int type) throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsBatchUpdates() throws SQLException {
          return false;
      }
  
      @Override
      public ResultSet getUDTs(String catalog, String schemaPattern, String typeNamePattern, int[] types) throws SQLException {
          return null;
      }
  
      @Override
      public Connection getConnection() throws SQLException {
          return null;
      }
  
      @Override
      public boolean supportsSavepoints() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsNamedParameters() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsMultipleOpenResults() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsGetGeneratedKeys() throws SQLException {
          return false;
      }
  
      @Override
      public ResultSet getSuperTypes(String catalog, String schemaPattern, String typeNamePattern) throws SQLException {
          return null;
      }
  
      @Override
      public ResultSet getSuperTables(String catalog, String schemaPattern, String tableNamePattern) throws SQLException {
          return null;
      }
  
      @Override
      public ResultSet getAttributes(String catalog, String schemaPattern, String typeNamePattern, String attributeNamePattern) throws SQLException {
          return null;
      }
  
      @Override
      public boolean supportsResultSetHoldability(int holdability) throws SQLException {
          return false;
      }
  
      @Override
      public int getResultSetHoldability() throws SQLException {
          return 0;
      }
  
      @Override
      public int getDatabaseMajorVersion() throws SQLException {
          return 0;
      }
  
      @Override
      public int getDatabaseMinorVersion() throws SQLException {
          return 0;
      }
  
      @Override
      public int getJDBCMajorVersion() throws SQLException {
          return 1;
      }
  
      @Override
      public int getJDBCMinorVersion() throws SQLException {
          return 4;
      }
  
      @Override
      public int getSQLStateType() throws SQLException {
          return sqlStateSQL99;
      }
  
      @Override
      public boolean locatorsUpdateCopy() throws SQLException {
          return false;
      }
  
      @Override
      public boolean supportsStatementPooling() throws SQLException {
          return false;
      }
  
      @Override
      public RowIdLifetime getRowIdLifetime() throws SQLException {
          return null;
      }
  
      @Override
      public ResultSet getSchemas(String catalog, String schemaPattern) throws SQLException {
          return null;
      }
  
      @Override
      public boolean supportsStoredFunctionsUsingCallSyntax() throws SQLException {
          return false;
      }
  
      @Override
      public boolean autoCommitFailureClosesAllResultSets() throws SQLException {
          return false;
      }
  
      @Override
      public ResultSet getClientInfoProperties() throws SQLException {
          return null;
      }
  
      @Override
      public ResultSet getFunctions(String catalog, String schemaPattern, String functionNamePattern) throws SQLException {
          return null;
      }
  
      @Override
      public ResultSet getFunctionColumns(String catalog, String schemaPattern, String functionNamePattern, String columnNamePattern) throws SQLException {
          return null;
      }
  
      @Override
      public ResultSet getPseudoColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern) throws SQLException {
          return null;
      }
  
      @Override
      public boolean generatedKeyAlwaysReturned() throws SQLException {
          return false;
      }
  
      @Override
      public <T> T unwrap(Class<T> iface) throws SQLException {
          return null;
      }
  
      @Override
      public boolean isWrapperFor(Class<?> iface) throws SQLException {
          return false;
      }
  }
  