From 0f2a8f43cf647dc53e0108258d089efe593eae94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=BCdiger=20Timm?= Date: Thu, 9 Sep 2004 08:04:16 +0000 Subject: [PATCH] INTEGRATION: CWS insight02 (1.41.2); FILE MERGED 2004/08/16 09:57:33 oj 1.41.2.1: #i26794# check parameter names also in sub selects --- connectivity/source/parse/sqliterator.cxx | 150 ++++++++++++---------- 1 file changed, 80 insertions(+), 70 deletions(-) diff --git a/connectivity/source/parse/sqliterator.cxx b/connectivity/source/parse/sqliterator.cxx index 8e970bc1641b..518be74c0baf 100644 --- a/connectivity/source/parse/sqliterator.cxx +++ b/connectivity/source/parse/sqliterator.cxx @@ -2,9 +2,9 @@ * * $RCSfile: sqliterator.cxx,v $ * - * $Revision: 1.41 $ + * $Revision: 1.42 $ * - * last change: $Author: hr $ $Date: 2004-08-02 17:16:44 $ + * last change: $Author: rt $ $Date: 2004-09-09 09:04:15 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -114,12 +114,28 @@ using namespace ::com::sun::star::sdb; static ::rtl::OUString aEmptyString; +namespace connectivity +{ + struct OSQLParseTreeIteratorImpl + { + ::com::sun::star::uno::Reference< + ::com::sun::star::container::XNameAccess> m_xTables; + OSQLTables m_aSubTables; // contains all tables from sub queries not the tables from the select tables + OSQLParseTreeIteratorImpl(const Reference< XNameAccess>& _xTables + ,const Reference< XDatabaseMetaData>& _xDatabaseMetaData) + : m_xTables(_xTables) + , m_aSubTables(_xDatabaseMetaData.is() && _xDatabaseMetaData->storesMixedCaseQuotedIdentifiers()) + {} + + OSQLParseTreeIteratorImpl(){} + }; +} //----------------------------------------------------------------------------- OSQLParseTreeIterator::OSQLParseTreeIterator() : m_pParseTree(NULL) - , m_xTables(NULL) , m_xDatabaseMetaData(NULL) ,m_pParser(NULL) + ,m_pImpl(new OSQLParseTreeIteratorImpl()) { // m_aSelectColumns = new OSQLColumns(); // m_aParameters = new OSQLColumns(); @@ -130,9 +146,9 @@ OSQLParseTreeIterator::OSQLParseTreeIterator(const Reference< XNameAccess>& _xTa const Reference< XDatabaseMetaData>& _xDatabaseMetaData, const OSQLParseNode* pRoot, const OSQLParser* _pParser) - : m_xTables(_xTables) - , m_xDatabaseMetaData(_xDatabaseMetaData) + : m_xDatabaseMetaData(_xDatabaseMetaData) , m_aTables(_xDatabaseMetaData.is() && _xDatabaseMetaData->storesMixedCaseQuotedIdentifiers()) + ,m_pImpl(new OSQLParseTreeIteratorImpl(_xTables ,_xDatabaseMetaData)) , m_aCaseEqual(_xDatabaseMetaData.is() && _xDatabaseMetaData->storesMixedCaseQuotedIdentifiers()) ,m_pParser(_pParser) { @@ -142,9 +158,9 @@ OSQLParseTreeIterator::OSQLParseTreeIterator(const Reference< XNameAccess>& _xTa } //----------------------------------------------------------------------------- OSQLParseTreeIterator::OSQLParseTreeIterator(const OSQLParseTreeIterator & rIter) - :m_xTables(NULL) + :m_pImpl(NULL) ,m_pParseTree(NULL) - , m_xDatabaseMetaData(NULL) + ,m_xDatabaseMetaData(NULL) ,m_pParser(NULL) { OSL_ASSERT("OSQLParseTreeIterator: Copy-Konstruktor nicht implementiert!"); @@ -154,6 +170,7 @@ OSQLParseTreeIterator::OSQLParseTreeIterator(const OSQLParseTreeIterator & rIter OSQLParseTreeIterator::~OSQLParseTreeIterator() { dispose(); + delete m_pImpl; } // ----------------------------------------------------------------------------- void OSQLParseTreeIterator::dispose() @@ -162,16 +179,18 @@ void OSQLParseTreeIterator::dispose() m_aGroupColumns = NULL; m_aOrderColumns = NULL; m_aParameters = NULL; - m_xTables = NULL; + m_pImpl->m_xTables = NULL; m_xDatabaseMetaData = NULL; m_pParser = NULL; m_aCreateColumns = NULL; m_aTables.clear(); + m_pImpl->m_aSubTables.clear(); } //----------------------------------------------------------------------------- void OSQLParseTreeIterator::setParseTree(const OSQLParseNode * pNewParseTree) { m_aTables.clear(); + m_pImpl->m_aSubTables.clear(); m_aSelectColumns = new OSQLColumns(); m_aGroupColumns = new OSQLColumns(); @@ -187,7 +206,7 @@ void OSQLParseTreeIterator::setParseTree(const OSQLParseNode * pNewParseTree) } // falls m_pParseTree aber keine Connection, dann Fehler - if(!m_xTables.is()) + if(!m_pImpl->m_xTables.is()) { return; } @@ -231,7 +250,7 @@ void OSQLParseTreeIterator::setParseTree(const OSQLParseNode * pNewParseTree) } //----------------------------------------------------------------------------- -void OSQLParseTreeIterator::traverseOneTableName(const OSQLParseNode * pTableName, const ::rtl::OUString & rTableRange, const sal_Bool bIsCreateTable) +void OSQLParseTreeIterator::traverseOneTableName(OSQLTables& _rTables,const OSQLParseNode * pTableName, const ::rtl::OUString & rTableRange, const sal_Bool bIsCreateTable) { @@ -260,7 +279,7 @@ void OSQLParseTreeIterator::traverseOneTableName(const OSQLParseNode * pTableNam { try { - if(!m_xTables->hasByName(aComposedName)) // name not in XNameAccess + if(!m_pImpl->m_xTables->hasByName(aComposedName)) // name not in XNameAccess { // exists the name in the metadata ?! if(!aSchema.getLength()) @@ -304,11 +323,11 @@ void OSQLParseTreeIterator::traverseOneTableName(const OSQLParseNode * pTableNam } } - sal_Bool bHasByName=m_xTables->hasByName(aComposedName); + sal_Bool bHasByName=m_pImpl->m_xTables->hasByName(aComposedName); if(!bIsCreateTable) //for select statement etc. { if (bHasByName) - m_xTables->getByName(aComposedName) >>= m_aTables[aTableRange]; + m_pImpl->m_xTables->getByName(aComposedName) >>= _rTables[aTableRange]; else if(m_pParser) { ::rtl::OUString sErrMsg = m_pParser->getContext().getErrorMessage(IParseContext::ERROR_INVALID_TABLE); @@ -345,27 +364,27 @@ void OSQLParseTreeIterator::traverseOneTableName(const OSQLParseNode * pTableNam } } //----------------------------------------------------------------------------- -OSQLParseNode * OSQLParseTreeIterator::getQualified_join(OSQLParseNode *pTableRef,::rtl::OUString& aTableRange) +OSQLParseNode * OSQLParseTreeIterator::getQualified_join(OSQLTables& _rTables,OSQLParseNode *pTableRef,::rtl::OUString& aTableRange) { aTableRange = ::rtl::OUString(); - OSQLParseNode *pNode = getTableRef(pTableRef->getChild(0),aTableRange); + OSQLParseNode *pNode = getTableRef(_rTables,pTableRef->getChild(0),aTableRange); if(isTableNode(pNode)) - traverseOneTableName(pNode,aTableRange,sal_False); + traverseOneTableName(_rTables,pNode,aTableRange,sal_False); sal_uInt32 nPos = 4; if(SQL_ISRULE(pTableRef,cross_union) || pTableRef->getChild(1)->getTokenID() != SQL_TOKEN_NATURAL) nPos = 3; - pNode = getTableRef(pTableRef->getChild(nPos),aTableRange); + pNode = getTableRef(_rTables,pTableRef->getChild(nPos),aTableRange); if(isTableNode(pNode)) - traverseOneTableName(pNode,aTableRange,sal_False); + traverseOneTableName(_rTables,pNode,aTableRange,sal_False); return pNode; } //----------------------------------------------------------------------------- -OSQLParseNode * OSQLParseTreeIterator::getTableRef(OSQLParseNode *pTableRef,::rtl::OUString& aTableRange) +OSQLParseNode * OSQLParseTreeIterator::getTableRef(OSQLTables& _rTables,OSQLParseNode *pTableRef,::rtl::OUString& aTableRange) { OSQLParseNode *pTableName = pTableRef; @@ -373,7 +392,7 @@ OSQLParseNode * OSQLParseTreeIterator::getTableRef(OSQLParseNode *pTableRef,::rt { if(SQL_ISPUNCTUATION(pTableName->getChild(0),"{")) { // { OJ joined_table } - getQualified_join(pTableName->getChild(2),aTableRange); + getQualified_join(_rTables,pTableName->getChild(2),aTableRange); pTableName = NULL; } else @@ -393,25 +412,25 @@ OSQLParseNode * OSQLParseTreeIterator::getTableRef(OSQLParseNode *pTableRef,::rt } else if(SQL_ISRULE(pTableName,qualified_join) || SQL_ISRULE(pTableName,cross_union)) { - getQualified_join(pTableRef,aTableRange); + getQualified_join(_rTables,pTableRef,aTableRange); pTableName = NULL; } else if (SQL_ISRULE(pTableName,joined_table)) { // '(' qualified_join ')' - getQualified_join(pTableName->getChild(1),aTableRange); + getQualified_join(_rTables,pTableName->getChild(1),aTableRange); pTableName = NULL; } else if(pTableRef->count() == 6) { // '(' joined_table ')' as range_variable op_column_commalist if(SQL_ISRULE(pTableRef->getChild(1),qualified_join) || SQL_ISRULE(pTableRef->getChild(1),cross_union)) - getQualified_join(pTableRef->getChild(1),aTableRange); + getQualified_join(_rTables,pTableRef->getChild(1),aTableRange); else if(SQL_ISRULE(pTableRef->getChild(1),select_statement)) // Unterabfrage - getSelect_statement(pTableRef->getChild(1)); + getSelect_statement(_rTables,pTableRef->getChild(1)); else if(pTableRef->getChild(1)->count() == 4) // pTableRef->getChild(1) ->> non_join_query_exp - getSelect_statement(pTableRef->getChild(0)); // query_exp SQL_TOKEN_UNION all query_term + getSelect_statement(_rTables,pTableRef->getChild(0)); // query_exp SQL_TOKEN_UNION all query_term else {// nyi: tiefere Verschachtelung m"oglch } @@ -419,12 +438,12 @@ OSQLParseNode * OSQLParseTreeIterator::getTableRef(OSQLParseNode *pTableRef,::rt return pTableName; } //----------------------------------------------------------------------------- -void OSQLParseTreeIterator::getSelect_statement(OSQLParseNode *pSelect) +void OSQLParseTreeIterator::getSelect_statement(OSQLTables& _rTables,OSQLParseNode *pSelect) { if(SQL_ISRULE(pSelect,union_statement)) { - getSelect_statement(pSelect->getChild(0)); + getSelect_statement(_rTables,pSelect->getChild(0)); //getSelect_statement(pSelect->getChild(3)); return; } @@ -442,7 +461,7 @@ void OSQLParseTreeIterator::getSelect_statement(OSQLParseNode *pSelect) if (isTableNode(pTableRefCommalist->getChild(i))) { pTableName = pTableRefCommalist->getChild(i); - traverseOneTableName(pTableName,aTableRange,sal_False);// aTableRange will be set inside to the tablename + traverseOneTableName(_rTables,pTableName,aTableRange,sal_False);// aTableRange will be set inside to the tablename } else if (SQL_ISRULE(pTableRefCommalist->getChild(i),table_ref)) { @@ -452,29 +471,29 @@ void OSQLParseTreeIterator::getSelect_statement(OSQLParseNode *pSelect) { // Tabellennamen gefunden if(pTableRefCommalist->getChild(i)->count() == 4) // Tabellenrange an Pos 2 aTableRange = pTableRefCommalist->getChild(i)->getChild(2)->getTokenValue(); - traverseOneTableName(pTableName,aTableRange,sal_False); + traverseOneTableName(_rTables,pTableName,aTableRange,sal_False); } else if(SQL_ISPUNCTUATION(pTableName,"{")) - getQualified_join(pTableRefCommalist->getChild(i)->getChild(2),aTableRange); + getQualified_join(_rTables,pTableRefCommalist->getChild(i)->getChild(2),aTableRange); else // '(' joined_table ')' as range_variable op_column_commalist - getTableRef(pTableRefCommalist->getChild(i),aTableRange); + getTableRef(_rTables,pTableRefCommalist->getChild(i),aTableRange); } else if (SQL_ISRULE(pTableRefCommalist->getChild(i),qualified_join) || SQL_ISRULE(pTableRefCommalist->getChild(i),cross_union) ) { // qualified_join oder cross_union vorhanden - getQualified_join(pTableRefCommalist->getChild(i),aTableRange); + getQualified_join(_rTables,pTableRefCommalist->getChild(i),aTableRange); } else if (SQL_ISRULE(pTableRefCommalist->getChild(i),joined_table)) { // '(' qualified_join ')' - getQualified_join(pTableRefCommalist->getChild(i)->getChild(1),aTableRange); + getQualified_join(_rTables,pTableRefCommalist->getChild(i)->getChild(1),aTableRange); } // if (! aIteratorStatus.IsSuccessful()) break; } } //----------------------------------------------------------------------------- -void OSQLParseTreeIterator::traverseTableNames() +void OSQLParseTreeIterator::traverseTableNames(OSQLTables& _rTables) { // aIteratorStatus.Clear(); @@ -495,27 +514,27 @@ void OSQLParseTreeIterator::traverseTableNames() if (m_eStatementType == SQL_STATEMENT_SELECT) { OSQLParseNode *pTmp = (OSQLParseNode *)m_pParseTree; - getSelect_statement(pTmp); + getSelect_statement(_rTables,pTmp); } else if (m_eStatementType == SQL_STATEMENT_INSERT) { pTableName = m_pParseTree->getChild(2); - traverseOneTableName(pTableName,aTableRange,sal_False); + traverseOneTableName(_rTables,pTableName,aTableRange,sal_False); } else if (m_eStatementType == SQL_STATEMENT_UPDATE) { pTableName = m_pParseTree->getChild(1); - traverseOneTableName(pTableName,aTableRange,sal_False); + traverseOneTableName(_rTables,pTableName,aTableRange,sal_False); } else if (m_eStatementType == SQL_STATEMENT_DELETE) { pTableName = m_pParseTree->getChild(2); - traverseOneTableName(pTableName,aTableRange,sal_False); + traverseOneTableName(_rTables,pTableName,aTableRange,sal_False); } else if (m_eStatementType == SQL_STATEMENT_CREATE_TABLE) { pTableName = m_pParseTree->getChild(2); - traverseOneTableName(pTableName,aTableRange,sal_True); + traverseOneTableName(_rTables,pTableName,aTableRange,sal_True); } } //----------------------------------------------------------------------------- @@ -1150,6 +1169,7 @@ void OSQLParseTreeIterator::traverseANDCriteria(OSQLParseNode * pSearchCondition OSQLParseNode* pChild = pSearchCondition->getChild(3); if ( SQL_ISRULE(pChild->getChild(0),subquery) ) { + traverseTableNames(m_pImpl->m_aSubTables); traverseSelectionCriteria(pChild->getChild(0)->getChild(1)); } else @@ -1257,6 +1277,7 @@ void OSQLParseTreeIterator::traverseOnePredicate( } else { + sal_Bool bNotFound = sal_True; OSQLColumns::const_iterator aIter = ::connectivity::find(m_aSelectColumns->begin(),m_aSelectColumns->end(),aColumnName,m_aCaseEqual); if(aIter != m_aSelectColumns->end()) { @@ -1264,34 +1285,25 @@ void OSQLParseTreeIterator::traverseOnePredicate( pNewColumn->setName(rValue); pNewColumn->setRealName(aColumnName); m_aParameters->push_back(pNewColumn); + bNotFound = sal_False; } else if(aColumnName.getLength())// search in the tables for the right one { - OSQLTables::const_iterator aTableIter = m_aTables.end(); - if(aTableRange.getLength()) - aTableIter = m_aTables.find(aTableRange); - if(aTableIter == m_aTables.end()) - aTableIter = m_aTables.begin(); - for(;aTableIter != m_aTables.end();++aTableIter) + Reference xColumn = findColumn(m_aTables,aColumnName,aTableRange); + if ( !xColumn.is() ) + xColumn = findColumn(m_pImpl->m_aSubTables,aColumnName,aTableRange); + + if ( xColumn.is() ) { - if(aTableIter->second.is()) - { - Reference xColumns = aTableIter->second->getColumns(); - if(xColumns.is() && xColumns->hasByName(aColumnName)) - { - Reference xColumn; - xColumns->getByName(aColumnName) >>= xColumn; - OParseColumn* pNewColumn = new OParseColumn(xColumn,m_aCaseEqual.isCaseSensitive()); - pNewColumn->setName(rValue); - pNewColumn->setRealName(aColumnName); - m_aParameters->push_back(pNewColumn); - break; - } - } + OParseColumn* pNewColumn = new OParseColumn(xColumn,m_aCaseEqual.isCaseSensitive()); + pNewColumn->setName(rValue); + pNewColumn->setRealName(aColumnName); + m_aParameters->push_back(pNewColumn); + bNotFound = sal_False; } } - else + if ( bNotFound ) { ::rtl::OUString aNewColName(getUniqueColumnName(rValue)); @@ -1347,9 +1359,7 @@ void OSQLParseTreeIterator::traverseAssignments() //----------------------------------------------------------------------------- void OSQLParseTreeIterator::traverseAll() { - - - traverseTableNames(); + traverseTableNames(m_aTables); // if (! aIteratorStatus.IsSuccessful()) return; if (m_eStatementType == SQL_STATEMENT_SELECT) @@ -1606,7 +1616,7 @@ void OSQLParseTreeIterator::setSelectColumnName(::vos::ORef& _rColu //----------------------------------------------------------------------------- void OSQLParseTreeIterator::setOrderByColumnName(const ::rtl::OUString & rColumnName, const ::rtl::OUString & rTableRange,sal_Bool bAscending) { - Reference xColumn = findColumn(rColumnName,rTableRange); + Reference xColumn = findColumn(m_aTables,rColumnName,rTableRange); if ( xColumn.is() ) m_aOrderColumns->push_back(new OOrderColumn(xColumn,m_aCaseEqual.isCaseSensitive(),bAscending)); else @@ -1627,7 +1637,7 @@ void OSQLParseTreeIterator::setOrderByColumnName(const ::rtl::OUString & rColumn //----------------------------------------------------------------------------- void OSQLParseTreeIterator::setGroupByColumnName(const ::rtl::OUString & rColumnName, const ::rtl::OUString & rTableRange) { - Reference xColumn = findColumn(rColumnName,rTableRange); + Reference xColumn = findColumn(m_aTables,rColumnName,rTableRange); if ( xColumn.is() ) m_aGroupColumns->push_back(new OParseColumn(xColumn,m_aCaseEqual.isCaseSensitive())); else @@ -1874,14 +1884,14 @@ const OSQLParseNode* OSQLParseTreeIterator::getSimpleHavingTree() const return pNode ? pNode->getChild(1) : NULL; } // ----------------------------------------------------------------------------- -Reference< XPropertySet > OSQLParseTreeIterator::findColumn(const ::rtl::OUString & rColumnName, const ::rtl::OUString & rTableRange) +Reference< XPropertySet > OSQLParseTreeIterator::findColumn(const OSQLTables& _rTables,const ::rtl::OUString & rColumnName, const ::rtl::OUString & rTableRange) { Reference< XPropertySet > xColumn; if ( rTableRange.getLength() ) { - ConstOSQLTablesIterator aFind = m_aTables.find(rTableRange); + ConstOSQLTablesIterator aFind = _rTables.find(rTableRange); - if ( aFind != m_aTables.end() + if ( aFind != _rTables.end() && aFind->second.is() && aFind->second->getColumns().is() && aFind->second->getColumns()->hasByName(rColumnName) ) @@ -1889,8 +1899,8 @@ Reference< XPropertySet > OSQLParseTreeIterator::findColumn(const ::rtl::OUStrin } if ( !xColumn.is() ) { - OSQLTablesIterator aEnd = m_aTables.end(); - for(OSQLTablesIterator aIter = m_aTables.begin(); aIter != aEnd; ++aIter) + OSQLTables::const_iterator aEnd = _rTables.end(); + for(OSQLTables::const_iterator aIter = _rTables.begin(); aIter != aEnd; ++aIter) { if ( aIter->second.is() ) {