From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtpng2.m.smailru.net (smtpng2.m.smailru.net [94.100.179.3]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dev.tarantool.org (Postfix) with ESMTPS id 4FFAF469719 for ; Thu, 17 Sep 2020 18:01:47 +0300 (MSK) References: <20200911215115.6622-1-roman.habibov@tarantool.org> <20200911215115.6622-6-roman.habibov@tarantool.org> From: Vladislav Shpilevoy Message-ID: Date: Thu, 17 Sep 2020 17:01:45 +0200 MIME-Version: 1.0 In-Reply-To: <20200911215115.6622-6-roman.habibov@tarantool.org> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Subject: Re: [Tarantool-patches] [PATCH v4 5/6] box: disallow to modify format of a view List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Roman Khabibov , tarantool-patches@dev.tarantool.org Thanks for the patch! On 11.09.2020 23:51, Roman Khabibov wrote: > Disallow to modify format and field_count of a view. See 4 comments below in addition to Nikita's comments. 1. That should be in a different branch, to emphasize that it is a separate bug, which we will need to merge into 2.4 and 2.5 as well. > Needed for #3075 > --- > src/box/alter.cc | 8 ++++ > test/box/view-dont-modify-format.result | 51 +++++++++++++++++++++++ > test/box/view-dont-modify-format.test.lua | 18 ++++++++ > 3 files changed, 77 insertions(+) > create mode 100644 test/box/view-dont-modify-format.result > create mode 100644 test/box/view-dont-modify-format.test.lua > > diff --git a/src/box/alter.cc b/src/box/alter.cc > index ba96d9c62..3bfbb690a 100644 > --- a/src/box/alter.cc > +++ b/src/box/alter.cc > @@ -2441,6 +2441,14 @@ on_replace_dd_space(struct trigger * /* trigger */, void *event) > "view"); > return -1; > } > + if (def->opts.is_view && (def->field_count != > + old_space->def->field_count)) { 2. The () around != is not needed. > + diag_set(ClientError, ER_ALTER_SPACE, > + space_name(old_space), > + "can not modify format or field_count of a " > + "view"); > + return -1; > + } > /* > * Allow change of space properties, but do it > * in WAL-error-safe mode. > diff --git a/test/box/view-dont-modify-format.result b/test/box/view-dont-modify-format.result > new file mode 100644 > index 000000000..c130db49c > --- /dev/null > +++ b/test/box/view-dont-modify-format.result > @@ -0,0 +1,51 @@ > +-- test-run result file version 2 > +-- > +-- Make sure we can't modify a view format. > +-- > +box.execute("CREATE TABLE t1 (a INT PRIMARY KEY);") > + | --- > + | - row_count: 1 > + | ... > +box.execute("CREATE VIEW v AS SELECT * FROM t1;") > + | --- > + | - row_count: 1 > + | ... > +view = box.space._space.index[2]:select('V')[1]:totable() 3. You could use box.space.V:format(). > +f = {type = 'string', nullable_action = 'none', name = 'C', is_nullable = true} > + | --- > + | ... > +table.insert(view_format, f) > + | --- > + | ... > +view[5] = 3 > + | --- > + | ... > +view[7] = view_format 4. You can use space:alter() method instead of raw modification of _space. Although it is not available on 2.4. > + | --- > + | ... > +box.space._space:replace(view) > + | --- > + | - error: 'Can''t modify space ''V'': can not modify format or field_count of a view' > + | ... > + > +view = box.space.V > + | --- > + | ... > +view:format({}) > + | --- > + | - error: 'Can''t modify space ''V'': can not modify format or field_count of a view' > + | ... > + > +box.execute("DROP VIEW v;") > + | --- > + | - row_count: 1 > + | ... > +box.execute("DROP TABLE t1;") > + | --- > + | - row_count: 1 > + | ...