diff options
author | Xisco Fauli <xiscofauli@libreoffice.org> | 2019-07-10 19:06:13 +0200 |
---|---|---|
committer | Xisco Faulí <xiscofauli@libreoffice.org> | 2019-07-11 15:23:17 +0200 |
commit | 2e26ef34bf1a2e5d1293e45cf3b1415d9514b056 (patch) | |
tree | 105bbaaaa82e6c0641b09bafed19034b3d7e0ddb /dbaccess | |
parent | 721cef392f301321a632a1d9286d57cd45335649 (diff) |
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 6039d2463b4cc503b963811b3b1471de3291ee09
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>
Diffstat (limited to 'dbaccess')
-rw-r--r-- | dbaccess/CppunitTest_dbaccess_tdf126268.mk | 107 | ||||
-rw-r--r-- | dbaccess/Module_dbaccess.mk | 1 | ||||
-rw-r--r-- | dbaccess/qa/unit/data/tdf126268.odb | bin | 0 -> 4877 bytes | |||
-rw-r--r-- | dbaccess/qa/unit/tdf126268.cxx | 85 | ||||
-rw-r--r-- | dbaccess/source/filter/hsqldb/rowinputbinary.cxx | 20 |
5 files changed, 194 insertions, 19 deletions
diff --git a/dbaccess/CppunitTest_dbaccess_tdf126268.mk b/dbaccess/CppunitTest_dbaccess_tdf126268.mk new file mode 100644 index 000000000000..379e2f27433b --- /dev/null +++ b/dbaccess/CppunitTest_dbaccess_tdf126268.mk @@ -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: diff --git a/dbaccess/Module_dbaccess.mk b/dbaccess/Module_dbaccess.mk index a45acd3af2f4..0a66d5fe7586 100644 --- a/dbaccess/Module_dbaccess.mk +++ b/dbaccess/Module_dbaccess.mk @@ -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 diff --git a/dbaccess/qa/unit/data/tdf126268.odb b/dbaccess/qa/unit/data/tdf126268.odb Binary files differnew file mode 100644 index 000000000000..ffd00c140791 --- /dev/null +++ b/dbaccess/qa/unit/data/tdf126268.odb diff --git a/dbaccess/qa/unit/tdf126268.cxx b/dbaccess/qa/unit/tdf126268.cxx new file mode 100644 index 000000000000..967d5e671ff0 --- /dev/null +++ b/dbaccess/qa/unit/tdf126268.cxx @@ -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(); diff --git a/dbaccess/source/filter/hsqldb/rowinputbinary.cxx b/dbaccess/source/filter/hsqldb/rowinputbinary.cxx index 24448f627971..a12ab0513abf 100644 --- a/dbaccess/source/filter/hsqldb/rowinputbinary.cxx +++ b/dbaccess/source/filter/hsqldb/rowinputbinary.cxx @@ -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) |