Tarantool development patches archive
 help / color / mirror / Atom feed
From: Kirill Shcherbatov <kshcherbatov@tarantool.org>
To: tarantool-patches@freelists.org,
	Vladislav Shpilevoy <v.shpilevoy@tarantool.org>
Subject: [tarantool-patches] Re: [PATCH v1 3/4] sql: got rid of redundant MASKBIT32 definition
Date: Wed, 20 Feb 2019 16:42:59 +0300	[thread overview]
Message-ID: <e02b568d-206d-d15b-969d-d52c99176571@tarantool.org> (raw)
In-Reply-To: <82b74351-95c9-9ad3-7371-4c796eac1a58@tarantool.org>

> Thanks for the patch! See 4 comments below.
> 
> 1. We do not use the past in commit titles. Please, use 'get',
> not 'got'. In the next commit too.
Ok, done.

> 2. In the previous commit you said, that 32bit mask is already
> replaced with 64bit one where possible. But why was not it
> possible to replace this one?
The answer is in previous commit description:
"
The 32b bitmasks are still used to specify constant OP_Function
arguments because this change would require changing the P1 type
of the VDBE p1 argument, which is not desirable. Moreover, the
64 function's arguments is an explicit overkill.
"

>>   			for (i = 0; i < nFarg; i++) {
>> -				if (i < 32
>> -				    && sqlite3ExprIsConstant(pFarg->a[i].
>> -							     pExpr)) {
>> -					testcase(i == 31);
>> -					constMask |= MASKBIT32(i);
>> +				if (i < 32 &&
> 
> 3. Why 32? The column mask is smart, it has no size restrictions.
All function arguments that are not able to fit in mask to be marked as constant,
assumed to by dynamic. There is nice commit before sqlVdbeDeleteAuxData
routine definition. i < 32 must be kept to avoid calculation sqlite3ExprIsConstant
where unnecessary.
In fact such 32bit column mask is not smart, but it is not matter. Smart mask
also works fine in this scenario.

> 
>> +				    sqlite3ExprIsConstant(pFarg->a[i].pExpr)) {
>> +					column_mask_set_fieldno((uint64_t *)
>> +								&const_mask, i);
> 
> 4. column_mask_set_fieldo does *mask = ... . It means, that it rewrites 8 bytes
> from the specified address. But you passed a value of only 4 bytes, so the next
> 4 bytes of foreign memory are polluted.
You are right. It is not problem anymore.

=============================================

MASK BIT 32 macro is now redundant, so we got rid of it.
Also refactored related code to use core bitmasks helpers

Part of #3571
---
 src/box/sql/expr.c    | 24 +++++++++++++-----------
 src/box/sql/sqlInt.h  |  1 -
 src/box/sql/vdbeaux.c |  8 +++-----
 3 files changed, 16 insertions(+), 17 deletions(-)

diff --git a/src/box/sql/expr.c b/src/box/sql/expr.c
index 35145cef6..a72f986c6 100644
--- a/src/box/sql/expr.c
+++ b/src/box/sql/expr.c
@@ -3914,7 +3914,11 @@ sqlExprCodeTarget(Parse * pParse, Expr * pExpr, int target)
 			int nFarg;	/* Number of function arguments */
 			FuncDef *pDef;	/* The function definition object */
 			const char *zId;	/* The function name */
-			u32 constMask = 0;	/* Mask of function arguments that are constant */
+			/*
+			 * Mask of function arguments that are
+			 * constant.
+			 */
+			uint32_t const_mask = 0;
 			int i;	/* Loop counter */
 			sql *db = pParse->db;	/* The database connection */
 			struct coll *coll = NULL;
@@ -3988,11 +3992,10 @@ sqlExprCodeTarget(Parse * pParse, Expr * pExpr, int target)
 			}
 
 			for (i = 0; i < nFarg; i++) {
-				if (i < 32
-				    && sqlExprIsConstant(pFarg->a[i].
-							     pExpr)) {
-					testcase(i == 31);
-					constMask |= MASKBIT32(i);
+				if (i < 32 &&
+				    sqlExprIsConstant(pFarg->a[i].pExpr)) {
+					column_mask32_set_fieldno(&const_mask,
+								  i);
 				}
 				if ((pDef->funcFlags & SQL_FUNC_NEEDCOLL) !=
 				    0 && coll == NULL) {
@@ -4004,7 +4007,7 @@ sqlExprCodeTarget(Parse * pParse, Expr * pExpr, int target)
 				}
 			}
 			if (pFarg) {
-				if (constMask) {
+				if (const_mask != 0) {
 					r1 = pParse->nMem + 1;
 					pParse->nMem += nFarg;
 				} else {
@@ -4052,12 +4055,11 @@ sqlExprCodeTarget(Parse * pParse, Expr * pExpr, int target)
 				sqlVdbeAddOp4(v, OP_CollSeq, 0, 0, 0,
 						  (char *)coll, P4_COLLSEQ);
 			}
-			sqlVdbeAddOp4(v, OP_Function0, constMask, r1,
-					  target, (char *)pDef, P4_FUNCDEF);
+			sqlVdbeAddOp4(v, OP_Function0, const_mask, r1, target,
+				      (char *)pDef, P4_FUNCDEF);
 			sqlVdbeChangeP5(v, (u8) nFarg);
-			if (nFarg && constMask == 0) {
+			if (nFarg && const_mask == 0)
 				sqlReleaseTempRange(pParse, r1, nFarg);
-			}
 			return target;
 		}
 	case TK_EXISTS:
diff --git a/src/box/sql/sqlInt.h b/src/box/sql/sqlInt.h
index 5be695e51..a9b7dfa4e 100644
--- a/src/box/sql/sqlInt.h
+++ b/src/box/sql/sqlInt.h
@@ -2255,7 +2255,6 @@ typedef u64 Bitmask;
  * A bit in a Bitmask
  */
 #define MASKBIT(n)   (((Bitmask)1)<<(n))
-#define MASKBIT32(n) (((unsigned int)1)<<(n))
 #define ALLBITS      ((Bitmask)-1)
 
 /*
diff --git a/src/box/sql/vdbeaux.c b/src/box/sql/vdbeaux.c
index b831b52ad..fedbc0a15 100644
--- a/src/box/sql/vdbeaux.c
+++ b/src/box/sql/vdbeaux.c
@@ -2698,11 +2698,9 @@ 	(sql * db, AuxData ** pp, int iOp, int mask)
 {
 	while (*pp) {
 		AuxData *pAux = *pp;
-		if ((iOp < 0)
-		    || (pAux->iOp == iOp
-			&& (pAux->iArg > 31 || !(mask & MASKBIT32(pAux->iArg))))
-		    ) {
-			testcase(pAux->iArg == 31);
+		if (iOp < 0 || (pAux->iOp == iOp &&
+		    (pAux->iArg >= 32 ||
+		     !column_mask32_fieldno_is_set(mask, pAux->iArg)))) {
 			if (pAux->xDelete) {
 				pAux->xDelete(pAux->pAux);
 			}
-- 
2.20.1

  reply	other threads:[~2019-02-20 13:43 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-02-08 12:52 [tarantool-patches] [PATCH v1 0/4] sql: replace 32 bit column mask Kirill Shcherbatov
2019-02-08 12:52 ` [tarantool-patches] [PATCH v1 1/4] box: introduce new helpers in column_mask.h Kirill Shcherbatov
2019-02-15 17:05   ` [tarantool-patches] " Vladislav Shpilevoy
2019-02-20 13:42     ` Kirill Shcherbatov
2019-02-22 17:51       ` Vladislav Shpilevoy
2019-02-22 18:01   ` Konstantin Osipov
2019-02-22 18:22     ` Konstantin Osipov
2019-02-08 12:52 ` [tarantool-patches] [PATCH v1 2/4] sql: use 64b bitmasks instead of 32b where possible Kirill Shcherbatov
2019-02-15 17:05   ` [tarantool-patches] " Vladislav Shpilevoy
2019-02-20 13:42     ` Kirill Shcherbatov
2019-02-08 12:52 ` [tarantool-patches] [PATCH v1 3/4] sql: got rid of redundant MASKBIT32 definition Kirill Shcherbatov
2019-02-15 17:05   ` [tarantool-patches] " Vladislav Shpilevoy
2019-02-20 13:42     ` Kirill Shcherbatov [this message]
2019-02-08 12:52 ` [tarantool-patches] [PATCH v1 4/4] sql: got rid of redundant bitmask helpers Kirill Shcherbatov
2019-02-15 17:05   ` [tarantool-patches] " Vladislav Shpilevoy
2019-02-20 13:42     ` Kirill Shcherbatov
2019-02-22 17:52       ` Vladislav Shpilevoy

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=e02b568d-206d-d15b-969d-d52c99176571@tarantool.org \
    --to=kshcherbatov@tarantool.org \
    --cc=tarantool-patches@freelists.org \
    --cc=v.shpilevoy@tarantool.org \
    --subject='[tarantool-patches] Re: [PATCH v1 3/4] sql: got rid of redundant MASKBIT32 definition' \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox