Tarantool development patches archive
 help / color / mirror / Atom feed
From: Nikita Pettik <korablev@tarantool.org>
To: tarantool-patches@freelists.org
Cc: v.shpilevoy@tarantool.org, Nikita Pettik <korablev@tarantool.org>
Subject: [tarantool-patches] [PATCH 05/10] sql: remove affinity string of columns from Index
Date: Sun, 12 Aug 2018 17:13:01 +0300	[thread overview]
Message-ID: <026cd8e04034ad26529a2b8e76e1ae9aabf9076f.1534001739.git.korablev@tarantool.org> (raw)
In-Reply-To: <cover.1534001739.git.korablev@tarantool.org>
In-Reply-To: <cover.1534001739.git.korablev@tarantool.org>

Part of #3561
---
 src/box/sql/build.c     |  1 -
 src/box/sql/delete.c    |  3 ++-
 src/box/sql/insert.c    | 42 +++++++++++-------------------------------
 src/box/sql/sqliteInt.h | 16 +++++++++++-----
 src/box/sql/update.c    |  2 +-
 src/box/sql/vdbemem.c   |  3 +--
 src/box/sql/where.c     | 21 ++++++++-------------
 src/box/sql/wherecode.c |  3 ++-
 8 files changed, 36 insertions(+), 55 deletions(-)

diff --git a/src/box/sql/build.c b/src/box/sql/build.c
index 31b91a4e2..ead3e4f19 100644
--- a/src/box/sql/build.c
+++ b/src/box/sql/build.c
@@ -213,7 +213,6 @@ freeIndex(sqlite3 * db, Index * p)
 	sql_expr_delete(db, p->pPartIdxWhere, false);
 	if (p->def != NULL)
 		index_def_delete(p->def);
-	sqlite3DbFree(db, p->zColAff);
 	sqlite3DbFree(db, p);
 }
 
diff --git a/src/box/sql/delete.c b/src/box/sql/delete.c
index 0be68830a..cb16a7c0d 100644
--- a/src/box/sql/delete.c
+++ b/src/box/sql/delete.c
@@ -352,7 +352,8 @@ sql_table_delete_from(struct Parse *parse, struct SrcList *tab_list,
 			key_len = 0;
 			struct Index *pk = sqlite3PrimaryKeyIndex(table);
 			const char *zAff = is_view ? NULL :
-					  sqlite3IndexAffinityStr(parse->db, pk);
+					  sql_index_affinity_str(parse->db,
+								 pk->def);
 			sqlite3VdbeAddOp4(v, OP_MakeRecord, reg_pk, pk_len,
 					  reg_key, zAff, pk_len);
 			/* Set flag to save memory allocating one
diff --git a/src/box/sql/insert.c b/src/box/sql/insert.c
index ddd7f932b..2b6100ad5 100644
--- a/src/box/sql/insert.c
+++ b/src/box/sql/insert.c
@@ -75,34 +75,6 @@ sqlite3OpenTable(Parse * pParse,	/* Generate code into this VDBE */
  * is managed along with the rest of the Index structure. It will be
  * released when sqlite3DeleteIndex() is called.
  */
-const char *
-sqlite3IndexAffinityStr(sqlite3 *db, Index *index)
-{
-	if (index->zColAff != NULL)
-		return index->zColAff;
-	/*
-	 * The first time a column affinity string for a
-	 * particular index is required, it is allocated and
-	 * populated here. It is then stored as a member of the
-	 * Index structure for subsequent use. The column affinity
-	 * string will eventually be deleted by
-	 * sqliteDeleteIndex() when the Index structure itself is
-	 * cleaned up.
-	 */
-	int column_count = index->def->key_def->part_count;
-	index->zColAff = (char *) sqlite3DbMallocRaw(0, column_count + 1);
-	if (index->zColAff == NULL) {
-		sqlite3OomFault(db);
-		return NULL;
-	}
-	for (int n = 0; n < column_count; n++) {
-		uint16_t x = index->def->key_def->parts[n].fieldno;
-		index->zColAff[n] = index->pTable->def->fields[x].affinity;
-	}
-	index->zColAff[column_count] = 0;
-	return index->zColAff;
-}
-
 char *
 sql_index_affinity_str(struct sqlite3 *db, struct index_def *def)
 {
@@ -112,15 +84,23 @@ sql_index_affinity_str(struct sqlite3 *db, struct index_def *def)
 		return NULL;
 	struct space *space = space_by_id(def->space_id);
 	assert(space != NULL);
-
+	/*
+	 * Table may occasionally come from Lua, so lets
+	 * gentle process this case by setting default
+	 * affinity for it.
+	 */
+	if (space->def->fields == NULL) {
+		memset(aff, AFFINITY_BLOB, column_count);
+		goto exit;
+	}
 	for (uint32_t i = 0; i < column_count; i++) {
 		uint32_t x = def->key_def->parts[i].fieldno;
 		aff[i] = space->def->fields[x].affinity;
 		if (aff[i] == AFFINITY_UNDEFINED)
-			aff[i] = 'A';
+			aff[i] = AFFINITY_BLOB;
 	}
+exit:
 	aff[column_count] = '\0';
-
 	return aff;
 }
 
diff --git a/src/box/sql/sqliteInt.h b/src/box/sql/sqliteInt.h
index e13e6ad34..c9c4965f9 100644
--- a/src/box/sql/sqliteInt.h
+++ b/src/box/sql/sqliteInt.h
@@ -2007,8 +2007,6 @@ enum sql_index_type {
 struct Index {
 	/** The SQL table being indexed. */
 	Table *pTable;
-	/** String defining the affinity of each column. */
-	char *zColAff;
 	/** The next index associated with the same table. */
 	Index *pNext;
 	/** WHERE clause for partial indices. */
@@ -4281,8 +4279,6 @@ int sqlite3VarintLen(u64 v);
 #define getVarint    sqlite3GetVarint
 #define putVarint    sqlite3PutVarint
 
-const char *sqlite3IndexAffinityStr(sqlite3 *, Index *);
-
 /**
  * Return a pointer to the column affinity string associated with
  * given index. A column affinity string has one character for
@@ -4611,7 +4607,17 @@ void sqlite3Stat4ProbeFree(UnpackedRecord *);
 int
 sql_stat4_column(struct sqlite3 *db, const char *record, uint32_t col_num,
 		 sqlite3_value **res);
-char sqlite3IndexColumnAffinity(sqlite3 *, Index *, int);
+
+/**
+ * Return the affinity for a single column of an index.
+ *
+ * @param idx Index to be investigated.
+ * @param partno Affinity of this part to be returned.
+ *
+ * @retval Affinity of @partno index part.
+ */
+enum affinity_type
+sql_index_part_affinity(struct index_def *idx, uint32_t partno);
 
 /*
  * The interface to the LEMON-generated parser
diff --git a/src/box/sql/update.c b/src/box/sql/update.c
index e2324c354..decd216c6 100644
--- a/src/box/sql/update.c
+++ b/src/box/sql/update.c
@@ -347,7 +347,7 @@ sqlite3Update(Parse * pParse,		/* The parser context */
 		regKey = iPk;
 	} else {
 		const char *zAff = is_view ? 0 :
-				   sqlite3IndexAffinityStr(pParse->db, pPk);
+				   sql_index_affinity_str(pParse->db, pPk->def);
 		sqlite3VdbeAddOp4(v, OP_MakeRecord, iPk, pk_part_count,
 				  regKey, zAff, pk_part_count);
 		sqlite3VdbeAddOp2(v, OP_IdxInsert, iEph, regKey);
diff --git a/src/box/sql/vdbemem.c b/src/box/sql/vdbemem.c
index ec2d8cb6b..64902b133 100644
--- a/src/box/sql/vdbemem.c
+++ b/src/box/sql/vdbemem.c
@@ -1553,8 +1553,7 @@ sqlite3Stat4ProbeSetValue(Parse * pParse,	/* Parse context */
 			Expr *pElem =
 			    (pExpr ? sqlite3VectorFieldSubexpr(pExpr, i) : 0);
 			u8 aff =
-			    sqlite3IndexColumnAffinity(pParse->db, pIdx,
-						       iVal + i);
+				sql_index_part_affinity(pIdx->def, iVal + i);
 			alloc.iVal = iVal + i;
 			rc = stat4ValueFromExpr(pParse, pElem, aff, &alloc,
 						&pVal);
diff --git a/src/box/sql/where.c b/src/box/sql/where.c
index db8d0bf80..794db0302 100644
--- a/src/box/sql/where.c
+++ b/src/box/sql/where.c
@@ -1158,18 +1158,14 @@ whereRangeAdjust(WhereTerm * pTerm, LogEst nNew)
 	return nRet;
 }
 
-/*
- * Return the affinity for a single column of an index.
- */
-char
-sqlite3IndexColumnAffinity(sqlite3 * db, Index * pIdx, int iCol)
+enum affinity_type
+sql_index_part_affinity(struct index_def *idx, uint32_t partno)
 {
-	assert(iCol >= 0 && iCol < (int) pIdx->def->key_def->part_count);
-	if (!pIdx->zColAff) {
-		if (sqlite3IndexAffinityStr(db, pIdx) == 0)
-			return AFFINITY_BLOB;
-	}
-	return pIdx->zColAff[iCol];
+	assert(partno < idx->key_def->part_count);
+	struct space *space = space_by_id(idx->space_id);
+	assert(space != NULL);
+	uint32_t fieldno = idx->key_def->parts[partno].fieldno;
+	return space->def->fields[fieldno].affinity;
 }
 
 /*
@@ -1224,7 +1220,7 @@ whereRangeSkipScanEst(Parse * pParse,		/* Parsing & code generating context */
 	int nLower = -1;
 	int nUpper = index->def->opts.stat->sample_count + 1;
 	int rc = SQLITE_OK;
-	u8 aff = sqlite3IndexColumnAffinity(db, p, nEq);
+	u8 aff = sql_index_part_affinity(p->def, nEq);
 
 	sqlite3_value *p1 = 0;	/* Value extracted from pLower */
 	sqlite3_value *p2 = 0;	/* Value extracted from pUpper */
@@ -1774,7 +1770,6 @@ whereLoopClearUnion(sqlite3 * db, WhereLoop * p)
 {
 	if ((p->wsFlags & WHERE_AUTO_INDEX) != 0 &&
 	    (p->wsFlags & WHERE_AUTO_INDEX) != 0 && p->pIndex != 0) {
-		sqlite3DbFree(db, p->pIndex->zColAff);
 		sqlite3DbFree(db, p->pIndex);
 		p->pIndex = 0;
 	}
diff --git a/src/box/sql/wherecode.c b/src/box/sql/wherecode.c
index 1976583fa..6b3f2f78a 100644
--- a/src/box/sql/wherecode.c
+++ b/src/box/sql/wherecode.c
@@ -725,7 +725,8 @@ codeAllEqualityTerms(Parse * pParse,	/* Parsing context */
 	char *zAff;
 	if (pIdx != NULL) {
 		zAff = sqlite3DbStrDup(pParse->db,
-				       sqlite3IndexAffinityStr(pParse->db, pIdx));
+				       sql_index_affinity_str(pParse->db,
+							      pIdx->def));
 	} else {
 		zAff = sql_index_affinity_str(pParse->db, idx_def);
 	}
-- 
2.15.1

  parent reply	other threads:[~2018-08-12 14:13 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-08-12 14:12 [tarantool-patches] [PATCH 00/10] sql: cleanup in struct Index and struct Table Nikita Pettik
2018-08-12 14:12 ` [tarantool-patches] [PATCH 01/10] sql: remove suport of ALTER TABLE ADD COLUMN Nikita Pettik
2018-08-13 20:24   ` [tarantool-patches] " Vladislav Shpilevoy
2018-08-12 14:12 ` [tarantool-patches] [PATCH 02/10] sql: remove string of fields collation from Table Nikita Pettik
2018-08-13 20:24   ` [tarantool-patches] " Vladislav Shpilevoy
2018-08-12 14:12 ` [tarantool-patches] [PATCH 03/10] sql: remove index hash from struct Table Nikita Pettik
2018-08-13 20:24   ` [tarantool-patches] " Vladislav Shpilevoy
2018-08-12 14:13 ` [tarantool-patches] [PATCH 04/10] sql: remove flags " Nikita Pettik
2018-08-13 20:24   ` [tarantool-patches] " Vladislav Shpilevoy
2018-08-12 14:13 ` Nikita Pettik [this message]
2018-08-13 20:24   ` [tarantool-patches] Re: [PATCH 05/10] sql: remove affinity string of columns from Index Vladislav Shpilevoy
2018-08-21 16:31     ` n.pettik
2018-08-24 21:04       ` Vladislav Shpilevoy
2018-08-26 19:45         ` n.pettik
2018-08-12 14:13 ` [tarantool-patches] [PATCH 06/10] sql: completely remove support of partial indexes Nikita Pettik
2018-08-13 20:24   ` [tarantool-patches] " Vladislav Shpilevoy
2018-08-21 16:31     ` n.pettik
2018-08-24 21:04       ` Vladislav Shpilevoy
2018-08-26 19:44         ` n.pettik
2018-08-12 14:13 ` [tarantool-patches] [PATCH 07/10] sql: remove index type from struct Index Nikita Pettik
2018-08-13 20:24   ` [tarantool-patches] " Vladislav Shpilevoy
2018-08-21 16:31     ` n.pettik
2018-08-12 14:13 ` [tarantool-patches] [PATCH 08/10] sql: use secondary indexes to process OP_Delete Nikita Pettik
2018-08-13 20:24   ` [tarantool-patches] " Vladislav Shpilevoy
2018-08-12 14:13 ` [tarantool-patches] [PATCH 09/10] sql: disable ON CONFLICT actions for indexes Nikita Pettik
2018-08-13 20:24   ` [tarantool-patches] " Vladislav Shpilevoy
2018-08-21 16:31     ` n.pettik
2018-08-24 21:04       ` Vladislav Shpilevoy
2018-08-26 19:44         ` n.pettik
2018-08-27 17:24           ` Vladislav Shpilevoy
2018-08-12 14:13 ` [tarantool-patches] [PATCH 10/10] sql: move autoincrement field number to server Nikita Pettik
2018-08-13 20:24   ` [tarantool-patches] " Vladislav Shpilevoy
2018-08-21 16:31     ` n.pettik
2018-08-24 21:03       ` Vladislav Shpilevoy
2018-08-26 19:44         ` n.pettik
2018-08-27 17:24           ` Vladislav Shpilevoy
2018-08-27 17:24 ` [tarantool-patches] Re: [PATCH 00/10] sql: cleanup in struct Index and struct Table Vladislav Shpilevoy
2018-08-29 14:11 ` Kirill Yukhin

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=026cd8e04034ad26529a2b8e76e1ae9aabf9076f.1534001739.git.korablev@tarantool.org \
    --to=korablev@tarantool.org \
    --cc=tarantool-patches@freelists.org \
    --cc=v.shpilevoy@tarantool.org \
    --subject='Re: [tarantool-patches] [PATCH 05/10] sql: remove affinity string of columns from Index' \
    /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