Tag: cws_src680_dba30 User: fs Date: 2006/07/19 06:12:16 Modified: dba/dbaccess/source/ui/querydesign/QueryDesignView.cxx
Log: RESYNC: (1.78-1.80); FILE MERGED File Changes: Directory: /dba/dbaccess/source/ui/querydesign/ =============================================== File [changed]: QueryDesignView.cxx Url: http://dba.openoffice.org/source/browse/dba/dbaccess/source/ui/querydesign/QueryDesignView.cxx?r1=1.76.16.3&r2=1.76.16.4 Delta lines: +340 -342 ----------------------- --- QueryDesignView.cxx 20 Apr 2006 06:52:53 -0000 1.76.16.3 +++ QueryDesignView.cxx 19 Jul 2006 13:12:14 -0000 1.76.16.4 @@ -86,6 +86,9 @@ #ifndef _CONNECTIVITY_DBTOOLS_HXX_ #include <connectivity/dbtools.hxx> #endif +#ifndef _DBHELPER_DBEXCEPTION_HXX_ +#include <connectivity/dbexception.hxx> +#endif #ifndef _COM_SUN_STAR_I18N_XLOCALEDATA_HPP_ #include <com/sun/star/i18n/XLocaleData.hpp> #endif @@ -138,6 +141,7 @@ using namespace ::dbaui; using namespace ::utl; using namespace ::connectivity; +using namespace ::dbtools; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::lang; using namespace ::com::sun::star::i18n; @@ -171,7 +175,7 @@ SqlParseError GetHavingCriteria(OQueryDesignView* _pView, OSelectionBrowseBox* _pSelectionBrw, const ::connectivity::OSQLParseNode* pSelectRoot, - int &rLevel ); + sal_uInt16& rLevel ); SqlParseError GetOrderCriteria( OQueryDesignView* _pView, OSelectionBrowseBox* _pSelectionBrw, @@ -180,7 +184,7 @@ SqlParseError AddFunctionCondition(OQueryDesignView* _pView, OSelectionBrowseBox* _pSelectionBrw, const ::connectivity::OSQLParseNode * pCondition, - const int nLevel, + const sal_uInt16 nLevel, sal_Bool bHaving); //------------------------------------------------------------------------------ @@ -214,7 +218,7 @@ pController->getNumberFormatter(), _rLocale, static_cast<sal_Char>(_sDecimal.toChar()), - &pController->getParser()->getContext()); + &pController->getParser().getContext()); } return aCondition; } @@ -359,13 +363,13 @@ eErrorCode = eColumnNotFound; String sError(ModuleRes(STR_QRY_COLUMN_NOT_FOUND)); sError.SearchAndReplaceAscii("$name$",aColumnName); - _pView->getController()->appendError(SQLException(sError,NULL,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HY0000") ),1000,Any())); + _pView->getController()->appendError(SQLException(sError,NULL,getStandardSQLState( SQL_GENERAL_ERROR ),1000,Any())); try { Reference<XDatabaseMetaData> xMeta = _pView->getController()->getConnection()->getMetaData(); if ( xMeta.is() && xMeta->supportsMixedCaseQuotedIdentifiers() ) - _pView->getController()->appendError(SQLException(String(ModuleRes(STR_QRY_CHECK_CASESENSITIVE)),NULL,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HY0000") ),1000,Any())); + _pView->getController()->appendError(SQLException(String(ModuleRes(STR_QRY_CHECK_CASESENSITIVE)),NULL,getStandardSQLState( SQL_GENERAL_ERROR ),1000,Any())); } catch(Exception&) { @@ -454,14 +458,14 @@ { Reference< XDatabaseMetaData > xMetaData = _xConnection->getMetaData(); - sal_Bool bUseCatalogInSelect = ::dbtools::isDataSourcePropertyEnabled(_xConnection,PROPERTY_USECATALOGINSELECT,sal_True); - sal_Bool bUseSchemaInSelect = ::dbtools::isDataSourcePropertyEnabled(_xConnection,PROPERTY_USESCHEMAINSELECT,sal_True); - ::rtl::OUString aTableListStr = ::dbtools::quoteTableName(xMetaData,aDBName,::dbtools::eInDataManipulation,bUseCatalogInSelect,bUseSchemaInSelect); + ::rtl::OUString sCatalog, sSchema, sTable; + ::dbtools::qualifiedNameComponents( xMetaData, aDBName, sCatalog, sSchema, sTable, ::dbtools::eInDataManipulation ); + ::rtl::OUString aTableListStr = ::dbtools::composeTableNameForSelect( _xConnection, sCatalog, sSchema, sTable ); ::rtl::OUString aQuote = xMetaData->getIdentifierQuoteString(); if ( isAppendTableAliasEnabled(_xConnection) ) { - aTableListStr += ::rtl::OUString(' '); + aTableListStr += ::rtl::OUString::createFromAscii(" AS "); aTableListStr += ::dbtools::quoteName(aQuote, pEntryTab->GetAliasName()); } aDBName = aTableListStr; @@ -628,7 +632,7 @@ pNode->getChild(1)->getNodeType() == SQL_NODE_EQUAL)) { String sError(ModuleRes(STR_QRY_JOIN_COLUMN_COMPARE)); - _pView->getController()->appendError(SQLException(sError,NULL,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HY0000") ),1000,Any())); + _pView->getController()->appendError(SQLException(sError,NULL,getStandardSQLState( SQL_GENERAL_ERROR ),1000,Any())); return eIllegalJoin; } @@ -670,7 +674,7 @@ pConn->RecalcLines(); // fuer das unten folgende Invalidate muss ich dieser neuen Connection erst mal die Moeglichkeit geben, // ihr BoundingRect zu ermitteln - pConn->Invalidate(); + pConn->InvalidateConnection(); } } @@ -740,18 +744,17 @@ // we have to look if we have alias.* here but before we have to check if the column doesn't already exist String sTemp = rFieldName; OTableFieldDescRef aInfo = new OTableFieldDesc(); - OJoinTableView::OTableWindowMap::iterator aIter = pTabList->begin(); + OJoinTableView::OTableWindowMap::iterator tableIter = pTabList->begin(); sal_Bool bFound = sal_False; - for(;!bFound && aIter != pTabList->end() ;++aIter) + for(;!bFound && tableIter != pTabList->end() ;++tableIter) { - OQueryTableWindow* pTabWin = static_cast<OQueryTableWindow*>(aIter->second); + OQueryTableWindow* pTabWin = static_cast<OQueryTableWindow*>(tableIter->second); - if ( bFound = pTabWin->ExistsField( rFieldName, aInfo ) ) - { + bFound = pTabWin->ExistsField( rFieldName, aInfo ); + if ( bFound ) rFieldName = aInfo->GetField(); } - } - if ( rFieldName.toChar() != '*' ) + if ( ( rFieldName.toChar() != '*' ) && ( rFieldName.indexOf( aQuote ) == -1 ) ) { OSL_ENSURE(pEntryField->GetTable().getLength(),"No table field name!"); aTmpStr += ::dbtools::quoteName(aQuote, rFieldName); @@ -809,7 +812,7 @@ OTableFields::iterator aIter = _rFieldList.begin(); for(;aIter != _rFieldList.end();++aIter) { - nMaxCriteria = ::std::max<sal_uInt16>(nMaxCriteria,(*aIter)->GetCriteria().size()); + nMaxCriteria = ::std::max<sal_uInt16>(nMaxCriteria,(sal_uInt16)(*aIter)->GetCriteria().size()); } Reference< XConnection> xConnection = static_cast<OQueryController*>(_pView->getController())->getConnection(); if(!xConnection.is()) @@ -818,7 +821,7 @@ { Reference< XDatabaseMetaData > xMetaData = xConnection->getMetaData(); ::rtl::OUString aQuote = xMetaData->getIdentifierQuoteString(); - const IParseContext& rContext = static_cast<OQueryController*>(_pView->getController())->getParser()->getContext(); + const IParseContext& rContext = static_cast<OQueryController*>(_pView->getController())->getParser().getContext(); for (sal_uInt16 i=0 ; i < nMaxCriteria ; i++) { @@ -882,8 +885,8 @@ ::rtl::OUString sHavingStr = aHavingStr; sal_uInt32 nCount = pParseNode->count(); - for( sal_uInt32 i = 1 ; i < nCount ; ++i) - pParseNode->getChild(i)->parseNodeToStr( sHavingStr, + for( sal_uInt32 node = 1 ; node < nCount ; ++node) + pParseNode->getChild(node)->parseNodeToStr( sHavingStr, xMetaData, &rContext, sal_False, @@ -1034,7 +1037,7 @@ aWorkStr += ::dbtools::quoteName(aQuote, aColumnName); } aWorkStr += ::rtl::OUString(' '); - aWorkStr += String::CreateFromAscii( ";ASC;DESC" ).GetToken( eOrder ); + aWorkStr += String::CreateFromAscii( ";ASC;DESC" ).GetToken( (USHORT)eOrder ); aWorkStr += ::rtl::OUString(','); } } @@ -1067,49 +1070,6 @@ } //------------------------------------------------------------------------------ - - ::rtl::OUString BuildACriteria( const OQueryDesignView* _pView,const ::rtl::OUString& _rVal, sal_Int32 aType ) - { - - ::rtl::OUString aRetStr; - String aVal,rVal; - String aOpList;aOpList.AssignAscii("<>;>=;<=;<;>;=;LIKE"); - xub_StrLen nOpListCnt = aOpList.GetTokenCount(); - - String aToken; - for( xub_StrLen nIdx=0 ; nIdx < nOpListCnt ; nIdx++ ) - { - aToken = aOpList.GetToken(nIdx); - if (rVal.Search( aToken ) == 0) - { - aRetStr = ::rtl::OUString(' '); - aRetStr += aToken; - aRetStr += ::rtl::OUString(' '); - aVal = rVal.Copy( aToken.Len() ); - aVal.EraseLeadingChars( ' ' ); - if( aVal.Search( '\'' ) == STRING_NOTFOUND )//XXX O'Brien??? - { - aVal = QuoteField(_pView, aVal, aType ); - } - aRetStr += aVal; - break; - } - } - - if( !aRetStr.getLength()) // == 0 - { - aRetStr = rVal.Search( '%' ) == STRING_NOTFOUND ? ::rtl::OUString::createFromAscii(" = ") : ::rtl::OUString::createFromAscii(" LIKE "); - aVal = rVal; - if( aVal.Search( '\'' ) == STRING_NOTFOUND )//XXX O'Brien??? - { - aVal = QuoteField( _pView,aVal, aType ); - } - aRetStr += aVal; - } - - return aRetStr;//XXX - } - //------------------------------------------------------------------------------ void GenerateInnerJoinCriterias(const Reference< XConnection>& _xConnection, ::rtl::OUString& _rJoinCrit, const ::std::vector<OTableConnection*>* _pConnList) @@ -1281,14 +1241,13 @@ SqlParseError GetORCriteria(OQueryDesignView* _pView, OSelectionBrowseBox* _pSelectionBrw, const ::connectivity::OSQLParseNode * pCondition, - int& nLevel , + sal_uInt16& nLevel , sal_Bool bHaving = sal_False); // ----------------------------------------------------------------------------- SqlParseError GetSelectionCriteria( OQueryDesignView* _pView, OSelectionBrowseBox* _pSelectionBrw, const ::connectivity::OSQLParseNode* pNode, - int& rLevel, - sal_Bool bJoinWhere = sal_False) + sal_uInt16& rLevel ) { if (!SQL_ISRULE(pNode, select_statement)) return eNoSelectStatement; @@ -1326,19 +1285,19 @@ SqlParseError GetANDCriteria( OQueryDesignView* _pView, OSelectionBrowseBox* _pSelectionBrw, const ::connectivity::OSQLParseNode * pCondition, - const int nLevel, + const sal_uInt16 nLevel, sal_Bool bHaving ); //------------------------------------------------------------------------------ SqlParseError ComparisonPredicate(OQueryDesignView* _pView, OSelectionBrowseBox* _pSelectionBrw, const ::connectivity::OSQLParseNode * pCondition, - const int nLevel, + const sal_uInt16 nLevel, sal_Bool bHaving ); //------------------------------------------------------------------------------ SqlParseError GetORCriteria(OQueryDesignView* _pView, OSelectionBrowseBox* _pSelectionBrw, const ::connectivity::OSQLParseNode * pCondition, - int& nLevel , + sal_uInt16& nLevel , sal_Bool bHaving) { SqlParseError eErrorCode = eOk; @@ -1371,7 +1330,7 @@ SqlParseError GetANDCriteria( OQueryDesignView* _pView, OSelectionBrowseBox* _pSelectionBrw, const ::connectivity::OSQLParseNode * pCondition, - const int nLevel, + const sal_uInt16 nLevel, sal_Bool bHaving ) { ::com::sun::star::lang::Locale aLocale = _pView->getLocale(); @@ -1384,7 +1343,7 @@ // Runde Klammern if (SQL_ISRULE(pCondition,boolean_primary)) { - int nLevel2 = nLevel; + sal_uInt16 nLevel2 = nLevel; eErrorCode = GetORCriteria(_pView,_pSelectionBrw,pCondition->getChild(1), nLevel2,bHaving ); } // Das erste Element ist (wieder) eine AND-Verknuepfung @@ -1414,14 +1373,14 @@ pController->getNumberFormatter(), aLocale, static_cast<sal_Char>(sDecimal.toChar()), - &pController->getParser()->getContext()); + &pController->getParser().getContext()); pCondition->getChild(0)->parseNodeToPredicateStr( aColumnName, xMetaData, pController->getNumberFormatter(), aLocale, static_cast<sal_Char>(sDecimal.toChar()), - &pController->getParser()->getContext()); + &pController->getParser().getContext()); // don't display the column name aCondition = aCondition.copy(aColumnName.getLength()); @@ -1436,7 +1395,7 @@ { eErrorCode = eNoColumnInLike; String sError(ModuleRes(STR_QRY_LIKE_LEFT_NO_COLUMN)); - _pView->getController()->appendError(SQLException(sError,NULL,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HY0000") ),1000,Any())); + _pView->getController()->appendError(SQLException(sError,NULL,getStandardSQLState( SQL_GENERAL_ERROR ),1000,Any())); } } else if( SQL_ISRULEOR2(pCondition,test_for_null,in_predicate) @@ -1480,7 +1439,7 @@ SqlParseError AddFunctionCondition(OQueryDesignView* _pView, OSelectionBrowseBox* _pSelectionBrw, const ::connectivity::OSQLParseNode * pCondition, - const int nLevel, + const sal_uInt16 nLevel, sal_Bool bHaving) { SqlParseError eErrorCode = eOk; @@ -1501,14 +1460,14 @@ pController->getNumberFormatter(), _pView->getLocale(), static_cast<sal_Char>(_pView->getDecimalSeparator().toChar()), - &pController->getParser()->getContext()); + &pController->getParser().getContext()); pFunction->parseNodeToPredicateStr(aColumnName, xMetaData, pController->getNumberFormatter(), _pView->getLocale(), static_cast<sal_Char>(_pView->getDecimalSeparator().toChar()), - &pController->getParser()->getContext()); + &pController->getParser().getContext()); // don't display the column name aCondition = aCondition.copy(aColumnName.getLength()); aCondition = aCondition.trim(); @@ -1541,7 +1500,7 @@ ::rtl::OUString sParameterValue; pParamNode->parseNodeToStr( sParameterValue, xConnection->getMetaData(), - &pController->getParser()->getContext()); + &pController->getParser().getContext()); nFunctionType |= FKT_NUMERIC; aDragLeft->SetField(sParameterValue); eErrorCode = eOk; @@ -1569,7 +1528,7 @@ SqlParseError ComparisonPredicate(OQueryDesignView* _pView, OSelectionBrowseBox* _pSelectionBrw, const ::connectivity::OSQLParseNode * pCondition, - const int nLevel, + const sal_uInt16 nLevel, sal_Bool bHaving ) { SqlParseError eErrorCode = eOk; @@ -1654,6 +1613,8 @@ i--; aCondition = aCondition + ::rtl::OUString::createFromAscii("<="); break; + default: + break; } // go backward @@ -1667,7 +1628,7 @@ pController->getNumberFormatter(), _pView->getLocale(), static_cast<sal_Char>(_pView->getDecimalSeparator().toChar()), - &pController->getParser()->getContext()); + &pController->getParser().getContext()); } } // else ??? @@ -1701,7 +1662,7 @@ Reference< XDatabaseMetaData > xMetaData = xConnection->getMetaData(); pLhs->parseNodeToStr(aName, xMetaData, - &pController->getParser()->getContext(), + &pController->getParser().getContext(), sal_True); // Kriterium aCondition = pCondition->getChild(1)->getTokenValue(); @@ -1710,7 +1671,7 @@ pController->getNumberFormatter(), _pView->getLocale(), static_cast<sal_Char>(_pView->getDecimalSeparator().toChar()), - &pController->getParser()->getContext()); + &pController->getParser().getContext()); } OTableFieldDescRef aDragLeft = new OTableFieldDesc(); @@ -1721,6 +1682,23 @@ } return eErrorCode; } + + //------------------------------------------------------------------------------ + namespace + { + OQueryTableWindow* lcl_findColumnInTables( const ::rtl::OUString& _rColumName, const OJoinTableView::OTableWindowMap& _rTabList, OTableFieldDescRef& _rInfo ) + { + OJoinTableView::OTableWindowMap::const_iterator aIter = _rTabList.begin(); + for ( ; aIter != _rTabList.end(); ++aIter ) + { + OQueryTableWindow* pTabWin = static_cast< OQueryTableWindow* >( aIter->second ); + if ( pTabWin && pTabWin->ExistsField( _rColumName, _rInfo ) ) + return pTabWin; + } + return NULL; + } + } + //------------------------------------------------------------------------------ void InsertColumnRef(const OQueryDesignView* _pView, const ::connectivity::OSQLParseNode * pColumnRef, @@ -1740,18 +1718,9 @@ if (!aTableRange.getLength()) { // SELECT column, ... - OJoinTableView::OTableWindowMap::iterator aIter = pTabList->begin(); - for(;aIter != pTabList->end();++aIter) - { - OQueryTableWindow* pTabWin = static_cast<OQueryTableWindow*>(aIter->second); - if (pTabWin && pTabWin->ExistsField( aColumnName, _raInfo ) ) - { - if(aColumnName.toChar() != '*') + bFound = NULL != lcl_findColumnInTables( aColumnName, *pTabList, _raInfo ); + if ( bFound && ( aColumnName.toChar() != '*' ) ) _raInfo->SetFieldAlias(aColumnAlias); - bFound = sal_True; - break; - } - } } else { @@ -1862,31 +1831,49 @@ ::connectivity::OSQLParseTreeIterator& aIterator = pController->getParseIterator(); const ::connectivity::OSQLParseNode* pParseTree = aIterator.getParseTree(); - const ::connectivity::OSQLParseNode* pTableRefCommaList = 0; - if (pParseTree) + do + { + if ( !pParseTree ) + { + // now we have to insert the fields which aren't in the statement + insertUnUsedFields(_pView,_pSelectionBrw); + break; + } + + if ( !pController->isEsacpeProcessing() ) // not allowed in this mode { - if (!pController->isEsacpeProcessing()) // not allowed in this mode eErrorCode = eNativeMode; - else if (SQL_ISRULE(pParseTree,select_statement)) + break; + } + + if ( !( SQL_ISRULE( pParseTree, select_statement ) ) ) + { + eErrorCode = eNoSelectStatement; + break; + } + + Reference< XConnection> xConnection = pController->getConnection(); + if ( !xConnection.is() ) { - ::connectivity::OSQLParseNode* pTree = pParseTree->getChild(1); + DBG_ERROR( "InitFromParseNodeImpl: no connection? no connection!" ); + break; + } const OSQLTables& aMap = aIterator.getTables(); ::comphelper::UStringMixLess aTmp(aMap.key_comp()); - ::comphelper::UStringMixEqual aKeyComp(static_cast< ::comphelper::UStringMixLess*>(&aTmp)->isCaseSensitive()); + ::comphelper::UStringMixEqual aKeyComp( aTmp.isCaseSensitive() ); - Reference< XConnection> xConnection = pController->getConnection(); - if(xConnection.is()) - { - sal_Int32 nMax = 0; Reference< XDatabaseMetaData > xMetaData = xConnection->getMetaData(); try { - nMax = xMetaData->getMaxTablesInSelect(); - - if(!nMax || nMax >= (sal_Int32)aMap.size()) // Anzahl der Tabellen im Select-Statement "uberpr"ufen + sal_Int32 nMax = xMetaData->getMaxTablesInSelect(); + if ( nMax && nMax < (sal_Int32)aMap.size() ) { + eErrorCode = eTooManyTables; + break; + } + ::rtl::OUString sComposedName; ::rtl::OUString aQualifierName; ::rtl::OUString sAlias; @@ -1896,26 +1883,40 @@ for(;aIter != aMap.end();++aIter) { OSQLTable xTable = aIter->second; - sComposedName = ::dbtools::composeTableName(xMetaData,Reference<XPropertySet>(xTable,UNO_QUERY),sal_False,::dbtools::eInDataManipulation); + Reference< XPropertySet > xTableProps( xTable, UNO_QUERY_THROW ); + sAlias = aIter->first; - if(aKeyComp(sComposedName,aIter->first)) + + // check whether this is a query + Reference< XPropertySetInfo > xPSI = xTableProps->getPropertySetInfo(); + bool bIsQuery = xPSI.is() && xPSI->hasPropertyByName( PROPERTY_COMMAND ); + + if ( bIsQuery ) + OSL_VERIFY( xTableProps->getPropertyValue( PROPERTY_NAME ) >>= sComposedName ); + else { - ::rtl::OUString sCatalog,sSchema,sTable; - ::dbtools::qualifiedNameComponents(xMetaData,sComposedName,sCatalog,sSchema,sTable,::dbtools::eInDataManipulation); + sComposedName = ::dbtools::composeTableName( xMetaData, xTableProps, ::dbtools::eInDataManipulation, false, false, false ); + + // if the alias is the complete (composed) table, then shorten it + if ( aKeyComp( sComposedName, aIter->first ) ) + { + ::rtl::OUString sCatalog, sSchema, sTable; + ::dbtools::qualifiedNameComponents( xMetaData, sComposedName, sCatalog, sSchema, sTable, ::dbtools::eInDataManipulation ); sAlias = sTable; } + } - - OQueryTableWindow* pExistentWin = pTableView->FindTable(sAlias); - if (!pExistentWin) + // find the existent window for this alias + OQueryTableWindow* pExistentWin = pTableView->FindTable( sAlias ); + if ( !pExistentWin ) { - pTableView->AddTabWin(sComposedName, sAlias,sal_False);// don't create data here + pTableView->AddTabWin( sComposedName, sAlias, sal_False ); // don't create data here } else { - // es existiert schon ein Fenster mit dem selben Alias ... - if (!aKeyComp(pExistentWin->GetData()->GetComposedName(),sComposedName)) - // ... aber anderem Tabellennamen -> neues Fenster + // there already exists a window for this alias .... + if ( !aKeyComp( pExistentWin->GetData()->GetComposedName(), sComposedName ) ) + // ... but for another complete table name -> new window pTableView->AddTabWin(sComposedName, sAlias); } } @@ -1940,10 +1941,10 @@ } if ( (eErrorCode = InstallFields(_pView,pParseTree, pTableView->GetTabWinMap())) == eOk ) { - // GetSelectionCriteria mu"s vor GetHavingCriteria aufgerufen werden - int nLevel=0; + // GetSelectionCriteria must be called before GetHavingCriteria + sal_uInt16 nLevel=0; - if ( eOk == (eErrorCode = GetSelectionCriteria(_pView,_pSelectionBrw,pParseTree,nLevel,sal_True)) ) + if ( eOk == (eErrorCode = GetSelectionCriteria(_pView,_pSelectionBrw,pParseTree,nLevel)) ) { if ( eOk == (eErrorCode = GetGroupCriteria(_pView,_pSelectionBrw,pParseTree)) ) { @@ -1957,23 +1958,12 @@ } } } - else - eErrorCode = eTooManyTables; - } catch(SQLException&) { OSL_ASSERT(!"getMaxTablesInSelect!"); } } - } - else - eErrorCode = eNoSelectStatement; - } - else - { - // now we have to insert the fields which aren't in the statement - insertUnUsedFields(_pView,_pSelectionBrw); - } + while ( false ); // Durch das Neuerzeugen wurden wieder Undo-Actions in den Manager gestellt pController->getUndoMgr()->Clear(); @@ -2035,21 +2025,25 @@ { ::connectivity::OSQLParseNode * pColumnRef = pParseTree->getChild(i); + do { + if ( SQL_ISRULE(pColumnRef,select_sublist) ) { eErrorCode = fillSelectSubList(_pView,pTabList); + break; } - else if ( SQL_ISRULE(pColumnRef,derived_column) ) - { - if ( xConnection.is() ) + + if ( SQL_ISRULE(pColumnRef,derived_column) ) { + if ( !xConnection.is() ) + break; + Reference< XDatabaseMetaData > xMetaData = xConnection->getMetaData(); ::rtl::OUString aColumnAlias(pController->getParseIterator().getColumnAlias(pColumnRef)); // kann leer sein pColumnRef = pColumnRef->getChild(0); OTableFieldDescRef aInfo = new OTableFieldDesc(); - if ( - pColumnRef->count() == 3 && + if ( pColumnRef->count() == 3 && SQL_ISPUNCTUATION(pColumnRef->getChild(0),"(") && SQL_ISPUNCTUATION(pColumnRef->getChild(2),")") ) @@ -2069,7 +2063,7 @@ ::rtl::OUString aColumns; pColumnRef->parseNodeToStr( aColumns, xMetaData, - &pController->getParser()->getContext(), + &pController->getParser().getContext(), sal_True, sal_True); // quote is to true because we need quoted elements inside the function @@ -2111,7 +2105,7 @@ sFieldName = ::rtl::OUString(); pParamRef->parseNodeToStr( sFieldName, xMetaData, - &pController->getParser()->getContext(), + &pController->getParser().getContext(), sal_True, sal_True); // quote is to true because we need quoted elements inside the function } @@ -2140,7 +2134,7 @@ nDataType = OSQLParser::getFunctionReturnType( sFunctionName - ,&pController->getParser()->getContext()); + ,&pController->getParser().getContext()); } aInfo->SetDataType(nDataType); aInfo->SetFieldType(TAB_NORMAL_FIELD); @@ -2166,13 +2160,30 @@ ::rtl::OUString aColumns; pColumnRef->parseNodeToStr( aColumns, xMetaData, - &pController->getParser()->getContext(), + &pController->getParser().getContext(), sal_True, sal_True); // quote is to true because we need quoted elements inside the function + aInfo->SetTabWindow( NULL ); + + // since we support queries in queries, the thingie might belong to an existing "table" + if ( !lcl_findColumnInTables( aColumns, *pTabList, aInfo ) ) + { + // okay, it doesn't belong to a query directly. In this case, it must belong + // to the (only) table in the FROM part + DBG_ASSERT( pTabList->size() == 1, "InstallFields: unqualified expression, but more or less than one table!" ); + if ( !pTabList->empty() ) + { + OQueryTableWindow* pWindow = static_cast< OQueryTableWindow* >( pTabList->begin()->second ); + aInfo->SetTabWindow( pWindow ); + aInfo->SetTable( pWindow->GetTableName() ); + aInfo->SetAlias( pWindow->GetAliasName() ); + aInfo->SetDatabase( pWindow->GetComposedName() ); + } + } + aInfo->SetDataType(DataType::DOUBLE); aInfo->SetFieldType(TAB_NORMAL_FIELD); - aInfo->SetTabWindow(NULL); aInfo->SetField(aColumns); aInfo->SetFieldAlias(aColumnAlias); aInfo->SetFunctionType(FKT_NUMERIC | FKT_OTHER); @@ -2180,8 +2191,13 @@ eErrorCode = _pView->InsertField(aInfo, sal_True, bFirstField); bFirstField = sal_False; } + + break; } - } + + DBG_ERROR( "InstallFields: don't know how to interpret this parse node!" ); + + } while ( false ); } } else @@ -2246,7 +2262,7 @@ SqlParseError GetHavingCriteria( OQueryDesignView* _pView, OSelectionBrowseBox* _pSelectionBrw, const ::connectivity::OSQLParseNode* pSelectRoot, - int &rLevel ) + sal_uInt16& rLevel ) { SqlParseError eErrorCode = eOk; if (!pSelectRoot->getChild(3)->getChild(3)->isLeaf()) @@ -2327,7 +2343,7 @@ // ErrorBox( _pWindow, ModuleRes( nResId ) ).Execute(); ModuleRes aRes(nResId); String sError(aRes); - _pEnvironment->appendError(SQLException(sError,NULL,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HY0000") ),1000,Any())); + _pEnvironment->appendError(SQLException(sError,NULL,getStandardSQLState( SQL_GENERAL_ERROR ),1000,Any())); } // ----------------------------------------------------------------------------- @@ -2377,12 +2393,11 @@ DBG_DTOR(OQueryDesignView,NULL); } //------------------------------------------------------------------------------ -IMPL_LINK( OQueryDesignView, SplitHdl, void*, p ) +IMPL_LINK( OQueryDesignView, SplitHdl, void*, /*p*/ ) { if (!getController()->isReadOnly()) { m_bInSplitHandler = sal_True; - long nTest = m_aSplitter.GetPosPixel().Y(); m_aSplitter.SetPosPixel( Point( m_aSplitter.GetPosPixel().X(),m_aSplitter.GetSplitPosPixel() ) ); static_cast<OQueryController*>(getController())->setSplitPos(m_aSplitter.GetSplitPosPixel()); static_cast<OQueryController*>(getController())->setModified(); @@ -2492,7 +2507,7 @@ m_pTableView->ClearAll(); } // ----------------------------------------------------------------------------- -void OQueryDesignView::setStatement(const ::rtl::OUString& _rsStatement) +void OQueryDesignView::setStatement(const ::rtl::OUString& /*_rsStatement*/) { } // ----------------------------------------------------------------------------- @@ -2510,42 +2525,24 @@ sal_Bool OQueryDesignView::isCutAllowed() { sal_Bool bAllowed = sal_False; - switch(m_eChildFocus) - { - case SELECTION: + if ( SELECTION == m_eChildFocus ) bAllowed = m_pSelectionBox->isCutAllowed(); - break; - case TABLEVIEW: - break; - } return bAllowed; } // ----------------------------------------------------------------------------- sal_Bool OQueryDesignView::isPasteAllowed() { sal_Bool bAllowed = sal_False; - switch(m_eChildFocus) - { - case SELECTION: + if ( SELECTION == m_eChildFocus ) bAllowed = m_pSelectionBox->isPasteAllowed(); - break; - case TABLEVIEW: - break; - } return bAllowed; } // ----------------------------------------------------------------------------- sal_Bool OQueryDesignView::isCopyAllowed() { sal_Bool bAllowed = sal_False; - switch(m_eChildFocus) - { - case SELECTION: + if ( SELECTION == m_eChildFocus ) bAllowed = m_pSelectionBox->isCopyAllowed(); - break; - case TABLEVIEW: - break; - } return bAllowed; } // ----------------------------------------------------------------------------- @@ -2661,6 +2658,7 @@ #if OSL_DEBUG_LEVEL > 0 { Window* pFocus = Application::GetFocusWindow(); + (void)pFocus; } #endif @@ -2876,7 +2874,7 @@ if(!xConnection.is()) return NULL; - ::connectivity::OSQLParser* pParser = static_cast<OQueryController*>(getController())->getParser(); + ::connectivity::OSQLParser& rParser( static_cast<OQueryController*>(getController())->getParser() ); OQueryTableWindow* pWin = static_cast<OQueryTableWindow*>(pEntry->GetTabWindow()); String sTest(_sCriteria); @@ -2893,7 +2891,7 @@ if(sFunction.GetTokenCount('(') > 1) sFunction = sFunction.GetToken(0,'('); // this should be the name of the function - sal_Int32 nType = ::connectivity::OSQLParser::getFunctionReturnType(sFunction,&pParser->getContext()); + sal_Int32 nType = ::connectivity::OSQLParser::getFunctionReturnType(sFunction,&rParser.getContext()); if ( nType == DataType::OTHER || (!sFunction.Len() && pEntry->isNumericOrAggreateFunction()) ) { // first try the international version @@ -2902,7 +2900,7 @@ sSql += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" FROM x WHERE ")); sSql += pEntry->GetField(); sSql += _sCriteria; - OSQLParseNode* pParseNode = pParser->parseTree( _rsErrorMessage,sSql,sal_True); + OSQLParseNode* pParseNode = rParser.parseTree( _rsErrorMessage, sSql, sal_True ); nType = DataType::DOUBLE; if ( pParseNode ) { @@ -2944,7 +2942,7 @@ } } - OSQLParseNode* pParseNode = pParser->predicateTree( _rsErrorMessage, + OSQLParseNode* pParseNode = rParser.predicateTree( _rsErrorMessage, sTest, static_cast<OQueryController*>(getController())->getNumberFormatter(), _rxColumn); --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
