fdo#79578: Properly update formulas upon change in db collection.

Update it to handle formula groups correctly.

(cherry picked from commit 300845922eec7a28bc1da337acd21f138685d759)

Conflicts:
	sc/source/ui/docshell/dbdocfun.cxx
	sc/source/ui/docshell/docfunc.cxx
	sc/source/ui/undo/undocell.cxx
	sc/source/ui/undo/undodat.cxx
	sc/source/ui/unoobj/nameuno.cxx
	sc/source/ui/view/viewfunc.cxx

Change-Id: I009a7fcf3d3fb17ef6951c50534ca6bc1fffc259
Reviewed-on: https://gerrit.libreoffice.org/10604
Reviewed-by: Eike Rathke <erack@redhat.com>
Tested-by: Eike Rathke <erack@redhat.com>
diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx
index 9bb6bd6..09b1588 100644
--- a/sc/inc/column.hxx
+++ b/sc/inc/column.hxx
@@ -381,9 +381,12 @@ public:
    void PreprocessRangeNameUpdate(
        sc::EndListeningContext& rEndListenCxt, sc::CompileFormulaContext& rCompileCxt );

    void PostprocessRangeNameUpdate(
    void CompileHybridFormula(
        sc::StartListeningContext& rStartListenCxt, sc::CompileFormulaContext& rCompileCxt );

    void PreprocessDBDataUpdate(
        sc::EndListeningContext& rEndListenCxt, sc::CompileFormulaContext& rCompileCxt );

    const SfxPoolItem*      GetAttr( SCROW nRow, sal_uInt16 nWhich ) const;
    const ScPatternAttr*    GetPattern( SCROW nRow ) const;
    const ScPatternAttr*    GetMostUsedPattern( SCROW nStartRow, SCROW nEndRow ) const;
@@ -486,7 +489,6 @@ public:
    void CollectListeners( std::vector<SvtListener*>& rListeners, SCROW nRow1, SCROW nRow2 );

    void CompileDBFormula( sc::CompileFormulaContext& rCxt );
    void CompileDBFormula( sc::CompileFormulaContext& rCxt, bool bCreateFormulaString );
    void CompileColRowNameFormula( sc::CompileFormulaContext& rCxt );

    sal_Int32   GetMaxStringLen( SCROW nRowStart, SCROW nRowEnd, rtl_TextEncoding eCharSet ) const;
diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index bfeefc3..c8ca888 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -521,11 +521,8 @@ public:
     * Call this immediately before updating all named ranges.
     */
    SC_DLLPUBLIC void PreprocessRangeNameUpdate();

    /**
     * Call this immediately after all named ranges have been updated.
     */
    SC_DLLPUBLIC void PostprocessRangeNameUpdate();
    SC_DLLPUBLIC void PreprocessDBDataUpdate();
    SC_DLLPUBLIC void CompileHybridFormula();

    /**
     * Insert a new named expression to the global scope.
@@ -1981,7 +1978,6 @@ public:
    void                StartTrackTimer();

    void            CompileDBFormula();
    void            CompileDBFormula( bool bCreateFormulaString );
    void            CompileColRowNameFormula();

    /** Maximum string length of a column, e.g. for dBase export.
diff --git a/sc/inc/formulacell.hxx b/sc/inc/formulacell.hxx
index 959779a7..70072e5 100644
--- a/sc/inc/formulacell.hxx
+++ b/sc/inc/formulacell.hxx
@@ -309,7 +309,6 @@ public:
    bool            IsRunning() const;
    void            SetRunning( bool bVal );
    void CompileDBFormula( sc::CompileFormulaContext& rCxt );
    void CompileDBFormula( sc::CompileFormulaContext& rCxt, bool bCreateFormulaString );
    void CompileColRowNameFormula( sc::CompileFormulaContext& rCxt );
    ScFormulaCell*  GetPrevious() const;
    ScFormulaCell*  GetNext() const;
diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx
index c5b58b5..e6289ec 100644
--- a/sc/inc/table.hxx
+++ b/sc/inc/table.hxx
@@ -860,9 +860,12 @@ public:
    void PreprocessRangeNameUpdate(
        sc::EndListeningContext& rEndListenCxt, sc::CompileFormulaContext& rCompileCxt );

    void PostprocessRangeNameUpdate(
    void CompileHybridFormula(
        sc::StartListeningContext& rStartListenCxt, sc::CompileFormulaContext& rCompileCxt );

    void PreprocessDBDataUpdate(
        sc::EndListeningContext& rEndListenCxt, sc::CompileFormulaContext& rCompileCxt );

    ScConditionalFormatList* GetCondFormList();
    const ScConditionalFormatList* GetCondFormList() const;
    void SetCondFormList( ScConditionalFormatList* pList );
@@ -1045,7 +1048,6 @@ private:
    bool        GetNextMarkedCell( SCCOL& rCol, SCROW& rRow, const ScMarkData& rMark ) const;
    bool        TestTabRefAbs(SCTAB nTable) const;
    void CompileDBFormula( sc::CompileFormulaContext& rCxt );
    void CompileDBFormula( sc::CompileFormulaContext& rCxt, bool bCreateFormulaString );
    void CompileColRowNameFormula( sc::CompileFormulaContext& rCxt );

    void        StartListening( const ScAddress& rAddress, SvtListener* pListener );
diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx
index f72c99e..c19be82 100644
--- a/sc/source/core/data/column2.cxx
+++ b/sc/source/core/data/column2.cxx
@@ -2938,21 +2938,6 @@ public:
    }
};

class CompileDBFormula2Handler
{
    sc::CompileFormulaContext& mrCxt;
    bool mbCreateFormulaString;

public:
    CompileDBFormula2Handler( sc::CompileFormulaContext& rCxt, bool bCreateFormulaString ) :
        mrCxt(rCxt), mbCreateFormulaString(bCreateFormulaString) {}

    void operator() (size_t, ScFormulaCell* p)
    {
        p->CompileDBFormula(mrCxt, mbCreateFormulaString);
    }
};

struct CompileColRowNameFormulaHandler
{
    sc::CompileFormulaContext& mrCxt;
@@ -2974,13 +2959,6 @@ void ScColumn::CompileDBFormula( sc::CompileFormulaContext& rCxt )
    RegroupFormulaCells();
}

void ScColumn::CompileDBFormula( sc::CompileFormulaContext& rCxt, bool bCreateFormulaString )
{
    CompileDBFormula2Handler aFunc(rCxt, bCreateFormulaString);
    sc::ProcessFormula(maCells, aFunc);
    RegroupFormulaCells();
}

void ScColumn::CompileColRowNameFormula( sc::CompileFormulaContext& rCxt )
{
    CompileColRowNameFormulaHandler aFunc(rCxt);
diff --git a/sc/source/core/data/column4.cxx b/sc/source/core/data/column4.cxx
index a883891..131f8cc 100644
--- a/sc/source/core/data/column4.cxx
+++ b/sc/source/core/data/column4.cxx
@@ -552,15 +552,19 @@ void ScColumn::GetNotesInRange(SCROW nStartRow, SCROW nEndRow,

namespace {

class PreRangeNameUpdateHandler
class RecompileByOpcodeHandler
{
    ScDocument* mpDoc;
    const boost::unordered_set<OpCode>& mrOps;
    sc::EndListeningContext& mrEndListenCxt;
    sc::CompileFormulaContext& mrCompileFormulaCxt;

public:
    PreRangeNameUpdateHandler( ScDocument* pDoc, sc::EndListeningContext& rEndListenCxt, sc::CompileFormulaContext& rCompileCxt ) :
    RecompileByOpcodeHandler(
        ScDocument* pDoc, const boost::unordered_set<OpCode>& rOps,
        sc::EndListeningContext& rEndListenCxt, sc::CompileFormulaContext& rCompileCxt ) :
        mpDoc(pDoc),
        mrOps(rOps),
        mrEndListenCxt(rEndListenCxt),
        mrCompileFormulaCxt(rCompileCxt) {}

@@ -580,12 +584,7 @@ public:
            pTop = rEntry.mpCell;

        ScTokenArray* pCode = pTop->GetCode();

        boost::unordered_set<OpCode> aOps;
        aOps.insert(ocBad);
        aOps.insert(ocColRowName);
        aOps.insert(ocName);
        bool bRecompile = pCode->HasOpCodes(aOps);
        bool bRecompile = pCode->HasOpCodes(mrOps);

        if (bRecompile)
        {
@@ -621,14 +620,14 @@ public:
    }
};

class PostRangeNameUpdateHandler
class CompileHybridFormulaHandler
{
    ScDocument* mpDoc;
    sc::StartListeningContext& mrStartListenCxt;
    sc::CompileFormulaContext& mrCompileFormulaCxt;

public:
    PostRangeNameUpdateHandler( ScDocument* pDoc, sc::StartListeningContext& rStartListenCxt, sc::CompileFormulaContext& rCompileCxt ) :
    CompileHybridFormulaHandler( ScDocument* pDoc, sc::StartListeningContext& rStartListenCxt, sc::CompileFormulaContext& rCompileCxt ) :
        mpDoc(pDoc),
        mrStartListenCxt(rStartListenCxt),
        mrCompileFormulaCxt(rCompileCxt) {}
@@ -694,17 +693,35 @@ void ScColumn::PreprocessRangeNameUpdate(
    // Collect all formula groups.
    std::vector<sc::FormulaGroupEntry> aGroups = GetFormulaGroupEntries();

    PreRangeNameUpdateHandler aFunc(pDocument, rEndListenCxt, rCompileCxt);
    boost::unordered_set<OpCode> aOps;
    aOps.insert(ocBad);
    aOps.insert(ocColRowName);
    aOps.insert(ocName);
    RecompileByOpcodeHandler aFunc(pDocument, aOps, rEndListenCxt, rCompileCxt);
    std::for_each(aGroups.begin(), aGroups.end(), aFunc);
}

void ScColumn::PostprocessRangeNameUpdate(
void ScColumn::PreprocessDBDataUpdate(
    sc::EndListeningContext& rEndListenCxt, sc::CompileFormulaContext& rCompileCxt )
{
    // Collect all formula groups.
    std::vector<sc::FormulaGroupEntry> aGroups = GetFormulaGroupEntries();

    boost::unordered_set<OpCode> aOps;
    aOps.insert(ocBad);
    aOps.insert(ocColRowName);
    aOps.insert(ocDBArea);
    RecompileByOpcodeHandler aFunc(pDocument, aOps, rEndListenCxt, rCompileCxt);
    std::for_each(aGroups.begin(), aGroups.end(), aFunc);
}

void ScColumn::CompileHybridFormula(
    sc::StartListeningContext& rStartListenCxt, sc::CompileFormulaContext& rCompileCxt )
{
    // Collect all formula groups.
    std::vector<sc::FormulaGroupEntry> aGroups = GetFormulaGroupEntries();

    PostRangeNameUpdateHandler aFunc(pDocument, rStartListenCxt, rCompileCxt);
    CompileHybridFormulaHandler aFunc(pDocument, rStartListenCxt, rCompileCxt);
    std::for_each(aGroups.begin(), aGroups.end(), aFunc);
}

diff --git a/sc/source/core/data/documen4.cxx b/sc/source/core/data/documen4.cxx
index a156c3b..b8e5958 100644
--- a/sc/source/core/data/documen4.cxx
+++ b/sc/source/core/data/documen4.cxx
@@ -549,17 +549,6 @@ void ScDocument::CompileDBFormula()
    }
}

void ScDocument::CompileDBFormula( bool bCreateFormulaString )
{
    sc::CompileFormulaContext aCxt(this);
    TableContainer::iterator it = maTabs.begin();
    for (;it != maTabs.end(); ++it)
    {
        if (*it)
            (*it)->CompileDBFormula(aCxt, bCreateFormulaString);
    }
}

void ScDocument::CompileColRowNameFormula()
{
    sc::CompileFormulaContext aCxt(this);
diff --git a/sc/source/core/data/document10.cxx b/sc/source/core/data/document10.cxx
index f633a479..3629d4d 100644
--- a/sc/source/core/data/document10.cxx
+++ b/sc/source/core/data/document10.cxx
@@ -257,7 +257,20 @@ void ScDocument::PreprocessRangeNameUpdate()
    }
}

void ScDocument::PostprocessRangeNameUpdate()
void ScDocument::PreprocessDBDataUpdate()
{
    sc::EndListeningContext aEndListenCxt(*this);
    sc::CompileFormulaContext aCompileCxt(this);

    TableContainer::iterator it = maTabs.begin(), itEnd = maTabs.end();
    for (; it != itEnd; ++it)
    {
        ScTable* p = *it;
        p->PreprocessDBDataUpdate(aEndListenCxt, aCompileCxt);
    }
}

void ScDocument::CompileHybridFormula()
{
    sc::StartListeningContext aStartListenCxt(*this);
    sc::CompileFormulaContext aCompileCxt(this);
@@ -265,7 +278,7 @@ void ScDocument::PostprocessRangeNameUpdate()
    for (; it != itEnd; ++it)
    {
        ScTable* p = *it;
        p->PostprocessRangeNameUpdate(aStartListenCxt, aCompileCxt);
        p->CompileHybridFormula(aStartListenCxt, aCompileCxt);
    }
}

diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx
index 1d844b1..a6f3583 100644
--- a/sc/source/core/data/formulacell.cxx
+++ b/sc/source/core/data/formulacell.cxx
@@ -3442,57 +3442,6 @@ void ScFormulaCell::CompileDBFormula( sc::CompileFormulaContext& rCxt )
    }
}

void ScFormulaCell::CompileDBFormula( sc::CompileFormulaContext& rCxt, bool bCreateFormulaString )
{
    // Two phases must be called after each other
    // 1. Formula String with old generated names
    // 2. Formula String with new generated names
    if ( bCreateFormulaString )
    {
        bool bRecompile = false;
        pCode->Reset();
        for ( FormulaToken* p = pCode->First(); p && !bRecompile; p = pCode->Next() )
        {
            switch ( p->GetOpCode() )
            {
                case ocBad:             // DB Area eventually goes bad
                case ocColRowName:      // in case of the same names
                case ocDBArea:          // DB Area
                    bRecompile = true;
                break;
                case ocName:
                    if ( p->GetIndex() >= SC_START_INDEX_DB_COLL )
                        bRecompile = true;  // DB Area
                break;
                default:
                    ; // nothing
            }
        }
        if ( bRecompile )
        {
            OUString aFormula = GetFormula(rCxt);
            if ( GetMatrixFlag() != MM_NONE && !aFormula.isEmpty() )
            {
                if ( aFormula[ aFormula.getLength()-1 ] == '}' )
                    aFormula = aFormula.copy( 0, aFormula.getLength()-1 );
                if ( aFormula[0] == '{' )
                    aFormula = aFormula.copy( 1 );
            }
            EndListeningTo( pDocument );
            pDocument->RemoveFromFormulaTree( this );
            pCode->Clear();
            SetHybridFormula(aFormula, rCxt.getGrammar());
        }
    }
    else if ( !pCode->GetLen() && !aResult.GetHybridFormula().isEmpty() )
    {
        rCxt.setGrammar(eTempGrammar);
        Compile(rCxt, aResult.GetHybridFormula(), false);
        aResult.SetToken( NULL);
        SetDirty();
    }
}

void ScFormulaCell::CompileColRowNameFormula( sc::CompileFormulaContext& rCxt )
{
    pCode->Reset();
diff --git a/sc/source/core/data/table4.cxx b/sc/source/core/data/table4.cxx
index f378c89..e1e04d0 100644
--- a/sc/source/core/data/table4.cxx
+++ b/sc/source/core/data/table4.cxx
@@ -2178,12 +2178,6 @@ void ScTable::CompileDBFormula( sc::CompileFormulaContext& rCxt )
        aCol[i].CompileDBFormula(rCxt);
}

void ScTable::CompileDBFormula( sc::CompileFormulaContext& rCxt, bool bCreateFormulaString )
{
    for (SCCOL i = 0; i <= MAXCOL; ++i)
        aCol[i].CompileDBFormula(rCxt, bCreateFormulaString);
}

void ScTable::CompileColRowNameFormula( sc::CompileFormulaContext& rCxt )
{
    for (SCCOL i = 0; i <= MAXCOL; ++i)
diff --git a/sc/source/core/data/table7.cxx b/sc/source/core/data/table7.cxx
index 6ff53de..6763565 100644
--- a/sc/source/core/data/table7.cxx
+++ b/sc/source/core/data/table7.cxx
@@ -89,11 +89,18 @@ void ScTable::PreprocessRangeNameUpdate(
        aCol[i].PreprocessRangeNameUpdate(rEndListenCxt, rCompileCxt);
}

void ScTable::PostprocessRangeNameUpdate(
void ScTable::PreprocessDBDataUpdate(
    sc::EndListeningContext& rEndListenCxt, sc::CompileFormulaContext& rCompileCxt )
{
    for (SCCOL i = 0; i <= MAXCOL; ++i)
        aCol[i].PreprocessDBDataUpdate(rEndListenCxt, rCompileCxt);
}

void ScTable::CompileHybridFormula(
    sc::StartListeningContext& rStartListenCxt, sc::CompileFormulaContext& rCompileCxt )
{
    for (SCCOL i = 0; i <= MAXCOL; ++i)
        aCol[i].PostprocessRangeNameUpdate(rStartListenCxt, rCompileCxt);
        aCol[i].CompileHybridFormula(rStartListenCxt, rCompileCxt);
}

void ScTable::UpdateScriptTypes( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 )
diff --git a/sc/source/ui/docshell/dbdocfun.cxx b/sc/source/ui/docshell/dbdocfun.cxx
index 40b67de..dbc75d0 100644
--- a/sc/source/ui/docshell/dbdocfun.cxx
+++ b/sc/source/ui/docshell/dbdocfun.cxx
@@ -77,7 +77,7 @@ bool ScDBDocFunc::AddDBRange( const OUString& rName, const ScRange& rRange, bool
    bool bCompile = !pDoc->IsImportingXML();
    bool bOk;
    if ( bCompile )
        pDoc->CompileDBFormula( true );     // CreateFormulaString
        pDoc->PreprocessDBDataUpdate();
    if ( rName == STR_DB_LOCAL_NONAME )
    {
        pDoc->SetAnonymousDBData(rRange.aStart.Tab() , pNew);
@@ -88,7 +88,7 @@ bool ScDBDocFunc::AddDBRange( const OUString& rName, const ScRange& rRange, bool
        bOk = pDocColl->getNamedDBs().insert(pNew);
    }
    if ( bCompile )
        pDoc->CompileDBFormula( false );    // CompileFormulaString
        pDoc->CompileHybridFormula();

    if (!bOk)
    {
@@ -126,9 +126,9 @@ bool ScDBDocFunc::DeleteDBRange(const OUString& rName)
        if (bUndo)
            pUndoColl = new ScDBCollection( *pDocColl );

        pDoc->CompileDBFormula( true );     // CreateFormulaString
        pDoc->PreprocessDBDataUpdate();
        rDBs.erase(*p);
        pDoc->CompileDBFormula( false );    // CompileFormulaString
        pDoc->CompileHybridFormula();

        if (bUndo)
        {
@@ -162,7 +162,7 @@ bool ScDBDocFunc::RenameDBRange( const OUString& rOld, const OUString& rNew )

        ScDBCollection* pUndoColl = new ScDBCollection( *pDocColl );

        pDoc->CompileDBFormula(true);               // CreateFormulaString
        pDoc->PreprocessDBDataUpdate();
        rDBs.erase(*pOld);
        bool bInserted = rDBs.insert(pNewData);
        if (!bInserted)                             // Fehler -> alten Zustand wiederherstellen
@@ -171,7 +171,7 @@ bool ScDBDocFunc::RenameDBRange( const OUString& rOld, const OUString& rNew )
            pDoc->SetDBCollection(pUndoColl);       // gehoert dann dem Dokument
        }

        pDoc->CompileDBFormula( false );            // CompileFormulaString
        pDoc->CompileHybridFormula();

        if (bInserted)                              // Einfuegen hat geklappt
        {
diff --git a/sc/source/ui/docshell/docfunc.cxx b/sc/source/ui/docshell/docfunc.cxx
index b67ef09..a52c3bd 100644
--- a/sc/source/ui/docshell/docfunc.cxx
+++ b/sc/source/ui/docshell/docfunc.cxx
@@ -4852,7 +4852,7 @@ bool ScDocFunc::SetNewRangeNames( ScRangeName* pNewRanges, bool bModifyDoc, SCTA
    else
        pDoc->SetRangeName( pNewRanges );       // takes ownership
    if ( bCompile )
        pDoc->PostprocessRangeNameUpdate();
        pDoc->CompileHybridFormula();

    if (bModifyDoc)
    {
@@ -4878,7 +4878,7 @@ void ScDocFunc::ModifyAllRangeNames( const boost::ptr_map<OUString, ScRangeName>

    pDoc->PreprocessRangeNameUpdate();
    pDoc->SetAllRangeNames(rRangeMap);
    pDoc->PostprocessRangeNameUpdate();
    pDoc->CompileHybridFormula();

    aModificator.SetDocumentModified();
    SFX_APP()->Broadcast(SfxSimpleHint(SC_HINT_AREAS_CHANGED));
diff --git a/sc/source/ui/docshell/docsh5.cxx b/sc/source/ui/docshell/docsh5.cxx
index c52e287..ecec2a6 100644
--- a/sc/source/ui/docshell/docsh5.cxx
+++ b/sc/source/ui/docshell/docsh5.cxx
@@ -259,7 +259,7 @@ ScDBData* ScDocShell::GetDBData( const ScRange& rMarked, ScGetDBMode eMode, ScGe
            OUString aNewName;
            if (eMode==SC_DB_IMPORT)
            {
                aDocument.CompileDBFormula( true );         // CreateFormulaString
                aDocument.PreprocessDBDataUpdate();
                pUndoColl = new ScDBCollection( *pColl );   // Undo fuer Import1-Bereich

                OUString aImport = ScGlobal::GetRscString( STR_DBNAME_IMPORT );
@@ -291,7 +291,7 @@ ScDBData* ScDocShell::GetDBData( const ScRange& rMarked, ScGetDBMode eMode, ScGe

            if ( pUndoColl )
            {
                aDocument.CompileDBFormula( false );        // CompileFormulaString
                aDocument.CompileHybridFormula();

                ScDBCollection* pRedoColl = new ScDBCollection( *pColl );
                GetUndoManager()->AddUndoAction( new ScUndoDBData( this, pUndoColl, pRedoColl ) );
diff --git a/sc/source/ui/undo/undocell.cxx b/sc/source/ui/undo/undocell.cxx
index 1119a9e..47e85b4 100644
--- a/sc/source/ui/undo/undocell.cxx
+++ b/sc/source/ui/undo/undocell.cxx
@@ -1009,7 +1009,7 @@ void ScUndoRangeNames::DoChange( bool bUndo )
            pDoc->SetRangeName( new ScRangeName( *pNewRanges ) );
    }

    pDoc->PostprocessRangeNameUpdate();
    pDoc->CompileHybridFormula();

    SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREAS_CHANGED ) );
}
diff --git a/sc/source/ui/undo/undodat.cxx b/sc/source/ui/undo/undodat.cxx
index 59845fa..e892c13 100644
--- a/sc/source/ui/undo/undodat.cxx
+++ b/sc/source/ui/undo/undodat.cxx
@@ -1131,9 +1131,9 @@ void ScUndoDBData::Undo()

    bool bOldAutoCalc = pDoc->GetAutoCalc();
    pDoc->SetAutoCalc( false );         // Avoid unnecessary calculations
    pDoc->CompileDBFormula( true );     // CreateFormulaString
    pDoc->PreprocessDBDataUpdate();
    pDoc->SetDBCollection( new ScDBCollection(*pUndoColl), true );
    pDoc->CompileDBFormula( false );    // CompileFormulaString
    pDoc->CompileHybridFormula();
    pDoc->SetAutoCalc( bOldAutoCalc );

    SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_DBAREAS_CHANGED ) );
@@ -1149,9 +1149,9 @@ void ScUndoDBData::Redo()

    bool bOldAutoCalc = pDoc->GetAutoCalc();
    pDoc->SetAutoCalc( false );         // Avoid unnecessary calculations
    pDoc->CompileDBFormula( true );     // CreateFormulaString
    pDoc->PreprocessDBDataUpdate();
    pDoc->SetDBCollection( new ScDBCollection(*pRedoColl), true );
    pDoc->CompileDBFormula( false );    // CompileFormulaString
    pDoc->CompileHybridFormula();
    pDoc->SetAutoCalc( bOldAutoCalc );

    SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_DBAREAS_CHANGED ) );
diff --git a/sc/source/ui/undo/undorangename.cxx b/sc/source/ui/undo/undorangename.cxx
index db9b0e4..2c2d8aa 100644
--- a/sc/source/ui/undo/undorangename.cxx
+++ b/sc/source/ui/undo/undorangename.cxx
@@ -79,7 +79,7 @@ void ScUndoAllRangeNames::DoChange(const boost::ptr_map<OUString, ScRangeName>& 

    rDoc.PreprocessRangeNameUpdate();
    rDoc.SetAllRangeNames(rNames);
    rDoc.PostprocessRangeNameUpdate();
    rDoc.CompileHybridFormula();

    SFX_APP()->Broadcast(SfxSimpleHint(SC_HINT_AREAS_CHANGED));
}
diff --git a/sc/source/ui/unoobj/nameuno.cxx b/sc/source/ui/unoobj/nameuno.cxx
index 14bceca..1844ad3 100644
--- a/sc/source/ui/unoobj/nameuno.cxx
+++ b/sc/source/ui/unoobj/nameuno.cxx
@@ -749,7 +749,7 @@ void ScNamedRangesObj::lock()
/** called from the XActionLockable interface methods on final unlock */
void ScNamedRangesObj::unlock()
{
    pDocShell->GetDocument()->PostprocessRangeNameUpdate();
    pDocShell->GetDocument()->CompileHybridFormula();
}

// document::XActionLockable
diff --git a/sc/source/ui/view/dbfunc.cxx b/sc/source/ui/view/dbfunc.cxx
index 704fda7..d41983e 100644
--- a/sc/source/ui/view/dbfunc.cxx
+++ b/sc/source/ui/view/dbfunc.cxx
@@ -222,9 +222,9 @@ void ScDBFunc::NotifyCloseDbNameDlg( const ScDBCollection& rNewColl, const std::

    //  register target in SBA no longer necessary

    pDoc->CompileDBFormula( true );     // CreateFormulaString
    pDoc->PreprocessDBDataUpdate();
    pDoc->SetDBCollection( new ScDBCollection( rNewColl ) );
    pDoc->CompileDBFormula( false );    // CompileFormulaString
    pDoc->CompileHybridFormula();
    pOldColl = NULL;
    pDocShell->PostPaint(ScRange(0, 0, 0, MAXCOL, MAXROW, MAXTAB), PAINT_GRID);
    aModificator.SetDocumentModified();
diff --git a/sc/source/ui/view/viewfunc.cxx b/sc/source/ui/view/viewfunc.cxx
index 9ce469a..1396233 100644
--- a/sc/source/ui/view/viewfunc.cxx
+++ b/sc/source/ui/view/viewfunc.cxx
@@ -2794,7 +2794,7 @@ bool ScViewFunc::InsertName( const OUString& rName, const OUString& rSymbol,
            bOk = true;
        pNewEntry = NULL;   // never delete, insert took ownership

        pDoc->PostprocessRangeNameUpdate();
        pDoc->CompileHybridFormula();

        aModificator.SetDocumentModified();
        SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREAS_CHANGED ) );