Home | History | Annotate | Download | only in sql
      1 /*
      2  * Copyright (C) 2007 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *     http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 package tests.java.sql;
     17 
     18 import dalvik.annotation.KnownFailure;
     19 import dalvik.annotation.TestTargets;
     20 import dalvik.annotation.TestLevel;
     21 import dalvik.annotation.TestTargetNew;
     22 import dalvik.annotation.TestTargetClass;
     23 
     24 import junit.extensions.TestSetup;
     25 import junit.framework.Test;
     26 import junit.framework.TestCase;
     27 import junit.framework.TestSuite;
     28 
     29 import tests.support.DatabaseCreator;
     30 import tests.support.Support_SQL;
     31 
     32 import java.sql.Connection;
     33 import java.sql.DatabaseMetaData;
     34 import java.sql.DriverManager;
     35 import java.sql.PreparedStatement;
     36 import java.sql.ResultSet;
     37 import java.sql.ResultSetMetaData;
     38 import java.sql.SQLException;
     39 import java.sql.Statement;
     40 import java.sql.Types;
     41 import java.util.ArrayList;
     42 import java.util.Arrays;
     43 import java.util.List;
     44 import java.util.Random;
     45 import java.util.StringTokenizer;
     46 
     47 @TestTargetClass(DatabaseMetaData.class)
     48 public class DatabaseMetaDataTest extends TestCase {
     49     private static String VIEW_NAME = "myView";
     50 
     51     private static String CREATE_VIEW_QUERY = "CREATE VIEW " + VIEW_NAME
     52             + " AS SELECT * FROM " + DatabaseCreator.TEST_TABLE1;
     53 
     54     private static String DROP_VIEW_QUERY = "DROP VIEW " + VIEW_NAME;
     55 
     56     protected static Connection conn;
     57 
     58     protected static DatabaseMetaData meta;
     59 
     60     protected static Statement statement;
     61 
     62     protected static Statement statementForward;
     63 
     64     private static int id = 1;
     65 
     66     public void setUp() throws Exception {
     67         super.setUp();
     68         Support_SQL.loadDriver();
     69         try {
     70             conn = Support_SQL.getConnection();
     71             meta = conn.getMetaData();
     72             statement = conn.createStatement();
     73             statementForward = conn.createStatement(
     74                     ResultSet.TYPE_FORWARD_ONLY,
     75                     ResultSet.CONCUR_READ_ONLY);
     76             createTestTables();
     77         } catch (SQLException e) {
     78             System.out.println("Error in test setup: "+e.getMessage());
     79         }
     80     }
     81 
     82     protected void tearDown() throws Exception {
     83         try {
     84             conn = Support_SQL.getConnection();
     85             meta = conn.getMetaData();
     86             statement = conn.createStatement();
     87             deleteTestTables();
     88         } catch (SQLException e) {
     89             System.out.println("Error in teardown: "+e.getMessage());
     90         } finally {
     91             try {
     92                 conn.close();
     93             } catch (SQLException e) {
     94             }
     95         }
     96         super.tearDown();
     97     }
     98 
     99             private void createTestTables() {
    100                 try {
    101                     ResultSet userTab = meta.getTables(null, null, null, null);
    102                     while (userTab.next()) {
    103                         String tableName = userTab.getString("TABLE_NAME");
    104                         if (tableName.equals(DatabaseCreator.TEST_TABLE1)) {
    105                             statement.execute(DatabaseCreator.DROP_TABLE1);
    106                         } else if (tableName
    107                                 .equals(DatabaseCreator.TEST_TABLE3)) {
    108                             statement.execute(DatabaseCreator.DROP_TABLE3);
    109                         } else if (tableName.equals(VIEW_NAME)) {
    110                             statement.execute(DROP_VIEW_QUERY);
    111                         }
    112                     }
    113                     userTab.close();
    114                     statement.execute(DatabaseCreator.CREATE_TABLE3);
    115                     statement.execute(DatabaseCreator.CREATE_TABLE1);
    116                     statement.execute(CREATE_VIEW_QUERY);
    117                     meta = conn.getMetaData();
    118                 } catch (SQLException e) {
    119                     fail("Unexpected SQLException " + e.toString());
    120                 }
    121             }
    122 
    123             private void deleteTestTables() {
    124                 try {
    125                     statement.execute(DatabaseCreator.DROP_TABLE1);
    126                     statement.execute(DatabaseCreator.DROP_TABLE3);
    127                     statement.execute(DROP_VIEW_QUERY);
    128                 } catch (SQLException e) {
    129                     fail("Unexpected SQLException " + e.toString());
    130                 } finally {
    131                     try {
    132                     if (! conn.isClosed()) {
    133                         conn.close();
    134                     }
    135                     } catch (SQLException e) {
    136 
    137                     }
    138                 }
    139             }
    140     /*
    141     public void setUp() {
    142         try {
    143             super.setUp();
    144             try {
    145                 conn = Support_SQL.getConnection();
    146                 statement = conn.createStatement();
    147                 statementForward = conn.createStatement(
    148                         ResultSet.TYPE_FORWARD_ONLY,
    149                         ResultSet.CONCUR_READ_ONLY);
    150                 meta = conn.getMetaData();
    151 
    152                 assertFalse(conn.isClosed());
    153             } catch (SQLException e) {
    154                 fail("Unexpected SQLException " + e.toString());
    155             }
    156 
    157         } catch (Exception e) {
    158             // TODO Auto-generated catch block
    159             e.printStackTrace();
    160         }
    161 
    162     }
    163     */
    164 
    165     /**
    166      * @tests {@link java.sql.DatabaseMetaData #getBestRowIdentifier(java.lang.String,
    167      *        java.lang.String, java.lang.String, int, boolean) }
    168      */
    169     @TestTargetNew(
    170         level = TestLevel.SUFFICIENT,
    171         notes = "Not all variants of parameters can be tested: updates on resultSets are not supported.",
    172         method = "getBestRowIdentifier",
    173         args = {java.lang.String.class, java.lang.String.class, java.lang.String.class, int.class, boolean.class}
    174     )
    175     public void test_getBestRowIdentifierLjava_lang_StringLjava_lang_StringLjava_lang_StringIZ()
    176             throws SQLException {
    177         ResultSet result = statementForward.executeQuery("SELECT * FROM "
    178                 + DatabaseCreator.TEST_TABLE1);
    179 
    180         //Updatable ResultSet not supported, converted to normal insert statement
    181         statementForward.executeUpdate("INSERT INTO " + DatabaseCreator.TEST_TABLE1
    182                 + " (id, field1) VALUES( 1234567, 'test1');");
    183         /* not supported
    184         try {
    185          result.moveToInsertRow();
    186          result.updateInt("id", 1234567);
    187          result.updateString("field1", "test1");
    188          result.insertRow();
    189          } catch (SQLException e) {
    190          fail("Unexpected SQLException " + e.toString());
    191          }
    192          */
    193 
    194 
    195         result.close();
    196 
    197         ResultSet rs = meta.getBestRowIdentifier(null, null,
    198                 DatabaseCreator.TEST_TABLE1, DatabaseMetaData.bestRowSession,
    199                 true);
    200         ResultSetMetaData rsmd = rs.getMetaData();
    201         assertTrue("Rows not obtained", rs.next());
    202         int col = rsmd.getColumnCount();
    203         assertEquals("Incorrect number of columns", 8, col);
    204         String[] columnNames = {
    205                 "SCOPE", "COLUMN_NAME", "DATA_TYPE", "TYPE_NAME",
    206                 "COLUMN_SIZE", "BUFFER_LENGTH", "DECIMAL_DIGITS",
    207                 "PSEUDO_COLUMN"};
    208         for (int c = 1; c <= col; ++c) {
    209             assertEquals("Incorrect column name", columnNames[c - 1], rsmd
    210                     .getColumnName(c));
    211         }
    212         assertEquals("Incorrect scope", DatabaseMetaData.bestRowSession, rs
    213                 .getShort("SCOPE"));
    214         assertEquals("Incorrect column name", "_ROWID_", rs.getString("COLUMN_NAME"));
    215         assertEquals("Incorrect data type", java.sql.Types.INTEGER, rs.getInt("DATA_TYPE"));
    216         assertEquals("Incorrect type name", "INTEGER", rs.getString("TYPE_NAME"));
    217         rs.close();
    218 
    219      // Exception testing
    220         conn.close();
    221 
    222         try {
    223             meta.getColumns(null, null,
    224             DatabaseCreator.TEST_TABLE1, "%");
    225             fail("SQLException not thrown");
    226         } catch (SQLException e) {
    227             // ok
    228         }
    229     }
    230 
    231     /**
    232      * @tests java.sql.DatabaseMetaData #getColumns(java.lang.String,
    233      *        java.lang.String, java.lang.String, java.lang.String)
    234      *
    235      */
    236     @TestTargetNew(
    237         level = TestLevel.PARTIAL_COMPLETE,
    238         notes = "Tests Columns and search for arbitrary columns. test fails: Columns Name's not according to spec.",
    239         method = "getColumns",
    240         args = {java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class}
    241     )
    242     @KnownFailure("Not supported : pattern with %")
    243     public void test_getColumnsArbitrary() throws SQLException {
    244         ResultSet setAllNull = null;
    245         ResultSet setMixed = null;
    246         ResultSet allArbitrary = null;
    247         String[] tablesName = {DatabaseCreator.TEST_TABLE1,
    248                 DatabaseCreator.TEST_TABLE3};
    249         Arrays.sort(tablesName);
    250         int setSize = 0;
    251         try {
    252             allArbitrary = meta.getColumns("%","%","%","%");
    253             assertNotNull(allArbitrary);
    254             checkColumnsShape(allArbitrary);
    255             setSize = crossCheckGetColumnsAndResultSetMetaData(allArbitrary, false);
    256             assertEquals(6, setSize);
    257 
    258             setMixed = meta.getColumns(null, null,"%","%");
    259             assertNotNull(setMixed);
    260             checkColumnsShape(setMixed);
    261             setSize = crossCheckGetColumnsAndResultSetMetaData(setMixed, false);
    262             assertEquals(6, setSize);
    263 
    264         } catch (SQLException e) {
    265             fail("Unexpected exception: " + e.getMessage());
    266         }
    267 
    268         // Exception testing
    269         conn.close();
    270 
    271         try {
    272             meta.getColumns(null, null,
    273                     DatabaseCreator.TEST_TABLE1, "%");
    274             fail("SQLException not thrown");
    275         } catch (SQLException e) {
    276             // ok
    277         }
    278     }
    279 
    280     /**
    281      * @tests java.sql.DatabaseMetaData #getColumns(java.lang.String,
    282      *        java.lang.String, java.lang.String, java.lang.String)
    283      *
    284      */
    285     @TestTargetNew(
    286         level = TestLevel.PARTIAL_COMPLETE,
    287         notes = "Tests getColumns with no Catalog and Schema. test fails on arguments: '', '', '%', '%'",
    288         method = "getColumns",
    289         args = {java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class}
    290     )
    291     @KnownFailure("Not supported ops applied: test fails on arguments: '', '', '%', '%' ")
    292     public void test_getColumnsTableWithNoCatalogSchema() throws SQLException{
    293 
    294         try {
    295             ResultSet noSchemaTable = meta.getColumns("", "",
    296                     DatabaseCreator.TEST_TABLE1, "fkey");
    297             assertNotNull(noSchemaTable);
    298             noSchemaTable.last();
    299             int size = noSchemaTable.getRow();
    300             assertEquals(
    301                     "Does not support empty string as input parameter or Wildcard %",
    302                     1, size);
    303 
    304 
    305 
    306         } catch (SQLException e) {
    307             fail("Unexpected exception: " + e.getMessage());
    308         }
    309 
    310         try {
    311             ResultSet noSchemaTable = meta.getColumns("", "",
    312                     DatabaseCreator.TEST_TABLE1, "%");
    313             assertNotNull(noSchemaTable);
    314             noSchemaTable.last();
    315             int size = noSchemaTable.getRow();
    316             assertEquals(
    317                     "Does not support empty string as input parameter or Wildcard %",
    318                     5, size);
    319 
    320 
    321 
    322         } catch (SQLException e) {
    323             fail("Unexpected exception: " + e.getMessage());
    324         }
    325 
    326         try {
    327             ResultSet noSchemaTable = meta.getColumns("", "", "%", "%");
    328             assertNotNull(noSchemaTable);
    329             noSchemaTable.last();
    330             int size = noSchemaTable.getRow();
    331             assertEquals(
    332                     "Does not support double Wildcard '%' as input",
    333                     6, size);
    334 
    335         } catch (SQLException e) {
    336             fail("Unexpected exception: " + e.getMessage());
    337         }
    338 
    339         // Exception checking
    340         conn.close();
    341 
    342         try {
    343             meta.getColumns(null, null,
    344                     DatabaseCreator.TEST_TABLE1, "%");
    345             fail("SQLException not thrown");
    346         } catch (SQLException e) {
    347             // ok
    348         }
    349     }
    350 
    351 
    352 
    353     /**
    354      * @tests java.sql.DatabaseMetaData #getColumns(java.lang.String,
    355      *        java.lang.String, java.lang.String, java.lang.String)
    356      *
    357      */
    358     @TestTargetNew(
    359         level = TestLevel.PARTIAL_COMPLETE,
    360         notes = "tests for specific tables. test fails: invalid nullable value.",
    361         method = "getColumns",
    362         args = {java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class}
    363     )
    364     @KnownFailure("Wildcard operator does not seem wo work correctly.")
    365     public void test_getColumnsSpecific() throws SQLException {
    366         String[] tablesName = {
    367                 DatabaseCreator.TEST_TABLE1, DatabaseCreator.TEST_TABLE3};
    368         String[] fields = {"id", "field1", "field2", "field3", "fkey"};
    369         String[] nullable = {"YES", "NO",""};
    370         int[] nullableInt = {
    371                 DatabaseMetaData.columnNoNulls,
    372                 DatabaseMetaData.columnNullable,
    373                 DatabaseMetaData.columnNullableUnknown};
    374         Arrays.sort(tablesName);
    375         Arrays.sort(fields);
    376         Arrays.sort(nullableInt);
    377         Arrays.sort(nullable);
    378         int countSingle = 0;
    379         int countAll1 = 0;
    380         int countAll2 = 0;
    381 
    382         try {
    383             ResultSet rs = meta.getColumns(null, null,
    384                     DatabaseCreator.TEST_TABLE1, "%");
    385 
    386             while (rs.next()) {
    387                 assertTrue("Invalid table name", Arrays.binarySearch(
    388                         tablesName, rs.getString("TABLE_NAME")) > -1);
    389                 assertTrue("Invalid field name", Arrays.binarySearch(fields, rs
    390                         .getString("COLUMN_NAME")) > -1);
    391                 assertTrue("Invalid nullable value", Arrays.binarySearch(
    392                         nullable, rs.getString("IS_NULLABLE")) > -1);
    393                 assertTrue("Invalid nullable code", Arrays.binarySearch(
    394                         nullableInt, rs.getInt("NULLABLE")) > -1);
    395                 countSingle++;
    396             }
    397             assertEquals("Not all results are found", 5, countSingle);
    398             rs.close();
    399 
    400         } catch (SQLException e) {
    401             fail("Unexpected exception: " + e.getMessage());
    402         }
    403 
    404         try {
    405             ResultSet rs = meta.getColumns(null, null, "%"+DatabaseCreator.CREATE_TABLE1.substring(0, 3)+"%","%" );
    406             while (rs.next()) {
    407                 assertTrue("Wrong table name", Arrays.binarySearch(tablesName,
    408                         rs.getString("TABLE_NAME")) > -1);
    409                 countAll1++;
    410             }
    411             assertEquals("Not all results are found", 6, countAll1);
    412             rs.close();
    413 
    414         } catch (SQLException e) {
    415             fail("Unexpected exception: " + e.getMessage());
    416         }
    417 
    418         try {
    419             ResultSet rs = meta.getColumns(null, null, "%TEST_%", "%");
    420 
    421             while (rs.next()) {
    422                 assertTrue("Wrong table name", Arrays.binarySearch(tablesName,
    423                         rs.getString("TABLE_NAME")) > -1);
    424                 countAll2++;
    425             }
    426             assertEquals("Not all results are found", 6, countAll2);
    427             rs.close();
    428 
    429         } catch (SQLException e) {
    430             fail("Unexpected exception: " + e.getMessage());
    431         }
    432 
    433      // Exception checking
    434         conn.close();
    435 
    436         try {
    437             meta.getColumns(null, null,
    438                     DatabaseCreator.TEST_TABLE1, "%");
    439             fail("SQLException not thrown");
    440         } catch (SQLException e) {
    441             // ok
    442         }
    443 
    444 
    445     }
    446 
    447 
    448 
    449     /**
    450      * @tests java.sql.DatabaseMetaData#getConnection()
    451      */
    452     @TestTargetNew(
    453         level = TestLevel.COMPLETE,
    454         notes = "SQLException checking test fails",
    455         method = "getConnection",
    456         args = {}
    457     )
    458     public void test_getConnection() throws SQLException {
    459         assertEquals("Incorrect connection value", conn, meta.getConnection());
    460 
    461         // Exception checking
    462         conn.close();
    463 
    464         try {
    465             Connection con = meta.getConnection();
    466             assertTrue(con.isClosed());
    467         } catch (SQLException e) {
    468             // ok
    469         }
    470     }
    471 
    472     /**
    473      * @tests java.sql.DatabaseMetaData #getCrossReference(java.lang.String,
    474      *        java.lang.String, java.lang.String, java.lang.String,
    475      *        java.lang.String, java.lang.String)
    476      */
    477     @TestTargetNew(
    478         level = TestLevel.COMPLETE,
    479         notes = "Test fails: Foreign keys not supported",
    480         method = "getCrossReference",
    481         args = {java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class}
    482     )
    483     @KnownFailure("(Ticket 91) Tables apply foreign key constraint. Catalogs not supported")
    484     public void test_getCrossReferenceLjava_lang_StringLjava_lang_StringLjava_lang_StringLjava_lang_StringLjava_lang_StringLjava_lang_String()
    485             throws SQLException {
    486         ResultSet rs = meta.getCrossReference(conn.getCatalog(), null,
    487                 DatabaseCreator.TEST_TABLE3, conn.getCatalog(), null,
    488                 DatabaseCreator.TEST_TABLE1);
    489         ResultSetMetaData rsmd = rs.getMetaData();
    490         assertTrue("Rows do not obtained", rs.next());
    491         int col = rsmd.getColumnCount();
    492         assertEquals("Incorrect number of columns", 14, col);
    493         String[] columnNames = { "PKTABLE_CAT", "PKTABLE_SCHEM",
    494                 "PKTABLE_NAME", "PKCOLUMN_NAME", "FKTABLE_CAT",
    495                 "FKTABLE_SCHEM", "FKTABLE_NAME", "FKCOLUMN_NAME", "KEY_SEQ",
    496                 "UPDATE_RULE", "DELETE_RULE", "FK_NAME", "PK_NAME",
    497                 "DEFERRABILITY" };
    498         for (int c = 1; c <= col; ++c) {
    499             assertEquals("Incorrect column name", columnNames[c - 1], rsmd
    500                     .getColumnName(c));
    501         }
    502 //      TODO getCatalog is not supported
    503         assertEquals("Incorrect primary key table catalog", conn.getCatalog(),
    504                 rs.getString("PKTABLE_CAT"));
    505         assertEquals("Incorrect primary key table schema", "", rs
    506                 .getString("PKTABLE_SCHEM"));
    507         assertEquals("Incorrect primary key table name",
    508                 DatabaseCreator.TEST_TABLE3, rs.getString("PKTABLE_NAME"));
    509         assertEquals("Incorrect primary key column name", "fkey", rs
    510                 .getString("PKCOLUMN_NAME"));
    511         // TODO getCatalog is not supported
    512         assertEquals("Incorrect foreign key table catalog", conn.getCatalog(),
    513                 rs.getString("FKTABLE_CAT"));
    514         assertEquals("Incorrect foreign key table schema", "", rs
    515                 .getString("FKTABLE_SCHEM"));
    516         assertEquals("Incorrect foreign key table name",
    517                 DatabaseCreator.TEST_TABLE1, rs.getString("FKTABLE_NAME"));
    518         assertEquals("Incorrect foreign key column name", "fk", rs
    519                 .getString("FKCOLUMN_NAME"));
    520         assertEquals("Incorrect sequence number within foreign key", 1, rs
    521                 .getShort("KEY_SEQ"));
    522         assertEquals("Incorrect update rule value",
    523                 DatabaseMetaData.importedKeyNoAction, rs
    524                         .getShort("UPDATE_RULE"));
    525         assertEquals("Incorrect delete rule value",
    526                 DatabaseMetaData.importedKeyNoAction, rs
    527                         .getShort("DELETE_RULE"));
    528         assertNull("Incorrect foreign key name", rs.getString("FK_NAME"));
    529         assertNull("Incorrect primary key name", rs.getString("PK_NAME"));
    530         assertEquals("Incorrect deferrability",
    531                 DatabaseMetaData.importedKeyNotDeferrable, rs
    532                         .getShort("DEFERRABILITY"));
    533         rs.close();
    534 
    535      // Exception checking
    536         conn.close();
    537 
    538         try {
    539             meta.getCrossReference(conn.getCatalog(), null,
    540                     DatabaseCreator.TEST_TABLE3, conn.getCatalog(), null,
    541                     DatabaseCreator.TEST_TABLE1);
    542             fail("SQLException not thrown");
    543         } catch (SQLException e) {
    544             // ok
    545         }
    546 
    547         // Exception checking
    548         conn.close();
    549 
    550         try {
    551             meta.getCrossReference(conn.getCatalog(), null,
    552                     DatabaseCreator.TEST_TABLE3, conn.getCatalog(), null,
    553                     DatabaseCreator.TEST_TABLE1);
    554             fail("SQLException not thrown");
    555         } catch (SQLException e) {
    556             // ok
    557         }
    558     }
    559 
    560     /**
    561      * @tests java.sql.DatabaseMetaData#getDatabaseMajorVersion()
    562      */
    563     @TestTargetNew(
    564         level = TestLevel.COMPLETE,
    565         notes = "SQLException checking test fails",
    566         method = "getDatabaseMajorVersion",
    567         args = {}
    568     )
    569     @KnownFailure("Ticket 98")
    570     public void test_getDatabaseMajorVersion() throws SQLException {
    571         assertTrue("Incorrdct database major version", meta
    572                 .getDatabaseMajorVersion() >= 0);
    573 
    574         // Exception checking
    575         conn.close();
    576 
    577         try {
    578             meta.getDatabaseMajorVersion();
    579             fail("SQLException not thrown");
    580         } catch (SQLException e) {
    581             // ok
    582         }
    583 
    584     }
    585 
    586     /**
    587      * @tests java.sql.DatabaseMetaData#getDatabaseMinorVersion()
    588      */
    589     @TestTargetNew(
    590         level = TestLevel.COMPLETE,
    591         notes = "SQLException checking test fails",
    592         method = "getDatabaseMinorVersion",
    593         args = {}
    594     )
    595     @KnownFailure("Ticket 98")
    596     public void test_getDatabaseMinorVersion() throws SQLException {
    597         assertTrue("Incorrect database minor version", meta
    598                 .getDatabaseMinorVersion() >= 0);
    599 
    600      // Exception checking
    601         conn.close();
    602 
    603         try {
    604             meta.getDatabaseMinorVersion();
    605             fail("SQLException not thrown");
    606         } catch (SQLException e) {
    607             // ok
    608         }
    609     }
    610 
    611     /**
    612      * @tests java.sql.DatabaseMetaData#getDatabaseProductName()
    613      */
    614     @TestTargetNew(
    615         level = TestLevel.COMPLETE,
    616         notes = "SQLException checking test fails",
    617         method = "getDatabaseProductName",
    618         args = {}
    619     )
    620     @KnownFailure("Ticket 98")
    621     public void test_getDatabaseProductName() throws SQLException {
    622         assertTrue("Incorrect database product name", !"".equals(meta
    623                 .getDatabaseProductName().trim()));
    624 
    625         // Exception checking
    626         conn.close();
    627 
    628         try {
    629             meta.getDatabaseProductName();
    630             fail("SQLException not thrown");
    631         } catch (SQLException e) {
    632             // ok
    633         }
    634 
    635     }
    636 
    637     /**
    638      * @tests java.sql.DatabaseMetaData#getDatabaseProductVersion()
    639      */
    640     @TestTargetNew(
    641         level = TestLevel.COMPLETE,
    642         notes = "SQLException checking test fails",
    643         method = "getDatabaseProductVersion",
    644         args = {}
    645     )
    646     @KnownFailure("Ticket 98")
    647     public void test_getDatabaseProductVersion() throws SQLException {
    648         assertTrue("Incorrect database product version", !"".equals(meta
    649                 .getDatabaseProductVersion().trim()));
    650         // Exception checking
    651         conn.close();
    652 
    653         try {
    654             meta.getDatabaseProductVersion();
    655             fail("SQLException not thrown");
    656         } catch (SQLException e) {
    657             // ok
    658         }
    659     }
    660 
    661     /**
    662      * @tests java.sql.DatabaseMetaData#getDefaultTransactionIsolation()
    663      */
    664     @TestTargetNew(
    665         level = TestLevel.COMPLETE,
    666         notes = "SQLException checking test fails",
    667         method = "getDefaultTransactionIsolation",
    668         args = {}
    669     )
    670     @KnownFailure("Ticket 98")
    671     public void test_getDefaultTransactionIsolation() throws SQLException {
    672         int defaultLevel = meta.getDefaultTransactionIsolation();
    673         switch (defaultLevel) {
    674         case Connection.TRANSACTION_NONE:
    675         case Connection.TRANSACTION_READ_COMMITTED:
    676         case Connection.TRANSACTION_READ_UNCOMMITTED:
    677         case Connection.TRANSACTION_REPEATABLE_READ:
    678         case Connection.TRANSACTION_SERIALIZABLE:
    679             // these levels are OK
    680             break;
    681         default:
    682             fail("Incorrect value of default transaction isolation level");
    683         }
    684 
    685         // Exception checking
    686         conn.close();
    687 
    688         try {
    689             meta.getDefaultTransactionIsolation();
    690             fail("SQLException not thrown");
    691         } catch (SQLException e) {
    692             // ok
    693         }
    694     }
    695 
    696     /**
    697      * @tests java.sql.DatabaseMetaData#getDriverMajorVersion()
    698      */
    699     @TestTargetNew(
    700         level = TestLevel.COMPLETE,
    701         notes = "",
    702         method = "getDriverMajorVersion",
    703         args = {}
    704     )
    705     public void test_getDriverMajorVersion()  throws SQLException {
    706         assertTrue("Incorrect driver major version", meta
    707                 .getDriverMajorVersion() >= 0);
    708     }
    709 
    710     /**
    711      * @tests java.sql.DatabaseMetaData#getDriverMinorVersion()
    712      */
    713     @TestTargetNew(
    714         level = TestLevel.COMPLETE,
    715         notes = "",
    716         method = "getDriverMinorVersion",
    717         args = {}
    718     )
    719     public void test_getDriverMinorVersion() {
    720         assertTrue("Incorrect driver minor version", meta
    721                 .getDriverMinorVersion() >= 0);
    722     }
    723 
    724     /**
    725      * @tests java.sql.DatabaseMetaData#getDriverName()
    726      */
    727     @TestTargetNew(
    728         level = TestLevel.COMPLETE,
    729         notes = "SQLException checking test fails",
    730         method = "getDriverName",
    731         args = {}
    732     )
    733     @KnownFailure("Ticket 98")
    734     public void test_getDriverName() throws SQLException {
    735         String driverName = meta.getDriverName();
    736         assertTrue("Incorrect driver name", driverName.trim().startsWith(
    737                 "SQLite"));
    738 
    739         // Exception checking
    740         conn.close();
    741 
    742         try {
    743             meta.getDriverName();
    744             fail("SQLException not thrown");
    745         } catch (SQLException e) {
    746             // ok
    747         }
    748     }
    749 
    750     /**
    751      * @tests java.sql.DatabaseMetaData#getDriverVersion()
    752      */
    753     @TestTargetNew(
    754         level = TestLevel.COMPLETE,
    755         notes = "",
    756         method = "getDriverVersion",
    757         args = {}
    758     )
    759     @KnownFailure("Ticket 98")
    760     public void test_getDriverVersion() throws SQLException {
    761         assertTrue("Incorrect driver version", !"".equals(meta
    762                 .getDriverVersion().trim()));
    763 
    764       //Exception checking
    765         conn.close();
    766 
    767          try {
    768              meta.getDriverVersion();
    769              fail("SQLException not thrown");
    770          } catch (SQLException e) {
    771              //ok
    772          }
    773 
    774     }
    775 
    776 
    777     /**
    778      * @tests java.sql.DatabaseMetaData #getImportedKeys(java.lang.String,
    779      *        java.lang.String, java.lang.String)
    780      */
    781     @TestTargetNew(
    782         level = TestLevel.NOT_FEASIBLE,
    783         notes = "Test fails: Keys are not supported",
    784         method = "getImportedKeys",
    785         args = {java.lang.String.class, java.lang.String.class, java.lang.String.class}
    786     )
    787     @KnownFailure("Keys are not supported: Ticket 91")
    788     public void test_getImportedKeysLjava_lang_StringLjava_lang_StringLjava_lang_String()
    789             throws SQLException {
    790         ResultSet rs = meta.getImportedKeys(conn.getCatalog(), null,
    791                 DatabaseCreator.TEST_TABLE1);
    792         ResultSetMetaData rsmd = rs.getMetaData();
    793         assertTrue("Rows do not obtained", rs.next());
    794         int col = rsmd.getColumnCount();
    795         assertEquals("Incorrect number of columns", 14, col);
    796         String[] columnNames = { "PKTABLE_CAT", "PKTABLE_SCHEM",
    797                 "PKTABLE_NAME", "PKCOLUMN_NAME", "FKTABLE_CAT",
    798                 "FKTABLE_SCHEM", "FKTABLE_NAME", "FKCOLUMN_NAME", "KEY_SEQ",
    799                 "UPDATE_RULE", "DELETE_RULE", "FK_NAME", "PK_NAME",
    800                 "DEFERRABILITY" };
    801         for (int c = 1; c <= col; ++c) {
    802             assertEquals("Incorrect column name", columnNames[c - 1], rsmd
    803                     .getColumnName(c));
    804         }
    805 //      TODO getCatalog is not supported
    806         assertEquals("Incorrect primary key table catalog", conn.getCatalog(),
    807                 rs.getString("PKTABLE_CAT"));
    808         assertEquals("Incorrect primary key table schema", "", rs
    809                 .getString("PKTABLE_SCHEM"));
    810         assertEquals("Incorrect primary key table name",
    811                 DatabaseCreator.TEST_TABLE3, rs.getString("PKTABLE_NAME"));
    812         assertEquals("Incorrect primary key column name", "fkey", rs
    813                 .getString("PKCOLUMN_NAME"));
    814         assertEquals("Incorrect foreign key table catalog", conn.getCatalog(),
    815                 rs.getString("FKTABLE_CAT"));
    816         assertEquals("Incorrect foreign key table schema", "", rs
    817                 .getString("FKTABLE_SCHEM"));
    818         assertEquals("Incorrect foreign key table name",
    819                 DatabaseCreator.TEST_TABLE1, rs.getString("FKTABLE_NAME"));
    820         assertEquals("Incorrect foreign key column name", "fk", rs
    821                 .getString("FKCOLUMN_NAME"));
    822         assertEquals("Incorrect sequence number within foreign key", 1, rs
    823                 .getShort("KEY_SEQ"));
    824         assertEquals("Incorrect update rule value",
    825                 DatabaseMetaData.importedKeyNoAction, rs
    826                         .getShort("UPDATE_RULE"));
    827         assertEquals("Incorrect delete rule value",
    828                 DatabaseMetaData.importedKeyNoAction, rs
    829                         .getShort("DELETE_RULE"));
    830  //       assertNotNull("Incorrect foreign key name", rs.getString("FK_NAME"));
    831         assertEquals("Incorrect primary key name", null, rs
    832                 .getString("PK_NAME"));
    833         assertEquals("Incorrect deferrability",
    834                 DatabaseMetaData.importedKeyNotDeferrable, rs
    835                         .getShort("DEFERRABILITY"));
    836         rs.close();
    837 
    838       //Exception checking
    839         conn.close();
    840 
    841          try {
    842              meta.getImportedKeys(conn.getCatalog(), null,
    843                      DatabaseCreator.TEST_TABLE1);
    844              fail("SQLException not thrown");
    845          } catch (SQLException e) {
    846              //ok
    847          }
    848     }
    849 
    850     /**
    851      * @tests java.sql.DatabaseMetaData#getMaxCursorNameLength()
    852      */
    853     @TestTargetNew(
    854         level = TestLevel.COMPLETE,
    855         notes = "",
    856         method = "getMaxCursorNameLength",
    857         args = {}
    858     )
    859     public void test_getMaxCursorNameLength() throws SQLException {
    860         int nameLength = meta.getMaxCursorNameLength();
    861         if (nameLength > 0) {
    862             try {
    863                 statement.setCursorName(new String(new byte[nameLength + 1]));
    864                 fail("Expected SQLException was not thrown");
    865             } catch (SQLException e) {
    866                 // expected
    867             }
    868         } else if (nameLength < 0) {
    869             fail("Incorrect length of cursor name");
    870         }
    871     }
    872 
    873     /**
    874      * @tests java.sql.DatabaseMetaData#getJDBCMinorVersion()
    875      */
    876     @TestTargetNew(
    877         level = TestLevel.COMPLETE,
    878         notes = "SQLException checking test fails",
    879         method = "getJDBCMinorVersion",
    880         args = {}
    881     )
    882     @KnownFailure("Ticket 98")
    883     public void test_getJDBCMinorVersion() throws SQLException {
    884         assertTrue("Incorrect JDBC minor version",
    885                 meta.getJDBCMinorVersion() >= 0);
    886 
    887       //Exception checking
    888         conn.close();
    889 
    890          try {
    891              meta.getJDBCMinorVersion();
    892              fail("SQLException not thrown");
    893          } catch (SQLException e) {
    894              //ok
    895          }
    896 
    897     }
    898 
    899     /**
    900      * @tests java.sql.DatabaseMetaData#getJDBCMajorVersion()
    901      */
    902     @TestTargetNew(
    903         level = TestLevel.COMPLETE,
    904         notes = "SQLException checking test fails",
    905         method = "getJDBCMajorVersion",
    906         args = {}
    907     )
    908     @KnownFailure("Ticket 98")
    909     public void test_getJDBCMajorVersion() throws SQLException {
    910         assertTrue("Incorrect JDBC major version",
    911                 meta.getJDBCMajorVersion() >= 0);
    912 
    913       //Exception checking
    914         conn.close();
    915 
    916          try {
    917              meta.getJDBCMajorVersion();
    918              fail("SQLException not thrown");
    919          } catch (SQLException e) {
    920              //ok
    921          }
    922 
    923     }
    924 
    925 
    926     /**
    927      * @tests java.sql.DatabaseMetaData#getNumericFunctions()
    928      */
    929     @TestTargetNew(
    930         level = TestLevel.SUFFICIENT,
    931         notes = "Test fails. Not implemented correctly. SQLException checking test fails",
    932         method = "getNumericFunctions",
    933         args = {}
    934     )
    935     @KnownFailure("Not supported feature, Ticket 98. Broken because "+
    936             "NUMERIC_FUNCTIONS not complete. When fixed change to @KnownFailure")
    937     public void test_getNumericFunctions() throws SQLException {
    938         escapedFunctions(NUMERIC_FUNCTIONS, meta.getNumericFunctions());
    939 
    940 
    941       //Exception checking
    942         conn.close();
    943 
    944          try {
    945              meta.getNumericFunctions();
    946              fail("SQLException not thrown");
    947          } catch (SQLException e) {
    948              //ok
    949          }
    950 
    951     }
    952 
    953     /**
    954      * @tests java.sql.DatabaseMetaData #getPrimaryKeys(java.lang.String,
    955      *        java.lang.String, java.lang.String)
    956      */
    957     @TestTargetNew(
    958         level = TestLevel.SUFFICIENT,
    959         notes = "Functionality test fails: keys and catalogs are not supported.",
    960         method = "getPrimaryKeys",
    961         args = {java.lang.String.class, java.lang.String.class, java.lang.String.class}
    962     )
    963     @KnownFailure(" Ticket 91 : relies on not supported features: getCatalog, keys")
    964     public void test_getPrimaryKeysLjava_lang_StringLjava_lang_StringLjava_lang_String()
    965             throws SQLException {
    966         ResultSet rs = meta.getPrimaryKeys(conn.getCatalog(), null,
    967                 DatabaseCreator.TEST_TABLE1);
    968         ResultSetMetaData rsmd = rs.getMetaData();
    969         assertTrue("Rows not obtained", rs.next());
    970         int col = rsmd.getColumnCount();
    971         assertEquals("Incorrect number of columns", 6, col);
    972         String[] columnNames = { "TABLE_CAT", "TABLE_SCHEM", "TABLE_NAME",
    973                 "COLUMN_NAME", "KEY_SEQ", "PK_NAME" };
    974         for (int c = 1; c <= col; ++c) {
    975             assertEquals("Incorrect column name", columnNames[c - 1], rsmd
    976                     .getColumnName(c));
    977         }
    978         assertEquals("Incorrect table catalogue", conn.getCatalog(), rs
    979                 .getString("TABLE_CAT").toLowerCase());
    980         assertEquals("Incorrect table schema", "", rs
    981                 .getString("TABLE_SCHEM"));
    982         assertEquals("Incorrect table name", DatabaseCreator.TEST_TABLE1, rs
    983                 .getString("TABLE_NAME").toLowerCase());
    984         assertEquals("Incorrect column name", "id", rs.getString("COLUMN_NAME")
    985                 .toLowerCase());
    986         assertEquals("Incorrect sequence number", 1, rs.getShort("KEY_SEQ"));
    987         assertEquals("Incorrect primary key name", "primary", rs.getString(
    988                 "PK_NAME").toLowerCase());
    989         rs.close();
    990 
    991       //Exception checking
    992         conn.close();
    993 
    994          try {
    995              meta.getPrimaryKeys(conn.getCatalog(), null,
    996                      DatabaseCreator.TEST_TABLE1);
    997              fail("SQLException not thrown");
    998          } catch (SQLException e) {
    999              //ok
   1000          }
   1001     }
   1002 
   1003     /**
   1004      * @tests java.sql.DatabaseMetaData#getResultSetHoldability()
   1005      */
   1006     @TestTargetNew(
   1007         level = TestLevel.COMPLETE,
   1008         notes = "SQLException checking test fails",
   1009         method = "getResultSetHoldability",
   1010         args = {}
   1011     )
   1012     @KnownFailure("Ticket 98")
   1013     public void test_getResultSetHoldability() throws SQLException {
   1014         int hdb = meta.getResultSetHoldability();
   1015         switch (hdb) {
   1016         case ResultSet.HOLD_CURSORS_OVER_COMMIT:
   1017         case ResultSet.CLOSE_CURSORS_AT_COMMIT:
   1018             // these holdabilities are OK
   1019             break;
   1020         default:
   1021             fail("Incorrect value of holdability");
   1022         }
   1023         assertFalse("Incorrect result set holdability", meta
   1024                 .supportsResultSetHoldability(hdb));
   1025 
   1026       //Exception checking
   1027         conn.close();
   1028 
   1029          try {
   1030              meta.getResultSetHoldability();
   1031              fail("SQLException not thrown");
   1032          } catch (SQLException e) {
   1033              //ok
   1034          }
   1035 
   1036     }
   1037 
   1038     /**
   1039      * @tests java.sql.DatabaseMetaData#getSQLKeywords()
   1040      */
   1041     @TestTargetNew(
   1042         level = TestLevel.COMPLETE,
   1043         notes = "SQLException checking test fails",
   1044         method = "getSQLKeywords",
   1045         args = {}
   1046     )
   1047     @KnownFailure("Ticket 98")
   1048     public void test_getSQLKeywords() throws SQLException {
   1049         assertTrue("Incorrect SQL keywords", !"".equals(meta.getSQLKeywords()
   1050                 .trim()));
   1051 
   1052       //Exception checking
   1053         conn.close();
   1054 
   1055          try {
   1056              meta.getSQLKeywords();
   1057              fail("SQLException not thrown");
   1058          } catch (SQLException e) {
   1059              //ok
   1060          }
   1061 
   1062     }
   1063 
   1064     /**
   1065      * @tests java.sql.DatabaseMetaData#getSQLStateType()
   1066      */
   1067     @TestTargetNew(
   1068         level = TestLevel.COMPLETE,
   1069         notes = "SQLException checking test fails",
   1070         method = "getSQLStateType",
   1071         args = {}
   1072     )
   1073     @KnownFailure("Ticket 98")
   1074     public void test_getSQLStateType() throws SQLException {
   1075         int type = meta.getSQLStateType();
   1076         switch (type) {
   1077         case DatabaseMetaData.sqlStateSQL99:
   1078         case DatabaseMetaData.sqlStateXOpen:
   1079             // these types are OK
   1080             break;
   1081         default:
   1082             fail("Incorrect SQL state types");
   1083         }
   1084 
   1085 
   1086       //Exception checking
   1087         conn.close();
   1088 
   1089          try {
   1090              meta.getSQLStateType();
   1091              fail("SQLException not thrown");
   1092          } catch (SQLException e) {
   1093              //ok
   1094          }
   1095 
   1096     }
   1097 
   1098     /**
   1099      * @tests java.sql.DatabaseMetaData#getSchemas()
   1100      */
   1101     @TestTargetNew(
   1102         level = TestLevel.PARTIAL_COMPLETE,
   1103         notes = "SQLException checking test fails",
   1104         method = "getSchemas",
   1105         args = {}
   1106     )
   1107     @KnownFailure("Ticket 98")
   1108     public void test_getSchemas() throws SQLException {
   1109         ResultSet rs = meta.getSchemas();
   1110         ResultSetMetaData rsmd = rs.getMetaData();
   1111         assertTrue("Rows do not obtained", rs.next());
   1112         int col = rsmd.getColumnCount();
   1113         assertEquals("Incorrect number of columns", 1, col);
   1114         String[] columnNames = { "TABLE_SCHEM", "TABLE_CATALOG" };
   1115         for (int c = 1; c <= col; ++c) {
   1116             assertEquals("Incorrect column name", columnNames[c - 1], rsmd
   1117                     .getColumnName(c));
   1118         }
   1119         rs.close();
   1120 
   1121 
   1122       //Exception checking
   1123         conn.close();
   1124 
   1125          try {
   1126              meta.getSchemas();
   1127              fail("SQLException not thrown");
   1128          } catch (SQLException e) {
   1129              //ok
   1130          }
   1131 
   1132     }
   1133 
   1134     /**
   1135      * @tests java.sql.DatabaseMetaData#getSearchStringEscape()
   1136      */
   1137     @TestTargetNew(
   1138         level = TestLevel.COMPLETE,
   1139         notes = "SQLException checking test fails",
   1140         method = "getSearchStringEscape",
   1141         args = {}
   1142     )
   1143     @KnownFailure("Ticket 98")
   1144     public void test_getSearchStringEscape() throws SQLException {
   1145         assertTrue("Incorrect search string escape", !"".equals(meta
   1146                 .getSearchStringEscape().trim()));
   1147 
   1148       //Exception checking
   1149         conn.close();
   1150 
   1151          try {
   1152              meta.getSearchStringEscape();
   1153              fail("SQLException not thrown");
   1154          } catch (SQLException e) {
   1155              //ok
   1156          }
   1157 
   1158     }
   1159 
   1160     /**
   1161      * @tests java.sql.DatabaseMetaData#getStringFunctions()
   1162      */
   1163     @TestTargetNew(
   1164         level = TestLevel.COMPLETE,
   1165         notes = "Functionality test fails. SQLException checking test fails",
   1166         method = "getStringFunctions",
   1167         args = {}
   1168     )
   1169     @KnownFailure("not supported")
   1170     public void test_getStringFunctions() throws SQLException {
   1171         escapedFunctions(STRING_FUNCTIONS, meta.getStringFunctions());
   1172 
   1173 
   1174       //Exception checking
   1175         conn.close();
   1176 
   1177          try {
   1178              meta.getStringFunctions();
   1179              fail("SQLException not thrown");
   1180          } catch (SQLException e) {
   1181              //ok
   1182          }
   1183 
   1184 
   1185     }
   1186 
   1187 
   1188     /**
   1189      * @tests java.sql.DatabaseMetaData#getSystemFunctions()
   1190      */
   1191     @TestTargetNew(
   1192         level = TestLevel.COMPLETE,
   1193         notes = "Functionality test fails. SQLException checking test fails",
   1194         method = "getSystemFunctions",
   1195         args = {}
   1196     )
   1197     @KnownFailure("not supported")
   1198     public void test_getSystemFunctions() throws SQLException {
   1199         escapedFunctions(SYSTEM_FUNCTIONS, meta.getSystemFunctions());
   1200 
   1201 
   1202       //Exception checking
   1203         conn.close();
   1204 
   1205          try {
   1206              meta.getSystemFunctions();
   1207              fail("SQLException not thrown");
   1208          } catch (SQLException e) {
   1209              //ok
   1210          }
   1211 
   1212     }
   1213 
   1214 
   1215     /**
   1216      * @tests java.sql.DatabaseMetaData#getTableTypes()
   1217      */
   1218     @TestTargetNew(
   1219         level = TestLevel.COMPLETE,
   1220         notes = "SQLException checking test fails",
   1221         method = "getTableTypes",
   1222         args = {}
   1223     )
   1224     @KnownFailure("Ticket 98")
   1225     public void test_getTableTypes() throws SQLException {
   1226         String[] tableTypes = { "LOCAL TEMPORARY", "TABLE", "VIEW" };
   1227         ResultSet rs = meta.getTableTypes();
   1228 
   1229         while (rs.next()) {
   1230             assertTrue("Wrong table type", Arrays.binarySearch(tableTypes, rs
   1231                     .getString("TABLE_TYPE")) > -1);
   1232         }
   1233         rs.close();
   1234 
   1235 
   1236       //Exception checking
   1237         conn.close();
   1238 
   1239          try {
   1240              meta.getTableTypes();
   1241              fail("SQLException not thrown");
   1242          } catch (SQLException e) {
   1243              //ok
   1244          }
   1245 
   1246     }
   1247 
   1248     /**
   1249      * @tests java.sql.DatabaseMetaData #getTables(java.lang.String,
   1250      *        java.lang.String, java.lang.String, java.lang.String[])
   1251      */
   1252     @TestTargetNew(
   1253         level = TestLevel.COMPLETE,
   1254         notes = "Test fails.",
   1255         method = "getTables",
   1256         args = {java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String[].class}
   1257     )
   1258     @KnownFailure("If no schema is associated: returns empty string where actually null be returned?. Ticket 98")
   1259     public void test_getTablesLjava_lang_StringLjava_lang_StringLjava_lang_String$Ljava_lang_String()
   1260             throws SQLException {
   1261         String[] tablesName = {
   1262                 VIEW_NAME, DatabaseCreator.TEST_TABLE1,
   1263                 DatabaseCreator.TEST_TABLE3};
   1264         String[] tablesType = {"TABLE", "VIEW"};
   1265         Arrays.sort(tablesName);
   1266         Arrays.sort(tablesType);
   1267 
   1268         // case 1. get all tables. There are two tables and one view in the
   1269         // database
   1270         ResultSet rs = meta.getTables(null, null, null, null);
   1271         while (rs.next()) {
   1272             assertTrue("Wrong table name", Arrays.binarySearch(tablesName, rs
   1273                     .getString("TABLE_NAME")) > -1);
   1274         //No Schema associated
   1275             assertNull("Wrong table schema: "+rs.getString("TABLE_SCHEM"), rs.getString("TABLE_SCHEM"));
   1276             assertTrue("Wrong table type", Arrays.binarySearch(tablesType, rs
   1277                     .getString("TABLE_TYPE")) > -1);
   1278             assertEquals("Wrong parameter REMARKS", "", rs.getString("REMARKS"));
   1279         }
   1280         rs.close();
   1281 
   1282         // case 2. get tables with specified types. There are no tables of such
   1283         // types
   1284         rs = meta.getTables(conn.getCatalog(), null, null, new String[] {
   1285                 "SYSTEM TABLE", "LOCAL TEMPORARY" });
   1286         assertFalse("Some tables exist", rs.next());
   1287         rs.close();
   1288 
   1289         // case 3. get tables with specified types. There is a table of such
   1290         // types
   1291         rs = meta.getTables(conn.getCatalog(), null, null, new String[] {
   1292                 "VIEW", "LOCAL TEMPORARY" });
   1293 
   1294         assertTrue("No tables exist", rs.next());
   1295         assertEquals("Wrong table name", VIEW_NAME, rs.getString("TABLE_NAME"));
   1296         assertNull("Wrong table schema: "+rs.getString("TABLE_SCHEM"), rs.getString("TABLE_SCHEM"));
   1297         assertEquals("Wrong table type", "VIEW", rs.getString("TABLE_TYPE"));
   1298         assertEquals("Wrong parameter REMARKS", "", rs.getString("REMARKS"));
   1299         assertFalse("Wrong size of result set", rs.next());
   1300         assertFalse("Some tables exist", rs.next());
   1301         rs.close();
   1302 
   1303         // case 4. get all tables using tables pattern.
   1304         // There are two tables and one view in the database
   1305         rs = meta.getTables(null, null, "%", null);
   1306 
   1307         while (rs.next()) {
   1308             assertTrue("Wrong table name", Arrays.binarySearch(tablesName, rs
   1309                     .getString("TABLE_NAME")) > -1);
   1310             assertNull("Wrong table schema ", rs.getString("TABLE_SCHEM"));
   1311             assertTrue("Wrong table type", Arrays.binarySearch(tablesType, rs
   1312                     .getString("TABLE_TYPE")) > -1);
   1313             assertEquals("Wrong parameter REMARKS", "", rs.getString("REMARKS"));
   1314         }
   1315         rs.close();
   1316 
   1317 
   1318       //Exception checking
   1319         conn.close();
   1320 
   1321          try {
   1322              meta.getTables(null, null, null, null);
   1323              fail("SQLException not thrown");
   1324          } catch (SQLException e) {
   1325              //ok
   1326          }
   1327 
   1328     }
   1329 
   1330     /**
   1331      * @tests java.sql.DatabaseMetaData#getTimeDateFunctions()
   1332      */
   1333     @TestTargetNew(
   1334         level = TestLevel.COMPLETE,
   1335         notes = "Does not return any functions. test fails. SQLException checking test fails",
   1336         method = "getTimeDateFunctions",
   1337         args = {}
   1338     )
   1339     @KnownFailure("not supported")
   1340     public void test_getTimeDateFunctions() throws SQLException {
   1341 
   1342         escapedFunctions(TIMEDATE_FUNCTIONS, meta.getTimeDateFunctions());
   1343 
   1344 
   1345       //Exception checking
   1346         conn.close();
   1347 
   1348          try {
   1349              meta.getTimeDateFunctions();
   1350              fail("SQLException not thrown");
   1351          } catch (SQLException e) {
   1352              //ok
   1353          }
   1354     }
   1355 
   1356     /**
   1357      * @tests java.sql.DatabaseMetaData#getTypeInfo()
   1358      */
   1359     @TestTargetNew(
   1360         level = TestLevel.COMPLETE,
   1361         notes = "SQLException checking test fails",
   1362         method = "getTypeInfo",
   1363         args = {}
   1364     )
   1365     @KnownFailure("not supported")
   1366     public void test_getTypeInfo() throws SQLException {
   1367         insertNewRecord();
   1368 
   1369         ResultSet rs = meta.getTypeInfo();
   1370 
   1371         final String[] names = { "TYPE_NAME", "DATA_TYPE", "PRECISION",
   1372                 "LITERAL_PREFIX", "LITERAL_SUFFIX", "CREATE_PARAMS",
   1373                 "NULLABLE", "CASE_SENSITIVE", "SEARCHABLE",
   1374                 "UNSIGNED_ATTRIBUTE", "FIXED_PREC_SCALE", "AUTO_INCREMENT",
   1375                 "LOCAL_TYPE_NAME", "MINIMUM_SCALE", "MAXIMUM_SCALE",
   1376                 "SQL_DATA_TYPE", "SQL_DATETIME_SUB", "NUM_PREC_RADIX" };
   1377         Arrays.sort(names);
   1378 
   1379         for (int i = 0; i < rs.getMetaData().getColumnCount(); i++) {
   1380             assertTrue("wrong column was return", Arrays.binarySearch(names, rs
   1381                     .getMetaData().getColumnName(i + 1)) > -1);
   1382         }
   1383 
   1384         int[] types = { Types.ARRAY, Types.BIGINT, Types.BINARY, Types.BIT,
   1385                 Types.BLOB, Types.BOOLEAN, Types.CHAR, Types.CLOB,
   1386                 Types.DATALINK, Types.DATE, Types.DECIMAL, Types.DISTINCT,
   1387                 Types.DOUBLE, Types.FLOAT, Types.INTEGER, Types.JAVA_OBJECT,
   1388                 Types.LONGVARBINARY, Types.LONGVARCHAR, Types.NULL,
   1389                 Types.NUMERIC, Types.OTHER, Types.REAL, Types.REF,
   1390                 Types.SMALLINT, Types.STRUCT, Types.TIME, Types.TIMESTAMP,
   1391                 Types.TINYINT, Types.VARBINARY, Types.VARCHAR };
   1392         Arrays.sort(types);
   1393 
   1394         while (rs.next()) {
   1395             assertTrue("wrong type was return ", Arrays.binarySearch(types, rs
   1396                     .getInt("DATA_TYPE")) > -1);
   1397         }
   1398         rs.close();
   1399 
   1400       //Exception checking
   1401         conn.close();
   1402 
   1403          try {
   1404              meta.getTypeInfo();
   1405              fail("SQLException not thrown");
   1406          } catch (SQLException e) {
   1407              //ok
   1408          }
   1409 
   1410     }
   1411 
   1412 
   1413     /**
   1414      * @tests java.sql.DatabaseMetaData#getURL()
   1415      */
   1416     @TestTargetNew(
   1417         level = TestLevel.COMPLETE,
   1418         notes = "SQLException checking test fails",
   1419         method = "getURL",
   1420         args = {}
   1421     )
   1422     @KnownFailure("Ticket 98")
   1423     public void test_getURL() throws SQLException {
   1424         assertEquals("Wrong url", Support_SQL.sqlUrl, meta.getURL());
   1425 
   1426       //Exception checking
   1427         conn.close();
   1428 
   1429          try {
   1430              meta.getURL();
   1431              fail("SQLException not thrown");
   1432          } catch (SQLException e) {
   1433              //ok
   1434          }
   1435 
   1436     }
   1437 
   1438     /**
   1439      * @tests java.sql.DatabaseMetaData#getUserName()
   1440      *
   1441      *  NOT_FEASIBLE not supported
   1442      */
   1443     @TestTargetNew(
   1444         level = TestLevel.COMPLETE,
   1445         notes = "SQLException checking test fails",
   1446         method = "getUserName",
   1447         args = {}
   1448     )
   1449      @KnownFailure("Ticket 98")
   1450     public void s() throws SQLException {
   1451       assertEquals("Wrong user name", Support_SQL.sqlUser, meta.getUserName());
   1452 
   1453       //Exception checking
   1454         conn.close();
   1455 
   1456          try {
   1457              meta.getUserName();
   1458              fail("SQLException not thrown");
   1459          } catch (SQLException e) {
   1460              //ok
   1461          }
   1462 
   1463     }
   1464 
   1465 
   1466     /**
   1467      * @tests java.sql.DatabaseMetaData#insertsAreDetected(int)
   1468      */
   1469     @TestTargetNew(
   1470         level = TestLevel.COMPLETE,
   1471         notes = "SQLException checking test fails",
   1472         method = "insertsAreDetected",
   1473         args = {int.class}
   1474     )
   1475     @KnownFailure("Ticket 98")
   1476     public void test_insertsAreDetectedI() throws SQLException {
   1477         assertFalse(
   1478                 "visible row insert can be detected for TYPE_FORWARD_ONLY type",
   1479                 meta.insertsAreDetected(ResultSet.TYPE_FORWARD_ONLY));
   1480         assertFalse(
   1481                 "visible row insert can be detected for TYPE_SCROLL_INSENSITIVE type",
   1482                 meta.insertsAreDetected(ResultSet.TYPE_SCROLL_INSENSITIVE));
   1483         assertFalse(
   1484                 "visible row insert can be detected for TYPE_SCROLL_SENSITIVE type",
   1485                 meta.insertsAreDetected(ResultSet.TYPE_SCROLL_SENSITIVE));
   1486 
   1487 
   1488       //Exception checking
   1489         conn.close();
   1490 
   1491          try {
   1492              meta.insertsAreDetected(ResultSet.TYPE_SCROLL_SENSITIVE);
   1493              fail("SQLException not thrown");
   1494          } catch (SQLException e) {
   1495              //ok
   1496          }
   1497 
   1498     }
   1499 
   1500     /**
   1501      * @tests java.sql.DatabaseMetaData#isReadOnly()
   1502      */
   1503     @TestTargetNew(
   1504         level = TestLevel.COMPLETE,
   1505         notes = "SQLException checking test fails",
   1506         method = "isReadOnly",
   1507         args = {}
   1508     )
   1509     @KnownFailure("Ticket 98")
   1510     public void test_isReadOnly() throws SQLException {
   1511         assertFalse("database is not read-only", meta.isReadOnly());
   1512 
   1513 
   1514       //Exception checking
   1515         conn.close();
   1516 
   1517          try {
   1518              meta.isReadOnly();
   1519              fail("SQLException not thrown");
   1520          } catch (SQLException e) {
   1521              //ok
   1522          }
   1523     }
   1524 
   1525     /**
   1526      * @tests java.sql.DatabaseMetaData#othersDeletesAreVisible(int)
   1527      */
   1528     @TestTargetNew(
   1529         level = TestLevel.COMPLETE,
   1530         notes = "SQLException checking test fails.",
   1531         method = "othersDeletesAreVisible",
   1532         args = {int.class}
   1533     )
   1534     @KnownFailure("Ticket 98")
   1535     public void test_othersDeletesAreVisibleI() throws SQLException {
   1536         assertFalse(
   1537                 "deletes made by others are visible for TYPE_FORWARD_ONLY type",
   1538                 meta.othersDeletesAreVisible(ResultSet.TYPE_FORWARD_ONLY));
   1539         assertFalse(
   1540                 "deletes made by others are visible for TYPE_SCROLL_INSENSITIVE type",
   1541                 meta.othersDeletesAreVisible(ResultSet.TYPE_SCROLL_INSENSITIVE));
   1542         assertFalse(
   1543                 "deletes made by others are visible for TYPE_SCROLL_SENSITIVE type",
   1544                 meta.othersDeletesAreVisible(ResultSet.TYPE_SCROLL_SENSITIVE));
   1545 
   1546 
   1547       //Exception checking
   1548         conn.close();
   1549 
   1550          try {
   1551              assertFalse("inserts made by others are visible for unknown type", meta
   1552                      .othersDeletesAreVisible(ResultSet.CONCUR_READ_ONLY));
   1553              fail("SQLException not thrown");
   1554          } catch (SQLException e) {
   1555              //ok
   1556          }
   1557 
   1558     }
   1559 
   1560     /**
   1561      * @tests java.sql.DatabaseMetaData#othersInsertsAreVisible(int)
   1562      */
   1563     @TestTargetNew(
   1564         level = TestLevel.COMPLETE,
   1565         notes = "",
   1566         method = "othersInsertsAreVisible",
   1567         args = {int.class}
   1568     )
   1569     @KnownFailure("Ticket 98")
   1570     public void test_othersInsertsAreVisibleI() throws SQLException {
   1571         assertFalse(
   1572                 "inserts made by others are visible for TYPE_FORWARD_ONLY type",
   1573                 meta.othersInsertsAreVisible(ResultSet.TYPE_FORWARD_ONLY));
   1574         assertFalse(
   1575                 "inserts made by others are visible for TYPE_SCROLL_INSENSITIVE type",
   1576                 meta.othersInsertsAreVisible(ResultSet.TYPE_SCROLL_INSENSITIVE));
   1577         assertFalse(
   1578                 "inserts made by others are visible for TYPE_SCROLL_SENSITIVE type",
   1579                 meta.othersInsertsAreVisible(ResultSet.TYPE_SCROLL_SENSITIVE));
   1580 
   1581 
   1582       //Exception checking
   1583         conn.close();
   1584 
   1585          try {
   1586              assertFalse("inserts made by others are visible for unknown type", meta
   1587                      .othersInsertsAreVisible(ResultSet.CONCUR_READ_ONLY));
   1588              fail("SQLException not thrown");
   1589          } catch (SQLException e) {
   1590              //ok
   1591          }
   1592 
   1593     }
   1594 
   1595     /**
   1596      * @tests java.sql.DatabaseMetaData#othersUpdatesAreVisible(int)
   1597      */
   1598     @TestTargetNew(
   1599         level = TestLevel.COMPLETE,
   1600         notes = " Verification with invalid parameters missed.",
   1601         method = "othersUpdatesAreVisible",
   1602         args = {int.class}
   1603     )
   1604     @KnownFailure("Ticket 98")
   1605     public void test_othersUpdatesAreVisibleI() throws SQLException {
   1606         assertFalse(
   1607                 "updates made by others are visible for TYPE_FORWARD_ONLY type",
   1608                 meta.othersUpdatesAreVisible(ResultSet.TYPE_FORWARD_ONLY));
   1609         assertFalse(
   1610                 "updates made by others are visible for TYPE_SCROLL_INSENSITIVE type",
   1611                 meta.othersUpdatesAreVisible(ResultSet.TYPE_SCROLL_INSENSITIVE));
   1612         assertFalse(
   1613                 "updates made by others are visible for TYPE_SCROLL_SENSITIVE type",
   1614                 meta.othersUpdatesAreVisible(ResultSet.TYPE_SCROLL_SENSITIVE));
   1615 
   1616       //Exception checking
   1617 
   1618          try {
   1619              assertFalse("updates made by others are visible for unknown type", meta
   1620                      .othersUpdatesAreVisible(ResultSet.CONCUR_READ_ONLY));
   1621              fail("SQLException not thrown");
   1622          } catch (SQLException e) {
   1623              //ok
   1624          }
   1625     }
   1626 
   1627     /**
   1628      * @tests java.sql.DatabaseMetaData#storesMixedCaseQuotedIdentifiers()
   1629      */
   1630     @TestTargets ({
   1631     @TestTargetNew(
   1632         level = TestLevel.COMPLETE,
   1633         notes = "SQLException checking test fails",
   1634         method = "storesMixedCaseQuotedIdentifiers",
   1635         args = {}
   1636     ),
   1637     @TestTargetNew(
   1638             level = TestLevel.COMPLETE,
   1639             notes = "SQLException checking test fails",
   1640             method = "storesMixedCaseIdentifiers",
   1641             args = {}
   1642         )
   1643     })
   1644     public void test_storesMixedCaseQuotedIdentifiers() throws SQLException {
   1645         String quote = meta.getIdentifierQuoteString();
   1646 
   1647 
   1648 
   1649         insertNewRecord();
   1650 
   1651         String selectQuery = "SELECT " + quote + "fieLD1" + quote + " FROM "
   1652                 + DatabaseCreator.TEST_TABLE1;
   1653 
   1654         try {
   1655             statement.executeQuery(selectQuery);
   1656             if (!meta.storesMixedCaseIdentifiers()) {
   1657                 fail("mixed case is supported");
   1658             }
   1659         } catch (SQLException e) {
   1660             if (meta.storesMixedCaseQuotedIdentifiers()) {
   1661                 fail("quoted case is not supported");
   1662             }
   1663         }
   1664 
   1665         //Exception checking
   1666         /*
   1667         conn.close();
   1668 
   1669          try {
   1670              meta.storesMixedCaseIdentifiers();
   1671              fail("SQLException not thrown");
   1672          } catch (SQLException e) {
   1673              //ok
   1674          }
   1675 
   1676          conn.close();
   1677 
   1678          try {
   1679              meta.storesMixedCaseQuotedIdentifiers();
   1680              fail("SQLException not thrown");
   1681          } catch (SQLException e) {
   1682              //ok
   1683          }
   1684 
   1685     }
   1686 
   1687     @TestTargetNew(
   1688       level = TestLevel.COMPLETE,
   1689       notes = "Exception test fails.",
   1690       method = "getIdentifierQuoteString",
   1691       args = {}
   1692     )
   1693     @KnownFailure("Ticket 98")
   1694     public void testGetIdentifierQuoteString() throws SQLException {
   1695        assertNotNull(
   1696                meta.getIdentifierQuoteString()
   1697                );
   1698 
   1699        //Exception test
   1700        /*
   1701        conn.close();
   1702        try {
   1703            meta.getIdentifierQuoteString();
   1704            fail("Should throw exception");
   1705        } catch (SQLException e) {
   1706            //ok
   1707        }
   1708        */
   1709 
   1710     }
   1711 
   1712 
   1713     /**
   1714      * @tests java.sql.DatabaseMetaData#supportsColumnAliasing()
   1715      */
   1716     @TestTargetNew(
   1717         level = TestLevel.COMPLETE,
   1718         notes = "SQLException checking test fails",
   1719         method = "supportsColumnAliasing",
   1720         args = {}
   1721     )
   1722     @KnownFailure("not supported. SQLException checking test fails")
   1723     public void test_supportsColumnAliasing() throws SQLException {
   1724         insertNewRecord();
   1725 
   1726         String alias = "FIELD3";
   1727         String selectQuery = "SELECT field1 AS " + alias + " FROM "
   1728                 + DatabaseCreator.TEST_TABLE1;
   1729         ResultSet rs = statement.executeQuery(selectQuery);
   1730         ResultSetMetaData rsmd = rs.getMetaData();
   1731 
   1732         if (meta.supportsColumnAliasing()) {
   1733             // supports aliasing
   1734             assertEquals("Wrong count of columns", 1, rsmd.getColumnCount());
   1735             assertEquals("Aliasing is not supported", alias, rsmd
   1736                     .getColumnLabel(1));
   1737         } else {
   1738             // doesn't support aliasing
   1739             assertEquals("Aliasing is supported", 0, rsmd.getColumnCount());
   1740         }
   1741         rs.close();
   1742 
   1743       //Exception checking
   1744         conn.close();
   1745 
   1746          try {
   1747              meta.supportsColumnAliasing();
   1748              fail("SQLException not thrown");
   1749          } catch (SQLException e) {
   1750              //ok
   1751          }
   1752 
   1753     }
   1754 
   1755 
   1756     /**
   1757      * @tests java.sql.DatabaseMetaData#supportsExpressionsInOrderBy()
   1758      */
   1759     @TestTargetNew(
   1760         level = TestLevel.COMPLETE,
   1761         notes = "SQLException checking test fails",
   1762         method = "supportsExpressionsInOrderBy",
   1763         args = {}
   1764     )
   1765     @KnownFailure("exception test fails")
   1766     public void test_supportsExpressionsInOrderBy() throws SQLException {
   1767         insertNewRecord();
   1768 
   1769         String selectQuery = "SELECT * FROM " + DatabaseCreator.TEST_TABLE1
   1770                 + " ORDER BY id + field3";
   1771 
   1772         try {
   1773             statement.executeQuery(selectQuery);
   1774             if (!meta.supportsExpressionsInOrderBy()) {
   1775                 fail("Expressions in order by are supported");
   1776             }
   1777         } catch (SQLException e) {
   1778             if (meta.supportsExpressionsInOrderBy()) {
   1779                 fail("Expressions in order by are not supported");
   1780             }
   1781         }
   1782 
   1783       //Exception checking
   1784         conn.close();
   1785 
   1786          try {
   1787              meta.supportsExpressionsInOrderBy();
   1788              fail("SQLException not thrown");
   1789          } catch (SQLException e) {
   1790              //ok
   1791          }
   1792 
   1793     }
   1794 
   1795 
   1796     /**
   1797      * @tests java.sql.DatabaseMetaData#supportsGroupBy()
   1798      */
   1799     @TestTargetNew(
   1800         level = TestLevel.COMPLETE,
   1801         notes = "SQLException checking test fails",
   1802         method = "supportsGroupBy",
   1803         args = {}
   1804     )
   1805     @KnownFailure("exception test fails")
   1806     public void test_supportsGroupBy() throws SQLException {
   1807         insertNewRecord();
   1808 
   1809         String selectQuery = "SELECT * FROM " + DatabaseCreator.TEST_TABLE1
   1810                 + " GROUP BY field3";
   1811 
   1812         try {
   1813             statement.executeQuery(selectQuery);
   1814             if (!meta.supportsGroupBy()) {
   1815                 fail("group by are supported");
   1816             }
   1817         } catch (SQLException e) {
   1818             if (meta.supportsGroupBy()) {
   1819                 fail("group by are not supported");
   1820             }
   1821         }
   1822 
   1823       //Exception checking
   1824         conn.close();
   1825 
   1826          try {
   1827              meta.supportsGroupBy();
   1828              fail("SQLException not thrown");
   1829          } catch (SQLException e) {
   1830              //ok
   1831          }
   1832 
   1833     }
   1834 
   1835 
   1836     /**
   1837      * @tests java.sql.DatabaseMetaData#supportsGroupByUnrelated()
   1838      */
   1839     @TestTargetNew(
   1840         level = TestLevel.COMPLETE,
   1841         notes = "SQLException checking test fails",
   1842         method = "supportsGroupByUnrelated",
   1843         args = {}
   1844     )
   1845     @KnownFailure("exception test fails")
   1846     public void test_supportsGroupByUnrelated() throws SQLException {
   1847         insertNewRecord();
   1848 
   1849         String selectQuery = "SELECT field1, field2 FROM "
   1850                 + DatabaseCreator.TEST_TABLE1 + " GROUP BY field3";
   1851 
   1852         try {
   1853             statement.executeQuery(selectQuery);
   1854             if (!meta.supportsGroupByUnrelated()) {
   1855                 fail("unrelated columns in group by are supported");
   1856             }
   1857         } catch (SQLException e) {
   1858             if (meta.supportsGroupByUnrelated()) {
   1859                 fail("unrelated columns in group by are not supported");
   1860             }
   1861         }
   1862 
   1863         //Exception checking
   1864         conn.close();
   1865 
   1866          try {
   1867              meta.supportsGroupByUnrelated();
   1868              fail("SQLException not thrown");
   1869          } catch (SQLException e) {
   1870              //ok
   1871          }
   1872 
   1873     }
   1874 
   1875     /**
   1876      * @tests java.sql.DatabaseMetaData#supportsNonNullableColumns()
   1877      */
   1878     @TestTargetNew(
   1879         level = TestLevel.COMPLETE,
   1880         notes = "SQLException thrown",
   1881         method = "supportsNonNullableColumns",
   1882         args = {}
   1883     )
   1884     @KnownFailure("Ticket 98")
   1885     public void test_supportsNonNullableColumns() throws SQLException {
   1886         assertTrue(
   1887                 "columns in this database may not be defined as non-nullable",
   1888                 meta.supportsNonNullableColumns());
   1889         statementForward.execute("create table companies(id integer not null);");
   1890         statementForward.execute("drop table companies");
   1891 
   1892 
   1893       //Exception checking
   1894         conn.close();
   1895 
   1896          try {
   1897              meta.supportsNonNullableColumns();
   1898              fail("SQLException not thrown");
   1899          } catch (SQLException e) {
   1900              //ok
   1901          }
   1902 
   1903     }
   1904 
   1905     /**
   1906      * @tests java.sql.DatabaseMetaData#supportsOrderByUnrelated()
   1907      */
   1908     @TestTargetNew(
   1909         level = TestLevel.COMPLETE,
   1910         notes = "SQLException checking test fails",
   1911         method = "supportsOrderByUnrelated",
   1912         args = {}
   1913     )
   1914     @KnownFailure("exception test fails")
   1915     public void test_supportsOrderByUnrelated() throws SQLException {
   1916         insertNewRecord();
   1917 
   1918         String selectQuery = "SELECT field1, field2 FROM "
   1919                 + DatabaseCreator.TEST_TABLE1 + " ORDER BY id + field3";
   1920 
   1921         try {
   1922             statement.executeQuery(selectQuery);
   1923             if (!meta.supportsOrderByUnrelated()) {
   1924                 fail("unrelated columns in order by are supported");
   1925             }
   1926         } catch (SQLException e) {
   1927             if (meta.supportsOrderByUnrelated()) {
   1928                 fail("unrelated columns in order by are not supported");
   1929             }
   1930         }
   1931 
   1932       //Exception checking
   1933         conn.close();
   1934 
   1935          try {
   1936              meta.supportsOrderByUnrelated();
   1937              fail("SQLException not thrown");
   1938          } catch (SQLException e) {
   1939              //ok
   1940          }
   1941 
   1942     }
   1943 
   1944     /**
   1945      * @tests java.sql.DatabaseMetaData#supportsSelectForUpdate()
   1946      */
   1947     @TestTargetNew(
   1948         level = TestLevel.COMPLETE,
   1949         notes = "SQLException checking test fails",
   1950         method = "supportsSelectForUpdate",
   1951         args = {}
   1952     )
   1953     @KnownFailure("exception test fails")
   1954     public void test_supportsSelectForUpdate() throws SQLException {
   1955         insertNewRecord();
   1956 
   1957         String selectQuery = "SELECT field1 FROM "
   1958                 + DatabaseCreator.TEST_TABLE1 + " FOR UPDATE";
   1959 
   1960         try {
   1961             statement.executeQuery(selectQuery);
   1962             if (!meta.supportsSelectForUpdate()) {
   1963                 fail("select for update are supported");
   1964             }
   1965         } catch (SQLException e) {
   1966             if (!meta.supportsSelectForUpdate()) {
   1967                 fail("select for update are not supported");
   1968             }
   1969         }
   1970 
   1971 
   1972       //Exception checking
   1973         conn.close();
   1974 
   1975          try {
   1976              meta.supportsSelectForUpdate();
   1977              fail("SQLException not thrown");
   1978          } catch (SQLException e) {
   1979              //ok
   1980          }
   1981 
   1982     }
   1983 
   1984     /**
   1985      * @tests java.sql.DatabaseMetaData#supportsSubqueriesInExists()
   1986      */
   1987     @TestTargetNew(
   1988         level = TestLevel.COMPLETE,
   1989         notes = "SQLException checking test fails",
   1990         method = "supportsSubqueriesInExists",
   1991         args = {}
   1992     )
   1993     @KnownFailure("exception test fails")
   1994     public void test_supportsSubqueriesInExists() throws SQLException {
   1995         insertNewRecord();
   1996 
   1997         String selectQuery = "SELECT field1 FROM "
   1998                 + DatabaseCreator.TEST_TABLE1
   1999                 + " WHERE EXISTS(SELECT field2 FROM "
   2000                 + DatabaseCreator.TEST_TABLE1 + ")";
   2001 
   2002         try {
   2003             statement.executeQuery(selectQuery);
   2004             if (!meta.supportsSubqueriesInExists()) {
   2005                 fail("Subqueries in exists are supported");
   2006             }
   2007         } catch (SQLException e) {
   2008             if (meta.supportsSubqueriesInExists()) {
   2009                 fail("Subqueries in exists are not supported");
   2010             }
   2011         }
   2012 
   2013 
   2014       //Exception checking
   2015         conn.close();
   2016 
   2017          try {
   2018              meta.supportsSubqueriesInExists();
   2019              fail("SQLException not thrown");
   2020          } catch (SQLException e) {
   2021              //ok
   2022          }
   2023 
   2024     }
   2025 
   2026     /**
   2027      * @tests java.sql.DatabaseMetaData#supportsTableCorrelationNames()
   2028      */
   2029     @TestTargetNew(
   2030         level = TestLevel.COMPLETE,
   2031         notes = "SQLException checking test fails",
   2032         method = "supportsTableCorrelationNames",
   2033         args = {}
   2034     )
   2035     @KnownFailure("exception test fails")
   2036     public void test_supportsTableCorrelationNames() throws SQLException {
   2037 
   2038         insertNewRecord();
   2039         assertFalse(conn.isClosed());
   2040 
   2041         String corelationName = "TABLE_NAME";
   2042         String selectQuery = "SELECT * FROM " + DatabaseCreator.TEST_TABLE1
   2043                 + " AS " + corelationName;
   2044         ResultSet rs = statementForward.executeQuery(selectQuery);
   2045         ResultSetMetaData rsmd = rs.getMetaData();
   2046         int numOfColumn = rsmd.getColumnCount();
   2047 
   2048         for (int i = 0; i < numOfColumn; i++) {
   2049             if (meta.supportsTableCorrelationNames()) {
   2050                 assertEquals("Corelation names is now supported",
   2051                         corelationName, rsmd.getTableName(i + 1));
   2052             } else {
   2053                 assertEquals("Corelation names is supported",
   2054                         DatabaseCreator.TEST_TABLE1, rsmd.getTableName(i + 1));
   2055             }
   2056         }
   2057 
   2058 
   2059       //Exception checking
   2060         conn.close();
   2061 
   2062          try {
   2063              meta.supportsTableCorrelationNames();
   2064              fail("SQLException not thrown");
   2065          } catch (SQLException e) {
   2066              //ok
   2067          }
   2068 
   2069     }
   2070 
   2071     /**
   2072      * @tests java.sql.DatabaseMetaData#supportsTransactionIsolationLevel(int)
   2073      */
   2074     @TestTargetNew(
   2075         level = TestLevel.SUFFICIENT,
   2076         notes = " Not all Transaction isolation levels supported.",
   2077         method = "supportsTransactionIsolationLevel",
   2078         args = {int.class}
   2079     )
   2080     public void test_supportsTransactionIsolationLevelI() throws SQLException {
   2081         assertFalse("database supports TRANSACTION_NONE isolation level", meta
   2082                 .supportsTransactionIsolationLevel(Connection.TRANSACTION_NONE));
   2083         // TODO only Connection.TRANSACTION_SERIALIZABLE is supported
   2084 //        assertTrue(
   2085 //                "database doesn't supports TRANSACTION_READ_COMMITTED isolation level",
   2086 //                meta
   2087 //                        .supportsTransactionIsolationLevel(Connection.TRANSACTION_READ_COMMITTED));
   2088 //        assertTrue(
   2089 //                "database doesn't supports TRANSACTION_READ_UNCOMMITTED isolation level",
   2090 //                meta
   2091 //                        .supportsTransactionIsolationLevel(Connection.TRANSACTION_READ_UNCOMMITTED));
   2092 //        assertTrue(
   2093 //               "database doesn't supports TRANSACTION_REPEATABLE_READ isolation level",
   2094 //                meta
   2095 //                        .supportsTransactionIsolationLevel(Connection.TRANSACTION_REPEATABLE_READ));
   2096         assertTrue(
   2097                 "database doesn't supports TRANSACTION_SERIALIZABLE isolation level",
   2098                 meta
   2099                         .supportsTransactionIsolationLevel(Connection.TRANSACTION_SERIALIZABLE));
   2100 
   2101 
   2102       //Exception checking
   2103 
   2104          try {
   2105              assertFalse("database supports unknown isolation level", meta
   2106                      .supportsTransactionIsolationLevel(Integer.MAX_VALUE));;
   2107          } catch (SQLException e) {
   2108              //ok
   2109          }
   2110     }
   2111 
   2112     /**
   2113      * @tests java.sql.DatabaseMetaData#updatesAreDetected(int)
   2114      */
   2115     @TestTargetNew(
   2116         level = TestLevel.COMPLETE,
   2117         notes = " Verification with invalid parameters missed.",
   2118         method = "updatesAreDetected",
   2119         args = {int.class}
   2120     )
   2121     public void test_updatesAreDetectedI() throws SQLException {
   2122         assertFalse(
   2123                 "visible row update can be detected for TYPE_FORWARD_ONLY type",
   2124                 meta.updatesAreDetected(ResultSet.TYPE_FORWARD_ONLY));
   2125         assertFalse(
   2126                 "visible row update can be detected for TYPE_SCROLL_INSENSITIVE type",
   2127                 meta.updatesAreDetected(ResultSet.TYPE_SCROLL_INSENSITIVE));
   2128         assertFalse(
   2129                 "visible row update can be detected for TYPE_SCROLL_SENSITIVE type",
   2130                 meta.updatesAreDetected(ResultSet.TYPE_SCROLL_SENSITIVE));
   2131         assertFalse("visible row update can be detected for unknown type", meta
   2132                 .updatesAreDetected(100));
   2133 
   2134         //Exception checking
   2135        conn.close();
   2136 
   2137         try {
   2138             meta.updatesAreDetected(ResultSet.CLOSE_CURSORS_AT_COMMIT);
   2139             assertFalse("visible row update can be detected for unknown type", meta
   2140                     .updatesAreDetected(ResultSet.CLOSE_CURSORS_AT_COMMIT));
   2141 
   2142         } catch (SQLException e) {
   2143             //ok
   2144         }
   2145     }
   2146 
   2147 
   2148     protected static void insertNewRecord() throws SQLException {
   2149         if (conn.isClosed()) {
   2150             System.out.println("DatabaseMetaDataTest.insertNewRecord() : closed");
   2151         }
   2152 
   2153         String insertQuery = "INSERT INTO " + DatabaseCreator.TEST_TABLE1
   2154                 + " (id, field1, field2, field3) VALUES(" + id + ", '"
   2155                 + "value" + id + "', " + id + ", " + id + ")";
   2156         id++;
   2157         statement.execute(insertQuery);
   2158     }
   2159 
   2160     //BEGIN APACHE-DERBY
   2161 
   2162     /**
   2163      * Test Method from Apache Derby Project
   2164      * Class
   2165      * org.apache.derbyTesting.functionTests.tests.jdbcapi.DatabaseMetaDataTest
   2166      *
   2167      * Compare a ResultSet from getColumns() with ResultSetMetaData returned
   2168      * from a SELECT * against the table. This method handles situations where a
   2169      * full set of the columns are in the ResultSet. The first action is to call
   2170      * rs.next(). The ResultSet will be closed by this method.
   2171      *
   2172      * @param rs
   2173      *            resultset to crossCheck
   2174      * @param partial
   2175      *            used to indicate if ordinal position should get checked
   2176      * @return the number of rows in the resultSet
   2177      * @throws SQLException
   2178      */
   2179     private int crossCheckGetColumnsAndResultSetMetaData(ResultSet rs,
   2180             boolean partial)
   2181     throws SQLException
   2182     {
   2183         Statement s = conn.createStatement();
   2184         while (rs.next())
   2185         {
   2186             String schema = rs.getString("TABLE_SCHEM");
   2187             String table = rs.getString("TABLE_NAME");
   2188 
   2189             ResultSet rst = s.executeQuery(
   2190                 "SELECT * FROM " + schema+"."+table);
   2191             ResultSetMetaData rsmdt = rst.getMetaData();
   2192 
   2193 
   2194             for (int col = 1; col <= rsmdt.getColumnCount() ; col++)
   2195             {
   2196                 if (!partial) {
   2197                     if (col != 1)
   2198                         assertTrue(rs.next());
   2199 
   2200                     assertEquals("ORDINAL_POSITION",
   2201                             col, rs.getInt("ORDINAL_POSITION"));
   2202                 }
   2203 
   2204                 assertEquals("TABLE_CAT",
   2205                         "", rs.getString("TABLE_CAT"));
   2206                 assertEquals("TABLE_SCHEM",
   2207                         schema, rs.getString("TABLE_SCHEM"));
   2208                 assertEquals("TABLE_NAME",
   2209                         table, rs.getString("TABLE_NAME"));
   2210 
   2211                 crossCheckGetColumnRowAndResultSetMetaData(rs, rsmdt);
   2212                 if (partial)
   2213                     break;
   2214 
   2215             }
   2216             rst.close();
   2217 
   2218 
   2219         }
   2220         int count = rs.getRow();
   2221         rs.close();
   2222         s.close();
   2223         return count;
   2224     }
   2225 
   2226     /**
   2227      * * Test Method from Apache Derby Project
   2228      * Class
   2229      * org.apache.derbyTesting.functionTests.tests.jdbcapi.DatabaseMetaDataTest
   2230      *
   2231      * Cross check a single row from getColumns() with ResultSetMetaData
   2232      * for a SELECT * from the same table.
   2233      * @param rs ResultSet from getColumns already positioned on the row.
   2234      * @param rsmdt ResultSetMetaData for the SELECT *
   2235      * @param odbc 0 for JDBC call, 1 for ODBC. Needed to allow for difference
   2236      *    in using BUFFER_LENGTH (ODBC) or no(JDBC).
   2237      * @throws SQLException
   2238      */
   2239     public static void crossCheckGetColumnRowAndResultSetMetaData(
   2240             ResultSet rs, ResultSetMetaData rsmdt)
   2241         throws SQLException
   2242     {
   2243         int col = rs.getInt("ORDINAL_POSITION");
   2244 
   2245         assertEquals("RSMD.getCatalogName",
   2246                 rsmdt.getCatalogName(col), rs.getString("TABLE_CAT"));
   2247         assertEquals("RSMD.getSchemaName",
   2248                 rsmdt.getSchemaName(col), rs.getString("TABLE_SCHEM"));
   2249         assertEquals("RSMD.getTableName",
   2250                 rsmdt.getTableName(col), rs.getString("TABLE_NAME"));
   2251 
   2252         assertEquals("COLUMN_NAME",
   2253                 rsmdt.getColumnName(col), rs.getString("COLUMN_NAME"));
   2254 
   2255         // DERBY-2285 BOOLEAN columns appear different on
   2256         // network client.
   2257         // meta returns BOOLEAN
   2258         // RSMD returns SMALLINT
   2259         int metaColumnType = rs.getInt("DATA_TYPE");
   2260         if (metaColumnType == Types.BOOLEAN )
   2261         {
   2262             assertEquals("TYPE_NAME",
   2263                     "BOOLEAN", rs.getString("TYPE_NAME"));
   2264             assertEquals("TYPE_NAME",
   2265                     "SMALLINT", rsmdt.getColumnTypeName(col));
   2266 
   2267             assertEquals("DATA_TYPE",
   2268                     Types.SMALLINT, rsmdt.getColumnType(col));
   2269         }
   2270         else if (metaColumnType == Types.JAVA_OBJECT)
   2271         {
   2272             // meta returns JAVA_OBJECT
   2273             // RSMD returns LONGVARBINARY!
   2274             assertEquals("DATA_TYPE",
   2275                     Types.LONGVARBINARY, rsmdt.getColumnType(col));
   2276         }
   2277         else if (metaColumnType == Types.VARBINARY )
   2278         {
   2279             // meta returns different type name to RSMD
   2280             assertEquals("DATA_TYPE",
   2281                     Types.VARBINARY, rsmdt.getColumnType(col));
   2282         }
   2283         else if (metaColumnType == Types.BINARY )
   2284         {
   2285             // meta returns different type name to RSMD
   2286             assertEquals("DATA_TYPE",
   2287                     Types.BINARY, rsmdt.getColumnType(col));
   2288         }
   2289         else if (metaColumnType == Types.NUMERIC )
   2290         {
   2291             // DERBY-584 inconsistency in numeric & decimal
   2292             assertEquals("DATA_TYPE",
   2293                     Types.DECIMAL, rsmdt.getColumnType(col));
   2294 
   2295             assertEquals("TYPE_NAME",
   2296                     "DECIMAL", rsmdt.getColumnTypeName(col));
   2297 
   2298             assertEquals("TYPE_NAME",
   2299                     "NUMERIC", rs.getString("TYPE_NAME"));
   2300         }
   2301         else
   2302         {
   2303             assertEquals("DATA_TYPE",
   2304                 rsmdt.getColumnType(col), rs.getInt("DATA_TYPE"));
   2305             assertEquals("TYPE_NAME",
   2306                 rsmdt.getColumnTypeName(col), rs.getString("TYPE_NAME"));
   2307         }
   2308 
   2309         /*
   2310         if (metaColumnType != Types.JAVA_OBJECT) {
   2311         System.out.println("TYPE " + rs.getInt("DATA_TYPE"));
   2312         System.out.println(JDBC.escape(schema, table) + " " + rs.getString("COLUMN_NAME"));
   2313         assertEquals("COLUMN_SIZE",
   2314                 rsmdt.getPrecision(col), rs.getInt("COLUMN_SIZE"));
   2315         }
   2316         */
   2317 
   2318         /*
   2319         assertEquals("DECIMAL_DIGITS",
   2320                 rsmdt.getScale(col), rs.getInt("DECIMAL_DIGITS"));
   2321         */
   2322 
   2323         // This assumes the constants defined by meta and ResultSet
   2324         // for nullability are equal. They are by inspection
   2325         // and since they are static final and part of a defined
   2326         // api by definition they cannot change. We also
   2327         // check statically this is true in the testConstants fixture.
   2328         assertEquals("NULLABLE",
   2329                 rsmdt.isNullable(col), rs.getInt("NULLABLE"));
   2330 
   2331         // REMARKS set to empty string by Derby
   2332         assertEquals("REMARKS", "", rs.getString("REMARKS"));
   2333 
   2334 
   2335         // IS_NULLABLE
   2336         switch (rsmdt.isNullable(col))
   2337         {
   2338         case ResultSetMetaData.columnNoNulls:
   2339             assertEquals("IS_NULLABLE", "NO", rs.getString("IS_NULLABLE"));
   2340             break;
   2341         case ResultSetMetaData.columnNullable:
   2342             assertEquals("IS_NULLABLE", "YES", rs.getString("IS_NULLABLE"));
   2343             break;
   2344         case ResultSetMetaData.columnNullableUnknown:
   2345             assertEquals("IS_NULLABLE", "", rs.getString("IS_NULLABLE"));
   2346             break;
   2347         default:
   2348             fail("invalid return from rsmdt.isNullable(col)");
   2349         }
   2350 
   2351         // SCOPE not supported
   2352         assertNull("SCOPE_CATLOG", rs.getString("SCOPE_CATLOG"));
   2353         assertNull("SCOPE_SCHEMA", rs.getString("SCOPE_SCHEMA"));
   2354         assertNull("SCOPE_TABLE", rs.getString("SCOPE_TABLE"));
   2355 
   2356         // DISTINCT not supported
   2357         assertEquals("SOURCE_DATA_TYPE", 0, rs.getShort("SOURCE_DATA_TYPE"));
   2358         assertTrue(rs.wasNull());
   2359 
   2360         // IS_AUTOINCREMENT added in JDBC 4.0
   2361        assertEquals("IS_AUTOINCREMENT",
   2362                rsmdt.isAutoIncrement(col) ? "YES" : "NO",
   2363                rs.getString("IS_AUTOINCREMENT"));
   2364        assertFalse(rs.wasNull());
   2365     }
   2366 
   2367     /*
   2368      * Check the shape of the ResultSet from any getColumns call.
   2369      */
   2370     private void checkColumnsShape(ResultSet rs) throws SQLException {
   2371         int[] columnTypes = new int[] {
   2372                 Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.VARCHAR,
   2373                 Types.SMALLINT, Types.VARCHAR, Types.INTEGER, Types.INTEGER,
   2374                 Types.INTEGER, Types.INTEGER, Types.INTEGER, Types.VARCHAR,
   2375                 Types.VARCHAR, Types.INTEGER, Types.INTEGER, Types.INTEGER,
   2376                 Types.INTEGER, Types.VARCHAR, Types.VARCHAR, Types.VARCHAR,
   2377                 Types.VARCHAR, Types.SMALLINT, Types.VARCHAR};
   2378 
   2379         assertMetaDataResultSet(rs, new String[] {
   2380                 "TABLE_CAT", "TABLE_SCHEM", "TABLE_NAME", "COLUMN_NAME",
   2381                 "DATA_TYPE", "TYPE_NAME", "COLUMN_SIZE", "BUFFER_LENGTH",
   2382                 "DECIMAL_DIGITS", "NUM_PREC_RADIX", "NULLABLE", "REMARKS",
   2383                 "COLUMN_DEF", "SQL_DATA_TYPE", "SQL_DATETIME_SUB",
   2384                 "CHAR_OCTET_LENGTH", "ORDINAL_POSITION", "IS_NULLABLE",
   2385                 "SCOPE_CATLOG", "SCOPE_SCHEMA", "SCOPE_TABLE",
   2386                 "SOURCE_DATA_TYPE", "IS_AUTOINCREMENT"}, columnTypes, null);
   2387 
   2388     }
   2389 
   2390     public static void assertMetaDataResultSet(ResultSet rs,
   2391             String[] columnNames, int[] columnTypes,
   2392             boolean[] nullability) throws SQLException
   2393     {
   2394      // see ResultSetGetterTest, getType() -> this test fails currently
   2395         assertEquals(ResultSet.TYPE_FORWARD_ONLY, rs.getType());
   2396         assertEquals(ResultSet.CONCUR_READ_ONLY, rs.getConcurrency());
   2397 
   2398         if (columnNames != null)
   2399             assertColumnNames(rs, columnNames);
   2400         if (columnTypes != null)
   2401             assertColumnTypes(rs, columnTypes);
   2402         if (nullability != null)
   2403             assertNullability(rs, nullability);
   2404     }
   2405 
   2406     /**
   2407      * * Test Method from Apache Derby Project
   2408      *   Class
   2409      * org.apache.derbyTesting.functionTests.tests.jdbcapi.DatabaseMetaDataTest
   2410      *
   2411      * Takes a result set and an array of expected colum names (as
   2412      * Strings)  and asserts that the column names in the result
   2413      * set metadata match the number, order, and names of those
   2414      * in the array.
   2415      *
   2416      * @param rs ResultSet for which we're checking column names.
   2417      * @param expectedColNames Array of expected column names.
   2418      */
   2419     public static void assertColumnNames(ResultSet rs,
   2420         String [] expectedColNames) throws SQLException
   2421     {
   2422         ResultSetMetaData rsmd = rs.getMetaData();
   2423         int actualCols = rsmd.getColumnCount();
   2424 
   2425         for (int i = 0; i < actualCols; i++)
   2426         {
   2427         assertEquals("Column names do not match:",
   2428                 expectedColNames[i], rsmd.getColumnName(i+1));
   2429         }
   2430 
   2431         assertEquals("Unexpected column count:",
   2432         expectedColNames.length, rsmd.getColumnCount());
   2433     }
   2434 
   2435     /**
   2436      * Test Method from Apache Derby Project
   2437      * Class
   2438      * org.apache.derbyTesting.functionTests.tests.jdbcapi.DatabaseMetaDataTest
   2439      *
   2440      * Takes a result set and an array of expected column types
   2441      * from java.sql.Types
   2442      * and asserts that the column types in the result
   2443      * set metadata match the number, order, and names of those
   2444      * in the array.
   2445      *
   2446      * No length information for variable length types
   2447      * can be passed. For ResultSets from JDBC DatabaseMetaData
   2448      * the specification only indicates the types of the
   2449      * columns, not the length.
   2450      *
   2451      * @param rs ResultSet for which we're checking column names.
   2452      * @param expectedTypes Array of expected column types.
   2453      */
   2454     public static void assertColumnTypes(ResultSet rs,
   2455         int[] expectedTypes) throws SQLException
   2456     {
   2457         ResultSetMetaData rsmd = rs.getMetaData();
   2458         int actualCols = rsmd.getColumnCount();
   2459 
   2460         assertEquals("Unexpected column count:",
   2461                 expectedTypes.length, rsmd.getColumnCount());
   2462 
   2463         for (int i = 0; i < actualCols; i++)
   2464         {
   2465        assertEquals("Column types do not match for column " + (i+1),
   2466                     expectedTypes[i], rsmd.getColumnType(i+1));
   2467         }
   2468     }
   2469 
   2470     /**
   2471      * Check the nullability of the column definitions for
   2472      * the ResultSet matches the expected values.
   2473      * @param rs
   2474      * @param nullability
   2475      * @throws SQLException
   2476      */
   2477     public static void assertNullability(ResultSet rs,
   2478             boolean[] nullability) throws SQLException
   2479     {
   2480         ResultSetMetaData rsmd = rs.getMetaData();
   2481         int actualCols = rsmd.getColumnCount();
   2482 
   2483         assertEquals("Unexpected column count:",
   2484                 nullability.length, rsmd.getColumnCount());
   2485 
   2486         for (int i = 0; i < actualCols; i++)
   2487         {
   2488             int expected = nullability[i] ?
   2489                ResultSetMetaData.columnNullable : ResultSetMetaData.columnNoNulls;
   2490        assertEquals("Column nullability do not match for column " + (i+1),
   2491                     expected, rsmd.isNullable(i+1));
   2492         }
   2493     }
   2494 
   2495     //BEGIN Apache Derby DatabaseMetaDataTest
   2496 
   2497      /*
   2498       * Escaped function testing TODO complete this list
   2499       */
   2500      private static final String[][] NUMERIC_FUNCTIONS = {
   2501              // Section C.1 JDBC 3.0 spec.
   2502              {"ABS", "-25.67"},
   2503 
   2504 //             {"ACOS", "0.0707"}, {"ASIN", "0.997"},
   2505 //             {"ATAN", "14.10"}, {"ATAN2", "0.56", "1.2"}, {"CEILING", "3.45"},
   2506 //             {"COS", "1.2"}, {"COT", "3.4"}, {"DEGREES", "2.1"}, {"EXP", "2.3"},
   2507 //             {"FLOOR", "3.22"}, {"LOG", "34.1"}, {"LOG10", "18.7"},
   2508 //             {"MOD", "124", "7"}, {"PI"}, {"POWER", "2", "3"},
   2509 //             {"RADIANS", "54"}, {"RAND", "17"},
   2510 
   2511              {"ROUND", "345.345", "1"}
   2512 
   2513 //             {"SIGN", "-34"}, {"SIN", "0.32"}, {"SQRT", "6.22"},
   2514 //             {"TAN", "0.57",}, {"TRUNCATE", "345.395", "1"}
   2515 
   2516              };
   2517 
   2518      private static final String[][] TIMEDATE_FUNCTIONS = {
   2519              // Section C.3 JDBC 3.0 spec.
   2520 
   2521              {"date","'now'"}
   2522 
   2523              //TODO Complete list
   2524 
   2525      };
   2526 
   2527      private static final String[][] SYSTEM_FUNCTIONS = {
   2528      // Section C.4 JDBC 3.0 spec.
   2529              {"IFNULL", "'this'", "'that'"}, {"USER"}
   2530              };
   2531 
   2532      /*
   2533       * TODO complete or check this list
   2534       */
   2535      private static final String[][] STRING_FUNCTIONS = {
   2536              // Section C.2 JDBC 3.0 spec.
   2537 //             {"ASCII", "'Yellow'"}, {"CHAR", "65"},
   2538 //             {"CONCAT", "'hello'", "'there'"},
   2539 //             {"DIFFERENCE", "'Pires'", "'Piers'"},
   2540 //             {"INSERT", "'Bill Clinton'", "4", "'William'"},
   2541 //             {"LCASE", "'Fernando Alonso'"}, {"LEFT", "'Bonjour'", "3"},
   2542 //             {"LENGTH", "'four    '"}, {"LOCATE", "'jour'", "'Bonjour'"},
   2543              {"LTRIM", "'   left trim   '"},
   2544 //               {"REPEAT", "'echo'", "3"},
   2545 //             {"REPLACE", "'to be or not to be'", "'be'", "'England'"},
   2546 //             {"RTRIM", "'  right trim   '"}, {"SOUNDEX", "'Derby'"},
   2547 //             {"SPACE", "12"},
   2548 //             {"SUBSTRING", "'Ruby the Rubicon Jeep'", "10", "7",},
   2549 //             {"UCASE", "'Fernando Alonso'"}
   2550      };
   2551 
   2552      /**
   2553       * Six combinations of valid identifiers with mixed case, to see how the
   2554       * various pattern matching and returned values handle them. This test only
   2555       * creates objects in these schemas.
   2556       */
   2557      private static final String[] IDS = {
   2558              "one_meta_test", "TWO_meta_test", "ThReE_meta_test",
   2559              "\"four_meta_test\"", "\"FIVE_meta_test\"", "\"sIx_meta_test\""};
   2560 
   2561      /**
   2562       * All the builtin schemas.
   2563       */
   2564      private static final String[] BUILTIN_SCHEMAS = {
   2565              //TODO: Are there any other built in schemas?
   2566 
   2567      };
   2568 
   2569      public static String getStoredIdentifier(String sqlIdentifier) {
   2570          if (sqlIdentifier.charAt(0) == '"')
   2571              return sqlIdentifier.substring(1, sqlIdentifier.length() - 1);
   2572          else
   2573              return sqlIdentifier.toUpperCase();
   2574      }
   2575 
   2576      /**
   2577       * Test getSchemas() without modifying the database.
   2578       *
   2579       * @throws SQLException
   2580       */
   2581      @TestTargetNew(
   2582              level = TestLevel.PARTIAL_COMPLETE,
   2583              notes = "Derby test for getSchema",
   2584              method = "getSchemas",
   2585              args = {}
   2586          )
   2587      public void testGetSchemasReadOnly() throws SQLException {
   2588 
   2589          ResultSet rs = meta.getSchemas();
   2590          checkSchemas(rs, new String[0]);
   2591      }
   2592 
   2593 
   2594      /**
   2595       * Check the returned information from a getSchemas(). The passed in
   2596       * String[] expected is a list of the schemas expected to be present in the
   2597       * returned set. The returned set may contain additional schemas which will
   2598       * be ignored, thus this test can be used regardless of the database state.
   2599       * The builtin schemas are automatically checked and must not be part of the
   2600       * passed in list.
   2601       */
   2602      public static void checkSchemas(ResultSet rs, String[] userExpected)
   2603              throws SQLException {
   2604 
   2605          // Add in the system schemas
   2606          String[] expected = new String[BUILTIN_SCHEMAS.length
   2607                  + userExpected.length];
   2608 
   2609          System.arraycopy(BUILTIN_SCHEMAS, 0, expected, 0,
   2610                  BUILTIN_SCHEMAS.length);
   2611          System.arraycopy(userExpected, 0, expected, BUILTIN_SCHEMAS.length,
   2612                  userExpected.length);
   2613 
   2614          // Remove any quotes from user schemas and upper case
   2615          // those without quotes.
   2616          for (int i = BUILTIN_SCHEMAS.length; i < expected.length; i++) {
   2617              expected[i] = getStoredIdentifier(expected[i]);
   2618          }
   2619 
   2620          // output is ordered by TABLE_SCHEM
   2621          Arrays.sort(expected);
   2622 
   2623          int nextMatch = 0;
   2624 
   2625          while (rs.next()) {
   2626              String schema = rs.getString("TABLE_SCHEM");
   2627              assertNotNull(schema);
   2628 
   2629              // Catalogs not supported
   2630 //             assertNull(rs.getString("TABLE_CATALOG"));
   2631 
   2632              if (nextMatch < expected.length) {
   2633                  if (expected[nextMatch].equals(schema)) nextMatch++;
   2634              }
   2635          }
   2636          rs.close();
   2637          assertEquals("Schemas missing ", expected.length, nextMatch);
   2638      }
   2639 
   2640      private void assertMatchesPattern(String pattern, String result) {
   2641          if (!doesMatch(pattern, 0, result, 0)) {
   2642              fail("Bad pattern matching:" + pattern + " result:" + result);
   2643          }
   2644 
   2645      }
   2646 
   2647      /**
   2648       * See if a string matches the pattern as defined by DatabaseMetaData. By
   2649       * passing in non-zero values can check sub-sets of the pattern against the
   2650       * sub strings of the result. <BR>
   2651       * _ matches a single character <BR>
   2652       * % matches zero or more characters <BR>
   2653       * Other characters match themselves.
   2654       *
   2655       * @param pattern
   2656       *            Pattern
   2657       * @param pp
   2658       *            Position in pattern to start the actual pattern from
   2659       * @param result
   2660       *            result string
   2661       * @param rp
   2662       *            position in result to starting checking
   2663       * @return true if a match is found
   2664       */
   2665      private boolean doesMatch(String pattern, int pp, String result, int rp) {
   2666          // Find a match
   2667          for (;;) {
   2668              if (pp == pattern.length() && rp == result.length()) return true;
   2669 
   2670              // more characters to match in the result but
   2671              // no more pattern.
   2672              if (pp == pattern.length()) return false;
   2673 
   2674              char pc = pattern.charAt(pp);
   2675              if (pc == '_') {
   2676                  // need to match a single character but
   2677                  // exhausted result, so no match.
   2678                  if (rp == result.length()) return false;
   2679 
   2680                  pp++;
   2681                  rp++;
   2682              } else if (pc == '%') {
   2683                  // % at end, complete match regardless of
   2684                  // position of result since % matches zero or more.
   2685                  if (pp == pattern.length() - 1) {
   2686                      return true;
   2687                  }
   2688 
   2689                  // Brut force, we have a pattern like %X
   2690                  // and we are say in the third character of
   2691                  // abCdefgX
   2692                  // then start a 'CdefgX' and look for a match,
   2693                  // then 'defgX' etc.
   2694                  for (int sp = rp; sp < result.length(); sp++) {
   2695                      if (doesMatch(pattern, pp + 1, result, sp)) {
   2696                          // Have a match for the pattern after the %
   2697                          // which means we have a match for the pattern
   2698                          // with the % since we can match 0 or mor characters
   2699                          // with %.
   2700                          return true;
   2701                      }
   2702                  }
   2703 
   2704                  // Could not match the pattern after the %
   2705                  return false;
   2706              } else {
   2707                  // need to match a single character but
   2708                  // exhausted result, so no match.
   2709                  if (rp == result.length()) return false;
   2710 
   2711                  // Single character, must match exactly.
   2712                  if (pc != result.charAt(rp)) {
   2713                      // Computer says no.
   2714                      return false;
   2715                  }
   2716                  pp++;
   2717                  rp++;
   2718              }
   2719 
   2720          }
   2721 
   2722      }
   2723 
   2724 
   2725      /**
   2726       * Check that the list of escaped functions provided by the driver is a
   2727       * strict subet of the specified set, the list does not contain duplicates,
   2728       * all the functions listed can be executed and that if a function is not in
   2729       * the list but is specified it cannot be executed.
   2730       */
   2731      private void escapedFunctions(String[][] specList, String metaDataList)
   2732              throws SQLException {
   2733 
   2734          boolean[] seenFunction = new boolean[specList.length];
   2735 
   2736          StringTokenizer st = new StringTokenizer(metaDataList, ",");
   2737          int counter = 0;
   2738          while (st.hasMoreTokens()) {
   2739              counter++;
   2740              String function = st.nextToken();
   2741 
   2742              // find this function in the list
   2743              boolean isSpecFunction = false;
   2744              for (int f = 0; f < specList.length; f++) {
   2745                  String[] specDetails = specList[f];
   2746                  if (function.equals(specDetails[0])) {
   2747                      // Matched spec.
   2748                      if (seenFunction[f])
   2749                          fail("Function in list twice: " + function);
   2750                      seenFunction[f] = true;
   2751                      isSpecFunction = true;
   2752                      executeEscaped(specDetails);
   2753                      break;
   2754                  }
   2755              }
   2756 
   2757              if (!isSpecFunction) {
   2758                  fail("Non-JDBC spec function in list: " + function);
   2759              }
   2760          }
   2761 
   2762          // Now see if any speced functions are not in the metadata list
   2763          assertSame("Function missing in metadata impl",specList.length, counter);
   2764          for (int f = 0; f < specList.length; f++) {
   2765              if (seenFunction[f]) continue;
   2766              String[] specDetails = specList[f];
   2767 
   2768              // bug DERBY-723 CHAR maps to wrong function
   2769              if ("CHAR".equals(specDetails[0])) continue;
   2770              try {
   2771                  executeEscaped(specDetails);
   2772                  fail("function works but not declared in list: "
   2773                          + specDetails[0]);
   2774              } catch (SQLException e) {
   2775                  //ok
   2776              }
   2777          }
   2778      }
   2779 
   2780      /**
   2781       * Test we can execute a function listed as a supported
   2782       * JDBC escaped function. We don't care about the actual
   2783       * return value, that should be tested elsewhere in
   2784       * the specific test of a function.
   2785       */
   2786      private void executeEscaped(String[] specDetails)
   2787          throws SQLException
   2788      {
   2789 
   2790          String sql = "SELECT " + specDetails[0] + "(";
   2791 
   2792          for (int p = 0; p < specDetails.length - 1; p++)
   2793          {
   2794              if (p != 0)
   2795                  sql = sql + ", ";
   2796 
   2797              sql = sql + specDetails[p + 1];
   2798          }
   2799 
   2800          sql = sql + ") ;";
   2801 
   2802          System.out.println("DatabaseMetaDataTest.executeEscaped() "+sql);
   2803          Statement st = conn.createStatement();
   2804          ResultSet rs = st.executeQuery(sql);
   2805 
   2806          assertNotNull("not supported function: "+sql,rs);
   2807 
   2808          rs.close();
   2809          st.close();
   2810      }
   2811 
   2812   //END APACHE-DERBY
   2813 }
   2814