Repository: ignite
Updated Branches:
  refs/heads/master 2c78ad25c -> 153daeb73


IGNITE-9891: ODBC: fixed table metadata handling. This closes #4995.


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

Branch: refs/heads/master
Commit: 153daeb73970720fbb4831840ded2b0327891516
Parents: 2c78ad2
Author: Igor Sapego <[email protected]>
Authored: Tue Oct 16 17:37:39 2018 +0300
Committer: devozerov <[email protected]>
Committed: Tue Oct 16 17:37:39 2018 +0300

----------------------------------------------------------------------
 .../odbc/odbc/OdbcRequestHandler.java           | 33 ++++++++++++++++++-
 .../cpp/odbc-test/src/meta_queries_test.cpp     | 34 ++++++++++++++++++++
 2 files changed, 66 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/153daeb7/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcRequestHandler.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcRequestHandler.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcRequestHandler.java
index 6f3324d..723ce5c 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcRequestHandler.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcRequestHandler.java
@@ -691,7 +691,7 @@ public class OdbcRequestHandler implements 
ClientListenerRequestHandler {
                 for (GridQueryTypeDescriptor table : 
ctx.query().types(cacheName)) {
                     if (!matches(table.schemaName(), schemaPattern) ||
                         !matches(table.tableName(), req.table()) ||
-                        !matches("TABLE", req.tableType()))
+                        !matchesTableType("TABLE", req.tableType()))
                         continue;
 
                     OdbcTableMeta tableMeta = new OdbcTableMeta(null, 
table.schemaName(), table.tableName(), "TABLE");
@@ -855,6 +855,37 @@ public class OdbcRequestHandler implements 
ClientListenerRequestHandler {
     }
 
     /**
+     * Checks whether string matches table type pattern.
+     *
+     * @param str String.
+     * @param ptrn Pattern.
+     * @return Whether string matches pattern.
+     */
+    private static boolean matchesTableType(String str, String ptrn) {
+        if (F.isEmpty(ptrn))
+            return true;
+
+        if (str == null)
+            return false;
+
+        String pattern = ptrn.toUpperCase().replace("%", ".*").replace("_", 
".");
+
+        String[] types = pattern.split(",");
+
+        for (String type0 : types) {
+            String type = type0.trim();
+
+            if (type.length() >= 2 && type.matches("['\"].*['\"]"))
+                type = type.substring(1, type.length() - 1);
+
+            if (str.toUpperCase().matches(type))
+                return true;
+        }
+
+        return false;
+    }
+
+    /**
      * Checks whether string matches SQL pattern.
      *
      * @param str String.

http://git-wip-us.apache.org/repos/asf/ignite/blob/153daeb7/modules/platforms/cpp/odbc-test/src/meta_queries_test.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/odbc-test/src/meta_queries_test.cpp 
b/modules/platforms/cpp/odbc-test/src/meta_queries_test.cpp
index 82dbf3a..d3b4a26 100644
--- a/modules/platforms/cpp/odbc-test/src/meta_queries_test.cpp
+++ b/modules/platforms/cpp/odbc-test/src/meta_queries_test.cpp
@@ -341,6 +341,40 @@ BOOST_AUTO_TEST_CASE(TestDdlTablesMeta)
     BOOST_REQUIRE_EQUAL(ret, SQL_NO_DATA);
 }
 
+BOOST_AUTO_TEST_CASE(TestDdlTablesMetaTableTypeList)
+{
+    Connect("DRIVER={Apache Ignite};ADDRESS=127.0.0.1:11110;SCHEMA=PUBLIC");
+
+    SQLCHAR createTable[] = "create table TestTable(id int primary key, 
testColumn varchar)";
+    SQLRETURN ret = SQLExecDirect(stmt, createTable, SQL_NTS);
+
+    if (!SQL_SUCCEEDED(ret))
+        BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
+
+    SQLCHAR empty[] = "";
+    SQLCHAR table[] = "TestTable";
+    SQLCHAR typeList[] = "TABLE,VIEW";
+
+    ret = SQLTables(stmt, empty, SQL_NTS, empty, SQL_NTS, table, SQL_NTS, 
typeList, SQL_NTS);
+
+    if (!SQL_SUCCEEDED(ret))
+        BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
+
+    ret = SQLFetch(stmt);
+
+    if (!SQL_SUCCEEDED(ret))
+        BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
+
+    CheckStringColumn(stmt, 1, "");
+    CheckStringColumn(stmt, 2, "\"PUBLIC\"");
+    CheckStringColumn(stmt, 3, "TESTTABLE");
+    CheckStringColumn(stmt, 4, "TABLE");
+
+    ret = SQLFetch(stmt);
+
+    BOOST_REQUIRE_EQUAL(ret, SQL_NO_DATA);
+}
+
 BOOST_AUTO_TEST_CASE(TestDdlColumnsMeta)
 {
     Connect("DRIVER={Apache Ignite};ADDRESS=127.0.0.1:11110;SCHEMA=PUBLIC");

Reply via email to