<HTML><BODY><br><br><br><blockquote style="border-left:1px solid #0857A6; margin:10px; padding:0 0 0 10px;">
        Понедельник, 21 мая 2018, 18:27 +03:00 от Vladislav Shpilevoy <v.shpilevoy@tarantool.org>:<br><br><div id=""><div class="js-helper js-readmsg-msg"><div><div id="style_15269164670000000324_BODY">Thanks a lot!<br><br>
But please, apply this diff:<br><br>
diff --git a/src/box/sql/select.c b/src/box/sql/select.c<br>
index 7a7728992..0b610dca7 100644<br>
--- a/src/box/sql/select.c<br>
+++ b/src/box/sql/select.c<br>
@@ -1994,8 +1994,10 @@ computeLimitRegisters(Parse * pParse, Select * p, int iBreak)<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>
+                  (p->pOffset != NULL &&<br>
+                   (p->pOffset->flags & EP_Collate) != 0)) {<br>
+                       sqlite3ErrorMsg(pParse, "near \"COLLATE\": "\<br>
+                                       "syntax error");<br>
                      return;<br>
              }<br>
              p->iLimit = iLimit = ++pParse->nMem;<br><br>
In your patch sqlite3ErrorMsg was out of 80 symbols, and pointer p->pOffset must be checked<br>
on != NULL explicitly. (I see, that other SQLite3 code does not this, but we will fix<br>
this gradually).</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_15269164670000000324_BODY"><br><br>
After this the patch LGTM.<br><br></div></div></div></div></blockquote>
<br>
commit 8ae83069671e7384c70523f4eda201d4815dba26<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..fc1da27 100644<br>--- a/src/box/sql/select.c<br>+++ b/src/box/sql/select.c<br>@@ -1993,6 +1993,13 @@ 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 != NULL &&<br>+           (p->pOffset->flags & EP_Collate) != 0)) {<br>+            sqlite3ErrorMsg(pParse, "near \"COLLATE\": "\<br>+                        "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>