mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
- Fix MDEV-18192: CONNECT Engine JDBC not able to issue
simple UPDATE statement from trigger or stored procedure modified: storage/connect/tabext.cpp modified: storage/connect/tabext.h modified: storage/connect/tabjdbc.cpp - Make user and password defined in CREATE TABLE have precedence on the ones specified in a Federated Server. modified: storage/connect/tabjdbc.cpp - JSONColumns: Copy locally constant strings to fix error in OEM modules modified: storage/connect/tabjson.cpp
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
/************* Tabext C++ Functions Source Code File (.CPP) ************/
|
/************* Tabext C++ Functions Source Code File (.CPP) ************/
|
||||||
/* Name: TABEXT.CPP Version 1.0 */
|
/* Name: TABEXT.CPP Version 1.1 */
|
||||||
/* */
|
/* */
|
||||||
/* (C) Copyright to the author Olivier BERTRAND 2017 */
|
/* (C) Copyright to the author Olivier BERTRAND 2017 - 2019 */
|
||||||
/* */
|
/* */
|
||||||
/* This file contains the TBX, TDB and OPJOIN classes functions. */
|
/* This file contains the TBX, TDB and OPJOIN classes functions. */
|
||||||
/***********************************************************************/
|
/***********************************************************************/
|
||||||
@@ -445,6 +445,43 @@ bool TDBEXT::MakeSQL(PGLOBAL g, bool cnt)
|
|||||||
return false;
|
return false;
|
||||||
} // end of MakeSQL
|
} // end of MakeSQL
|
||||||
|
|
||||||
|
/***********************************************************************/
|
||||||
|
/* Remove the NAME_CONST functions that are added by procedures. */
|
||||||
|
/***********************************************************************/
|
||||||
|
void TDBEXT::RemoveConst(PGLOBAL g, char *stmt)
|
||||||
|
{
|
||||||
|
char *p, *p2;
|
||||||
|
char val[1025], nval[1025];
|
||||||
|
int n, nc;
|
||||||
|
|
||||||
|
while ((p = strstr(stmt, "NAME_CONST")))
|
||||||
|
if ((n = sscanf(p, "%*[^,],%1024[^)])%n", val, &nc))) {
|
||||||
|
if (trace(33))
|
||||||
|
htrc("p=%s\nn=%d val=%s nc=%d\n", p, n, val, nc);
|
||||||
|
|
||||||
|
*p = 0;
|
||||||
|
|
||||||
|
if ((p2 = strstr(val, "'"))) {
|
||||||
|
if ((n = sscanf(p2, "%*['\\]%1024[^'\\]", nval))) {
|
||||||
|
if (trace(33))
|
||||||
|
htrc("p2=%s\nn=%d nval=%s\n", p2, n, nval);
|
||||||
|
|
||||||
|
strcat(strcat(strcat(strcat(stmt, "'"), nval), "'"), p + nc);
|
||||||
|
} else
|
||||||
|
break;
|
||||||
|
|
||||||
|
} else
|
||||||
|
strcat(strcat(strcat(strcat(stmt, "("), val), ")"), p + nc);
|
||||||
|
|
||||||
|
if (trace(33))
|
||||||
|
htrc("stmt=%s\n", stmt);
|
||||||
|
|
||||||
|
} else
|
||||||
|
break;
|
||||||
|
|
||||||
|
return;
|
||||||
|
} // end of RemoveConst
|
||||||
|
|
||||||
/***********************************************************************/
|
/***********************************************************************/
|
||||||
/* MakeCommand: make the Update or Delete statement to send to the */
|
/* MakeCommand: make the Update or Delete statement to send to the */
|
||||||
/* MySQL server. Limited to remote values and filtering. */
|
/* MySQL server. Limited to remote values and filtering. */
|
||||||
@@ -524,6 +561,8 @@ bool TDBEXT::MakeCommand(PGLOBAL g)
|
|||||||
stmt[i++] = (Qrystr[k] == '`') ? q : Qrystr[k];
|
stmt[i++] = (Qrystr[k] == '`') ? q : Qrystr[k];
|
||||||
} while (Qrystr[k++]);
|
} while (Qrystr[k++]);
|
||||||
|
|
||||||
|
RemoveConst(g, stmt);
|
||||||
|
|
||||||
if (body)
|
if (body)
|
||||||
strcat(stmt, body);
|
strcat(stmt, body);
|
||||||
|
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
/*************** Tabext H Declares Source Code File (.H) ***************/
|
/*************** Tabext H Declares Source Code File (.H) ***************/
|
||||||
/* Name: TABEXT.H Version 1.0 */
|
/* Name: TABEXT.H Version 1.1 */
|
||||||
/* */
|
/* */
|
||||||
/* (C) Copyright to the author Olivier BERTRAND 2017 */
|
/* (C) Copyright to the author Olivier BERTRAND 2017 - 2019 */
|
||||||
/* */
|
/* */
|
||||||
/* This is the EXTDEF, TABEXT and EXTCOL classes definitions. */
|
/* This is the EXTDEF, TABEXT and EXTCOL classes definitions. */
|
||||||
/***********************************************************************/
|
/***********************************************************************/
|
||||||
@@ -130,6 +130,7 @@ protected:
|
|||||||
virtual bool MakeSQL(PGLOBAL g, bool cnt);
|
virtual bool MakeSQL(PGLOBAL g, bool cnt);
|
||||||
//virtual bool MakeInsert(PGLOBAL g);
|
//virtual bool MakeInsert(PGLOBAL g);
|
||||||
virtual bool MakeCommand(PGLOBAL g);
|
virtual bool MakeCommand(PGLOBAL g);
|
||||||
|
void RemoveConst(PGLOBAL g, char *stmt);
|
||||||
int Decode(PCSZ utf, char *buf, size_t n);
|
int Decode(PCSZ utf, char *buf, size_t n);
|
||||||
|
|
||||||
// Members
|
// Members
|
||||||
|
@@ -1,11 +1,11 @@
|
|||||||
/************* TabJDBC C++ Program Source Code File (.CPP) *************/
|
/************* TabJDBC C++ Program Source Code File (.CPP) *************/
|
||||||
/* PROGRAM NAME: TABJDBC */
|
/* PROGRAM NAME: TABJDBC */
|
||||||
/* ------------- */
|
/* ------------- */
|
||||||
/* Version 1.2 */
|
/* Version 1.3 */
|
||||||
/* */
|
/* */
|
||||||
/* COPYRIGHT: */
|
/* COPYRIGHT: */
|
||||||
/* ---------- */
|
/* ---------- */
|
||||||
/* (C) Copyright to the author Olivier BERTRAND 2016-2017 */
|
/* (C) Copyright to the author Olivier BERTRAND 2016-2019 */
|
||||||
/* */
|
/* */
|
||||||
/* WHAT THIS PROGRAM DOES: */
|
/* WHAT THIS PROGRAM DOES: */
|
||||||
/* ----------------------- */
|
/* ----------------------- */
|
||||||
@@ -185,10 +185,10 @@ int JDBCDEF::ParseURL(PGLOBAL g, char *url, bool b)
|
|||||||
} else // host is a URL
|
} else // host is a URL
|
||||||
Url = PlugDup(g, server->host);
|
Url = PlugDup(g, server->host);
|
||||||
|
|
||||||
if (server->username)
|
if (!Username && server->username)
|
||||||
Username = PlugDup(g, server->username);
|
Username = PlugDup(g, server->username);
|
||||||
|
|
||||||
if (server->password)
|
if (!Password && server->password)
|
||||||
Password = PlugDup(g, server->password);
|
Password = PlugDup(g, server->password);
|
||||||
|
|
||||||
return RC_NF;
|
return RC_NF;
|
||||||
@@ -558,33 +558,42 @@ bool TDBJDBC::OpenDB(PGLOBAL g)
|
|||||||
this, Tdb_No, Use, Mode);
|
this, Tdb_No, Use, Mode);
|
||||||
|
|
||||||
if (Use == USE_OPEN) {
|
if (Use == USE_OPEN) {
|
||||||
/*******************************************************************/
|
if (Mode == MODE_READ || Mode == MODE_READX) {
|
||||||
/* Table already open, just replace it at its beginning. */
|
/*****************************************************************/
|
||||||
/*******************************************************************/
|
/* Table already open, just replace it at its beginning. */
|
||||||
if (Memory == 1) {
|
/*****************************************************************/
|
||||||
if ((Qrp = Jcp->AllocateResult(g, this)))
|
if (Memory == 1) {
|
||||||
Memory = 2; // Must be filled
|
if ((Qrp = Jcp->AllocateResult(g, this)))
|
||||||
else
|
Memory = 2; // Must be filled
|
||||||
Memory = 0; // Allocation failed, don't use it
|
else
|
||||||
|
Memory = 0; // Allocation failed, don't use it
|
||||||
|
|
||||||
} else if (Memory == 2)
|
} else if (Memory == 2)
|
||||||
Memory = 3; // Ok to use memory result
|
Memory = 3; // Ok to use memory result
|
||||||
|
|
||||||
if (Memory < 3) {
|
if (Memory < 3) {
|
||||||
// Method will depend on cursor type
|
// Method will depend on cursor type
|
||||||
if ((Rbuf = Query ? Jcp->Rewind(Query->GetStr()) : 0) < 0)
|
if ((Rbuf = Query ? Jcp->Rewind(Query->GetStr()) : 0) < 0)
|
||||||
if (Mode != MODE_READX) {
|
if (Mode != MODE_READX) {
|
||||||
Jcp->Close();
|
Jcp->Close();
|
||||||
return true;
|
return true;
|
||||||
} else
|
} else
|
||||||
Rbuf = 0;
|
Rbuf = 0;
|
||||||
|
|
||||||
} else
|
} else
|
||||||
Rbuf = Qrp->Nblin;
|
Rbuf = Qrp->Nblin;
|
||||||
|
|
||||||
|
CurNum = 0;
|
||||||
|
Fpos = 0;
|
||||||
|
Curpos = 1;
|
||||||
|
} else if (Mode == MODE_UPDATE || Mode == MODE_DELETE) {
|
||||||
|
// new update coming from a trigger or procedure
|
||||||
|
Query = NULL;
|
||||||
|
SetCondFil(NULL);
|
||||||
|
Qrystr = To_Def->GetStringCatInfo(g, "Query_String", "?");
|
||||||
|
} else { //if (Mode == MODE_INSERT)
|
||||||
|
} // endif Mode
|
||||||
|
|
||||||
CurNum = 0;
|
|
||||||
Fpos = 0;
|
|
||||||
Curpos = 1;
|
|
||||||
return false;
|
return false;
|
||||||
} // endif use
|
} // endif use
|
||||||
|
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
/************* tabjson C++ Program Source Code File (.CPP) *************/
|
/************* tabjson C++ Program Source Code File (.CPP) *************/
|
||||||
/* PROGRAM NAME: tabjson Version 1.6 */
|
/* PROGRAM NAME: tabjson Version 1.7 */
|
||||||
/* (C) Copyright to the author Olivier BERTRAND 2014 - 2018 */
|
/* (C) Copyright to the author Olivier BERTRAND 2014 - 2019 */
|
||||||
/* This program are the JSON class DB execution routines. */
|
/* This program are the JSON class DB execution routines. */
|
||||||
/***********************************************************************/
|
/***********************************************************************/
|
||||||
|
|
||||||
@@ -110,8 +110,8 @@ PQRYRES JSONColumns(PGLOBAL g, PCSZ db, PCSZ dsn, PTOS topt, bool info)
|
|||||||
buftyp, fldtyp, length, false, false);
|
buftyp, fldtyp, length, false, false);
|
||||||
|
|
||||||
crp = qrp->Colresp->Next->Next->Next->Next->Next->Next;
|
crp = qrp->Colresp->Next->Next->Next->Next->Next->Next;
|
||||||
crp->Name = "Nullable";
|
crp->Name = PlugDup(g, "Nullable");
|
||||||
crp->Next->Name = "Jpath";
|
crp->Next->Name = PlugDup(g, "Jpath");
|
||||||
|
|
||||||
if (info || !qrp)
|
if (info || !qrp)
|
||||||
return qrp;
|
return qrp;
|
||||||
|
Reference in New Issue
Block a user