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()

Reply via email to