<HTML><BODY><br><br><br><blockquote style="border-left:1px solid #0857A6; margin:10px; padding:0 0 0 10px;">
        Понедельник, 21 мая 2018, 17:45 +03:00 от Vladislav Shpilevoy <v.shpilevoy@tarantool.org>:<br><br><div id=""><div class="js-helper js-readmsg-msg"><div><div id="style_15269139320000000802_BODY">Thanks for the patch! Looks like you did fix not all my comments from the<br>
previous review.<br><br>
On 21/05/2018 17:36, ImeevMA wrote:<br>
> Originally, SQLite3 execute queries with COLLATE after LIMIT like<br>
> "SELECT * FROM test LIMIT N COLLATE not_exist"<br>
> and queries without COLLATE like<br>
> "SELECT * FROM test LIMIT N"<br>
> the same way.<br>
> <br>
>  From this patch on queries with COLLATE after LIMIT<br>
> or OFFSET throws a syntax error.<br>
> <br>
> Closes #3010<br>
> ---<br>
>   src/box/sql/select.c        |  5 +++++<br>
>   test/sql/collation.result   | 41 +++++++++++++++++++++++++++++++++++++++++<br>
>   test/sql/collation.test.lua | 19 +++++++++++++++++++<br>
>   3 files changed, 65 insertions(+)<br>
>   create mode 100644 test/sql/collation.result<br>
>   create mode 100644 test/sql/collation.test.lua<br>
> <br>
> diff --git a/src/box/sql/select.c b/src/box/sql/select.c<br>
> index 29075d5..b11e688 100644<br>
> --- a/src/box/sql/select.c<br>
> +++ b/src/box/sql/select.c<br>
> @@ -1993,6 +1993,11 @@ computeLimitRegisters(Parse * pParse, Select * p, int iBreak)<br>
>    sqlite3ExprCacheClear(pParse);<br>
>    assert(p->pOffset == 0 || p->pLimit != 0);<br>
>    if (p->pLimit) {<br>
> +          if((p->pLimit->flags & EP_Collate) != 0 ||<br>
> +                                  (p->pOffset && (p->pOffset->flags & EP_Collate) != 0)) {<br>
> +                  sqlite3ErrorMsg(pParse, "near \"COLLATE\": syntax error");<br>
> +                  return;<br>
> +          }<br><br>
1. Still bad indentation.<br>
> diff --git a/test/sql/collation.result b/test/sql/collation.result<br>
> new file mode 100644<br>
> index 0000000..3a4f81f<br>
> --- /dev/null<br>
> +++ b/test/sql/collation.result</div></div></div></div></blockquote>Done.<br><blockquote style="border-left:1px solid #0857A6; margin:10px; padding:0 0 0 10px;"><div id=""><div class="js-helper js-readmsg-msg"><div><div id="style_15269139320000000802_BODY"><br><br>
2. Still no test on OFFSET ... COLLATE.<br><br></div></div></div></div></blockquote>In file test/sql/collation.test.lua lines 7-10.<br><br>commit 1ef0c67c409bf45d10adabbe8c9365c1437c626c<br>Author: ImeevMA <imeevma@tarantool.org><br>Date:   Mon May 21 16:21:57 2018 +0300<br><br>    sql: COLLATE after LIMIT throws an error<br>    <br>    Originally, SQLite3 execute queries with COLLATE after LIMIT like<br>    "SELECT * FROM test LIMIT N COLLATE not_exist"<br>    and queries without COLLATE like<br>    "SELECT * FROM test LIMIT N"<br>    the same way.<br>    <br>    From this patch on queries with COLLATE after LIMIT<br>    or OFFSET throws a syntax error.<br>    <br>    Closes #3010<br><br>diff --git a/src/box/sql/select.c b/src/box/sql/select.c<br>index 29075d5..7a77289 100644<br>--- a/src/box/sql/select.c<br>+++ b/src/box/sql/select.c<br>@@ -1993,6 +1993,11 @@ computeLimitRegisters(Parse * pParse, Select * p, int iBreak)<br>     sqlite3ExprCacheClear(pParse);<br>     assert(p->pOffset == 0 || p->pLimit != 0);<br>     if (p->pLimit) {<br>+        if((p->pLimit->flags & EP_Collate) != 0 ||<br>+           (p->pOffset && (p->pOffset->flags & EP_Collate) != 0)) {<br>+            sqlite3ErrorMsg(pParse, "near \"COLLATE\": syntax error");<br>+            return;<br>+        }<br>         p->iLimit = iLimit = ++pParse->nMem;<br>         v = sqlite3GetVdbe(pParse);<br>         assert(v != 0);<br>diff --git a/test/sql/collation.result b/test/sql/collation.result<br>new file mode 100644<br>index 0000000..3a4f81f<br>--- /dev/null<br>+++ b/test/sql/collation.result<br>@@ -0,0 +1,41 @@<br>+remote = require('net.box')<br>+---<br>+...<br>+-- gh-3010: COLLATE after LIMIT should throw an error<br>+-- All of these tests should throw error "near "COLLATE": syntax error"<br>+box.sql.execute("SELECT 1 LIMIT 1 COLLATE BINARY;")<br>+---<br>+- error: 'near "COLLATE": syntax error'<br>+...<br>+box.sql.execute("SELECT 1 LIMIT 1 COLLATE BINARY OFFSET 1;")<br>+---<br>+- error: 'near "COLLATE": syntax error'<br>+...<br>+box.sql.execute("SELECT 1 LIMIT 1 OFFSET 1 COLLATE BINARY;")<br>+---<br>+- error: 'near "COLLATE": syntax error'<br>+...<br>+box.sql.execute("SELECT 1 LIMIT 1, 1 COLLATE BINARY;")<br>+---<br>+- error: 'near "COLLATE": syntax error'<br>+...<br>+box.sql.execute("SELECT 1 LIMIT 1 COLLATE BINARY, 1;")<br>+---<br>+- error: 'near "COLLATE": syntax error'<br>+...<br>+box.schema.user.grant('guest','read,write,execute', 'universe')<br>+---<br>+...<br>+cn = remote.connect(box.cfg.listen)<br>+---<br>+...<br>+cn:execute('select 1 limit ? collate not_exist', {1})<br>+---<br>+- error: 'Failed to execute SQL statement: near "COLLATE": syntax error'<br>+...<br>+cn:close()<br>+---<br>+...<br>+box.schema.user.revoke('guest', 'read,write,execute', 'universe')<br>+---<br>+...<br>diff --git a/test/sql/collation.test.lua b/test/sql/collation.test.lua<br>new file mode 100644<br>index 0000000..fe8c1ba<br>--- /dev/null<br>+++ b/test/sql/collation.test.lua<br>@@ -0,0 +1,19 @@<br>+remote = require('net.box')<br>+<br>+-- gh-3010: COLLATE after LIMIT should throw an error<br>+<br>+-- All of these tests should throw error "near "COLLATE": syntax error"<br>+box.sql.execute("SELECT 1 LIMIT 1 COLLATE BINARY;")<br>+box.sql.execute("SELECT 1 LIMIT 1 COLLATE BINARY OFFSET 1;")<br>+box.sql.execute("SELECT 1 LIMIT 1 OFFSET 1 COLLATE BINARY;")<br>+box.sql.execute("SELECT 1 LIMIT 1, 1 COLLATE BINARY;")<br>+box.sql.execute("SELECT 1 LIMIT 1 COLLATE BINARY, 1;")<br>+<br>+<br>+box.schema.user.grant('guest','read,write,execute', 'universe')<br>+cn = remote.connect(box.cfg.listen)<br>+<br>+cn:execute('select 1 limit ? collate not_exist', {1})<br>+<br>+cn:close()<br>+box.schema.user.revoke('guest', 'read,write,execute', 'universe')<br><br><br></BODY></HTML>