Repository: ignite Updated Branches: refs/heads/master 59db29138 -> 665aa9508
IGNITE-10009: ODBC fix for escaped table names This closes #5080 Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/665aa950 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/665aa950 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/665aa950 Branch: refs/heads/master Commit: 665aa9508687e0c37fa81ad0832b60d0e2b7e7b3 Parents: 59db291 Author: Igor Sapego <isap...@apache.org> Authored: Thu Nov 15 17:08:00 2018 +0300 Committer: Igor Sapego <isap...@apache.org> Committed: Thu Nov 15 17:08:00 2018 +0300 ---------------------------------------------------------------------- .../odbc/odbc/OdbcRequestHandler.java | 12 ++---- .../processors/odbc/odbc/OdbcUtils.java | 22 ++++++++++ .../cpp/odbc-test/src/meta_queries_test.cpp | 43 ++++++++++++++++++++ 3 files changed, 68 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/665aa950/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 723ce5c..10cfd6d 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 @@ -868,15 +868,12 @@ public class OdbcRequestHandler implements ClientListenerRequestHandler { if (str == null) return false; - String pattern = ptrn.toUpperCase().replace("%", ".*").replace("_", "."); + String pattern = OdbcUtils.preprocessPattern(ptrn); 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); + String type = OdbcUtils.removeQuotationMarksIfNeeded(type0.trim()); if (str.toUpperCase().matches(type)) return true; @@ -899,10 +896,7 @@ public class OdbcRequestHandler implements ClientListenerRequestHandler { if (str == null) return false; - String pattern = ptrn.toUpperCase().replace("%", ".*").replace("_", "."); - - if (pattern.length() >= 2 && pattern.matches("['\"].*['\"]")) - pattern = pattern.substring(1, pattern.length() - 1); + String pattern = OdbcUtils.preprocessPattern(ptrn); return str.toUpperCase().matches(pattern); } http://git-wip-us.apache.org/repos/asf/ignite/blob/665aa950/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcUtils.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcUtils.java index 966d7bb..d294ac2 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcUtils.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcUtils.java @@ -25,6 +25,7 @@ import org.apache.ignite.internal.processors.cache.QueryCursorImpl; import org.apache.ignite.internal.processors.cache.query.IgniteQueryErrorCode; import org.apache.ignite.internal.processors.odbc.SqlListenerDataTypes; import org.apache.ignite.internal.processors.query.IgniteSQLException; +import org.apache.ignite.internal.util.typedef.F; /** * Various ODBC utility methods. @@ -57,6 +58,27 @@ public class OdbcUtils { } /** + * Pre-process table or column pattern. + * + * @param ptrn Pattern to pre-process. + * @return Processed pattern. + */ + public static String preprocessPattern(String ptrn) { + if (F.isEmpty(ptrn)) + return ptrn; + + String ptrn0 = ' ' + removeQuotationMarksIfNeeded(ptrn.toUpperCase()); + + ptrn0 = ptrn0.replaceAll("([^\\\\])%", "$1.*"); + + ptrn0 = ptrn0.replaceAll("([^\\\\])_", "$1."); + + ptrn0 = ptrn0.replaceAll("\\\\(.)", "$1"); + + return ptrn0.substring(1); + } + + /** * Private constructor. */ private OdbcUtils() { http://git-wip-us.apache.org/repos/asf/ignite/blob/665aa950/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 d3b4a26..1edda7c 100644 --- a/modules/platforms/cpp/odbc-test/src/meta_queries_test.cpp +++ b/modules/platforms/cpp/odbc-test/src/meta_queries_test.cpp @@ -418,4 +418,47 @@ BOOST_AUTO_TEST_CASE(TestDdlColumnsMeta) BOOST_REQUIRE_EQUAL(ret, SQL_NO_DATA); } +BOOST_AUTO_TEST_CASE(TestDdlColumnsMetaEscaped) +{ + Connect("DRIVER={Apache Ignite};ADDRESS=127.0.0.1:11110;SCHEMA=PUBLIC"); + + SQLCHAR createTable[] = "create table ESG_FOCUS(id int primary key, TEST_COLUMN varchar)"; + SQLRETURN ret = SQLExecDirect(stmt, createTable, SQL_NTS); + + if (!SQL_SUCCEEDED(ret)) + BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt)); + + SQLCHAR empty[] = ""; + SQLCHAR table[] = "ESG\\_FOCUS"; + + 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, "ESG_FOCUS"); + 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, "ESG_FOCUS"); + CheckStringColumn(stmt, 4, "TEST_COLUMN"); + + ret = SQLFetch(stmt); + + BOOST_REQUIRE_EQUAL(ret, SQL_NO_DATA); +} + BOOST_AUTO_TEST_SUITE_END()