[Tarantool-patches] [PATCH v4 04/53] sql: remove NULL-termination in OP_ResultRow

imeevma at tarantool.org imeevma at tarantool.org
Tue Mar 23 12:34:57 MSK 2021


There is no need for NULL-termination, since MEMs converted to msgpack
and msgpack do not require NULL-terminated strings.

Needed for #5818
---
 src/box/sql/vdbe.c | 19 +++++--------------
 1 file changed, 5 insertions(+), 14 deletions(-)

diff --git a/src/box/sql/vdbe.c b/src/box/sql/vdbe.c
index 4c1cd582b..18806b93f 100644
--- a/src/box/sql/vdbe.c
+++ b/src/box/sql/vdbe.c
@@ -1505,9 +1505,6 @@ case OP_SCopy: {            /* out2 */
  * the result row.
  */
 case OP_ResultRow: {
-	Mem *pMem;
-	int i;
-
 	assert(p->nResColumn==pOp->p2);
 	assert(pOp->p1>0);
 	assert(pOp->p1+pOp->p2<=(p->nMem+1 - p->nCursor)+1);
@@ -1516,20 +1513,14 @@ case OP_ResultRow: {
 	/* Invalidate all ephemeral cursor row caches */
 	p->cacheCtr = (p->cacheCtr + 2)|1;
 
-	/* Make sure the results of the current row are \000 terminated
-	 * and have an assigned type.  The results are de-ephemeralized as
-	 * a side effect.
-	 */
-	pMem = p->pResultSet = &aMem[pOp->p1];
-	for(i=0; i<pOp->p2; i++) {
+	p->pResultSet = &aMem[pOp->p1];
+#ifdef SQL_DEBUG
+	struct Mem *pMem = p->pResultSet;
+	for(int i = 0; i < pOp->p2; i++) {
 		assert(memIsValid(&pMem[i]));
-		Deephemeralize(&pMem[i]);
-		assert((pMem[i].flags & MEM_Ephem)==0
-		       || (pMem[i].flags & (MEM_Str|MEM_Blob))==0);
-		sqlVdbeMemNulTerminate(&pMem[i]);
 		REGISTER_TRACE(p, pOp->p1+i, &pMem[i]);
 	}
-	if (db->mallocFailed) goto no_mem;
+#endif
 
 	if (db->mTrace & SQL_TRACE_ROW) {
 		db->xTrace(SQL_TRACE_ROW, db->pTraceArg, p, 0);
-- 
2.25.1



More information about the Tarantool-patches mailing list