tdf#126268: first byte is not used for the sign symbol

This code is just broken, negative numbers and positive
numbers above 25 are incorrectly migrated if using decimal.
E.g:
-1 -> 24,6
26 -> -6527'6

thus, delete it and pass the 8 bytes as they are to
lcl_double_dabble.

Note: this only fixes the positive numbers,
-1 still returns 24,6

Code introduced in 6039d2463b

Change-Id: Id0e249e47a91b274a247fb7e8b71353114149650
Reviewed-on: https://gerrit.libreoffice.org/75375
Tested-by: Jenkins
Reviewed-by: Lionel Elie Mamane <lionel@mamane.lu>
Reviewed-by: Xisco Faulí <xiscofauli@libreoffice.org>
This commit is contained in:
Xisco Fauli
2019-07-11 15:23:17 +02:00
committed by Xisco Faulí
parent 721cef392f
commit 2e26ef34bf
5 changed files with 194 additions and 19 deletions
+107
View File
@@ -0,0 +1,107 @@
# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
#
# This file is part of the LibreOffice project.
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
$(eval $(call gb_CppunitTest_CppunitTest,dbaccess_tdf126268))
$(eval $(call gb_CppunitTest_add_exception_objects,dbaccess_tdf126268, \
dbaccess/qa/unit/tdf126268 \
))
$(eval $(call gb_CppunitTest_use_libraries,dbaccess_tdf126268, \
basegfx \
comphelper \
cppu \
cppuhelper \
dba \
dbahsql \
dbu \
sdbt \
drawinglayer \
editeng \
for \
forui \
i18nlangtag \
msfilter \
oox \
sal \
salhelper \
sax \
sb \
sfx \
sot \
svl \
svt \
svx \
svxcore \
test \
subsequenttest \
tl \
tk \
ucbhelper \
unotest \
utl \
vbahelper \
vcl \
xo \
))
$(eval $(call gb_CppunitTest_use_ure,dbaccess_tdf126268))
$(eval $(call gb_CppunitTest_use_vcl,dbaccess_tdf126268))
$(eval $(call gb_CppunitTest_set_include,dbaccess_tdf126268,\
-I$(SRCDIR)/dbaccess/source/filter/hsqldb \
$$(INCLUDE) \
))
$(eval $(call gb_CppunitTest_use_api,dbaccess_tdf126268,\
offapi \
oovbaapi \
udkapi \
))
$(eval $(call gb_CppunitTest_use_components,dbaccess_tdf126268,\
basic/util/sb \
comphelper/util/comphelp \
configmgr/source/configmgr \
connectivity/source/drivers/hsqldb/hsqldb \
connectivity/source/drivers/firebird/firebird_sdbc \
connectivity/source/manager/sdbc2 \
dbaccess/util/dba \
dbaccess/util/dbu \
dbaccess/util/sdbt \
dbaccess/source/filter/xml/dbaxml \
filter/source/config/cache/filterconfig1 \
forms/util/frm \
framework/util/fwk \
i18npool/util/i18npool \
linguistic/source/lng \
oox/util/oox \
package/source/xstor/xstor \
package/util/package2 \
sax/source/expatwrap/expwrap \
scripting/source/basprov/basprov \
scripting/util/scriptframe \
sfx2/util/sfx \
sot/util/sot \
svl/source/fsstor/fsstorage \
svl/util/svl \
toolkit/util/tk \
ucb/source/core/ucb1 \
ucb/source/ucp/file/ucpfile1 \
ucb/source/ucp/tdoc/ucptdoc1 \
unotools/util/utl \
unoxml/source/rdf/unordf \
unoxml/source/service/unoxml \
uui/util/uui \
xmloff/util/xo \
))
$(eval $(call gb_CppunitTest_use_configuration,dbaccess_tdf126268))
# vim: set noet sw=4 ts=4:
+1
View File
@@ -37,6 +37,7 @@ ifeq ($(ENABLE_FIREBIRD_SDBC),TRUE)
$(eval $(call gb_Module_add_check_targets,dbaccess,\
$(if $(ENABLE_JAVA),CppunitTest_dbaccess_hsqlbinary_import) \
$(if $(ENABLE_JAVA),CppunitTest_dbaccess_tdf119625) \
$(if $(ENABLE_JAVA),CppunitTest_dbaccess_tdf126268) \
))
# remove if we have a be file for this
Binary file not shown.
+85
View File
@@ -0,0 +1,85 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#include "dbtest_base.cxx"
#include <hsqlimport.hxx>
#include <osl/process.h>
#include <cppunit/plugin/TestPlugIn.h>
#include <com/sun/star/sdbc/DataType.hpp>
#include <com/sun/star/sdbc/XRow.hpp>
#include <cppunit/TestFixture.h>
#include <cppunit/extensions/HelperMacros.h>
#include <test/unoapi_test.hxx>
#include <svtools/miscopt.hxx>
using namespace dbahsql;
class Tdf126268Test : public DBTestBase
{
public:
void testNumbers();
virtual void setUp() override;
CPPUNIT_TEST_SUITE(Tdf126268Test);
CPPUNIT_TEST(testNumbers);
CPPUNIT_TEST_SUITE_END();
};
void Tdf126268Test::setUp()
{
DBTestBase::setUp();
SvtMiscOptions aMiscOptions;
osl_setEnvironment(OUString{ "DBACCESS_HSQL_MIGRATION" }.pData, OUString{ "1" }.pData);
}
struct expect_t
{
sal_Int16 id;
OUString number;
};
static const expect_t expect[]
= { { 1, "0.00" }, { 2, "25.00" }, { 3, "26.00" }, { 4, "30.4" }, { 5, "45.8" } };
void Tdf126268Test::testNumbers()
{
// the migration requires the file to be writable
utl::TempFile const temp(createTempCopy("tdf126268.odb"));
uno::Reference<XOfficeDatabaseDocument> const xDocument = getDocumentForUrl(temp.GetURL());
uno::Reference<XConnection> xConnection = getConnectionForDocument(xDocument);
// select basically everything from the .odb
uno::Reference<XStatement> statement = xConnection->createStatement();
const OUString sql{ "SELECT ID, Column1, Column2 FROM tableTest ORDER BY ID" };
uno::Reference<XResultSet> xRes = statement->executeQuery(sql);
uno::Reference<XRow> xRow(xRes, UNO_QUERY_THROW);
// check result
for (auto& e : expect)
{
CPPUNIT_ASSERT(xRes->next());
CPPUNIT_ASSERT_EQUAL(e.id, xRow->getShort(1));
CPPUNIT_ASSERT_EQUAL(e.number, xRow->getString(2)); //decimal
CPPUNIT_ASSERT_EQUAL(e.number, xRow->getString(3)); //numeric
}
CPPUNIT_ASSERT(!xRes->next());
closeDocument(uno::Reference<lang::XComponent>(xDocument, uno::UNO_QUERY));
}
CPPUNIT_TEST_SUITE_REGISTRATION(Tdf126268Test);
CPPUNIT_PLUGIN_IMPLEMENT();
@@ -90,26 +90,8 @@ OUString lcl_makeStringFromBigint(const std::vector<sal_uInt8>& bytes)
{
std::vector<sal_uInt8> aBytes{ bytes };
OUStringBuffer sRet;
// two's complement
if (aBytes[0] == 1)
{
sRet.append("-");
for (auto& byte : aBytes)
byte = ~byte;
// add 1 to byte array
// FIXME e.g. 10000 valid ?
for (size_t i = aBytes.size() - 1; i != 0; --i)
{
aBytes[i] += 1;
if (aBytes[i] != 0)
break;
}
}
// convert binary to BCD
OUString sNum = lcl_double_dabble(aBytes);
sRet.append(sNum);
return sRet.makeStringAndClear();
return lcl_double_dabble(aBytes);
}
OUString lcl_putDot(const OUString& sNum, sal_Int32 nScale)