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 5869B207A8 for ; Fri, 28 Jun 2019 11:34:26 -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 i_iy_yvRmrQd for ; Fri, 28 Jun 2019 11:34:26 -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 1305C20285 for ; Fri, 28 Jun 2019 11:34:25 -0400 (EDT) From: imeevma@tarantool.org Subject: [tarantool-patches] [PATCH v1 1/1] sql: Fix UPDATE for types unknown to SQL. Date: Fri, 28 Jun 2019 18:34:23 +0300 Message-Id: <132ca83597d0e9c2b4ef75bc8f0d03d22cdf27dd.1561736006.git.imeevma@gmail.com> 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 Before this patch, UPDATE throwed an error when executed on a tuple with types unknown to SQL. This patch fixes the problem in case the fields with unknown types are not updated. Closes #4189 --- https://github.com/tarantool/tarantool/issues/4189 https://github.com/tarantool/tarantool/tree/imeevma/gh-4189-field-type-conversion-error src/box/sql/vdbe.c | 25 +++++++++++++++++++++++++ test/sql/types.result | 43 +++++++++++++++++++++++++++++++++++++++++++ test/sql/types.test.lua | 17 +++++++++++++++++ 3 files changed, 85 insertions(+) diff --git a/src/box/sql/vdbe.c b/src/box/sql/vdbe.c index c8887f9..8ddc29d 100644 --- a/src/box/sql/vdbe.c +++ b/src/box/sql/vdbe.c @@ -294,6 +294,20 @@ mem_apply_numeric_type(struct Mem *record) * SCALAR: * Mem is unchanged, but flag is set to BLOB. * + * BOOLEAN: + * If memory holds BOOLEAN no actions take place. + * + * ANY: + * Mem is unchanged, no actions take place. + * + * MAP: + * If memory holds value with SQL_SUBTYPE_MSGPACK subtype and + * data has MP_MAP type, no actions take place. + * + * ARRAY: + * If memory holds value with SQL_SUBTYPE_MSGPACK subtype and + * data has MP_ARRAY type, no actions take place. + * * @param record The value to apply type to. * @param type The type to be applied. */ @@ -337,8 +351,19 @@ mem_apply_type(struct Mem *record, enum field_type type) } record->flags &= ~(MEM_Real | MEM_Int); return 0; + case FIELD_TYPE_ANY: case FIELD_TYPE_SCALAR: return 0; + case FIELD_TYPE_MAP: + if (record->subtype == SQL_SUBTYPE_MSGPACK && + mp_typeof(*record->z) == MP_MAP) + return 0; + return -1; + case FIELD_TYPE_ARRAY: + if (record->subtype == SQL_SUBTYPE_MSGPACK && + mp_typeof(*record->z) == MP_ARRAY) + return 0; + return -1; default: return -1; } diff --git a/test/sql/types.result b/test/sql/types.result index cdfb1e7..5cc7f16 100644 --- a/test/sql/types.result +++ b/test/sql/types.result @@ -966,3 +966,46 @@ box.execute('SELECT ?', {true}) rows: - [true] ... +-- +-- gh-4189: Update throws an error when executed on a tuple with +-- types unknown to SQL. +-- +format = {} +--- +... +format[1] = {type = 'integer', name = 'I'} +--- +... +format[2] = {type = 'boolean', name = 'B'} +--- +... +format[3] = {type = 'array', name = 'F1'} +--- +... +format[4] = {type = 'map', name = 'F2'} +--- +... +format[5] = {type = 'any', name = 'F3'} +--- +... +s = box.schema.space.create('T', {format = format}) +--- +... +ii = s:create_index('ii') +--- +... +s:insert({1, true, {1, 2}, {a = 3}, 'asd'}) +--- +- [1, true, [1, 2], {'a': 3}, 'asd'] +... +box.execute('UPDATE t SET b = false WHERE i = 1;') +--- +- row_count: 1 +... +s:select() +--- +- - [1, false, [1, 2], {'a': 3}, 'asd'] +... +s:drop() +--- +... diff --git a/test/sql/types.test.lua b/test/sql/types.test.lua index ae1a0ab..d33314a 100644 --- a/test/sql/types.test.lua +++ b/test/sql/types.test.lua @@ -234,3 +234,20 @@ box.execute('SELECT \'9223372036854\' + 1;') -- Fix BOOLEAN bindings. box.execute('SELECT ?', {true}) + +-- +-- gh-4189: Update throws an error when executed on a tuple with +-- types unknown to SQL. +-- +format = {} +format[1] = {type = 'integer', name = 'I'} +format[2] = {type = 'boolean', name = 'B'} +format[3] = {type = 'array', name = 'F1'} +format[4] = {type = 'map', name = 'F2'} +format[5] = {type = 'any', name = 'F3'} +s = box.schema.space.create('T', {format = format}) +ii = s:create_index('ii') +s:insert({1, true, {1, 2}, {a = 3}, 'asd'}) +box.execute('UPDATE t SET b = false WHERE i = 1;') +s:select() +s:drop() -- 2.7.4