diff --git a/src/box/sql/build.c b/src/box/sql/build.c index 5b3348bd219f79725f0af6b4e3e673d31a1a05e3..9c9a6d9e13a28715a7237eb2f7436782b10ca9df 100644 --- a/src/box/sql/build.c +++ b/src/box/sql/build.c @@ -1415,7 +1415,8 @@ vdbe_emit_fkey_create(struct Parse *parse_context, const struct fkey_def *fk) constr_tuple_reg + 9); sqlite3VdbeAddOp3(vdbe, OP_SInsert, BOX_FK_CONSTRAINT_ID, 0, constr_tuple_reg + 9); - sqlite3VdbeChangeP5(vdbe, OPFLAG_NCHANGE); + if (parse_context->pNewTable == NULL) + sqlite3VdbeChangeP5(vdbe, OPFLAG_NCHANGE); save_record(parse_context, BOX_FK_CONSTRAINT_ID, constr_tuple_reg, 2, vdbe->nOp - 1); sqlite3ReleaseTempRange(parse_context, constr_tuple_reg, 10); @@ -1809,7 +1810,6 @@ vdbe_emit_fkey_drop(struct Parse *parse_context, char *constraint_name, } sqlite3VdbeAddOp3(vdbe, OP_MakeRecord, key_reg, 2, key_reg + 2); sqlite3VdbeAddOp2(vdbe, OP_SDelete, BOX_FK_CONSTRAINT_ID, key_reg + 2); - sqlite3VdbeChangeP5(vdbe, OPFLAG_NCHANGE); VdbeComment((vdbe, "Delete FK constraint %s", constraint_name)); sqlite3ReleaseTempRange(parse_context, key_reg, 3); } @@ -2268,6 +2268,13 @@ sql_drop_foreign_key(struct Parse *parse_context, struct SrcList *table, if (constraint_name != NULL) vdbe_emit_fkey_drop(parse_context, constraint_name, child->def->id); + /* + * We account changes to row count only if drop of + * foreign keys take place in a separate + * ALTER TABLE DROP CONSTRAINT statement, since whole + * DROP TABLE always returns 1 (one) as a row count. + */ + sqlite3VdbeChangeP5(sqlite3GetVdbe(parse_context), OPFLAG_NCHANGE); } /* diff --git a/test/sql/iproto.result b/test/sql/iproto.result index f390a73a971827117d1655ff01704a1b65a5524d..e75f791106b7053b3a6f0c989dff9b6462c8e103 100644 --- a/test/sql/iproto.result +++ b/test/sql/iproto.result @@ -727,9 +727,6 @@ cn:execute('insert into TEST3 values (null), (null), (null), (null)') - -29 rowcount: 4 ... -cn:close() ---- -... box.sql.execute('drop table test') --- ... @@ -742,6 +739,28 @@ sq:drop() box.sql.execute('drop table test3') --- ... +-- +-- Ensure that FK inside CREATE TABLE does not affect rowcount. +-- +cn:execute('create table test (id integer primary key)') +--- +- rowcount: 1 +... +cn:execute('create table test2 (id integer primary key, ref integer references test)') +--- +- rowcount: 1 +... +cn:execute('drop table test2') +--- +- rowcount: 1 +... +cn:execute('drop table test') +--- +- rowcount: 1 +... +cn:close() +--- +... box.schema.user.revoke('guest', 'read,write,execute', 'universe') --- ... diff --git a/test/sql/iproto.test.lua b/test/sql/iproto.test.lua index a18755b0051dd41ffc606a889e387743fa222bf6..fb5685a9e515bc179edb3ae4ae48f52e21a7cca8 100644 --- a/test/sql/iproto.test.lua +++ b/test/sql/iproto.test.lua @@ -225,12 +225,21 @@ box.sql.execute('create table test3 (id int primary key autoincrement)') box.schema.sequence.alter('TEST3', {min=-10000, step=-10}) cn:execute('insert into TEST3 values (null), (null), (null), (null)') -cn:close() box.sql.execute('drop table test') s:drop() sq:drop() box.sql.execute('drop table test3') +-- +-- Ensure that FK inside CREATE TABLE does not affect rowcount. +-- +cn:execute('create table test (id integer primary key)') +cn:execute('create table test2 (id integer primary key, ref integer references test)') +cn:execute('drop table test2') +cn:execute('drop table test') + +cn:close() + box.schema.user.revoke('guest', 'read,write,execute', 'universe') box.schema.user.revoke('guest', 'create', 'space') space = nil