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)
