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 9AF8522911 for ; Wed, 24 Jul 2019 04:12:05 -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 wqb8B51sGcNg for ; Wed, 24 Jul 2019 04:12:05 -0400 (EDT) Received: from smtpng2.m.smailru.net (smtpng2.m.smailru.net [94.100.179.3]) (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 56065228AE for ; Wed, 24 Jul 2019 04:12:05 -0400 (EDT) From: imeevma@tarantool.org Subject: [tarantool-patches] [PATCH v2 2/2] sql: fix error in case ARRAY/MAP converted to SCALAR Date: Wed, 24 Jul 2019 11:12:03 +0300 Message-Id: <67e721f4818f51861383cdf71cc88c63e45ab450.1563955619.git.imeevma@gmail.com> In-Reply-To: References: 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: korablev@tarantool.org Cc: tarantool-patches@freelists.org Since ARRAY and MAP cannot be converted to a scalar, this operation should throw an error. But when the error was throws from SQL, the error was unreadable. The reason for this is that the given array or map was not correctly converted to a string. This patch fixes the problem by printing an 'array' or 'map' in case of an error due to a conversion from ARRAY or MAP, respectively. For example: box.execute('CREATE TABLE t1(i INT PRIMARY KEY, a SCALAR);') format = {} format[1] = {type = 'integer', name = 'I'} format[2] = {type = 'array', name = 'A'} s = box.schema.space.create('T2', {format=format}) i = s:create_index('ii') s:insert({1, {1,2,3}}) box.execute('INSERT INTO t1 SELECT * FROM t2;') Should return: - error: 'Type mismatch: can not convert array to scalar' Follow-up #4189 --- src/box/sql/vdbe.c | 13 +++++++++-- test/sql/types.result | 62 +++++++++++++++++++++++++++++++++++++++++++++++++ test/sql/types.test.lua | 22 ++++++++++++++++++ 3 files changed, 95 insertions(+), 2 deletions(-) diff --git a/src/box/sql/vdbe.c b/src/box/sql/vdbe.c index 1200ff4..f6aaaa6 100644 --- a/src/box/sql/vdbe.c +++ b/src/box/sql/vdbe.c @@ -2704,8 +2704,17 @@ case OP_ApplyType: { assert(pIn1 <= &p->aMem[(p->nMem+1 - p->nCursor)]); assert(memIsValid(pIn1)); if (mem_apply_type(pIn1, type) != 0) { - diag_set(ClientError, ER_SQL_TYPE_MISMATCH, - sql_value_text(pIn1), + const char *value; + if ((pIn1->flags & MEM_Subtype) != 0 && + pIn1->subtype == SQL_SUBTYPE_MSGPACK) { + if (mp_typeof(*pIn1->z) == MP_MAP) + value = "map"; + else + value = "array"; + } else { + value = (const char *)sql_value_text(pIn1); + } + diag_set(ClientError, ER_SQL_TYPE_MISMATCH, value, field_type_strs[type]); goto abort_due_to_error; } diff --git a/test/sql/types.result b/test/sql/types.result index 0dba69f..61a760f 100644 --- a/test/sql/types.result +++ b/test/sql/types.result @@ -1153,3 +1153,65 @@ s:select() s:drop() --- ... +-- +-- Make sure that the array/map conversion to scalar error is +-- displayed correctly. +-- +box.execute('DROP TABLE IF EXISTS t1;') +--- +- row_count: 1 +... +box.execute('CREATE TABLE t1(i INT PRIMARY KEY AUTOINCREMENT, a SCALAR);') +--- +- row_count: 1 +... +format = {} +--- +... +format[1] = {type = 'integer', name = 'I'} +--- +... +format[2] = {type = 'array', name = 'A'} +--- +... +s = box.schema.space.create('T2', {format=format}) +--- +... +i = s:create_index('ii') +--- +... +s:insert({1, {1,2,3}}) +--- +- [1, [1, 2, 3]] +... +box.execute('INSERT INTO t1(a) SELECT a FROM t2;') +--- +- error: 'Type mismatch: can not convert array to scalar' +... +s:drop() +--- +... +format[2].type = 'map' +--- +... +s = box.schema.space.create('T2', {format=format}) +--- +... +i = s:create_index('ii') +--- +... +s:insert({1, {b = 1}}) +--- +- [1, {'b': 1}] +... +box.execute('INSERT INTO t1(a) SELECT a FROM t2;') +--- +- error: 'Type mismatch: can not convert map to scalar' +... +s:drop() +--- +... +box.execute('DROP TABLE t1;') +--- +- row_count: 1 +... diff --git a/test/sql/types.test.lua b/test/sql/types.test.lua index 22cb105..a99cc9f 100644 --- a/test/sql/types.test.lua +++ b/test/sql/types.test.lua @@ -291,3 +291,25 @@ s:insert({1, true, {1, 2}, {a = 3}, 'asd'}) box.execute('UPDATE t SET b = false WHERE i = 1;') s:select() s:drop() + +-- +-- Make sure that the array/map conversion to scalar error is +-- displayed correctly. +-- +box.execute('DROP TABLE IF EXISTS t1;') +box.execute('CREATE TABLE t1(i INT PRIMARY KEY AUTOINCREMENT, a SCALAR);') +format = {} +format[1] = {type = 'integer', name = 'I'} +format[2] = {type = 'array', name = 'A'} +s = box.schema.space.create('T2', {format=format}) +i = s:create_index('ii') +s:insert({1, {1,2,3}}) +box.execute('INSERT INTO t1(a) SELECT a FROM t2;') +s:drop() +format[2].type = 'map' +s = box.schema.space.create('T2', {format=format}) +i = s:create_index('ii') +s:insert({1, {b = 1}}) +box.execute('INSERT INTO t1(a) SELECT a FROM t2;') +s:drop() +box.execute('DROP TABLE t1;') -- 2.7.4