From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Date: Thu, 5 Apr 2018 17:45:03 +0300 From: Konstantin Osipov Subject: Re: [PATCH 12/12] vinyl: allow to modify key definition if it does not require rebuild Message-ID: <20180405144503.GA17397@atlas> References: <20180402084649.dxtykpka5tylrgn2@esperanza> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20180402084649.dxtykpka5tylrgn2@esperanza> To: Vladimir Davydov Cc: tarantool-patches@freelists.org List-ID: * Vladimir Davydov [18/04/02 11:49]: > +-- > +-- Modify key definition without index rebuild. > +-- One more thing, please, we need more functional tests. Let's create a test plan which we will then reuse for non-empty spaces as well: Modify: - unique -> non unique, non-unique -> unique, or no change - nullable -> not-nullable, not-nullable -> nullable, or no change - a wider type is altered to a more narrow type, or vice versa, or the type types are incompatible, or no change, - key part added, removed, or all key parts changed, or no key parts changed. Each line above creates a testing dimension, so in the end we should have at least 3*4*4*4 = 192 different test cases. Let's construct a test case in a way allowing us to add different dimensions to it in the future. > +s = box.schema.create_space('test', {engine = engine}) > +--- > +... > +i1 = s:create_index('i1', {unique = true, parts = {1, 'unsigned'}}) > +--- > +... > +i2 = s:create_index('i2', {unique = false, parts = {2, 'unsigned'}}) > +--- > +... > +i3 = s:create_index('i3', {unique = true, parts = {3, 'unsigned'}}) > +--- > +... > +_ = s:insert{1, 2, 3} > +--- > +... > +box.snapshot() > +--- > +- ok > +... > +_ = s:insert{3, 2, 1} > +--- > +... > +i1:alter{parts = {1, 'integer'}} > +--- > +... > +_ = s:insert{-1, 2, 2} > +--- > +... > +i1:select() > +--- > +- - [-1, 2, 2] > + - [1, 2, 3] > + - [3, 2, 1] > +... > +i2:select() > +--- > +- - [-1, 2, 2] > + - [1, 2, 3] > + - [3, 2, 1] > +... > +i3:select() > +--- > +- - [3, 2, 1] > + - [-1, 2, 2] > + - [1, 2, 3] > +... > +i2:alter{parts = {2, 'integer'}} > +--- > +... > +i3:alter{parts = {3, 'integer'}} > +--- > +... > +_ = s:replace{-1, -1, -1} > +--- > +... > +i1:select() > +--- > +- - [-1, -1, -1] > + - [1, 2, 3] > + - [3, 2, 1] > +... > +i2:select() > +--- > +- - [-1, -1, -1] > + - [1, 2, 3] > + - [3, 2, 1] > +... > +i3:select() > +--- > +- - [-1, -1, -1] > + - [3, 2, 1] > + - [1, 2, 3] > +... > +box.snapshot() > +--- > +- ok > +... > +_ = s:replace{-1, -2, -3} > +--- > +... > +_ = s:replace{-3, -2, -1} > +--- > +... > +i1:select() > +--- > +- - [-3, -2, -1] > + - [-1, -2, -3] > + - [1, 2, 3] > + - [3, 2, 1] > +... > +i2:select() > +--- > +- - [-3, -2, -1] > + - [-1, -2, -3] > + - [1, 2, 3] > + - [3, 2, 1] > +... > +i3:select() > +--- > +- - [-1, -2, -3] > + - [-3, -2, -1] > + - [3, 2, 1] > + - [1, 2, 3] > +... > +s:drop() > +--- > +... -- Konstantin Osipov, Moscow, Russia, +7 903 626 22 32 http://tarantool.io - www.twitter.com/kostja_osipov