[PATCH] Change in core[libreoffice-4-0]: mark *all* tables of a nested join as added
Lionel Elie Mamane (via Code Review)
gerrit at gerrit.libreoffice.org
Fri Jan 18 09:50:37 PST 2013
Hi,
I have submitted a patch for review:
https://gerrit.libreoffice.org/1756
To pull it, you can do:
git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/56/1756/1
mark *all* tables of a nested join as added
Else, if the n^{th} (with n>2) table also appears in a (non-NATURAL) INNER JOIN, it is repeated later, leading to an error from the database engine
Change-Id: I03e0f0ef51f45be9d7ddfa63a9dbe09dc500f8dd
---
M dbaccess/source/ui/querydesign/QueryDesignView.cxx
1 file changed, 33 insertions(+), 18 deletions(-)
diff --git a/dbaccess/source/ui/querydesign/QueryDesignView.cxx b/dbaccess/source/ui/querydesign/QueryDesignView.cxx
index 816991a..3c386db 100644
--- a/dbaccess/source/ui/querydesign/QueryDesignView.cxx
+++ b/dbaccess/source/ui/querydesign/QueryDesignView.cxx
@@ -476,10 +476,29 @@
return BuildJoin(_xConnection, rRh, BuildTable(_xConnection,pLh), &data);
}
//------------------------------------------------------------------------------
+ typedef ::std::map< ::rtl::OUString,sal_Bool,::comphelper::UStringMixLess> tableNames_t;
+ //------------------------------------------------------------------------------
+ void addConnectionTableNames( const Reference< XConnection>& _xConnection,
+ const OQueryTableConnection* const pEntryConn,
+ tableNames_t &_rTableNames )
+ {
+ // insert tables into table list to avoid double entries
+ const OQueryTableWindow* const pEntryTabFrom = static_cast<OQueryTableWindow*>(pEntryConn->GetSourceWin());
+ const OQueryTableWindow* const pEntryTabTo = static_cast<OQueryTableWindow*>(pEntryConn->GetDestWin());
+
+ ::rtl::OUString sTabName(BuildTable(_xConnection,pEntryTabFrom));
+ if(_rTableNames.find(sTabName) == _rTableNames.end())
+ _rTableNames[sTabName] = sal_True;
+ sTabName = BuildTable(_xConnection,pEntryTabTo);
+ if(_rTableNames.find(sTabName) == _rTableNames.end())
+ _rTableNames[sTabName] = sal_True;
+ }
+ //------------------------------------------------------------------------------
void GetNextJoin( const Reference< XConnection>& _xConnection,
OQueryTableConnection* pEntryConn,
OQueryTableWindow* pEntryTabTo,
- ::rtl::OUString &aJoin)
+ ::rtl::OUString &aJoin,
+ tableNames_t &_rTableNames)
{
OQueryTableConnectionData* pEntryConnData = static_cast<OQueryTableConnectionData*>(pEntryConn->GetData().get());
if ( pEntryConnData->GetJoinType() == INNER_JOIN && !pEntryConnData->isNatural() )
@@ -487,15 +506,18 @@
if(aJoin.isEmpty())
{
+ addConnectionTableNames(_xConnection, pEntryConn, _rTableNames);
OQueryTableWindow* pEntryTabFrom = static_cast<OQueryTableWindow*>(pEntryConn->GetSourceWin());
aJoin = BuildJoin(_xConnection,pEntryTabFrom,pEntryTabTo,pEntryConnData);
}
else if(pEntryTabTo == pEntryConn->GetDestWin())
{
+ addConnectionTableNames(_xConnection, pEntryConn, _rTableNames);
aJoin = BuildJoin(_xConnection,aJoin,pEntryTabTo,pEntryConnData);
}
else if(pEntryTabTo == pEntryConn->GetSourceWin())
{
+ addConnectionTableNames(_xConnection, pEntryConn, _rTableNames);
aJoin = BuildJoin(_xConnection,pEntryTabTo,aJoin,pEntryConnData);
}
@@ -514,7 +536,7 @@
// exists there a connection to a OQueryTableWindow that holds a connection that has been already visited
JoinCycle(_xConnection,pNext,pEntryTab,aJoin);
if(!pNext->IsVisited())
- GetNextJoin(_xConnection,pNext,pEntryTab,aJoin);
+ GetNextJoin(_xConnection, pNext, pEntryTab, aJoin, _rTableNames);
}
}
@@ -532,7 +554,7 @@
// exists there a connection to a OQueryTableWindow that holds a connection that has been already visited
JoinCycle(_xConnection,pNext,pEntryTab,aJoin);
if(!pNext->IsVisited())
- GetNextJoin(_xConnection,pNext,pEntryTab,aJoin);
+ GetNextJoin(_xConnection, pNext, pEntryTab, aJoin, _rTableNames);
}
}
}
@@ -1014,7 +1036,7 @@
//------------------------------------------------------------------------------
void searchAndAppendName(const Reference< XConnection>& _xConnection,
const OQueryTableWindow* _pTableWindow,
- ::std::map< ::rtl::OUString,sal_Bool,::comphelper::UStringMixLess>& _rTableNames,
+ tableNames_t& _rTableNames,
::rtl::OUString& _rsTableListStr
)
{
@@ -1035,8 +1057,8 @@
{
::rtl::OUString aTableListStr;
- // wird gebraucht um sicher zustelllen das eine Tabelle nicht doppelt vorkommt
- ::std::map< ::rtl::OUString,sal_Bool,::comphelper::UStringMixLess> aTableNames;
+ // used to avoid putting a table twice in FROM clause
+ tableNames_t aTableNames;
// generate outer join clause in from
if(!pConnList->empty())
@@ -1070,21 +1092,14 @@
if(!pEntryConn->IsVisited() && pEntryConn->GetSourceWin() == aRIter->second )
{
::rtl::OUString aJoin;
- GetNextJoin(_xConnection,pEntryConn,static_cast<OQueryTableWindow*>(pEntryConn->GetDestWin()),aJoin);
+ GetNextJoin(_xConnection,
+ pEntryConn,
+ static_cast<OQueryTableWindow*>(pEntryConn->GetDestWin()),
+ aJoin,
+ aTableNames);
if(!aJoin.isEmpty())
{
- // insert tables into table list to avoid double entries
- OQueryTableWindow* pEntryTabFrom = static_cast<OQueryTableWindow*>(pEntryConn->GetSourceWin());
- OQueryTableWindow* pEntryTabTo = static_cast<OQueryTableWindow*>(pEntryConn->GetDestWin());
-
- ::rtl::OUString sTabName(BuildTable(_xConnection,pEntryTabFrom));
- if(aTableNames.find(sTabName) == aTableNames.end())
- aTableNames[sTabName] = sal_True;
- sTabName = BuildTable(_xConnection,pEntryTabTo);
- if(aTableNames.find(sTabName) == aTableNames.end())
- aTableNames[sTabName] = sal_True;
-
::rtl::OUString aStr;
switch(static_cast<OQueryTableConnectionData*>(pEntryConn->GetData().get())->GetJoinType())
{
--
To view, visit https://gerrit.libreoffice.org/1756
To unsubscribe, visit https://gerrit.libreoffice.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I03e0f0ef51f45be9d7ddfa63a9dbe09dc500f8dd
Gerrit-PatchSet: 1
Gerrit-Project: core
Gerrit-Branch: libreoffice-4-0
Gerrit-Owner: Lionel Elie Mamane <lionel at mamane.lu>
More information about the LibreOffice
mailing list