From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp58.i.mail.ru (smtp58.i.mail.ru [217.69.128.38]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dev.tarantool.org (Postfix) with ESMTPS id D666746970E for ; Wed, 5 Feb 2020 01:53:49 +0300 (MSK) From: Vladislav Shpilevoy Date: Tue, 4 Feb 2020 23:53:43 +0100 Message-Id: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [Tarantool-patches] [PATCH v2 0/4] Don't truncate float in update List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: tarantool-patches@dev.tarantool.org, kostja.osipov@gmail.com, imun@tarantool.org, korablev@tarantool.org The patchset fixes float value truncation in tuple/space:update/upsert. First commit fixes the actual issue, but introduces another bug that a float value can be stored into a field having double type in its format. The rest 3 commits fix this new bug. However, there is an alternative how these 3 could be done. My solution is that I calculate the result types in xrow_update_*_store() functions. Because of that I don't know the types during xrow_update_*_sizeof(), and it needs to return the maximal possible size instead of exact size. The alternative is to calculate types during sizeof. It would allow to return the exact size. But it also would complicate the code. I can implement this option if it looks better. Branch: http://github.com/tarantool/tarantool/tree/gerold103/gh-4701-update-float-truncate Issue: https://github.com/tarantool/tarantool/issues/4701 Changes in V2: - Taken into account, that a field may have double type in its tuple format, and can't store floats at all. Vladislav Shpilevoy (4): tuple: don't truncate float in :update() tuple: pass tuple format to xrow_update_*_store() tuple: allow xrow_update sizeof reserve more memory tuple: use field type in update of a float/double src/box/lua/tuple.c | 2 +- src/box/memtx_space.c | 7 ++- src/box/session_settings.c | 2 +- src/box/space.c | 6 +-- src/box/tuple.c | 4 +- src/box/vinyl.c | 9 ++-- src/box/vy_upsert.c | 4 +- src/box/xrow_update.c | 43 +++++++++------ src/box/xrow_update.h | 10 ++-- src/box/xrow_update_array.c | 50 ++++++++++++----- src/box/xrow_update_bar.c | 13 +++-- src/box/xrow_update_field.c | 102 ++++++++++++++++++++++++----------- src/box/xrow_update_field.h | 22 +++++--- src/box/xrow_update_map.c | 34 ++++++++++-- src/box/xrow_update_route.c | 13 +++-- test/box/update.result | 103 ++++++++++++++++++++++++++++++++++++ test/box/update.test.lua | 62 ++++++++++++++++++++++ test/unit/column_mask.c | 4 +- 18 files changed, 388 insertions(+), 102 deletions(-) -- 2.21.1 (Apple Git-122.3)