diff options
author | Kohei Yoshida <kohei.yoshida@collabora.com> | 2016-11-07 22:43:10 -0500 |
---|---|---|
committer | Kohei Yoshida <libreoffice@kohei.us> | 2016-11-08 14:25:03 +0000 |
commit | 2573f6bba6b3033143b776650f03fd4813669e5b (patch) | |
tree | 9cf24f295080d4c9797e2d3d9ed45fed68f0ce24 /sc | |
parent | 51663ac544b5ac2a20e21909c6fc6b1b6447fafd (diff) |
Ensure that the string array is null when no strings present.
It was intended this way from day one, but the implementation
didn't live up to that promise...
Change-Id: I231ddc8923fdd8a205127c6a3214dd93f13378b9
Reviewed-on: https://gerrit.libreoffice.org/30678
Reviewed-by: Kohei Yoshida <libreoffice@kohei.us>
Tested-by: Kohei Yoshida <libreoffice@kohei.us>
Diffstat (limited to 'sc')
-rw-r--r-- | sc/qa/unit/ucalc_formula.cxx | 37 | ||||
-rw-r--r-- | sc/source/core/data/column2.cxx | 21 |
2 files changed, 51 insertions, 7 deletions
diff --git a/sc/qa/unit/ucalc_formula.cxx b/sc/qa/unit/ucalc_formula.cxx index b572c54024c9..cb4b3f4128e1 100644 --- a/sc/qa/unit/ucalc_formula.cxx +++ b/sc/qa/unit/ucalc_formula.cxx @@ -736,6 +736,43 @@ void Test::testFetchVectorRefArray() CPPUNIT_ASSERT(rtl::math::isNan(aArray.mpNumericArray[1])); CPPUNIT_ASSERT(rtl::math::isNan(aArray.mpNumericArray[2])); + // The column begins with a string header at row 1 (Column C). + m_pDoc->SetString(ScAddress(2,0,0), "MyHeader"); + for (SCROW i = 1; i <= 9; ++i) // rows 2-10 are numeric. + m_pDoc->SetValue(ScAddress(2,i,0), i); + + aArray = m_pDoc->FetchVectorRefArray(ScAddress(2,1,0), 9); // C2:C10 + CPPUNIT_ASSERT_MESSAGE("Array should have a numeric array.", aArray.mpNumericArray); + CPPUNIT_ASSERT_MESSAGE("Array should NOT have a string array.", !aArray.mpStringArray); + for (size_t i = 0; i < 9; ++i) + CPPUNIT_ASSERT_EQUAL(double(i+1), aArray.mpNumericArray[i]); + + // The column begins with a number, followed by a string then followed by + // a block of numbers (Column D). + m_pDoc->SetValue(ScAddress(3,0,0), 0.0); + m_pDoc->SetString(ScAddress(3,1,0), "Some string"); + for (SCROW i = 2; i <= 9; ++i) // rows 3-10 are numeric. + m_pDoc->SetValue(ScAddress(3,i,0), i); + + aArray = m_pDoc->FetchVectorRefArray(ScAddress(3,2,0), 8); // D3:D10 + CPPUNIT_ASSERT_MESSAGE("Array should have a numeric array.", aArray.mpNumericArray); + CPPUNIT_ASSERT_MESSAGE("Array should NOT have a string array.", !aArray.mpStringArray); + for (size_t i = 0; i < 8; ++i) + CPPUNIT_ASSERT_EQUAL(double(i+2), aArray.mpNumericArray[i]); + + // The column begins with a formula, followed by a string then followed by + // a block of numbers (Column E). + m_pDoc->SetString(ScAddress(4,0,0), "=1*2"); + m_pDoc->SetString(ScAddress(4,1,0), "Some string"); + for (SCROW i = 2; i <= 9; ++i) // rows 3-10 are numeric. + m_pDoc->SetValue(ScAddress(4,i,0), i*2); + + aArray = m_pDoc->FetchVectorRefArray(ScAddress(4,2,0), 8); // E3:E10 + CPPUNIT_ASSERT_MESSAGE("Array should have a numeric array.", aArray.mpNumericArray); + CPPUNIT_ASSERT_MESSAGE("Array should NOT have a string array.", !aArray.mpStringArray); + for (size_t i = 0; i < 8; ++i) + CPPUNIT_ASSERT_EQUAL(double((i+2)*2), aArray.mpNumericArray[i]); + m_pDoc->DeleteTab(0); } diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx index c5e136b0f7f2..581607e9475d 100644 --- a/sc/source/core/data/column2.cxx +++ b/sc/source/core/data/column2.cxx @@ -2628,10 +2628,11 @@ formula::VectorRefArray ScColumn::FetchVectorRefArray( SCROW nRow1, SCROW nRow2 if (!appendToBlock(pDocument, rCxt, *pColArray, nPos, nRow2+1, itBlk, maCells.end())) return formula::VectorRefArray(formula::VectorRefArray::Invalid); - if (pColArray->mpStrArray) - return formula::VectorRefArray(&(*pColArray->mpNumArray)[nRow1], &(*pColArray->mpStrArray)[nRow1]); - else - return formula::VectorRefArray(&(*pColArray->mpNumArray)[nRow1]); + rtl_uString** pStr = nullptr; + if (pColArray->mpStrArray && hasNonEmpty(*pColArray->mpStrArray, nRow1, nRow2)) + pStr = &(*pColArray->mpStrArray)[nRow1]; + + return formula::VectorRefArray(&(*pColArray->mpNumArray)[nRow1], pStr); } break; case sc::element_type_string: @@ -2660,10 +2661,16 @@ formula::VectorRefArray ScColumn::FetchVectorRefArray( SCROW nRow1, SCROW nRow2 if (!appendToBlock(pDocument, rCxt, *pColArray, nPos, nRow2+1, itBlk, maCells.end())) return formula::VectorRefArray(formula::VectorRefArray::Invalid); + assert(pColArray->mpStrArray); + + rtl_uString** pStr = nullptr; + if (hasNonEmpty(*pColArray->mpStrArray, nRow1, nRow2)) + pStr = &(*pColArray->mpStrArray)[nRow1]; + if (pColArray->mpNumArray) - return formula::VectorRefArray(&(*pColArray->mpNumArray)[nRow1], &(*pColArray->mpStrArray)[nRow1]); + return formula::VectorRefArray(&(*pColArray->mpNumArray)[nRow1], pStr); else - return formula::VectorRefArray(&(*pColArray->mpStrArray)[nRow1]); + return formula::VectorRefArray(pStr); } break; case sc::element_type_formula: @@ -2701,7 +2708,7 @@ formula::VectorRefArray ScColumn::FetchVectorRefArray( SCROW nRow1, SCROW nRow2 rtl_uString** pStr = nullptr; if (pColArray->mpNumArray) pNum = &(*pColArray->mpNumArray)[nRow1]; - if (pColArray->mpStrArray) + if (pColArray->mpStrArray && hasNonEmpty(*pColArray->mpStrArray, nRow1, nRow2)) pStr = &(*pColArray->mpStrArray)[nRow1]; return formula::VectorRefArray(pNum, pStr); |