Store svl::SharedString in query entry items, and adjust all call sites.

Change-Id: Ifd3bbb84c7abbe983a017a169c7e05914ef33450
diff --git a/sc/inc/queryentry.hxx b/sc/inc/queryentry.hxx
index a3baea6..cc35b23 100644
--- a/sc/inc/queryentry.hxx
+++ b/sc/inc/queryentry.hxx
@@ -22,6 +22,7 @@

#include "address.hxx"
#include "global.hxx"
#include "svl/sharedstring.hxx"

#include <vector>

@@ -41,7 +42,7 @@ struct SC_DLLPUBLIC ScQueryEntry
    {
        QueryType     meType;
        double        mfVal;
        OUString maString;
        svl::SharedString maString;

        Item() : meType(ByValue), mfVal(0.0) {}

diff --git a/sc/inc/queryparam.hxx b/sc/inc/queryparam.hxx
index ad311ff..ff89d3e 100644
--- a/sc/inc/queryparam.hxx
+++ b/sc/inc/queryparam.hxx
@@ -28,6 +28,12 @@
struct ScDBQueryParamInternal;
struct ScQueryEntry;

namespace svl {

class SharedStringPool;

}

struct ScQueryParamBase
{
    bool            bHasHeader;
@@ -48,7 +54,7 @@ struct ScQueryParamBase
    ScQueryEntry* FindEntryByField(SCCOLROW nField, bool bNew);
    SC_DLLPUBLIC void RemoveEntryByField(SCCOLROW nField);
    void Resize(size_t nNew);
    void FillInExcelSyntax(const OUString& aCellStr, SCSIZE nIndex);
    void FillInExcelSyntax(svl::SharedStringPool& rPool, const OUString& aCellStr, SCSIZE nIndex);

protected:
    typedef boost::ptr_vector<ScQueryEntry> EntriesType;
diff --git a/sc/source/core/data/dociter.cxx b/sc/source/core/data/dociter.cxx
index 189c822..3cad91c 100644
--- a/sc/source/core/data/dociter.cxx
+++ b/sc/source/core/data/dociter.cxx
@@ -364,7 +364,7 @@ ScDBQueryDataIterator::DataAccessInternal::DataAccessInternal(const ScDBQueryDat
        ScQueryEntry::Item& rItem = rItems.front();
        sal_uInt32 nIndex = 0;
        bool bNumber = mpDoc->GetFormatTable()->IsNumberFormat(
            rItem.maString, nIndex, rItem.mfVal);
            rItem.maString.getString(), nIndex, rItem.mfVal);
        rItem.meType = bNumber ? ScQueryEntry::ByValue : ScQueryEntry::ByString;
    }
    nNumFormat = 0; // Initialized in GetNumberFormat
@@ -683,7 +683,7 @@ bool ScDBQueryDataIterator::DataAccessMatrix::isValidQuery(SCROW nRow, const ScM
                // Equality check first.
                OUString aMatStr = rMat.GetString(nField, nRow);
                upperCase(aMatStr);
                OUString aQueryStr = rEntry.GetQueryItem().maString;
                OUString aQueryStr = rEntry.GetQueryItem().maString.getString();
                upperCase(aQueryStr);
                bool bDone = false;
                switch (rEntry.eOp)
@@ -1062,7 +1062,7 @@ ScQueryCellIterator::ScQueryCellIterator(ScDocument* pDocument, SCTAB nTable,
            ScQueryEntry::Item& rItem = rEntry.GetQueryItem();
            sal_uInt32 nIndex = 0;
            bool bNumber = pDoc->GetFormatTable()->IsNumberFormat(
                rItem.maString, nIndex, rItem.mfVal);
                rItem.maString.getString(), nIndex, rItem.mfVal);
            rItem.meType = bNumber ? ScQueryEntry::ByValue : ScQueryEntry::ByString;
        }
    }
@@ -1408,7 +1408,7 @@ bool ScQueryCellIterator::BinarySearch()
        sal_uLong nFormat = pCol->GetNumberFormat(toLogicalPos(aLoPos));
        aCell = sc::toRefCell(aLoPos.first, aLoPos.second);
        ScCellFormat::GetInputString(aCell, nFormat, aCellStr, rFormatter, pDoc);
        sal_Int32 nTmp = pCollator->compareString(aCellStr, rEntry.GetQueryItem().maString);
        sal_Int32 nTmp = pCollator->compareString(aCellStr, rEntry.GetQueryItem().maString.getString());
        if ((rEntry.eOp == SC_LESS_EQUAL && nTmp > 0) ||
                (rEntry.eOp == SC_GREATER_EQUAL && nTmp < 0) ||
                (rEntry.eOp == SC_EQUAL && nTmp != 0))
@@ -1559,7 +1559,7 @@ bool ScQueryCellIterator::BinarySearch()
            aCell = sc::toRefCell(aPos.first, aPos.second);
            ScCellFormat::GetInputString(aCell, nFormat, aCellStr, rFormatter, pDoc);

            nRes = pCollator->compareString(aCellStr, rEntry.GetQueryItem().maString);
            nRes = pCollator->compareString(aCellStr, rEntry.GetQueryItem().maString.getString());
            if (nRes < 0 && bLessEqual)
            {
                sal_Int32 nTmp = pCollator->compareString( aLastInRangeString,
diff --git a/sc/source/core/data/dpcache.cxx b/sc/source/core/data/dpcache.cxx
index 874efb2..5ef3ada 100644
--- a/sc/source/core/data/dpcache.cxx
+++ b/sc/source/core/data/dpcache.cxx
@@ -550,7 +550,8 @@ bool ScDPCache::ValidQuery( SCROW nRow, const ScQueryParam &rParam) const
                {
                    if (bMatchWholeCell)
                    {
                        OUString aStr = rEntry.GetQueryItem().maString;
                        // TODO: Use shared string for fast equality check.
                        OUString aStr = rEntry.GetQueryItem().maString.getString();
                        bOk = pTransliteration->isEqual(aCellStr, aStr);
                        bool bHasStar = false;
                        sal_Int32 nIndex;
@@ -574,12 +575,12 @@ bool ScDPCache::ValidQuery( SCROW nRow, const ScQueryParam &rParam) const
                    }
                    else
                    {
                        const OUString& rQueryStr = rEntry.GetQueryItem().maString;
                        OUString aQueryStr = rEntry.GetQueryItem().maString.getString();
                        ::com::sun::star::uno::Sequence< sal_Int32 > xOff;
                        OUString aCell = pTransliteration->transliterate(
                            aCellStr, ScGlobal::eLnge, 0, aCellStr.getLength(), &xOff);
                        OUString aQuer = pTransliteration->transliterate(
                            rQueryStr, ScGlobal::eLnge, 0, rQueryStr.getLength(), &xOff);
                            aQueryStr, ScGlobal::eLnge, 0, aQueryStr.getLength(), &xOff);
                        bOk = (aCell.indexOf( aQuer ) != -1);
                    }
                    if (rEntry.eOp == SC_NOT_EQUAL)
@@ -588,7 +589,7 @@ bool ScDPCache::ValidQuery( SCROW nRow, const ScQueryParam &rParam) const
                else
                {   // use collator here because data was probably sorted
                    sal_Int32 nCompare = pCollator->compareString(
                        aCellStr, rEntry.GetQueryItem().maString);
                        aCellStr, rEntry.GetQueryItem().maString.getString());
                    switch (rEntry.eOp)
                    {
                        case SC_LESS :
diff --git a/sc/source/core/data/dpshttab.cxx b/sc/source/core/data/dpshttab.cxx
index f4a80b2..93af29c 100644
--- a/sc/source/core/data/dpshttab.cxx
+++ b/sc/source/core/data/dpshttab.cxx
@@ -59,7 +59,7 @@ ScSheetDPData::ScSheetDPData(ScDocument* pD, const ScSheetSourceDesc& rDesc, con
            {
                sal_uInt32 nIndex = 0;
                bool bNumber = pD->GetFormatTable()->IsNumberFormat(
                    rItem.maString, nIndex, rItem.mfVal);
                    rItem.maString.getString(), nIndex, rItem.mfVal);
                rItem.meType = bNumber ? ScQueryEntry::ByValue : ScQueryEntry::ByString;
            }
        }
diff --git a/sc/source/core/data/table3.cxx b/sc/source/core/data/table3.cxx
index 59e080c..9b63531 100644
--- a/sc/source/core/data/table3.cxx
+++ b/sc/source/core/data/table3.cxx
@@ -57,6 +57,8 @@
#include "mtvcellfunc.hxx"
#include "columnspanset.hxx"

#include "svl/sharedstringpool.hxx"

#include <vector>
#include <boost/unordered_set.hpp>

@@ -1485,7 +1487,7 @@ public:
            // Simple string matching i.e. no regexp match.
            if (isTextMatchOp(rEntry))
            {
                if (rItem.meType != ScQueryEntry::ByString && rItem.maString.isEmpty())
                if (rItem.meType != ScQueryEntry::ByString && rItem.maString.getString().isEmpty())
                {
                    // #i18374# When used from functions (match, countif, sumif, vlookup, hlookup, lookup),
                    // the query value is assigned directly, and the string is empty. In that case,
@@ -1496,18 +1498,19 @@ public:
                }
                else if ( bMatchWholeCell )
                {
                    bOk = mpTransliteration->isEqual(aCellStr, rItem.maString);
                    // TODO: Use shared string for faster equality check.
                    bOk = mpTransliteration->isEqual(aCellStr, rItem.maString.getString());
                    if ( rEntry.eOp == SC_NOT_EQUAL )
                        bOk = !bOk;
                }
                else
                {
                    const OUString& rQueryStr = rItem.maString;
                    OUString aQueryStr = rItem.maString.getString();
                    OUString aCell( mpTransliteration->transliterate(
                        aCellStr, ScGlobal::eLnge, 0, aCellStr.getLength(),
                        NULL ) );
                    OUString aQuer( mpTransliteration->transliterate(
                        rQueryStr, ScGlobal::eLnge, 0, rQueryStr.getLength(),
                        aQueryStr, ScGlobal::eLnge, 0, aQueryStr.getLength(),
                        NULL ) );
                    xub_StrLen nIndex = (rEntry.eOp == SC_ENDS_WITH
                        || rEntry.eOp == SC_DOES_NOT_END_WITH) ? (aCell.getLength()-aQuer.getLength()) : 0;
@@ -1544,7 +1547,7 @@ public:
            else
            {   // use collator here because data was probably sorted
                sal_Int32 nCompare = mpCollator->compareString(
                    aCellStr, rItem.maString);
                    aCellStr, rItem.maString.getString());
                switch (rEntry.eOp)
                {
                    case SC_LESS :
@@ -1809,7 +1812,7 @@ public:

        sal_uInt32 nIndex = 0;
        bool bNumber = mrDoc.GetFormatTable()->
            IsNumberFormat(rItem.maString, nIndex, rItem.mfVal);
            IsNumberFormat(rItem.maString.getString(), nIndex, rItem.mfVal);

        // Advanced Filter creates only ByString queries that need to be
        // converted to ByValue if appropriate. rItem.mfVal now holds the value
@@ -2039,6 +2042,7 @@ bool ScTable::CreateExcelQuery(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow

        SCSIZE nIndex = 0;
        SCROW nRow = nRow1 + 1;
        svl::SharedStringPool& rPool = pDocument->GetSharedStringPool();
        while (nRow <= nRow2)
        {
            nCol = nCol1;
@@ -2050,7 +2054,7 @@ bool ScTable::CreateExcelQuery(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow
                    if (nIndex < nNewEntries)
                    {
                        rQueryParam.GetEntry(nIndex).nField = pFields[nCol - nCol1];
                        rQueryParam.FillInExcelSyntax(aCellStr, nIndex);
                        rQueryParam.FillInExcelSyntax(rPool, aCellStr, nIndex);
                        nIndex++;
                        if (nIndex < nNewEntries)
                            rQueryParam.GetEntry(nIndex).eConnect = SC_AND;
@@ -2094,6 +2098,7 @@ bool ScTable::CreateStarQuery(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2

    SCSIZE nNewEntries = static_cast<SCSIZE>(nRow2-nRow1+1);
    rQueryParam.Resize( nNewEntries );
    svl::SharedStringPool& rPool = pDocument->GetSharedStringPool();

    do
    {
@@ -2167,7 +2172,7 @@ bool ScTable::CreateStarQuery(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2
        {
            OUString aStr;
            GetString(nCol1 + 3, nRow, aStr);
            rEntry.GetQueryItem().maString = aStr;
            rEntry.GetQueryItem().maString = rPool.intern(aStr);
            rEntry.bDoQuery = true;
        }
        nIndex++;
diff --git a/sc/source/core/tool/doubleref.cxx b/sc/source/core/tool/doubleref.cxx
index 68f930d..3483809 100644
--- a/sc/source/core/tool/doubleref.cxx
+++ b/sc/source/core/tool/doubleref.cxx
@@ -26,6 +26,8 @@
#include "globstr.hrc"
#include "scmatrix.hxx"

#include "svl/sharedstringpool.hxx"

#include <memory>
#include <vector>

@@ -39,7 +41,8 @@ void lcl_uppercase(OUString& rStr)
    rStr = ScGlobal::pCharClass->uppercase(rStr.trim());
}

bool lcl_createStarQuery(ScQueryParamBase* pParam, const ScDBRangeBase* pDBRef, const ScDBRangeBase* pQueryRef)
bool lcl_createStarQuery(
    svl::SharedStringPool& rPool, ScQueryParamBase* pParam, const ScDBRangeBase* pDBRef, const ScDBRangeBase* pQueryRef)
{
    // A valid StarQuery must be at least 4 columns wide. To be precise it
    // should be exactly 4 columns ...
@@ -128,7 +131,8 @@ bool lcl_createStarQuery(ScQueryParamBase* pParam, const ScDBRangeBase* pDBRef, 
        if (bValid)
        {
            // Finally, the right-hand-side value in the 4th column.
            rEntry.GetQueryItem().maString = pQueryRef->getString(3, nRow);
            rEntry.GetQueryItem().maString =
                rPool.intern(pQueryRef->getString(3, nRow));
            rEntry.bDoQuery = true;
        }
        nIndex++;
@@ -139,7 +143,7 @@ bool lcl_createStarQuery(ScQueryParamBase* pParam, const ScDBRangeBase* pDBRef, 
}

bool lcl_createExcelQuery(
    ScQueryParamBase* pParam, const ScDBRangeBase* pDBRef, const ScDBRangeBase* pQueryRef)
    svl::SharedStringPool& rPool, ScQueryParamBase* pParam, const ScDBRangeBase* pDBRef, const ScDBRangeBase* pQueryRef)
{
    bool bValid = true;
    SCCOL nCols = pQueryRef->getColSize();
@@ -186,7 +190,7 @@ bool lcl_createExcelQuery(
                    if (nIndex < nNewEntries)
                    {
                        pParam->GetEntry(nIndex).nField = aFields[nCol];
                        pParam->FillInExcelSyntax(OUString(aCellStr), nIndex);
                        pParam->FillInExcelSyntax(rPool, aCellStr, nIndex);
                        nIndex++;
                        if (nIndex < nNewEntries)
                            pParam->GetEntry(nIndex).eConnect = SC_AND;
@@ -205,17 +209,17 @@ bool lcl_createExcelQuery(
}

bool lcl_fillQueryEntries(
    ScQueryParamBase* pParam, const ScDBRangeBase* pDBRef, const ScDBRangeBase* pQueryRef)
    svl::SharedStringPool& rPool, ScQueryParamBase* pParam, const ScDBRangeBase* pDBRef, const ScDBRangeBase* pQueryRef)
{
    SCSIZE nCount = pParam->GetEntryCount();
    for (SCSIZE i = 0; i < nCount; ++i)
        pParam->GetEntry(i).Clear();

    // Standard QueryTabelle
    bool bValid = lcl_createStarQuery(pParam, pDBRef, pQueryRef);
    bool bValid = lcl_createStarQuery(rPool, pParam, pDBRef, pQueryRef);
    // Excel QueryTabelle
    if (!bValid)
        bValid = lcl_createExcelQuery(pParam, pDBRef, pQueryRef);
        bValid = lcl_createExcelQuery(rPool, pParam, pDBRef, pQueryRef);

    nCount = pParam->GetEntryCount();
    if (bValid)
@@ -249,7 +253,7 @@ bool ScDBRangeBase::fillQueryEntries(ScQueryParamBase* pParam, const ScDBRangeBa
    if (!pDBRef)
        return false;

    return lcl_fillQueryEntries(pParam, pDBRef, this);
    return lcl_fillQueryEntries(getDoc()->GetSharedStringPool(), pParam, pDBRef, this);
}

void ScDBRangeBase::fillQueryOptions(ScQueryParamBase* pParam)
diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx
index 770ee24..9400bec 100644
--- a/sc/source/core/tool/interpr1.cxx
+++ b/sc/source/core/tool/interpr1.cxx
@@ -922,7 +922,7 @@ double ScInterpreter::CompareFunc( const ScCompare& rComp, ScCompareOptions* pOp
            // is/must be identical to *rEntry.pStr, which is essential for
            // regex to work through GetSearchTextPtr().
            ScQueryEntry& rEntry = pOptions->aQueryEntry;
            OSL_ENSURE(rEntry.GetQueryItem().maString.equals(*rComp.pVal[1]), "ScInterpreter::CompareFunc: broken options");
            OSL_ENSURE(rEntry.GetQueryItem().maString.getString().equals(*rComp.pVal[1]), "ScInterpreter::CompareFunc: broken options");
            if (pOptions->bRegEx)
            {
                sal_Int32 nStart = 0;
@@ -976,13 +976,13 @@ double ScInterpreter::CompareFunc( const ScCompare& rComp, ScCompareOptions* pOp
        if (!rItems.empty())
        {
            const ScQueryEntry::Item& rItem = rItems[0];
            if (rItem.meType != ScQueryEntry::ByString && !rItem.maString.isEmpty() &&
            if (rItem.meType != ScQueryEntry::ByString && !rItem.maString.getString().isEmpty() &&
                (rEntry.eOp == SC_EQUAL || rEntry.eOp == SC_NOT_EQUAL))
            {
                // As in ScTable::ValidQuery() match a numeric string for a
                // number query that originated from a string, e.g. in SUMIF
                // and COUNTIF. Transliteration is not needed here.
                bool bEqual = (*rComp.pVal[nStringQuery-1]) == rItem.maString;
                bool bEqual = (*rComp.pVal[nStringQuery-1]) == rItem.maString.getString();
                // match => fRes=0, else fRes=1
                fRes = (rEntry.eOp == SC_NOT_EQUAL) ? bEqual : !bEqual;
            }
@@ -1234,7 +1234,7 @@ ScMatrixRef ScInterpreter::QueryMat( const ScMatrixRef& pMat, ScCompareOptions& 
    PushMatrix( pMat);
    const ScQueryEntry::Item& rItem = rOptions.aQueryEntry.GetQueryItem();
    if (rItem.meType == ScQueryEntry::ByString)
        PushString(rItem.maString);
        PushString(rItem.maString.getString());
    else
        PushDouble(rItem.mfVal);
    ScMatrixRef pResultMatrix = CompareMat( &rOptions).mpMat;
@@ -4420,10 +4420,10 @@ static sal_Int32 lcl_CompareMatrix2Query(
    if (!bByString)
        return 1;       // string always greater than numeric

    const OUString aStr1 = rMat.GetString(i);
    const OUString& rStr2 = rEntry.GetQueryItem().maString;
    OUString aStr1 = rMat.GetString(i);
    OUString aStr2 = rEntry.GetQueryItem().maString.getString();

    return ScGlobal::GetCollator()->compareString(aStr1, rStr2); // case-insensitive
    return ScGlobal::GetCollator()->compareString(aStr1, aStr2); // case-insensitive
}

/** returns the last item with the identical value as the original item
@@ -4541,6 +4541,7 @@ void ScInterpreter::ScMatch()

        if (nGlobalError == 0)
        {
            svl::SharedStringPool& rPool = pDok->GetSharedStringPool();
            double fVal;
            OUString sStr;
            ScQueryParam rParam;
@@ -4569,7 +4570,7 @@ void ScInterpreter::ScMatch()
                {
                    sStr = GetString();
                    rItem.meType = ScQueryEntry::ByString;
                    rItem.maString = sStr;
                    rItem.maString = rPool.intern(sStr);
                }
                break;
                case svDoubleRef :
@@ -4593,7 +4594,7 @@ void ScInterpreter::ScMatch()
                    {
                        GetCellString(sStr, aCell);
                        rItem.meType = ScQueryEntry::ByString;
                        rItem.maString = sStr;
                        rItem.maString = rPool.intern(sStr);
                    }
                }
                break;
@@ -4614,7 +4615,7 @@ void ScInterpreter::ScMatch()
                    else
                    {
                        rItem.meType = ScQueryEntry::ByString;
                        rItem.maString = pToken->GetString();
                        rItem.maString = rPool.intern(pToken->GetString());
                    }
                }
                break;
@@ -4628,7 +4629,7 @@ void ScInterpreter::ScMatch()
                    OUString aStr;
                    ScMatValType nType = GetDoubleOrStringFromMatrix(
                            rItem.mfVal, aStr);
                    rItem.maString = aStr;
                    rItem.maString = rPool.intern(aStr);
                    rItem.meType = ScMatrix::IsNonValueType(nType) ?
                        ScQueryEntry::ByString : ScQueryEntry::ByValue;
                }
@@ -4649,7 +4650,7 @@ void ScInterpreter::ScMatch()
                if ( bIsVBAMode )
                    rParam.bRegExp = false;
                else
                    rParam.bRegExp = MayBeRegExp(rEntry.GetQueryItem().maString, pDok);
                    rParam.bRegExp = MayBeRegExp(rEntry.GetQueryItem().maString.getString(), pDok);
            }

            if (pMatSrc) // The source data is matrix array.
@@ -5111,13 +5112,13 @@ double ScInterpreter::IterateParametersIf( ScIterFuncIf eFunc )
            }
            else
            {
                rParam.FillInExcelSyntax(aString, 0);
                rParam.FillInExcelSyntax(pDok->GetSharedStringPool(), aString, 0);
                sal_uInt32 nIndex = 0;
                bool bNumber = pFormatter->IsNumberFormat(
                        rItem.maString, nIndex, rItem.mfVal);
                        rItem.maString.getString(), nIndex, rItem.mfVal);
                rItem.meType = bNumber ? ScQueryEntry::ByValue : ScQueryEntry::ByString;
                if (rItem.meType == ScQueryEntry::ByString)
                    rParam.bRegExp = MayBeRegExp(rItem.maString, pDok);
                    rParam.bRegExp = MayBeRegExp(rItem.maString.getString(), pDok);
            }
            ScAddress aAdr;
            aAdr.SetTab( nTab3 );
@@ -5411,13 +5412,13 @@ void ScInterpreter::ScCountIf()
                }
                else
                {
                    rParam.FillInExcelSyntax(aString, 0);
                    rParam.FillInExcelSyntax(pDok->GetSharedStringPool(), aString, 0);
                    sal_uInt32 nIndex = 0;
                    bool bNumber = pFormatter->IsNumberFormat(
                            rItem.maString, nIndex, rItem.mfVal);
                            rItem.maString.getString(), nIndex, rItem.mfVal);
                    rItem.meType = bNumber ? ScQueryEntry::ByValue : ScQueryEntry::ByString;
                    if (rItem.meType == ScQueryEntry::ByString)
                        rParam.bRegExp = MayBeRegExp(rItem.maString, pDok);
                        rParam.bRegExp = MayBeRegExp(rItem.maString.getString(), pDok);
                }
                rParam.nCol1  = nCol1;
                rParam.nCol2  = nCol2;
@@ -5663,13 +5664,13 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc )
                }
                else
                {
                    rParam.FillInExcelSyntax(aString, 0);
                    rParam.FillInExcelSyntax(pDok->GetSharedStringPool(), aString, 0);
                    sal_uInt32 nIndex = 0;
                    bool bNumber = pFormatter->IsNumberFormat(
                            rItem.maString, nIndex, rItem.mfVal);
                            rItem.maString.getString(), nIndex, rItem.mfVal);
                    rItem.meType = bNumber ? ScQueryEntry::ByValue : ScQueryEntry::ByString;
                    if (rItem.meType == ScQueryEntry::ByString)
                        rParam.bRegExp = MayBeRegExp(rItem.maString, pDok);
                        rParam.bRegExp = MayBeRegExp(rItem.maString.getString(), pDok);
                }
                ScAddress aAdr;
                aAdr.SetTab( nTab1 );
@@ -6073,7 +6074,7 @@ void ScInterpreter::ScLookup()
            if (rItem.meType != ScQueryEntry::ByString)
                bFound = false;
            else
                bFound = (ScGlobal::GetCollator()->compareString(aDataStr, rItem.maString) <= 0);
                bFound = (ScGlobal::GetCollator()->compareString(aDataStr, rItem.maString.getString()) <= 0);
        }

        if (!bFound)
@@ -6319,7 +6320,7 @@ void ScInterpreter::ScLookup()
    rEntry.nField = nCol1;
    ScQueryEntry::Item& rItem = rEntry.GetQueryItem();
    if (rItem.meType == ScQueryEntry::ByString)
        aParam.bRegExp = MayBeRegExp(rItem.maString, pDok);
        aParam.bRegExp = MayBeRegExp(rItem.maString.getString(), pDok);

    ScQueryCellIterator aCellIter(pDok, nTab1, aParam, false);
    SCCOL nC;
@@ -6551,7 +6552,7 @@ void ScInterpreter::CalculateLookup(bool bHLookup)

    ScQueryEntry::Item& rItem = rEntry.GetQueryItem();
    if (rItem.meType == ScQueryEntry::ByString)
        aParam.bRegExp = MayBeRegExp(rItem.maString, pDok);
        aParam.bRegExp = MayBeRegExp(rItem.maString.getString(), pDok);
    if (pMat)
    {
        SCSIZE nMatCount = bHLookup ? nC : nR;
@@ -6561,7 +6562,7 @@ void ScInterpreter::CalculateLookup(bool bHLookup)
//!!!!!!!
//! TODO: enable regex on matrix strings
//!!!!!!!
            const OUString& rParamStr = rItem.maString;
            OUString aParamStr = rItem.maString.getString();
            if ( bSorted )
            {
                static CollatorWrapper* pCollator = ScGlobal::GetCollator();
@@ -6570,7 +6571,7 @@ void ScInterpreter::CalculateLookup(bool bHLookup)
                    if (bHLookup ? pMat->IsString(i, 0) : pMat->IsString(0, i))
                    {
                        sal_Int32 nRes =
                            pCollator->compareString( bHLookup ? pMat->GetString(i,0) : pMat->GetString(0,i), rParamStr);
                            pCollator->compareString( bHLookup ? pMat->GetString(i,0) : pMat->GetString(0,i), aParamStr);
                        if (nRes <= 0)
                            nDelta = i;
                        else if (i>0)   // #i2168# ignore first mismatch
@@ -6589,7 +6590,7 @@ void ScInterpreter::CalculateLookup(bool bHLookup)
                        if (pMat->IsString(i, 0))
                        {
                            if ( ScGlobal::GetpTransliteration()->isEqual(
                                pMat->GetString(i,0), rParamStr))
                                pMat->GetString(i,0), aParamStr))
                            {
                                nDelta = i;
                                i = nMatCount + 1;
@@ -6599,7 +6600,7 @@ void ScInterpreter::CalculateLookup(bool bHLookup)
                }
                else
                {
                    nDelta = pMat->MatchStringInColumns(rParamStr, 0, 0);
                    nDelta = pMat->MatchStringInColumns(aParamStr, 0, 0);
                }
            }
        }
@@ -6704,6 +6705,7 @@ void ScInterpreter::CalculateLookup(bool bHLookup)
bool ScInterpreter::FillEntry(ScQueryEntry& rEntry)
{
    ScQueryEntry::Item& rItem = rEntry.GetQueryItem();
    svl::SharedStringPool& rPool = pDok->GetSharedStringPool();
    switch ( GetStackType() )
    {
        case svDouble:
@@ -6716,7 +6718,7 @@ bool ScInterpreter::FillEntry(ScQueryEntry& rEntry)
        {
            const OUString& sStr = GetString();
            rItem.meType = ScQueryEntry::ByString;
            rItem.maString = sStr;
            rItem.maString = rPool.intern(sStr);
        }
        break;
        case svDoubleRef :
@@ -6740,7 +6742,7 @@ bool ScInterpreter::FillEntry(ScQueryEntry& rEntry)
                OUString aStr;
                GetCellString(aStr, aCell);
                rItem.meType = ScQueryEntry::ByString;
                rItem.maString = aStr;
                rItem.maString = rPool.intern(aStr);
            }
        }
        break;
@@ -6748,7 +6750,7 @@ bool ScInterpreter::FillEntry(ScQueryEntry& rEntry)
        {
            OUString aStr;
            const ScMatValType nType = GetDoubleOrStringFromMatrix(rItem.mfVal, aStr);
            rItem.maString = aStr;
            rItem.maString = rPool.intern(aStr);
            rItem.meType = ScMatrix::IsNonValueType(nType) ?
                ScQueryEntry::ByString : ScQueryEntry::ByValue;
        }
@@ -6946,13 +6948,13 @@ ScDBQueryParamBase* ScInterpreter::GetDBParams( bool& rMissingField )

                ScQueryEntry::Item& rItem = rEntry.GetQueryItem();
                sal_uInt32 nIndex = 0;
                const OUString& rQueryStr = rItem.maString;
                OUString aQueryStr = rItem.maString.getString();
                bool bNumber = pFormatter->IsNumberFormat(
                    rQueryStr, nIndex, rItem.mfVal);
                    aQueryStr, nIndex, rItem.mfVal);
                rItem.meType = bNumber ? ScQueryEntry::ByValue : ScQueryEntry::ByString;

                if (!bNumber && !pParam->bRegExp)
                    pParam->bRegExp = MayBeRegExp(rQueryStr, pDok);
                    pParam->bRegExp = MayBeRegExp(aQueryStr, pDok);
            }
            return pParam.release();
        }
diff --git a/sc/source/core/tool/lookupcache.cxx b/sc/source/core/tool/lookupcache.cxx
index a676a72..914b188 100644
--- a/sc/source/core/tool/lookupcache.cxx
+++ b/sc/source/core/tool/lookupcache.cxx
@@ -43,7 +43,7 @@ ScLookupCache::QueryCriteria::QueryCriteria( const ScQueryEntry& rEntry ) :

    const ScQueryEntry::Item& rItem = rEntry.GetQueryItem();
    if (rItem.meType == ScQueryEntry::ByString)
        setString(rItem.maString);
        setString(rItem.maString.getString());
    else
        setDouble(rItem.mfVal);
}
diff --git a/sc/source/core/tool/queryentry.cxx b/sc/source/core/tool/queryentry.cxx
index 1ac1a89..f933516 100644
--- a/sc/source/core/tool/queryentry.cxx
+++ b/sc/source/core/tool/queryentry.cxx
@@ -32,7 +32,7 @@

bool ScQueryEntry::Item::operator== (const Item& r) const
{
    return meType == r.meType && mfVal == r.mfVal && maString.equals(r.maString);
    return meType == r.meType && mfVal == r.mfVal && maString == r.maString;
}

ScQueryEntry::ScQueryEntry() :
@@ -95,7 +95,7 @@ void ScQueryEntry::SetQueryByEmpty()
    maQueryItems.resize(1);
    Item& rItem = maQueryItems[0];
    rItem.meType = ByEmpty;
    rItem.maString = OUString();
    rItem.maString = svl::SharedString();
    rItem.mfVal = SC_EMPTYFIELDS;
}

@@ -107,7 +107,7 @@ bool ScQueryEntry::IsQueryByEmpty() const
    const Item& rItem = maQueryItems[0];
    return eOp == SC_EQUAL &&
        rItem.meType == ByEmpty &&
        rItem.maString.isEmpty() &&
        rItem.maString.getString().isEmpty() &&
        rItem.mfVal == SC_EMPTYFIELDS;
}

@@ -117,7 +117,7 @@ void ScQueryEntry::SetQueryByNonEmpty()
    maQueryItems.resize(1);
    Item& rItem = maQueryItems[0];
    rItem.meType = ByEmpty;
    rItem.maString = OUString();
    rItem.maString = svl::SharedString();
    rItem.mfVal = SC_NONEMPTYFIELDS;
}

@@ -129,7 +129,7 @@ bool ScQueryEntry::IsQueryByNonEmpty() const
    const Item& rItem = maQueryItems[0];
    return eOp == SC_EQUAL &&
        rItem.meType == ByEmpty &&
        rItem.maString.isEmpty() &&
        rItem.maString.getString().isEmpty() &&
        rItem.mfVal == SC_NONEMPTYFIELDS;
}

@@ -178,9 +178,9 @@ utl::TextSearch* ScQueryEntry::GetSearchTextPtr( bool bCaseSens ) const
{
    if ( !pSearchParam )
    {
        const OUString& rStr = maQueryItems[0].maString;
        OUString aStr = maQueryItems[0].maString.getString();
        pSearchParam = new utl::SearchParam(
            rStr, utl::SearchParam::SRCH_REGEXP, bCaseSens, false, false);
            aStr, utl::SearchParam::SRCH_REGEXP, bCaseSens, false, false);
        pSearchText = new utl::TextSearch( *pSearchParam, *ScGlobal::pCharClass );
    }
    return pSearchText;
diff --git a/sc/source/core/tool/queryparam.cxx b/sc/source/core/tool/queryparam.cxx
index 5ce8f89..071c345 100644
--- a/sc/source/core/tool/queryparam.cxx
+++ b/sc/source/core/tool/queryparam.cxx
@@ -21,6 +21,8 @@
#include "queryentry.hxx"
#include "scmatrix.hxx"

#include "svl/sharedstringpool.hxx"

namespace {

const size_t MAXQUERY = 8;
@@ -166,7 +168,8 @@ void ScQueryParamBase::Resize(size_t nNew)
    }
}

void ScQueryParamBase::FillInExcelSyntax(const OUString& rStr, SCSIZE nIndex)
void ScQueryParamBase::FillInExcelSyntax(
    svl::SharedStringPool& rPool, const OUString& rStr, SCSIZE nIndex)
{
    const OUString aCellStr = rStr;
    if (!aCellStr.isEmpty())
@@ -183,17 +186,17 @@ void ScQueryParamBase::FillInExcelSyntax(const OUString& rStr, SCSIZE nIndex)
        {
            if (aCellStr[1] == '>')
            {
                rItem.maString = aCellStr.copy(2);
                rItem.maString = rPool.intern(aCellStr.copy(2));
                rEntry.eOp   = SC_NOT_EQUAL;
            }
            else if (aCellStr[1] == '=')
            {
                rItem.maString = aCellStr.copy(2);
                rItem.maString = rPool.intern(aCellStr.copy(2));
                rEntry.eOp   = SC_LESS_EQUAL;
            }
            else
            {
                rItem.maString = aCellStr.copy(1);
                rItem.maString = rPool.intern(aCellStr.copy(1));
                rEntry.eOp   = SC_LESS;
            }
        }
@@ -201,21 +204,21 @@ void ScQueryParamBase::FillInExcelSyntax(const OUString& rStr, SCSIZE nIndex)
        {
            if (aCellStr[1] == '=')
            {
                rItem.maString = aCellStr.copy(2);
                rItem.maString = rPool.intern(aCellStr.copy(2));
                rEntry.eOp   = SC_GREATER_EQUAL;
            }
            else
            {
                rItem.maString = aCellStr.copy(1);
                rItem.maString = rPool.intern(aCellStr.copy(1));
                rEntry.eOp   = SC_GREATER;
            }
        }
        else
        {
            if (aCellStr[0] == '=')
                rItem.maString = aCellStr.copy(1);
                rItem.maString = rPool.intern(aCellStr.copy(1));
            else
                rItem.maString = aCellStr;
                rItem.maString = rPool.intern(aCellStr);
            rEntry.eOp = SC_EQUAL;
        }
    }
diff --git a/sc/source/filter/excel/excimp8.cxx b/sc/source/filter/excel/excimp8.cxx
index fea897b..d4d4cc5 100644
--- a/sc/source/filter/excel/excimp8.cxx
+++ b/sc/source/filter/excel/excimp8.cxx
@@ -55,6 +55,7 @@
#include <sot/exchange.hxx>

#include <svl/stritem.hxx>
#include "svl/sharedstringpool.hxx"

#include <rtl/math.hxx>
#include <rtl/ustring.hxx>
@@ -454,7 +455,7 @@ void ImportExcel8::AutoFilter( void )

    XclImpAutoFilterData* pData = pExcRoot->pAutoFilterBuffer->GetByTab( GetCurrScTab() );
    if( pData )
        pData->ReadAutoFilter( aIn );
        pData->ReadAutoFilter(aIn, GetDoc().GetSharedStringPool());
}


@@ -472,17 +473,21 @@ XclImpAutoFilterData::XclImpAutoFilterData( RootData* pRoot, const ScRange& rRan
    aParam.nCol2 = rRange.aEnd.Col();
    aParam.nRow2 = rRange.aEnd.Row();

    aParam.bInplace = sal_True;
    aParam.bInplace = true;

}

void XclImpAutoFilterData::CreateFromDouble( OUString& rStr, double fVal )
namespace {

OUString CreateFromDouble( double fVal )
{
    rStr += ::rtl::math::doubleToUString(fVal,
    return rtl::math::doubleToUString(fVal,
                rtl_math_StringFormat_Automatic, rtl_math_DecimalPlaces_Max,
                ScGlobal::pLocaleData->getNumDecimalSep()[0], true);
}

}

void XclImpAutoFilterData::SetCellAttribs()
{
    ScDocument& rDoc = pExcRoot->pIR->GetDoc();
@@ -515,12 +520,11 @@ void XclImpAutoFilterData::InsertQueryParam()
    }
}

static void ExcelQueryToOooQuery( ScQueryEntry& rEntry )
static void ExcelQueryToOooQuery( OUString& aStr, ScQueryEntry& rEntry )
{
    if (rEntry.eOp != SC_EQUAL && rEntry.eOp != SC_NOT_EQUAL)
        return;

    OUString aStr = rEntry.GetQueryItem().maString;
    xub_StrLen nLen = aStr.getLength();
    sal_Unicode nStart = aStr[0];
    sal_Unicode nEnd   = aStr[ nLen-1 ];
@@ -543,10 +547,10 @@ static void ExcelQueryToOooQuery( ScQueryEntry& rEntry )
    {
        aStr = aStr.copy( 1 );
    }
    rEntry.GetQueryItem().maString = aStr;
}

void XclImpAutoFilterData::ReadAutoFilter( XclImpStream& rStrm )
void XclImpAutoFilterData::ReadAutoFilter(
    XclImpStream& rStrm, svl::SharedStringPool& rPool )
{
    sal_uInt16 nCol, nFlags;
    rStrm >> nCol >> nFlags;
@@ -570,7 +574,7 @@ void XclImpAutoFilterData::ReadAutoFilter( XclImpStream& rStrm )
        aEntry.eConnect = SC_AND;

        rItem.meType = ScQueryEntry::ByString;
        rItem.maString = OUString::number(nCntOfTop10);
        rItem.maString = rPool.intern(OUString::number(nCntOfTop10));

        rStrm.Ignore(20);
        return;
@@ -620,23 +624,23 @@ void XclImpAutoFilterData::ReadAutoFilter( XclImpStream& rStrm )
            case EXC_AFTYPE_RK:
                rStrm >> nRK;
                rStrm.Ignore( 4 );
                CreateFromDouble(
                    rItem.maString, XclTools::GetDoubleFromRK(nRK));
                rItem.maString = rPool.intern(
                    CreateFromDouble(XclTools::GetDoubleFromRK(nRK)));
            break;
            case EXC_AFTYPE_DOUBLE:
                rStrm >> fVal;
                CreateFromDouble(rItem.maString, fVal);
                rItem.maString = rPool.intern(CreateFromDouble(fVal));
            break;
            case EXC_AFTYPE_STRING:
                rStrm.Ignore( 4 );
                rStrm >> nStrLen[ nE ];
                rStrm.Ignore( 3 );
                rItem.maString = OUString();
                rItem.maString = svl::SharedString();
            break;
            case EXC_AFTYPE_BOOLERR:
                rStrm >> nBoolErr >> nVal;
                rStrm.Ignore( 6 );
                rItem.maString = OUString::number(nVal);
                rItem.maString = rPool.intern(OUString::number(nVal));
                bIgnore = (nBoolErr != 0);
            break;
            case EXC_AFTYPE_EMPTY:
@@ -665,8 +669,9 @@ void XclImpAutoFilterData::ReadAutoFilter( XclImpStream& rStrm )
        {
            if (nStrLen[nE] && aEntries[nE].bDoQuery)
            {
                aEntries[nE].GetQueryItem().maString = rStrm.ReadUniString(nStrLen[nE]);
                ExcelQueryToOooQuery(aEntries[nE]);
                OUString aStr = rStrm.ReadUniString(nStrLen[nE]);
                ExcelQueryToOooQuery(aStr, aEntries[nE]);
                aEntries[nE].GetQueryItem().maString = rPool.intern(aStr);
                aParam.AppendEntry() = aEntries[nE];
            }
        }
@@ -693,9 +698,9 @@ void XclImpAutoFilterData::ReadAutoFilter( XclImpStream& rStrm )
            ScQueryEntry::QueryItemsType aItems;
            aItems.reserve(2);
            ScQueryEntry::Item aItem1, aItem2;
            aItem1.maString = rStrm.ReadUniString(nStrLen[0]);
            aItem1.maString = rPool.intern(rStrm.ReadUniString(nStrLen[0]));
            aItem1.meType = ScQueryEntry::ByString;
            aItem2.maString = rStrm.ReadUniString(nStrLen[1]);
            aItem2.maString = rPool.intern(rStrm.ReadUniString(nStrLen[1]));
            aItem2.meType = ScQueryEntry::ByString;
            aItems.push_back(aItem1);
            aItems.push_back(aItem2);
@@ -704,8 +709,9 @@ void XclImpAutoFilterData::ReadAutoFilter( XclImpStream& rStrm )
        else if (nStrLen[0] && aEntries[0].bDoQuery)
        {
            // Due to conflict, we can import only the first condition.
            aEntries[0].GetQueryItem().maString = rStrm.ReadUniString(nStrLen[0]);
            ExcelQueryToOooQuery(aEntries[0]);
            OUString aStr = rStrm.ReadUniString(nStrLen[0]);
            ExcelQueryToOooQuery(aStr, aEntries[0]);
            aEntries[0].GetQueryItem().maString = rPool.intern(aStr);
            aParam.AppendEntry() = aEntries[0];
        }
    }
diff --git a/sc/source/filter/excel/excrecds.cxx b/sc/source/filter/excel/excrecds.cxx
index 938e89a..d7bea0b 100644
--- a/sc/source/filter/excel/excrecds.cxx
+++ b/sc/source/filter/excel/excrecds.cxx
@@ -721,10 +721,10 @@ bool XclExpAutofilter::AddEntry( const ScQueryEntry& rEntry )
    bool bConflict = false;
    OUString  sText;
    const ScQueryEntry::Item& rItem = rItems[0];
    const OUString& rQueryStr = rItem.maString;
    if (!rQueryStr.isEmpty())
    OUString aQueryStr = rItem.maString.getString();
    if (!aQueryStr.isEmpty())
    {
        sText = rQueryStr;
        sText = aQueryStr;
        switch( rEntry.eOp )
        {
            case SC_CONTAINS:
@@ -830,7 +830,7 @@ bool XclExpAutofilter::AddMultiValueEntry( const ScQueryEntry& rEntry )
    const ScQueryEntry::QueryItemsType& rItems = rEntry.GetQueryItems();
    ScQueryEntry::QueryItemsType::const_iterator itr = rItems.begin(), itrEnd = rItems.end();
    for (; itr != itrEnd; ++itr)
        maMultiValues.push_back(itr->maString);
        maMultiValues.push_back(itr->maString.getString());

    return false;
}
diff --git a/sc/source/filter/inc/excimp8.hxx b/sc/source/filter/inc/excimp8.hxx
index d4a54cc..cfe1b80 100644
--- a/sc/source/filter/inc/excimp8.hxx
+++ b/sc/source/filter/inc/excimp8.hxx
@@ -89,7 +89,6 @@ private:
    bool                        bCriteria:1;
    bool                        bAutoOrAdvanced:1;

    void                        CreateFromDouble( OUString& rStr, double fVal );
    void                        SetCellAttribs();
    void                        InsertQueryParam();

@@ -107,7 +106,7 @@ public:
    inline SCCOL                EndCol() const      { return aParam.nCol2; }
    inline SCROW                EndRow() const      { return aParam.nRow2; }

    void                        ReadAutoFilter( XclImpStream& rStrm );
    void ReadAutoFilter( XclImpStream& rStrm, svl::SharedStringPool& rPool );

    inline void                 Activate()          { bActive = true; }
    void                        SetAdvancedRange( const ScRange* pRange );
diff --git a/sc/source/filter/xml/XMLExportDataPilot.cxx b/sc/source/filter/xml/XMLExportDataPilot.cxx
index c9b9b3b..cd711d4 100644
--- a/sc/source/filter/xml/XMLExportDataPilot.cxx
+++ b/sc/source/filter/xml/XMLExportDataPilot.cxx
@@ -112,15 +112,15 @@ void ScXMLExportDataPilot::WriteDPCondition(const ScQueryEntry& aQueryEntry, boo
    if (bIsCaseSensitive)
        rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_CASE_SENSITIVE, XML_TRUE);
    const ScQueryEntry::Item& rItem = aQueryEntry.GetQueryItem();
    const OUString& rQueryStr = rItem.maString;
    OUString aQueryStr = rItem.maString.getString();
    if (rItem.meType == ScQueryEntry::ByString)
    {
        rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, rQueryStr);
        rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, aQueryStr);
    }
    else
    {
        rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATA_TYPE, XML_NUMBER);
        rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, rQueryStr);
        rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, aQueryStr);
    }

    if (aQueryEntry.IsQueryByEmpty())
diff --git a/sc/source/filter/xml/XMLExportDatabaseRanges.cxx b/sc/source/filter/xml/XMLExportDatabaseRanges.cxx
index 8336e49..f9ea2c6b 100644
--- a/sc/source/filter/xml/XMLExportDatabaseRanges.cxx
+++ b/sc/source/filter/xml/XMLExportDatabaseRanges.cxx
@@ -424,7 +424,7 @@ private:
        WriteSetItem(ScXMLExport& r) : mrExport(r) {}
        void operator() (const ScQueryEntry::Item& rItem) const
        {
            mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, rItem.maString);
            mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, rItem.maString.getString());
            SvXMLElementExport aElem(mrExport, XML_NAMESPACE_TABLE, XML_FILTER_SET_ITEM, true, true);
        }
    };
@@ -447,7 +447,7 @@ private:
            // Single item condition.
            const ScQueryEntry::Item& rItem = rItems.front();
            if (rItem.meType == ScQueryEntry::ByString)
                mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, rItem.maString);
                mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, rItem.maString.getString());
            else
            {
                mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATA_TYPE, XML_NUMBER);
@@ -466,7 +466,7 @@ private:

            // Store the 1st value for backward compatibility.
            const ScQueryEntry::Item& rItem = rItems.front();
            mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, rItem.maString);
            mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, rItem.maString.getString());
            mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_OPERATOR, OUString("="));
            SvXMLElementExport aElemC(mrExport, XML_NAMESPACE_TABLE, XML_FILTER_CONDITION, true, true);

diff --git a/sc/source/filter/xml/xmlfilti.cxx b/sc/source/filter/xml/xmlfilti.cxx
index 75c0af3..6e8f88b1 100644
--- a/sc/source/filter/xml/xmlfilti.cxx
+++ b/sc/source/filter/xml/xmlfilti.cxx
@@ -24,7 +24,9 @@
#include "XMLConverter.hxx"
#include "rangeutl.hxx"
#include "queryentry.hxx"
#include "document.hxx"

#include "svl/sharedstringpool.hxx"
#include <xmloff/xmltkmap.hxx>
#include <xmloff/nmspmap.hxx>
#include <xmloff/xmltoken.hxx>
@@ -452,7 +454,8 @@ void ScXMLConditionContext::EndElement()
        }
        else
        {
            rItem.maString = sConditionValue;
            svl::SharedStringPool& rPool = GetScImport().GetDocument()->GetSharedStringPool();
            rItem.maString = rPool.intern(sConditionValue);
            rItem.meType = ScQueryEntry::ByString;
        }
    }
@@ -490,8 +493,9 @@ ScXMLSetItemContext::ScXMLSetItemContext(
        {
            case XML_TOK_FILTER_SET_ITEM_ATTR_VALUE:
            {
                svl::SharedStringPool& rPool = GetScImport().GetDocument()->GetSharedStringPool();
                ScQueryEntry::Item aItem;
                aItem.maString = sValue;
                aItem.maString = rPool.intern(sValue);
                aItem.meType = ScQueryEntry::ByString;
                aItem.mfVal = 0.0;
                rParent.AddSetItem(aItem);
@@ -864,15 +868,17 @@ void ScXMLDPConditionContext::EndElement()
        pFilterContext->SetUseRegularExpressions(bUseRegularExpressions);
        aFilterField.nField = nField;
        ScQueryEntry::Item& rItem = aFilterField.GetQueryItem();
        svl::SharedStringPool& rPool = GetScImport().GetDocument()->GetSharedStringPool();

        if (IsXMLToken(sDataType, XML_NUMBER))
        {
            rItem.mfVal = sConditionValue.toDouble();
            rItem.maString = sConditionValue;
            rItem.maString = rPool.intern(sConditionValue);
            rItem.meType = ScQueryEntry::ByValue;
        }
        else
        {
            rItem.maString = sConditionValue;
            rItem.maString = rPool.intern(sConditionValue);
            rItem.meType = ScQueryEntry::ByString;
            rItem.mfVal = 0.0;
        }
diff --git a/sc/source/ui/dbgui/filtdlg.cxx b/sc/source/ui/dbgui/filtdlg.cxx
index bc68214..a156131 100644
--- a/sc/source/ui/dbgui/filtdlg.cxx
+++ b/sc/source/ui/dbgui/filtdlg.cxx
@@ -37,6 +37,7 @@

#include "filtdlg.hxx"
#include <vcl/msgbox.hxx>
#include "svl/sharedstringpool.hxx"

#include <limits>

@@ -272,7 +273,8 @@ void ScFilterDlg::Init( const SfxItemSet& rArgSet )
            }
            else
            {
                if (rItem.maString.isEmpty())
                OUString aQueryStr = rItem.maString.getString();
                if (aQueryStr.isEmpty())
                {
                    if (rItem.meType == ScQueryEntry::ByValue)
                        pDoc->GetFormatTable()->GetInputLineString( rItem.mfVal, 0, aValStr);
@@ -285,7 +287,7 @@ void ScFilterDlg::Init( const SfxItemSet& rArgSet )
                    else
                    {
                        SAL_WARN( "sc", "ScFilterDlg::Init: empty query string, really?");
                        aValStr = rItem.maString;
                        aValStr = aQueryStr;
                    }
                }
                else
@@ -293,7 +295,7 @@ void ScFilterDlg::Init( const SfxItemSet& rArgSet )
                    // XXX NOTE: if not ByString we just assume this has been
                    // set to a proper string corresponding to the numeric
                    // value earlier!
                    aValStr = rItem.maString;
                    aValStr = aQueryStr;
                }
            }
        }
@@ -1128,12 +1130,12 @@ IMPL_LINK( ScFilterDlg, ValModifyHdl, ComboBox*, pEd )
            }
            else
            {
                rItem.maString = aStrVal;
                rItem.maString = pDoc->GetSharedStringPool().intern(aStrVal);
                rItem.mfVal = 0.0;

                sal_uInt32 nIndex = 0;
                bool bNumber = pDoc->GetFormatTable()->IsNumberFormat(
                    rItem.maString, nIndex, rItem.mfVal);
                    rItem.maString.getString(), nIndex, rItem.mfVal);
                rItem.meType = bNumber ? ScQueryEntry::ByValue : ScQueryEntry::ByString;
            }

@@ -1193,7 +1195,7 @@ void ScFilterDlg::RefreshEditRow( size_t nOffset )
               nFieldSelPos = GetFieldSelPos( static_cast<SCCOL>(rEntry.nField) );

            const ScQueryEntry::Item& rItem = rEntry.GetQueryItem();
            const OUString& rQueryStr = rItem.maString;
            OUString aQueryStr = rItem.maString.getString();
            if (rEntry.IsQueryByEmpty())
            {
                aValStr = aStrEmpty;
@@ -1206,7 +1208,7 @@ void ScFilterDlg::RefreshEditRow( size_t nOffset )
            }
            else
            {
                aValStr = rQueryStr;
                aValStr = aQueryStr;
                maCondLbArr[i]->Enable();
            }
            maFieldLbArr[i]->Enable();
diff --git a/sc/source/ui/dbgui/pfiltdlg.cxx b/sc/source/ui/dbgui/pfiltdlg.cxx
index 8fab570..edcf8bf 100644
--- a/sc/source/ui/dbgui/pfiltdlg.cxx
+++ b/sc/source/ui/dbgui/pfiltdlg.cxx
@@ -42,6 +42,7 @@
#include "pfiltdlg.hxx"
#undef _PFILTDLG_CXX
#include <svl/zforlist.hxx>
#include "svl/sharedstringpool.hxx"

//==================================================================

@@ -199,7 +200,7 @@ void ScPivotFilterDlg::Init( const SfxItemSet& rArgSet )
        {
            const ScQueryEntry& rEntry = theQueryData.GetEntry(i);
            const ScQueryEntry::Item& rItem = rEntry.GetQueryItem();
            OUString aValStr = rItem.maString;
            OUString aValStr = rItem.maString.getString();
            if (rEntry.IsQueryByEmpty())
                aValStr = aStrEmpty;
            else if (rEntry.IsQueryByNonEmpty())
@@ -382,6 +383,8 @@ const ScQueryItem& ScPivotFilterDlg::GetOutputItem()
    sal_uInt16          nConnect1 = aLbConnect1.GetSelectEntryPos();
    sal_uInt16          nConnect2 = aLbConnect2.GetSelectEntryPos();

    svl::SharedStringPool& rPool = pViewData->GetDocument()->GetSharedStringPool();

    for ( SCSIZE i=0; i<3; i++ )
    {
        sal_uInt16      nField  = aFieldLbArr[i]->GetSelectEntryPos();
@@ -414,7 +417,7 @@ const ScQueryItem& ScPivotFilterDlg::GetOutputItem()
            }
            else
            {
                rItem.maString = aStrVal;
                rItem.maString = rPool.intern(aStrVal);
                rItem.mfVal = 0.0;
                rItem.meType = ScQueryEntry::ByString;
            }
diff --git a/sc/source/ui/unoobj/cellsuno.cxx b/sc/source/ui/unoobj/cellsuno.cxx
index 19c1e81..d081d1f 100644
--- a/sc/source/ui/unoobj/cellsuno.cxx
+++ b/sc/source/ui/unoobj/cellsuno.cxx
@@ -32,6 +32,7 @@
#include <editeng/langitem.hxx>
#include <sfx2/linkmgr.hxx>
#include <svl/srchitem.hxx>
#include "svl/sharedstringpool.hxx"
#include <svx/unomid.hxx>
#include <editeng/unoprnms.hxx>
#include <editeng/unotext.hxx>
@@ -5699,6 +5700,7 @@ void SAL_CALL ScCellRangeObj::filter( const uno::Reference<sheet::XSheetFilterDe
            static_cast<SCCOLROW>(aRange.aStart.Col()) :
            static_cast<SCCOLROW>(aRange.aStart.Row());
        SCSIZE nCount = aParam.GetEntryCount();
        svl::SharedStringPool& rPool = pDocSh->GetDocument()->GetSharedStringPool();
        for (SCSIZE i=0; i<nCount; i++)
        {
            ScQueryEntry& rEntry = aParam.GetEntry(i);
@@ -5711,8 +5713,9 @@ void SAL_CALL ScCellRangeObj::filter( const uno::Reference<sheet::XSheetFilterDe
                ScQueryEntry::Item& rItem = rItems.front();
                if (rItem.meType != ScQueryEntry::ByString)
                {
                    pDocSh->GetDocument()->GetFormatTable()->
                        GetInputLineString(rItem.mfVal, 0, rItem.maString);
                    OUString aStr;
                    pDocSh->GetDocument()->GetFormatTable()->GetInputLineString(rItem.mfVal, 0, aStr);
                    rItem.maString = rPool.intern(aStr);
                }
            }
        }
diff --git a/sc/source/ui/unoobj/datauno.cxx b/sc/source/ui/unoobj/datauno.cxx
index 56a7e80..594561b 100644
--- a/sc/source/ui/unoobj/datauno.cxx
+++ b/sc/source/ui/unoobj/datauno.cxx
@@ -17,8 +17,11 @@
 *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
 */

#include "datauno.hxx"

#include <svl/smplhint.hxx>
#include <svl/zforlist.hxx>
#include "svl/sharedstringpool.hxx"
#include <vcl/svapp.hxx>

#include <com/sun/star/awt/XBitmap.hpp>
@@ -31,7 +34,6 @@
#include <com/sun/star/sheet/FilterOperator2.hpp>
#include <com/sun/star/sheet/TableFilterField2.hpp>

#include "datauno.hxx"
#include "dapiuno.hxx"
#include "cellsuno.hxx"
#include "miscuno.hxx"
@@ -1061,7 +1063,7 @@ uno::Sequence<sheet::TableFilterField> SAL_CALL ScFilterDescriptorBase::getFilte
                                                             sheet::FilterConnection_OR;
        aField.Field         = rEntry.nField;
        aField.IsNumeric     = rItem.meType != ScQueryEntry::ByString;
        aField.StringValue   = rItem.maString;
        aField.StringValue   = rItem.maString.getString();
        aField.NumericValue  = rItem.mfVal;

        switch (rEntry.eOp)             // ScQueryOp
@@ -1176,6 +1178,7 @@ void fillQueryParam(
    rParam.Resize(nCount);

    const sheet::TableFilterField2* pAry = aFilterFields.getConstArray();
    svl::SharedStringPool& rPool = pDoc->GetSharedStringPool();
    for (size_t i = 0; i < nCount; ++i)
    {
        ScQueryEntry& rEntry = rParam.GetEntry(i);
@@ -1188,10 +1191,14 @@ void fillQueryParam(
            ScQueryEntry::Item& rItem = rItems.front();
            rItem.meType    = pAry[i].IsNumeric ? ScQueryEntry::ByValue : ScQueryEntry::ByString;
            rItem.mfVal     = pAry[i].NumericValue;
            rItem.maString  = pAry[i].StringValue;
            rItem.maString = rPool.intern(pAry[i].StringValue);

            if (rItem.meType == ScQueryEntry::ByValue && pDoc)
                pDoc->GetFormatTable()->GetInputLineString(rItem.mfVal, 0, rItem.maString);
            if (rItem.meType == ScQueryEntry::ByValue)
            {
                OUString aStr;
                pDoc->GetFormatTable()->GetInputLineString(rItem.mfVal, 0, aStr);
                rItem.maString = rPool.intern(aStr);
            }
        }
    }

@@ -1207,6 +1214,7 @@ void fillQueryParam(
    size_t nCount = static_cast<size_t>(aFilterFields.getLength());
    rParam.Resize(nCount);

    svl::SharedStringPool& rPool = pDoc->GetSharedStringPool();
    const sheet::TableFilterField3* pAry = aFilterFields.getConstArray();
    for (size_t i = 0; i < nCount; ++i)
    {
@@ -1223,10 +1231,14 @@ void fillQueryParam(
                ScQueryEntry::Item aItem;
                aItem.meType   = rVals[j].IsNumeric ? ScQueryEntry::ByValue : ScQueryEntry::ByString;
                aItem.mfVal    = rVals[j].NumericValue;
                aItem.maString = rVals[j].StringValue;
                aItem.maString = rPool.intern(rVals[j].StringValue);

                if (aItem.meType == ScQueryEntry::ByValue && pDoc)
                    pDoc->GetFormatTable()->GetInputLineString(aItem.mfVal, 0, aItem.maString);
                if (aItem.meType == ScQueryEntry::ByValue)
                {
                    OUString aStr;
                    pDoc->GetFormatTable()->GetInputLineString(aItem.mfVal, 0, aStr);
                    aItem.maString = rPool.intern(aStr);
                }

                rItems.push_back(aItem);
            }
@@ -1282,7 +1294,7 @@ throw(uno::RuntimeException)
        {
            const ScQueryEntry::Item& rItem = rEntry.GetQueryItems().front();
            aField.IsNumeric     = rItem.meType != ScQueryEntry::ByString;
            aField.StringValue   = rItem.maString;
            aField.StringValue   = rItem.maString.getString();
            aField.NumericValue  = rItem.mfVal;
        }

@@ -1340,7 +1352,7 @@ uno::Sequence<sheet::TableFilterField3> SAL_CALL ScFilterDescriptorBase::getFilt
            for (size_t j = 0; itr != itrEnd; ++itr, ++j)
            {
                aField.Values[j].IsNumeric = itr->meType != ScQueryEntry::ByString;
                aField.Values[j].StringValue = itr->maString;
                aField.Values[j].StringValue = itr->maString.getString();
                aField.Values[j].NumericValue = itr->mfVal;

            }
@@ -1362,6 +1374,8 @@ void SAL_CALL ScFilterDescriptorBase::setFilterFields(
    SCSIZE nCount = static_cast<SCSIZE>(aFilterFields.getLength());
    aParam.Resize( nCount );

    ScDocument* pDoc = pDocSh->GetDocument();
    svl::SharedStringPool& rPool = pDoc->GetSharedStringPool();
    const sheet::TableFilterField* pAry = aFilterFields.getConstArray();
    SCSIZE i;
    for (i=0; i<nCount; i++)
@@ -1375,10 +1389,14 @@ void SAL_CALL ScFilterDescriptorBase::setFilterFields(
        rEntry.nField   = pAry[i].Field;
        rItem.meType    = pAry[i].IsNumeric ? ScQueryEntry::ByValue : ScQueryEntry::ByString;
        rItem.mfVal     = pAry[i].NumericValue;
        rItem.maString  = pAry[i].StringValue;
        rItem.maString = rPool.intern(pAry[i].StringValue);

        if (rItem.meType != ScQueryEntry::ByString && pDocSh)
            pDocSh->GetDocument()->GetFormatTable()->GetInputLineString(rItem.mfVal, 0, rItem.maString);
        if (rItem.meType != ScQueryEntry::ByString)
        {
            OUString aStr;
            pDoc->GetFormatTable()->GetInputLineString(rItem.mfVal, 0, aStr);
            rItem.maString = rPool.intern(aStr);
        }

        switch (pAry[i].Operator)           // FilterOperator
        {
diff --git a/sc/source/ui/view/gridwin.cxx b/sc/source/ui/view/gridwin.cxx
index 2de9a77..62b1651 100644
--- a/sc/source/ui/view/gridwin.cxx
+++ b/sc/source/ui/view/gridwin.cxx
@@ -38,6 +38,7 @@
#include <svl/stritem.hxx>
#include <svtools/svtabbx.hxx>
#include <svl/urlbmk.hxx>
#include "svl/sharedstringpool.hxx"
#include <vcl/cursor.hxx>
#include <vcl/graph.hxx>
#include <vcl/hatch.hxx>
@@ -646,12 +647,14 @@ public:
class AddItemToEntry : public std::unary_function<OUString, void>
{
    ScQueryEntry::QueryItemsType& mrItems;
    svl::SharedStringPool& mrPool;
public:
    AddItemToEntry(ScQueryEntry::QueryItemsType& rItems) : mrItems(rItems) {}
    AddItemToEntry(ScQueryEntry::QueryItemsType& rItems, svl::SharedStringPool& rPool) :
        mrItems(rItems), mrPool(rPool) {}
    void operator() (const OUString& rSelected)
    {
        ScQueryEntry::Item aNew;
        aNew.maString = rSelected;
        aNew.maString = mrPool.intern(rSelected);
        aNew.meType = ScQueryEntry::ByString;
        aNew.mfVal = 0.0;
        mrItems.push_back(aNew);
@@ -667,7 +670,7 @@ public:

    void operator() (const ScQueryEntry::Item& rItem)
    {
        mrSet.insert(rItem.maString);
        mrSet.insert(rItem.maString.getString());
    }
};

@@ -780,12 +783,13 @@ void ScGridWindow::UpdateAutoFilterFromMenu(AutoFilterMode eMode)
    if (!pDBData)
        return;

    ScDocument* pDoc = pViewData->GetDocument();
    svl::SharedStringPool& rPool = pDoc->GetSharedStringPool();
    switch (eMode)
    {
        case SortAscending:
        case SortDescending:
        {
            ScDocument* pDoc = pViewData->GetDocument();
            SCTAB nTab = pViewData->GetTabNo();
            SCCOL nCol = rPos.Col();
            ScSortParam aSortParam;
@@ -866,13 +870,13 @@ void ScGridWindow::UpdateAutoFilterFromMenu(AutoFilterMode eMode)

                ScQueryEntry::QueryItemsType& rItems = pEntry->GetQueryItems();
                rItems.clear();
                std::for_each(aSelected.begin(), aSelected.end(), AddItemToEntry(rItems));
                std::for_each(aSelected.begin(), aSelected.end(), AddItemToEntry(rItems, rPool));
            }
            break;
            case Top10:
                pEntry->eOp = SC_TOPVAL;
                pEntry->GetQueryItem().meType = ScQueryEntry::ByString;
                pEntry->GetQueryItem().maString = OUString("10");
                pEntry->GetQueryItem().maString = rPool.intern("10");
            break;
            case Empty:
                pEntry->SetQueryByEmpty();
@@ -1230,15 +1234,15 @@ void ScGridWindow::LaunchDataSelectMenu( SCCOL nCol, SCROW nRow, bool bDataSelec
                            bValid = false;
                    if (rEntry.nField == nCol)
                    {
                        const OUString& rQueryStr = rEntry.GetQueryItem().maString;
                        OUString aQueryStr = rEntry.GetQueryItem().maString.getString();
                        if (rEntry.eOp == SC_EQUAL)
                        {
                            if (!rQueryStr.isEmpty())
                            if (!aQueryStr.isEmpty())
                            {
                                nSelPos = pFilterBox->GetEntryPos(rQueryStr);
                                nSelPos = pFilterBox->GetEntryPos(aQueryStr);
                            }
                        }
                        else if ( rEntry.eOp == SC_TOPVAL && rQueryStr == "10" )
                        else if ( rEntry.eOp == SC_TOPVAL && aQueryStr == "10" )
                            nSelPos = SC_AUTOFILTER_TOP10;
                        else
                            nSelPos = SC_AUTOFILTER_CUSTOM;
@@ -1381,6 +1385,7 @@ void ScGridWindow::ExecFilter( sal_uLong nSel,
{
    SCTAB nTab = pViewData->GetTabNo();
    ScDocument* pDoc = pViewData->GetDocument();
    svl::SharedStringPool& rPool = pDoc->GetSharedStringPool();

    ScDBData* pDBData = pDoc->GetDBAtCursor( nCol, nRow, nTab );
    if (pDBData)
@@ -1454,7 +1459,7 @@ void ScGridWindow::ExecFilter( sal_uLong nSel,
                    if ( nSel == SC_AUTOFILTER_TOP10 )
                    {
                        rNewEntry.eOp = SC_TOPVAL;
                        rItem.maString = OUString("10");
                        rItem.maString = rPool.intern("10");
                    }
                    else if (nSel == SC_AUTOFILTER_EMPTY)
                    {
@@ -1467,7 +1472,7 @@ void ScGridWindow::ExecFilter( sal_uLong nSel,
                    else
                    {
                        rNewEntry.eOp = SC_EQUAL;
                        rItem.maString = aValue;
                        rItem.maString = rPool.intern(aValue);
                    }
                    if (nQueryPos > 0)
                        rNewEntry.eConnect   = SC_AND;