[tarantool-patches] Re: [PATCH] sql: add check for <WITH> absence in <CREATE VIEW>
Roman Khabibov
roman.habibov at tarantool.org
Tue Aug 13 15:42:14 MSK 2019
> On Aug 9, 2019, at 18:15, n.pettik <korablev at tarantool.org> wrote:
>
>
>
>> On 2 Aug 2019, at 15:52, Roman Khabibov <roman.habibov at tarantool.org> wrote:
>>
>> Check that <CREATE VIEW> hasn't <WITH> after <AS>: "CREATE VIEW v
>> AS WITH ... SELECT ...". Throw error, if it has.
>
> What is the reason for that? I run example from ticket:
>
> tarantool> \set language sql
> tarantool> \set delimiter ;
>
> tarantool> CREATE TABLE ts (s1 INT PRIMARY KEY);
> tarantool> INSERT INTO ts VALUES (1);
> tarantool> WITH RECURSIVE w AS (
>> SELECT s1 FROM ts
>> UNION ALL
>> SELECT s1+1 FROM w WHERE s1 < 4)
>> SELECT * FROM w;
> tarantool> CREATE VIEW v AS WITH RECURSIVE w AS (
>> SELECT s1 FROM ts
>> UNION ALL
>> SELECT s1+1 FROM w WHERE s1 < 4)
>> SELECT * FROM w;
> - null
> - Space 'W' does not exist
> ...
>
> So, it fails at the stage of view creation. Please, ask Peter
> to provide valid example. Otherwise there’s no problem and
> issue can be closed.
>
https://github.com/tarantool/tarantool/issues/4149#issuecomment-520390204
> This looks like a crutch. Please, either find out if it is
> possible to fix this at parser level (changing grammar),
> or simply close issue.
Yes, now it’s one-line fix, but error isn't so detailed.
But now it's a syntax error, as was required in the ticket.
commit e311d35bd64422bf6468b28a28057d9045817eca
Author: Roman Khabibov <roman.habibov at tarantool.org>
Date: Mon Jul 29 18:00:34 2019 +0300
sql: disallow <WITH> in <CREATE VIEW> select
We don't support queries with the syntax:
"CREATE VIEW v AS WITH ... SELECT ..."
Throw the syntax error in this case.
Closes #4149
diff --git a/src/box/sql/parse.y b/src/box/sql/parse.y
index 4c9d95f9c..d9ce239ca 100644
--- a/src/box/sql/parse.y
+++ b/src/box/sql/parse.y
@@ -399,7 +399,7 @@ ifexists(A) ::= . {A = 0;}
///////////////////// The CREATE VIEW statement /////////////////////////////
//
cmd ::= CREATE(X) VIEW ifnotexists(E) nm(Y) eidlist_opt(C)
- AS select(S). {
+ AS selectnowith(S). {
if (!pParse->parse_only) {
create_view_def_init(&pParse->create_view_def, &Y, &X, C, S, E);
pParse->initiateTTrans = true;
diff --git a/test/sql-tap/view.test.lua b/test/sql-tap/view.test.lua
index 101f4c3e7..cdba27e04 100755
--- a/test/sql-tap/view.test.lua
+++ b/test/sql-tap/view.test.lua
@@ -1,6 +1,6 @@
#!/usr/bin/env tarantool
test = require("sqltester")
-test:plan(73)
+test:plan(76)
--!./tcltestrunner.lua
-- 2002 February 26
@@ -1233,4 +1233,39 @@ test:do_catchsql_test(
-- </view-23.8>
})
+-- gh-4149: Check error message for
+-- "CREATE VIEW v AS WITH ... SELECT ...".
+test:do_execsql_test(
+ "view-24.1",
+ [[
+ CREATE TABLE ts (s1 INT PRIMARY KEY);
+ INSERT INTO ts VALUES (1);
+ ]], {
+ -- <view-24.1>
+ -- </view-24.1>
+ })
+
+test:do_catchsql_test(
+ "view-24.2",
+ [[
+ CREATE VIEW v AS WITH RECURSIVE w AS (
+ SELECT s1 FROM ts
+ UNION ALL
+ SELECT s1+1 FROM w WHERE s1 < 4)
+ SELECT * FROM w;
+ ]], {
+ -- <view-24.2>
+ 1,"Keyword 'WITH' is reserved. Please use double quotes if 'WITH' is an identifier."
+ -- </view-24.2>
+ })
+
+test:do_execsql_test(
+ "view-24.3",
+ [[
+ DROP TABLE ts
+ ]], {
+ -- <view-24.3>
+ -- </view-24.3>
+ })
+
test:finish_test()
More information about the Tarantool-patches
mailing list