[tarantool-patches] [PATCH 04/10] sql: remove flags from struct Table
Nikita Pettik
korablev at tarantool.org
Sun Aug 12 17:13:00 MSK 2018
Check on flag TF_HasPrimaryKey replaced with simple PK lookup in the
list of table indexes.
Check on flag TF_Ephemeral replaced with table->def->id == 0.
Check on flag TF_Autoincrement replaced with table->iAutoinc >= 0.
Part of #3561
---
src/box/sql/build.c | 11 ++++-------
src/box/sql/insert.c | 12 ++++--------
src/box/sql/select.c | 4 +---
src/box/sql/sqliteInt.h | 8 --------
src/box/sql/where.c | 3 +--
5 files changed, 10 insertions(+), 28 deletions(-)
diff --git a/src/box/sql/build.c b/src/box/sql/build.c
index 78206a1ed..31b91a4e2 100644
--- a/src/box/sql/build.c
+++ b/src/box/sql/build.c
@@ -883,13 +883,12 @@ sqlite3AddPrimaryKey(Parse * pParse, /* Parsing context */
int nTerm;
if (pTab == 0)
goto primary_key_exit;
- if (pTab->tabFlags & TF_HasPrimaryKey) {
+ if (sqlite3PrimaryKeyIndex(pTab) != NULL) {
sqlite3ErrorMsg(pParse,
"table \"%s\" has more than one primary key",
pTab->def->name);
goto primary_key_exit;
}
- pTab->tabFlags |= TF_HasPrimaryKey;
if (pList == 0) {
iCol = pTab->def->field_count - 1;
nTerm = 1;
@@ -918,10 +917,8 @@ sqlite3AddPrimaryKey(Parse * pParse, /* Parsing context */
pTab->def->fields[iCol].type == FIELD_TYPE_INTEGER &&
sortOrder != SORT_ORDER_DESC) {
assert(autoInc == 0 || autoInc == 1);
- if (autoInc) {
+ if (autoInc)
pTab->iAutoIncPKey = iCol;
- pTab->tabFlags |= TF_Autoincrement;
- }
struct sqlite3 *db = pParse->db;
struct ExprList *list;
struct Token token;
@@ -1698,7 +1695,7 @@ sqlite3EndTable(Parse * pParse, /* Parse context */
}
if (!p->def->opts.is_view) {
- if ((p->tabFlags & TF_HasPrimaryKey) == 0) {
+ if (sqlite3PrimaryKeyIndex(p) == NULL) {
sqlite3ErrorMsg(pParse,
"PRIMARY KEY missing on table %s",
p->def->name);
@@ -1767,7 +1764,7 @@ sqlite3EndTable(Parse * pParse, /* Parse context */
* Check to see if we need to create an _sequence table
* for keeping track of autoincrement keys.
*/
- if ((p->tabFlags & TF_Autoincrement) != 0) {
+ if (p->iAutoIncPKey >= 0) {
assert(reg_space_id != 0);
/* Do an insertion into _sequence. */
int reg_seq_id = ++pParse->nMem;
diff --git a/src/box/sql/insert.c b/src/box/sql/insert.c
index 50c30fd82..ddd7f932b 100644
--- a/src/box/sql/insert.c
+++ b/src/box/sql/insert.c
@@ -714,8 +714,7 @@ sqlite3Insert(Parse * pParse, /* Parser context */
dflt,
iRegStore);
} else if (useTempTable) {
- if ((pTab->tabFlags & TF_Autoincrement)
- && (i == pTab->iAutoIncPKey)) {
+ if (i == pTab->iAutoIncPKey) {
int regTmp = ++pParse->nMem;
/* Emit code which doesn't override
* autoinc-ed value with select result
@@ -734,8 +733,7 @@ sqlite3Insert(Parse * pParse, /* Parser context */
}
} else if (pSelect) {
if (regFromSelect != regData) {
- if ((pTab->tabFlags & TF_Autoincrement)
- && (i == pTab->iAutoIncPKey)) {
+ if (i == pTab->iAutoIncPKey) {
/* Emit code which doesn't override
* autoinc-ed value with select result
* in case that result is NULL
@@ -1022,9 +1020,7 @@ sqlite3GenerateConstraintChecks(Parse * pParse, /* The parser context */
/* Don't bother checking for NOT NULL on columns that do not change */
continue;
}
- if (def->fields[i].is_nullable ||
- (pTab->tabFlags & TF_Autoincrement &&
- pTab->iAutoIncPKey == (int) i))
+ if (def->fields[i].is_nullable || pTab->iAutoIncPKey == (int) i)
continue; /* This column is allowed to be NULL */
on_error = table_column_nullable_action(pTab, i);
@@ -1203,7 +1199,7 @@ sqlite3GenerateConstraintChecks(Parse * pParse, /* The parser context */
if (pTab->def->fields[fieldno].affinity ==
AFFINITY_INTEGER) {
int skip_if_null = sqlite3VdbeMakeLabel(v);
- if ((pTab->tabFlags & TF_Autoincrement) != 0) {
+ if (pTab->iAutoIncPKey >= 0) {
sqlite3VdbeAddOp2(v, OP_IsNull,
reg_pk,
skip_if_null);
diff --git a/src/box/sql/select.c b/src/box/sql/select.c
index 6738ba54f..d22f4e0a9 100644
--- a/src/box/sql/select.c
+++ b/src/box/sql/select.c
@@ -4601,7 +4601,6 @@ withExpand(Walker * pWalker, struct SrcList_item *pFrom)
pTab->tuple_log_count = DEFAULT_TUPLE_LOG_COUNT;
assert(sqlite3LogEst(DEFAULT_TUPLE_COUNT) ==
DEFAULT_TUPLE_LOG_COUNT);
- pTab->tabFlags |= TF_Ephemeral;
pFrom->pSelect = sqlite3SelectDup(db, pCte->pSelect, 0);
if (db->mallocFailed)
return SQLITE_NOMEM_BKPT;
@@ -4803,7 +4802,6 @@ selectExpander(Walker * pWalker, Select * p)
pTab->tuple_log_count = DEFAULT_TUPLE_LOG_COUNT;
assert(sqlite3LogEst(DEFAULT_TUPLE_COUNT) ==
DEFAULT_TUPLE_LOG_COUNT);
- pTab->tabFlags |= TF_Ephemeral;
} else {
/*
* An ordinary table or view name in the
@@ -5157,7 +5155,7 @@ selectAddSubqueryTypeInfo(Walker * pWalker, Select * p)
for (i = 0, pFrom = pTabList->a; i < pTabList->nSrc; i++, pFrom++) {
Table *pTab = pFrom->pTab;
assert(pTab != 0);
- if ((pTab->tabFlags & TF_Ephemeral) != 0) {
+ if (pTab->def->id == 0) {
/* A sub-query in the FROM clause of a SELECT */
Select *pSel = pFrom->pSelect;
if (pSel) {
diff --git a/src/box/sql/sqliteInt.h b/src/box/sql/sqliteInt.h
index 5757efe49..e13e6ad34 100644
--- a/src/box/sql/sqliteInt.h
+++ b/src/box/sql/sqliteInt.h
@@ -1884,7 +1884,6 @@ struct Table {
* can be fetched from space struct.
*/
LogEst tuple_log_count;
- u8 tabFlags; /* Mask of TF_* values */
Schema *pSchema; /* Schema that contains this table */
Table *pNextZombie; /* Next on the Parse.pZombieTab list */
/** Space definition with Tarantool metadata. */
@@ -1901,13 +1900,6 @@ struct Table {
LogEst
sql_space_tuple_log_count(struct Table *tab);
-/*
- * Allowed values for Table.tabFlags.
- */
-#define TF_Ephemeral 0x02 /* An ephemeral table */
-#define TF_HasPrimaryKey 0x04 /* Table has a primary key */
-#define TF_Autoincrement 0x08 /* Integer primary key is autoincrement */
-
/*
* Each foreign key constraint is an instance of the following structure.
*
diff --git a/src/box/sql/where.c b/src/box/sql/where.c
index 117357662..db8d0bf80 100644
--- a/src/box/sql/where.c
+++ b/src/box/sql/where.c
@@ -4673,8 +4673,7 @@ sqlite3WhereBegin(Parse * pParse, /* The parser context */
struct SrcList_item *pTabItem = &pTabList->a[pLevel->iFrom];
Table *pTab = pTabItem->pTab;
pLoop = pLevel->pWLoop;
- if ((pTab->tabFlags & TF_Ephemeral) != 0 ||
- pTab->def->opts.is_view) {
+ if (pTab->def->id == 0 || pTab->def->opts.is_view) {
/* Do nothing */
} else if ((pLoop->wsFlags & WHERE_IDX_ONLY) == 0 &&
(wctrlFlags & WHERE_OR_SUBCLAUSE) == 0) {
--
2.15.1
More information about the Tarantool-patches
mailing list