Tarantool development patches archive
 help / color / mirror / Atom feed
* [tarantool-patches] [PATCH 0/5] Move FK constraints to server
@ 2018-07-13  2:04 Nikita Pettik
  2018-07-13  2:04 ` [tarantool-patches] [PATCH 1/5] sql: prohibit creation of FK on unexisting tables Nikita Pettik
                   ` (6 more replies)
  0 siblings, 7 replies; 32+ messages in thread
From: Nikita Pettik @ 2018-07-13  2:04 UTC (permalink / raw)
  To: tarantool-patches; +Cc: v.shpilevoy, Nikita Pettik

Branch: https://github.com/tarantool/tarantool/commits/np/move-fk-to-server
Issue: https://github.com/tarantool/tarantool/issues/3271

The aim of this patch-set is to move foreign key constraint to server
and them be closer to ANSI specification.

First patch is preliminary and enables additional restrictions
for FK constraints (ban opportunity to drop space referenced space,
create FK referencing VIEW etc).

In original SQLite FK constraints may appear only during CREATE TABLE
statement. Thus, it was enough to hold string of CREATE TABLE statement
and reparse it once on instance loading. This approach defers all
resolutions until FK usage. For instance:

CREATE TABLE t1(id PRIMARY KEY REFERENCES t2);
CREATE TABLE t2(id PRIMARY KEY);

We decided to use another approach - where FK constraints are always consistent
and all DD links are kept up. For instance, if we attempted to satisfy all
restrictions using SQLite schema - we wouldn't be able to create circular
dependencies. To support circular dependecies, we must allow to create them
after space itself. In turn, to create FK constraints outside CREATE STATEMENT,
we must persist them.  To implement these steps, firstly _fk_constraint system
space is added - it contains tuples describing FK. Then, separate SQL statement
<ALTER TABLE name ADD CONSTRAINT ...> is introduced which processes insertion
and deletion from this space. Finally, FK processing has been refactored to
rely on new DD in server (struct fkey and struct fkey_def). It seems that
perfomance of FK handling has become a little bit better: now we don't need
find suitable index on each FK invocation - its id is held into FK struct
itself.

The last patch is simple follow-up which removes obsolete define guard
for FK constraints.

Nikita Pettik (5):
  sql: prohibit creation of FK on unexisting tables
  schema: add new system space for FK constraints
  sql: introduce ADD CONSTRAINT statement
  sql: display error on FK creation and drop failure
  sql: remove SQLITE_OMIT_FOREIGN_KEY define guard

 extra/mkkeywordhash.c                |    9 +-
 src/box/CMakeLists.txt               |    1 +
 src/box/alter.cc                     |  432 +++++++++++++-
 src/box/alter.h                      |    1 +
 src/box/bootstrap.snap               |  Bin 1704 -> 1798 bytes
 src/box/errcode.h                    |    6 +
 src/box/fkey.c                       |   69 +++
 src/box/fkey.h                       |  169 ++++++
 src/box/lua/schema.lua               |    6 +
 src/box/lua/space.cc                 |    2 +
 src/box/lua/upgrade.lua              |   16 +
 src/box/schema.cc                    |   16 +
 src/box/schema_def.h                 |   14 +
 src/box/space.c                      |    2 +
 src/box/space.h                      |    3 +
 src/box/sql.c                        |   24 +
 src/box/sql/alter.c                  |    7 -
 src/box/sql/build.c                  |  601 ++++++++++++++-----
 src/box/sql/callback.c               |    2 -
 src/box/sql/delete.c                 |    6 +-
 src/box/sql/expr.c                   |   10 +-
 src/box/sql/fkey.c                   | 1077 ++++++++++------------------------
 src/box/sql/insert.c                 |   21 +-
 src/box/sql/main.c                   |    5 -
 src/box/sql/parse.y                  |   37 +-
 src/box/sql/pragma.c                 |  242 +-------
 src/box/sql/pragma.h                 |   13 -
 src/box/sql/prepare.c                |    5 +
 src/box/sql/sqliteInt.h              |  185 +++---
 src/box/sql/status.c                 |    5 +-
 src/box/sql/tarantoolInt.h           |   13 +
 src/box/sql/trigger.c                |   24 +-
 src/box/sql/update.c                 |    4 +-
 src/box/sql/vdbe.c                   |   51 +-
 src/box/sql/vdbeInt.h                |    4 -
 src/box/sql/vdbeaux.c                |    4 -
 test/box/access_misc.result          |    5 +
 test/box/access_sysview.result       |    6 +-
 test/box/alter.result                |    5 +-
 test/box/misc.result                 |    4 +
 test/engine/iterator.result          |    2 +-
 test/sql-tap/alter.test.lua          |    2 +-
 test/sql-tap/alter2.test.lua         |  219 +++++++
 test/sql-tap/fkey1.test.lua          |   65 +-
 test/sql-tap/fkey2.test.lua          |  148 ++---
 test/sql-tap/fkey3.test.lua          |   19 +-
 test/sql-tap/fkey4.test.lua          |    2 +-
 test/sql-tap/orderby1.test.lua       |    6 +-
 test/sql-tap/suite.ini               |    1 +
 test/sql-tap/table.test.lua          |   19 +-
 test/sql-tap/tkt-b1d3a2e531.test.lua |    6 +-
 test/sql-tap/triggerC.test.lua       |    2 +-
 test/sql-tap/whereG.test.lua         |    4 +-
 test/sql-tap/with1.test.lua          |    2 +-
 test/sql/foreign-keys.result         |  316 ++++++++++
 test/sql/foreign-keys.test.lua       |  144 +++++
 56 files changed, 2534 insertions(+), 1529 deletions(-)
 create mode 100644 src/box/fkey.c
 create mode 100644 src/box/fkey.h
 create mode 100755 test/sql-tap/alter2.test.lua
 create mode 100644 test/sql/foreign-keys.result
 create mode 100644 test/sql/foreign-keys.test.lua

-- 
2.15.1

^ permalink raw reply	[flat|nested] 32+ messages in thread

end of thread, other threads:[~2018-08-07 14:57 UTC | newest]

Thread overview: 32+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-07-13  2:04 [tarantool-patches] [PATCH 0/5] Move FK constraints to server Nikita Pettik
2018-07-13  2:04 ` [tarantool-patches] [PATCH 1/5] sql: prohibit creation of FK on unexisting tables Nikita Pettik
2018-07-17 21:05   ` [tarantool-patches] " Vladislav Shpilevoy
2018-07-25 10:03     ` n.pettik
2018-07-26 20:12       ` Vladislav Shpilevoy
2018-08-01 20:54         ` n.pettik
2018-08-02 22:15           ` Vladislav Shpilevoy
2018-08-06  0:27             ` n.pettik
2018-07-13  2:04 ` [tarantool-patches] [PATCH 2/5] schema: add new system space for FK constraints Nikita Pettik
2018-07-17 21:05   ` [tarantool-patches] " Vladislav Shpilevoy
2018-07-25 10:03     ` n.pettik
2018-07-26 20:12       ` Vladislav Shpilevoy
2018-08-01 20:54         ` n.pettik
2018-08-02 22:15           ` Vladislav Shpilevoy
2018-08-06  0:28             ` n.pettik
2018-08-06 18:24               ` Vladislav Shpilevoy
2018-07-13  2:04 ` [tarantool-patches] [PATCH 3/5] sql: introduce ADD CONSTRAINT statement Nikita Pettik
2018-07-17 21:05   ` [tarantool-patches] " Vladislav Shpilevoy
2018-07-25 10:03     ` n.pettik
2018-07-26 20:12       ` Vladislav Shpilevoy
2018-08-01 20:54         ` n.pettik
2018-08-02 22:15           ` Vladislav Shpilevoy
2018-08-06  0:28             ` n.pettik
2018-08-06 18:24               ` Vladislav Shpilevoy
2018-08-06 23:43                 ` n.pettik
2018-07-13  2:04 ` [tarantool-patches] [PATCH 4/5] sql: display error on FK creation and drop failure Nikita Pettik
2018-07-17 21:04   ` [tarantool-patches] " Vladislav Shpilevoy
2018-07-25 10:03     ` n.pettik
2018-07-26 20:11       ` Vladislav Shpilevoy
2018-07-13  2:04 ` [tarantool-patches] [PATCH 5/5] sql: remove SQLITE_OMIT_FOREIGN_KEY define guard Nikita Pettik
2018-07-17 21:04 ` [tarantool-patches] Re: [PATCH 0/5] Move FK constraints to server Vladislav Shpilevoy
2018-08-07 14:57 ` Kirill Yukhin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox