From f9cf2df077f0f680f807c00b142971601ca4bb6f Mon Sep 17 00:00:00 2001 From: Olivier Bertrand 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 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 /***********************************************************************/