Use shared string's fast equality check for ValidQuery().

Change-Id: Ib84087a10cc10a7533e64c4e8998354b52017df7
diff --git a/sc/source/core/data/table3.cxx b/sc/source/core/data/table3.cxx
index 10c7ca7..1e21621 100644
--- a/sc/source/core/data/table3.cxx
+++ b/sc/source/core/data/table3.cxx
@@ -1196,7 +1196,8 @@ namespace {

class QueryEvaluator
{
    const ScDocument& mrDoc;
    ScDocument& mrDoc;
    svl::SharedStringPool& mrStrPool;
    const ScTable& mrTab;
    const ScQueryParam& mrParam;
    const bool* mpTestEqualCondition;
@@ -1259,9 +1260,10 @@ class QueryEvaluator
    }

public:
    QueryEvaluator(const ScDocument& rDoc, const ScTable& rTab, const ScQueryParam& rParam,
    QueryEvaluator(ScDocument& rDoc, const ScTable& rTab, const ScQueryParam& rParam,
                   const bool* pTestEqualCondition) :
        mrDoc(rDoc),
        mrStrPool(rDoc.GetSharedStringPool()),
        mrTab(rTab),
        mrParam(rParam),
        mpTestEqualCondition(pTestEqualCondition),
@@ -1405,7 +1407,7 @@ public:
        bool bOk = false;
        bool bTestEqual = false;
        bool bMatchWholeCell = mbMatchWholeCell;
        OUString  aCellStr;
        svl::SharedString aCellStr;
        if (isPartialTextMatchOp(rEntry))
            // may have to do partial textural comparison.
            bMatchWholeCell = false;
@@ -1415,16 +1417,24 @@ public:
            if (rCell.meType == CELLTYPE_FORMULA && rCell.mpFormula->GetErrCode())
            {
                // Error cell is evaluated as string (for now).
                aCellStr = ScGlobal::GetErrorString(rCell.mpFormula->GetErrCode());
                aCellStr = mrStrPool.intern(ScGlobal::GetErrorString(rCell.mpFormula->GetErrCode()));
            }
            else if (rCell.meType == CELLTYPE_STRING)
                aCellStr = *rCell.mpString;
            else
            {
                sal_uLong nFormat = mrTab.GetNumberFormat( static_cast<SCCOL>(rEntry.nField), nRow );
                ScCellFormat::GetInputString(rCell, nFormat, aCellStr, *mrDoc.GetFormatTable(), &mrDoc);
                OUString aStr;
                ScCellFormat::GetInputString(rCell, nFormat, aStr, *mrDoc.GetFormatTable(), &mrDoc);
                aCellStr = mrStrPool.intern(aStr);
            }
        }
        else
            mrTab.GetInputString( static_cast<SCCOL>(rEntry.nField), nRow, aCellStr );
        {
            OUString aStr;
            mrTab.GetInputString(static_cast<SCCOL>(rEntry.nField), nRow, aStr);
            aCellStr = mrStrPool.intern(aStr);
        }

        bool bRealRegExp = isRealRegExp(rEntry);
        bool bTestRegExp = isTestRegExp(rEntry);
@@ -1441,12 +1451,12 @@ public:
                nEnd = 0;
                nStart = aCellStr.getLength();
                bMatch = rEntry.GetSearchTextPtr( mrParam.bCaseSens )
                    ->SearchBackward( aCellStr, &nStart, &nEnd );
                    ->SearchBackward(aCellStr.getString(), &nStart, &nEnd);
            }
            else
            {
                bMatch = rEntry.GetSearchTextPtr( mrParam.bCaseSens )
                    ->SearchForward( aCellStr, &nStart, &nEnd );
                    ->SearchForward(aCellStr.getString(), &nStart, &nEnd);
            }
            if ( bMatch && bMatchWholeCell
                    && (nStart != 0 || nEnd != aCellStr.getLength()) )
@@ -1498,8 +1508,12 @@ public:
                }
                else if ( bMatchWholeCell )
                {
                    // TODO: Use shared string for faster equality check.
                    bOk = mpTransliteration->isEqual(aCellStr, rItem.maString.getString());
                    // Fast string equality check by comparing string identifiers.
                    if (mrParam.bCaseSens)
                        bOk = aCellStr.getData() == rItem.maString.getData();
                    else
                        bOk = aCellStr.getDataIgnoreCase() == rItem.maString.getDataIgnoreCase();

                    if ( rEntry.eOp == SC_NOT_EQUAL )
                        bOk = !bOk;
                }
@@ -1507,7 +1521,7 @@ public:
                {
                    OUString aQueryStr = rItem.maString.getString();
                    OUString aCell( mpTransliteration->transliterate(
                        aCellStr, ScGlobal::eLnge, 0, aCellStr.getLength(),
                        aCellStr.getString(), ScGlobal::eLnge, 0, aCellStr.getLength(),
                        NULL ) );
                    OUString aQuer( mpTransliteration->transliterate(
                        aQueryStr, ScGlobal::eLnge, 0, aQueryStr.getLength(),
@@ -1547,7 +1561,7 @@ public:
            else
            {   // use collator here because data was probably sorted
                sal_Int32 nCompare = mpCollator->compareString(
                    aCellStr, rItem.maString.getString());
                    aCellStr.getString(), rItem.maString.getString());
                switch (rEntry.eOp)
                {
                    case SC_LESS :