[tarantool-patches] Re: [PATCH] sql: swap FK masks during altering of space

Vladislav Shpilevoy v.shpilevoy at tarantool.org
Sun Sep 15 16:42:01 MSK 2019


Hi! Thanks for the patch! LGTM.

On 13/09/2019 21:08, Nikita Pettik wrote:
> It was forgotten to swap old and new mask (holding fields involved into
> foreign key relation) during space alteration (lists of object
> representing FK metadata are swapped successfully). Since mask is vital
> and depending on its value different byte-codes implementing SQL query
> can be produced, this mistake resulted in assertion fault in debug build
> and wrong constraint check in release build. Let's fix this bug and swap
> masks as well as foreign key lists.
> 
> Closes #4495
> ---
> Branch: https://github.com/tarantool/tarantool/tree/np/gh-4495-swap-fk-mask
> Issue: https://github.com/tarantool/tarantool/issues/4495
> 
>  src/box/alter.cc               |  1 +
>  test/sql/foreign-keys.result   | 38 ++++++++++++++++++++++++++++++++++++++
>  test/sql/foreign-keys.test.lua | 15 +++++++++++++++
>  3 files changed, 54 insertions(+)
> 
> diff --git a/src/box/alter.cc b/src/box/alter.cc
> index c0780d6da..499df1ca2 100644
> --- a/src/box/alter.cc
> +++ b/src/box/alter.cc
> @@ -619,6 +619,7 @@ space_swap_fk_constraints(struct space *new_space, struct space *old_space)
>  		   &old_space->child_fk_constraint);
>  	rlist_swap(&new_space->parent_fk_constraint,
>  		   &old_space->parent_fk_constraint);
> +	SWAP(new_space->fk_constraint_mask, old_space->fk_constraint_mask);
>  }
>  
>  /**
> diff --git a/test/sql/foreign-keys.result b/test/sql/foreign-keys.result
> index b8ff8f145..29538e816 100644
> --- a/test/sql/foreign-keys.result
> +++ b/test/sql/foreign-keys.result
> @@ -457,5 +457,43 @@ t1:drop()
>  t2:drop()
>  ---
>  ...
> +-- gh-4495: space alter resulted in foreign key mask reset.
> +-- Which in turn led to wrong byte-code generation. Make sure
> +-- that alter of space doesn't affect result of query execution.
> +--
> +box.execute("CREATE TABLE t (id TEXT PRIMARY KEY, a INTEGER NOT NULL);")
> +---
> +- row_count: 1
> +...
> +box.execute("CREATE TABLE s (t_id TEXT PRIMARY KEY, a INTEGER NOT NULL, FOREIGN KEY(t_id) REFERENCES t(id) ON DELETE CASCADE);")
> +---
> +- row_count: 1
> +...
> +box.space.T:insert({'abc', 1})
> +---
> +- ['abc', 1]
> +...
> +box.space.S:insert({'abc', 1})
> +---
> +- ['abc', 1]
> +...
> +box.execute("CREATE INDEX i ON s (t_id);")
> +---
> +- row_count: 1
> +...
> +box.execute("DELETE FROM t WHERE id = 'abc';")
> +---
> +- row_count: 1
> +...
> +box.space.T:select()
> +---
> +- []
> +...
> +box.space.S:drop()
> +---
> +...
> +box.space.T:drop()
> +---
> +...
>  --- Clean-up SQL DD hash.
>  -test_run:cmd('restart server default with cleanup=1')
> diff --git a/test/sql/foreign-keys.test.lua b/test/sql/foreign-keys.test.lua
> index 4ac5999d7..d2dd88d28 100644
> --- a/test/sql/foreign-keys.test.lua
> +++ b/test/sql/foreign-keys.test.lua
> @@ -194,5 +194,20 @@ box.execute("ALTER TABLE t2 ADD CONSTRAINT fk FOREIGN KEY (id) REFERENCES t1;")
>  t1:drop()
>  t2:drop()
>  
> +-- gh-4495: space alter resulted in foreign key mask reset.
> +-- Which in turn led to wrong byte-code generation. Make sure
> +-- that alter of space doesn't affect result of query execution.
> +--
> +box.execute("CREATE TABLE t (id TEXT PRIMARY KEY, a INTEGER NOT NULL);")
> +box.execute("CREATE TABLE s (t_id TEXT PRIMARY KEY, a INTEGER NOT NULL, FOREIGN KEY(t_id) REFERENCES t(id) ON DELETE CASCADE);")
> +box.space.T:insert({'abc', 1})
> +box.space.S:insert({'abc', 1})
> +box.execute("CREATE INDEX i ON s (t_id);")
> +box.execute("DELETE FROM t WHERE id = 'abc';")
> +box.space.T:select()
> +
> +box.space.S:drop()
> +box.space.T:drop()
> +
>  --- Clean-up SQL DD hash.
>  -test_run:cmd('restart server default with cleanup=1')
> 




More information about the Tarantool-patches mailing list