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");
