[patches] [PATCH 2/3] sql: add type attribute to struct Column
Alex Khatskevich
avkhatskevich at tarantool.org
Thu Feb 22 16:14:03 MSK 2018
On 14.02.2018 15:38, Nikita Pettik wrote:
> In order to remove colFlag from struct Column, it is necessary to delete
> usages of this field as an indicator of column with specified type, i.e.
> having set COLFLAG_HASTYPE. This patch adds to struct Column new field
to struct Column new field -> new field to `struct Column`
> which represents column type. In the nearest future, it should
> substitute column affinity. By default, type is SCALAR, except for
> fields created as INT/INTEGER. Moreover, column name doesn't contain
> type encoded after name string anymore.
> Removed unused sqlite3_table_column_metadata() function.
>
> Part of #3118, #3104
>
> Signed-off-by: Nikita Pettik <korablev at tarantool.org>
> ---
> src/box/sql.c | 4 +-
> src/box/sql/build.c | 30 +++++++----
> src/box/sql/main.c | 112 ------------------------------------------
> src/box/sql/pragma.c | 4 +-
> src/box/sql/select.c | 72 ++++-----------------------
> src/box/sql/sqlite3.h | 73 ---------------------------
> src/box/sql/sqliteInt.h | 6 +--
> src/box/sql/util.c | 14 ++----
> src/box/sql/vdbeaux.c | 1 +
> test/sql-tap/default.test.lua | 4 +-
> test/sql-tap/eqp.test.lua | 14 +++---
> 11 files changed, 51 insertions(+), 283 deletions(-)
>
> diff --git a/src/box/sql.c b/src/box/sql.c
> index f2ddccfa3..4ef05aaa4 100644
> --- a/src/box/sql.c
> +++ b/src/box/sql.c
> @@ -1722,7 +1722,7 @@ int tarantoolSqlite3MakeTableFormat(Table *pTable, void *buf)
> * treat it as strict type, not affinity. */
> if (pk_idx && pk_idx->nKeyCol == 1) {
> int pk = pk_idx->aiColumn[0];
> - if (pTable->aCol[pk].affinity == 'D')
> + if (pTable->aCol[pk].type == FIELD_TYPE_INTEGER)
> pk_forced_int = pk;
> }
>
> @@ -1785,7 +1785,7 @@ int tarantoolSqlite3MakeIdxParts(SqliteIndex *pIndex, void *buf)
> * treat it as strict type, not affinity. */
> if (primary_index->nKeyCol == 1) {
> int pk = primary_index->aiColumn[0];
> - if (aCol[pk].affinity == 'D')
> + if (aCol[pk].type == FIELD_TYPE_INTEGER)
> pk_forced_int = pk;
> }
>
> diff --git a/src/box/sql/build.c b/src/box/sql/build.c
> index ae140ee3c..851a8f760 100644
> --- a/src/box/sql/build.c
> +++ b/src/box/sql/build.c
> @@ -785,7 +785,7 @@ sqlite3AddColumn(Parse * pParse, Token * pName, Token * pType)
> return;
> }
> #endif
> - z = sqlite3DbMallocRaw(db, pName->n + pType->n + 2);
> + z = sqlite3DbMallocRaw(db, pName->n + 1);
> if (z == 0)
> return;
> memcpy(z, pName->z, pName->n);
> @@ -815,17 +815,28 @@ sqlite3AddColumn(Parse * pParse, Token * pName, Token * pType)
>
> if (pType->n == 0) {
> /* If there is no type specified, columns have the default affinity
> - * 'BLOB'.
> + * 'BLOB' and type SCALAR.
> + * TODO: since SQL standart prohibits column creation without
> + * specified type, the code below should emit an error.
> */
> pCol->affinity = SQLITE_AFF_BLOB;
> + pCol->type = FIELD_TYPE_SCALAR;
> pCol->szEst = 1;
> } else {
> - zType = z + sqlite3Strlen30(z) + 1;
> - memcpy(zType, pType->z, pType->n);
> - zType[pType->n] = 0;
> - sqlite3Dequote(zType);
> - pCol->affinity = sqlite3AffinityType(zType, &pCol->szEst);
> - pCol->colFlags |= COLFLAG_HASTYPE;
> + /* TODO: convert string of type into runtime FIELD_TYPE value. */
> + if (sqlite3StrNICmp(pType->z, "INTEGER", 7) == 0 ||
> + sqlite3StrNICmp(pType->z, "INT", 3) == 0) {
this condition is equivalent to just
`sqlite3StrNICmp(pType->z, "INT", 3) == 0) `
Replace `sqlite3StrNICmp` with `sqlite3StrICmp`
> + pCol->type = FIELD_TYPE_INTEGER;
> + pCol->affinity = SQLITE_AFF_INTEGER;
> + } else {
> + zType = sqlite3_malloc(pType->n + 1);
> + memcpy(zType, pType->z, pType->n);
> + zType[pType->n] = 0;
> + sqlite3Dequote(zType);
> + pCol->affinity = sqlite3AffinityType(zType, 0);
> + pCol->type = FIELD_TYPE_SCALAR;
> + sqlite3_free(zType);
> + }
> }
> p->nCol++;
> pParse->constraintName.n = 0;
> @@ -1056,8 +1067,7 @@ sqlite3AddPrimaryKey(Parse * pParse, /* Parsing context */
> }
> if (nTerm == 1
> && pCol
> - && (sqlite3StrICmp(sqlite3ColumnType(pCol, ""), "INTEGER") == 0
> - || sqlite3StrICmp(sqlite3ColumnType(pCol, ""), "INT") == 0)
> + && (sqlite3ColumnType(pCol) == FIELD_TYPE_INTEGER)
> && sortOrder != SQLITE_SO_DESC) {
> assert(autoInc == 0 || autoInc == 1);
> pTab->iPKey = iCol;
> diff --git a/src/box/sql/main.c b/src/box/sql/main.c
> index 4f43cd206..29c7df77d 100644
> --- a/src/box/sql/main.c
> +++ b/src/box/sql/main.c
> @@ -2647,118 +2647,6 @@ sqlite3_thread_cleanup(void)
> }
> #endif
>
> -/*
> - * Return meta information about a specific column of a database table.
> - * See comment in sqlite3.h (sqlite.h.in) for details.
> - */
> -int
> -sqlite3_table_column_metadata(sqlite3 * db, /* Connection handle */
> - const char *zTableName, /* Table name */
> - const char *zColumnName, /* Column name */
> - char const **pzDataType, /* OUTPUT: Declared data type */
> - char const **pzCollSeq, /* OUTPUT: Collation sequence name */
> - int *pNotNull, /* OUTPUT: True if NOT NULL constraint exists */
> - int *pPrimaryKey, /* OUTPUT: True if column part of PK */
> - int *pAutoinc) /* OUTPUT: True if column is auto-increment */
> -{
> - int rc;
> - char *zErrMsg = 0;
> - Table *pTab = 0;
> - Column *pCol = 0;
> - int iCol = 0;
> - char const *zDataType = 0;
> - char const *zCollSeq = 0;
> - int notnull = 0;
> - int primarykey = 0;
> - int autoinc = 0;
> -
> -#ifdef SQLITE_ENABLE_API_ARMOR
> - if (!sqlite3SafetyCheckOk(db) || zTableName == 0) {
> - return SQLITE_MISUSE_BKPT;
> - }
> -#endif
> -
> - /* Ensure the database schema has been loaded */
> - sqlite3_mutex_enter(db->mutex);
> - rc = sqlite3Init(db);
> - if (SQLITE_OK != rc) {
> - goto error_out;
> - }
> -
> - /* Locate the table in question */
> - pTab = sqlite3FindTable(db, zTableName);
> - if (!pTab || pTab->pSelect) {
> - pTab = 0;
> - goto error_out;
> - }
> -
> - /* Find the column for which info is requested */
> - if (zColumnName == 0) {
> - /* Query for existance of table only */
> - } else {
> - for (iCol = 0; iCol < pTab->nCol; iCol++) {
> - pCol = &pTab->aCol[iCol];
> - if (0 == strcmp(pCol->zName, zColumnName)) {
> - break;
> - }
> - }
> - if (iCol == pTab->nCol) {
> - pTab = 0;
> - goto error_out;
> - }
> - }
> -
> - /* The following block stores the meta information that will be returned
> - * to the caller in local variables zDataType, zCollSeq, notnull, primarykey
> - * and autoinc. At this the table is not a view and the column name
> - * identified an explicitly declared column.
> - * Copy meta information from *pCol.
> - */
> - if (pCol) {
> - zDataType = sqlite3ColumnType(pCol, 0);
> - zCollSeq = pCol->zColl;
> - notnull = pCol->notNull != 0;
> - primarykey = (pCol->colFlags & COLFLAG_PRIMKEY) != 0;
> - autoinc = pTab->iPKey == iCol
> - && (pTab->tabFlags & TF_Autoincrement) != 0;
> - } else {
> - zDataType = "INTEGER";
> - primarykey = 1;
> - }
> - if (!zCollSeq) {
> - zCollSeq = sqlite3StrBINARY;
> - }
> -
> - error_out:
> - /* Whether the function call succeeded or failed, set the output parameters
> - * to whatever their local counterparts contain. If an error did occur,
> - * this has the effect of zeroing all output parameters.
> - */
> - if (pzDataType)
> - *pzDataType = zDataType;
> - if (pzCollSeq)
> - *pzCollSeq = zCollSeq;
> - if (pNotNull)
> - *pNotNull = notnull;
> - if (pPrimaryKey)
> - *pPrimaryKey = primarykey;
> - if (pAutoinc)
> - *pAutoinc = autoinc;
> -
> - if (SQLITE_OK == rc && !pTab) {
> - sqlite3DbFree(db, zErrMsg);
> - zErrMsg =
> - sqlite3MPrintf(db, "no such table column: %s.%s",
> - zTableName, zColumnName);
> - rc = SQLITE_ERROR;
> - }
> - sqlite3ErrorWithMsg(db, rc, (zErrMsg ? "%s" : 0), zErrMsg);
> - sqlite3DbFree(db, zErrMsg);
> - rc = sqlite3ApiExit(db, rc);
> - sqlite3_mutex_leave(db->mutex);
> - return rc;
> -}
> -
> /*
> * Sleep for a little while. Return the amount of time slept.
> */
> diff --git a/src/box/sql/pragma.c b/src/box/sql/pragma.c
> index 3eb3248c6..4aa3b2961 100644
> --- a/src/box/sql/pragma.c
> +++ b/src/box/sql/pragma.c
> @@ -368,8 +368,8 @@ sqlite3Pragma(Parse * pParse, Token * pId, /* First part of [schema.]id field */
> || pCol->pDflt->op == TK_SPAN);
> sqlite3VdbeMultiLoad(v, 1, "issisi",
> i, pCol->zName,
> - sqlite3ColumnType
> - (pCol, ""),
> + field_type_strs[sqlite3ColumnType
too long line
replace `if (pTab) {` with `if (!pTab)` above ...
> + (pCol)],
> pCol->
> notNull ? 1 : 0,
> pCol->
> diff --git a/src/box/sql/select.c b/src/box/sql/select.c
> index acc0a8ad9..9a7032d71 100644
> --- a/src/box/sql/select.c
> +++ b/src/box/sql/select.c
> @@ -1593,14 +1593,14 @@ generateSortTail(Parse * pParse, /* Parsing context */
> #else /* if !defined(SQLITE_ENABLE_COLUMN_METADATA) */
> #define columnType(A,B,C,D,E,F) columnTypeImpl(A,B,F)
> #endif
> -static const char *
> +static enum field_type
> columnTypeImpl(NameContext * pNC, Expr * pExpr,
> #ifdef SQLITE_ENABLE_COLUMN_METADATA
> const char **pzOrigTab, const char **pzOrigCol,
> #endif
> u8 * pEstWidth)
> {
> - char const *zType = 0;
> + enum field_type column_type = FIELD_TYPE_SCALAR;
> int j;
> u8 estWidth = 1;
> #ifdef SQLITE_ENABLE_COLUMN_METADATA
> @@ -1675,7 +1675,7 @@ columnTypeImpl(NameContext * pNC, Expr * pExpr,
> sNC.pSrcList = pS->pSrc;
> sNC.pNext = pNC;
> sNC.pParse = pNC->pParse;
> - zType =
> + column_type =
> columnType(&sNC, p, 0,
> &zOrigTab, &zOrigCol,
> &estWidth);
> @@ -1690,7 +1690,7 @@ columnTypeImpl(NameContext * pNC, Expr * pExpr,
> estWidth = pTab->aCol[iCol].szEst;
> zOrigTab = pTab->zName;
> #else
> - zType = sqlite3ColumnType(&pTab->aCol[iCol], 0);
> + column_type = sqlite3ColumnType(&pTab->aCol[iCol]);
> estWidth = pTab->aCol[iCol].szEst;
> #endif
> }
> @@ -1709,7 +1709,7 @@ columnTypeImpl(NameContext * pNC, Expr * pExpr,
> sNC.pSrcList = pS->pSrc;
> sNC.pNext = pNC;
> sNC.pParse = pNC->pParse;
> - zType =
> + column_type =
> columnType(&sNC, p, 0, &zOrigTab, &zOrigCol,
> &estWidth);
> break;
> @@ -1726,50 +1726,7 @@ columnTypeImpl(NameContext * pNC, Expr * pExpr,
> #endif
> if (pEstWidth)
> *pEstWidth = estWidth;
> - return zType;
> -}
> -
> -/*
> - * Generate code that will tell the VDBE the declaration types of columns
> - * in the result set.
> - */
> -static void
> -generateColumnTypes(Parse * pParse, /* Parser context */
> - SrcList * pTabList, /* List of tables */
> - ExprList * pEList) /* Expressions defining the result set */
> -{
> -#ifndef SQLITE_OMIT_DECLTYPE
> - Vdbe *v = pParse->pVdbe;
> - int i;
> - NameContext sNC;
> - sNC.pSrcList = pTabList;
> - sNC.pParse = pParse;
> - for (i = 0; i < pEList->nExpr; i++) {
> - Expr *p = pEList->a[i].pExpr;
> - const char *zType;
> -#ifdef SQLITE_ENABLE_COLUMN_METADATA
> - const char *zOrigDb = 0;
> - const char *zOrigTab = 0;
> - const char *zOrigCol = 0;
> - zType = columnType(&sNC, p, &zOrigDb, &zOrigTab, &zOrigCol, 0);
> -
> - /* The vdbe must make its own copy of the column-type and other
> - * column specific strings, in case the schema is reset before this
> - * virtual machine is deleted.
> - */
> - sqlite3VdbeSetColName(v, i, COLNAME_DATABASE, zOrigDb,
> - SQLITE_TRANSIENT);
> - sqlite3VdbeSetColName(v, i, COLNAME_TABLE, zOrigTab,
> - SQLITE_TRANSIENT);
> - sqlite3VdbeSetColName(v, i, COLNAME_COLUMN, zOrigCol,
> - SQLITE_TRANSIENT);
> -#else
> - zType = columnType(&sNC, p, 0, 0, 0, 0);
> -#endif
> - sqlite3VdbeSetColName(v, i, COLNAME_DECLTYPE, zType,
> - SQLITE_TRANSIENT);
> - }
> -#endif /* !defined(SQLITE_OMIT_DECLTYPE) */
> + return column_type;
> }
>
> /*
> @@ -1851,7 +1808,6 @@ generateColumnNames(Parse * pParse, /* Parser context */
> SQLITE_DYNAMIC);
> }
> }
> - generateColumnTypes(pParse, pTabList, pEList);
> }
>
> /*
> @@ -1997,21 +1953,13 @@ sqlite3SelectAddColumnTypeAndCollation(Parse * pParse, /* Parsing contexts */
> sNC.pSrcList = pSelect->pSrc;
> a = pSelect->pEList->a;
> for (i = 0, pCol = pTab->aCol; i < pTab->nCol; i++, pCol++) {
> - const char *zType;
> - int n, m;
> + enum field_type type;
> p = a[i].pExpr;
> - zType = columnType(&sNC, p, 0, 0, 0, &pCol->szEst);
> + type = columnType(&sNC, p, 0, 0, 0, &pCol->szEst);
> szAll += pCol->szEst;
> pCol->affinity = sqlite3ExprAffinity(p);
> - if (zType && (m = sqlite3Strlen30(zType)) > 0) {
> - n = sqlite3Strlen30(pCol->zName);
> - pCol->zName =
> - sqlite3DbReallocOrFree(db, pCol->zName, n + m + 2);
> - if (pCol->zName) {
> - memcpy(&pCol->zName[n + 1], zType, m + 1);
> - pCol->colFlags |= COLFLAG_HASTYPE;
> - }
> - }
> + pCol->type = type;
> +
> if (pCol->affinity == 0)
> pCol->affinity = SQLITE_AFF_BLOB;
> pColl = sqlite3ExprCollSeq(pParse, p);
> diff --git a/src/box/sql/sqlite3.h b/src/box/sql/sqlite3.h
> index a89d5405d..a94e4c0d3 100644
> --- a/src/box/sql/sqlite3.h
> +++ b/src/box/sql/sqlite3.h
> @@ -5402,79 +5402,6 @@ sqlite3_soft_heap_limit64(sqlite3_int64 N);
> SQLITE_API SQLITE_DEPRECATED
> void sqlite3_soft_heap_limit(int N);
>
> -/*
> - * CAPI3REF: Extract Metadata About A Column Of A Table
> - * METHOD: sqlite3
> - *
> - * ^(The sqlite3_table_column_metadata(X,D,T,C,....) routine returns
> - * information about column C of table T in database D
> - * on [database connection] X.)^ ^The sqlite3_table_column_metadata()
> - * interface returns SQLITE_OK and fills in the non-NULL pointers in
> - * the final five arguments with appropriate values if the specified
> - * column exists. ^The sqlite3_table_column_metadata() interface returns
> - * SQLITE_ERROR and if the specified column does not exist.
> - * ^If the column-name parameter to sqlite3_table_column_metadata() is a
> - * NULL pointer, then this routine simply checks for the existence of the
> - * table and returns SQLITE_OK if the table exists and SQLITE_ERROR if it
> - * does not.
> - *
> - * ^The column is identified by the second, third and fourth parameters to
> - * this function. ^(The second parameter is either the name of the database
> - * (i.e. "main", "temp", or an attached database) containing the specified
> - * table or NULL.)^ ^If it is NULL, then all attached databases are searched
> - * for the table using the same algorithm used by the database engine to
> - * resolve unqualified table references.
> - *
> - * ^The third and fourth parameters to this function are the table and column
> - * name of the desired column, respectively.
> - *
> - * ^Metadata is returned by writing to the memory locations passed as the 5th
> - * and subsequent parameters to this function. ^Any of these arguments may be
> - * NULL, in which case the corresponding element of metadata is omitted.
> - *
> - * ^(<blockquote>
> - * <table border="1">
> - * <tr><th> Parameter <th> Output<br>Type <th> Description
> - *
> - * <tr><td> 5th <td> const char* <td> Data type
> - * <tr><td> 6th <td> const char* <td> Name of default collation sequence
> - * <tr><td> 7th <td> int <td> True if column has a NOT NULL constraint
> - * <tr><td> 8th <td> int <td> True if column is part of the PRIMARY KEY
> - * <tr><td> 9th <td> int <td> True if column is [AUTOINCREMENT]
> - * </table>
> - * </blockquote>)^
> - *
> - * ^The memory pointed to by the character pointers returned for the
> - * declaration type and collation sequence is valid until the next
> - * call to any SQLite API function.
> - *
> - * ^If the specified table is actually a view, an [error code] is returned.
> - *
> - * ^This function causes all database schemas to be read from disk and
> - * parsed, if that has not already been done, and returns an error if
> - * any errors are encountered while loading the schema.
> -*/
> -SQLITE_API int
> -sqlite3_table_column_metadata(sqlite3 * db, /* Connection handle */
> - const char *zTableName, /* Table name */
> - const char *zColumnName, /* Column name */
> - char const **pzDataType, /* OUTPUT: Declared data type */
> - char const **pzCollSeq, /* OUTPUT: Collation sequence name */
> - int *pNotNull, /* OUTPUT: True if NOT NULL constraint exists */
> - int *pPrimaryKey, /* OUTPUT: True if column part of PK */
> - int *pAutoinc /* OUTPUT: True if column is auto-increment */
> - );
> -
> -SQLITE_API int
> -sqlite3_table_column_metadata(sqlite3 * db,
> - const char *zTableName,
> - const char *zColumnName,
> - char const **pzDataType,
> - char const **pzCollSeq,
> - int *pNotNull,
> - int *pPrimaryKey,
> - int *pAutoinc);
> -
> /*
> * CAPI3REF: A Handle To An Open BLOB
> * KEYWORDS: {BLOB handle} {BLOB handles}
> diff --git a/src/box/sql/sqliteInt.h b/src/box/sql/sqliteInt.h
> index 46b94430e..5fc612dea 100644
> --- a/src/box/sql/sqliteInt.h
> +++ b/src/box/sql/sqliteInt.h
> @@ -1347,7 +1347,8 @@ struct Savepoint {
> * of this structure.
> */
> struct Column {
> - char *zName; /* Name of this column, \000, then the type */
> + char *zName; /* Name of this column */
> + enum field_type type; /* Column type. */
> Expr *pDflt; /* Default value of this column */
> char *zColl; /* Collating sequence. If NULL, use the default */
> u8 notNull; /* An OE_ code for handling a NOT NULL constraint */
> @@ -1359,7 +1360,6 @@ struct Column {
> /* Allowed values for Column.colFlags:
> */
> #define COLFLAG_PRIMKEY 0x0001 /* Column is part of the primary key */
> -#define COLFLAG_HASTYPE 0x0004 /* Type name follows column name */
>
> /*
> * A sort order can be either ASC or DESC.
> @@ -2946,7 +2946,7 @@ int sqlite3IoerrnomemError(int);
> */
> int sqlite3StrICmp(const char *, const char *);
> unsigned sqlite3Strlen30(const char *);
> -char *sqlite3ColumnType(Column *, char *);
> +enum field_type sqlite3ColumnType(Column *);
> #define sqlite3StrNICmp sqlite3_strnicmp
>
> int sqlite3MallocInit(void);
> diff --git a/src/box/sql/util.c b/src/box/sql/util.c
> index 2b7f2c48d..0de90ac54 100644
> --- a/src/box/sql/util.c
> +++ b/src/box/sql/util.c
> @@ -130,18 +130,12 @@ sqlite3Strlen30(const char *z)
> }
>
> /*
> - * Return the declared type of a column. Or return zDflt if the column
> - * has no declared type.
> - *
> - * The column type is an extra string stored after the zero-terminator on
> - * the column name if and only if the COLFLAG_HASTYPE flag is set.
> + * Return the declared type of a column.
> */
> -char *
> -sqlite3ColumnType(Column * pCol, char *zDflt)
> +enum field_type
> +sqlite3ColumnType(Column * pCol)
> {
> - if ((pCol->colFlags & COLFLAG_HASTYPE) == 0)
> - return zDflt;
> - return pCol->zName + strlen(pCol->zName) + 1;
> + return pCol->type;
> }
Make this function inline or #define
>
> /*
> diff --git a/src/box/sql/vdbeaux.c b/src/box/sql/vdbeaux.c
> index df6881488..17ba61b94 100644
> --- a/src/box/sql/vdbeaux.c
> +++ b/src/box/sql/vdbeaux.c
> @@ -2411,6 +2411,7 @@ sqlite3VdbeSetColName(Vdbe * p, /* Vdbe being configured */
> return SQLITE_NOMEM_BKPT;
> }
> assert(p->aColName != 0);
> + assert(var == COLNAME_NAME);
> pColName = &(p->aColName[idx + var * p->nResColumn]);
> rc = sqlite3VdbeMemSetStr(pColName, zName, -1, 1, xDel);
> assert(rc != 0 || !zName || (pColName->flags & MEM_Term) != 0);
> diff --git a/test/sql-tap/default.test.lua b/test/sql-tap/default.test.lua
> index 2be1411e1..31a91bd14 100755
> --- a/test/sql-tap/default.test.lua
> +++ b/test/sql-tap/default.test.lua
> @@ -80,7 +80,7 @@ test:do_execsql_test(
> PRAGMA table_info(t4);
> ]], {
> -- <default-2.1>
> - 0,"ROWID","INTEGER",1,"",1,1,"C","",0,"'abc'",0
> + 0,"ROWID","integer",1,"",1,1,"C","scalar",0,"'abc'",0
> -- </default-2.1>
> })
>
> @@ -91,7 +91,7 @@ test:do_execsql_test(
> PRAGMA table_info(t4);
> ]], {
> -- <default-2.2>
> - 0,"ROWID","INTEGER",1,"",1,1,"C","",0,"'abc'",0
> + 0,"ROWID","integer",1,"",1,1,"C","scalar",0,"'abc'",0
> -- </default-2.2>
> })
>
> diff --git a/test/sql-tap/eqp.test.lua b/test/sql-tap/eqp.test.lua
> index a54e7ed3e..7d6ad8cd1 100755
> --- a/test/sql-tap/eqp.test.lua
> +++ b/test/sql-tap/eqp.test.lua
> @@ -551,8 +551,8 @@ test:do_execsql_test(
> test:do_eqp_test("5.3.1", "SELECT a, b FROM t1 WHERE a=1", {
> -- It is equal for tarantol wheather to use i1 or i2
> -- because both of them are covering
> - --{0, 0, 0, "SEARCH TABLE T1 USING COVERING INDEX i2 (a=?)"},
> - {0, 0, 0, "SEARCH TABLE T1 USING COVERING INDEX I1 (A=?)"},
> + {0, 0, 0, "SEARCH TABLE T1 USING COVERING INDEX I2 (A=?)"},
> + --{0, 0, 0, "SEARCH TABLE T1 USING COVERING INDEX I1 (A=?)"},
> })
> -- EVIDENCE-OF: R-09991-48941 sqlite> EXPLAIN QUERY PLAN
> -- SELECT t1.*, t2.* FROM t1, t2 WHERE t1.a=1 AND t1.b>2;
> @@ -592,8 +592,8 @@ test:do_execsql_test(
> test:do_eqp_test("5.6.1", "SELECT a, b FROM t1 WHERE a=1 OR b=2", {
> -- It is equal for tarantol wheather to use i1 or i2
> -- because both of them are covering
> - --{0, 0, 0, "SEARCH TABLE T1 USING COVERING INDEX i2 (a=?)"},
> - {0, 0, 0, "SEARCH TABLE T1 USING COVERING INDEX I1 (A=?)"},
> + {0, 0, 0, "SEARCH TABLE T1 USING COVERING INDEX I2 (A=?)"},
> + --{0, 0, 0, "SEARCH TABLE T1 USING COVERING INDEX I1 (A=?)"},
> {0, 0, 0, "SEARCH TABLE T1 USING COVERING INDEX I3 (B=?)"},
> })
> -- EVIDENCE-OF: R-24577-38891 sqlite> EXPLAIN QUERY PLAN
> @@ -633,8 +633,8 @@ test:do_eqp_test(5.9, [[
> {0, 0, 0, "EXECUTE SCALAR SUBQUERY 1"},
> -- It is equally for tarantol wheather to use i1 or i2
> -- because both of them are covering
> - --{1, 0, 0, "SEARCH TABLE T1 USING COVERING INDEX i2 (a=?)"},
> - {1, 0, 0, "SEARCH TABLE T1 USING COVERING INDEX I1 (A=?)"},
> + {1, 0, 0, "SEARCH TABLE T1 USING COVERING INDEX I2 (A=?)"},
> + --{1, 0, 0, "SEARCH TABLE T1 USING COVERING INDEX I1 (A=?)"},
> {0, 0, 0, "EXECUTE CORRELATED SCALAR SUBQUERY 2"},
> {2, 0, 0, "SEARCH TABLE T1 USING COVERING INDEX I3 (B=?)"},
> })
> @@ -736,7 +736,7 @@ test:do_eqp_test(7.1, "SELECT count(*) FROM t1", {
> {0, 0, 0, "SCAN TABLE T1"},
> })
> test:do_eqp_test(7.2, "SELECT count(*) FROM t2", {
> - {0, 0, 0, "SCAN TABLE T2"},
> + {0, 0, 0, "SCAN TABLE T2 USING COVERING INDEX I1"},
> })
> -- MUST_WORK_TEST
> if (0 > 0)
More information about the Tarantool-patches
mailing list