mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 20:42:30 +01:00
5ae2656b69
commit c545d544378483bf68c4fb713cd4ec872d0df2c4 Author: Olivier Bertrand <bertrandop@gmail.com> Date: Tue Mar 27 23:13:14 2018 +0200 - Fix MDEV-15577 CONNECT engine JDBC remote index prevents UPDATE Fixed in TDBJDBC::OpenDB because query can be null for updates modified: storage/connect/tabjdbc.cpp commit c4f1fe2e8e74566e9c3296f435448d9f5c718b23 Author: Olivier Bertrand <bertrandop@gmail.com> Date: Wed Mar 14 12:21:17 2018 +0100 - 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 added: storage/connect/mysql-test/connect/std_data/JavaWrappers.jar commit 3068bb4882a316c6c32c624609db2bf24ae3ad40 Author: Olivier Bertrand <bertrandop@gmail.com> Date: Mon Feb 26 19:40:27 2018 +0100 Revert to old cmake file to avoid compile error commit da8c1c0bd6a327fd03bd321be3170f468122ef67 Author: Olivier Bertrand <bertrandop@gmail.com> Date: Mon Feb 26 16:13:39 2018 +0100 - Remove warning on not used tabtyp variable in connect_assisted_discovery modified: storage/connect/ha_connect.cc - Fix a bug causing CONNECT to loop when expanding a JSON column when the expanded column value is null or void array. - Adding the FullArray option to JSON tables. - Skipping expanded JSON lines when the expanded column value is null. modified: storage/connect/connect.cc modified: storage/connect/tabdos.h modified: storage/connect/tabjson.cpp modified: storage/connect/tabjson.h - Fix MDEV-13353 No file privilege for ODBC, JDBC, MONGO, MAC, WMI file types. modified: storage/connect/ha_connect.cc - Make some Json UDFs to accept a non JSON item as 1st parameter. modified: storage/connect/json.cpp modified: storage/connect/json.h modified: storage/connect/jsonudf.cpp modified: storage/connect/jsonudf.h - Update Json UDF tests to cope with above changes. modified: storage/connect/mysql-test/connect/r/json_udf.result modified: storage/connect/mysql-test/connect/r/json_udf_bin.result modified: storage/connect/mysql-test/connect/r/vcol.result modified: storage/connect/mysql-test/connect/t/json_udf.test modified: storage/connect/mysql-test/connect/t/vcol.test - Fix some compiler warning treated as error PlugSubAlloc no more exported because it does throw. modified: storage/connect/global.h modified: storage/connect/ha_connect.cc modified: storage/connect/jsonudf.cpp modified: storage/connect/tabjson.cpp modified: storage/connect/tabjson.h - Other files modified (?) when going back to wrong merge modified: storage/connect/CMakeLists.txt modified: storage/connect/array.cpp modified: storage/connect/colblk.cpp modified: storage/connect/connect.cc modified: storage/connect/csort.cpp modified: storage/connect/domdoc.cpp modified: storage/connect/filamap.cpp modified: storage/connect/filamgz.cpp modified: storage/connect/filamtxt.cpp modified: storage/connect/filamzip.cpp modified: storage/connect/filter.cpp modified: storage/connect/fmdlex.c modified: storage/connect/jdbconn.cpp modified: storage/connect/macutil.cpp modified: storage/connect/myconn.cpp modified: storage/connect/odbconn.cpp modified: storage/connect/plgdbutl.cpp modified: storage/connect/plugutil.cpp modified: storage/connect/preparse.h modified: storage/connect/rcmsg.c modified: storage/connect/rcmsg.h modified: storage/connect/reldef.cpp modified: storage/connect/tabdos.cpp modified: storage/connect/tabfmt.cpp modified: storage/connect/tabmac.cpp modified: storage/connect/tabmul.cpp modified: storage/connect/tabmysql.cpp modified: storage/connect/tabmysql.h modified: storage/connect/tabodbc.cpp modified: storage/connect/tabtbl.cpp modified: storage/connect/tabxml.cpp modified: storage/connect/value.cpp modified: storage/connect/xobject.cpp commit 5095628b31ed8c94bd7c794c6b0162894a9040b1 Author: Olivier Bertrand <bertrandop@gmail.com> Date: Tue Feb 13 14:29:00 2018 +0100 - Fix a bug causing CONNECT to loop when expanding a JSON column when the expanded column value is null or void array. - Adding the FullArray option to JSON tables. - Skipping expanded JSON lines when the expanded column value is null. modified: storage/connect/connect.cc modified: storage/connect/tabdos.h modified: storage/connect/tabjson.cpp modified: storage/connect/tabjson.h commit 9896174328da42016735630c893fd09eb128b48e Author: Olivier Bertrand <bertrandop@gmail.com> Date: Fri Feb 2 15:48:57 2018 +0100 - Remove warning on not used tabtyp variable in connect_assisted_discovery modified: storage/connect/ha_connect.cc commit d7e254c05f88173eb04d8dafc813013eb42ccdbe Author: Olivier Bertrand <bertrandop@gmail.com> Date: Wed Jan 31 14:42:45 2018 +0100 - Use delayed load for the MongoDB C Drive on Windows modified: storage/connect/CMakeLists.txt modified: storage/connect/cmgoconn.cpp modified: storage/connect/ha_connect.cc - Add FORCE to the connect_type_conv enum values This will translate binary values to TYPE_STRING modified: storage/connect/checklvl.h modified: storage/connect/ha_connect.cc modified: storage/connect/odbconn.cpp - Change the connect_xtrace variable to from int to set modified: storage/connect/array.cpp modified: storage/connect/blkfil.cpp modified: storage/connect/block.h modified: storage/connect/cmgoconn.cpp modified: storage/connect/colblk.cpp modified: storage/connect/connect.cc modified: storage/connect/filamap.cpp modified: storage/connect/filamdbf.cpp modified: storage/connect/filamfix.cpp modified: storage/connect/filamgz.cpp modified: storage/connect/filamtxt.cpp modified: storage/connect/filamvct.cpp modified: storage/connect/filamzip.cpp modified: storage/connect/filter.cpp modified: storage/connect/global.h modified: storage/connect/ha_connect.cc modified: storage/connect/inihandl.cpp modified: storage/connect/javaconn.cpp modified: storage/connect/jdbconn.cpp modified: storage/connect/jmgfam.cpp modified: storage/connect/jmgoconn.cpp modified: storage/connect/json.cpp modified: storage/connect/jsonudf.cpp modified: storage/connect/libdoc.cpp modified: storage/connect/mongo.cpp modified: storage/connect/mycat.cc modified: storage/connect/myconn.cpp modified: storage/connect/odbconn.cpp modified: storage/connect/plgdbutl.cpp modified: storage/connect/plugutil.cpp modified: storage/connect/reldef.cpp modified: storage/connect/tabcol.cpp modified: storage/connect/tabdos.cpp modified: storage/connect/tabext.cpp modified: storage/connect/tabfix.cpp modified: storage/connect/tabfmt.cpp modified: storage/connect/tabjdbc.cpp modified: storage/connect/tabjson.cpp modified: storage/connect/table.cpp modified: storage/connect/tabmul.cpp modified: storage/connect/tabmysql.cpp modified: storage/connect/tabodbc.cpp modified: storage/connect/tabpivot.cpp modified: storage/connect/tabsys.cpp modified: storage/connect/tabtbl.cpp modified: storage/connect/tabutil.cpp modified: storage/connect/tabvct.cpp modified: storage/connect/tabwmi.cpp modified: storage/connect/tabxml.cpp modified: storage/connect/user_connect.cc modified: storage/connect/valblk.cpp modified: storage/connect/value.cpp modified: storage/connect/xindex.cpp - Restore connect_enable_mongo variable (but undocumented) modified: storage/connect/ha_connect.cc modified: storage/connect/mycat.cc modified: storage/connect/mysql-test/connect/r/json_java_2.result modified: storage/connect/mysql-test/connect/r/json_java_3.result modified: storage/connect/mysql-test/connect/r/json_mongo_c.result modified: storage/connect/mysql-test/connect/r/mongo_c.result modified: storage/connect/mysql-test/connect/r/mongo_java_2.result modified: storage/connect/mysql-test/connect/r/mongo_java_3.result modified: storage/connect/mysql-test/connect/r/tbl_thread.result modified: storage/connect/mysql-test/connect/t/mongo.inc modified: storage/connect/mysql-test/connect/t/mongo_test.inc modified: storage/connect/mysql-test/connect/t/tbl_thread.test
441 lines
14 KiB
C++
441 lines
14 KiB
C++
/************ Xobject C++ Functions Source Code File (.CPP) ************/
|
|
/* Name: XOBJECT.CPP Version 2.5 */
|
|
/* */
|
|
/* (C) Copyright to the author Olivier BERTRAND 1998-2017 */
|
|
/* */
|
|
/* This file contains base XOBJECT class functions. */
|
|
/* Also here is the implementation of the CONSTANT class. */
|
|
/***********************************************************************/
|
|
|
|
/***********************************************************************/
|
|
/* Include mariaDB header file. */
|
|
/***********************************************************************/
|
|
#include "my_global.h"
|
|
#include "m_string.h"
|
|
|
|
/***********************************************************************/
|
|
/* Include required application header files */
|
|
/* global.h is header containing all global Plug declarations. */
|
|
/* plgdbsem.h is header containing the DB applic. declarations. */
|
|
/***********************************************************************/
|
|
#include "global.h"
|
|
#include "plgdbsem.h"
|
|
#include "xobject.h"
|
|
|
|
/***********************************************************************/
|
|
/* Macro definitions. */
|
|
/***********************************************************************/
|
|
#if defined(_DEBUG) || defined(DEBTRACE)
|
|
#define ASSERT(B) assert(B);
|
|
#else
|
|
#define ASSERT(B)
|
|
#endif
|
|
|
|
/***********************************************************************/
|
|
/* The one and only needed void object. */
|
|
/***********************************************************************/
|
|
XVOID Xvoid;
|
|
PXOB const pXVOID = &Xvoid; // Pointer used by other classes
|
|
|
|
/* ------------------------- Class XOBJECT --------------------------- */
|
|
|
|
/***********************************************************************/
|
|
/* GetCharValue: returns the Result value as a char string. */
|
|
/* Using GetCharValue provides no conversion from numeric types. */
|
|
/***********************************************************************/
|
|
PSZ XOBJECT::GetCharValue(void)
|
|
{
|
|
ASSERT(Value)
|
|
return Value->GetCharValue();
|
|
} // end of GetCharValue()
|
|
|
|
/***********************************************************************/
|
|
/* GetShortValue: returns the Result value as a short integer. */
|
|
/***********************************************************************/
|
|
short XOBJECT::GetShortValue(void)
|
|
{
|
|
ASSERT(Value)
|
|
return Value->GetShortValue();
|
|
} // end of GetShortValue
|
|
|
|
/***********************************************************************/
|
|
/* GetIntValue: returns the Result value as a int integer. */
|
|
/***********************************************************************/
|
|
int XOBJECT::GetIntValue(void)
|
|
{
|
|
ASSERT(Value)
|
|
return Value->GetIntValue();
|
|
} // end of GetIntValue
|
|
|
|
/***********************************************************************/
|
|
/* GetFloatValue: returns the Result value as a double float. */
|
|
/***********************************************************************/
|
|
double XOBJECT::GetFloatValue(void)
|
|
{
|
|
ASSERT(Value)
|
|
return Value->GetFloatValue();
|
|
} // end of GetFloatValue
|
|
|
|
/* ------------------------- Class CONSTANT -------------------------- */
|
|
|
|
/***********************************************************************/
|
|
/* CONSTANT public constructor. */
|
|
/***********************************************************************/
|
|
CONSTANT::CONSTANT(PGLOBAL g, void *value, short type)
|
|
{
|
|
if (!(Value = AllocateValue(g, value, (int)type)))
|
|
throw (int)TYPE_CONST;
|
|
|
|
Constant = true;
|
|
} // end of CONSTANT constructor
|
|
|
|
/***********************************************************************/
|
|
/* CONSTANT public constructor. */
|
|
/***********************************************************************/
|
|
CONSTANT::CONSTANT(PGLOBAL g, int n)
|
|
{
|
|
if (!(Value = AllocateValue(g, &n, TYPE_INT)))
|
|
throw (int)TYPE_CONST;
|
|
|
|
Constant = true;
|
|
} // end of CONSTANT constructor
|
|
|
|
/***********************************************************************/
|
|
/* GetLengthEx: returns an evaluation of the constant string length. */
|
|
/* Note: When converting from token to string, length has to be */
|
|
/* specified but we need the domain length, not the value length. */
|
|
/***********************************************************************/
|
|
int CONSTANT::GetLengthEx(void)
|
|
{
|
|
return Value->GetValLen();
|
|
} // end of GetLengthEx
|
|
|
|
/***********************************************************************/
|
|
/* Convert a constant to the given type. */
|
|
/***********************************************************************/
|
|
void CONSTANT::Convert(PGLOBAL g, int newtype)
|
|
{
|
|
if (Value->GetType() != newtype)
|
|
if (!(Value = AllocateValue(g, Value, newtype)))
|
|
throw (int)TYPE_CONST;
|
|
|
|
} // end of Convert
|
|
|
|
/***********************************************************************/
|
|
/* Compare: returns true if this object is equivalent to xp. */
|
|
/***********************************************************************/
|
|
bool CONSTANT::Compare(PXOB xp)
|
|
{
|
|
if (this == xp)
|
|
return true;
|
|
else if (xp->GetType() != TYPE_CONST)
|
|
return false;
|
|
else
|
|
return Value->IsEqual(xp->GetValue(), true);
|
|
|
|
} // end of Compare
|
|
|
|
#if 0
|
|
/***********************************************************************/
|
|
/* Rephrase: temporary implementation used by PlugRephraseSQL. */
|
|
/***********************************************************************/
|
|
bool CONSTANT::Rephrase(PGLOBAL g, PSZ work)
|
|
{
|
|
switch (Value->GetType()) {
|
|
case TYPE_STRING:
|
|
sprintf(work + strlen(work), "'%s'", Value->GetCharValue());
|
|
break;
|
|
case TYPE_SHORT:
|
|
sprintf(work + strlen(work), "%hd", Value->GetShortValue());
|
|
break;
|
|
case TYPE_INT:
|
|
case TYPE_DATE:
|
|
sprintf(work + strlen(work), "%d", Value->GetIntValue());
|
|
break;
|
|
case TYPE_DOUBLE:
|
|
sprintf(work + strlen(work), "%lf", Value->GetFloatValue());
|
|
break;
|
|
case TYPE_BIGINT:
|
|
sprintf(work + strlen(work), "%lld", Value->GetBigintValue());
|
|
break;
|
|
case TYPE_TINY:
|
|
sprintf(work + strlen(work), "%d", Value->GetTinyValue());
|
|
break;
|
|
default:
|
|
sprintf(g->Message, MSG(BAD_CONST_TYPE), Value->GetType());
|
|
return false;
|
|
} // endswitch
|
|
|
|
return false;
|
|
} // end of Rephrase
|
|
#endif // 0
|
|
|
|
/***********************************************************************/
|
|
/* Make file output of a constant object. */
|
|
/***********************************************************************/
|
|
void CONSTANT::Printf(PGLOBAL g, FILE *f, uint n)
|
|
{
|
|
Value->Printf(g, f, n);
|
|
} /* end of Printf */
|
|
|
|
/***********************************************************************/
|
|
/* Make string output of a constant object. */
|
|
/***********************************************************************/
|
|
void CONSTANT::Prints(PGLOBAL g, char *ps, uint z)
|
|
{
|
|
Value->Prints(g, ps, z);
|
|
} /* end of Prints */
|
|
|
|
/* -------------------------- Class STRING --------------------------- */
|
|
|
|
/***********************************************************************/
|
|
/* STRING public constructor for new char values. Alloc Size must be */
|
|
/* calculated because PlugSubAlloc rounds up size to multiple of 8. */
|
|
/***********************************************************************/
|
|
STRING::STRING(PGLOBAL g, uint n, PCSZ str)
|
|
{
|
|
G = g;
|
|
Length = (str) ? strlen(str) : 0;
|
|
|
|
if ((Strp = (PSZ)PlgDBSubAlloc(g, NULL, MY_MAX(n, Length) + 1))) {
|
|
if (str)
|
|
strcpy(Strp, str);
|
|
else
|
|
*Strp = 0;
|
|
|
|
Next = GetNext();
|
|
Size = (int)(Next - Strp);
|
|
Trc = false;
|
|
} else {
|
|
// This should normally never happen
|
|
Next = NULL;
|
|
Size = 0;
|
|
Trc = true;
|
|
} // endif Strp
|
|
|
|
} // end of STRING constructor
|
|
|
|
/***********************************************************************/
|
|
/* Reallocate the string memory and return the (new) position. */
|
|
/* If Next is equal to GetNext() this means that no new suballocation */
|
|
/* has been done. Then we can just increase the size of the current */
|
|
/* allocation and the Strp will remain pointing to the same memory. */
|
|
/***********************************************************************/
|
|
char *STRING::Realloc(uint len)
|
|
{
|
|
char *p;
|
|
bool b = (Next == GetNext());
|
|
|
|
p = (char*)PlgDBSubAlloc(G, NULL, b ? len - Size : len);
|
|
|
|
if (!p) {
|
|
// No more room in Sarea; this is very unlikely
|
|
strcpy(G->Message, "No more room in work area");
|
|
Trc = true;
|
|
return NULL;
|
|
} // endif p
|
|
|
|
if (b)
|
|
p = Strp;
|
|
|
|
Next = GetNext();
|
|
Size = (int)(Next - p);
|
|
return p;
|
|
} // end of Realloc
|
|
|
|
/***********************************************************************/
|
|
/* Set a STRING new PSZ value. */
|
|
/***********************************************************************/
|
|
bool STRING::Set(PCSZ s)
|
|
{
|
|
if (!s)
|
|
return false;
|
|
|
|
uint len = strlen(s) + 1;
|
|
|
|
if (len > Size) {
|
|
char *p = Realloc(len);
|
|
|
|
if (!p)
|
|
return true;
|
|
else
|
|
Strp = p;
|
|
|
|
} // endif n
|
|
|
|
strcpy(Strp, s);
|
|
Length = len - 1;
|
|
return false;
|
|
} // end of Set
|
|
|
|
/***********************************************************************/
|
|
/* Set a STRING new PSZ value. */
|
|
/***********************************************************************/
|
|
bool STRING::Set(char *s, uint n)
|
|
{
|
|
if (!s)
|
|
return false;
|
|
|
|
uint len = strnlen(s, n) + 1;
|
|
|
|
if (len > Size) {
|
|
char *p = Realloc(len);
|
|
|
|
if (!p)
|
|
return true;
|
|
else
|
|
Strp = p;
|
|
|
|
} // endif n
|
|
|
|
strncpy(Strp, s, n);
|
|
Length = len - 1;
|
|
return false;
|
|
} // end of Set
|
|
|
|
/***********************************************************************/
|
|
/* Append a char* to a STRING. */
|
|
/***********************************************************************/
|
|
bool STRING::Append(const char *s, uint ln, bool nq)
|
|
{
|
|
if (!s)
|
|
return false;
|
|
|
|
uint i, len = Length + ln + 1;
|
|
|
|
if (len > Size) {
|
|
char *p = Realloc(len);
|
|
|
|
if (!p)
|
|
return true;
|
|
else if (p != Strp) {
|
|
strcpy(p, Strp);
|
|
Strp = p;
|
|
} // endif p
|
|
|
|
} // endif n
|
|
|
|
if (nq) {
|
|
for (i = 0; i < ln; i++)
|
|
switch (s[i]) {
|
|
case '\\': Strp[Length++] = '\\'; Strp[Length++] = '\\'; break;
|
|
case '\0': Strp[Length++] = '\\'; Strp[Length++] = '0'; break;
|
|
case '\'': Strp[Length++] = '\\'; Strp[Length++] = '\''; break;
|
|
case '\n': Strp[Length++] = '\\'; Strp[Length++] = 'n'; break;
|
|
case '\r': Strp[Length++] = '\\'; Strp[Length++] = 'r'; break;
|
|
case '\032': Strp[Length++] = '\\'; Strp[Length++] = 'Z'; break;
|
|
default: Strp[Length++] = s[i];
|
|
} // endswitch s[i]
|
|
|
|
} else
|
|
for (i = 0; i < ln && s[i]; i++)
|
|
Strp[Length++] = s[i];
|
|
|
|
Strp[Length] = 0;
|
|
return false;
|
|
} // end of Append
|
|
|
|
/***********************************************************************/
|
|
/* Append a PCSZ to a STRING. */
|
|
/***********************************************************************/
|
|
bool STRING::Append(PCSZ s)
|
|
{
|
|
if (!s)
|
|
return false;
|
|
|
|
uint len = Length + strlen(s) + 1;
|
|
|
|
if (len > Size) {
|
|
char *p = Realloc(len);
|
|
|
|
if (!p)
|
|
return true;
|
|
else if (p != Strp) {
|
|
strcpy(p, Strp);
|
|
Strp = p;
|
|
} // endif p
|
|
|
|
} // endif n
|
|
|
|
strcpy(Strp + Length, s);
|
|
Length = len - 1;
|
|
return false;
|
|
} // end of Append
|
|
|
|
/***********************************************************************/
|
|
/* Append a STRING to a STRING. */
|
|
/***********************************************************************/
|
|
bool STRING::Append(STRING &str)
|
|
{
|
|
return Append(str.GetStr());
|
|
} // end of Append
|
|
|
|
/***********************************************************************/
|
|
/* Append a char to a STRING. */
|
|
/***********************************************************************/
|
|
bool STRING::Append(char c)
|
|
{
|
|
if (Length + 2 > Size) {
|
|
char *p = Realloc(Length + 2);
|
|
|
|
if (!p)
|
|
return true;
|
|
else if (p != Strp) {
|
|
strcpy(p, Strp);
|
|
Strp = p;
|
|
} // endif p
|
|
|
|
} // endif n
|
|
|
|
Strp[Length++] = c;
|
|
Strp[Length] = 0;
|
|
return false;
|
|
} // end of Append
|
|
|
|
/***********************************************************************/
|
|
/* Append a quoted PSZ to a STRING. */
|
|
/***********************************************************************/
|
|
bool STRING::Append_quoted(PCSZ s)
|
|
{
|
|
bool b = Append('\'');
|
|
|
|
if (s) for (const char *p = s; !b && *p; p++)
|
|
switch (*p) {
|
|
case '\'':
|
|
case '\\':
|
|
case '\t':
|
|
case '\n':
|
|
case '\r':
|
|
case '\b':
|
|
case '\f': b |= Append('\\');
|
|
// fall through
|
|
default:
|
|
b |= Append(*p);
|
|
break;
|
|
} // endswitch *p
|
|
|
|
return (b |= Append('\''));
|
|
} // end of Append_quoted
|
|
|
|
/***********************************************************************/
|
|
/* Resize to given length but only when last suballocated. */
|
|
/* New size should be greater than string length. */
|
|
/***********************************************************************/
|
|
bool STRING::Resize(uint newsize)
|
|
{
|
|
if (Next == GetNext() && newsize > Length) {
|
|
uint nsz = (((signed)newsize + 7) / 8) * 8;
|
|
int diff = (signed)Size - (signed)nsz;
|
|
PPOOLHEADER pp = (PPOOLHEADER)G->Sarea;
|
|
|
|
if ((signed)pp->FreeBlk + diff < 0)
|
|
return true; // Out of memory
|
|
|
|
pp->To_Free -= diff;
|
|
pp->FreeBlk += diff;
|
|
Size = nsz;
|
|
return false;
|
|
} else
|
|
return newsize > Size;
|
|
|
|
} // end of Resize
|