From f9cf2df077f0f680f807c00b142971601ca4bb6f Mon Sep 17 00:00:00 2001 From: Olivier Bertrand <bertrandop@gmail.com> Date: Sun, 11 Mar 2018 23:46:33 +0100 Subject: [PATCH] - Fix MDEV-15429 CONNECT engine JDBC handling Postgresql UUID type Also handle Postgresql sending type VARCHAR for TEXT column and setting length to b x7FFFFFF when the length is unknown. modified: storage/connect/Client.java modified: storage/connect/JavaWrappers.jar modified: storage/connect/JdbcInterface.java modified: storage/connect/PostgresqlInterface.java modified: storage/connect/global.h modified: storage/connect/ha_connect.cc modified: storage/connect/jdbconn.cpp modified: storage/connect/jdbconn.h modified: storage/connect/mysql-test/connect/r/jdbc_postgresql.result modified: storage/connect/mysql-test/connect/t/jdbc_postgresql.test modified: storage/connect/mysql-test/connect/t/jdbconn.inc modified: storage/connect/plgdbsem.h modified: storage/connect/tabjdbc.cpp modified: storage/connect/tabjdbc.h --- storage/connect/Client.java | 27 +- storage/connect/JavaWrappers.jar | Bin 44053 -> 19192 bytes storage/connect/JdbcInterface.java | 54 ++- storage/connect/PostgresqlInterface.java | 5 +- storage/connect/global.h | 6 +- storage/connect/ha_connect.cc | 21 +- storage/connect/jdbconn.cpp | 339 ++++++++++++------ storage/connect/jdbconn.h | 11 +- .../connect/r/jdbc_postgresql.result | 35 +- .../connect/std_data/JavaWrappers.jar | Bin 0 -> 19192 bytes .../mysql-test/connect/t/jdbc_postgresql.test | 33 +- .../connect/mysql-test/connect/t/jdbconn.inc | 7 +- storage/connect/plgdbsem.h | 3 +- storage/connect/tabjdbc.cpp | 11 +- storage/connect/tabjdbc.h | 2 + 15 files changed, 383 insertions(+), 171 deletions(-) create mode 100644 storage/connect/mysql-test/connect/std_data/JavaWrappers.jar diff --git a/storage/connect/Client.java b/storage/connect/Client.java index aaf1b7bf2f8..afa54fa4256 100644 --- a/storage/connect/Client.java +++ b/storage/connect/Client.java @@ -1,9 +1,13 @@ + package wrappers; import java.io.BufferedReader; import java.io.Console; import java.io.IOException; import java.io.InputStreamReader; +import java.sql.Date; +import java.sql.Time; +import java.sql.Timestamp; public class Client { static boolean DEBUG = true; @@ -58,6 +62,9 @@ public class Client { String query; System.out.println("Successfully connected to " + parms[1]); + s = jdi.GetQuoteString(); + System.out.println("Qstr = '" + s + "'"); + while ((query = getLine("Query: ", false)) != null) { n = jdi.Execute(query); System.out.println("Returned n = " + n); @@ -79,7 +86,11 @@ public class Client { private static void PrintResult(int ncol) { // Get result set meta data int i; + Date date = new Date(0); + Time time = new Time(0); + Timestamp tsp = new Timestamp(0); String columnName; + Object job; // Get the column names; column indices start from 1 for (i = 1; i <= ncol; i++) { @@ -112,6 +123,7 @@ public class Client { case java.sql.Types.VARCHAR: case java.sql.Types.LONGVARCHAR: case java.sql.Types.CHAR: + case 1111: System.out.print(jdi.StringField(i, null)); break; case java.sql.Types.INTEGER: @@ -120,14 +132,17 @@ public class Client { case java.sql.Types.BIGINT: System.out.print(jdi.BigintField(i, null)); break; - case java.sql.Types.TIMESTAMP: - System.out.print(jdi.TimestampField(i, null)); - break; case java.sql.Types.TIME: - System.out.print(jdi.TimeField(i, null)); + time.setTime((long)jdi.TimeField(i, null) * 1000); + System.out.print(time); break; case java.sql.Types.DATE: - System.out.print(jdi.DateField(i, null)); + date.setTime((long)jdi.DateField(i, null) * 1000); + System.out.print(date); + break; + case java.sql.Types.TIMESTAMP: + tsp.setTime((long)jdi.TimestampField(i, null) * 1000); + System.out.print(tsp); break; case java.sql.Types.SMALLINT: System.out.print(jdi.IntField(i, null)); @@ -141,6 +156,8 @@ public class Client { case java.sql.Types.BOOLEAN: System.out.print(jdi.BooleanField(i, null)); default: + job = jdi.ObjectField(i, null); + System.out.print(job.toString()); break; } // endswitch Type diff --git a/storage/connect/JavaWrappers.jar b/storage/connect/JavaWrappers.jar index ef407f6a9c2d1e0ad1730c4b7194b012572ba8ce..33b29e7685b66ee03d1b3f5921f2ba32d48f76b3 100644 GIT binary patch delta 13062 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 delta 37949 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 diff --git a/storage/connect/JdbcInterface.java b/storage/connect/JdbcInterface.java index a1b1360e6ea..72ee4ab0d39 100644 --- a/storage/connect/JdbcInterface.java +++ b/storage/connect/JdbcInterface.java @@ -1,10 +1,22 @@ package wrappers; -import java.math.*; -import java.sql.*; +import java.math.BigDecimal; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.Date; +import java.sql.Driver; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.sql.SQLException; +import java.sql.Statement; +import java.sql.Time; +import java.sql.Timestamp; import java.util.Collections; import java.util.Hashtable; import java.util.List; +import java.util.UUID; import javax.sql.DataSource; @@ -223,6 +235,24 @@ public class JdbcInterface { } // end of SetTimestampParm + public void SetUuidParm(int i, String s) { + try { + UUID uuid; + + if (s == null) + uuid = null; + else if (s.isEmpty()) + uuid = UUID.randomUUID(); + else + uuid = UUID.fromString(s); + + pstmt.setObject(i, uuid); + } catch (Exception e) { + SetErrmsg(e); + } // end try/catch + + } // end of SetUuidParm + public int SetNullParm(int i, int typ) { int rc = 0; @@ -481,6 +511,8 @@ public class JdbcInterface { System.out.println("Executing query '" + query + "'"); try { + if (rs != null) + rs.close(); rs = stmt.executeQuery(query); rsmd = rs.getMetaData(); ncol = rsmd.getColumnCount(); @@ -708,7 +740,7 @@ public class JdbcInterface { return 0; } // end of TimestampField - public Object ObjectField(int n, String name) { + public Object ObjectField(int n, String name) { if (rs == null) { System.out.println("No result set"); } else try { @@ -720,6 +752,22 @@ public class JdbcInterface { return null; } // end of ObjectField + public String UuidField(int n, String name) { + Object job; + + if (rs == null) { + System.out.println("No result set"); + } else + try { + job = (n > 0) ? rs.getObject(n) : rs.getObject(name); + return job.toString(); + } catch (SQLException se) { + SetErrmsg(se); + } // end try/catch + + return null; + } // end of UuidField + public int GetDrivers(String[] s, int mxs) { int n = 0; List<Driver> drivers = Collections.list(DriverManager.getDrivers()); diff --git a/storage/connect/PostgresqlInterface.java b/storage/connect/PostgresqlInterface.java index adce0616a1b..9f611eeb23b 100644 --- a/storage/connect/PostgresqlInterface.java +++ b/storage/connect/PostgresqlInterface.java @@ -1,9 +1,10 @@ package wrappers; -import java.sql.*; +import java.sql.SQLException; import java.util.Hashtable; import javax.sql.DataSource; + import org.postgresql.jdbc2.optional.PoolingDataSource; public class PostgresqlInterface extends JdbcInterface { @@ -19,7 +20,7 @@ public class PostgresqlInterface extends JdbcInterface { } // end of constructor - @Override + @Override public int JdbcConnect(String[] parms, int fsize, boolean scrollable) { int rc = 0; String url = parms[1]; diff --git a/storage/connect/global.h b/storage/connect/global.h index d8d03f606ba..472d09408c3 100644 --- a/storage/connect/global.h +++ b/storage/connect/global.h @@ -220,7 +220,6 @@ DllExport BOOL PlugIsAbsolutePath(LPCSTR path); DllExport bool AllocSarea(PGLOBAL, uint); DllExport void FreeSarea(PGLOBAL); DllExport BOOL PlugSubSet(PGLOBAL, void *, uint); - void *PlugSubAlloc(PGLOBAL, void *, size_t); // Does throw DllExport char *PlugDup(PGLOBAL g, const char *str); DllExport void *MakePtr(void *, OFFSET); DllExport void htrc(char const *fmt, ...); @@ -231,4 +230,9 @@ DllExport uint GetTraceValue(void); } // extern "C" #endif +/***********************************************************************/ +/* Non exported routine declarations. */ +/***********************************************************************/ +void *PlugSubAlloc(PGLOBAL, void *, size_t); // Does throw + /*-------------------------- End of Global.H --------------------------*/ diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index 2efed93ee2a..c878bf2a7de 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -174,9 +174,9 @@ #define JSONMAX 10 // JSON Default max grp size extern "C" { - char version[]= "Version 1.06.0006 February 02, 2018"; + char version[]= "Version 1.06.0007 March 11, 2018"; #if defined(__WIN__) - char compver[]= "Version 1.06.0006 " __DATE__ " " __TIME__; + char compver[]= "Version 1.06.0007 " __DATE__ " " __TIME__; char slash= '\\'; #else // !__WIN__ char slash= '/'; @@ -288,11 +288,16 @@ static MYSQL_THDVAR_SET( 0, // def (NO) &xtrace_typelib); // typelib - // Getting exact info values +// Getting exact info values static MYSQL_THDVAR_BOOL(exact_info, PLUGIN_VAR_RQCMDARG, "Getting exact info values", NULL, NULL, 0); +// Enabling cond_push +static MYSQL_THDVAR_BOOL(cond_push, PLUGIN_VAR_RQCMDARG, + "Enabling cond_push", + NULL, NULL, 1); // YES by default + /** Temporary file usage: no: Not using temporary file @@ -427,6 +432,7 @@ handlerton *connect_hton= NULL; uint GetTraceValue(void) {return (uint)(connect_hton ? THDVAR(current_thd, xtrace) : 0);} bool ExactInfo(void) {return THDVAR(current_thd, exact_info);} +bool CondPushEnabled(void) {return THDVAR(current_thd, cond_push);} USETEMP UseTemp(void) {return (USETEMP)THDVAR(current_thd, use_tempfile);} int GetConvSize(void) {return THDVAR(current_thd, conv_size);} TYPCONV GetTypeConv(void) {return (TYPCONV)THDVAR(current_thd, type_conv);} @@ -3196,7 +3202,7 @@ const COND *ha_connect::cond_push(const COND *cond) { DBUG_ENTER("ha_connect::cond_push"); - if (tdbp) { + if (tdbp && CondPushEnabled()) { PGLOBAL& g= xp->g; AMT tty= tdbp->GetAmType(); bool x= (tty == TYPE_AM_MYX || tty == TYPE_AM_XDBC); @@ -7243,7 +7249,8 @@ static struct st_mysql_sys_var* connect_system_variables[]= { #if defined(JAVA_SUPPORT) || defined(CMGO_SUPPORT) MYSQL_SYSVAR(enable_mongo), #endif // JAVA_SUPPORT || CMGO_SUPPORT -NULL + MYSQL_SYSVAR(cond_push), + NULL }; maria_declare_plugin(connect) @@ -7256,10 +7263,10 @@ maria_declare_plugin(connect) PLUGIN_LICENSE_GPL, connect_init_func, /* Plugin Init */ connect_done_func, /* Plugin Deinit */ - 0x0106, /* version number (1.05) */ + 0x0107, /* version number (1.05) */ NULL, /* status variables */ connect_system_variables, /* system variables */ - "1.06.0006", /* string version */ + "1.06.0007", /* string version */ MariaDB_PLUGIN_MATURITY_STABLE /* maturity */ } maria_declare_plugin_end; diff --git a/storage/connect/jdbconn.cpp b/storage/connect/jdbconn.cpp index ff84c75b67f..33414ca74c2 100644 --- a/storage/connect/jdbconn.cpp +++ b/storage/connect/jdbconn.cpp @@ -1,7 +1,7 @@ /************ Jdbconn C++ Functions Source Code File (.CPP) ************/ -/* Name: JDBCONN.CPP Version 1.1 */ +/* Name: JDBCONN.CPP Version 1.2 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2016-2017 */ +/* (C) Copyright to the author Olivier BERTRAND 2016-2018 */ /* */ /* This file contains the JDBC connection classes functions. */ /***********************************************************************/ @@ -116,10 +116,26 @@ int TranslateJDBCType(int stp, char *tn, int prec, int& len, char& v) return TYPE_ERROR; else len = MY_MIN(abs(len), GetConvSize()); + // Pass through case 12: // VARCHAR + if (tn && !stricmp(tn, "TEXT")) + // Postgresql returns 12 for TEXT + if (GetTypeConv() == TPC_NO) + return TYPE_ERROR; + + // Postgresql can return this + if (len == 0x7FFFFFFF) + len = GetConvSize(); + + // Pass through case -9: // NVARCHAR (unicode) + // Postgresql can return this when size is unknown + if (len == 0x7FFFFFFF) + len = GetConvSize(); + v = 'V'; + // Pass through case 1: // CHAR case -15: // NCHAR (unicode) case -8: // ROWID @@ -171,6 +187,14 @@ int TranslateJDBCType(int stp, char *tn, int prec, int& len, char& v) case -5: // BIGINT type = TYPE_BIGINT; break; + case 1111: // UNKNOWN or UUID + if (!tn || !stricmp(tn, "UUID")) { + type = TYPE_STRING; + len = 36; + break; + } // endif tn + + // Pass through case 0: // NULL case -2: // BINARY case -4: // LONGVARBINARY @@ -192,6 +216,104 @@ int TranslateJDBCType(int stp, char *tn, int prec, int& len, char& v) return type; } // end of TranslateJDBCType + /***********************************************************************/ + /* A helper class to split an optionally qualified table name into */ + /* components. */ + /* These formats are understood: */ + /* "CatalogName.SchemaName.TableName" */ + /* "SchemaName.TableName" */ + /* "TableName" */ + /***********************************************************************/ +class SQLQualifiedName { + static const uint max_parts = 3; // Catalog.Schema.Table + MYSQL_LEX_STRING m_part[max_parts]; + char m_buf[512]; + + void lex_string_set(MYSQL_LEX_STRING *S, char *str, size_t length) + { + S->str = str; + S->length = length; + } // end of lex_string_set + + void lex_string_shorten_down(MYSQL_LEX_STRING *S, size_t offs) + { + DBUG_ASSERT(offs <= S->length); + S->str += offs; + S->length -= offs; + } // end of lex_string_shorten_down + + /*********************************************************************/ + /* Find the rightmost '.' delimiter and return the length */ + /* of the qualifier, including the rightmost '.' delimier. */ + /* For example, for the string {"a.b.c",5} it will return 4, */ + /* which is the length of the qualifier "a.b." */ + /*********************************************************************/ + size_t lex_string_find_qualifier(MYSQL_LEX_STRING *S) + { + size_t i; + for (i = S->length; i > 0; i--) + { + if (S->str[i - 1] == '.') + { + S->str[i - 1] = '\0'; + return i; + } + } + return 0; + } // end of lex_string_find_qualifier + +public: + /*********************************************************************/ + /* Initialize to the given optionally qualified name. */ + /* NULL pointer in "name" is supported. */ + /* name qualifier has precedence over schema. */ + /*********************************************************************/ + SQLQualifiedName(JCATPARM *cap) + { + const char *name = (const char *)cap->Tab; + char *db = (char *)cap->DB; + size_t len, i; + + // Initialize the parts + for (i = 0; i < max_parts; i++) + lex_string_set(&m_part[i], NULL, 0); + + if (name) { + // Initialize the first (rightmost) part + lex_string_set(&m_part[0], m_buf, + strmake(m_buf, name, sizeof(m_buf) - 1) - m_buf); + + // Initialize the other parts, if exist. + for (i = 1; i < max_parts; i++) { + if (!(len = lex_string_find_qualifier(&m_part[i - 1]))) + break; + + lex_string_set(&m_part[i], m_part[i - 1].str, len - 1); + lex_string_shorten_down(&m_part[i - 1], len); + } // endfor i + + } // endif name + + // If it was not specified, set schema as the passed db name + if (db && !m_part[1].length) + lex_string_set(&m_part[1], db, strlen(db)); + + } // end of SQLQualifiedName + + char *ptr(uint i) + { + DBUG_ASSERT(i < max_parts); + return (char *)(m_part[i].length ? m_part[i].str : NULL); + } // end of ptr + + size_t length(uint i) + { + DBUG_ASSERT(i < max_parts); + return m_part[i].length; + } // end of length + +}; // end of class SQLQualifiedName + /***********************************************************************/ /* Allocate the structure used to refer to the result set. */ /***********************************************************************/ @@ -519,7 +641,7 @@ JDBConn::JDBConn(PGLOBAL g, PCSZ wrapper) : JAVAConn(g, wrapper) xqid = xuid = xid = grs = readid = fetchid = typid = errid = nullptr; prepid = xpid = pcid = nullptr; chrfldid = intfldid = dblfldid = fltfldid = bigfldid = nullptr; - objfldid = datfldid = timfldid = tspfldid = nullptr; + objfldid = datfldid = timfldid = tspfldid = uidfldid = nullptr; DiscFunc = "JdbcDisconnect"; m_Ncol = 0; m_Aff = 0; @@ -535,12 +657,84 @@ JDBConn::JDBConn(PGLOBAL g, PCSZ wrapper) : JAVAConn(g, wrapper) m_IDQuoteChar[1] = 0; } // end of JDBConn -//JDBConn::~JDBConn() -// { -//if (Connected()) -// EndCom(); +/***********************************************************************/ +/* Search for UUID columns. */ +/***********************************************************************/ +bool JDBConn::SetUUID(PGLOBAL g, PTDBJDBC tjp) +{ + int ncol, ctyp; + bool brc = true; + PCSZ fnc = "GetColumns"; + PCOL colp; + JCATPARM *cap; + //jint jtyp; + jboolean rc = false; + jobjectArray parms; + jmethodID catid = nullptr; -// } // end of ~JDBConn + if (gmID(g, catid, fnc, "([Ljava/lang/String;)I")) + return true; + else if (gmID(g, intfldid, "IntField", "(ILjava/lang/String;)I")) + return true; + else if (gmID(g, readid, "ReadNext", "()I")) + return true; + + cap = AllocCatInfo(g, JCAT_COL, tjp->Schema, tjp->TableName, NULL); + SQLQualifiedName name(cap); + + // Build the java string array + parms = env->NewObjectArray(4, env->FindClass("java/lang/String"), NULL); + env->SetObjectArrayElement(parms, 0, env->NewStringUTF(name.ptr(2))); + env->SetObjectArrayElement(parms, 1, env->NewStringUTF(name.ptr(1))); + env->SetObjectArrayElement(parms, 2, env->NewStringUTF(name.ptr(0))); + + for (colp = tjp->GetColumns(); colp; colp = colp->GetNext()) { + env->SetObjectArrayElement(parms, 3, env->NewStringUTF(colp->GetName())); + ncol = env->CallIntMethod(job, catid, parms); + + if (Check(ncol)) { + sprintf(g->Message, "%s: %s", fnc, Msg); + goto err; + } // endif Check + + rc = env->CallBooleanMethod(job, readid); + + if (Check(rc)) { + sprintf(g->Message, "ReadNext: %s", Msg); + goto err; + } else if (rc == 0) { + sprintf(g->Message, "table %s does not exist", tjp->TableName); + goto err; + } // endif rc + + // Returns 666 is case of error + //jtyp = env->CallIntMethod(job, typid, 5, nullptr); + + //if (Check((jtyp == 666) ? -1 : 1)) { + // sprintf(g->Message, "Getting jtyp: %s", Msg); + // goto err; + //} // endif ctyp + + ctyp = (int)env->CallIntMethod(job, intfldid, 5, nullptr); + + if (Check(ctyp)) { + sprintf(g->Message, "Getting ctyp: %s", Msg); + goto err; + } // endif ctyp + + if (ctyp == 1111) + ((PJDBCCOL)colp)->uuid = true; + + } // endfor colp + + // All is Ok + brc = false; + + err: + // Not used anymore + env->DeleteLocalRef(parms); + return brc; +} // end of SetUUID /***********************************************************************/ /* Utility routine. */ @@ -770,6 +964,7 @@ int JDBConn::Rewind(PCSZ sql) /***********************************************************************/ void JDBConn::SetColumnValue(int rank, PSZ name, PVAL val) { + const char *field; PGLOBAL& g = m_G; jint ctyp; jstring cn, jn = nullptr; @@ -793,6 +988,11 @@ void JDBConn::SetColumnValue(int rank, PSZ name, PVAL val) if (!gmID(g, objfldid, "ObjectField", "(ILjava/lang/String;)Ljava/lang/Object;")) { jb = env->CallObjectMethod(job, objfldid, (jint)rank, jn); + if (Check(0)) { + sprintf(g->Message, "Getting jp: %s", Msg); + throw (int)TYPE_AM_JDBC; + } // endif Check + if (jb == nullptr) { val->Reset(); val->SetNull(true); @@ -818,7 +1018,7 @@ void JDBConn::SetColumnValue(int rank, PSZ name, PVAL val) cn = nullptr; if (cn) { - const char *field = env->GetStringUTFChars(cn, (jboolean)false); + field = env->GetStringUTFChars(cn, (jboolean)false); val->SetValue_psz((PSZ)field); } else val->Reset(); @@ -885,6 +1085,19 @@ void JDBConn::SetColumnValue(int rank, PSZ name, PVAL val) break; case java.sql.Types.BOOLEAN: System.out.print(jdi.BooleanField(i)); */ + case 1111: // UUID + if (!gmID(g, uidfldid, "UuidField", "(ILjava/lang/String;)Ljava/lang/String;")) + cn = (jstring)env->CallObjectMethod(job, uidfldid, (jint)rank, jn); + else + cn = nullptr; + + if (cn) { + const char *field = env->GetStringUTFChars(cn, (jboolean)false); + val->SetValue_psz((PSZ)field); + } else + val->Reset(); + + break; case 0: // NULL val->SetNull(true); // passthru @@ -1055,7 +1268,14 @@ bool JDBConn::SetParam(JDBCCOL *colp) if (gmID(g, setid, "SetNullParm", "(II)I")) return true; - jrc = env->CallIntMethod(job, setid, i, (jint)GetJDBCType(val->GetType())); + jrc = env->CallIntMethod(job, setid, i, + (colp->uuid ? 1111 : (jint)GetJDBCType(val->GetType()))); + } else if (colp->uuid) { + if (gmID(g, setid, "SetUuidParm", "(ILjava/lang/String;)V")) + return true; + + jst = env->NewStringUTF(val->GetCharValue()); + env->CallVoidMethod(job, setid, i, jst); } else switch (val->GetType()) { case TYPE_STRING: if (gmID(g, setid, "SetStringParm", "(ILjava/lang/String;)V")) @@ -1274,105 +1494,6 @@ bool JDBConn::SetParam(JDBCCOL *colp) return qrp; } // end of GetMetaData - /***********************************************************************/ - /* A helper class to split an optionally qualified table name into */ - /* components. */ - /* These formats are understood: */ - /* "CatalogName.SchemaName.TableName" */ - /* "SchemaName.TableName" */ - /* "TableName" */ - /***********************************************************************/ - class SQLQualifiedName - { - static const uint max_parts= 3; // Catalog.Schema.Table - MYSQL_LEX_STRING m_part[max_parts]; - char m_buf[512]; - - void lex_string_set(MYSQL_LEX_STRING *S, char *str, size_t length) - { - S->str= str; - S->length= length; - } // end of lex_string_set - - void lex_string_shorten_down(MYSQL_LEX_STRING *S, size_t offs) - { - DBUG_ASSERT(offs <= S->length); - S->str+= offs; - S->length-= offs; - } // end of lex_string_shorten_down - - /*********************************************************************/ - /* Find the rightmost '.' delimiter and return the length */ - /* of the qualifier, including the rightmost '.' delimier. */ - /* For example, for the string {"a.b.c",5} it will return 4, */ - /* which is the length of the qualifier "a.b." */ - /*********************************************************************/ - size_t lex_string_find_qualifier(MYSQL_LEX_STRING *S) - { - size_t i; - for (i= S->length; i > 0; i--) - { - if (S->str[i - 1] == '.') - { - S->str[i - 1]= '\0'; - return i; - } - } - return 0; - } // end of lex_string_find_qualifier - - public: - /*********************************************************************/ - /* Initialize to the given optionally qualified name. */ - /* NULL pointer in "name" is supported. */ - /* name qualifier has precedence over schema. */ - /*********************************************************************/ - SQLQualifiedName(JCATPARM *cap) - { - const char *name = (const char *)cap->Tab; - char *db = (char *)cap->DB; - size_t len, i; - - // Initialize the parts - for (i = 0; i < max_parts; i++) - lex_string_set(&m_part[i], NULL, 0); - - if (name) { - // Initialize the first (rightmost) part - lex_string_set(&m_part[0], m_buf, - strmake(m_buf, name, sizeof(m_buf) - 1) - m_buf); - - // Initialize the other parts, if exist. - for (i= 1; i < max_parts; i++) { - if (!(len= lex_string_find_qualifier(&m_part[i - 1]))) - break; - - lex_string_set(&m_part[i], m_part[i - 1].str, len - 1); - lex_string_shorten_down(&m_part[i - 1], len); - } // endfor i - - } // endif name - - // If it was not specified, set schema as the passed db name - if (db && !m_part[1].length) - lex_string_set(&m_part[1], db, strlen(db)); - - } // end of SQLQualifiedName - - char *ptr(uint i) - { - DBUG_ASSERT(i < max_parts); - return (char *)(m_part[i].length ? m_part[i].str : NULL); - } // end of ptr - - size_t length(uint i) - { - DBUG_ASSERT(i < max_parts); - return m_part[i].length; - } // end of length - - }; // end of class SQLQualifiedName - /***********************************************************************/ /* Allocate recset and call SQLTables, SQLColumns or SQLPrimaryKeys. */ /***********************************************************************/ diff --git a/storage/connect/jdbconn.h b/storage/connect/jdbconn.h index 56f318d238b..0c36cccadcf 100644 --- a/storage/connect/jdbconn.h +++ b/storage/connect/jdbconn.h @@ -29,6 +29,7 @@ public: // Attributes public: char *GetQuoteChar(void) { return m_IDQuoteChar; } + bool SetUUID(PGLOBAL g, PTDBJDBC tjp); virtual int GetMaxValue(int infotype); public: @@ -58,13 +59,6 @@ public: protected: // Members -#if 0 - JavaVM *jvm; // Pointer to the JVM (Java Virtual Machine) - JNIEnv *env; // Pointer to native interface - jclass jdi; // Pointer to the java wrapper class - jobject job; // The java wrapper class object - jmethodID errid; // The GetErrmsg method ID -#endif // 0 jmethodID xqid; // The ExecuteQuery method ID jmethodID xuid; // The ExecuteUpdate method ID jmethodID xid; // The Execute method ID @@ -84,8 +78,7 @@ protected: jmethodID timfldid; // The TimeField method ID jmethodID tspfldid; // The TimestampField method ID jmethodID bigfldid; // The BigintField method ID -// PCSZ Msg; -// PCSZ m_Wrap; + jmethodID uidfldid; // The UuidField method ID char m_IDQuoteChar[2]; PCSZ m_Pwd; int m_Ncol; diff --git a/storage/connect/mysql-test/connect/r/jdbc_postgresql.result b/storage/connect/mysql-test/connect/r/jdbc_postgresql.result index 6d77d79d5d3..7969672dd66 100644 --- a/storage/connect/mysql-test/connect/r/jdbc_postgresql.result +++ b/storage/connect/mysql-test/connect/r/jdbc_postgresql.result @@ -1,9 +1,11 @@ +SET GLOBAL connect_class_path='C:/MariaDB-10.2/MariaDB/storage/connect/mysql-test/connect/std_data/JavaWrappers.jar;C:/Jconnectors/postgresql-42.2.1.jar'; CREATE TABLE t2 ( command varchar(128) not null, number int(5) not null flag=1, message varchar(255) flag=2) -ENGINE=CONNECT TABLE_TYPE=JDBC CONNECTION='jdbc:postgresql://localhost/mtr' -OPTION_LIST='User=mtr,Password=mtr,Schema=public,Execsrc=1'; +ENGINE=CONNECT TABLE_TYPE=JDBC +CONNECTION='jdbc:postgresql://localhost/test?user=postgres&password=tinono' +OPTION_LIST='Execsrc=1'; SELECT * FROM t2 WHERE command='drop table employee'; command number message drop table employee 0 Execute: org.postgresql.util.PSQLException: ERREUR: la table « employee » n'existe pas @@ -14,17 +16,18 @@ SELECT * FROM t2 WHERE command = "insert into employee values(4567,'Johnson', 'E command number message insert into employee values(4567,'Johnson', 'Engineer', 12560.50) 1 Affected rows CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC CATFUNC=tables -CONNECTION='jdbc:postgresql://localhost/mtr' -OPTION_LIST='User=mtr,Password=mtr,Schema=public,Tabtype=TABLE,Maxres=10'; +CONNECTION='jdbc:postgresql://localhost/test?user=postgres&password=tinono' +OPTION_LIST='Tabtype=TABLE,Maxres=10'; SELECT * FROM t1; Table_Cat Table_Schema Table_Name Table_Type Remark - public employee TABLE NULL - public t1 TABLE NULL - public t2 TABLE NULL +NULL public employee TABLE NULL +NULL public t1 TABLE NULL +NULL public t2 TABLE NULL +NULL public tchar TABLE NULL +NULL public testuuid TABLE NULL DROP TABLE t1; -CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC CATFUNC=columns -CONNECTION='jdbc:postgresql://localhost/mtr' tabname=employee -OPTION_LIST='User=mtr,Password=mtr,Maxres=10'; +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC tabname=employee CATFUNC=columns +CONNECTION='jdbc:postgresql://localhost/test?user=postgres&password=tinono'; SELECT * FROM t1; Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Radix Nullable Remarks NULL public employee id 4 int4 10 0 0 10 0 NULL @@ -34,13 +37,14 @@ NULL public employee salary 2 numeric 8 0 2 10 1 NULL DROP TABLE t1; CREATE SERVER 'postgresql' FOREIGN DATA WRAPPER 'postgresql' OPTIONS ( HOST 'localhost', -DATABASE 'mtr', -USER 'mtr', -PASSWORD 'mtr', +DATABASE 'test', +USER 'postgres', +PASSWORD 'tinono', PORT 0, SOCKET '', OWNER 'root'); -CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC CONNECTION='postgresql/public.employee'; +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC +CONNECTION='postgresql/public.employee'; SELECT * FROM t1; id name title salary 4567 Johnson Engineer 12560.50 @@ -60,6 +64,3 @@ SELECT * FROM t2 WHERE command='drop table employee'; command number message drop table employee 0 Affected rows DROP TABLE t2; -SET GLOBAL connect_jvm_path=NULL; -SET GLOBAL connect_class_path=NULL; -SET GLOBAL time_zone = SYSTEM; diff --git a/storage/connect/mysql-test/connect/std_data/JavaWrappers.jar b/storage/connect/mysql-test/connect/std_data/JavaWrappers.jar new file mode 100644 index 0000000000000000000000000000000000000000..33b29e7685b66ee03d1b3f5921f2ba32d48f76b3 GIT binary patch literal 19192 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 N5FTV=U{Le`@c?>fD9iu= literal 0 HcmV?d00001 diff --git a/storage/connect/mysql-test/connect/t/jdbc_postgresql.test b/storage/connect/mysql-test/connect/t/jdbc_postgresql.test index 1041ef468d7..8036f71020d 100644 --- a/storage/connect/mysql-test/connect/t/jdbc_postgresql.test +++ b/storage/connect/mysql-test/connect/t/jdbc_postgresql.test @@ -3,25 +3,32 @@ # # This test is run against Postgresql driver # +eval SET GLOBAL connect_class_path='$MTR_SUITE_DIR/std_data/JavaWrappers.jar;C:/Jconnectors/postgresql-42.2.1.jar'; CREATE TABLE t2 ( command varchar(128) not null, number int(5) not null flag=1, message varchar(255) flag=2) -ENGINE=CONNECT TABLE_TYPE=JDBC CONNECTION='jdbc:postgresql://localhost/mtr' -OPTION_LIST='User=mtr,Password=mtr,Schema=public,Execsrc=1'; +ENGINE=CONNECT TABLE_TYPE=JDBC +CONNECTION='jdbc:postgresql://localhost/test?user=postgres&password=tinono' +OPTION_LIST='Execsrc=1'; +#CONNECTION='jdbc:postgresql://localhost/mtr' +#OPTION_LIST='User=mtr,Password=mtr,Schema=public,Execsrc=1'; SELECT * FROM t2 WHERE command='drop table employee'; SELECT * FROM t2 WHERE command = 'create table employee (id int not null, name varchar(32), title char(16), salary decimal(8,2))'; SELECT * FROM t2 WHERE command = "insert into employee values(4567,'Johnson', 'Engineer', 12560.50)"; CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC CATFUNC=tables -CONNECTION='jdbc:postgresql://localhost/mtr' -OPTION_LIST='User=mtr,Password=mtr,Schema=public,Tabtype=TABLE,Maxres=10'; +CONNECTION='jdbc:postgresql://localhost/test?user=postgres&password=tinono' +OPTION_LIST='Tabtype=TABLE,Maxres=10'; +#CONNECTION='jdbc:postgresql://localhost/mtr' +#OPTION_LIST='User=mtr,Password=mtr,Schema=public,Tabtype=TABLE,Maxres=10'; SELECT * FROM t1; DROP TABLE t1; -CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC CATFUNC=columns -CONNECTION='jdbc:postgresql://localhost/mtr' tabname=employee -OPTION_LIST='User=mtr,Password=mtr,Maxres=10'; +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC tabname=employee CATFUNC=columns +CONNECTION='jdbc:postgresql://localhost/test?user=postgres&password=tinono'; +#CONNECTION='jdbc:postgresql://localhost/mtr' tabname=employee; +#OPTION_LIST='User=mtr,Password=mtr,Maxres=10'; SELECT * FROM t1; DROP TABLE t1; @@ -30,14 +37,18 @@ DROP TABLE t1; # CREATE SERVER 'postgresql' FOREIGN DATA WRAPPER 'postgresql' OPTIONS ( HOST 'localhost', -DATABASE 'mtr', -USER 'mtr', -PASSWORD 'mtr', +DATABASE 'test', +USER 'postgres', +PASSWORD 'tinono', PORT 0, SOCKET '', OWNER 'root'); +#DATABASE 'mtr', +#USER 'mtr', +#PASSWORD 'mtr', -CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC CONNECTION='postgresql/public.employee'; +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC +CONNECTION='postgresql/public.employee'; SELECT * FROM t1; INSERT INTO t1 VALUES(3126,'Smith', 'Clerk', 5230.00); UPDATE t1 SET salary = salary + 100.00; diff --git a/storage/connect/mysql-test/connect/t/jdbconn.inc b/storage/connect/mysql-test/connect/t/jdbconn.inc index 05122f51924..81ec80c13d6 100644 --- a/storage/connect/mysql-test/connect/t/jdbconn.inc +++ b/storage/connect/mysql-test/connect/t/jdbconn.inc @@ -22,10 +22,11 @@ DROP TABLE t1; # 1 - The current directory. # 2 - The paths of the connect_class_path global variable. # 3 - The paths of the CLASSPATH environment variable. -# In this test we use an executable jar file that contains all what is needed. -eval SET GLOBAL connect_class_path='$MTR_SUITE_DIR/std_data/JdbcMariaDB.jar'; +# In this test we use an executable jar file that contains all the eisting wrappers. +#eval SET GLOBAL connect_class_path='$MTR_SUITE_DIR/std_data/JdbcMariaDB.jar'; +eval SET GLOBAL connect_class_path='$MTR_SUITE_DIR/std_data/JavaWrappers.jar'; -# Paths to the JDK classes and to the MySQL and MariaDB drivers can be defined in the CLASSPATH environment variable +# Paths to the JDK classes and to the JDBC drivers should be defined in the CLASSPATH environment variable #CREATE FUNCTION envar RETURNS STRING SONAME 'ha_connect.dll'; #SELECT envar('CLASSPATH'); diff --git a/storage/connect/plgdbsem.h b/storage/connect/plgdbsem.h index 6a0a8be8ff8..5446e0d2a07 100644 --- a/storage/connect/plgdbsem.h +++ b/storage/connect/plgdbsem.h @@ -362,7 +362,8 @@ enum COLUSE {U_P = 0x01, /* the projection list. */ U_IS_NULL = 0x80, /* The column has a null value */ U_SPECIAL = 0x100, /* The column is special */ U_UNSIGNED = 0x200, /* The column type is unsigned */ - U_ZEROFILL = 0x400}; /* The column is zero filled */ + U_ZEROFILL = 0x400, /* The column is zero filled */ + U_UUID = 0x800}; /* The column is a UUID */ /***********************************************************************/ /* DB description class and block pointer definitions. */ diff --git a/storage/connect/tabjdbc.cpp b/storage/connect/tabjdbc.cpp index c0fda584381..adbfb2168ae 100644 --- a/storage/connect/tabjdbc.cpp +++ b/storage/connect/tabjdbc.cpp @@ -605,6 +605,10 @@ bool TDBJDBC::OpenDB(PGLOBAL g) else if (Quoted) Quote = Jcp->GetQuoteChar(); + if (Mode != MODE_READ && Mode != MODE_READX) + if (Jcp->SetUUID(g, this)) + PushWarning(g, this, 1); + Use = USE_OPEN; // Do it now in case we are recursively called /*********************************************************************/ @@ -970,6 +974,7 @@ void TDBJDBC::CloseDB(PGLOBAL g) JDBCCOL::JDBCCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am) : EXTCOL(cdp, tdbp, cprec, i, am) { + uuid = false; } // end of JDBCCOL constructor /***********************************************************************/ @@ -977,6 +982,7 @@ JDBCCOL::JDBCCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am) /***********************************************************************/ JDBCCOL::JDBCCOL(void) : EXTCOL() { + uuid = false; } // end of JDBCCOL constructor /***********************************************************************/ @@ -985,12 +991,11 @@ JDBCCOL::JDBCCOL(void) : EXTCOL() /***********************************************************************/ JDBCCOL::JDBCCOL(JDBCCOL *col1, PTDB tdbp) : EXTCOL(col1, tdbp) { + uuid = col1->uuid; } // end of JDBCCOL copy constructor /***********************************************************************/ -/* ReadColumn: when SQLFetch is used there is nothing to do as the */ -/* column buffer was bind to the record set. This is also the case */ -/* when calculating MaxSize (Bufp is NULL even when Rows is not). */ +/* ReadColumn: retrieve the column value via the JDBC driver. */ /***********************************************************************/ void JDBCCOL::ReadColumn(PGLOBAL g) { diff --git a/storage/connect/tabjdbc.h b/storage/connect/tabjdbc.h index d422ed26ef2..078129a14e3 100644 --- a/storage/connect/tabjdbc.h +++ b/storage/connect/tabjdbc.h @@ -101,6 +101,7 @@ protected: /***********************************************************************/ class JDBCCOL : public EXTCOL { friend class TDBJDBC; + friend class JDBConn; public: // Constructors JDBCCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am = "JDBC"); @@ -119,6 +120,7 @@ protected: JDBCCOL(void); // Members + bool uuid; // For PostgreSQL }; // end of class JDBCCOL /***********************************************************************/