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 6602D21FF7 for ; Mon, 21 May 2018 10:28:00 -0400 (EDT) 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 y5J5NqmSoDLq for ; Mon, 21 May 2018 10:28:00 -0400 (EDT) Received: from smtp46.i.mail.ru (smtp46.i.mail.ru [94.100.177.106]) (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 AFF9121F0B for ; Mon, 21 May 2018 10:27:59 -0400 (EDT) From: ImeevMA Subject: [tarantool-patches] [PATCH v2 1/1] sql: COLLATE after LIMIT throws an error Date: Mon, 21 May 2018 17:27:55 +0300 Message-Id: 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 Cc: ImeevMA Originally, SQLite3 execute queries with COLLATE after LIMIT like "SELECT * FROM test LIMIT N COLLATE not_exist" and queries without COLLATE like "SELECT * FROM test LIMIT N" the same way. Closes #3010 --- Branch: https://github.com/tarantool/tarantool/tree/gh-3010-COLLATE-after-LIMIT-throws-an-error Issue: https://github.com/tarantool/tarantool/issues/3010 src/box/sql/select.c | 5 +++++ test/sql/collation.result | 41 +++++++++++++++++++++++++++++++++++++++++ test/sql/collation.test.lua | 19 +++++++++++++++++++ 3 files changed, 65 insertions(+) create mode 100644 test/sql/collation.result create mode 100644 test/sql/collation.test.lua diff --git a/src/box/sql/select.c b/src/box/sql/select.c index 29075d5..b11e688 100644 --- a/src/box/sql/select.c +++ b/src/box/sql/select.c @@ -1993,6 +1993,11 @@ computeLimitRegisters(Parse * pParse, Select * p, int iBreak) sqlite3ExprCacheClear(pParse); assert(p->pOffset == 0 || p->pLimit != 0); if (p->pLimit) { + if((p->pLimit->flags & EP_Collate) != 0 || + (p->pOffset && (p->pOffset->flags & EP_Collate) != 0)) { + sqlite3ErrorMsg(pParse, "near \"COLLATE\": syntax error"); + return; + } p->iLimit = iLimit = ++pParse->nMem; v = sqlite3GetVdbe(pParse); assert(v != 0); diff --git a/test/sql/collation.result b/test/sql/collation.result new file mode 100644 index 0000000..3a4f81f --- /dev/null +++ b/test/sql/collation.result @@ -0,0 +1,41 @@ +remote = require('net.box') +--- +... +-- gh-3010: COLLATE after LIMIT should throw an error +-- All of these tests should throw error "near "COLLATE": syntax error" +box.sql.execute("SELECT 1 LIMIT 1 COLLATE BINARY;") +--- +- error: 'near "COLLATE": syntax error' +... +box.sql.execute("SELECT 1 LIMIT 1 COLLATE BINARY OFFSET 1;") +--- +- error: 'near "COLLATE": syntax error' +... +box.sql.execute("SELECT 1 LIMIT 1 OFFSET 1 COLLATE BINARY;") +--- +- error: 'near "COLLATE": syntax error' +... +box.sql.execute("SELECT 1 LIMIT 1, 1 COLLATE BINARY;") +--- +- error: 'near "COLLATE": syntax error' +... +box.sql.execute("SELECT 1 LIMIT 1 COLLATE BINARY, 1;") +--- +- error: 'near "COLLATE": syntax error' +... +box.schema.user.grant('guest','read,write,execute', 'universe') +--- +... +cn = remote.connect(box.cfg.listen) +--- +... +cn:execute('select 1 limit ? collate not_exist', {1}) +--- +- error: 'Failed to execute SQL statement: near "COLLATE": syntax error' +... +cn:close() +--- +... +box.schema.user.revoke('guest', 'read,write,execute', 'universe') +--- +... diff --git a/test/sql/collation.test.lua b/test/sql/collation.test.lua new file mode 100644 index 0000000..fe8c1ba --- /dev/null +++ b/test/sql/collation.test.lua @@ -0,0 +1,19 @@ +remote = require('net.box') + +-- gh-3010: COLLATE after LIMIT should throw an error + +-- All of these tests should throw error "near "COLLATE": syntax error" +box.sql.execute("SELECT 1 LIMIT 1 COLLATE BINARY;") +box.sql.execute("SELECT 1 LIMIT 1 COLLATE BINARY OFFSET 1;") +box.sql.execute("SELECT 1 LIMIT 1 OFFSET 1 COLLATE BINARY;") +box.sql.execute("SELECT 1 LIMIT 1, 1 COLLATE BINARY;") +box.sql.execute("SELECT 1 LIMIT 1 COLLATE BINARY, 1;") + + +box.schema.user.grant('guest','read,write,execute', 'universe') +cn = remote.connect(box.cfg.listen) + +cn:execute('select 1 limit ? collate not_exist', {1}) + +cn:close() +box.schema.user.revoke('guest', 'read,write,execute', 'universe') -- 2.7.4