Tarantool development patches archive
 help / color / mirror / Atom feed
From: Nikita Pettik <korablev@tarantool.org>
To: tarantool-patches@freelists.org
Cc: v.shpilevoy@tarantool.org, Nikita Pettik <korablev@tarantool.org>
Subject: [tarantool-patches] [PATCH] sql: set names for constant fields within VIEW
Date: Tue,  4 Dec 2018 01:03:54 +0300	[thread overview]
Message-ID: <20181203220354.81845-1-korablev@tarantool.org> (raw)

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

             reply	other threads:[~2018-12-03 22:04 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-12-03 22:03 Nikita Pettik [this message]
     [not found] ` <2d3f83eb-b9db-23c8-b57e-cd79c954cae2@tarantool.org>
2018-12-07 15:02   ` [tarantool-patches] " n.pettik
2018-12-08 12:18     ` Vladislav Shpilevoy
2018-12-14  5:15 ` Kirill Yukhin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20181203220354.81845-1-korablev@tarantool.org \
    --to=korablev@tarantool.org \
    --cc=tarantool-patches@freelists.org \
    --cc=v.shpilevoy@tarantool.org \
    --subject='Re: [tarantool-patches] [PATCH] sql: set names for constant fields within VIEW' \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox