Attached patch fixes (old! at least back to 3.3) bugs exposed by fixing fdo#46843, about sort orders in the graphical query editor:
fdo#47370: when sort columns order does not match result columns order, sort is reordered to result order E.g. "SELECT a, b, c FROM foo ORDER BY c, a" becomes "SELECT a, b, c FROM foo ORDER BY a, c" fdo#47560: when several sort columns are "out of result order", all are set to the last E.g. "SELECT a, b, c FROM foo ORDER BY c, a, b" becomes "SELECT a, b, c FROM foo ORDER BY c, b, b" That is simply because those "additional" sort columns were set in the *same* in-memory structure. Fix: allocate a fresh structure for each new sort column. Please apply to libreoffice-3-5. -- Lionel
>From bf1294a1597a50a495ae76aa111d411e254a8e41 Mon Sep 17 00:00:00 2001 From: Lionel Elie Mamane <lio...@mamane.lu> Date: Tue, 20 Mar 2012 11:01:12 +0100 Subject: [PATCH 1/2] fdo#47370 properly duplicate (invisible) out-of-order sort columns Keep track of position of previous sorting column and use it to decide whether to duplicate invisible new sort column --- .../source/ui/querydesign/SelectionBrowseBox.cxx | 12 ++++++++++-- .../source/ui/querydesign/SelectionBrowseBox.hxx | 1 + 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/dbaccess/source/ui/querydesign/SelectionBrowseBox.cxx b/dbaccess/source/ui/querydesign/SelectionBrowseBox.cxx index d13d5f9..177313c 100644 --- a/dbaccess/source/ui/querydesign/SelectionBrowseBox.cxx +++ b/dbaccess/source/ui/querydesign/SelectionBrowseBox.cxx @@ -68,6 +68,7 @@ const String g_strZero = String::CreateFromAscii("0"); #define CHECKBOX_SIZE 10 #define HANDLE_ID 0 #define HANDLE_COLUMN_WITDH 70 +#define SORT_COLUMN_NONE 0xFFFFFFFF // ----------------------------------------------------------------------------- namespace @@ -113,6 +114,7 @@ OSelectionBrowseBox::OSelectionBrowseBox( Window* pParent ) BROWSER_HIDECURSOR | BROWSER_HLINESFULL | BROWSER_VLINESFULL ) ,m_aFunctionStrings(ModuleRes(STR_QUERY_FUNCTIONS)) ,m_nVisibleCount(0) + ,m_nLastSortColumn(SORT_COLUMN_NONE) ,m_bOrderByUnRelated(sal_True) ,m_bGroupByUnRelated(sal_True) ,m_bStopTimer(sal_False) @@ -418,6 +420,7 @@ void OSelectionBrowseBox::ClearAll() aIter = getFields().rbegin(); } } + m_nLastSortColumn = SORT_COLUMN_NONE; SetUpdateMode(sal_True); } //------------------------------------------------------------------------------ @@ -1873,11 +1876,14 @@ void OSelectionBrowseBox::AddCondition( const OTableFieldDescRef& rInfo, const S //------------------------------------------------------------------------------ void OSelectionBrowseBox::AddOrder( const OTableFieldDescRef& rInfo, const EOrderDir eDir, sal_uInt32 _nCurrentPos) { + if (_nCurrentPos == 0) + m_nLastSortColumn = SORT_COLUMN_NONE; + Reference< XConnection> xConnection = static_cast<OQueryController&>(getDesignView()->getController()).getConnection(); if(!xConnection.is()) return; DBG_CHKTHIS(OSelectionBrowseBox,NULL); - OSL_ENSURE(!rInfo->IsEmpty(),"AddOrder:: OTableFieldDescRef sollte nicht Empty sein!"); + OSL_ENSURE(!rInfo->IsEmpty(),"AddOrder:: OTableFieldDescRef should not be Empty!"); OTableFieldDescRef pEntry; Reference<XDatabaseMetaData> xMeta = xConnection->getMetaData(); ::comphelper::UStringMixEqual bCase(xMeta.is() && xMeta->supportsMixedCaseQuotedIdentifiers()); @@ -1896,7 +1902,7 @@ void OSelectionBrowseBox::AddOrder( const OTableFieldDescRef& rInfo, const EOrde bCase(aAlias,rInfo->GetAlias())) { sal_uInt32 nPos = aIter - rFields.begin(); - bAppend = _nCurrentPos > nPos; + bAppend = (m_nLastSortColumn != SORT_COLUMN_NONE) && (nPos <= m_nLastSortColumn); if ( bAppend ) aIter = rFields.end(); else @@ -1904,6 +1910,7 @@ void OSelectionBrowseBox::AddOrder( const OTableFieldDescRef& rInfo, const EOrde if ( !m_bOrderByUnRelated ) pEntry->SetVisible(sal_True); pEntry->SetOrderDir( eDir ); + m_nLastSortColumn = nPos; } break; } @@ -1914,6 +1921,7 @@ void OSelectionBrowseBox::AddOrder( const OTableFieldDescRef& rInfo, const EOrde OTableFieldDescRef pTmp = InsertField(rInfo, BROWSER_INVALIDID, sal_False, sal_False ); if(pTmp.is()) { + m_nLastSortColumn = pTmp->GetColumnId() - 1; if ( !m_bOrderByUnRelated && !bAppend ) pTmp->SetVisible(sal_True); pTmp->SetOrderDir( eDir ); diff --git a/dbaccess/source/ui/querydesign/SelectionBrowseBox.hxx b/dbaccess/source/ui/querydesign/SelectionBrowseBox.hxx index 35b666f..50c0244 100644 --- a/dbaccess/source/ui/querydesign/SelectionBrowseBox.hxx +++ b/dbaccess/source/ui/querydesign/SelectionBrowseBox.hxx @@ -87,6 +87,7 @@ namespace dbaui String m_aFunctionStrings; sal_uInt16 m_nVisibleCount; // Anzahl der max sichtbaren Zeilen + sal_uInt32 m_nLastSortColumn; // index of last (highest) sort column sal_Bool m_bOrderByUnRelated; sal_Bool m_bGroupByUnRelated; sal_Bool m_bStopTimer; -- 1.7.7.3
>From 6143d292e8aaffbb58963bd22fa00a8b58374cb3 Mon Sep 17 00:00:00 2001 From: Lionel Elie Mamane <lio...@mamane.lu> Date: Tue, 20 Mar 2012 11:03:08 +0100 Subject: [PATCH 2/2] fdo#47560 properly separate each new sorting column --- dbaccess/source/ui/querydesign/QueryDesignView.cxx | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/dbaccess/source/ui/querydesign/QueryDesignView.cxx b/dbaccess/source/ui/querydesign/QueryDesignView.cxx index c9c6092..1a18286 100644 --- a/dbaccess/source/ui/querydesign/QueryDesignView.cxx +++ b/dbaccess/source/ui/querydesign/QueryDesignView.cxx @@ -2325,9 +2325,9 @@ namespace OQueryController& rController = static_cast<OQueryController&>(_pView->getController()); EOrderDir eOrderDir; - OTableFieldDescRef aDragLeft = new OTableFieldDesc(); for( sal_uInt32 i=0 ; i<pNode->count() ; i++ ) { + OTableFieldDescRef aDragLeft = new OTableFieldDesc(); eOrderDir = ORDER_ASC; ::connectivity::OSQLParseNode* pChild = pNode->getChild( i ); -- 1.7.7.3
_______________________________________________ LibreOffice mailing list LibreOffice@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice