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
next prev 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