[tarantool-patches] Re: [PATCH] sql: after table rename properly update indexes

Vladislav Shpilevoy v.shpilevoy at tarantool.org
Fri Aug 17 01:24:55 MSK 2018


Hi! Thanks for the fixes! Unfortunately you have ignored some of
my fixes pushed on the branch, so I pushed them again on a
separate commit. Please, be careful doing a force push.

>>> diff --git a/src/box/sql.c b/src/box/sql.c
>>> index ae12cae..e2d3cc1 100644
>>> --- a/src/box/sql.c
>>> +++ b/src/box/sql.c
>>> @@ -840,6 +840,55 @@ rename_fail:
>>>    	return SQL_TARANTOOL_ERROR;
>>>    }
>>> +int
>>> +sql_update_index_table_name(uint32_t space_id, uint32_t iid,
>>> +			    const char *new_tbl_name, char **sql_stmt)
>>
>> 4. I think, it would be enough to pass index_def (that you have
>> on the stack above). It has both index id and space id. And here
>> you use space_cache_find and struct space only to get index_def.
> Done. This fix cures assert in p 3

1. Unfortunately, not done.

> Regards, Kirill Yukhin
> 
> commit 4cf29331f3730658351701122d8714e157e0d77b
> Author: Kirill Yukhin <kyukhin at tarantool.org>
> Date:   Fri Aug 10 15:22:19 2018 +0300
> 
>      sql: after table rename properly update indexes
>      
>      After table was altered due to rename, indexes were not updated.
>      Re-create all table's indexes (in legacy SQL DD), also perform
>      update of corresponding entry in _index for each index to fix
>      table name in create statement.
>      
>      Closes #3613
> ---
>   src/box/sql.c                              | 49 +++++++++++++++++++++++++++---
>   src/box/sql/build.c                        |  6 ++--
>   src/box/sql/tarantoolInt.h                 | 25 +++++++++++++--
>   src/box/sql/vdbe.c                         | 27 ++++++++++++++--
>   test/sql/gh-3613-idx-alter-update.result   | 38 +++++++++++++++++++++++
>   test/sql/gh-3613-idx-alter-update.test.lua | 21 +++++++++++++
>   6 files changed, 156 insertions(+), 10 deletions(-)
> 
> diff --git a/src/box/sql/build.c b/src/box/sql/build.c
> index cdf2bfc..6247f18 100644
> --- a/src/box/sql/build.c
> +++ b/src/box/sql/build.c
> @@ -1245,13 +1245,15 @@ createIndex(Parse * pParse, Index * pIndex, int iSpaceId, int iIndexId,
>   
>   	/* Format "opts" and "parts" for _index entry. */
>   	zOpts = sqlite3DbMallocRaw(pParse->db,
> -				   tarantoolSqlite3MakeIdxOpts(pIndex, zSql,
> +				   tarantoolSqlite3MakeIdxOpts(IsUniqueIndex(pIndex),
> +							       zSql,
>   							       NULL) +

2. Looks like you has ignored my fixes here and in most other
places. Why?

>   				   tarantoolSqlite3MakeIdxParts(pIndex,
>   								NULL) + 2);
>   	if (!zOpts)
> diff --git a/src/box/sql/tarantoolInt.h b/src/box/sql/tarantoolInt.h
> index 94517f6..234c94b 100644
> --- a/src/box/sql/tarantoolInt.h
> +++ b/src/box/sql/tarantoolInt.h
> @@ -89,6 +89,23 @@ int tarantoolSqlite3ClearTable(struct space *space);
>   int
>   sql_rename_table(uint32_t space_id, const char *new_name, char **sql_stmt);
>   
> +/**
> + * Update CREATE INDEX field (def->opt.sql) replacing table name
> + * w/ new one in _index space.
> + *
> + * @param space_id Table's space identifier.
> + * @param idef Index definition.
> + * @param new_tbl_name new name of table
> + * @param[out] sql_stmt CREATE INDEX statement for new name table,
> + * can be NULL.
> + *
> + * @retval SQLITE_OK on success, SQLITE_TARANTOOL_ERROR otherwise.
> + */
> +int
> +sql_update_index_table_name(uint32_t space_id, struct index_def *idef,
> +			    const char *new_tbl_name, char **sql_stmt);
> +
> +

3. Redundant empty line.

>   /* Alter trigger statement after rename table. */
>   int tarantoolSqlite3RenameTrigger(const char *zTriggerName,
>   				  const char *zOldName, const char *zNewName);
> diff --git a/src/box/sql/vdbe.c b/src/box/sql/vdbe.c
> index dc5146f..1166ddb 100644
> --- a/src/box/sql/vdbe.c
> +++ b/src/box/sql/vdbe.c
> @@ -4625,13 +4625,36 @@ case OP_RenameTable: {
>   	db->init.busy = 1;
>   	init.rc = SQLITE_OK;
>   	sql_init_callback(&init, zNewTableName, space_id, 0, zSqlStmt);
> -	db->init.busy = 0;
>   	rc = init.rc;
> -	if (rc) {
> +	if (rc != SQLITE_OK) {
>   		sqlite3CommitInternalChanges();
> +		db->init.busy = 0;
>   		goto abort_due_to_error;
>   	}
>   
> +	/* Space was altered, refetch the pointer. */
> +	space = space_by_id(space_id);
> +	for (uint32_t i = 0; i < space->index_count; ++i) {
> +		char *sql_stmt = space->index[i]->def->opts.sql;
> +		if (sql_stmt == NULL)
> +			continue;
> +		rc = sql_update_index_table_name(space_id, space->index[i]->def,
> +						 zNewTableName, &sql_stmt);
> +		if (rc != SQLITE_OK)
> +			goto abort_due_to_error;
> +
> +		space = space_by_id(space_id);

4. The same space is looked up before the cycle.

> +		sql_init_callback(&init, zNewTableName, space_id,
> +				  space->index[i]->def->iid, sql_stmt);
> +		rc = init.rc;
> +		if (rc != SQLITE_OK) {
> +			sqlite3CommitInternalChanges();
> +			db->init.busy = 0;
> +			goto abort_due_to_error;
> +		}
> +	}
> +	db->init.busy = 0;
> +
>   	/*
>   	 * Rebuild 'CREATE TRIGGER' expressions of all triggers
>   	 * created on this table. Sure, this action is not atomic




More information about the Tarantool-patches mailing list