From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from localhost (localhost [127.0.0.1]) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTP id EEFF930C43 for ; Thu, 13 Jun 2019 18:24:29 -0400 (EDT) Received: from turing.freelists.org ([127.0.0.1]) by localhost (turing.freelists.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id pa9UQZMSoGqn for ; Thu, 13 Jun 2019 18:24:29 -0400 (EDT) Received: from smtp37.i.mail.ru (smtp37.i.mail.ru [94.100.177.97]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTPS id 88897308B2 for ; Thu, 13 Jun 2019 18:24:29 -0400 (EDT) Subject: [tarantool-patches] Re: [PATCH v1 26/28] sql: cleanup of legacy memory management system References: <83a31a15dfe41460a572961ae55540ebb41e8c3e.1560174553.git.imeevma@gmail.com> From: Vladislav Shpilevoy Message-ID: <87ff4cf8-d816-8e97-be34-e4272e9a3218@tarantool.org> Date: Fri, 14 Jun 2019 00:24:45 +0200 MIME-Version: 1.0 In-Reply-To: <83a31a15dfe41460a572961ae55540ebb41e8c3e.1560174553.git.imeevma@gmail.com> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: tarantool-patches-bounce@freelists.org Errors-to: tarantool-patches-bounce@freelists.org Reply-To: tarantool-patches@freelists.org List-Help: List-Unsubscribe: List-software: Ecartis version 1.0.0 List-Id: tarantool-patches List-Subscribe: List-Owner: List-post: List-Archive: To: tarantool-patches@freelists.org, imeevma@tarantool.org Thanks for the patch! Consider my review fixes below and on the branch in a separate commit. ====================================================== diff --git a/src/box/sql/CMakeLists.txt b/src/box/sql/CMakeLists.txt index b9dbe141a..91a371157 100644 --- a/src/box/sql/CMakeLists.txt +++ b/src/box/sql/CMakeLists.txt @@ -50,7 +50,6 @@ add_library(sql STATIC random.c resolve.c select.c - status.c tokenize.c treeview.c trigger.c diff --git a/src/box/sql/date.c b/src/box/sql/date.c index 547932b2c..2e2a71ad2 100644 --- a/src/box/sql/date.c +++ b/src/box/sql/date.c @@ -536,9 +536,6 @@ clearYMD_HMS_TZ(DateTime * p) * is available. This routine returns 0 on success and * non-zero on any kind of error. * - * If the sqlGlobalConfig.bLocaltimeFault variable is true then this - * routine will always fail. - * * EVIDENCE-OF: R-62172-00036 In this implementation, the standard C * library function localtime_r() is used to assist in the calculation of * local time. @@ -550,18 +547,10 @@ osLocaltime(time_t * t, struct tm *pTm) #if !HAVE_LOCALTIME_R && !HAVE_LOCALTIME_S struct tm *pX; pX = localtime(t); -#ifndef SQL_UNTESTABLE - if (sqlGlobalConfig.bLocaltimeFault) - pX = 0; -#endif if (pX) *pTm = *pX; rc = pX == 0; #else -#ifndef SQL_UNTESTABLE - if (sqlGlobalConfig.bLocaltimeFault) - return 1; -#endif #if HAVE_LOCALTIME_R rc = localtime_r(t, pTm) == 0; #else diff --git a/src/box/sql/global.c b/src/box/sql/global.c index c3c7e945c..ac692be19 100644 --- a/src/box/sql/global.c +++ b/src/box/sql/global.c @@ -137,29 +137,6 @@ const unsigned char sqlCtypeMap[256] = { 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40 /* f8..ff ........ */ }; -/* EVIDENCE-OF: R-02982-34736 In order to maintain full backwards - * compatibility for legacy applications, the URI filename capability is - * disabled by default. - * - * EVIDENCE-OF: R-38799-08373 URI filenames can be enabled or disabled - * using the SQL_USE_URI=1 or SQL_USE_URI=0 compile-time options. - * - * EVIDENCE-OF: R-43642-56306 By default, URI handling is globally - * disabled. The default value may be changed by compiling with the - * SQL_USE_URI symbol defined. - */ -#ifndef SQL_USE_URI -#define SQL_USE_URI 0 -#endif - -/* EVIDENCE-OF: R-38720-18127 The default setting is determined by the - * SQL_ALLOW_COVERING_INDEX_SCAN compile-time option, or is "on" if - * that compile-time option is omitted. - */ -#ifndef SQL_ALLOW_COVERING_INDEX_SCAN -#define SQL_ALLOW_COVERING_INDEX_SCAN 1 -#endif - /* The minimum PMA size is set to this value multiplied by the database * page size in bytes. */ @@ -172,35 +149,16 @@ const unsigned char sqlCtypeMap[256] = { * the sql library. */ SQL_WSD struct sqlConfig sqlConfig = { - SQL_DEFAULT_MEMSTATUS, /* bMemstat */ - SQL_USE_URI, /* bOpenUri */ - SQL_ALLOW_COVERING_INDEX_SCAN, /* bUseCis */ - 0x7ffffffe, /* mxStrlen */ - 0, /* neverCorrupt */ - 0, /* nStmtSpill */ - (void *)0, /* pHeap */ - 0, /* nHeap */ - 0, 0, /* mnHeap, mxHeap */ SQL_DEFAULT_MMAP_SIZE, /* szMmap */ SQL_MAX_MMAP_SIZE, /* mxMmap */ - (void *)0, /* pScratch */ - 0, /* szScratch */ - 0, /* nScratch */ - (void *)0, /* pPage */ - 0, /* szPage */ - SQL_DEFAULT_PCACHE_INITSZ, /* nPage */ - 0, /* mxParserStack */ - 0, /* sharedCacheEnabled */ SQL_SORTER_PMASZ, /* szPma */ /* All the rest should always be initialized to zero */ 0, /* isInit */ 0, /* inProgress */ - 0, /* isMallocInit */ #ifdef SQL_VDBE_COVERAGE 0, /* xVdbeBranch */ 0, /* pVbeBranchArg */ #endif - 0, /* bLocaltimeFault */ 0x7ffffffe /* iOnceResetThreshold */ }; diff --git a/src/box/sql/main.c b/src/box/sql/main.c index 138eb5ac0..912c3bf3b 100644 --- a/src/box/sql/main.c +++ b/src/box/sql/main.c @@ -115,11 +115,6 @@ sql_initialize(void) if (sqlGlobalConfig.isInit) return 0; - if (!sqlGlobalConfig.isMallocInit) - sqlMallocInit(); - if (rc == 0) - sqlGlobalConfig.isMallocInit = 1; - /* If rc is not 0 at this point, then the malloc * subsystem could not be initialized. */ diff --git a/src/box/sql/malloc.c b/src/box/sql/malloc.c index 85693cd0c..f19b7d027 100644 --- a/src/box/sql/malloc.c +++ b/src/box/sql/malloc.c @@ -61,23 +61,6 @@ sql_sized_malloc(int nByte) return (void *)p; } -/* - * Like free() but works for allocations obtained from sql_sized_malloc() - * or sql_sized_realloc(). - * - * For this low-level routine, we already know that pPrior!=0 since - * cases where pPrior==0 will have been intecepted and dealt with - * by higher-level routines. - */ -static void -sql_sized_free(void *pPrior) -{ - sql_int64 *p = (sql_int64 *) pPrior; - assert(pPrior != 0); - p--; - free(p); -} - /* * Report the allocated size of a prior return from sql_sized_malloc() * or sql_sized_realloc(). @@ -120,66 +103,6 @@ sql_sized_realloc(void *pPrior, int nByte) return (void *)p; } -/* - * An instance of the following object records the location of - * each unused scratch buffer. - */ -typedef struct ScratchFreeslot { - struct ScratchFreeslot *pNext; /* Next unused scratch buffer */ -} ScratchFreeslot; - -/* - * Initialize the memory allocation subsystem. - */ -void -sqlMallocInit(void) -{ - if (sqlGlobalConfig.pScratch && sqlGlobalConfig.szScratch >= 100 - && sqlGlobalConfig.nScratch > 0) { - int i, n, sz; - ScratchFreeslot *pSlot; - sz = ROUNDDOWN8(sqlGlobalConfig.szScratch); - sqlGlobalConfig.szScratch = sz; - pSlot = (ScratchFreeslot *) sqlGlobalConfig.pScratch; - n = sqlGlobalConfig.nScratch; - for (i = 0; i < n - 1; i++) { - pSlot->pNext = (ScratchFreeslot *) (sz + (char *)pSlot); - pSlot = pSlot->pNext; - } - pSlot->pNext = 0; - } else { - sqlGlobalConfig.pScratch = 0; - sqlGlobalConfig.szScratch = 0; - sqlGlobalConfig.nScratch = 0; - } - if (sqlGlobalConfig.pPage == 0 || sqlGlobalConfig.szPage < 512 - || sqlGlobalConfig.nPage <= 0) { - sqlGlobalConfig.pPage = 0; - sqlGlobalConfig.szPage = 0; - } -} - -/* - * Do a memory allocation with statistics and alarms. Assume the - * lock is already held. - */ -static int -mallocWithAlarm(int n, void **pp) -{ - int nFull; - void *p; - nFull = ROUND8(n); - sqlStatusHighwater(SQL_STATUS_MALLOC_SIZE, n); - p = sql_sized_malloc(nFull); - if (p) { - nFull = sqlMallocSize(p); - sqlStatusUp(SQL_STATUS_MEMORY_USED, nFull); - sqlStatusUp(SQL_STATUS_MALLOC_COUNT, 1); - } - *pp = p; - return nFull; -} - /* * Allocate memory. This routine is like sql_malloc() except that it * assumes the memory subsystem has already been initialized. @@ -196,8 +119,6 @@ sqlMalloc(u64 n) * this amount. The only way to reach the limit is with sql_malloc() */ p = 0; - } else if (sqlGlobalConfig.bMemstat) { - mallocWithAlarm((int)n, &p); } else { p = sql_sized_malloc((int)n); } @@ -238,25 +159,11 @@ sqlMallocSize(void *p) void sql_free(void *p) { - if (p == 0) - return; /* IMP: R-49053-54554 */ - if (sqlGlobalConfig.bMemstat) { - sqlStatusDown(SQL_STATUS_MEMORY_USED, - sqlMallocSize(p)); - sqlStatusDown(SQL_STATUS_MALLOC_COUNT, 1); - sql_sized_free(p); - } else - sql_sized_free(p); -} - -/* - * Add the size of memory allocation "p" to the count in - * *db->pnBytesFreed. - */ -static SQL_NOINLINE void -measureAllocationSize(sql * db, void *p) -{ - *db->pnBytesFreed += sqlMallocSize(p); + if (p == NULL) + return; + sql_int64 *raw_p = (sql_int64 *) p; + raw_p--; + free(raw_p); } /* @@ -266,14 +173,7 @@ measureAllocationSize(sql * db, void *p) void sqlDbFree(sql * db, void *p) { - if (p == 0) - return; - if (db) { - if (db->pnBytesFreed) { - measureAllocationSize(db, p); - return; - } - } + (void) db; sql_free(p); } @@ -298,18 +198,10 @@ sqlRealloc(void *pOld, u64 nBytes) } nOld = sqlMallocSize(pOld); nNew = ROUND8((int)nBytes); - if (nOld == nNew) { + if (nOld == nNew) pNew = pOld; - } else if (sqlGlobalConfig.bMemstat) { - sqlStatusHighwater(SQL_STATUS_MALLOC_SIZE, (int)nBytes); + else pNew = sql_sized_realloc(pOld, nNew); - if (pNew) { - nNew = sqlMallocSize(pNew); - sqlStatusUp(SQL_STATUS_MEMORY_USED, nNew - nOld); - } - } else { - pNew = sql_sized_realloc(pOld, nNew); - } assert(EIGHT_BYTE_ALIGNMENT(pNew)); /* IMP: R-11148-40995 */ return pNew; } @@ -382,7 +274,7 @@ sqlDbMallocRaw(sql * db, u64 n) void * sqlDbMallocRawNN(sql * db, u64 n) { - assert(db != NULL && db->pnBytesFreed == NULL); + assert(db != NULL); if (db->mallocFailed) return NULL; void *p = sqlMalloc(n); diff --git a/src/box/sql/sqlInt.h b/src/box/sql/sqlInt.h index fd0241440..21dd69b29 100644 --- a/src/box/sql/sqlInt.h +++ b/src/box/sql/sqlInt.h @@ -176,15 +176,6 @@ #define SQL_POWERSAFE_OVERWRITE 1 #endif -/* - * EVIDENCE-OF: R-25715-37072 Memory allocation statistics are enabled by - * default unless sql is compiled with sql_DEFAULT_MEMSTATUS=0 in - * which case memory allocation statistics are disabled by default. - */ -#if !defined(SQL_DEFAULT_MEMSTATUS) -#define SQL_DEFAULT_MEMSTATUS 1 -#endif - #if defined(SQL_SYSTEM_MALLOC) \ + defined(SQL_ZERO_MALLOC) > 1 #error "Two or more of the following compile-time configuration options\ @@ -598,7 +589,6 @@ sql_column_datatype(sql_stmt *, int N); int sql_initialize(void); -#define SQL_CONFIG_SCRATCH 6 /* void*, int sz, int N */ #define SQL_CONFIG_MEMSTATUS 9 /* boolean */ #define SQL_CONFIG_LOG 16 /* xFunc, void* */ #define SQL_CONFIG_URI 17 /* int */ @@ -619,17 +609,6 @@ sql_initialize(void); #define SQL_DETERMINISTIC 0x800 -#define SQL_STATUS_MEMORY_USED 0 -#define SQL_STATUS_PAGECACHE_USED 1 -#define SQL_STATUS_PAGECACHE_OVERFLOW 2 -#define SQL_STATUS_SCRATCH_USED 3 -#define SQL_STATUS_SCRATCH_OVERFLOW 4 -#define SQL_STATUS_MALLOC_SIZE 5 -#define SQL_STATUS_PARSER_STACK 6 -#define SQL_STATUS_PAGECACHE_SIZE 7 -#define SQL_STATUS_SCRATCH_SIZE 8 -#define SQL_STATUS_MALLOC_COUNT 9 - int sql_create_function_v2(sql * db, const char *zFunctionName, @@ -677,7 +656,6 @@ sql_vfs_find(const char *zVfsName); #define SQL_TESTCTRL_RESERVE 14 #define SQL_TESTCTRL_OPTIMIZATIONS 15 #define SQL_TESTCTRL_ISKEYWORD 16 -#define SQL_TESTCTRL_SCRATCHMALLOC 17 #define SQL_TESTCTRL_LOCALTIME_FAULT 18 #define SQL_TESTCTRL_EXPLAIN_STMT 19 /* NOT USED */ #define SQL_TESTCTRL_ONCE_RESET_THRESHOLD 19 @@ -902,16 +880,6 @@ sql_bind_parameter_lindex(sql_stmt * pStmt, const char *zName, #define SQL_DEFAULT_COMPOUND_SELECT 30 #endif -/* - * The default initial allocation for the pagecache when using separate - * pagecaches for each database connection. A positive number is the - * number of pages. A negative number N translations means that a buffer - * of -1024*N bytes is allocated and used for as many pages as it will hold. - */ -#ifndef SQL_DEFAULT_PCACHE_INITSZ -#define SQL_DEFAULT_PCACHE_INITSZ 100 -#endif - /* * GCC does not define the offsetof() macro so we'll have to do it * ourselves. @@ -1319,7 +1287,6 @@ struct sql { void (*xUpdateCallback) (void *, int, const char *, const char *, sql_int64); Hash aFunc; /* Hash table of connection functions */ - int *pnBytesFreed; /* If not NULL, increment this in DbFree() */ }; /* @@ -2716,32 +2683,14 @@ struct StrAccum { * This structure also contains some state information. */ struct sqlConfig { - int bMemstat; /* True to enable memory status */ - int bOpenUri; /* True to interpret filenames as URIs */ - int bUseCis; /* Use covering indices for full-scans */ - int mxStrlen; /* Maximum string length */ - int neverCorrupt; /* Database is always well-formed */ - int nStmtSpill; /* Stmt-journal spill-to-disk threshold */ - void *pHeap; /* Heap storage space */ - int nHeap; /* Size of pHeap[] */ - int mnReq, mxReq; /* Min and max heap requests sizes */ sql_int64 szMmap; /* mmap() space per open file */ sql_int64 mxMmap; /* Maximum value for szMmap */ - void *pScratch; /* Scratch memory */ - int szScratch; /* Size of each scratch buffer */ - int nScratch; /* Number of scratch buffers */ - void *pPage; /* Page cache memory */ - int szPage; /* Size of each page in pPage[] */ - int nPage; /* Number of pages in pPage[] */ - int mxParserStack; /* maximum depth of the parser stack */ - int sharedCacheEnabled; /* true if shared-cache mode enabled */ u32 szPma; /* Maximum Sorter PMA size */ /* The above might be initialized to non-zero. The following need to always * initially be zero, however. */ int isInit; /* True after initialization has finished */ int inProgress; /* True while initialization in progress */ - int isMallocInit; /* True after malloc is initialized */ #ifdef SQL_VDBE_COVERAGE /* The following callback (if not NULL) is invoked on every VDBE branch * operation. Set the callback using sql_TESTCTRL_VDBE_COVERAGE. @@ -2749,7 +2698,6 @@ struct sqlConfig { void (*xVdbeBranch) (void *, int iSrcLine, u8 eThis, u8 eMx); /* Callback */ void *pVdbeBranchArg; /* 1st argument */ #endif - int bLocaltimeFault; /* True to fail localtime() calls */ int iOnceResetThreshold; /* When to reset OP_Once counters */ }; @@ -2848,7 +2796,6 @@ int sqlStrICmp(const char *, const char *); unsigned sqlStrlen30(const char *); #define sqlStrNICmp sql_strnicmp -void sqlMallocInit(void); void *sqlMalloc(u64); void *sqlMallocZero(u64); void *sqlDbMallocZero(sql *, u64); @@ -2886,10 +2833,6 @@ void sqlBenignMallocHooks(void (*)(void), void (*)(void)); #define sqlStackFree(D,P) sqlDbFree(D,P) #endif -void sqlStatusUp(int, int); -void sqlStatusDown(int, int); -void sqlStatusHighwater(int, int); - int sqlIsNaN(double); /* diff --git a/src/box/sql/status.c b/src/box/sql/status.c deleted file mode 100644 index 9e56836c1..000000000 --- a/src/box/sql/status.c +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright 2010-2017, Tarantool AUTHORS, please see AUTHORS file. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * 1. Redistributions of source code must retain the above - * copyright notice, this list of conditions and the - * following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL - * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF - * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * - * This module implements the sql_status() interface and related - * functionality. - */ -#include "sqlInt.h" -#include "vdbeInt.h" -/* - * Variables in which to record status information. - */ -#if SQL_PTRSIZE>4 -typedef sql_int64 sqlStatValueType; -#else -typedef u32 sqlStatValueType; -#endif -typedef struct sqlStatType sqlStatType; -static SQL_WSD struct sqlStatType { - sqlStatValueType nowValue[10]; /* Current value */ - sqlStatValueType mxValue[10]; /* Maximum value */ -} sqlStat = { { -0,}, { -0,}}; - - -/* The "wsdStat" macro will resolve to the status information - * state vector. In the common case where writable static data is - * supported, wsdStat can refer directly to the "sqlStat" state - * vector declared above. - */ -#define wsdStatInit -#define wsdStat sqlStat - -/* - * Add N to the value of a status record. - * - * The StatusUp() routine can accept positive or negative values for N. - * The value of N is added to the current status value and the high-water - * mark is adjusted if necessary. - * - * The StatusDown() routine lowers the current value by N. The highwater - * mark is unchanged. N must be non-negative for StatusDown(). - */ -void -sqlStatusUp(int op, int N) -{ - wsdStatInit; - assert(op >= 0 && op < ArraySize(wsdStat.nowValue)); - - wsdStat.nowValue[op] += N; - if (wsdStat.nowValue[op] > wsdStat.mxValue[op]) { - wsdStat.mxValue[op] = wsdStat.nowValue[op]; - } -} - -void -sqlStatusDown(int op, int N) -{ - wsdStatInit; - assert(N >= 0); - - assert(op >= 0 && op < ArraySize(wsdStat.nowValue)); - wsdStat.nowValue[op] -= N; -} - -/* - * Adjust the highwater mark if necessary. - */ -void -sqlStatusHighwater(int op, int X) -{ - sqlStatValueType newValue; - wsdStatInit; - assert(X >= 0); - newValue = (sqlStatValueType) X; - assert(op >= 0 && op < ArraySize(wsdStat.nowValue)); - - assert(op == SQL_STATUS_MALLOC_SIZE - || op == SQL_STATUS_PAGECACHE_SIZE - || op == SQL_STATUS_SCRATCH_SIZE - || op == SQL_STATUS_PARSER_STACK); - if (newValue > wsdStat.mxValue[op]) { - wsdStat.mxValue[op] = newValue; - } -} diff --git a/src/box/sql/tokenize.c b/src/box/sql/tokenize.c index 32e4fd6d2..9fa069d09 100644 --- a/src/box/sql/tokenize.c +++ b/src/box/sql/tokenize.c @@ -430,7 +430,7 @@ sql_token(const char *z, int *type, bool *is_reserved) static void parser_space_delete(struct sql *db, struct space *space) { - if (space == NULL || db == NULL || db->pnBytesFreed == 0) + if (space == NULL || db == NULL) return; assert(space->def->opts.is_ephemeral); for (uint32_t i = 0; i < space->index_count; ++i) diff --git a/src/box/sql/vdbeaux.c b/src/box/sql/vdbeaux.c index 677860350..64bd7c94b 100644 --- a/src/box/sql/vdbeaux.c +++ b/src/box/sql/vdbeaux.c @@ -695,17 +695,6 @@ freeEphemeralFunction(sql * db, FuncDef * pDef) static void vdbeFreeOpArray(sql *, Op *, int); -/* - * Delete a P4 value if necessary. - */ -static SQL_NOINLINE void -freeP4Mem(sql * db, Mem * p) -{ - if (p->szMalloc) - sqlDbFree(db, p->zMalloc); - sqlDbFree(db, p); -} - static SQL_NOINLINE void freeP4FuncCtx(sql * db, sql_context * p) { @@ -736,14 +725,9 @@ freeP4(sql * db, int p4type, void *p4) freeEphemeralFunction(db, (FuncDef *) p4); break; } - case P4_MEM:{ - if (db->pnBytesFreed == 0) { - sqlValueFree((sql_value *) p4); - } else { - freeP4Mem(db, (Mem *) p4); - } - break; - } + case P4_MEM: + sqlValueFree((sql_value *) p4); + break; } } @@ -1336,13 +1320,6 @@ releaseMemArray(Mem * p, int N) if (p && N) { Mem *pEnd = &p[N]; sql *db = p->db; - if (db->pnBytesFreed) { - do { - if (p->szMalloc) - sqlDbFree(db, p->zMalloc); - } while ((++p) < pEnd); - return; - } do { assert((&p[1]) == pEnd || p[0].db == p[1].db); assert(sqlVdbeCheckMemInvariants(p)); diff --git a/src/box/sql/vdbesort.c b/src/box/sql/vdbesort.c index ac1c02ece..6fcaafb85 100644 --- a/src/box/sql/vdbesort.c +++ b/src/box/sql/vdbesort.c @@ -899,19 +899,11 @@ sqlVdbeSorterInit(sql * db, /* Database connection (for malloc()) */ mxCache = MIN(mxCache, SQL_MAX_PMASZ); pSorter->mxPmaSize = MAX(pSorter->mnPmaSize, (int)mxCache); - - /* EVIDENCE-OF: R-26747-61719 When the application provides any amount of - * scratch memory using SQL_CONFIG_SCRATCH, sql avoids unnecessary - * large heap allocations. - */ - if (sqlGlobalConfig.pScratch == 0) { - assert(pSorter->iMemory == 0); - pSorter->nMemory = pgsz; - pSorter->list.aMemory = - (u8 *) sqlMalloc(pgsz); - if (!pSorter->list.aMemory) - rc = -1; - } + assert(pSorter->iMemory == 0); + pSorter->nMemory = pgsz; + pSorter->list.aMemory = (u8 *) sqlMalloc(pgsz); + if (!pSorter->list.aMemory) + rc = -1; } if (pCsr->key_def->part_count < 13