[tarantool-patches] [PATCH 1/2] sql: remove obsolete SQLite routine
Nikita Pettik
korablev at tarantool.org
Tue Apr 3 19:14:56 MSK 2018
Some of legacy functions seem to be useless, since they serve as
wrappers around others; the rest rely on capabilities which are no
longer relevant. This patch provides slight refactoring of such
functions.
Removed entities:
- sqlite3LocateTableItem() - replaced with sqlite3LocateTable();
- sqlite3FindTable() - replaced with sqlite3HashFind();
- sqlite3ColumnOfIndex() - in Tarantool order of columns always the same;
- sqlite3FindIndex() - replaced with sqlite3LocateIndex();
- sqlite3CodeVerifySchema();
- sqlite3SchemaToIndex();
- sqlite3MultiWrite();
- Parse->cookieMast;
- Vdbe->usesStmtJournal;
---
src/box/sql/alter.c | 13 ++-
src/box/sql/analyze.c | 25 +++---
src/box/sql/build.c | 213 ++++++++++--------------------------------------
src/box/sql/delete.c | 5 +-
src/box/sql/expr.c | 9 +-
src/box/sql/fkey.c | 3 +-
src/box/sql/insert.c | 10 +--
src/box/sql/pragma.c | 18 ++--
src/box/sql/prepare.c | 29 -------
src/box/sql/select.c | 4 +-
src/box/sql/sqliteInt.h | 11 +--
src/box/sql/trigger.c | 7 +-
src/box/sql/update.c | 2 +-
src/box/sql/vdbe.c | 1 -
src/box/sql/vdbeInt.h | 1 -
src/box/sql/vdbeaux.c | 1 -
src/box/sql/where.c | 2 -
src/box/sql/wherecode.c | 7 +-
18 files changed, 83 insertions(+), 278 deletions(-)
diff --git a/src/box/sql/alter.c b/src/box/sql/alter.c
index 054c0856c..a19324ed2 100644
--- a/src/box/sql/alter.c
+++ b/src/box/sql/alter.c
@@ -84,10 +84,9 @@ sqlite3AlterRenameTable(Parse * pParse, /* Parser context. */
goto exit_rename_table;
assert(pSrc->nSrc == 1);
- pTab = sqlite3LocateTableItem(pParse, 0, &pSrc->a[0]);
+ pTab = sqlite3LocateTable(pParse, 0, pSrc->a[0].zName);
if (!pTab)
goto exit_rename_table;
- assert(sqlite3SchemaToIndex(pParse->db, pTab->pSchema) == 0);
user_session->sql_flags |= SQLITE_PreferBuiltin;
@@ -99,7 +98,7 @@ sqlite3AlterRenameTable(Parse * pParse, /* Parser context. */
/* Check that a table named 'zName' does not already exist
* in database. If so, this is an error.
*/
- if (sqlite3FindTable(db, zName)) {
+ if (sqlite3HashFind(&db->pSchema->tblHash, zName) != NULL) {
sqlite3ErrorMsg(pParse,
"there is already another table or index with this name: %s",
zName);
@@ -122,7 +121,7 @@ sqlite3AlterRenameTable(Parse * pParse, /* Parser context. */
if (v == 0) {
goto exit_rename_table;
}
- sqlite3BeginWriteOperation(pParse, false);
+ sql_set_multi_write(pParse, false);
/* Drop and reload the internal table schema. */
reloadTableSchema(pParse, pTab, zName);
@@ -163,7 +162,7 @@ sqlite3AlterFinishAddColumn(Parse * pParse, Token * pColDef)
zTab = &pNew->zName[16]; /* Skip the "sqlite_altertab_" prefix on the name */
pCol = &pNew->aCol[pNew->nCol - 1];
pDflt = pCol->pDflt;
- pTab = sqlite3FindTable(db, zTab);
+ pTab = sqlite3HashFind(&db->pSchema->tblHash, zTab);;
assert(pTab);
/* If the default value for the new column was specified with a
@@ -257,7 +256,7 @@ sqlite3AlterBeginAddColumn(Parse * pParse, SrcList * pSrc)
assert(pParse->pNewTable == 0);
if (db->mallocFailed)
goto exit_begin_add_column;
- pTab = sqlite3LocateTableItem(pParse, 0, &pSrc->a[0]);
+ pTab = sqlite3LocateTable(pParse, 0, pSrc->a[0].zName);
if (!pTab)
goto exit_begin_add_column;
@@ -305,7 +304,7 @@ sqlite3AlterBeginAddColumn(Parse * pParse, SrcList * pSrc)
pNew->nTabRef = 1;
/* Begin a transaction and increment the schema cookie. */
- sqlite3BeginWriteOperation(pParse, 0);
+ sql_set_multi_write(pParse, 0);
v = sqlite3GetVdbe(pParse);
if (!v)
goto exit_begin_add_column;
diff --git a/src/box/sql/analyze.c b/src/box/sql/analyze.c
index fb46641a2..25e93aa15 100644
--- a/src/box/sql/analyze.c
+++ b/src/box/sql/analyze.c
@@ -156,7 +156,7 @@ openStatTable(Parse * pParse, /* Parsing context */
const char *zTab = aTable[i];
Table *pStat;
/* The table already exists, because it is a system space */
- pStat = sqlite3FindTable(db, zTab);
+ pStat = sqlite3HashFind(&db->pSchema->tblHash, zTab);
aRoot[i] = pStat->tnum;
aCreateTbl[i] = 0;
if (zWhere) {
@@ -831,7 +831,6 @@ analyzeOneTable(Parse * pParse, /* Parser context */
/* Do not gather statistics on system tables */
return;
}
- assert(sqlite3SchemaToIndex(db, pTab->pSchema) == 0);
/* Establish a read-lock on the table at the shared-cache level.
* Open a read-only cursor on the table. Also allocate a cursor number
@@ -907,7 +906,6 @@ analyzeOneTable(Parse * pParse, /* Parser context */
pParse->nMem = MAX(pParse->nMem, regPrev + nColTest);
/* Open a read-only cursor on the index being analyzed. */
- assert(sqlite3SchemaToIndex(db, pIdx->pSchema) == 0);
struct space *space =
space_by_id(SQLITE_PAGENO_TO_SPACEID(pIdx->tnum));
assert(space != NULL);
@@ -1028,7 +1026,7 @@ analyzeOneTable(Parse * pParse, /* Parser context */
int nPkColumn = (int)index_column_count(pPk);
regKeyStat = sqlite3GetTempRange(pParse, nPkColumn);
for (j = 0; j < nPkColumn; j++) {
- k = sqlite3ColumnOfIndex(pIdx, pPk->aiColumn[j]);
+ k = pPk->aiColumn[j];
assert(k >= 0 && k < pTab->nCol);
sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, k, regKeyStat + j);
VdbeComment((v, "%s", pTab->aCol[pPk->aiColumn[j]].zName));
@@ -1124,7 +1122,7 @@ analyzeDatabase(Parse * pParse)
int iMem;
int iTab;
- sqlite3BeginWriteOperation(pParse, 0);
+ sql_set_multi_write(pParse, 0);
iStatCur = pParse->nTab;
pParse->nTab += 3;
openStatTable(pParse, iStatCur, 0, 0);
@@ -1148,8 +1146,7 @@ analyzeTable(Parse * pParse, Table * pTab, Index * pOnlyIdx)
int iStatCur;
assert(pTab != 0);
- assert(sqlite3SchemaToIndex(pParse->db, pTab->pSchema) == 0);
- sqlite3BeginWriteOperation(pParse, 0);
+ sql_set_multi_write(pParse, 0);
iStatCur = pParse->nTab;
pParse->nTab += 3;
if (pOnlyIdx) {
@@ -1296,7 +1293,7 @@ analysisLoader(void *pData, int argc, char **argv, char **NotUsed)
if (argv == 0 || argv[0] == 0 || argv[2] == 0) {
return 0;
}
- pTable = sqlite3FindTable(pInfo->db, argv[0]);
+ pTable = sqlite3HashFind(&pInfo->db->pSchema->tblHash, argv[0]);
if (pTable == 0) {
return 0;
}
@@ -1305,7 +1302,7 @@ analysisLoader(void *pData, int argc, char **argv, char **NotUsed)
} else if (sqlite3_stricmp(argv[0], argv[1]) == 0) {
pIndex = sqlite3PrimaryKeyIndex(pTable);
} else {
- pIndex = sqlite3FindIndex(pInfo->db, argv[1], pTable);
+ pIndex = sqlite3HashFind(&pTable->idxHash, argv[1]);
}
z = argv[2];
@@ -1638,14 +1635,14 @@ loadStat4(sqlite3 * db)
Table *pTab = 0; /* Pointer to stat table */
assert(db->lookaside.bDisable);
- pTab = sqlite3FindTable(db, "_sql_stat4");
+ pTab = sqlite3HashFind(&db->pSchema->tblHash, "_sql_stat4");
if (pTab) {
rc = loadStatTbl(db,
pTab,
"SELECT \"tbl\",\"idx\",count(*) FROM \"_sql_stat4\" GROUP BY \"tbl\",\"idx\"",
"SELECT \"tbl\",\"idx\",\"neq\",\"nlt\",\"ndlt\",\"sample\" FROM \"_sql_stat4\"");
}
-
+
return rc;
}
@@ -1690,10 +1687,8 @@ sqlite3AnalysisLoad(sqlite3 * db)
/* Load new statistics out of the _sql_stat1 table */
sInfo.db = db;
- if (sqlite3FindTable(db, "_sql_stat1") != 0) {
- zSql = "SELECT \"tbl\",\"idx\",\"stat\" FROM \"_sql_stat1\"";
- rc = sqlite3_exec(db, zSql, analysisLoader, &sInfo, 0);
- }
+ zSql = "SELECT \"tbl\",\"idx\",\"stat\" FROM \"_sql_stat1\"";
+ rc = sqlite3_exec(db, zSql, analysisLoader, &sInfo, 0);
/* Set appropriate defaults on all indexes not in the _sql_stat1 table */
for (j = sqliteHashFirst(&db->pSchema->tblHash); j;
diff --git a/src/box/sql/build.c b/src/box/sql/build.c
index 5e3ed0f39..61194e06b 100644
--- a/src/box/sql/build.c
+++ b/src/box/sql/build.c
@@ -93,23 +93,16 @@ sqlite3FinishCoding(Parse * pParse)
* transaction on each used database and to verify the schema cookie
* on each used database.
*/
- if (db->mallocFailed == 0
- && (DbMaskNonZero(pParse->cookieMask) || pParse->pConstExpr)
- ) {
+ if (db->mallocFailed == 0 || pParse->pConstExpr) {
int i;
assert(sqlite3VdbeGetOp(v, 0)->opcode == OP_Init);
sqlite3VdbeJumpHere(v, 0);
- if (DbMaskTest(pParse->cookieMask, 0) != 0) {
- if (pParse->initiateTTrans)
- sqlite3VdbeAddOp0(v, OP_TTransaction);
-
- if (db->init.busy == 0)
- sqlite3VdbeChangeP5(v, 1);
-
- VdbeComment((v, "usesStmtJournal=%d",
- pParse->mayAbort
- && pParse->isMultiWrite));
- }
+ if (pParse->initiateTTrans)
+ sqlite3VdbeAddOp0(v, OP_TTransaction);
+ if (db->init.busy == 0)
+ sqlite3VdbeChangeP5(v, 1);
+ VdbeComment((v, "Multiple changes: %d, may abort: %d",
+ pParse->isMultiWrite, pParse->mayAbort));
/* Code constant expressions that where factored out of inner loops */
if (pParse->pConstExpr) {
@@ -183,32 +176,10 @@ sqlite3NestedParse(Parse * pParse, const char *zFormat, ...)
pParse->nested--;
}
-/*
- * Locate the in-memory structure that describes a particular database
- * table given the name of that table and (optionally) the name of the
- * database containing the table. Return NULL if not found.
- *
- * If zDatabase is 0, all databases are searched for the table and the
- * first matching table is returned. (No checking for duplicate table
- * names is done.) The search order is TEMP first, then MAIN, then any
- * auxiliary databases added using the ATTACH command.
- *
- * See also sqlite3LocateTable().
- */
-Table *
-sqlite3FindTable(sqlite3 * db, const char *zName)
-{
- return sqlite3HashFind(&db->pSchema->tblHash, zName);
-}
-
/*
* Locate the in-memory structure that describes a particular database
* table given the name of that table. Return NULL if not found.
* Also leave an error message in pParse->zErrMsg.
- *
- * The difference between this routine and sqlite3FindTable() is that this
- * routine leaves an error message in pParse->zErrMsg where
- * sqlite3FindTable() does not.
*/
Table *
sqlite3LocateTable(Parse * pParse, /* context in which to report errors */
@@ -220,7 +191,7 @@ sqlite3LocateTable(Parse * pParse, /* context in which to report errors */
assert(pParse->db->pSchema != NULL);
- p = sqlite3FindTable(pParse->db, zName);
+ p = sqlite3HashFind(&pParse->db->pSchema->tblHash, zName);
if (p == 0) {
const char *zMsg =
flags & LOCATE_VIEW ? "no such view" : "no such table";
@@ -233,48 +204,19 @@ sqlite3LocateTable(Parse * pParse, /* context in which to report errors */
return p;
}
-/*
- * Locate the table identified by *p.
- *
- * This is a wrapper around sqlite3LocateTable(). The difference between
- * sqlite3LocateTable() and this function is that this function restricts
- * the search to schema (p->pSchema) if it is not NULL. p->pSchema may be
- * non-NULL if it is part of a view or trigger program definition. See
- * sqlite3FixSrcList() for details.
- */
-Table *
-sqlite3LocateTableItem(Parse * pParse, u32 flags, struct SrcList_item * p)
-{
- return sqlite3LocateTable(pParse, flags, p->zName);
-}
-
-/*
- * Locate the in-memory structure that describes
- * a particular index given the name of that index
- * and the name of the database that contains the index.
- * Return NULL if not found.
- */
-Index *
-sqlite3FindIndex(MAYBE_UNUSED sqlite3 * db, const char *zName, Table * pTab)
-{
- assert(pTab);
-
- return sqlite3HashFind(&pTab->idxHash, zName);
-}
-
Index *
sqlite3LocateIndex(sqlite3 * db, const char *zName, const char *zTable)
{
assert(zName);
assert(zTable);
- Table *pTab = sqlite3FindTable(db, zTable);
+ Table *pTab = sqlite3HashFind(&db->pSchema->tblHash, zTable);
if (pTab == 0) {
return 0;
}
- return sqlite3FindIndex(db, zName, pTab);
+ return sqlite3HashFind(&pTab->idxHash, zName);
}
/*
@@ -557,18 +499,6 @@ sqlite3PrimaryKeyIndex(Table * pTab)
return p;
}
-/*
- * Return the column of index pIdx that corresponds to table
- * column iCol. Return -1 if not found.
- */
-i16
-sqlite3ColumnOfIndex(Index * pIdx, i16 iCol)
-{
- /* TARANTOOL: Data layout is the same in every index. */
- (void) pIdx;
- return iCol;
-}
-
/*
* Begin constructing a new table representation in memory. This is
* the first of several action routines that get called in response
@@ -614,7 +544,7 @@ sqlite3StartTable(Parse *pParse, Token *pName, int noErr)
return;
assert(db->pSchema != NULL);
- pTable = sqlite3FindTable(db, zName);
+ pTable = sqlite3HashFind(&db->pSchema->tblHash, zName);
if (pTable) {
if (!noErr) {
sqlite3ErrorMsg(pParse,
@@ -622,7 +552,6 @@ sqlite3StartTable(Parse *pParse, Token *pName, int noErr)
zName);
} else {
assert(!db->init.busy || CORRUPT_DB);
- sqlite3CodeVerifySchema(pParse);
}
goto begin_table_error;
}
@@ -654,7 +583,7 @@ sqlite3StartTable(Parse *pParse, Token *pName, int noErr)
* now.
*/
if (!db->init.busy && (v = sqlite3GetVdbe(pParse)) != 0)
- sqlite3BeginWriteOperation(pParse, 1);
+ sql_set_multi_write(pParse, 1);
/* Normal (non-error) return. */
return;
@@ -2039,7 +1968,6 @@ sqlite3CreateView(Parse * pParse, /* The parsing context */
p = pParse->pNewTable;
if (p == 0 || pParse->nErr)
goto create_view_fail;
- sqlite3SchemaToIndex(db, p->pSchema);
sqlite3FixInit(&sFix, pParse, "view", pName);
if (sqlite3FixSelect(&sFix, pSelect))
goto create_view_fail;
@@ -2206,26 +2134,22 @@ sqliteViewResetAll(sqlite3 * db)
#define sqliteViewResetAll(A,B)
#endif /* SQLITE_OMIT_VIEW */
-/*
- * Remove entries from the sqlite_statN tables (for N in (1,2,3))
- * after a DROP INDEX or DROP TABLE command.
+/**
+ * Remove entries from the _sql_stat1 and _sql_stat4
+ * system spaces after a DROP INDEX or DROP TABLE command.
+ *
+ * @param pParse Parsing context.
+ * @param zType Type of entry to be deleted:
+ * 'idx' or 'tbl' string literal.
+ * @param zName Name of index or table.
*/
static void
-sqlite3ClearStatTables(Parse * pParse, /* The parsing context */
- const char *zType, /* "idx" or "tbl" */
- const char *zName /* Name of index or table */
- )
+sql_clear_stat_spaces(Parse * pParse, const char *zType, const char *zName)
{
- int i;
- for (i = 1; i <= 4; i++) {
- char zTab[24];
- sqlite3_snprintf(sizeof(zTab), zTab, "_sql_stat%d", i);
- if (sqlite3FindTable(pParse->db, zTab)) {
- sqlite3NestedParse(pParse,
- "DELETE FROM \"%s\" WHERE \"%s\"=%Q",
- zTab, zType, zName);
- }
- }
+ sqlite3NestedParse(pParse, "DELETE FROM \"_sql_stat1\" WHERE \"%s\"=%Q",
+ zType, zName);
+ sqlite3NestedParse(pParse, "DELETE FROM \"_sql_stat4\" WHERE \"%s\"=%Q",
+ zType, zName);
}
/*
@@ -2240,7 +2164,6 @@ sqlite3CodeDropTable(Parse * pParse, Table * pTab, int isView)
v = sqlite3GetVdbe(pParse);
assert(v != 0);
- sqlite3BeginWriteOperation(pParse, 1);
/*
* Drop all triggers associated with the table being
* dropped. Code is generated to remove entries from
@@ -2376,15 +2299,12 @@ sqlite3DropTable(Parse * pParse, SrcList * pName, int isView, int noErr)
if (noErr)
db->suppressErr++;
assert(isView == 0 || isView == LOCATE_VIEW);
- pTab = sqlite3LocateTableItem(pParse, isView, &pName->a[0]);
+ pTab = sqlite3LocateTable(pParse, isView, pName->a[0].zName);
if (noErr)
db->suppressErr--;
- if (pTab == 0) {
- if (noErr)
- sqlite3CodeVerifySchema(pParse);
+ if (pTab == 0)
goto exit_drop_table;
- }
#ifndef SQLITE_OMIT_VIEW
/* Ensure DROP TABLE is not used on a view, and DROP VIEW is not used
* on a table.
@@ -2414,8 +2334,8 @@ sqlite3DropTable(Parse * pParse, SrcList * pName, int isView, int noErr)
* space_id from _space.
*/
- sqlite3BeginWriteOperation(pParse, 1);
- sqlite3ClearStatTables(pParse, "tbl", pTab->zName);
+ sql_set_multi_write(pParse, 1);
+ sql_clear_stat_spaces(pParse, "tbl", pTab->zName);
sqlite3FkDropTable(pParse, pName, pTab);
sqlite3CodeDropTable(pParse, pTab, isView);
@@ -2881,7 +2801,7 @@ sqlite3CreateIndex(Parse * pParse, /* All information about this parse */
*/
assert(0);
}
- pTab = sqlite3LocateTableItem(pParse, 0, &pTblName->a[0]);
+ pTab = sqlite3LocateTable(pParse, 0, pTblName->a[0].zName);
assert(db->mallocFailed == 0 || pTab == 0);
if (pTab == 0)
goto exit_create_index;
@@ -2921,21 +2841,20 @@ sqlite3CreateIndex(Parse * pParse, /* All information about this parse */
goto exit_create_index;
assert(pName->z != 0);
if (!db->init.busy) {
- if (sqlite3FindTable(db, zName) != 0) {
+ if (sqlite3HashFind(&db->pSchema->tblHash, zName) != 0) {
sqlite3ErrorMsg(pParse,
"there is already a table named %s",
zName);
goto exit_create_index;
}
}
- if (sqlite3FindIndex(db, zName, pTab) != 0) {
+ if (sqlite3HashFind(&pTab->idxHash, zName) != 0) {
if (!ifNotExist) {
sqlite3ErrorMsg(pParse,
"index %s.%s already exists",
pTab->zName, zName);
} else {
assert(!db->init.busy);
- sqlite3CodeVerifySchema(pParse);
}
goto exit_create_index;
}
@@ -3080,9 +2999,6 @@ sqlite3CreateIndex(Parse * pParse, /* All information about this parse */
if (pParse->pNewTable == 0)
estimateIndexWidth(pIndex);
- assert(pTab->iPKey < 0
- || sqlite3ColumnOfIndex(pIndex, pTab->iPKey) >= 0);
-
if (pTab == pParse->pNewTable) {
/* This routine has been called to create an automatic index as a
* result of a PRIMARY KEY or UNIQUE clause on a column definition, or
@@ -3191,7 +3107,7 @@ sqlite3CreateIndex(Parse * pParse, /* All information about this parse */
if (v == 0)
goto exit_create_index;
- sqlite3BeginWriteOperation(pParse, 1);
+ sql_set_multi_write(pParse, 1);
sqlite3VdbeAddOp2(v, OP_SIDtoPtr, BOX_INDEX_ID,
@@ -3387,8 +3303,6 @@ sqlite3DropIndex(Parse * pParse, SrcList * pName, Token * pName2, int ifExists)
if (!ifExists) {
sqlite3ErrorMsg(pParse, "no such index: %s.%S",
zTableName, pName, 0);
- } else {
- sqlite3CodeVerifySchema(pParse);
}
pParse->checkSchema = 1;
goto exit_drop_index;
@@ -3417,7 +3331,7 @@ sqlite3DropIndex(Parse * pParse, SrcList * pName, Token * pName2, int ifExists)
* But firstly, delete statistics since schema
* changes after DDL.
*/
- sqlite3ClearStatTables(pParse, "idx", pIndex->zName);
+ sql_clear_stat_spaces(pParse, "idx", pIndex->zName);
int record_reg = ++pParse->nMem;
int space_id_reg = ++pParse->nMem;
sqlite3VdbeAddOp2(v, OP_Integer, SQLITE_PAGENO_TO_SPACEID(pIndex->tnum),
@@ -3934,58 +3848,18 @@ sqlite3Savepoint(Parse * pParse, int op, Token * pName)
}
}
-/*
- * Record the fact that the schema cookie will need to be verified
- * for database. The code to actually verify the schema cookie
- * will occur at the end of the top-level VDBE and will be generated
- * later, by sqlite3FinishCoding().
- */
-void
-sqlite3CodeVerifySchema(Parse * pParse)
-{
- Parse *pToplevel = sqlite3ParseToplevel(pParse);
-
- if (DbMaskTest(pToplevel->cookieMask, 0) == 0) {
- DbMaskSet(pToplevel->cookieMask, 0);
- }
-}
-
-/*
- * Generate VDBE code that prepares for doing an operation that
- * might change the database.
- *
- * This routine starts a new transaction if we are not already within
- * a transaction. If we are already within a transaction, then a checkpoint
- * is set if the setStatement parameter is true. A checkpoint should
- * be set for operations that might fail (due to a constraint) part of
- * the way through and which will need to undo some writes without having to
- * rollback the whole transaction. For operations where all constraints
- * can be checked before any changes are made to the database, it is never
- * necessary to undo a write and the checkpoint should not be set.
+/**
+ * Set flag in parse context, which indicates that during query
+ * execution multiple insertion/updates may occur.
*/
void
-sqlite3BeginWriteOperation(Parse * pParse, int setStatement)
+sql_set_multi_write(Parse *pParse, int setStatement)
{
Parse *pToplevel = sqlite3ParseToplevel(pParse);
- sqlite3CodeVerifySchema(pParse);
DbMaskSet(pToplevel->writeMask, 0);
pToplevel->isMultiWrite |= setStatement;
}
-/*
- * Indicate that the statement currently under construction might write
- * more than one entry (example: deleting one row then inserting another,
- * inserting multiple rows in a table, or inserting a row and index entries.)
- * If an abort occurs after some of these writes have completed, then it will
- * be necessary to undo the completed writes.
- */
-void
-sqlite3MultiWrite(Parse * pParse)
-{
- Parse *pToplevel = sqlite3ParseToplevel(pParse);
- pToplevel->isMultiWrite = 1;
-}
-
/*
* The code generator calls this routine if is discovers that it is
* possible to abort a statement prior to completion. In order to
@@ -4100,7 +3974,7 @@ reindexTable(Parse * pParse, Table * pTab, char const *zColl)
for (pIndex = pTab->pIndex; pIndex; pIndex = pIndex->pNext) {
if (zColl == 0 || collationMatch(zColl, pIndex)) {
- sqlite3BeginWriteOperation(pParse, 0);
+ sql_set_multi_write(pParse, 0);
sqlite3RefillIndex(pParse, pIndex, -1);
}
}
@@ -4175,7 +4049,7 @@ sqlite3Reindex(Parse * pParse, Token * pName1, Token * pName2)
z = sqlite3NameFromToken(db, pName1);
if (z == 0)
return;
- pTab = sqlite3FindTable(db, z);
+ pTab = sqlite3HashFind(&db->pSchema->tblHash, z);
if (pTab) {
reindexTable(pParse, pTab, 0);
sqlite3DbFree(db, z);
@@ -4185,16 +4059,15 @@ sqlite3Reindex(Parse * pParse, Token * pName1, Token * pName2)
zTable = sqlite3NameFromToken(db, pName2);
}
- pTab = sqlite3FindTable(db, zTable);
+ pTab = sqlite3HashFind(&db->pSchema->tblHash, zTable);
if (pTab == 0) {
sqlite3ErrorMsg(pParse, "no such table: %s", zTable);
goto exit_reindex;
}
- pIndex = sqlite3FindIndex(db, z, pTab);
-
+ pIndex = sqlite3HashFind(&pTab->idxHash, z);
if (pIndex) {
- sqlite3BeginWriteOperation(pParse, 0);
+ sql_set_multi_write(pParse, 0);
sqlite3RefillIndex(pParse, pIndex, -1);
return;
}
diff --git a/src/box/sql/delete.c b/src/box/sql/delete.c
index 7d1d71577..a07ef1980 100644
--- a/src/box/sql/delete.c
+++ b/src/box/sql/delete.c
@@ -56,7 +56,7 @@ sqlite3SrcListLookup(Parse * pParse, SrcList * pSrc)
struct SrcList_item *pItem = pSrc->a;
Table *pTab;
assert(pItem && pSrc->nSrc == 1);
- pTab = sqlite3LocateTableItem(pParse, 0, pItem);
+ pTab = sqlite3LocateTable(pParse, 0, pItem->zName);
sqlite3DeleteTable(pParse->db, pItem->pTab);
pItem->pTab = pTab;
if (pTab) {
@@ -113,7 +113,6 @@ sqlite3MaterializeView(Parse * pParse, /* Parsing context */
Select *pSel;
SrcList *pFrom;
sqlite3 *db = pParse->db;
- assert(sqlite3SchemaToIndex(db, pView->pSchema) == 0);
pWhere = sqlite3ExprDup(db, pWhere, 0);
pFrom = sqlite3SrcListAppend(db, 0, 0);
if (pFrom) {
@@ -325,7 +324,7 @@ sqlite3DeleteFrom(Parse * pParse, /* The parser context */
}
if (pParse->nested == 0)
sqlite3VdbeCountChanges(v);
- sqlite3BeginWriteOperation(pParse, 1);
+ sql_set_multi_write(pParse, 1);
/* If we are trying to delete from a view, realize that view into
* an ephemeral table.
diff --git a/src/box/sql/expr.c b/src/box/sql/expr.c
index f4e3cf735..d981790e6 100644
--- a/src/box/sql/expr.c
+++ b/src/box/sql/expr.c
@@ -2455,9 +2455,6 @@ sqlite3FindInIndex(Parse * pParse, /* Parsing context */
assert(p->pEList->a[0].pExpr != 0); /* Because of isCandidateForInOpt(p) */
assert(p->pSrc != 0); /* Because of isCandidateForInOpt(p) */
pTab = p->pSrc->a[0].pTab;
-
- sqlite3CodeVerifySchema(pParse);
-
assert(v); /* sqlite3GetVdbe() has always been previously called */
Index *pIdx; /* Iterator variable */
@@ -3585,8 +3582,7 @@ sqlite3ExprCodeGetColumnOfTable(Vdbe * v, /* The VDBE under construction */
int regOut /* Extract the value into this register */
)
{
- int x = sqlite3ColumnOfIndex(sqlite3PrimaryKeyIndex(pTab), iCol);
- sqlite3VdbeAddOp3(v, OP_Column, iTabCur, x, regOut);
+ sqlite3VdbeAddOp3(v, OP_Column, iTabCur, iCol, regOut);
if (iCol >= 0) {
sqlite3ColumnDefault(v, pTab, iCol, regOut);
}
@@ -5315,8 +5311,7 @@ exprIdxCover(Walker * pWalker, Expr * pExpr)
{
if (pExpr->op == TK_COLUMN
&& pExpr->iTable == pWalker->u.pIdxCover->iCur
- && sqlite3ColumnOfIndex(pWalker->u.pIdxCover->pIdx,
- pExpr->iColumn) < 0) {
+ && pExpr->iColumn < 0) {
pWalker->eCode = 1;
return WRC_Abort;
}
diff --git a/src/box/sql/fkey.c b/src/box/sql/fkey.c
index f4a6b2707..f56b6d9cd 100644
--- a/src/box/sql/fkey.c
+++ b/src/box/sql/fkey.c
@@ -961,7 +961,8 @@ sqlite3FkCheck(Parse * pParse, /* Parse context */
* early.
*/
if (pParse->disableTriggers) {
- pTo = sqlite3FindTable(db, pFKey->zTo);
+ pTo = sqlite3HashFind(&db->pSchema->tblHash,
+ pFKey->zTo);
} else {
pTo = sqlite3LocateTable(pParse, 0, pFKey->zTo);
}
diff --git a/src/box/sql/insert.c b/src/box/sql/insert.c
index 4a57b23f5..2719bbaf4 100644
--- a/src/box/sql/insert.c
+++ b/src/box/sql/insert.c
@@ -422,7 +422,7 @@ sqlite3Insert(Parse * pParse, /* Parser context */
goto insert_cleanup;
if (pParse->nested == 0)
sqlite3VdbeCountChanges(v);
- sqlite3BeginWriteOperation(pParse, pSelect || pTrigger);
+ sql_set_multi_write(pParse, pSelect || pTrigger);
#ifndef SQLITE_OMIT_XFER_OPT
/* If the statement is of the form
@@ -1398,8 +1398,7 @@ sqlite3GenerateConstraintChecks(Parse * pParse, /* The parser context */
if (pIdx != pPk) {
for (i = 0; i < nPkCol; i++) {
assert(pPk->aiColumn[i] >= 0);
- x = sqlite3ColumnOfIndex(pIdx,
- pPk->aiColumn[i]);
+ x = pPk->aiColumn[i];
sqlite3VdbeAddOp3(v, OP_Column,
iThisCur, x, regR + i);
VdbeComment((v, "%s.%s", pTab->zName,
@@ -1462,7 +1461,7 @@ sqlite3GenerateConstraintChecks(Parse * pParse, /* The parser context */
default: {
Trigger *pTrigger = 0;
assert(onError == ON_CONFLICT_ACTION_REPLACE);
- sqlite3MultiWrite(pParse);
+ sql_set_multi_write(pParse, 1);
if (user_session->
sql_flags & SQLITE_RecTriggers) {
pTrigger =
@@ -1833,7 +1832,7 @@ xferOptimization(Parse * pParse, /* Parser context */
* we have to check the semantics.
*/
pItem = pSelect->pSrc->a;
- pSrc = sqlite3LocateTableItem(pParse, 0, pItem);
+ pSrc = sqlite3LocateTable(pParse, 0, pItem->zName);
if (pSrc == 0) {
return 0; /* FROM clause does not contain a real table */
}
@@ -1919,7 +1918,6 @@ xferOptimization(Parse * pParse, /* Parser context */
sqlite3_xferopt_count++;
#endif
v = sqlite3GetVdbe(pParse);
- sqlite3CodeVerifySchema(pParse);
iSrc = pParse->nTab++;
iDest = pParse->nTab++;
regData = sqlite3GetTempReg(pParse);
diff --git a/src/box/sql/pragma.c b/src/box/sql/pragma.c
index 23b4c73b5..04b4020dd 100644
--- a/src/box/sql/pragma.c
+++ b/src/box/sql/pragma.c
@@ -358,7 +358,6 @@ sqlite3Pragma(Parse * pParse, Token * pId, /* First part of [schema.]id field */
Column *pCol;
Index *pPk = sqlite3PrimaryKeyIndex(pTab);
pParse->nMem = 6;
- sqlite3CodeVerifySchema(pParse);
sqlite3ViewGetColumnNames(pParse, pTab);
for (i = 0, pCol = pTab->aCol; i < pTab->nCol;
i++, pCol++) {
@@ -397,7 +396,6 @@ sqlite3Pragma(Parse * pParse, Token * pId, /* First part of [schema.]id field */
Index *pIdx;
HashElem *i;
pParse->nMem = 4;
- sqlite3CodeVerifySchema(pParse);
for (i = sqliteHashFirst(&db->pSchema->tblHash); i;
i = sqliteHashNext(i)) {
Table *pTab = sqliteHashData(i);
@@ -441,7 +439,6 @@ sqlite3Pragma(Parse * pParse, Token * pId, /* First part of [schema.]id field */
pParse->nMem = 3;
}
mx = index_column_count(pIdx);
- sqlite3CodeVerifySchema(pParse);
assert(pParse->nMem <=
pPragma->nPragCName);
for (i = 0; i < mx; i++) {
@@ -481,10 +478,10 @@ sqlite3Pragma(Parse * pParse, Token * pId, /* First part of [schema.]id field */
Index *pIdx;
Table *pTab;
int i;
- pTab = sqlite3FindTable(db, zRight);
+ pTab = sqlite3HashFind(&db->pSchema->tblHash,
+ zRight);
if (pTab) {
pParse->nMem = 5;
- sqlite3CodeVerifySchema(pParse);
for (pIdx = pTab->pIndex, i = 0; pIdx;
pIdx = pIdx->pNext, i++) {
const char *azOrigin[] =
@@ -541,13 +538,13 @@ sqlite3Pragma(Parse * pParse, Token * pId, /* First part of [schema.]id field */
if (zRight) {
FKey *pFK;
Table *pTab;
- pTab = sqlite3FindTable(db, zRight);
+ pTab = sqlite3HashFind(&db->pSchema->tblHash,
+ zRight);
if (pTab) {
pFK = pTab->pFKey;
if (pFK) {
int i = 0;
pParse->nMem = 8;
- sqlite3CodeVerifySchema(pParse);
while (pFK) {
int j;
for (j = 0;
@@ -597,7 +594,6 @@ sqlite3Pragma(Parse * pParse, Token * pId, /* First part of [schema.]id field */
pParse->nMem += 4;
regKey = ++pParse->nMem;
regRow = ++pParse->nMem;
- sqlite3CodeVerifySchema(pParse);
k = sqliteHashFirst(&db->pSchema->tblHash);
while (k) {
if (zRight) {
@@ -619,7 +615,8 @@ sqlite3Pragma(Parse * pParse, Token * pId, /* First part of [schema.]id field */
for (i = 1, pFK = pTab->pFKey; pFK;
i++, pFK = pFK->pNextFrom) {
pParent =
- sqlite3FindTable(db, pFK->zTo);
+ sqlite3HashFind(&db->pSchema->tblHash,
+ pFK->zTo);
if (pParent == 0)
continue;
pIdx = 0;
@@ -657,7 +654,8 @@ sqlite3Pragma(Parse * pParse, Token * pId, /* First part of [schema.]id field */
for (i = 1, pFK = pTab->pFKey; pFK;
i++, pFK = pFK->pNextFrom) {
pParent =
- sqlite3FindTable(db, pFK->zTo);
+ sqlite3HashFind(&db->pSchema->tblHash,
+ pFK->zTo);
pIdx = 0;
aiCols = 0;
if (pParent) {
diff --git a/src/box/sql/prepare.c b/src/box/sql/prepare.c
index 0ea181d44..7a16074dc 100644
--- a/src/box/sql/prepare.c
+++ b/src/box/sql/prepare.c
@@ -204,35 +204,6 @@ sqlite3InitDatabase(sqlite3 * db)
return rc;
}
-/*
- * Convert a schema pointer into the 0 index that indicates
- * that schema refers to a single database.
- * This method is inherited from SQLite, which has several dbs.
- * But we have only one, so it is used only in assertions.
- */
-int
-sqlite3SchemaToIndex(sqlite3 * db, Schema * pSchema)
-{
- int i = -1000000;
-
- /* If pSchema is NULL, then return -1000000. This happens when code in
- * expr.c is trying to resolve a reference to a transient table (i.e. one
- * created by a sub-select). In this case the return value of this
- * function should never be used.
- *
- * We return -1000000 instead of the more usual -1 simply because using
- * -1000000 as the incorrect index into db->aDb[] is much
- * more likely to cause a segfault than -1 (of course there are assert()
- * statements too, but it never hurts to play the odds).
- */
- if (pSchema) {
- if (db->pSchema == pSchema) {
- i = 0;
- }
- assert(i == 0);
- }
- return i;
-}
/*
* Free all memory allocations in the pParse object
diff --git a/src/box/sql/select.c b/src/box/sql/select.c
index c7f87f340..6ff8dc25e 100644
--- a/src/box/sql/select.c
+++ b/src/box/sql/select.c
@@ -4745,7 +4745,7 @@ selectExpander(Walker * pWalker, Select * p)
/* An ordinary table or view name in the FROM clause */
assert(pFrom->pTab == 0);
pFrom->pTab = pTab =
- sqlite3LocateTableItem(pParse, 0, pFrom);
+ sqlite3LocateTable(pParse, 0, pFrom->zName);
if (pTab == 0)
return WRC_Abort;
if (pTab->nTabRef >= 0xffff) {
@@ -6155,8 +6155,6 @@ sqlite3Select(Parse * pParse, /* The parser context */
Index *pBest; /* Best index found so far */
int iRoot = pTab->tnum; /* Root page of scanned b-tree */
- sqlite3CodeVerifySchema(pParse);
-
/* Search for the index that has the lowest scan cost.
*
* (2011-04-15) Do not do a full scan of an unordered index.
diff --git a/src/box/sql/sqliteInt.h b/src/box/sql/sqliteInt.h
index f43711a7f..fcafb65b4 100644
--- a/src/box/sql/sqliteInt.h
+++ b/src/box/sql/sqliteInt.h
@@ -2947,7 +2947,6 @@ struct Parse {
ExprList *pConstExpr; /* Constant expressions */
Token constraintName; /* Name of the constraint currently being parsed */
yDbMask writeMask; /* Start a write transaction on these databases */
- yDbMask cookieMask; /* Bitmask of schema verified databases */
int regRoot; /* Register holding root page number for new objects */
int nMaxArg; /* Max args passed to user function by sub-program */
#ifdef SELECTTRACE_ENABLED
@@ -3550,7 +3549,6 @@ int sqlite3ColumnsFromExprList(Parse *, ExprList *, i16 *, Column **);
void sqlite3SelectAddColumnTypeAndCollation(Parse *, Table *, Select *);
Table *sqlite3ResultSetOfSelect(Parse *, Select *);
Index *sqlite3PrimaryKeyIndex(Table *);
-i16 sqlite3ColumnOfIndex(Index *, i16);
void sqlite3StartTable(Parse *, Token *, int);
void sqlite3AddColumn(Parse *, Token *, Token *);
void sqlite3AddNotNull(Parse *, int);
@@ -3669,12 +3667,9 @@ int sqlite3ExprCodeExprList(Parse *, ExprList *, int, int, u8);
void sqlite3ExprIfTrue(Parse *, Expr *, int, int);
void sqlite3ExprIfFalse(Parse *, Expr *, int, int);
void sqlite3ExprIfFalseDup(Parse *, Expr *, int, int);
-Table *sqlite3FindTable(sqlite3 *, const char *);
#define LOCATE_VIEW 0x01
#define LOCATE_NOERR 0x02
Table *sqlite3LocateTable(Parse *, u32 flags, const char *);
-Table *sqlite3LocateTableItem(Parse *, u32 flags, struct SrcList_item *);
-Index *sqlite3FindIndex(sqlite3 *, const char *, Table *);
Index *sqlite3LocateIndex(sqlite3 *, const char *, const char *);
void sqlite3UnlinkAndDeleteTable(sqlite3 *, const char *);
void sqlite3UnlinkAndDeleteIndex(sqlite3 *, Index *);
@@ -3692,7 +3687,6 @@ void sqlite3PrngSaveState(void);
void sqlite3PrngRestoreState(void);
#endif
void sqlite3RollbackAll(Vdbe *, int);
-void sqlite3CodeVerifySchema(Parse *);
void sqlite3BeginTransaction(Parse *, int);
void sqlite3CommitTransaction(Parse *);
void sqlite3RollbackTransaction(Parse *);
@@ -3718,7 +3712,7 @@ void sqlite3GenerateConstraintChecks(Parse *, Table *, int *, int, int, int,
void sqlite3CompleteInsertion(Parse *, Table *, int, int *, int, u8);
int sqlite3OpenTableAndIndices(Parse *, Table *, int, u8, int, u8 *, int *,
int *, u8, u8);
-void sqlite3BeginWriteOperation(Parse *, int);
+void sql_set_multi_write(Parse *, int);
void sqlite3MultiWrite(Parse *);
void sqlite3MayAbort(Parse *);
void sqlite3HaltConstraint(Parse *, int, int, char *, i8, u8);
@@ -3912,8 +3906,6 @@ struct coll *sqlite3GetCollSeq(Parse *, struct coll *, const char *);
char sqlite3AffinityType(const char *, u8 *);
void sqlite3Analyze(Parse *, Token *);
int sqlite3InvokeBusyHandler(BusyHandler *);
-int sqlite3FindDb(sqlite3 *, Token *);
-int sqlite3FindDbName(const char *);
int sqlite3AnalysisLoad(sqlite3 *);
void sqlite3DeleteIndexSamples(sqlite3 *, Index *);
void sqlite3DefaultRowEst(Index *);
@@ -3925,7 +3917,6 @@ void sqlite3RegisterLikeFunctions(sqlite3 *, int);
int sqlite3IsLikeFunction(sqlite3 *, Expr *, int *, char *);
void sqlite3SchemaClear(sqlite3 *);
Schema *sqlite3SchemaCreate(sqlite3 *);
-int sqlite3SchemaToIndex(sqlite3 * db, Schema *);
KeyInfo *sqlite3KeyInfoAlloc(sqlite3 *, int, int);
void sqlite3KeyInfoUnref(KeyInfo *);
KeyInfo *sqlite3KeyInfoRef(KeyInfo *);
diff --git a/src/box/sql/trigger.c b/src/box/sql/trigger.c
index 859b421db..decbc8c21 100644
--- a/src/box/sql/trigger.c
+++ b/src/box/sql/trigger.c
@@ -129,7 +129,6 @@ sqlite3BeginTrigger(Parse * pParse, /* The parse context of the CREATE TRIGGER s
zName);
} else {
assert(!db->init.busy);
- sqlite3CodeVerifySchema(pParse);
}
goto trigger_cleanup;
}
@@ -215,7 +214,6 @@ sqlite3FinishTrigger(Parse * pParse, /* Parser context */
if (NEVER(pParse->nErr) || !pTrig)
goto triggerfinish_cleanup;
zName = pTrig->zName;
- assert(sqlite3SchemaToIndex(pParse->db, pTrig->pSchema) == 0);
pTrig->step_list = pStepList;
while (pStepList) {
pStepList->pTrig = pTrig;
@@ -295,7 +293,7 @@ sqlite3FinishTrigger(Parse * pParse, /* Parser context */
iFirstCol = pParse->nMem + 1;
pParse->nMem += 2;
- sqlite3BeginWriteOperation(pParse, 0);
+ sql_set_multi_write(pParse, 0);
sqlite3VdbeAddOp4(v,
OP_String8, 0, iFirstCol, 0,
zName, P4_STATIC);
@@ -528,8 +526,6 @@ sqlite3DropTrigger(Parse * pParse, SrcList * pName, int noErr)
if (!noErr) {
sqlite3ErrorMsg(pParse, "no such trigger: %S", pName,
0);
- } else {
- sqlite3CodeVerifySchema(pParse);
}
pParse->checkSchema = 1;
goto drop_trigger_cleanup;
@@ -674,7 +670,6 @@ targetSrcList(Parse * pParse, /* The parsing context */
assert(pSrc->nSrc > 0);
pSrc->a[pSrc->nSrc - 1].zName =
sqlite3DbStrDup(db, pStep->zTarget);
- assert(sqlite3SchemaToIndex(db, pStep->pTrig->pSchema) == 0);
}
return pSrc;
}
diff --git a/src/box/sql/update.c b/src/box/sql/update.c
index 7727ae5d5..ad6aad5e6 100644
--- a/src/box/sql/update.c
+++ b/src/box/sql/update.c
@@ -288,7 +288,7 @@ sqlite3Update(Parse * pParse, /* The parser context */
goto update_cleanup;
if (pParse->nested == 0)
sqlite3VdbeCountChanges(v);
- sqlite3BeginWriteOperation(pParse, 1);
+ sql_set_multi_write(pParse, 1);
/* Allocate required registers. */
regOldPk = regNewPk = ++pParse->nMem;
diff --git a/src/box/sql/vdbe.c b/src/box/sql/vdbe.c
index 329d46886..6de1b917a 100644
--- a/src/box/sql/vdbe.c
+++ b/src/box/sql/vdbe.c
@@ -1419,7 +1419,6 @@ case OP_ResultRow: {
*/
if (SQLITE_OK!=(rc = sqlite3VdbeCheckFk(p, 0))) {
assert(user_session->sql_flags&SQLITE_CountRows);
- assert(p->usesStmtJournal);
goto abort_due_to_error;
}
diff --git a/src/box/sql/vdbeInt.h b/src/box/sql/vdbeInt.h
index fcb45c8a8..f23879b1c 100644
--- a/src/box/sql/vdbeInt.h
+++ b/src/box/sql/vdbeInt.h
@@ -428,7 +428,6 @@ struct Vdbe {
bft explain:2; /* True if EXPLAIN present on SQL command */
bft changeCntOn:1; /* True to update the change-counter */
bft runOnlyOnce:1; /* Automatically expire on reset */
- bft usesStmtJournal:1; /* True if uses a statement journal */
bft isPrepareV2:1; /* True if prepared with prepare_v2() */
u32 aCounter[5]; /* Counters used by sqlite3_stmt_status() */
char *zSql; /* Text of the SQL statement that generated this */
diff --git a/src/box/sql/vdbeaux.c b/src/box/sql/vdbeaux.c
index e4335524a..bb121a318 100644
--- a/src/box/sql/vdbeaux.c
+++ b/src/box/sql/vdbeaux.c
@@ -2148,7 +2148,6 @@ sqlite3VdbeMakeReady(Vdbe * p, /* The VDBE */
assert(EIGHT_BYTE_ALIGNMENT(&x.pSpace[x.nFree]));
resolveP2Values(p, &nArg);
- p->usesStmtJournal = (u8) (pParse->isMultiWrite && pParse->mayAbort);
if (pParse->explain && nMem < 10) {
nMem = 10;
}
diff --git a/src/box/sql/where.c b/src/box/sql/where.c
index 79de5d69a..d34faef9e 100644
--- a/src/box/sql/where.c
+++ b/src/box/sql/where.c
@@ -4616,7 +4616,6 @@ sqlite3WhereBegin(Parse * pParse, /* The parser context */
#endif /* SQLITE_ENABLE_COLUMN_USED_MASK */
}
}
- sqlite3CodeVerifySchema(pParse);
}
pWInfo->iTop = sqlite3VdbeCurrentAddr(v);
if (db->mallocFailed)
@@ -4814,7 +4813,6 @@ sqlite3WhereEnd(WhereInfo * pWInfo)
if (pOp->opcode == OP_Column) {
int x = pOp->p2;
assert(pIdx->pTable == pTab);
- x = sqlite3ColumnOfIndex(pIdx, x);
if (x >= 0) {
pOp->p2 = x;
pOp->p1 = pLevel->iIdxCur;
diff --git a/src/box/sql/wherecode.c b/src/box/sql/wherecode.c
index 8b06baeff..53cd30f14 100644
--- a/src/box/sql/wherecode.c
+++ b/src/box/sql/wherecode.c
@@ -847,7 +847,7 @@ codeCursorHintCheckExpr(Walker * pWalker, Expr * pExpr)
assert(pHint->pIdx != 0);
if (pExpr->op == TK_COLUMN
&& pExpr->iTable == pHint->iTabCur
- && sqlite3ColumnOfIndex(pHint->pIdx, pExpr->iColumn) < 0) {
+ && (pExpr->iColumn < 0)) {
pWalker->eCode = 1;
}
return WRC_Continue;
@@ -921,8 +921,6 @@ codeCursorHintFixExpr(Walker * pWalker, Expr * pExpr)
pExpr->iTable = reg;
} else if (pHint->pIdx != 0) {
pExpr->iTable = pHint->iIdxCur;
- pExpr->iColumn =
- sqlite3ColumnOfIndex(pHint->pIdx, pExpr->iColumn);
assert(pExpr->iColumn >= 0);
}
} else if (pExpr->op == TK_AGG_FUNCTION) {
@@ -1517,8 +1515,7 @@ sqlite3WhereCodeOneLoopStart(WhereInfo * pWInfo, /* Complete information about t
int nPkCol = index_column_count(pPk);
int iKeyReg = sqlite3GetTempRange(pParse, nPkCol);
for (j = 0; j < nPkCol; j++) {
- k = sqlite3ColumnOfIndex(pIdx,
- pPk->aiColumn[j]);
+ k = pPk->aiColumn[j];
sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, k,
iKeyReg + j);
}
--
2.15.1
More information about the Tarantool-patches
mailing list