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 93C992F316 for ; Mon, 3 Dec 2018 17:04:00 -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 cH2J5aSoMwd3 for ; Mon, 3 Dec 2018 17:04:00 -0500 (EST) Received: from smtp33.i.mail.ru (smtp33.i.mail.ru [94.100.177.93]) (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 514052F300 for ; Mon, 3 Dec 2018 17:04:00 -0500 (EST) From: Nikita Pettik Subject: [tarantool-patches] [PATCH] sql: set names for constant fields within VIEW Date: Tue, 4 Dec 2018 01:03:54 +0300 Message-Id: <20181203220354.81845-1-korablev@tarantool.org> 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: v.shpilevoy@tarantool.org, Nikita Pettik If VIEW contains constant fields (e.g. CREATE VIEW v AS SELECT 1, 'k';) it uses string representation of literal as a field name. In the example above it would be '1' and 'k'. However, if VIEW is created using AS VALUES syntax, then expressions representing constant literals lack of names (since span-expression is not assigned in this case). Lets generate names for all fields which lack names for VIEW. Closes #3849 --- Branch: https://github.com/tarantool/tarantool/commits/np/gh-3849-view-constant-value-v2 Issue: https://github.com/tarantool/tarantool/issues/3849 src/box/sql/select.c | 4 ++-- test/sql/view.result | 26 ++++++++++++++++++++++++++ test/sql/view.test.lua | 11 +++++++++++ 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/box/sql/select.c b/src/box/sql/select.c index ca709b44f..839224131 100644 --- a/src/box/sql/select.c +++ b/src/box/sql/select.c @@ -1871,6 +1871,8 @@ sqlite3ColumnsFromExprList(Parse * parse, ExprList * expr_list, Table *table) zName = expr_list->a[i].zSpan; } } + if (zName == NULL) + zName = "__auto-fld"; zName = sqlite3MPrintf(db, "%s", zName); /* Make sure the column name is unique. If the name is not unique, @@ -1888,8 +1890,6 @@ sqlite3ColumnsFromExprList(Parse * parse, ExprList * expr_list, Table *table) } zName = sqlite3MPrintf(db, "%.*z:%u", nName, zName, ++cnt); - if (cnt > 3) - sqlite3_randomness(sizeof(cnt), &cnt); } size_t name_len = strlen(zName); void *field = &table->def->fields[i]; diff --git a/test/sql/view.result b/test/sql/view.result index b211bcb2e..818227741 100644 --- a/test/sql/view.result +++ b/test/sql/view.result @@ -148,6 +148,32 @@ box.sql.execute("DROP VIEW v2;"); box.sql.execute("DROP TABLE t2;"); --- ... +-- gh-3849: failed to create VIEW in form of AS VALUES (const); +-- +box.sql.execute("CREATE VIEW cv AS VALUES(1);") +--- +... +box.sql.execute("CREATE VIEW cv1 AS VALUES('k', 1);") +--- +... +box.sql.execute("CREATE VIEW cv2 AS VALUES((VALUES((SELECT 1))));") +--- +... +box.sql.execute("CREATE VIEW cv3 AS VALUES(1+2, 1+2);") +--- +... +box.sql.execute("DROP VIEW cv;") +--- +... +box.sql.execute("DROP VIEW cv1;") +--- +... +box.sql.execute("DROP VIEW cv2;") +--- +... +box.sql.execute("DROP VIEW cv3;") +--- +... -- Cleanup box.sql.execute("DROP VIEW v1;"); --- diff --git a/test/sql/view.test.lua b/test/sql/view.test.lua index a6269a1bf..489eb4862 100644 --- a/test/sql/view.test.lua +++ b/test/sql/view.test.lua @@ -65,6 +65,17 @@ box.sql.execute("DROP TABLE t2;"); box.sql.execute("DROP VIEW v2;"); box.sql.execute("DROP TABLE t2;"); +-- gh-3849: failed to create VIEW in form of AS VALUES (const); +-- +box.sql.execute("CREATE VIEW cv AS VALUES(1);") +box.sql.execute("CREATE VIEW cv1 AS VALUES('k', 1);") +box.sql.execute("CREATE VIEW cv2 AS VALUES((VALUES((SELECT 1))));") +box.sql.execute("CREATE VIEW cv3 AS VALUES(1+2, 1+2);") +box.sql.execute("DROP VIEW cv;") +box.sql.execute("DROP VIEW cv1;") +box.sql.execute("DROP VIEW cv2;") +box.sql.execute("DROP VIEW cv3;") + -- Cleanup box.sql.execute("DROP VIEW v1;"); box.sql.execute("DROP TABLE t1;"); -- 2.15.1