You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by vo...@apache.org on 2018/11/14 12:27:02 UTC

ignite git commit: IGNITE-3467: JDBC: Display catalog as "IGNITE". This closes #5061.

Repository: ignite
Updated Branches:
  refs/heads/master b85b041bc -> 21eb0dead


IGNITE-3467: JDBC: Display catalog as "IGNITE". This closes #5061.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/21eb0dea
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/21eb0dea
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/21eb0dea

Branch: refs/heads/master
Commit: 21eb0dead7b709e437434355f58246e0e8c7a3af
Parents: b85b041
Author: Pavel Kuznetsov <pa...@gmail.com>
Authored: Wed Nov 14 15:26:54 2018 +0300
Committer: devozerov <vo...@gridgain.com>
Committed: Wed Nov 14 15:26:54 2018 +0300

----------------------------------------------------------------------
 .../internal/jdbc2/JdbcMetadataSelfTest.java    | 74 +++++++++++++++++---
 .../jdbc/thin/JdbcThinMetadataSelfTest.java     | 74 +++++++++++++++++---
 .../jdbc/thin/JdbcThinDatabaseMetadata.java     | 38 +++++-----
 .../internal/jdbc2/JdbcDatabaseMetadata.java    | 37 +++++-----
 4 files changed, 173 insertions(+), 50 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/21eb0dea/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcMetadataSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcMetadataSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcMetadataSelfTest.java
index a1c36e1..4c127b6 100755
--- a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcMetadataSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcMetadataSelfTest.java
@@ -25,6 +25,7 @@ import java.sql.ParameterMetaData;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
 import java.sql.Statement;
 import java.sql.Types;
 import java.util.ArrayList;
@@ -175,43 +176,99 @@ public class JdbcMetadataSelfTest extends GridCommonAbstractTest {
         try (Connection conn = DriverManager.getConnection(BASE_URL)) {
             DatabaseMetaData meta = conn.getMetaData();
 
-            ResultSet rs = meta.getTables("", "pers", "%", new String[]{"TABLE"});
+            ResultSet rs = meta.getTables(null, "pers", "%", new String[]{"TABLE"});
             assertNotNull(rs);
             assertTrue(rs.next());
             assertEquals("TABLE", rs.getString("TABLE_TYPE"));
+            assertEquals(JdbcDatabaseMetadata.CATALOG_NAME, rs.getString("TABLE_CAT"));
             assertEquals("PERSON", rs.getString("TABLE_NAME"));
 
-            rs = meta.getTables("", "org", "%", new String[]{"TABLE"});
+            rs = meta.getTables(null, "org", "%", new String[]{"TABLE"});
             assertNotNull(rs);
             assertTrue(rs.next());
             assertEquals("TABLE", rs.getString("TABLE_TYPE"));
+            assertEquals(JdbcDatabaseMetadata.CATALOG_NAME, rs.getString("TABLE_CAT"));
             assertEquals("ORGANIZATION", rs.getString("TABLE_NAME"));
 
-            rs = meta.getTables("", "pers", "%", null);
+            rs = meta.getTables(null, "pers", "%", null);
             assertNotNull(rs);
             assertTrue(rs.next());
             assertEquals("TABLE", rs.getString("TABLE_TYPE"));
+            assertEquals(JdbcDatabaseMetadata.CATALOG_NAME, rs.getString("TABLE_CAT"));
             assertEquals("PERSON", rs.getString("TABLE_NAME"));
 
-            rs = meta.getTables("", "org", "%", null);
+            rs = meta.getTables(null, "org", "%", null);
             assertNotNull(rs);
             assertTrue(rs.next());
             assertEquals("TABLE", rs.getString("TABLE_TYPE"));
+            assertEquals(JdbcDatabaseMetadata.CATALOG_NAME, rs.getString("TABLE_CAT"));
             assertEquals("ORGANIZATION", rs.getString("TABLE_NAME"));
 
-            rs = meta.getTables("", "PUBLIC", "", new String[]{"WRONG"});
+            rs = meta.getTables(null, "PUBLIC", "", new String[]{"WRONG"});
             assertFalse(rs.next());
         }
     }
 
     /**
+     * Negative scenarios for catalog name.
+     * Perform metadata lookups, that use incorrect catalog names.
+     */
+    public void testCatalogWithNotExistingName() throws SQLException {
+        checkNoEntitiesFoundForCatalog("");
+        checkNoEntitiesFoundForCatalog("NOT_EXISTING_CATALOG");
+    }
+
+    /**
+     * Check that lookup in the metadata have been performed using specified catalog name (that is neither {@code null}
+     * nor correct catalog name), empty result set is returned.
+     *
+     * @param invalidCat catalog name that is not either
+     */
+    private void checkNoEntitiesFoundForCatalog(String invalidCat) throws SQLException {
+        try (Connection conn = DriverManager.getConnection(BASE_URL)) {
+            DatabaseMetaData meta = conn.getMetaData();
+
+            // Intention: we set the other arguments that way, the values to have as many results as possible.
+            assertIsEmpty(meta.getTables(invalidCat, null, "%", new String[] {"TABLE"}));
+            assertIsEmpty(meta.getColumns(invalidCat, null, "%", "%"));
+            assertIsEmpty(meta.getColumnPrivileges(invalidCat, "pers", "PERSON", "%"));
+            assertIsEmpty(meta.getTablePrivileges(invalidCat, null, "%"));
+            assertIsEmpty(meta.getPrimaryKeys(invalidCat, "pers", "PERSON"));
+            assertIsEmpty(meta.getImportedKeys(invalidCat, "pers", "PERSON"));
+            assertIsEmpty(meta.getExportedKeys(invalidCat, "pers", "PERSON"));
+            // meta.getCrossReference(...) doesn't make sense because we don't have FK constraint.
+            assertIsEmpty(meta.getIndexInfo(invalidCat, null, "%", false, true));
+            assertIsEmpty(meta.getSuperTables(invalidCat, "%", "%"));
+            assertIsEmpty(meta.getSchemas(invalidCat, null));
+            assertIsEmpty(meta.getPseudoColumns(invalidCat, null, "%", ""));
+        }
+    }
+
+    /**
+     * Assert that specified ResultSet contains no rows.
+     *
+     * @param rs result set to check.
+     * @throws SQLException on error.
+     */
+    private static void assertIsEmpty(ResultSet rs) throws SQLException {
+        try {
+            boolean empty = !rs.next();
+
+            assertTrue("Result should be empty because invalid catalog is specified.", empty);
+        }
+        finally {
+            rs.close();
+        }
+    }
+
+    /**
      * @throws Exception If failed.
      */
     public void testGetColumns() throws Exception {
         try (Connection conn = DriverManager.getConnection(BASE_URL)) {
             DatabaseMetaData meta = conn.getMetaData();
 
-            ResultSet rs = meta.getColumns("", "pers", "PERSON", "%");
+            ResultSet rs = meta.getColumns(null, "pers", "PERSON", "%");
 
             assertNotNull(rs);
 
@@ -256,7 +313,7 @@ public class JdbcMetadataSelfTest extends GridCommonAbstractTest {
             assertTrue(names.isEmpty());
             assertEquals(3, cnt);
 
-            rs = meta.getColumns("", "org", "ORGANIZATION", "%");
+            rs = meta.getColumns(null, "org", "ORGANIZATION", "%");
 
             assertNotNull(rs);
 
@@ -405,7 +462,8 @@ public class JdbcMetadataSelfTest extends GridCommonAbstractTest {
             while (rs.next()) {
                 schemas.add(rs.getString(1));
 
-                assertNull(rs.getString(2));
+                assertEquals("There is only one possible catalog.",
+                    JdbcDatabaseMetadata.CATALOG_NAME, rs.getString(2));
             }
 
             assertEquals(expectedSchemas, schemas);

http://git-wip-us.apache.org/repos/asf/ignite/blob/21eb0dea/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java
index 6e08862..9759965 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java
@@ -25,6 +25,7 @@ import java.sql.ParameterMetaData;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
 import java.sql.Statement;
 import java.sql.Types;
 import java.util.ArrayList;
@@ -44,6 +45,7 @@ import org.apache.ignite.cache.query.annotations.QuerySqlField;
 import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.internal.IgniteVersionUtils;
+import org.apache.ignite.internal.jdbc.thin.JdbcThinDatabaseMetadata;
 import org.apache.ignite.internal.processors.query.QueryEntityEx;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
@@ -202,39 +204,43 @@ public class JdbcThinMetadataSelfTest extends JdbcThinAbstractSelfTest {
         try (Connection conn = DriverManager.getConnection(URL)) {
             DatabaseMetaData meta = conn.getMetaData();
 
-            ResultSet rs = meta.getTables("", "pers", "%", new String[]{"TABLE"});
+            ResultSet rs = meta.getTables(null, "pers", "%", new String[]{"TABLE"});
             assertNotNull(rs);
             assertTrue(rs.next());
             assertEquals("TABLE", rs.getString("TABLE_TYPE"));
+            assertEquals(JdbcThinDatabaseMetadata.CATALOG_NAME, rs.getString("TABLE_CAT"));
             assertEquals("PERSON", rs.getString("TABLE_NAME"));
 
             assertFalse(rs.next());
 
-            rs = meta.getTables("", "org", "%", new String[]{"TABLE"});
+            rs = meta.getTables(null, "org", "%", new String[]{"TABLE"});
             assertNotNull(rs);
             assertTrue(rs.next());
             assertEquals("TABLE", rs.getString("TABLE_TYPE"));
+            assertEquals(JdbcThinDatabaseMetadata.CATALOG_NAME, rs.getString("TABLE_CAT"));
             assertEquals("ORGANIZATION", rs.getString("TABLE_NAME"));
 
             assertFalse(rs.next());
 
-            rs = meta.getTables("", "pers", "%", null);
+            rs = meta.getTables(null, "pers", "%", null);
             assertNotNull(rs);
             assertTrue(rs.next());
             assertEquals("TABLE", rs.getString("TABLE_TYPE"));
+            assertEquals(JdbcThinDatabaseMetadata.CATALOG_NAME, rs.getString("TABLE_CAT"));
             assertEquals("PERSON", rs.getString("TABLE_NAME"));
 
             assertFalse(rs.next());
 
-            rs = meta.getTables("", "org", "%", null);
+            rs = meta.getTables(null, "org", "%", null);
             assertNotNull(rs);
             assertTrue(rs.next());
             assertEquals("TABLE", rs.getString("TABLE_TYPE"));
+            assertEquals(JdbcThinDatabaseMetadata.CATALOG_NAME, rs.getString("TABLE_CAT"));
             assertEquals("ORGANIZATION", rs.getString("TABLE_NAME"));
 
             assertFalse(rs.next());
 
-            rs = meta.getTables("", "PUBLIC", "", new String[]{"WRONG"});
+            rs = meta.getTables(null, "PUBLIC", "", new String[]{"WRONG"});
             assertFalse(rs.next());
         }
     }
@@ -278,7 +284,7 @@ public class JdbcThinMetadataSelfTest extends JdbcThinAbstractSelfTest {
 
             DatabaseMetaData meta = conn.getMetaData();
 
-            ResultSet rs = meta.getColumns("", "pers", "PERSON", "%");
+            ResultSet rs = meta.getColumns(null, "pers", "PERSON", "%");
 
             ResultSetMetaData rsMeta = rs.getMetaData();
 
@@ -339,7 +345,7 @@ public class JdbcThinMetadataSelfTest extends JdbcThinAbstractSelfTest {
             assert names.isEmpty();
             assert cnt == 3;
 
-            rs = meta.getColumns("", "org", "ORGANIZATION", "%");
+            rs = meta.getColumns(null, "org", "ORGANIZATION", "%");
 
             assert rs != null;
 
@@ -614,13 +620,65 @@ public class JdbcThinMetadataSelfTest extends JdbcThinAbstractSelfTest {
             while (rs.next()) {
                 schemas.add(rs.getString(1));
 
-                assert rs.getString(2) == null;
+                assertEquals("There is only one possible catalog.",
+                    JdbcThinDatabaseMetadata.CATALOG_NAME, rs.getString(2));
             }
 
             assert expectedSchemas.equals(schemas) : "Unexpected schemas: " + schemas +
                 ". Expected schemas: " + expectedSchemas;
         }
     }
+    /**
+     * Negative scenarios for catalog name.
+     * Perform metadata lookups, that use incorrect catalog names.
+     */
+    public void testCatalogWithNotExistingName() throws SQLException {
+        checkNoEntitiesFoundForCatalog("");
+        checkNoEntitiesFoundForCatalog("NOT_EXISTING_CATALOG");
+    }
+
+    /**
+     * Check that lookup in the metadata have been performed using specified catalog name (that is neither {@code null}
+     * nor correct catalog name), empty result set is returned.
+     *
+     * @param invalidCat catalog name that is not either
+     */
+    private void checkNoEntitiesFoundForCatalog(String invalidCat) throws SQLException {
+        try (Connection conn = DriverManager.getConnection(URL)) {
+            DatabaseMetaData meta = conn.getMetaData();
+
+            // Intention: we set the other arguments that way, the values to have as many results as possible.
+            assertIsEmpty(meta.getTables(invalidCat, null, "%", new String[] {"TABLE"}));
+            assertIsEmpty(meta.getColumns(invalidCat, null, "%", "%"));
+            assertIsEmpty(meta.getColumnPrivileges(invalidCat, "pers", "PERSON", "%"));
+            assertIsEmpty(meta.getTablePrivileges(invalidCat, null, "%"));
+            assertIsEmpty(meta.getPrimaryKeys(invalidCat, "pers", "PERSON"));
+            assertIsEmpty(meta.getImportedKeys(invalidCat, "pers", "PERSON"));
+            assertIsEmpty(meta.getExportedKeys(invalidCat, "pers", "PERSON"));
+            // meta.getCrossReference(...) doesn't make sense because we don't have FK constraint.
+            assertIsEmpty(meta.getIndexInfo(invalidCat, null, "%", false, true));
+            assertIsEmpty(meta.getSuperTables(invalidCat, "%", "%"));
+            assertIsEmpty(meta.getSchemas(invalidCat, null));
+            assertIsEmpty(meta.getPseudoColumns(invalidCat, null, "%", ""));
+        }
+    }
+
+    /**
+     * Assert that specified ResultSet contains no rows.
+     *
+     * @param rs result set to check.
+     * @throws SQLException on error.
+     */
+    private static void assertIsEmpty(ResultSet rs) throws SQLException {
+        try {
+            boolean empty = !rs.next();
+
+            assertTrue("Result should be empty because invalid catalog is specified.", empty);
+        }
+        finally {
+            rs.close();
+        }
+    }
 
     /**
      * @throws Exception If failed.

http://git-wip-us.apache.org/repos/asf/ignite/blob/21eb0dea/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java
index e24ecbb..f79b16d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java
@@ -43,7 +43,6 @@ import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaTablesRequest;
 import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaTablesResult;
 import org.apache.ignite.internal.processors.odbc.jdbc.JdbcPrimaryKeyMeta;
 import org.apache.ignite.internal.processors.odbc.jdbc.JdbcTableMeta;
-import org.apache.ignite.internal.util.typedef.F;
 
 import static java.sql.Connection.TRANSACTION_NONE;
 import static java.sql.Connection.TRANSACTION_REPEATABLE_READ;
@@ -57,6 +56,9 @@ import static java.sql.RowIdLifetime.ROWID_UNSUPPORTED;
  */
 @SuppressWarnings("RedundantCast")
 public class JdbcThinDatabaseMetadata implements DatabaseMetaData {
+    /** The only possible name for catalog. */
+    public static final String CATALOG_NAME = "IGNITE";
+
     /** Driver name. */
     public static final String DRIVER_NAME = "Apache Ignite Thin JDBC Driver";
 
@@ -737,7 +739,7 @@ public class JdbcThinDatabaseMetadata implements DatabaseMetaData {
             }
         }
 
-        if (!validCatalogPattern(catalog) || !tblTypeMatch)
+        if (!isValidCatalog(catalog) || !tblTypeMatch)
             return new JdbcThinResultSet(Collections.<List<Object>>emptyList(), meta);
 
         JdbcMetaTablesResult res = conn.sendRequest(new JdbcMetaTablesRequest(schemaPtrn, tblNamePtrn));
@@ -757,7 +759,7 @@ public class JdbcThinDatabaseMetadata implements DatabaseMetaData {
     private List<Object> tableRow(JdbcTableMeta tblMeta) {
         List<Object> row = new ArrayList<>(10);
 
-        row.add(null);
+        row.add(CATALOG_NAME);
         row.add(tblMeta.schemaName());
         row.add(tblMeta.tableName());
         row.add("TABLE");
@@ -779,7 +781,7 @@ public class JdbcThinDatabaseMetadata implements DatabaseMetaData {
     /** {@inheritDoc} */
     @SuppressWarnings("ArraysAsListWithZeroOrOneArgument")
     @Override public ResultSet getCatalogs() throws SQLException {
-        return new JdbcThinResultSet(Collections.<List<Object>>emptyList(),
+        return new JdbcThinResultSet(Collections.singletonList(Collections.singletonList(CATALOG_NAME)),
             Arrays.asList(new JdbcColumnMeta(null, null, "TABLE_CAT", String.class)));
     }
 
@@ -822,7 +824,7 @@ public class JdbcThinDatabaseMetadata implements DatabaseMetaData {
             new JdbcColumnMeta(null, null, "IS_GENERATEDCOLUMN ", String.class) // 24
         );
 
-        if (!validCatalogPattern(catalog))
+        if (!isValidCatalog(catalog))
             return new JdbcThinResultSet(Collections.<List<Object>>emptyList(), meta);
 
         JdbcMetaColumnsResult res = conn.sendRequest(new JdbcMetaColumnsRequest(schemaPtrn, tblNamePtrn, colNamePtrn));
@@ -841,9 +843,9 @@ public class JdbcThinDatabaseMetadata implements DatabaseMetaData {
      * @return Column metadata row.
      */
     private List<Object> columnRow(JdbcColumnMeta colMeta, int pos) {
-        List<Object> row = new ArrayList<>(20);
+        List<Object> row = new ArrayList<>(24);
 
-        row.add((String)null);                  // 1. TABLE_CAT
+        row.add(CATALOG_NAME);                  // 1. TABLE_CAT
         row.add(colMeta.schemaName());          // 2. TABLE_SCHEM
         row.add(colMeta.tableName());           // 3. TABLE_NAME
         row.add(colMeta.columnName());          // 4. COLUMN_NAME
@@ -941,7 +943,7 @@ public class JdbcThinDatabaseMetadata implements DatabaseMetaData {
             new JdbcColumnMeta(null, null, "KEY_SEQ", Short.class),
             new JdbcColumnMeta(null, null, "PK_NAME", String.class));
 
-        if (!validCatalogPattern(catalog))
+        if (!isValidCatalog(catalog))
             return new JdbcThinResultSet(Collections.<List<Object>>emptyList(), meta);
 
         JdbcMetaPrimaryKeysResult res = conn.sendRequest(new JdbcMetaPrimaryKeysRequest(schema, tbl));
@@ -964,7 +966,7 @@ public class JdbcThinDatabaseMetadata implements DatabaseMetaData {
         for (int i = 0; i < pkMeta.fields().size(); ++i) {
             List<Object> row = new ArrayList<>(6);
 
-            row.add((String)null); // table catalog
+            row.add(CATALOG_NAME); // table catalog
             row.add(pkMeta.schemaName());
             row.add(pkMeta.tableName());
             row.add(pkMeta.fields().get(i));
@@ -1168,7 +1170,7 @@ public class JdbcThinDatabaseMetadata implements DatabaseMetaData {
             new JdbcColumnMeta(null, null, "PAGES", Integer.class),
             new JdbcColumnMeta(null, null, "FILTER_CONDITION", String.class));
 
-        if (!validCatalogPattern(catalog))
+        if (!isValidCatalog(catalog))
             return new JdbcThinResultSet(Collections.<List<Object>>emptyList(), meta);
 
         JdbcMetaIndexesResult res = conn.sendRequest(new JdbcMetaIndexesRequest(schema, tbl));
@@ -1191,7 +1193,7 @@ public class JdbcThinDatabaseMetadata implements DatabaseMetaData {
         for (int i = 0; i < idxMeta.fields().size(); ++i) {
             List<Object> row = new ArrayList<>(13);
 
-            row.add((String)null); // table catalog
+            row.add(CATALOG_NAME); // table catalog
             row.add(idxMeta.schemaName());
             row.add(idxMeta.tableName());
             row.add(true); // non unique
@@ -1421,7 +1423,7 @@ public class JdbcThinDatabaseMetadata implements DatabaseMetaData {
             new JdbcColumnMeta(null, null, "TABLE_CATALOG", String.class)
         );
 
-        if (!validCatalogPattern(catalog))
+        if (!isValidCatalog(catalog))
             return new JdbcThinResultSet(Collections.<List<Object>>emptyList(), meta);
 
         JdbcMetaSchemasResult res = conn.sendRequest(new JdbcMetaSchemasRequest(schemaPtrn));
@@ -1432,7 +1434,7 @@ public class JdbcThinDatabaseMetadata implements DatabaseMetaData {
             List<Object> row = new ArrayList<>(2);
 
             row.add(schema);
-            row.add(null);
+            row.add(CATALOG_NAME);
 
             rows.add(row);
         }
@@ -1533,12 +1535,14 @@ public class JdbcThinDatabaseMetadata implements DatabaseMetaData {
     }
 
     /**
-     * @param catalog Catalog pattern.
-     * @return {@code true} If patter is valid for Ignite (null, empty, or '%' wildcard).
+     * Checks if specified catalog matches the only possible catalog value. See {@link #CATALOG_NAME}.
+     *
+     * @param catalog Catalog name or {@code null}.
+     * @return {@code true} If catalog equal ignoring case to {@link #CATALOG_NAME} or null (which means any catalog).
      *  Otherwise returns {@code false}.
      */
-    private static boolean validCatalogPattern(String catalog) {
-        return F.isEmpty(catalog) || "%".equals(catalog);
+    private static boolean isValidCatalog(String catalog) {
+        return catalog == null || catalog.equalsIgnoreCase(CATALOG_NAME);
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/21eb0dea/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcDatabaseMetadata.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcDatabaseMetadata.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcDatabaseMetadata.java
index 846ec06..20cf0d3 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcDatabaseMetadata.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcDatabaseMetadata.java
@@ -53,6 +53,9 @@ import static org.apache.ignite.internal.jdbc2.JdbcUtils.convertToSqlException;
  * JDBC database metadata implementation.
  */
 public class JdbcDatabaseMetadata implements DatabaseMetaData {
+    /** The only possible name for catalog. */
+    public static final String CATALOG_NAME = "IGNITE";
+
     /** Driver name. */
     public static final String DRIVER_NAME = "Apache Ignite JDBC Driver";
 
@@ -714,7 +717,7 @@ public class JdbcDatabaseMetadata implements DatabaseMetaData {
 
         List<List<?>> rows = new LinkedList<>();
 
-        if (validCatalogPattern(catalog) && (tblTypes == null || Arrays.asList(tblTypes).contains("TABLE"))) {
+        if (isValidCatalog(catalog) && (tblTypes == null || Arrays.asList(tblTypes).contains("TABLE"))) {
             for (Map.Entry<String, Map<String, Map<String, ColumnInfo>>> schema : meta.entrySet()) {
                 if (matches(schema.getKey(), schemaPtrn)) {
                     for (String tbl : schema.getValue().keySet()) {
@@ -745,7 +748,7 @@ public class JdbcDatabaseMetadata implements DatabaseMetaData {
     private List<Object> tableRow(String schema, String tbl) {
         List<Object> row = new ArrayList<>(10);
 
-        row.add(null);
+        row.add(CATALOG_NAME);
         row.add(schema);
         row.add(tbl.toUpperCase());
         row.add("TABLE");
@@ -771,7 +774,7 @@ public class JdbcDatabaseMetadata implements DatabaseMetaData {
             Collections.<String>emptyList(),
             Collections.singletonList("TABLE_CAT"),
             Collections.singletonList(String.class.getName()),
-            Collections.<List<?>>emptyList(),
+            Collections.singletonList(Collections.singletonList(CATALOG_NAME)),
             true
         );
     }
@@ -796,7 +799,7 @@ public class JdbcDatabaseMetadata implements DatabaseMetaData {
 
         int cnt = 0;
 
-        if (validCatalogPattern(catalog)) {
+        if (isValidCatalog(catalog)) {
             for (Map.Entry<String, Map<String, Map<String, ColumnInfo>>> schema : meta.entrySet()) {
                 if (matches(schema.getKey(), schemaPtrn)) {
                     for (Map.Entry<String, Map<String, ColumnInfo>> tbl : schema.getValue().entrySet()) {
@@ -881,9 +884,9 @@ public class JdbcDatabaseMetadata implements DatabaseMetaData {
      */
     private List<Object> columnRow(String schema, String tbl, String col, int type, String typeName,
         boolean nullable, int pos) {
-        List<Object> row = new ArrayList<>(20);
+        List<Object> row = new ArrayList<>(24);
 
-        row.add(null);                  // 1. TABLE_CAT
+        row.add(CATALOG_NAME);          // 1. TABLE_CAT
         row.add(schema);                // 2. TABLE_SCHEM
         row.add(tbl);                   // 3. TABLE_NAME
         row.add(col);                   // 4. COLUMN_NAME
@@ -969,12 +972,12 @@ public class JdbcDatabaseMetadata implements DatabaseMetaData {
 
         List<List<?>> rows = new LinkedList<>();
 
-        if (validCatalogPattern(catalog)) {
+        if (isValidCatalog(catalog)) {
             for (Map.Entry<String, Map<String, Map<String, ColumnInfo>>> schema : meta.entrySet()) {
                 if (matches(schema.getKey(), schemaPtrn)) {
                     for (Map.Entry<String, Map<String, ColumnInfo>> tbl : schema.getValue().entrySet()) {
                         if (matches(tbl.getKey(), tblNamePtrn))
-                            rows.add(Arrays.<Object>asList(null, schema.getKey(), tbl.getKey(), "_KEY", 1, "_KEY"));
+                            rows.add(Arrays.<Object>asList(CATALOG_NAME, schema.getKey(), tbl.getKey(), "_KEY", 1, "_KEY"));
                     }
                 }
             }
@@ -1046,7 +1049,7 @@ public class JdbcDatabaseMetadata implements DatabaseMetaData {
 
         List<List<?>> rows = new ArrayList<>(indexes.size());
 
-        if (validCatalogPattern(catalog)) {
+        if (isValidCatalog(catalog)) {
             for (List<Object> idx : indexes) {
                 String idxSchema = (String)idx.get(0);
                 String idxTbl = (String)idx.get(1);
@@ -1054,7 +1057,7 @@ public class JdbcDatabaseMetadata implements DatabaseMetaData {
                 if ((schema == null || schema.equals(idxSchema)) && (tbl == null || tbl.equals(idxTbl))) {
                     List<Object> row = new ArrayList<>(13);
 
-                    row.add(null);
+                    row.add(CATALOG_NAME);
                     row.add(idxSchema);
                     row.add(idxTbl);
                     row.add(idx.get(2));
@@ -1270,10 +1273,10 @@ public class JdbcDatabaseMetadata implements DatabaseMetaData {
 
         List<List<?>> rows = new ArrayList<>(meta.size());
 
-        if (validCatalogPattern(catalog)) {
+        if (isValidCatalog(catalog)) {
             for (String schema : meta.keySet()) {
                 if (matches(schema, schemaPtrn))
-                    rows.add(Arrays.<Object>asList(schema, null));
+                    rows.add(Arrays.<Object>asList(schema, CATALOG_NAME));
             }
         }
 
@@ -1452,14 +1455,14 @@ public class JdbcDatabaseMetadata implements DatabaseMetaData {
     }
 
     /**
-     * Checks whether pattern matches any catalog.
+     * Checks if specified catalog matches the only possible catalog value. See {@link #CATALOG_NAME}.
      *
-     * @param catalog Catalog pattern.
-     * @return {@code true} If patter is valid for Ignite (null, empty, or '%' wildcard).
+     * @param catalog Catalog name or {@code null}.
+     * @return {@code true} If catalog equal ignoring case to {@link #CATALOG_NAME} or null (which means any catalog).
      *  Otherwise returns {@code false}.
      */
-    private static boolean validCatalogPattern(String catalog) {
-        return F.isEmpty(catalog) || "%".equals(catalog);
+    private static boolean isValidCatalog(String catalog) {
+        return catalog == null || catalog.equalsIgnoreCase(CATALOG_NAME);
     }
 
     /**