On 04/02/2019 18:28, n.pettik wrote:
On 4 Feb 2019, at 17:44, Ivan Koptelov <ivan.koptelov@tarantool.org> wrote:
Adds error raise in case of CHECK constraint declared with ON
CONFLICT REPLACE action. Before the patch such option was
forbidden, but if a user tried to create space with such constraint,
this attempt failed silently.
What is more, now all on conflict actions are ignored for check
constraints. So lets simply fix parser to disallow this clause.
It is quite easy: all you need is to remove onconf rule after CHECK
keyword:
319 tcons ::= CHECK LP expr(E) RP onconf.
320 {sql_add_check_constraint(pParse,&E);}
Thank you for the idea, done.
--
src/box/sql/parse.y | 2 +-
test/sql-tap/check.test.lua | 37 ++++++++++++++++++++++++++++++++++++-
2 files changed, 37 insertions(+), 2 deletions(-)
diff --git a/src/box/sql/parse.y b/src/box/sql/parse.y
index 8e21b6fca..a5fe7c0a7 100644
--- a/src/box/sql/parse.y
+++ b/src/box/sql/parse.y
@@ -316,7 +316,7 @@ tcons ::= UNIQUE LP sortlist(X) RP.
{sql_create_index(pParse,0,0,X,0,
SORT_ORDER_ASC,false,
SQL_INDEX_TYPE_CONSTRAINT_UNIQUE);}
-tcons ::= CHECK LP expr(E) RP onconf.
+tcons ::= CHECK LP expr(E) RP .
{sql_add_check_constraint(pParse,&E);}
tcons ::= FOREIGN KEY LP eidlist(FA) RP
REFERENCES nm(T) eidlist_opt(TA) refargs(R) defer_subclause_opt(D). {
diff --git a/test/sql-tap/check.test.lua b/test/sql-tap/check.test.lua
index 1f369fb02..7960204bc 100755
--- a/test/sql-tap/check.test.lua
+++ b/test/sql-tap/check.test.lua
@@ -1,6 +1,6 @@
#!/usr/bin/env tarantool
test = require("sqltester")
-test:plan(58)
+test:plan(61)
--!./tcltestrunner.lua
-- 2005 November 2
@@ -772,5 +772,40 @@ test:do_execsql_test(
-- </8.1>
})
+-- gh-3345 : the test checks that ON CONFLICT REPLACE
+-- is not allowed for CHECK constraint.
+test:do_catchsql_test(
+ 9.1,
+ [[
+ CREATE TABLE t101 (a INT primary key, b INT, CHECK(b < 10)
+ ON CONFLICT REPLACE)
+ ]], {
+ -- <9.1>
+ 1, "keyword \"ON\" is reserved"
+ -- </9.1>
+ })
+
+test:do_catchsql_test(
+ 9.2,
+ [[
+ CREATE TABLE t101 (a INT primary key, b INT, CHECK(b < 10)
+ ON CONFLICT ABORT)
+ ]], {
+ -- <9.2>
+ 1, "keyword \"ON\" is reserved"
+ -- </9.2>
+ })
+
+test:do_catchsql_test(
+ 9.3,
+ [[
+ CREATE TABLE t101 (a INT primary key, b INT, CHECK(b < 10)
+ ON CONFLICT ROLLBACK)
+ ]], {
+ -- <9.3>
+ 1, "keyword \"ON\" is reserved"
+ -- </9.3>
+ })
+
test:finish_test()
--
2.14.3 (Apple Git-98)