mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
- Fix MDEV-13925: Actually this fixes SELECT queries when
the WHERE clause have single quote. modified: storage/connect/ha_connect.cc - Use Windows VirtualAlloc and VirtualFree for the Sarea workspace modified: storage/connect/global.h modified: storage/connect/ha_connect.cc modified: storage/connect/jsonudf.cpp modified: storage/connect/plgdbutl.cpp modified: storage/connect/plugutil.cpp modified: storage/connect/user_connect.cc
This commit is contained in:
@@ -217,7 +217,8 @@ DllExport int PlugExit(PGLOBAL); // Plug global termination
|
|||||||
DllExport LPSTR PlugRemoveType(LPSTR, LPCSTR);
|
DllExport LPSTR PlugRemoveType(LPSTR, LPCSTR);
|
||||||
DllExport LPCSTR PlugSetPath(LPSTR to, LPCSTR prefix, LPCSTR name, LPCSTR dir);
|
DllExport LPCSTR PlugSetPath(LPSTR to, LPCSTR prefix, LPCSTR name, LPCSTR dir);
|
||||||
DllExport BOOL PlugIsAbsolutePath(LPCSTR path);
|
DllExport BOOL PlugIsAbsolutePath(LPCSTR path);
|
||||||
DllExport void *PlugAllocMem(PGLOBAL, uint);
|
DllExport bool AllocSarea(PGLOBAL, uint);
|
||||||
|
DllExport void FreeSarea(PGLOBAL);
|
||||||
DllExport BOOL PlugSubSet(PGLOBAL, void *, uint);
|
DllExport BOOL PlugSubSet(PGLOBAL, void *, uint);
|
||||||
DllExport void *PlugSubAlloc(PGLOBAL, void *, size_t);
|
DllExport void *PlugSubAlloc(PGLOBAL, void *, size_t);
|
||||||
DllExport char *PlugDup(PGLOBAL g, const char *str);
|
DllExport char *PlugDup(PGLOBAL g, const char *str);
|
||||||
|
@@ -3009,7 +3009,9 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, const Item *cond)
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (!x) {
|
if (!x) {
|
||||||
|
const char *p;
|
||||||
char *s = (ishav) ? havg : body;
|
char *s = (ishav) ? havg : body;
|
||||||
|
uint j, k, n;
|
||||||
|
|
||||||
// Append the value to the filter
|
// Append the value to the filter
|
||||||
switch (args[i]->field_type()) {
|
switch (args[i]->field_type()) {
|
||||||
@@ -3065,16 +3067,38 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, const Item *cond)
|
|||||||
strcat(s, "'}");
|
strcat(s, "'}");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
strcat(s, "'");
|
j = strlen(s);
|
||||||
strncat(s, res->ptr(), res->length());
|
s[j++] = '\'';
|
||||||
strcat(s, "'");
|
p = res->ptr();
|
||||||
} // endswitch field type
|
n = res->length();
|
||||||
|
|
||||||
|
for (k = 0; k < n; k++) {
|
||||||
|
if (p[k] == '\'')
|
||||||
|
s[j++] = '\'';
|
||||||
|
|
||||||
|
s[j++] = p[k];
|
||||||
|
} // endfor k
|
||||||
|
|
||||||
|
s[j++] = '\'';
|
||||||
|
s[j] = 0;
|
||||||
|
} // endswitch field type
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
strcat(s, "'");
|
j = strlen(s);
|
||||||
strncat(s, res->ptr(), res->length());
|
s[j++] = '\'';
|
||||||
strcat(s, "'");
|
p = res->ptr();
|
||||||
} // endif tty
|
n = res->length();
|
||||||
|
|
||||||
|
for (k = 0; k < n; k++) {
|
||||||
|
if (p[k] == '\'')
|
||||||
|
s[j++] = '\'';
|
||||||
|
|
||||||
|
s[j++] = p[k];
|
||||||
|
} // endfor k
|
||||||
|
|
||||||
|
s[j++] = '\'';
|
||||||
|
s[j] = 0;
|
||||||
|
} // endif tty
|
||||||
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@@ -1505,23 +1505,16 @@ static my_bool CheckMemory(PGLOBAL g, UDF_INIT *initid, UDF_ARGS *args, uint n,
|
|||||||
ml += g->More;
|
ml += g->More;
|
||||||
|
|
||||||
if (ml > g->Sarea_Size) {
|
if (ml > g->Sarea_Size) {
|
||||||
#if !defined(DEVELOPMENT)
|
FreeSarea(g);
|
||||||
if (trace)
|
|
||||||
#endif
|
|
||||||
htrc("Freeing Sarea at %p size=%d\n", g->Sarea, g->Sarea_Size);
|
|
||||||
|
|
||||||
free(g->Sarea);
|
if (AllocSarea(g, ml)) {
|
||||||
|
|
||||||
if (!(g->Sarea = PlugAllocMem(g, ml))) {
|
|
||||||
char errmsg[MAX_STR];
|
char errmsg[MAX_STR];
|
||||||
|
|
||||||
sprintf(errmsg, MSG(WORK_AREA), g->Message);
|
sprintf(errmsg, MSG(WORK_AREA), g->Message);
|
||||||
strcpy(g->Message, errmsg);
|
strcpy(g->Message, errmsg);
|
||||||
g->Sarea_Size = 0;
|
|
||||||
return true;
|
return true;
|
||||||
} // endif Alloc
|
} // endif SareaAlloc
|
||||||
|
|
||||||
g->Sarea_Size = ml;
|
|
||||||
g->Createas = 0;
|
g->Createas = 0;
|
||||||
g->Xchk = NULL;
|
g->Xchk = NULL;
|
||||||
initid->max_length = rl;
|
initid->max_length = rl;
|
||||||
|
@@ -334,7 +334,7 @@ PDBUSER PlgMakeUser(PGLOBAL g)
|
|||||||
{
|
{
|
||||||
PDBUSER dbuserp;
|
PDBUSER dbuserp;
|
||||||
|
|
||||||
if (!(dbuserp = (PDBUSER)PlugAllocMem(g, (uint)sizeof(DBUSERBLK)))) {
|
if (!(dbuserp = (PDBUSER)malloc(sizeof(DBUSERBLK)))) {
|
||||||
sprintf(g->Message, MSG(MALLOC_ERROR), "PlgMakeUser");
|
sprintf(g->Message, MSG(MALLOC_ERROR), "PlgMakeUser");
|
||||||
return NULL;
|
return NULL;
|
||||||
} // endif dbuserp
|
} // endif dbuserp
|
||||||
|
@@ -138,7 +138,7 @@ PGLOBAL PlugInit(LPCSTR Language, uint worksize)
|
|||||||
|
|
||||||
if (trace > 1)
|
if (trace > 1)
|
||||||
htrc("PlugInit: Language='%s'\n",
|
htrc("PlugInit: Language='%s'\n",
|
||||||
((!Language) ? "Null" : (char*)Language));
|
((!Language) ? "Null" : (char*)Language));
|
||||||
|
|
||||||
try {
|
try {
|
||||||
g = new GLOBAL;
|
g = new GLOBAL;
|
||||||
@@ -160,13 +160,11 @@ PGLOBAL PlugInit(LPCSTR Language, uint worksize)
|
|||||||
/*******************************************************************/
|
/*******************************************************************/
|
||||||
/* Allocate the main work segment. */
|
/* Allocate the main work segment. */
|
||||||
/*******************************************************************/
|
/*******************************************************************/
|
||||||
if (worksize && !(g->Sarea = PlugAllocMem(g, worksize))) {
|
if (worksize && AllocSarea(g, worksize)) {
|
||||||
char errmsg[MAX_STR];
|
char errmsg[MAX_STR];
|
||||||
sprintf(errmsg, MSG(WORK_AREA), g->Message);
|
sprintf(errmsg, MSG(WORK_AREA), g->Message);
|
||||||
strcpy(g->Message, errmsg);
|
strcpy(g->Message, errmsg);
|
||||||
g->Sarea_Size = 0;
|
} // endif Sarea
|
||||||
} else
|
|
||||||
g->Sarea_Size = worksize;
|
|
||||||
|
|
||||||
g->jump_level = -1; /* New setting to allow recursive call of Plug */
|
g->jump_level = -1; /* New setting to allow recursive call of Plug */
|
||||||
return(g);
|
return(g);
|
||||||
@@ -183,15 +181,7 @@ int PlugExit(PGLOBAL g)
|
|||||||
if (dup)
|
if (dup)
|
||||||
free(dup);
|
free(dup);
|
||||||
|
|
||||||
if (g->Sarea) {
|
FreeSarea(g);
|
||||||
#if !defined(DEVELOPMENT)
|
|
||||||
if (trace)
|
|
||||||
#endif
|
|
||||||
htrc("Freeing Sarea at %p size=%d\n", g->Sarea, g->Sarea_Size);
|
|
||||||
|
|
||||||
free(g->Sarea);
|
|
||||||
} // endif Sarea
|
|
||||||
|
|
||||||
delete g;
|
delete g;
|
||||||
} // endif g
|
} // endif g
|
||||||
|
|
||||||
@@ -459,30 +449,65 @@ short GetLineLength(PGLOBAL g)
|
|||||||
/***********************************************************************/
|
/***********************************************************************/
|
||||||
/* Program for memory allocation of work and language areas. */
|
/* Program for memory allocation of work and language areas. */
|
||||||
/***********************************************************************/
|
/***********************************************************************/
|
||||||
void *PlugAllocMem(PGLOBAL g, uint size)
|
bool AllocSarea(PGLOBAL g, uint size)
|
||||||
{
|
{
|
||||||
void *areap; /* Pointer to allocated area */
|
|
||||||
|
|
||||||
/*********************************************************************/
|
/*********************************************************************/
|
||||||
/* This is the allocation routine for the WIN32/UNIX/AIX version. */
|
/* This is the allocation routine for the WIN32/UNIX/AIX version. */
|
||||||
/*********************************************************************/
|
/*********************************************************************/
|
||||||
if (!(areap = malloc(size)))
|
#if defined(__WIN__)
|
||||||
sprintf(g->Message, MSG(MALLOC_ERROR), "malloc");
|
if (size >= 1048576) // 1M
|
||||||
|
g->Sarea = VirtualAlloc(NULL, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
g->Sarea = malloc(size);
|
||||||
|
|
||||||
|
if (!g->Sarea) {
|
||||||
|
sprintf(g->Message, MSG(MALLOC_ERROR), "malloc");
|
||||||
|
g->Sarea_Size = 0;
|
||||||
|
} else
|
||||||
|
g->Sarea_Size = size;
|
||||||
|
|
||||||
#if defined(DEVELOPMENT)
|
#if defined(DEVELOPMENT)
|
||||||
if (true) {
|
if (true) {
|
||||||
#else
|
#else
|
||||||
if (trace) {
|
if (trace) {
|
||||||
#endif
|
#endif
|
||||||
if (areap)
|
if (g->Sarea)
|
||||||
htrc("Memory of %u allocated at %p\n", size, areap);
|
htrc("Work area of %u allocated at %p\n", size, g->Sarea);
|
||||||
else
|
else
|
||||||
htrc("PlugAllocMem: %s\n", g->Message);
|
htrc("SareaAlloc: %s\n", g->Message);
|
||||||
|
|
||||||
} // endif trace
|
} // endif trace
|
||||||
|
|
||||||
return (areap);
|
return (!g->Sarea);
|
||||||
} // end of PlugAllocMem
|
} // end of AllocSarea
|
||||||
|
|
||||||
|
/***********************************************************************/
|
||||||
|
/* Program for memory freeing the work area. */
|
||||||
|
/***********************************************************************/
|
||||||
|
void FreeSarea(PGLOBAL g)
|
||||||
|
{
|
||||||
|
if (g->Sarea) {
|
||||||
|
#if defined(__WIN__)
|
||||||
|
if (g->Sarea_Size >= 1048576) // 1M
|
||||||
|
VirtualFree(g->Sarea, 0, MEM_RELEASE);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
free(g->Sarea);
|
||||||
|
|
||||||
|
#if defined(DEVELOPMENT)
|
||||||
|
if (true)
|
||||||
|
#else
|
||||||
|
if (trace)
|
||||||
|
#endif
|
||||||
|
htrc("Freeing Sarea at %p size = %d\n", g->Sarea, g->Sarea_Size);
|
||||||
|
|
||||||
|
g->Sarea = NULL;
|
||||||
|
g->Sarea_Size = 0;
|
||||||
|
} // endif Sarea
|
||||||
|
|
||||||
|
return;
|
||||||
|
} // end of FreeSarea
|
||||||
|
|
||||||
/***********************************************************************/
|
/***********************************************************************/
|
||||||
/* Program for SubSet initialization of memory pools. */
|
/* Program for SubSet initialization of memory pools. */
|
||||||
|
@@ -156,29 +156,20 @@ void user_connect::SetHandler(ha_connect *hc)
|
|||||||
bool user_connect::CheckCleanup(bool force)
|
bool user_connect::CheckCleanup(bool force)
|
||||||
{
|
{
|
||||||
if (thdp->query_id > last_query_id || force) {
|
if (thdp->query_id > last_query_id || force) {
|
||||||
uint worksize= GetWorkSize();
|
uint worksize= GetWorkSize(), size = g->Sarea_Size;
|
||||||
|
|
||||||
PlugCleanup(g, true);
|
PlugCleanup(g, true);
|
||||||
|
|
||||||
if (g->Sarea_Size != worksize) {
|
if (size != worksize) {
|
||||||
if (g->Sarea) {
|
FreeSarea(g);
|
||||||
#if !defined(DEVELOPMENT)
|
|
||||||
if (trace)
|
|
||||||
#endif
|
|
||||||
htrc("CheckCleanup: Free Sarea at %p size=%d\n",
|
|
||||||
g->Sarea, g->Sarea_Size);
|
|
||||||
|
|
||||||
free(g->Sarea);
|
|
||||||
} // endif Size
|
|
||||||
|
|
||||||
// Check whether the work area could be allocated
|
// Check whether the work area could be allocated
|
||||||
if (!(g->Sarea = PlugAllocMem(g, worksize))) {
|
if (AllocSarea(g, worksize)) {
|
||||||
g->Sarea = PlugAllocMem(g, g->Sarea_Size);
|
AllocSarea(g, size);
|
||||||
SetWorkSize(g->Sarea_Size); // Was too big
|
SetWorkSize(g->Sarea_Size); // Was too big
|
||||||
} else
|
} // endif sarea
|
||||||
g->Sarea_Size = worksize; // Ok
|
|
||||||
|
|
||||||
} // endif worksize
|
} // endif worksize
|
||||||
|
|
||||||
PlugSubSet(g, g->Sarea, g->Sarea_Size);
|
PlugSubSet(g, g->Sarea, g->Sarea_Size);
|
||||||
g->Xchk = NULL;
|
g->Xchk = NULL;
|
||||||
|
Reference in New Issue
Block a user