From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from localhost (localhost [127.0.0.1]) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTP id 11BF92215D for ; Mon, 4 Feb 2019 12:05:37 -0500 (EST) Received: from turing.freelists.org ([127.0.0.1]) by localhost (turing.freelists.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id qfdAlWgO_F9B for ; Mon, 4 Feb 2019 12:05:36 -0500 (EST) Received: from smtpng3.m.smailru.net (smtpng3.m.smailru.net [94.100.177.149]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTPS id 54C752162A for ; Mon, 4 Feb 2019 12:05:36 -0500 (EST) Received: by smtpng3.m.smailru.net with esmtpa (envelope-from ) id 1gqhgc-0004RH-Bj for tarantool-patches@freelists.org; Mon, 04 Feb 2019 20:05:34 +0300 Subject: [tarantool-patches] Re: [PATCH] sql: raise err on CHECK + ON CONFLICT REPLACE References: <821d032b-9adf-6496-c0bc-f0f9497c5f83@tarantool.org> From: Ivan Koptelov Message-ID: Date: Mon, 4 Feb 2019 20:05:33 +0300 MIME-Version: 1.0 In-Reply-To: <821d032b-9adf-6496-c0bc-f0f9497c5f83@tarantool.org> Content-Type: text/html; charset=utf-8 Content-Language: en-GB Content-Transfer-Encoding: 7bit Sender: tarantool-patches-bounce@freelists.org Errors-to: tarantool-patches-bounce@freelists.org Reply-To: tarantool-patches@freelists.org List-help: List-unsubscribe: List-software: Ecartis version 1.0.0 List-Id: tarantool-patches List-subscribe: List-owner: List-post: List-archive: To: tarantool-patches@freelists.org

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)