You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2018/11/16 13:39:02 UTC
[04/13] ignite git commit: IGNITE-10009: ODBC fix for escaped table
names
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/ignite-10043
Commit: 665aa9508687e0c37fa81ad0832b60d0e2b7e7b3
Parents: 59db291
Author: Igor Sapego <is...@apache.org>
Authored: Thu Nov 15 17:08:00 2018 +0300
Committer: Igor Sapego <is...@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()