IGNITE-7189: Fixed names of DDL-created tables returned by ODBC

This closes #3223


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

Branch: refs/heads/ignite-zk
Commit: 325f5a9df67b32a123e9181fd8a1a610c6ef1f78
Parents: d77c3da
Author: Igor Sapego <[email protected]>
Authored: Tue Dec 26 12:26:30 2017 +0300
Committer: Igor Sapego <[email protected]>
Committed: Tue Dec 26 12:28:22 2017 +0300

----------------------------------------------------------------------
 .../odbc/odbc/OdbcRequestHandler.java           | 43 +++------
 .../cpp/odbc-test/src/meta_queries_test.cpp     | 99 ++++++++++++++++++++
 .../cpp/odbc-test/src/queries_test.cpp          |  4 +-
 .../platforms/cpp/odbc-test/src/test_utils.cpp  | 10 +-
 4 files changed, 121 insertions(+), 35 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/325f5a9d/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 3bc5a23..bfc8d9e 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
@@ -429,26 +429,18 @@ public class OdbcRequestHandler implements 
ClientListenerRequestHandler {
                 tablePattern = req.tablePattern();
             }
 
-            GridQueryIndexing indexing = ctx.query().getIndexing();
-
-            for (String cacheName : ctx.cache().cacheNames()) {
-                String cacheSchema = indexing.schema(cacheName);
-
-                if (!matches(cacheSchema, schemaPattern))
-                    continue;
-
-                Collection<GridQueryTypeDescriptor> tablesMeta = 
ctx.query().types(cacheName);
-
-                for (GridQueryTypeDescriptor table : tablesMeta) {
-                    if (!matches(table.name(), tablePattern))
+            for (String cacheName : ctx.cache().publicCacheNames()) {
+                for (GridQueryTypeDescriptor table : 
ctx.query().types(cacheName)) {
+                    if (!matches(table.schemaName(), schemaPattern) ||
+                        !matches(table.tableName(), tablePattern))
                         continue;
 
                     for (Map.Entry<String, Class<?>> field : 
table.fields().entrySet()) {
                         if (!matches(field.getKey(), req.columnPattern()))
                             continue;
 
-                    OdbcColumnMeta columnMeta = new 
OdbcColumnMeta(cacheSchema, table.name(),
-                        field.getKey(), field.getValue());
+                        OdbcColumnMeta columnMeta = new 
OdbcColumnMeta(table.schemaName(), table.tableName(),
+                            field.getKey(), field.getValue());
 
                         if (!meta.contains(columnMeta))
                             meta.add(columnMeta);
@@ -479,25 +471,14 @@ public class OdbcRequestHandler implements 
ClientListenerRequestHandler {
 
             String schemaPattern = 
OdbcUtils.removeQuotationMarksIfNeeded(req.schema());
 
-            GridQueryIndexing indexing = ctx.query().getIndexing();
-
-            for (String cacheName : ctx.cache().cacheNames())
-            {
-                String cacheSchema = indexing.schema(cacheName);
-
-                if (!matches(cacheSchema, schemaPattern))
-                    continue;
-
-                Collection<GridQueryTypeDescriptor> tablesMeta = 
ctx.query().types(cacheName);
-
-                for (GridQueryTypeDescriptor table : tablesMeta) {
-                    if (!matches(table.name(), req.table()))
-                        continue;
-
-                    if (!matches("TABLE", req.tableType()))
+            for (String cacheName : ctx.cache().publicCacheNames()) {
+                for (GridQueryTypeDescriptor table : 
ctx.query().types(cacheName)) {
+                    if (!matches(table.schemaName(), schemaPattern) ||
+                        !matches(table.tableName(), req.table()) ||
+                        !matches("TABLE", req.tableType()))
                         continue;
 
-                    OdbcTableMeta tableMeta = new OdbcTableMeta(null, 
cacheName, table.name(), "TABLE");
+                    OdbcTableMeta tableMeta = new OdbcTableMeta(null, 
table.schemaName(), table.tableName(), "TABLE");
 
                     if (!meta.contains(tableMeta))
                         meta.add(tableMeta);

http://git-wip-us.apache.org/repos/asf/ignite/blob/325f5a9d/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 5d4e22f..ba9fd04 100644
--- a/modules/platforms/cpp/odbc-test/src/meta_queries_test.cpp
+++ b/modules/platforms/cpp/odbc-test/src/meta_queries_test.cpp
@@ -164,6 +164,29 @@ struct MetaQueriesTestSuiteFixture
     }
 
     /**
+     * Check string column.
+     *
+     * @param stmt Statement.
+     * @param colId Column ID to check.
+     * @param value Expected value.
+     */
+    void CheckStringColumn(SQLHSTMT stmt, int colId, const std::string& value)
+    {
+        char buf[1024];
+        SQLLEN bufLen = sizeof(buf);
+
+        SQLRETURN ret = SQLGetData(stmt, colId, SQL_C_CHAR, buf, sizeof(buf), 
&bufLen);
+
+        if (!SQL_SUCCEEDED(ret))
+            BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
+
+        if (bufLen <= 0)
+            BOOST_CHECK(value.empty());
+        else
+            BOOST_CHECK_EQUAL(std::string(buf, static_cast<size_t>(bufLen)), 
value);
+    }
+
+    /**
      * Constructor.
      */
     MetaQueriesTestSuiteFixture() :
@@ -350,4 +373,80 @@ BOOST_AUTO_TEST_CASE(TestGetInfoScrollOptions)
     BOOST_CHECK_NE(val, 0);
 }
 
+BOOST_AUTO_TEST_CASE(TestDdlTablesMeta)
+{
+    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";
+
+    ret = SQLTables(stmt, empty, SQL_NTS, empty, SQL_NTS, table, SQL_NTS, 
empty, 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");
+
+    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";
+
+    ret = SQLColumns(stmt, empty, SQL_NTS, empty, SQL_NTS, table, SQL_NTS, 
empty, 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, "ID");
+
+    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, "TESTCOLUMN");
+
+    ret = SQLFetch(stmt);
+
+    BOOST_REQUIRE_EQUAL(ret, SQL_NO_DATA);
+}
+
 BOOST_AUTO_TEST_SUITE_END()

http://git-wip-us.apache.org/repos/asf/ignite/blob/325f5a9d/modules/platforms/cpp/odbc-test/src/queries_test.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/odbc-test/src/queries_test.cpp 
b/modules/platforms/cpp/odbc-test/src/queries_test.cpp
index b11c8b1..bf9876a 100644
--- a/modules/platforms/cpp/odbc-test/src/queries_test.cpp
+++ b/modules/platforms/cpp/odbc-test/src/queries_test.cpp
@@ -1268,11 +1268,11 @@ void CheckMeta(char columns[n][k], SQLLEN columnsLen[n])
 
     if (schema == "\"cache\"")
     {
-        BOOST_CHECK_EQUAL(table, std::string("TestType"));
+        BOOST_CHECK_EQUAL(table, std::string("TESTTYPE"));
     }
     else if (schema == "\"cache2\"")
     {
-        BOOST_CHECK_EQUAL(table, std::string("ComplexType"));
+        BOOST_CHECK_EQUAL(table, std::string("COMPLEXTYPE"));
     }
     else
     {

http://git-wip-us.apache.org/repos/asf/ignite/blob/325f5a9d/modules/platforms/cpp/odbc-test/src/test_utils.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/odbc-test/src/test_utils.cpp 
b/modules/platforms/cpp/odbc-test/src/test_utils.cpp
index 3e1a9d7..eb08660 100644
--- a/modules/platforms/cpp/odbc-test/src/test_utils.cpp
+++ b/modules/platforms/cpp/odbc-test/src/test_utils.cpp
@@ -44,8 +44,14 @@ namespace ignite_test
 
         SQLGetDiagRec(handleType, handle, 1, sqlstate, &nativeCode, message, 
ODBC_BUFFER_SIZE, &reallen);
 
-        return std::string(reinterpret_cast<char*>(sqlstate)) + ": " +
-            std::string(reinterpret_cast<char*>(message), reallen);
+        std::string res(reinterpret_cast<char*>(sqlstate));
+
+        if (!res.empty())
+            res.append(": ").append(reinterpret_cast<char*>(message), reallen);
+        else
+            res = "No results";
+
+        return res;
     }
 
     void InitConfig(ignite::IgniteConfiguration& cfg, const char* cfgFile)

Reply via email to