1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_connectivity.hxx" 30*cdf0e10cSrcweir #include "connectivity/sqliterator.hxx" 31*cdf0e10cSrcweir #include "connectivity/sdbcx/VTable.hxx" 32*cdf0e10cSrcweir #include <connectivity/sqlparse.hxx> 33*cdf0e10cSrcweir #include <connectivity/dbtools.hxx> 34*cdf0e10cSrcweir #include <connectivity/sqlerror.hxx> 35*cdf0e10cSrcweir #include <com/sun/star/sdbc/ColumnValue.hpp> 36*cdf0e10cSrcweir #include <com/sun/star/sdbc/DataType.hpp> 37*cdf0e10cSrcweir #include <com/sun/star/sdbc/XRow.hpp> 38*cdf0e10cSrcweir #include <com/sun/star/sdb/XQueriesSupplier.hpp> 39*cdf0e10cSrcweir #include <com/sun/star/sdb/ErrorCondition.hpp> 40*cdf0e10cSrcweir #ifdef SQL_TEST_PARSETREEITERATOR 41*cdf0e10cSrcweir #include <iostream> 42*cdf0e10cSrcweir #endif 43*cdf0e10cSrcweir #include "connectivity/PColumn.hxx" 44*cdf0e10cSrcweir #include "connectivity/dbtools.hxx" 45*cdf0e10cSrcweir #include <tools/diagnose_ex.h> 46*cdf0e10cSrcweir #include "TConnection.hxx" 47*cdf0e10cSrcweir #include <comphelper/types.hxx> 48*cdf0e10cSrcweir #include <connectivity/dbmetadata.hxx> 49*cdf0e10cSrcweir #include <com/sun/star/sdb/SQLFilterOperator.hpp> 50*cdf0e10cSrcweir #include "diagnose_ex.h" 51*cdf0e10cSrcweir #include <rtl/logfile.hxx> 52*cdf0e10cSrcweir 53*cdf0e10cSrcweir #define SQL_ISRULEOR2(pParseNode, e1,e2) ((pParseNode)->isRule() && (\ 54*cdf0e10cSrcweir (pParseNode)->getRuleID() == OSQLParser::RuleID(OSQLParseNode::e1) || \ 55*cdf0e10cSrcweir (pParseNode)->getRuleID() == OSQLParser::RuleID(OSQLParseNode::e2))) 56*cdf0e10cSrcweir 57*cdf0e10cSrcweir using namespace ::comphelper; 58*cdf0e10cSrcweir using namespace ::connectivity; 59*cdf0e10cSrcweir using namespace ::connectivity::sdbcx; 60*cdf0e10cSrcweir using namespace ::dbtools; 61*cdf0e10cSrcweir using namespace ::connectivity::parse; 62*cdf0e10cSrcweir using namespace ::com::sun::star; 63*cdf0e10cSrcweir using namespace ::com::sun::star::uno; 64*cdf0e10cSrcweir using namespace ::com::sun::star::container; 65*cdf0e10cSrcweir using namespace ::com::sun::star::sdbcx; 66*cdf0e10cSrcweir using namespace ::com::sun::star::beans; 67*cdf0e10cSrcweir using namespace ::com::sun::star::sdbc; 68*cdf0e10cSrcweir using namespace ::com::sun::star::sdb; 69*cdf0e10cSrcweir 70*cdf0e10cSrcweir namespace connectivity 71*cdf0e10cSrcweir { 72*cdf0e10cSrcweir struct OSQLParseTreeIteratorImpl 73*cdf0e10cSrcweir { 74*cdf0e10cSrcweir ::std::vector< TNodePair > m_aJoinConditions; 75*cdf0e10cSrcweir Reference< XConnection > m_xConnection; 76*cdf0e10cSrcweir Reference< XDatabaseMetaData > m_xDatabaseMetaData; 77*cdf0e10cSrcweir Reference< XNameAccess > m_xTableContainer; 78*cdf0e10cSrcweir Reference< XNameAccess > m_xQueryContainer; 79*cdf0e10cSrcweir 80*cdf0e10cSrcweir ::boost::shared_ptr< OSQLTables > m_pTables; /// all tables which participate in the SQL statement 81*cdf0e10cSrcweir ::boost::shared_ptr< OSQLTables > m_pSubTables; /// all tables from sub queries not the tables from the select tables 82*cdf0e10cSrcweir ::boost::shared_ptr< QueryNameSet > m_pForbiddenQueryNames; 83*cdf0e10cSrcweir 84*cdf0e10cSrcweir sal_uInt32 m_nIncludeMask; 85*cdf0e10cSrcweir 86*cdf0e10cSrcweir bool m_bIsCaseSensitive; 87*cdf0e10cSrcweir 88*cdf0e10cSrcweir OSQLParseTreeIteratorImpl( const Reference< XConnection >& _rxConnection, const Reference< XNameAccess >& _rxTables ) 89*cdf0e10cSrcweir :m_xConnection( _rxConnection ) 90*cdf0e10cSrcweir ,m_nIncludeMask( OSQLParseTreeIterator::All ) 91*cdf0e10cSrcweir ,m_bIsCaseSensitive( true ) 92*cdf0e10cSrcweir { 93*cdf0e10cSrcweir OSL_PRECOND( m_xConnection.is(), "OSQLParseTreeIteratorImpl::OSQLParseTreeIteratorImpl: invalid connection!" ); 94*cdf0e10cSrcweir m_xDatabaseMetaData = m_xConnection->getMetaData(); 95*cdf0e10cSrcweir 96*cdf0e10cSrcweir m_bIsCaseSensitive = m_xDatabaseMetaData.is() && m_xDatabaseMetaData->supportsMixedCaseQuotedIdentifiers(); 97*cdf0e10cSrcweir m_pTables.reset( new OSQLTables( m_bIsCaseSensitive ) ); 98*cdf0e10cSrcweir m_pSubTables.reset( new OSQLTables( m_bIsCaseSensitive ) ); 99*cdf0e10cSrcweir 100*cdf0e10cSrcweir m_xTableContainer = _rxTables; 101*cdf0e10cSrcweir 102*cdf0e10cSrcweir DatabaseMetaData aMetaData( m_xConnection ); 103*cdf0e10cSrcweir if ( aMetaData.supportsSubqueriesInFrom() ) 104*cdf0e10cSrcweir { 105*cdf0e10cSrcweir // connections might support the XQueriesSupplier interface, if they implement the css.sdb.Connection 106*cdf0e10cSrcweir // service 107*cdf0e10cSrcweir Reference< XQueriesSupplier > xSuppQueries( m_xConnection, UNO_QUERY ); 108*cdf0e10cSrcweir if ( xSuppQueries.is() ) 109*cdf0e10cSrcweir m_xQueryContainer = xSuppQueries->getQueries(); 110*cdf0e10cSrcweir } 111*cdf0e10cSrcweir } 112*cdf0e10cSrcweir 113*cdf0e10cSrcweir public: 114*cdf0e10cSrcweir inline bool isQueryAllowed( const ::rtl::OUString& _rQueryName ) 115*cdf0e10cSrcweir { 116*cdf0e10cSrcweir if ( !m_pForbiddenQueryNames.get() ) 117*cdf0e10cSrcweir return true; 118*cdf0e10cSrcweir if ( m_pForbiddenQueryNames->find( _rQueryName ) == m_pForbiddenQueryNames->end() ) 119*cdf0e10cSrcweir return true; 120*cdf0e10cSrcweir return false; 121*cdf0e10cSrcweir } 122*cdf0e10cSrcweir }; 123*cdf0e10cSrcweir 124*cdf0e10cSrcweir //------------------------------------------------------------------------- 125*cdf0e10cSrcweir /** helper class for temporarily adding a query name to a list of forbidden query names 126*cdf0e10cSrcweir */ 127*cdf0e10cSrcweir class ForbidQueryName 128*cdf0e10cSrcweir { 129*cdf0e10cSrcweir ::boost::shared_ptr< QueryNameSet >& m_rpAllForbiddenNames; 130*cdf0e10cSrcweir ::rtl::OUString m_sForbiddenQueryName; 131*cdf0e10cSrcweir 132*cdf0e10cSrcweir public: 133*cdf0e10cSrcweir ForbidQueryName( OSQLParseTreeIteratorImpl& _rIteratorImpl, const ::rtl::OUString _rForbiddenQueryName ) 134*cdf0e10cSrcweir :m_rpAllForbiddenNames( _rIteratorImpl.m_pForbiddenQueryNames ) 135*cdf0e10cSrcweir ,m_sForbiddenQueryName( _rForbiddenQueryName ) 136*cdf0e10cSrcweir { 137*cdf0e10cSrcweir if ( !m_rpAllForbiddenNames.get() ) 138*cdf0e10cSrcweir m_rpAllForbiddenNames.reset( new QueryNameSet ); 139*cdf0e10cSrcweir m_rpAllForbiddenNames->insert( m_sForbiddenQueryName ); 140*cdf0e10cSrcweir } 141*cdf0e10cSrcweir 142*cdf0e10cSrcweir ~ForbidQueryName() 143*cdf0e10cSrcweir { 144*cdf0e10cSrcweir m_rpAllForbiddenNames->erase( m_sForbiddenQueryName ); 145*cdf0e10cSrcweir } 146*cdf0e10cSrcweir }; 147*cdf0e10cSrcweir } 148*cdf0e10cSrcweir //----------------------------------------------------------------------------- 149*cdf0e10cSrcweir OSQLParseTreeIterator::OSQLParseTreeIterator(const Reference< XConnection >& _rxConnection, 150*cdf0e10cSrcweir const Reference< XNameAccess >& _rxTables, 151*cdf0e10cSrcweir const OSQLParser& _rParser, 152*cdf0e10cSrcweir const OSQLParseNode* pRoot ) 153*cdf0e10cSrcweir :m_rParser( _rParser ) 154*cdf0e10cSrcweir ,m_pImpl( new OSQLParseTreeIteratorImpl( _rxConnection, _rxTables ) ) 155*cdf0e10cSrcweir { 156*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::OSQLParseTreeIterator" ); 157*cdf0e10cSrcweir setParseTree(pRoot); 158*cdf0e10cSrcweir } 159*cdf0e10cSrcweir 160*cdf0e10cSrcweir //----------------------------------------------------------------------------- 161*cdf0e10cSrcweir OSQLParseTreeIterator::OSQLParseTreeIterator( const OSQLParseTreeIterator& _rParentIterator, const OSQLParser& _rParser, const OSQLParseNode* pRoot ) 162*cdf0e10cSrcweir :m_rParser( _rParser ) 163*cdf0e10cSrcweir ,m_pImpl( new OSQLParseTreeIteratorImpl( _rParentIterator.m_pImpl->m_xConnection, _rParentIterator.m_pImpl->m_xTableContainer ) ) 164*cdf0e10cSrcweir { 165*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::OSQLParseTreeIterator" ); 166*cdf0e10cSrcweir m_pImpl->m_pForbiddenQueryNames = _rParentIterator.m_pImpl->m_pForbiddenQueryNames; 167*cdf0e10cSrcweir setParseTree( pRoot ); 168*cdf0e10cSrcweir } 169*cdf0e10cSrcweir 170*cdf0e10cSrcweir //----------------------------------------------------------------------------- 171*cdf0e10cSrcweir OSQLParseTreeIterator::~OSQLParseTreeIterator() 172*cdf0e10cSrcweir { 173*cdf0e10cSrcweir dispose(); 174*cdf0e10cSrcweir } 175*cdf0e10cSrcweir 176*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 177*cdf0e10cSrcweir const OSQLTables& OSQLParseTreeIterator::getTables() const 178*cdf0e10cSrcweir { 179*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::getTables" ); 180*cdf0e10cSrcweir return *m_pImpl->m_pTables; 181*cdf0e10cSrcweir } 182*cdf0e10cSrcweir 183*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 184*cdf0e10cSrcweir bool OSQLParseTreeIterator::isCaseSensitive() const 185*cdf0e10cSrcweir { 186*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::isCaseSensitive" ); 187*cdf0e10cSrcweir return m_pImpl->m_bIsCaseSensitive; 188*cdf0e10cSrcweir } 189*cdf0e10cSrcweir 190*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 191*cdf0e10cSrcweir void OSQLParseTreeIterator::dispose() 192*cdf0e10cSrcweir { 193*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::dispose" ); 194*cdf0e10cSrcweir m_aSelectColumns = NULL; 195*cdf0e10cSrcweir m_aGroupColumns = NULL; 196*cdf0e10cSrcweir m_aOrderColumns = NULL; 197*cdf0e10cSrcweir m_aParameters = NULL; 198*cdf0e10cSrcweir m_pImpl->m_xTableContainer = NULL; 199*cdf0e10cSrcweir m_pImpl->m_xDatabaseMetaData = NULL; 200*cdf0e10cSrcweir m_aCreateColumns = NULL; 201*cdf0e10cSrcweir m_pImpl->m_pTables->clear(); 202*cdf0e10cSrcweir m_pImpl->m_pSubTables->clear(); 203*cdf0e10cSrcweir } 204*cdf0e10cSrcweir //----------------------------------------------------------------------------- 205*cdf0e10cSrcweir void OSQLParseTreeIterator::setParseTree(const OSQLParseNode * pNewParseTree) 206*cdf0e10cSrcweir { 207*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::setParseTree" ); 208*cdf0e10cSrcweir m_pImpl->m_pTables->clear(); 209*cdf0e10cSrcweir m_pImpl->m_pSubTables->clear(); 210*cdf0e10cSrcweir 211*cdf0e10cSrcweir m_aSelectColumns = new OSQLColumns(); 212*cdf0e10cSrcweir m_aGroupColumns = new OSQLColumns(); 213*cdf0e10cSrcweir m_aOrderColumns = new OSQLColumns(); 214*cdf0e10cSrcweir m_aParameters = new OSQLColumns(); 215*cdf0e10cSrcweir m_aCreateColumns = new OSQLColumns(); 216*cdf0e10cSrcweir 217*cdf0e10cSrcweir m_pParseTree = pNewParseTree; 218*cdf0e10cSrcweir if (!m_pParseTree) 219*cdf0e10cSrcweir { 220*cdf0e10cSrcweir m_eStatementType = SQL_STATEMENT_UNKNOWN; 221*cdf0e10cSrcweir return; 222*cdf0e10cSrcweir } 223*cdf0e10cSrcweir 224*cdf0e10cSrcweir // falls m_pParseTree aber keine Connection, dann Fehler 225*cdf0e10cSrcweir if ( !m_pImpl->m_xTableContainer.is() ) 226*cdf0e10cSrcweir return; 227*cdf0e10cSrcweir 228*cdf0e10cSrcweir m_aErrors = SQLException(); 229*cdf0e10cSrcweir 230*cdf0e10cSrcweir 231*cdf0e10cSrcweir // Statement-Typ ermitteln ... 232*cdf0e10cSrcweir if (SQL_ISRULE(m_pParseTree,select_statement) || SQL_ISRULE(m_pParseTree,union_statement) ) 233*cdf0e10cSrcweir { 234*cdf0e10cSrcweir m_eStatementType = SQL_STATEMENT_SELECT; 235*cdf0e10cSrcweir } 236*cdf0e10cSrcweir else if (SQL_ISRULE(m_pParseTree,insert_statement)) 237*cdf0e10cSrcweir { 238*cdf0e10cSrcweir m_eStatementType = SQL_STATEMENT_INSERT; 239*cdf0e10cSrcweir } 240*cdf0e10cSrcweir else if (SQL_ISRULE(m_pParseTree,update_statement_searched)) 241*cdf0e10cSrcweir { 242*cdf0e10cSrcweir m_eStatementType = SQL_STATEMENT_UPDATE; 243*cdf0e10cSrcweir } 244*cdf0e10cSrcweir else if (SQL_ISRULE(m_pParseTree,delete_statement_searched)) 245*cdf0e10cSrcweir { 246*cdf0e10cSrcweir m_eStatementType = SQL_STATEMENT_DELETE; 247*cdf0e10cSrcweir } 248*cdf0e10cSrcweir else if (m_pParseTree->count() == 3 && SQL_ISRULE(m_pParseTree->getChild(1),odbc_call_spec)) 249*cdf0e10cSrcweir { 250*cdf0e10cSrcweir m_eStatementType = SQL_STATEMENT_ODBC_CALL; 251*cdf0e10cSrcweir } 252*cdf0e10cSrcweir else if (SQL_ISRULE(m_pParseTree->getChild(0),base_table_def)) 253*cdf0e10cSrcweir { 254*cdf0e10cSrcweir m_eStatementType = SQL_STATEMENT_CREATE_TABLE; 255*cdf0e10cSrcweir m_pParseTree = m_pParseTree->getChild(0); 256*cdf0e10cSrcweir } 257*cdf0e10cSrcweir else 258*cdf0e10cSrcweir { 259*cdf0e10cSrcweir m_eStatementType = SQL_STATEMENT_UNKNOWN; 260*cdf0e10cSrcweir //aIteratorStatus.setInvalidStatement(); 261*cdf0e10cSrcweir return; 262*cdf0e10cSrcweir } 263*cdf0e10cSrcweir } 264*cdf0e10cSrcweir 265*cdf0e10cSrcweir //----------------------------------------------------------------------------- 266*cdf0e10cSrcweir namespace 267*cdf0e10cSrcweir { 268*cdf0e10cSrcweir //......................................................................... 269*cdf0e10cSrcweir static void impl_getRowString( const Reference< XRow >& _rxRow, const sal_Int32 _nColumnIndex, ::rtl::OUString& _out_rString ) 270*cdf0e10cSrcweir { 271*cdf0e10cSrcweir _out_rString = _rxRow->getString( _nColumnIndex ); 272*cdf0e10cSrcweir if ( _rxRow->wasNull() ) 273*cdf0e10cSrcweir _out_rString= ::rtl::OUString(); 274*cdf0e10cSrcweir } 275*cdf0e10cSrcweir 276*cdf0e10cSrcweir //......................................................................... 277*cdf0e10cSrcweir static ::rtl::OUString lcl_findTableInMetaData( 278*cdf0e10cSrcweir const Reference< XDatabaseMetaData >& _rxDBMeta, const ::rtl::OUString& _rCatalog, 279*cdf0e10cSrcweir const ::rtl::OUString& _rSchema, const ::rtl::OUString& _rTableName ) 280*cdf0e10cSrcweir { 281*cdf0e10cSrcweir ::rtl::OUString sComposedName; 282*cdf0e10cSrcweir 283*cdf0e10cSrcweir static const ::rtl::OUString s_sTableTypeView(RTL_CONSTASCII_USTRINGPARAM("VIEW")); 284*cdf0e10cSrcweir static const ::rtl::OUString s_sTableTypeTable(RTL_CONSTASCII_USTRINGPARAM("TABLE")); 285*cdf0e10cSrcweir static const ::rtl::OUString s_sWildcard = ::rtl::OUString::createFromAscii("%"); 286*cdf0e10cSrcweir 287*cdf0e10cSrcweir // we want all catalogues, all schemas, all tables 288*cdf0e10cSrcweir Sequence< ::rtl::OUString > sTableTypes(3); 289*cdf0e10cSrcweir sTableTypes[0] = s_sTableTypeView; 290*cdf0e10cSrcweir sTableTypes[1] = s_sTableTypeTable; 291*cdf0e10cSrcweir sTableTypes[2] = s_sWildcard; // just to be sure to include anything else .... 292*cdf0e10cSrcweir 293*cdf0e10cSrcweir if ( _rxDBMeta.is() ) 294*cdf0e10cSrcweir { 295*cdf0e10cSrcweir sComposedName = ::rtl::OUString(); 296*cdf0e10cSrcweir 297*cdf0e10cSrcweir Reference< XResultSet> xRes = _rxDBMeta->getTables( 298*cdf0e10cSrcweir _rCatalog.getLength() ? makeAny( _rCatalog ) : Any(), _rSchema.getLength() ? _rSchema : s_sWildcard, _rTableName, sTableTypes ); 299*cdf0e10cSrcweir 300*cdf0e10cSrcweir Reference< XRow > xCurrentRow( xRes, UNO_QUERY ); 301*cdf0e10cSrcweir if ( xCurrentRow.is() && xRes->next() ) 302*cdf0e10cSrcweir { 303*cdf0e10cSrcweir ::rtl::OUString sCatalog, sSchema, sName; 304*cdf0e10cSrcweir 305*cdf0e10cSrcweir impl_getRowString( xCurrentRow, 1, sCatalog ); 306*cdf0e10cSrcweir impl_getRowString( xCurrentRow, 2, sSchema ); 307*cdf0e10cSrcweir impl_getRowString( xCurrentRow, 3, sName ); 308*cdf0e10cSrcweir 309*cdf0e10cSrcweir sComposedName = ::dbtools::composeTableName( 310*cdf0e10cSrcweir _rxDBMeta, 311*cdf0e10cSrcweir sCatalog, 312*cdf0e10cSrcweir sSchema, 313*cdf0e10cSrcweir sName, 314*cdf0e10cSrcweir sal_False, 315*cdf0e10cSrcweir ::dbtools::eInDataManipulation 316*cdf0e10cSrcweir ); 317*cdf0e10cSrcweir } 318*cdf0e10cSrcweir } 319*cdf0e10cSrcweir return sComposedName; 320*cdf0e10cSrcweir } 321*cdf0e10cSrcweir } 322*cdf0e10cSrcweir 323*cdf0e10cSrcweir //----------------------------------------------------------------------------- 324*cdf0e10cSrcweir void OSQLParseTreeIterator::impl_getQueryParameterColumns( const OSQLTable& _rQuery ) 325*cdf0e10cSrcweir { 326*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::impl_getQueryParameterColumns" ); 327*cdf0e10cSrcweir if ( ( m_pImpl->m_nIncludeMask & Parameters ) != Parameters ) 328*cdf0e10cSrcweir // parameters not to be included in the traversal 329*cdf0e10cSrcweir return; 330*cdf0e10cSrcweir 331*cdf0e10cSrcweir ::vos::ORef< OSQLColumns > pSubQueryParameterColumns( new OSQLColumns() ); 332*cdf0e10cSrcweir 333*cdf0e10cSrcweir // get the command and the EscapeProcessing properties from the sub query 334*cdf0e10cSrcweir ::rtl::OUString sSubQueryCommand; 335*cdf0e10cSrcweir sal_Bool bEscapeProcessing = sal_False; 336*cdf0e10cSrcweir try 337*cdf0e10cSrcweir { 338*cdf0e10cSrcweir Reference< XPropertySet > xQueryProperties( _rQuery, UNO_QUERY_THROW ); 339*cdf0e10cSrcweir OSL_VERIFY( xQueryProperties->getPropertyValue( OMetaConnection::getPropMap().getNameByIndex( PROPERTY_ID_COMMAND ) ) >>= sSubQueryCommand ); 340*cdf0e10cSrcweir OSL_VERIFY( xQueryProperties->getPropertyValue( OMetaConnection::getPropMap().getNameByIndex( PROPERTY_ID_ESCAPEPROCESSING ) ) >>= bEscapeProcessing ); 341*cdf0e10cSrcweir } 342*cdf0e10cSrcweir catch( const Exception& ) 343*cdf0e10cSrcweir { 344*cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION(); 345*cdf0e10cSrcweir } 346*cdf0e10cSrcweir 347*cdf0e10cSrcweir // parse the sub query 348*cdf0e10cSrcweir do { 349*cdf0e10cSrcweir 350*cdf0e10cSrcweir if ( !bEscapeProcessing || ( sSubQueryCommand.getLength() == 0 ) ) 351*cdf0e10cSrcweir break; 352*cdf0e10cSrcweir 353*cdf0e10cSrcweir ::rtl::OUString sError; 354*cdf0e10cSrcweir ::std::auto_ptr< OSQLParseNode > pSubQueryNode( const_cast< OSQLParser& >( m_rParser ).parseTree( sError, sSubQueryCommand, sal_False ) ); 355*cdf0e10cSrcweir if ( !pSubQueryNode.get() ) 356*cdf0e10cSrcweir break; 357*cdf0e10cSrcweir 358*cdf0e10cSrcweir OSQLParseTreeIterator aSubQueryIterator( *this, m_rParser, pSubQueryNode.get() ); 359*cdf0e10cSrcweir aSubQueryIterator.traverseSome( Parameters | SelectColumns ); 360*cdf0e10cSrcweir // SelectColumns might also contain parameters 361*cdf0e10cSrcweir // #i77635# - 2007-07-23 / frank.schoenheit@sun.com 362*cdf0e10cSrcweir pSubQueryParameterColumns = aSubQueryIterator.getParameters(); 363*cdf0e10cSrcweir aSubQueryIterator.dispose(); 364*cdf0e10cSrcweir 365*cdf0e10cSrcweir } while ( false ); 366*cdf0e10cSrcweir 367*cdf0e10cSrcweir // copy the parameters of the sub query to our own parameter array 368*cdf0e10cSrcweir ::std::copy( pSubQueryParameterColumns->get().begin(), pSubQueryParameterColumns->get().end(), 369*cdf0e10cSrcweir ::std::insert_iterator< OSQLColumns::Vector >( m_aParameters->get(), m_aParameters->get().end() ) ); 370*cdf0e10cSrcweir } 371*cdf0e10cSrcweir 372*cdf0e10cSrcweir //----------------------------------------------------------------------------- 373*cdf0e10cSrcweir OSQLTable OSQLParseTreeIterator::impl_locateRecordSource( const ::rtl::OUString& _rComposedName ) 374*cdf0e10cSrcweir { 375*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::impl_locateRecordSource" ); 376*cdf0e10cSrcweir if ( !_rComposedName.getLength() ) 377*cdf0e10cSrcweir { 378*cdf0e10cSrcweir OSL_ENSURE( false, "OSQLParseTreeIterator::impl_locateRecordSource: no object name at all?" ); 379*cdf0e10cSrcweir return OSQLTable(); 380*cdf0e10cSrcweir } 381*cdf0e10cSrcweir 382*cdf0e10cSrcweir OSQLTable aReturn; 383*cdf0e10cSrcweir ::rtl::OUString sComposedName( _rComposedName ); 384*cdf0e10cSrcweir 385*cdf0e10cSrcweir try 386*cdf0e10cSrcweir { 387*cdf0e10cSrcweir ::rtl::OUString sCatalog, sSchema, sName; 388*cdf0e10cSrcweir qualifiedNameComponents( m_pImpl->m_xDatabaseMetaData, sComposedName, sCatalog, sSchema, sName, ::dbtools::eInDataManipulation ); 389*cdf0e10cSrcweir 390*cdf0e10cSrcweir // check whether there is a query with the given name 391*cdf0e10cSrcweir bool bQueryDoesExist = m_pImpl->m_xQueryContainer.is() && m_pImpl->m_xQueryContainer->hasByName( sComposedName ); 392*cdf0e10cSrcweir 393*cdf0e10cSrcweir // check whether the table container contains an object with the given name 394*cdf0e10cSrcweir if ( !bQueryDoesExist && !m_pImpl->m_xTableContainer->hasByName( sComposedName ) ) 395*cdf0e10cSrcweir sComposedName = lcl_findTableInMetaData( m_pImpl->m_xDatabaseMetaData, sCatalog, sSchema, sName ); 396*cdf0e10cSrcweir bool bTableDoesExist = m_pImpl->m_xTableContainer->hasByName( sComposedName ); 397*cdf0e10cSrcweir 398*cdf0e10cSrcweir // now obtain the object 399*cdf0e10cSrcweir 400*cdf0e10cSrcweir // if we're creating a table, and there already is a table or query with the same name, 401*cdf0e10cSrcweir // this is worth an error 402*cdf0e10cSrcweir if ( SQL_STATEMENT_CREATE_TABLE == m_eStatementType ) 403*cdf0e10cSrcweir { 404*cdf0e10cSrcweir if ( bQueryDoesExist ) 405*cdf0e10cSrcweir impl_appendError( IParseContext::ERROR_INVALID_QUERY_EXIST, &sName ); 406*cdf0e10cSrcweir else if ( bTableDoesExist ) 407*cdf0e10cSrcweir impl_appendError( IParseContext::ERROR_INVALID_TABLE_EXIST, &sName ); 408*cdf0e10cSrcweir else 409*cdf0e10cSrcweir aReturn = impl_createTableObject( sName, sCatalog, sSchema ); 410*cdf0e10cSrcweir } 411*cdf0e10cSrcweir else 412*cdf0e10cSrcweir { 413*cdf0e10cSrcweir // queries win over tables, so if there's a query with this name, take this, no matter if 414*cdf0e10cSrcweir // there's a table, too 415*cdf0e10cSrcweir if ( bQueryDoesExist ) 416*cdf0e10cSrcweir { 417*cdf0e10cSrcweir if ( !m_pImpl->isQueryAllowed( sComposedName ) ) 418*cdf0e10cSrcweir { 419*cdf0e10cSrcweir impl_appendError( m_rParser.getErrorHelper().getSQLException( sdb::ErrorCondition::PARSER_CYCLIC_SUB_QUERIES, NULL ) ); 420*cdf0e10cSrcweir return NULL; 421*cdf0e10cSrcweir } 422*cdf0e10cSrcweir 423*cdf0e10cSrcweir m_pImpl->m_xQueryContainer->getByName( sComposedName ) >>= aReturn; 424*cdf0e10cSrcweir 425*cdf0e10cSrcweir // collect the parameters from the sub query 426*cdf0e10cSrcweir ForbidQueryName aForbidName( *m_pImpl, sComposedName ); 427*cdf0e10cSrcweir impl_getQueryParameterColumns( aReturn ); 428*cdf0e10cSrcweir } 429*cdf0e10cSrcweir else if ( bTableDoesExist ) 430*cdf0e10cSrcweir m_pImpl->m_xTableContainer->getByName( sComposedName ) >>= aReturn; 431*cdf0e10cSrcweir else 432*cdf0e10cSrcweir { 433*cdf0e10cSrcweir if ( m_pImpl->m_xQueryContainer.is() ) 434*cdf0e10cSrcweir // the connection on which we're working supports sub queries in from (else 435*cdf0e10cSrcweir // m_xQueryContainer would not have been set), so emit a better error message 436*cdf0e10cSrcweir impl_appendError( IParseContext::ERROR_INVALID_TABLE_OR_QUERY, &sName ); 437*cdf0e10cSrcweir else 438*cdf0e10cSrcweir impl_appendError( IParseContext::ERROR_INVALID_TABLE, &sName ); 439*cdf0e10cSrcweir } 440*cdf0e10cSrcweir } 441*cdf0e10cSrcweir } 442*cdf0e10cSrcweir catch(Exception&) 443*cdf0e10cSrcweir { 444*cdf0e10cSrcweir impl_appendError( IParseContext::ERROR_INVALID_TABLE, &sComposedName ); 445*cdf0e10cSrcweir } 446*cdf0e10cSrcweir 447*cdf0e10cSrcweir return aReturn; 448*cdf0e10cSrcweir } 449*cdf0e10cSrcweir 450*cdf0e10cSrcweir //----------------------------------------------------------------------------- 451*cdf0e10cSrcweir void OSQLParseTreeIterator::traverseOneTableName( OSQLTables& _rTables,const OSQLParseNode * pTableName, const ::rtl::OUString & rTableRange ) 452*cdf0e10cSrcweir { 453*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::traverseOneTableName" ); 454*cdf0e10cSrcweir if ( ( m_pImpl->m_nIncludeMask & TableNames ) != TableNames ) 455*cdf0e10cSrcweir // tables should not be included in the traversal 456*cdf0e10cSrcweir return; 457*cdf0e10cSrcweir 458*cdf0e10cSrcweir OSL_ENSURE(pTableName != NULL,"OSQLParseTreeIterator::traverseOneTableName: pTableName == NULL"); 459*cdf0e10cSrcweir 460*cdf0e10cSrcweir Any aCatalog; 461*cdf0e10cSrcweir ::rtl::OUString aSchema,aTableName,aComposedName; 462*cdf0e10cSrcweir ::rtl::OUString aTableRange(rTableRange); 463*cdf0e10cSrcweir 464*cdf0e10cSrcweir // Tabellenname abholen 465*cdf0e10cSrcweir OSQLParseNode::getTableComponents(pTableName,aCatalog,aSchema,aTableName,m_pImpl->m_xDatabaseMetaData); 466*cdf0e10cSrcweir 467*cdf0e10cSrcweir // create the composed name like DOMAIN.USER.TABLE1 468*cdf0e10cSrcweir aComposedName = ::dbtools::composeTableName(m_pImpl->m_xDatabaseMetaData, 469*cdf0e10cSrcweir aCatalog.hasValue() ? ::comphelper::getString(aCatalog) : ::rtl::OUString(), 470*cdf0e10cSrcweir aSchema, 471*cdf0e10cSrcweir aTableName, 472*cdf0e10cSrcweir sal_False, 473*cdf0e10cSrcweir ::dbtools::eInDataManipulation); 474*cdf0e10cSrcweir 475*cdf0e10cSrcweir // if there is no alias for the table name assign the orignal name to it 476*cdf0e10cSrcweir if ( !aTableRange.getLength() ) 477*cdf0e10cSrcweir aTableRange = aComposedName; 478*cdf0e10cSrcweir 479*cdf0e10cSrcweir // get the object representing this table/query 480*cdf0e10cSrcweir OSQLTable aTable = impl_locateRecordSource( aComposedName ); 481*cdf0e10cSrcweir if ( aTable.is() ) 482*cdf0e10cSrcweir _rTables[ aTableRange ] = aTable; 483*cdf0e10cSrcweir } 484*cdf0e10cSrcweir //----------------------------------------------------------------------------- 485*cdf0e10cSrcweir void OSQLParseTreeIterator::impl_fillJoinConditions(const OSQLParseNode* i_pJoinCondition) 486*cdf0e10cSrcweir { 487*cdf0e10cSrcweir if (i_pJoinCondition->count() == 3 && // Ausdruck is geklammert 488*cdf0e10cSrcweir SQL_ISPUNCTUATION(i_pJoinCondition->getChild(0),"(") && 489*cdf0e10cSrcweir SQL_ISPUNCTUATION(i_pJoinCondition->getChild(2),")")) 490*cdf0e10cSrcweir { 491*cdf0e10cSrcweir impl_fillJoinConditions(i_pJoinCondition->getChild(1)); 492*cdf0e10cSrcweir } 493*cdf0e10cSrcweir else if (SQL_ISRULEOR2(i_pJoinCondition,search_condition,boolean_term) && // AND/OR-Verknuepfung: 494*cdf0e10cSrcweir i_pJoinCondition->count() == 3) 495*cdf0e10cSrcweir { 496*cdf0e10cSrcweir // nur AND Verkn�pfung zulassen 497*cdf0e10cSrcweir if ( SQL_ISTOKEN(i_pJoinCondition->getChild(1),AND) ) 498*cdf0e10cSrcweir { 499*cdf0e10cSrcweir impl_fillJoinConditions(i_pJoinCondition->getChild(0)); 500*cdf0e10cSrcweir impl_fillJoinConditions(i_pJoinCondition->getChild(1)); 501*cdf0e10cSrcweir } 502*cdf0e10cSrcweir } 503*cdf0e10cSrcweir else if (SQL_ISRULE(i_pJoinCondition,comparison_predicate)) 504*cdf0e10cSrcweir { 505*cdf0e10cSrcweir // only the comparison of columns is allowed 506*cdf0e10cSrcweir OSL_ENSURE(i_pJoinCondition->count() == 3,"OQueryDesignView::InsertJoinConnection: Fehler im Parse Tree"); 507*cdf0e10cSrcweir if (SQL_ISRULE(i_pJoinCondition->getChild(0),column_ref) && 508*cdf0e10cSrcweir SQL_ISRULE(i_pJoinCondition->getChild(2),column_ref) && 509*cdf0e10cSrcweir i_pJoinCondition->getChild(1)->getNodeType() == SQL_NODE_EQUAL) 510*cdf0e10cSrcweir { 511*cdf0e10cSrcweir m_pImpl->m_aJoinConditions.push_back( TNodePair(i_pJoinCondition->getChild(0),i_pJoinCondition->getChild(2)) ); 512*cdf0e10cSrcweir } 513*cdf0e10cSrcweir } 514*cdf0e10cSrcweir } 515*cdf0e10cSrcweir //----------------------------------------------------------------------------- 516*cdf0e10cSrcweir ::std::vector< TNodePair >& OSQLParseTreeIterator::getJoinConditions() const 517*cdf0e10cSrcweir { 518*cdf0e10cSrcweir return m_pImpl->m_aJoinConditions; 519*cdf0e10cSrcweir } 520*cdf0e10cSrcweir //----------------------------------------------------------------------------- 521*cdf0e10cSrcweir void OSQLParseTreeIterator::getQualified_join( OSQLTables& _rTables, const OSQLParseNode *pTableRef, ::rtl::OUString& aTableRange ) 522*cdf0e10cSrcweir { 523*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::getQualified_join" ); 524*cdf0e10cSrcweir OSL_PRECOND( SQL_ISRULE( pTableRef, cross_union ) || SQL_ISRULE( pTableRef, qualified_join ) , 525*cdf0e10cSrcweir "OSQLParseTreeIterator::getQualified_join: illegal node!" ); 526*cdf0e10cSrcweir 527*cdf0e10cSrcweir aTableRange = ::rtl::OUString(); 528*cdf0e10cSrcweir 529*cdf0e10cSrcweir const OSQLParseNode* pNode = getTableNode(_rTables,pTableRef->getChild(0),aTableRange); 530*cdf0e10cSrcweir if ( isTableNode( pNode ) ) 531*cdf0e10cSrcweir traverseOneTableName( _rTables, pNode, aTableRange ); 532*cdf0e10cSrcweir 533*cdf0e10cSrcweir sal_uInt32 nPos = 4; 534*cdf0e10cSrcweir if( SQL_ISRULE(pTableRef,cross_union) || pTableRef->getChild(1)->getTokenID() != SQL_TOKEN_NATURAL) 535*cdf0e10cSrcweir { 536*cdf0e10cSrcweir nPos = 3; 537*cdf0e10cSrcweir // join_condition,named_columns_join 538*cdf0e10cSrcweir if ( SQL_ISRULE( pTableRef, qualified_join ) ) 539*cdf0e10cSrcweir { 540*cdf0e10cSrcweir const OSQLParseNode* pJoin_spec = pTableRef->getChild(4); 541*cdf0e10cSrcweir if ( SQL_ISRULE( pJoin_spec, join_condition ) ) 542*cdf0e10cSrcweir { 543*cdf0e10cSrcweir impl_fillJoinConditions(pJoin_spec->getChild(1)); 544*cdf0e10cSrcweir } 545*cdf0e10cSrcweir else 546*cdf0e10cSrcweir { 547*cdf0e10cSrcweir const OSQLParseNode* pColumnCommalist = pJoin_spec->getChild(2); 548*cdf0e10cSrcweir // Alle Columns in der column_commalist ... 549*cdf0e10cSrcweir for (sal_uInt32 i = 0; i < pColumnCommalist->count(); i++) 550*cdf0e10cSrcweir { 551*cdf0e10cSrcweir const OSQLParseNode * pCol = pColumnCommalist->getChild(i); 552*cdf0e10cSrcweir // add twice because the column must exists in both tables 553*cdf0e10cSrcweir m_pImpl->m_aJoinConditions.push_back( TNodePair(pCol,pCol) ); 554*cdf0e10cSrcweir } 555*cdf0e10cSrcweir } 556*cdf0e10cSrcweir } 557*cdf0e10cSrcweir } 558*cdf0e10cSrcweir 559*cdf0e10cSrcweir pNode = getTableNode(_rTables,pTableRef->getChild(nPos),aTableRange); 560*cdf0e10cSrcweir if ( isTableNode( pNode ) ) 561*cdf0e10cSrcweir traverseOneTableName( _rTables, pNode, aTableRange ); 562*cdf0e10cSrcweir } 563*cdf0e10cSrcweir //----------------------------------------------------------------------------- 564*cdf0e10cSrcweir const OSQLParseNode* OSQLParseTreeIterator::getTableNode( OSQLTables& _rTables, const OSQLParseNode *pTableRef,::rtl::OUString& rTableRange ) 565*cdf0e10cSrcweir { 566*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::getTableNode" ); 567*cdf0e10cSrcweir OSL_PRECOND( SQL_ISRULE( pTableRef, table_ref ) || SQL_ISRULE( pTableRef, joined_table ) 568*cdf0e10cSrcweir || SQL_ISRULE( pTableRef, qualified_join ) || SQL_ISRULE( pTableRef, cross_union ), 569*cdf0e10cSrcweir "OSQLParseTreeIterator::getTableNode: only to be called for table_ref nodes!" ); 570*cdf0e10cSrcweir 571*cdf0e10cSrcweir const OSQLParseNode* pTableNameNode = NULL; 572*cdf0e10cSrcweir 573*cdf0e10cSrcweir if ( SQL_ISRULE( pTableRef, joined_table ) ) 574*cdf0e10cSrcweir { 575*cdf0e10cSrcweir getQualified_join( _rTables, pTableRef->getChild(1), rTableRange ); 576*cdf0e10cSrcweir } 577*cdf0e10cSrcweir if ( SQL_ISRULE( pTableRef, qualified_join ) || SQL_ISRULE( pTableRef, cross_union ) ) 578*cdf0e10cSrcweir { 579*cdf0e10cSrcweir getQualified_join( _rTables, pTableRef, rTableRange ); 580*cdf0e10cSrcweir } 581*cdf0e10cSrcweir else 582*cdf0e10cSrcweir { 583*cdf0e10cSrcweir rTableRange = OSQLParseNode::getTableRange(pTableRef); 584*cdf0e10cSrcweir if ( ( pTableRef->count() == 4 ) // '{' SQL_TOKEN_OJ joined_table '}' 585*cdf0e10cSrcweir || ( pTableRef->count() == 5 ) // '(' joined_table ')' range_variable op_column_commalist 586*cdf0e10cSrcweir ) 587*cdf0e10cSrcweir { 588*cdf0e10cSrcweir getQualified_join( _rTables, pTableRef->getChild(6 - pTableRef->count()), rTableRange ); 589*cdf0e10cSrcweir } 590*cdf0e10cSrcweir else if ( pTableRef->count() == 3 ) // subquery range_variable op_column_commalist || '(' joined_table ')' 591*cdf0e10cSrcweir { 592*cdf0e10cSrcweir const OSQLParseNode* pSubQuery = pTableRef->getChild(0); 593*cdf0e10cSrcweir if ( pSubQuery->isToken() ) 594*cdf0e10cSrcweir { 595*cdf0e10cSrcweir getQualified_join( _rTables, pTableRef->getChild(1), rTableRange ); 596*cdf0e10cSrcweir } 597*cdf0e10cSrcweir else 598*cdf0e10cSrcweir { 599*cdf0e10cSrcweir OSL_ENSURE( pSubQuery->count() == 3, "sub queries should have 3 children!" ); 600*cdf0e10cSrcweir const OSQLParseNode* pQueryExpression = pSubQuery->getChild(1); 601*cdf0e10cSrcweir if ( SQL_ISRULE( pQueryExpression, select_statement ) ) 602*cdf0e10cSrcweir { 603*cdf0e10cSrcweir getSelect_statement( *m_pImpl->m_pSubTables, pQueryExpression ); 604*cdf0e10cSrcweir } 605*cdf0e10cSrcweir else 606*cdf0e10cSrcweir { 607*cdf0e10cSrcweir OSL_ENSURE( false, "OSQLParseTreeIterator::getTableNode: subquery which is no select_statement: not yet implemented!" ); 608*cdf0e10cSrcweir } 609*cdf0e10cSrcweir } 610*cdf0e10cSrcweir } 611*cdf0e10cSrcweir else if ( pTableRef->count() == 2 ) // table_node table_primary_as_range_column 612*cdf0e10cSrcweir { 613*cdf0e10cSrcweir pTableNameNode = pTableRef->getChild(0); 614*cdf0e10cSrcweir } 615*cdf0e10cSrcweir else 616*cdf0e10cSrcweir OSL_ENSURE( false, "OSQLParseTreeIterator::getTableNode: unhandled case!" ); 617*cdf0e10cSrcweir } 618*cdf0e10cSrcweir 619*cdf0e10cSrcweir return pTableNameNode; 620*cdf0e10cSrcweir } 621*cdf0e10cSrcweir //----------------------------------------------------------------------------- 622*cdf0e10cSrcweir void OSQLParseTreeIterator::getSelect_statement(OSQLTables& _rTables,const OSQLParseNode* pSelect) 623*cdf0e10cSrcweir { 624*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::getSelect_statement" ); 625*cdf0e10cSrcweir if(SQL_ISRULE(pSelect,union_statement)) 626*cdf0e10cSrcweir { 627*cdf0e10cSrcweir getSelect_statement(_rTables,pSelect->getChild(0)); 628*cdf0e10cSrcweir //getSelect_statement(pSelect->getChild(3)); 629*cdf0e10cSrcweir return; 630*cdf0e10cSrcweir } 631*cdf0e10cSrcweir OSQLParseNode * pTableRefCommalist = pSelect->getChild(3)->getChild(0)->getChild(1); 632*cdf0e10cSrcweir 633*cdf0e10cSrcweir OSL_ENSURE(pTableRefCommalist != NULL,"OSQLParseTreeIterator: error in parse tree!"); 634*cdf0e10cSrcweir OSL_ENSURE(SQL_ISRULE(pTableRefCommalist,table_ref_commalist),"OSQLParseTreeIterator: error in parse tree!"); 635*cdf0e10cSrcweir 636*cdf0e10cSrcweir const OSQLParseNode* pTableName = NULL; 637*cdf0e10cSrcweir ::rtl::OUString aTableRange; 638*cdf0e10cSrcweir for (sal_uInt32 i = 0; i < pTableRefCommalist->count(); i++) 639*cdf0e10cSrcweir { // from clause durchlaufen 640*cdf0e10cSrcweir aTableRange = ::rtl::OUString(); 641*cdf0e10cSrcweir 642*cdf0e10cSrcweir const OSQLParseNode* pTableListElement = pTableRefCommalist->getChild(i); 643*cdf0e10cSrcweir if ( isTableNode( pTableListElement ) ) 644*cdf0e10cSrcweir { 645*cdf0e10cSrcweir traverseOneTableName( _rTables, pTableListElement, aTableRange ); 646*cdf0e10cSrcweir } 647*cdf0e10cSrcweir else if ( SQL_ISRULE( pTableListElement, table_ref ) ) 648*cdf0e10cSrcweir { 649*cdf0e10cSrcweir // Tabellenreferenz kann aus Tabellennamen, Tabellennamen (+),'('joined_table')'(+) bestehen 650*cdf0e10cSrcweir pTableName = pTableListElement->getChild(0); 651*cdf0e10cSrcweir if( isTableNode( pTableName ) ) 652*cdf0e10cSrcweir { // Tabellennamen gefunden 653*cdf0e10cSrcweir aTableRange = OSQLParseNode::getTableRange(pTableListElement); 654*cdf0e10cSrcweir traverseOneTableName( _rTables, pTableName, aTableRange ); 655*cdf0e10cSrcweir } 656*cdf0e10cSrcweir else if(SQL_ISPUNCTUATION(pTableName,"{")) 657*cdf0e10cSrcweir { // '{' SQL_TOKEN_OJ joined_table '}' 658*cdf0e10cSrcweir getQualified_join( _rTables, pTableListElement->getChild(2), aTableRange ); 659*cdf0e10cSrcweir } 660*cdf0e10cSrcweir else 661*cdf0e10cSrcweir { // '(' joined_table ')' range_variable op_column_commalist 662*cdf0e10cSrcweir getTableNode( _rTables, pTableListElement, aTableRange ); 663*cdf0e10cSrcweir } 664*cdf0e10cSrcweir } 665*cdf0e10cSrcweir else if (SQL_ISRULE( pTableListElement, qualified_join ) || SQL_ISRULE( pTableListElement, cross_union ) ) 666*cdf0e10cSrcweir { 667*cdf0e10cSrcweir getQualified_join( _rTables, pTableListElement, aTableRange ); 668*cdf0e10cSrcweir } 669*cdf0e10cSrcweir else if ( SQL_ISRULE( pTableListElement, joined_table ) ) 670*cdf0e10cSrcweir { 671*cdf0e10cSrcweir getQualified_join( _rTables, pTableListElement->getChild(1), aTableRange ); 672*cdf0e10cSrcweir } 673*cdf0e10cSrcweir 674*cdf0e10cSrcweir // if (! aIteratorStatus.IsSuccessful()) break; 675*cdf0e10cSrcweir } 676*cdf0e10cSrcweir } 677*cdf0e10cSrcweir //----------------------------------------------------------------------------- 678*cdf0e10cSrcweir bool OSQLParseTreeIterator::traverseTableNames(OSQLTables& _rTables) 679*cdf0e10cSrcweir { 680*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::traverseTableNames" ); 681*cdf0e10cSrcweir if ( m_pParseTree == NULL ) 682*cdf0e10cSrcweir return false; 683*cdf0e10cSrcweir 684*cdf0e10cSrcweir OSQLParseNode* pTableName = NULL; 685*cdf0e10cSrcweir 686*cdf0e10cSrcweir switch ( m_eStatementType ) 687*cdf0e10cSrcweir { 688*cdf0e10cSrcweir case SQL_STATEMENT_SELECT: 689*cdf0e10cSrcweir getSelect_statement( _rTables, m_pParseTree ); 690*cdf0e10cSrcweir break; 691*cdf0e10cSrcweir 692*cdf0e10cSrcweir case SQL_STATEMENT_CREATE_TABLE: 693*cdf0e10cSrcweir case SQL_STATEMENT_INSERT: 694*cdf0e10cSrcweir case SQL_STATEMENT_DELETE: 695*cdf0e10cSrcweir pTableName = m_pParseTree->getChild(2); 696*cdf0e10cSrcweir break; 697*cdf0e10cSrcweir 698*cdf0e10cSrcweir case SQL_STATEMENT_UPDATE: 699*cdf0e10cSrcweir pTableName = m_pParseTree->getChild(1); 700*cdf0e10cSrcweir break; 701*cdf0e10cSrcweir default: 702*cdf0e10cSrcweir break; 703*cdf0e10cSrcweir } 704*cdf0e10cSrcweir 705*cdf0e10cSrcweir if ( pTableName ) 706*cdf0e10cSrcweir { 707*cdf0e10cSrcweir ::rtl::OUString sTableRange; 708*cdf0e10cSrcweir traverseOneTableName( _rTables, pTableName, sTableRange ); 709*cdf0e10cSrcweir } 710*cdf0e10cSrcweir 711*cdf0e10cSrcweir return !hasErrors(); 712*cdf0e10cSrcweir } 713*cdf0e10cSrcweir //----------------------------------------------------------------------------- 714*cdf0e10cSrcweir ::rtl::OUString OSQLParseTreeIterator::getColumnAlias(const OSQLParseNode* _pDerivedColumn) 715*cdf0e10cSrcweir { 716*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::getColumnAlias" ); 717*cdf0e10cSrcweir OSL_ENSURE(SQL_ISRULE(_pDerivedColumn,derived_column),"No derived column!"); 718*cdf0e10cSrcweir ::rtl::OUString sColumnAlias; 719*cdf0e10cSrcweir if(_pDerivedColumn->getChild(1)->count() == 2) 720*cdf0e10cSrcweir sColumnAlias = _pDerivedColumn->getChild(1)->getChild(1)->getTokenValue(); 721*cdf0e10cSrcweir else if(!_pDerivedColumn->getChild(1)->isRule()) 722*cdf0e10cSrcweir sColumnAlias = _pDerivedColumn->getChild(1)->getTokenValue(); 723*cdf0e10cSrcweir return sColumnAlias; 724*cdf0e10cSrcweir } 725*cdf0e10cSrcweir 726*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 727*cdf0e10cSrcweir namespace 728*cdf0e10cSrcweir { 729*cdf0e10cSrcweir void lcl_getColumnRange( const OSQLParseNode* _pColumnRef, const Reference< XConnection >& _rxConnection, 730*cdf0e10cSrcweir ::rtl::OUString& _out_rColumnName, ::rtl::OUString& _out_rTableRange, 731*cdf0e10cSrcweir const OSQLColumns* _pSelectColumns, ::rtl::OUString& _out_rColumnAliasIfPresent ) 732*cdf0e10cSrcweir { 733*cdf0e10cSrcweir _out_rColumnName = _out_rTableRange = _out_rColumnAliasIfPresent = ::rtl::OUString(); 734*cdf0e10cSrcweir if ( SQL_ISRULE( _pColumnRef, column_ref ) ) 735*cdf0e10cSrcweir { 736*cdf0e10cSrcweir if( _pColumnRef->count() > 1 ) 737*cdf0e10cSrcweir { 738*cdf0e10cSrcweir for ( sal_Int32 i=0; i<((sal_Int32)_pColumnRef->count())-2; ++i ) 739*cdf0e10cSrcweir _pColumnRef->getChild(i)->parseNodeToStr( _out_rTableRange, _rxConnection, NULL, sal_False, sal_False ); 740*cdf0e10cSrcweir _out_rColumnName = _pColumnRef->getChild( _pColumnRef->count()-1 )->getChild(0)->getTokenValue(); 741*cdf0e10cSrcweir } 742*cdf0e10cSrcweir else 743*cdf0e10cSrcweir _out_rColumnName = _pColumnRef->getChild(0)->getTokenValue(); 744*cdf0e10cSrcweir 745*cdf0e10cSrcweir // look up the column in the select column, to find an possible alias 746*cdf0e10cSrcweir if ( _pSelectColumns ) 747*cdf0e10cSrcweir { 748*cdf0e10cSrcweir for ( OSQLColumns::Vector::const_iterator lookupColumn = _pSelectColumns->get().begin(); 749*cdf0e10cSrcweir lookupColumn != _pSelectColumns->get().end(); 750*cdf0e10cSrcweir ++lookupColumn 751*cdf0e10cSrcweir ) 752*cdf0e10cSrcweir { 753*cdf0e10cSrcweir Reference< XPropertySet > xColumn( *lookupColumn ); 754*cdf0e10cSrcweir try 755*cdf0e10cSrcweir { 756*cdf0e10cSrcweir ::rtl::OUString sName, sTableName; 757*cdf0e10cSrcweir xColumn->getPropertyValue( OMetaConnection::getPropMap().getNameByIndex( PROPERTY_ID_REALNAME ) ) >>= sName; 758*cdf0e10cSrcweir xColumn->getPropertyValue( OMetaConnection::getPropMap().getNameByIndex( PROPERTY_ID_TABLENAME ) ) >>= sTableName; 759*cdf0e10cSrcweir if ( sName == _out_rColumnName && sTableName == _out_rTableRange ) 760*cdf0e10cSrcweir xColumn->getPropertyValue( OMetaConnection::getPropMap().getNameByIndex( PROPERTY_ID_NAME ) ) >>= _out_rColumnAliasIfPresent; 761*cdf0e10cSrcweir } 762*cdf0e10cSrcweir catch( const Exception& ) 763*cdf0e10cSrcweir { 764*cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION(); 765*cdf0e10cSrcweir } 766*cdf0e10cSrcweir } 767*cdf0e10cSrcweir } 768*cdf0e10cSrcweir } 769*cdf0e10cSrcweir else if(SQL_ISRULE(_pColumnRef,general_set_fct) || SQL_ISRULE(_pColumnRef,set_fct_spec)) 770*cdf0e10cSrcweir { // Funktion 771*cdf0e10cSrcweir _pColumnRef->parseNodeToStr( _out_rColumnName, _rxConnection ); 772*cdf0e10cSrcweir } 773*cdf0e10cSrcweir else if(_pColumnRef->getNodeType() == SQL_NODE_NAME) 774*cdf0e10cSrcweir _out_rColumnName = _pColumnRef->getTokenValue(); 775*cdf0e10cSrcweir } 776*cdf0e10cSrcweir } 777*cdf0e10cSrcweir 778*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 779*cdf0e10cSrcweir void OSQLParseTreeIterator::getColumnRange( const OSQLParseNode* _pColumnRef, 780*cdf0e10cSrcweir ::rtl::OUString& _rColumnName, 781*cdf0e10cSrcweir ::rtl::OUString& _rTableRange) const 782*cdf0e10cSrcweir { 783*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::getColumnRange" ); 784*cdf0e10cSrcweir ::rtl::OUString sDummy; 785*cdf0e10cSrcweir lcl_getColumnRange( _pColumnRef, m_pImpl->m_xConnection, _rColumnName, _rTableRange, NULL, sDummy ); 786*cdf0e10cSrcweir } 787*cdf0e10cSrcweir 788*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 789*cdf0e10cSrcweir void OSQLParseTreeIterator::getColumnRange( const OSQLParseNode* _pColumnRef, 790*cdf0e10cSrcweir ::rtl::OUString& _rColumnName, 791*cdf0e10cSrcweir ::rtl::OUString& _rTableRange, 792*cdf0e10cSrcweir ::rtl::OUString& _out_rColumnAliasIfPresent ) const 793*cdf0e10cSrcweir { 794*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::getColumnRange" ); 795*cdf0e10cSrcweir lcl_getColumnRange( _pColumnRef, m_pImpl->m_xConnection, _rColumnName, _rTableRange, &*m_aSelectColumns, _out_rColumnAliasIfPresent ); 796*cdf0e10cSrcweir } 797*cdf0e10cSrcweir 798*cdf0e10cSrcweir //----------------------------------------------------------------------------- 799*cdf0e10cSrcweir void OSQLParseTreeIterator::getColumnRange( const OSQLParseNode* _pColumnRef, 800*cdf0e10cSrcweir const Reference< XConnection >& _rxConnection, ::rtl::OUString& _out_rColumnName, ::rtl::OUString& _out_rTableRange ) 801*cdf0e10cSrcweir { 802*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::getColumnRange" ); 803*cdf0e10cSrcweir ::rtl::OUString sDummy; 804*cdf0e10cSrcweir lcl_getColumnRange( _pColumnRef, _rxConnection, _out_rColumnName, _out_rTableRange, NULL, sDummy ); 805*cdf0e10cSrcweir } 806*cdf0e10cSrcweir 807*cdf0e10cSrcweir //----------------------------------------------------------------------------- 808*cdf0e10cSrcweir sal_Bool OSQLParseTreeIterator::getColumnTableRange(const OSQLParseNode* pNode, ::rtl::OUString &rTableRange) const 809*cdf0e10cSrcweir { 810*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::getColumnTableRange" ); 811*cdf0e10cSrcweir // Ermitteln ob alle Spalten zu einer Tabelle gehoeren 812*cdf0e10cSrcweir if (SQL_ISRULE(pNode,column_ref)) 813*cdf0e10cSrcweir { 814*cdf0e10cSrcweir ::rtl::OUString aColName, aTableRange; 815*cdf0e10cSrcweir getColumnRange(pNode, aColName, aTableRange); 816*cdf0e10cSrcweir if (!aTableRange.getLength()) // keinen gefunden 817*cdf0e10cSrcweir { 818*cdf0e10cSrcweir // dann die Spalte in den Tabellen suchen 819*cdf0e10cSrcweir for (ConstOSQLTablesIterator aIter = m_pImpl->m_pTables->begin(); aIter != m_pImpl->m_pTables->end(); ++aIter) 820*cdf0e10cSrcweir { 821*cdf0e10cSrcweir if (aIter->second.is()) 822*cdf0e10cSrcweir { 823*cdf0e10cSrcweir try 824*cdf0e10cSrcweir { 825*cdf0e10cSrcweir Reference< XNameAccess > xColumns = aIter->second->getColumns(); 826*cdf0e10cSrcweir if(xColumns->hasByName(aColName)) 827*cdf0e10cSrcweir { 828*cdf0e10cSrcweir Reference< XPropertySet > xColumn; 829*cdf0e10cSrcweir if (xColumns->getByName(aColName) >>= xColumn) 830*cdf0e10cSrcweir { 831*cdf0e10cSrcweir OSL_ENSURE(xColumn.is(),"Column isn't a propertyset!"); 832*cdf0e10cSrcweir aTableRange = aIter->first; 833*cdf0e10cSrcweir break; 834*cdf0e10cSrcweir } 835*cdf0e10cSrcweir } 836*cdf0e10cSrcweir } 837*cdf0e10cSrcweir catch(Exception&) 838*cdf0e10cSrcweir { 839*cdf0e10cSrcweir } 840*cdf0e10cSrcweir } 841*cdf0e10cSrcweir } 842*cdf0e10cSrcweir if (!aTableRange.getLength()) 843*cdf0e10cSrcweir return sal_False; 844*cdf0e10cSrcweir } 845*cdf0e10cSrcweir 846*cdf0e10cSrcweir 847*cdf0e10cSrcweir if (!rTableRange.getLength()) 848*cdf0e10cSrcweir rTableRange = aTableRange; 849*cdf0e10cSrcweir else if (rTableRange != aTableRange) 850*cdf0e10cSrcweir return sal_False; 851*cdf0e10cSrcweir } 852*cdf0e10cSrcweir else 853*cdf0e10cSrcweir { 854*cdf0e10cSrcweir for (sal_uInt32 i = 0, ncount = pNode->count(); i < ncount; i++) 855*cdf0e10cSrcweir { 856*cdf0e10cSrcweir if (!getColumnTableRange(pNode->getChild(i), rTableRange)) 857*cdf0e10cSrcweir return sal_False; 858*cdf0e10cSrcweir } 859*cdf0e10cSrcweir } 860*cdf0e10cSrcweir return sal_True; 861*cdf0e10cSrcweir } 862*cdf0e10cSrcweir 863*cdf0e10cSrcweir //----------------------------------------------------------------------------- 864*cdf0e10cSrcweir void OSQLParseTreeIterator::traverseCreateColumns(const OSQLParseNode* pSelectNode) 865*cdf0e10cSrcweir { 866*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::traverseCreateColumns" ); 867*cdf0e10cSrcweir // aIteratorStatus.Clear(); 868*cdf0e10cSrcweir 869*cdf0e10cSrcweir if (!pSelectNode || m_eStatementType != SQL_STATEMENT_CREATE_TABLE || m_pImpl->m_pTables->empty()) 870*cdf0e10cSrcweir { 871*cdf0e10cSrcweir impl_appendError( IParseContext::ERROR_GENERAL ); 872*cdf0e10cSrcweir return; 873*cdf0e10cSrcweir } 874*cdf0e10cSrcweir if (!SQL_ISRULE(pSelectNode,base_table_element_commalist)) 875*cdf0e10cSrcweir return ; 876*cdf0e10cSrcweir 877*cdf0e10cSrcweir for (sal_uInt32 i = 0; i < pSelectNode->count(); i++) 878*cdf0e10cSrcweir { 879*cdf0e10cSrcweir OSQLParseNode *pColumnRef = pSelectNode->getChild(i); 880*cdf0e10cSrcweir 881*cdf0e10cSrcweir if (SQL_ISRULE(pColumnRef,column_def)) 882*cdf0e10cSrcweir { 883*cdf0e10cSrcweir ::rtl::OUString aColumnName; 884*cdf0e10cSrcweir ::rtl::OUString aTypeName; 885*cdf0e10cSrcweir ::rtl::OUString aTableRange; 886*cdf0e10cSrcweir sal_Int32 nType = DataType::VARCHAR; 887*cdf0e10cSrcweir sal_Int32 nLen = 0; 888*cdf0e10cSrcweir aColumnName = pColumnRef->getChild(0)->getTokenValue(); 889*cdf0e10cSrcweir 890*cdf0e10cSrcweir OSQLParseNode *pDatatype = pColumnRef->getChild(1); 891*cdf0e10cSrcweir if (pDatatype && SQL_ISRULE(pDatatype,character_string_type)) 892*cdf0e10cSrcweir { 893*cdf0e10cSrcweir const OSQLParseNode *pType = pDatatype->getChild(0); 894*cdf0e10cSrcweir aTypeName = pType->getTokenValue(); 895*cdf0e10cSrcweir if (pDatatype->count() == 2 && (pType->getTokenID() == SQL_TOKEN_CHAR || pType->getTokenID() == SQL_TOKEN_CHARACTER )) 896*cdf0e10cSrcweir nType = DataType::CHAR; 897*cdf0e10cSrcweir 898*cdf0e10cSrcweir const OSQLParseNode *pParams = pDatatype->getChild(pDatatype->count()-1); 899*cdf0e10cSrcweir if ( pParams->count() ) 900*cdf0e10cSrcweir { 901*cdf0e10cSrcweir nLen = pParams->getChild(1)->getTokenValue().toInt32(); 902*cdf0e10cSrcweir } 903*cdf0e10cSrcweir } 904*cdf0e10cSrcweir else if(pDatatype && pDatatype->getNodeType() == SQL_NODE_KEYWORD) 905*cdf0e10cSrcweir { 906*cdf0e10cSrcweir aTypeName = ::rtl::OUString::createFromAscii("VARCHAR"); 907*cdf0e10cSrcweir } 908*cdf0e10cSrcweir 909*cdf0e10cSrcweir if (aTypeName.getLength()) 910*cdf0e10cSrcweir { 911*cdf0e10cSrcweir //TODO:Create a new class for create statement to handle field length 912*cdf0e10cSrcweir OParseColumn* pColumn = new OParseColumn(aColumnName,aTypeName,::rtl::OUString(),::rtl::OUString(), 913*cdf0e10cSrcweir ColumnValue::NULLABLE_UNKNOWN,0,0,nType,sal_False,sal_False,isCaseSensitive()); 914*cdf0e10cSrcweir pColumn->setFunction(sal_False); 915*cdf0e10cSrcweir pColumn->setRealName(aColumnName); 916*cdf0e10cSrcweir 917*cdf0e10cSrcweir Reference< XPropertySet> xCol = pColumn; 918*cdf0e10cSrcweir m_aCreateColumns->get().push_back(xCol); 919*cdf0e10cSrcweir } 920*cdf0e10cSrcweir } 921*cdf0e10cSrcweir 922*cdf0e10cSrcweir } 923*cdf0e10cSrcweir } 924*cdf0e10cSrcweir //----------------------------------------------------------------------------- 925*cdf0e10cSrcweir bool OSQLParseTreeIterator::traverseSelectColumnNames(const OSQLParseNode* pSelectNode) 926*cdf0e10cSrcweir { 927*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::traverseSelectColumnNames" ); 928*cdf0e10cSrcweir if ( ( m_pImpl->m_nIncludeMask & SelectColumns ) != SelectColumns ) 929*cdf0e10cSrcweir return true; 930*cdf0e10cSrcweir 931*cdf0e10cSrcweir if (!pSelectNode || m_eStatementType != SQL_STATEMENT_SELECT || m_pImpl->m_pTables->empty()) 932*cdf0e10cSrcweir { 933*cdf0e10cSrcweir impl_appendError( IParseContext::ERROR_GENERAL ); 934*cdf0e10cSrcweir return false; 935*cdf0e10cSrcweir } 936*cdf0e10cSrcweir 937*cdf0e10cSrcweir if(SQL_ISRULE(pSelectNode,union_statement)) 938*cdf0e10cSrcweir { 939*cdf0e10cSrcweir return traverseSelectColumnNames( pSelectNode->getChild( 0 ) ) 940*cdf0e10cSrcweir /*&& traverseSelectColumnNames( pSelectNode->getChild( 3 ) )*/; 941*cdf0e10cSrcweir } 942*cdf0e10cSrcweir 943*cdf0e10cSrcweir static ::rtl::OUString aEmptyString; 944*cdf0e10cSrcweir // nyi: mehr Pruefung auf korrekte Struktur! 945*cdf0e10cSrcweir if (pSelectNode->getChild(2)->isRule() && SQL_ISPUNCTUATION(pSelectNode->getChild(2)->getChild(0),"*")) 946*cdf0e10cSrcweir { 947*cdf0e10cSrcweir // SELECT * ... 948*cdf0e10cSrcweir setSelectColumnName(m_aSelectColumns,::rtl::OUString::createFromAscii("*"), aEmptyString,aEmptyString); 949*cdf0e10cSrcweir } 950*cdf0e10cSrcweir else if (SQL_ISRULE(pSelectNode->getChild(2),scalar_exp_commalist)) 951*cdf0e10cSrcweir { 952*cdf0e10cSrcweir // SELECT column[,column] oder SELECT COUNT(*) ... 953*cdf0e10cSrcweir OSQLParseNode * pSelection = pSelectNode->getChild(2); 954*cdf0e10cSrcweir 955*cdf0e10cSrcweir for (sal_uInt32 i = 0; i < pSelection->count(); i++) 956*cdf0e10cSrcweir { 957*cdf0e10cSrcweir OSQLParseNode *pColumnRef = pSelection->getChild(i); 958*cdf0e10cSrcweir 959*cdf0e10cSrcweir //if (SQL_ISRULE(pColumnRef,select_sublist)) 960*cdf0e10cSrcweir if (SQL_ISRULE(pColumnRef,derived_column) && 961*cdf0e10cSrcweir SQL_ISRULE(pColumnRef->getChild(0),column_ref) && 962*cdf0e10cSrcweir pColumnRef->getChild(0)->count() == 3 && 963*cdf0e10cSrcweir SQL_ISPUNCTUATION(pColumnRef->getChild(0)->getChild(2),"*")) 964*cdf0e10cSrcweir { 965*cdf0e10cSrcweir // alle Spalten der Tabelle 966*cdf0e10cSrcweir ::rtl::OUString aTableRange; 967*cdf0e10cSrcweir pColumnRef->getChild(0)->parseNodeToStr( aTableRange, m_pImpl->m_xConnection, NULL, sal_False, sal_False ); 968*cdf0e10cSrcweir setSelectColumnName(m_aSelectColumns,::rtl::OUString::createFromAscii("*"), aEmptyString,aTableRange); 969*cdf0e10cSrcweir continue; 970*cdf0e10cSrcweir } 971*cdf0e10cSrcweir else if (SQL_ISRULE(pColumnRef,derived_column)) 972*cdf0e10cSrcweir { 973*cdf0e10cSrcweir ::rtl::OUString aColumnAlias(getColumnAlias(pColumnRef)); // kann leer sein 974*cdf0e10cSrcweir ::rtl::OUString sColumnName; 975*cdf0e10cSrcweir ::rtl::OUString aTableRange; 976*cdf0e10cSrcweir sal_Int32 nType = DataType::VARCHAR; 977*cdf0e10cSrcweir sal_Bool bFkt(sal_False); 978*cdf0e10cSrcweir pColumnRef = pColumnRef->getChild(0); 979*cdf0e10cSrcweir if ( 980*cdf0e10cSrcweir pColumnRef->count() == 3 && 981*cdf0e10cSrcweir SQL_ISPUNCTUATION(pColumnRef->getChild(0),"(") && 982*cdf0e10cSrcweir SQL_ISPUNCTUATION(pColumnRef->getChild(2),")") 983*cdf0e10cSrcweir ) 984*cdf0e10cSrcweir pColumnRef = pColumnRef->getChild(1); 985*cdf0e10cSrcweir 986*cdf0e10cSrcweir if (SQL_ISRULE(pColumnRef,column_ref)) 987*cdf0e10cSrcweir { 988*cdf0e10cSrcweir getColumnRange(pColumnRef,sColumnName,aTableRange); 989*cdf0e10cSrcweir OSL_ENSURE(sColumnName.getLength(),"Columnname darf nicht leer sein"); 990*cdf0e10cSrcweir } 991*cdf0e10cSrcweir else /*if (SQL_ISRULE(pColumnRef,general_set_fct) || SQL_ISRULE(pColumnRef,set_fct_spec) || 992*cdf0e10cSrcweir SQL_ISRULE(pColumnRef,position_exp) || SQL_ISRULE(pColumnRef,extract_exp) || 993*cdf0e10cSrcweir SQL_ISRULE(pColumnRef,length_exp) || SQL_ISRULE(pColumnRef,char_value_fct)|| 994*cdf0e10cSrcweir SQL_ISRULE(pColumnRef,num_value_exp) || SQL_ISRULE(pColumnRef,term))*/ 995*cdf0e10cSrcweir { 996*cdf0e10cSrcweir /* Funktionsaufruf vorhanden */ 997*cdf0e10cSrcweir pColumnRef->parseNodeToStr( sColumnName, m_pImpl->m_xConnection, NULL, sal_False, sal_True ); 998*cdf0e10cSrcweir ::rtl::OUString sTableRange; 999*cdf0e10cSrcweir // check if the column is also a parameter 1000*cdf0e10cSrcweir traverseORCriteria(pColumnRef); // num_value_exp 1001*cdf0e10cSrcweir 1002*cdf0e10cSrcweir // gehoeren alle beteiligten Spalten der Funktion zu einer Tabelle 1003*cdf0e10cSrcweir if (m_pImpl->m_pTables->size() == 1) 1004*cdf0e10cSrcweir { 1005*cdf0e10cSrcweir aTableRange = m_pImpl->m_pTables->begin()->first; 1006*cdf0e10cSrcweir } 1007*cdf0e10cSrcweir else 1008*cdf0e10cSrcweir { 1009*cdf0e10cSrcweir getColumnTableRange(pColumnRef,aTableRange); 1010*cdf0e10cSrcweir } 1011*cdf0e10cSrcweir if ( pColumnRef->isRule() ) 1012*cdf0e10cSrcweir { 1013*cdf0e10cSrcweir bFkt = sal_True; 1014*cdf0e10cSrcweir nType = getFunctionReturnType(pColumnRef); 1015*cdf0e10cSrcweir } 1016*cdf0e10cSrcweir } 1017*cdf0e10cSrcweir /* 1018*cdf0e10cSrcweir else 1019*cdf0e10cSrcweir { 1020*cdf0e10cSrcweir aIteratorStatus.setStatementTooComplex(); 1021*cdf0e10cSrcweir return; 1022*cdf0e10cSrcweir } 1023*cdf0e10cSrcweir */ 1024*cdf0e10cSrcweir if(!aColumnAlias.getLength()) 1025*cdf0e10cSrcweir aColumnAlias = sColumnName; 1026*cdf0e10cSrcweir setSelectColumnName(m_aSelectColumns,sColumnName,aColumnAlias,aTableRange,bFkt,nType,SQL_ISRULE(pColumnRef,general_set_fct) || SQL_ISRULE(pColumnRef,set_fct_spec)); 1027*cdf0e10cSrcweir } 1028*cdf0e10cSrcweir } 1029*cdf0e10cSrcweir } 1030*cdf0e10cSrcweir 1031*cdf0e10cSrcweir return !hasErrors(); 1032*cdf0e10cSrcweir } 1033*cdf0e10cSrcweir 1034*cdf0e10cSrcweir 1035*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1036*cdf0e10cSrcweir bool OSQLParseTreeIterator::traverseOrderByColumnNames(const OSQLParseNode* pSelectNode) 1037*cdf0e10cSrcweir { 1038*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::traverseOrderByColumnNames" ); 1039*cdf0e10cSrcweir traverseByColumnNames( pSelectNode, sal_True ); 1040*cdf0e10cSrcweir return !hasErrors(); 1041*cdf0e10cSrcweir } 1042*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1043*cdf0e10cSrcweir void OSQLParseTreeIterator::traverseByColumnNames(const OSQLParseNode* pSelectNode,sal_Bool _bOrder) 1044*cdf0e10cSrcweir { 1045*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::traverseByColumnNames" ); 1046*cdf0e10cSrcweir // aIteratorStatus.Clear(); 1047*cdf0e10cSrcweir 1048*cdf0e10cSrcweir if (pSelectNode == NULL) 1049*cdf0e10cSrcweir { 1050*cdf0e10cSrcweir //aIteratorStatus.setInvalidStatement(); 1051*cdf0e10cSrcweir return; 1052*cdf0e10cSrcweir } 1053*cdf0e10cSrcweir 1054*cdf0e10cSrcweir if (m_eStatementType != SQL_STATEMENT_SELECT) 1055*cdf0e10cSrcweir { 1056*cdf0e10cSrcweir //aIteratorStatus.setInvalidStatement(); 1057*cdf0e10cSrcweir return; 1058*cdf0e10cSrcweir } 1059*cdf0e10cSrcweir 1060*cdf0e10cSrcweir if(SQL_ISRULE(pSelectNode,union_statement)) 1061*cdf0e10cSrcweir { 1062*cdf0e10cSrcweir traverseByColumnNames(pSelectNode->getChild(0),_bOrder); 1063*cdf0e10cSrcweir return; 1064*cdf0e10cSrcweir } 1065*cdf0e10cSrcweir 1066*cdf0e10cSrcweir OSL_ENSURE(pSelectNode->count() >= 4,"OSQLParseTreeIterator: error in parse tree!"); 1067*cdf0e10cSrcweir 1068*cdf0e10cSrcweir OSQLParseNode * pTableExp = pSelectNode->getChild(3); 1069*cdf0e10cSrcweir OSL_ENSURE(pTableExp != NULL,"OSQLParseTreeIterator: error in parse tree!"); 1070*cdf0e10cSrcweir OSL_ENSURE(SQL_ISRULE(pTableExp,table_exp),"OSQLParseTreeIterator:table_exp error in parse tree!"); 1071*cdf0e10cSrcweir OSL_ENSURE(pTableExp->count() == TABLE_EXPRESSION_CHILD_COUNT,"OSQLParseTreeIterator: error in parse tree!"); 1072*cdf0e10cSrcweir 1073*cdf0e10cSrcweir sal_uInt32 nPos = ( _bOrder ? ORDER_BY_CHILD_POS : 2 ); 1074*cdf0e10cSrcweir 1075*cdf0e10cSrcweir OSQLParseNode * pOptByClause = pTableExp->getChild(nPos); 1076*cdf0e10cSrcweir OSL_ENSURE(pOptByClause != NULL,"OSQLParseTreeIterator: error in parse tree!"); 1077*cdf0e10cSrcweir if ( pOptByClause->count() == 0 ) 1078*cdf0e10cSrcweir return; 1079*cdf0e10cSrcweir 1080*cdf0e10cSrcweir OSL_ENSURE(pOptByClause->count() == 3,"OSQLParseTreeIterator: error in parse tree!"); 1081*cdf0e10cSrcweir 1082*cdf0e10cSrcweir OSQLParseNode * pOrderingSpecCommalist = pOptByClause->getChild(2); 1083*cdf0e10cSrcweir OSL_ENSURE(pOrderingSpecCommalist != NULL,"OSQLParseTreeIterator: error in parse tree!"); 1084*cdf0e10cSrcweir OSL_ENSURE(!_bOrder || SQL_ISRULE(pOrderingSpecCommalist,ordering_spec_commalist),"OSQLParseTreeIterator:ordering_spec_commalist error in parse tree!"); 1085*cdf0e10cSrcweir OSL_ENSURE(pOrderingSpecCommalist->count() > 0,"OSQLParseTreeIterator: error in parse tree!"); 1086*cdf0e10cSrcweir 1087*cdf0e10cSrcweir ::rtl::OUString sColumnName,aColumnAlias; 1088*cdf0e10cSrcweir ::rtl::OUString aTableRange; 1089*cdf0e10cSrcweir sal_uInt32 nCount = pOrderingSpecCommalist->count(); 1090*cdf0e10cSrcweir for (sal_uInt32 i = 0; i < nCount; ++i) 1091*cdf0e10cSrcweir { 1092*cdf0e10cSrcweir OSQLParseNode* pColumnRef = pOrderingSpecCommalist->getChild(i); 1093*cdf0e10cSrcweir OSL_ENSURE(pColumnRef != NULL,"OSQLParseTreeIterator: error in parse tree!"); 1094*cdf0e10cSrcweir if ( _bOrder ) 1095*cdf0e10cSrcweir { 1096*cdf0e10cSrcweir OSL_ENSURE(SQL_ISRULE(pColumnRef,ordering_spec),"OSQLParseTreeIterator:ordering_spec error in parse tree!"); 1097*cdf0e10cSrcweir OSL_ENSURE(pColumnRef->count() == 2,"OSQLParseTreeIterator: error in parse tree!"); 1098*cdf0e10cSrcweir 1099*cdf0e10cSrcweir pColumnRef = pColumnRef->getChild(0); 1100*cdf0e10cSrcweir } 1101*cdf0e10cSrcweir aTableRange = ::rtl::OUString(); 1102*cdf0e10cSrcweir sColumnName = ::rtl::OUString(); 1103*cdf0e10cSrcweir if ( SQL_ISRULE(pColumnRef,column_ref) ) 1104*cdf0e10cSrcweir { 1105*cdf0e10cSrcweir // Column-Name (und TableRange): 1106*cdf0e10cSrcweir if(SQL_ISRULE(pColumnRef,column_ref)) 1107*cdf0e10cSrcweir getColumnRange(pColumnRef,sColumnName,aTableRange); 1108*cdf0e10cSrcweir else // eine Expression 1109*cdf0e10cSrcweir pColumnRef->parseNodeToStr( sColumnName, m_pImpl->m_xConnection, NULL, sal_False, sal_False ); 1110*cdf0e10cSrcweir 1111*cdf0e10cSrcweir OSL_ENSURE(sColumnName.getLength(),"sColumnName darf nicht leer sein"); 1112*cdf0e10cSrcweir } 1113*cdf0e10cSrcweir else 1114*cdf0e10cSrcweir { // here I found a predicate 1115*cdf0e10cSrcweir pColumnRef->parseNodeToStr( sColumnName, m_pImpl->m_xConnection, NULL, sal_False, sal_False ); 1116*cdf0e10cSrcweir } 1117*cdf0e10cSrcweir OSL_ENSURE(pColumnRef != NULL,"OSQLParseTreeIterator: error in parse tree!"); 1118*cdf0e10cSrcweir if ( _bOrder ) 1119*cdf0e10cSrcweir { 1120*cdf0e10cSrcweir // Ascending/Descending 1121*cdf0e10cSrcweir OSQLParseNode * pOptAscDesc = pColumnRef->getParent()->getChild(1); 1122*cdf0e10cSrcweir OSL_ENSURE(pOptAscDesc != NULL,"OSQLParseTreeIterator: error in parse tree!"); 1123*cdf0e10cSrcweir 1124*cdf0e10cSrcweir sal_Bool bAscending = pOptAscDesc && SQL_ISTOKEN(pOptAscDesc,ASC); 1125*cdf0e10cSrcweir setOrderByColumnName(sColumnName, aTableRange,bAscending); 1126*cdf0e10cSrcweir } 1127*cdf0e10cSrcweir else 1128*cdf0e10cSrcweir setGroupByColumnName(sColumnName, aTableRange); 1129*cdf0e10cSrcweir } 1130*cdf0e10cSrcweir } 1131*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1132*cdf0e10cSrcweir bool OSQLParseTreeIterator::traverseGroupByColumnNames(const OSQLParseNode* pSelectNode) 1133*cdf0e10cSrcweir { 1134*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::traverseGroupByColumnNames" ); 1135*cdf0e10cSrcweir traverseByColumnNames( pSelectNode, sal_False ); 1136*cdf0e10cSrcweir return !hasErrors(); 1137*cdf0e10cSrcweir } 1138*cdf0e10cSrcweir 1139*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1140*cdf0e10cSrcweir namespace 1141*cdf0e10cSrcweir { 1142*cdf0e10cSrcweir ::rtl::OUString lcl_generateParameterName( const OSQLParseNode& _rParentNode, const OSQLParseNode& _rParamNode ) 1143*cdf0e10cSrcweir { 1144*cdf0e10cSrcweir ::rtl::OUString sColumnName( RTL_CONSTASCII_USTRINGPARAM( "param" ) ); 1145*cdf0e10cSrcweir const sal_Int32 nCount = (sal_Int32)_rParentNode.count(); 1146*cdf0e10cSrcweir for ( sal_Int32 i = 0; i < nCount; ++i ) 1147*cdf0e10cSrcweir { 1148*cdf0e10cSrcweir if ( _rParentNode.getChild(i) == &_rParamNode ) 1149*cdf0e10cSrcweir { 1150*cdf0e10cSrcweir sColumnName += ::rtl::OUString::valueOf( i+1 ); 1151*cdf0e10cSrcweir break; 1152*cdf0e10cSrcweir } 1153*cdf0e10cSrcweir } 1154*cdf0e10cSrcweir return sColumnName; 1155*cdf0e10cSrcweir } 1156*cdf0e10cSrcweir } 1157*cdf0e10cSrcweir 1158*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1159*cdf0e10cSrcweir void OSQLParseTreeIterator::traverseParameters(const OSQLParseNode* _pNode) 1160*cdf0e10cSrcweir { 1161*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::traverseParameters" ); 1162*cdf0e10cSrcweir if ( _pNode == NULL ) 1163*cdf0e10cSrcweir return; 1164*cdf0e10cSrcweir 1165*cdf0e10cSrcweir ::rtl::OUString sColumnName, sTableRange, aColumnAlias; 1166*cdf0e10cSrcweir const OSQLParseNode* pParent = _pNode->getParent(); 1167*cdf0e10cSrcweir if ( pParent != NULL ) 1168*cdf0e10cSrcweir { 1169*cdf0e10cSrcweir if ( SQL_ISRULE(pParent,comparison_predicate) ) // x = X 1170*cdf0e10cSrcweir { 1171*cdf0e10cSrcweir sal_uInt32 nPos = 0; 1172*cdf0e10cSrcweir if ( pParent->getChild(nPos) == _pNode ) 1173*cdf0e10cSrcweir nPos = 2; 1174*cdf0e10cSrcweir const OSQLParseNode* pOther = pParent->getChild(nPos); 1175*cdf0e10cSrcweir if ( SQL_ISRULE( pOther, column_ref ) ) 1176*cdf0e10cSrcweir getColumnRange( pOther, sColumnName, sTableRange, aColumnAlias); 1177*cdf0e10cSrcweir else 1178*cdf0e10cSrcweir pOther->parseNodeToStr( sColumnName, m_pImpl->m_xConnection, NULL, sal_False, sal_False ); 1179*cdf0e10cSrcweir } // if ( SQL_ISRULE(pParent,comparison_predicate) ) // x = X 1180*cdf0e10cSrcweir else if ( SQL_ISRULE(pParent,other_like_predicate_part_2) ) 1181*cdf0e10cSrcweir { 1182*cdf0e10cSrcweir const OSQLParseNode* pOther = pParent->getParent()->getChild(0); 1183*cdf0e10cSrcweir if ( SQL_ISRULE( pOther, column_ref ) ) 1184*cdf0e10cSrcweir getColumnRange( pOther, sColumnName, sTableRange, aColumnAlias); 1185*cdf0e10cSrcweir else 1186*cdf0e10cSrcweir pOther->parseNodeToStr( sColumnName, m_pImpl->m_xConnection, NULL, sal_False, sal_False ); 1187*cdf0e10cSrcweir } 1188*cdf0e10cSrcweir else if ( SQL_ISRULE(pParent,between_predicate_part_2) ) 1189*cdf0e10cSrcweir { 1190*cdf0e10cSrcweir const OSQLParseNode* pOther = pParent->getParent()->getChild(0); 1191*cdf0e10cSrcweir if ( SQL_ISRULE( pOther, column_ref ) ) 1192*cdf0e10cSrcweir getColumnRange( pOther, sColumnName, sTableRange, aColumnAlias); 1193*cdf0e10cSrcweir else 1194*cdf0e10cSrcweir { 1195*cdf0e10cSrcweir pOther->parseNodeToStr( sColumnName, m_pImpl->m_xConnection, NULL, sal_False, sal_False ); 1196*cdf0e10cSrcweir lcl_generateParameterName( *pParent, *_pNode ); 1197*cdf0e10cSrcweir } 1198*cdf0e10cSrcweir } 1199*cdf0e10cSrcweir else if ( pParent->getNodeType() == SQL_NODE_COMMALISTRULE ) 1200*cdf0e10cSrcweir { 1201*cdf0e10cSrcweir lcl_generateParameterName( *pParent, *_pNode ); 1202*cdf0e10cSrcweir } 1203*cdf0e10cSrcweir } 1204*cdf0e10cSrcweir traverseParameter( _pNode, pParent, sColumnName, sTableRange, aColumnAlias ); 1205*cdf0e10cSrcweir const sal_uInt32 nCount = _pNode->count(); 1206*cdf0e10cSrcweir for (sal_uInt32 i = 0; i < nCount; ++i) 1207*cdf0e10cSrcweir { 1208*cdf0e10cSrcweir const OSQLParseNode* pChild = _pNode->getChild(i); 1209*cdf0e10cSrcweir traverseParameters( pChild ); 1210*cdf0e10cSrcweir } 1211*cdf0e10cSrcweir } 1212*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1213*cdf0e10cSrcweir bool OSQLParseTreeIterator::traverseSelectionCriteria(const OSQLParseNode* pSelectNode) 1214*cdf0e10cSrcweir { 1215*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::traverseSelectionCriteria" ); 1216*cdf0e10cSrcweir if ( pSelectNode == NULL ) 1217*cdf0e10cSrcweir return false; 1218*cdf0e10cSrcweir 1219*cdf0e10cSrcweir 1220*cdf0e10cSrcweir // Parse Tree analysieren (je nach Statement-Typ) 1221*cdf0e10cSrcweir // und Zeiger auf WHERE-Klausel setzen: 1222*cdf0e10cSrcweir OSQLParseNode * pWhereClause = NULL; 1223*cdf0e10cSrcweir 1224*cdf0e10cSrcweir if (m_eStatementType == SQL_STATEMENT_SELECT) 1225*cdf0e10cSrcweir { 1226*cdf0e10cSrcweir if(SQL_ISRULE(pSelectNode,union_statement)) 1227*cdf0e10cSrcweir { 1228*cdf0e10cSrcweir return traverseSelectionCriteria( pSelectNode->getChild( 0 ) ) 1229*cdf0e10cSrcweir && traverseSelectionCriteria( pSelectNode->getChild( 3 ) ); 1230*cdf0e10cSrcweir } 1231*cdf0e10cSrcweir OSL_ENSURE(pSelectNode->count() >= 4,"OSQLParseTreeIterator: error in parse tree!"); 1232*cdf0e10cSrcweir 1233*cdf0e10cSrcweir OSQLParseNode * pTableExp = pSelectNode->getChild(3); 1234*cdf0e10cSrcweir OSL_ENSURE(pTableExp != NULL,"OSQLParseTreeIterator: error in parse tree!"); 1235*cdf0e10cSrcweir OSL_ENSURE(SQL_ISRULE(pTableExp,table_exp),"OSQLParseTreeIterator: error in parse tree!"); 1236*cdf0e10cSrcweir OSL_ENSURE(pTableExp->count() == TABLE_EXPRESSION_CHILD_COUNT,"OSQLParseTreeIterator: error in parse tree!"); 1237*cdf0e10cSrcweir 1238*cdf0e10cSrcweir pWhereClause = pTableExp->getChild(1); 1239*cdf0e10cSrcweir } else if (SQL_ISRULE(pSelectNode,update_statement_searched)) { 1240*cdf0e10cSrcweir OSL_ENSURE(pSelectNode->count() == 5,"OSQLParseTreeIterator: error in parse tree!"); 1241*cdf0e10cSrcweir pWhereClause = pSelectNode->getChild(4); 1242*cdf0e10cSrcweir } else if (SQL_ISRULE(pSelectNode,delete_statement_searched)) { 1243*cdf0e10cSrcweir OSL_ENSURE(pSelectNode->count() == 4,"OSQLParseTreeIterator: error in parse tree!"); 1244*cdf0e10cSrcweir pWhereClause = pSelectNode->getChild(3); 1245*cdf0e10cSrcweir } else if (SQL_ISRULE(pSelectNode,delete_statement_positioned)) { 1246*cdf0e10cSrcweir // nyi 1247*cdf0e10cSrcweir OSL_ASSERT("OSQLParseTreeIterator::getSelectionCriteria: positioned nyi"); 1248*cdf0e10cSrcweir } else { 1249*cdf0e10cSrcweir // Anderes Statement. Keine Selektionskriterien. 1250*cdf0e10cSrcweir return false; 1251*cdf0e10cSrcweir } 1252*cdf0e10cSrcweir 1253*cdf0e10cSrcweir if (! SQL_ISRULE(pWhereClause,where_clause)) { 1254*cdf0e10cSrcweir // Die Where Clause ist meistens optional, d. h. es koennte sich auch 1255*cdf0e10cSrcweir // um "optional_where_clause" handeln. 1256*cdf0e10cSrcweir OSL_ENSURE(SQL_ISRULE(pWhereClause,opt_where_clause),"OSQLParseTreeIterator: error in parse tree!"); 1257*cdf0e10cSrcweir return false; 1258*cdf0e10cSrcweir } 1259*cdf0e10cSrcweir 1260*cdf0e10cSrcweir // Wenn es aber eine where_clause ist, dann darf sie nicht leer sein: 1261*cdf0e10cSrcweir OSL_ENSURE(pWhereClause->count() == 2,"OSQLParseTreeIterator: error in parse tree!"); 1262*cdf0e10cSrcweir 1263*cdf0e10cSrcweir OSQLParseNode * pComparisonPredicate = pWhereClause->getChild(1); 1264*cdf0e10cSrcweir OSL_ENSURE(pComparisonPredicate != NULL,"OSQLParseTreeIterator: error in parse tree!"); 1265*cdf0e10cSrcweir 1266*cdf0e10cSrcweir // 1267*cdf0e10cSrcweir // Und nun die Vergleichskriterien abarbeiten (rekursiv, alles ist erstmal ein OR-Kriterium): 1268*cdf0e10cSrcweir // 1269*cdf0e10cSrcweir 1270*cdf0e10cSrcweir traverseORCriteria(pComparisonPredicate); 1271*cdf0e10cSrcweir 1272*cdf0e10cSrcweir return !hasErrors(); 1273*cdf0e10cSrcweir } 1274*cdf0e10cSrcweir 1275*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1276*cdf0e10cSrcweir void OSQLParseTreeIterator::traverseORCriteria(OSQLParseNode * pSearchCondition) 1277*cdf0e10cSrcweir { 1278*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::traverseORCriteria" ); 1279*cdf0e10cSrcweir 1280*cdf0e10cSrcweir 1281*cdf0e10cSrcweir if ( 1282*cdf0e10cSrcweir pSearchCondition->count() == 3 && 1283*cdf0e10cSrcweir SQL_ISPUNCTUATION(pSearchCondition->getChild(0),"(") && 1284*cdf0e10cSrcweir SQL_ISPUNCTUATION(pSearchCondition->getChild(2),")") 1285*cdf0e10cSrcweir ) 1286*cdf0e10cSrcweir { 1287*cdf0e10cSrcweir // Runde Klammern um den Ausdruck 1288*cdf0e10cSrcweir traverseORCriteria(pSearchCondition->getChild(1)); 1289*cdf0e10cSrcweir } else if (SQL_ISRULE(pSearchCondition,search_condition) && 1290*cdf0e10cSrcweir pSearchCondition->count() == 3 && 1291*cdf0e10cSrcweir SQL_ISTOKEN(pSearchCondition->getChild(1),OR)) 1292*cdf0e10cSrcweir { 1293*cdf0e10cSrcweir // OR-Verknuepfung: 1294*cdf0e10cSrcweir 1295*cdf0e10cSrcweir for (int i = 0; i < 3; i++) { 1296*cdf0e10cSrcweir if (i == 1) continue; // Schluesselwort OR ueberspringen 1297*cdf0e10cSrcweir 1298*cdf0e10cSrcweir // Ist das erste Element wieder eine OR-Verknuepfung? 1299*cdf0e10cSrcweir if (i == 0 && 1300*cdf0e10cSrcweir SQL_ISRULE(pSearchCondition->getChild(0),search_condition) && 1301*cdf0e10cSrcweir pSearchCondition->getChild(0)->count() == 3 && 1302*cdf0e10cSrcweir SQL_ISTOKEN(pSearchCondition->getChild(0)->getChild(1),OR)) 1303*cdf0e10cSrcweir { 1304*cdf0e10cSrcweir // Dann rekursiv absteigen ... 1305*cdf0e10cSrcweir traverseORCriteria(pSearchCondition->getChild(0)); 1306*cdf0e10cSrcweir 1307*cdf0e10cSrcweir } else { 1308*cdf0e10cSrcweir // AND-Kriterien ... 1309*cdf0e10cSrcweir traverseANDCriteria(pSearchCondition->getChild(i)); 1310*cdf0e10cSrcweir // if (! aIteratorStatus.IsSuccessful()) break; 1311*cdf0e10cSrcweir } 1312*cdf0e10cSrcweir 1313*cdf0e10cSrcweir // if (! aIteratorStatus.IsSuccessful()) break; 1314*cdf0e10cSrcweir } 1315*cdf0e10cSrcweir } else { 1316*cdf0e10cSrcweir // Nur *ein* Kriterium oder eine AND-Verknuepfung von Kriterien. 1317*cdf0e10cSrcweir // Direkt die AND-Kriterien behandeln. 1318*cdf0e10cSrcweir traverseANDCriteria(pSearchCondition); 1319*cdf0e10cSrcweir // if (! aIteratorStatus.IsSuccessful()) return; 1320*cdf0e10cSrcweir } 1321*cdf0e10cSrcweir 1322*cdf0e10cSrcweir // Fehler einfach weiterreichen. 1323*cdf0e10cSrcweir } 1324*cdf0e10cSrcweir 1325*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1326*cdf0e10cSrcweir void OSQLParseTreeIterator::traverseANDCriteria(OSQLParseNode * pSearchCondition) 1327*cdf0e10cSrcweir { 1328*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::traverseANDCriteria" ); 1329*cdf0e10cSrcweir 1330*cdf0e10cSrcweir 1331*cdf0e10cSrcweir if ( 1332*cdf0e10cSrcweir SQL_ISRULE(pSearchCondition,boolean_primary) && 1333*cdf0e10cSrcweir pSearchCondition->count() == 3 && 1334*cdf0e10cSrcweir SQL_ISPUNCTUATION(pSearchCondition->getChild(0),"(") && 1335*cdf0e10cSrcweir SQL_ISPUNCTUATION(pSearchCondition->getChild(2),")") 1336*cdf0e10cSrcweir ) 1337*cdf0e10cSrcweir { 1338*cdf0e10cSrcweir // Runde Klammern 1339*cdf0e10cSrcweir traverseANDCriteria(pSearchCondition->getChild(1)); 1340*cdf0e10cSrcweir } 1341*cdf0e10cSrcweir // Das erste Element ist eine OR-Verknuepfung 1342*cdf0e10cSrcweir else if ( SQL_ISRULE(pSearchCondition,search_condition) && pSearchCondition->count() == 3 ) 1343*cdf0e10cSrcweir { 1344*cdf0e10cSrcweir // Dann rekursiv absteigen (dieselbe Row benutzen) ... 1345*cdf0e10cSrcweir traverseORCriteria(pSearchCondition->getChild(0)); 1346*cdf0e10cSrcweir // if (! aIteratorStatus.IsSuccessful()) 1347*cdf0e10cSrcweir // return; 1348*cdf0e10cSrcweir 1349*cdf0e10cSrcweir // Und mit dem rechten Child weitermachen: 1350*cdf0e10cSrcweir traverseANDCriteria(pSearchCondition->getChild(2)); 1351*cdf0e10cSrcweir } 1352*cdf0e10cSrcweir // Das erste Element ist (wieder) eine AND-Verknuepfung 1353*cdf0e10cSrcweir else if ( SQL_ISRULE(pSearchCondition,boolean_term) && pSearchCondition->count() == 3 ) 1354*cdf0e10cSrcweir { 1355*cdf0e10cSrcweir // Dann rekursiv absteigen (dieselbe Row benutzen) ... 1356*cdf0e10cSrcweir traverseANDCriteria(pSearchCondition->getChild(0)); 1357*cdf0e10cSrcweir // if (! aIteratorStatus.IsSuccessful()) 1358*cdf0e10cSrcweir // return; 1359*cdf0e10cSrcweir 1360*cdf0e10cSrcweir // Und mit dem rechten Child weitermachen: 1361*cdf0e10cSrcweir traverseANDCriteria(pSearchCondition->getChild(2)); 1362*cdf0e10cSrcweir } 1363*cdf0e10cSrcweir // Sonst einzelne Suchkriterien wie =, !=, ..., LIKE, IS NULL usw. behandeln: 1364*cdf0e10cSrcweir else if (SQL_ISRULE(pSearchCondition,comparison_predicate) ) 1365*cdf0e10cSrcweir { 1366*cdf0e10cSrcweir ::rtl::OUString aValue; 1367*cdf0e10cSrcweir pSearchCondition->getChild(2)->parseNodeToStr( aValue, m_pImpl->m_xConnection, NULL, sal_False, sal_False ); 1368*cdf0e10cSrcweir traverseOnePredicate(pSearchCondition->getChild(0),aValue,pSearchCondition->getChild(2)); 1369*cdf0e10cSrcweir impl_fillJoinConditions(pSearchCondition); 1370*cdf0e10cSrcweir // if (! aIteratorStatus.IsSuccessful()) 1371*cdf0e10cSrcweir // return; 1372*cdf0e10cSrcweir } 1373*cdf0e10cSrcweir else if (SQL_ISRULE(pSearchCondition,like_predicate) /*&& SQL_ISRULE(pSearchCondition->getChild(0),column_ref)*/) 1374*cdf0e10cSrcweir { 1375*cdf0e10cSrcweir OSL_ENSURE(pSearchCondition->count() == 2,"OSQLParseTreeIterator: error in parse tree!"); 1376*cdf0e10cSrcweir const OSQLParseNode* pPart2 = pSearchCondition->getChild(1); 1377*cdf0e10cSrcweir 1378*cdf0e10cSrcweir sal_Int32 nCurentPos = pPart2->count()-2; 1379*cdf0e10cSrcweir 1380*cdf0e10cSrcweir OSQLParseNode * pNum_value_exp = pPart2->getChild(nCurentPos); 1381*cdf0e10cSrcweir OSQLParseNode * pOptEscape = pPart2->getChild(nCurentPos+1); 1382*cdf0e10cSrcweir 1383*cdf0e10cSrcweir OSL_ENSURE(pNum_value_exp != NULL,"OSQLParseTreeIterator: error in parse tree!"); 1384*cdf0e10cSrcweir OSL_ENSURE(pOptEscape != NULL,"OSQLParseTreeIterator: error in parse tree!"); 1385*cdf0e10cSrcweir 1386*cdf0e10cSrcweir if (pOptEscape->count() != 0) 1387*cdf0e10cSrcweir { 1388*cdf0e10cSrcweir // aIteratorStatus.setStatementTooComplex(); 1389*cdf0e10cSrcweir return; 1390*cdf0e10cSrcweir } 1391*cdf0e10cSrcweir 1392*cdf0e10cSrcweir ::rtl::OUString aValue; 1393*cdf0e10cSrcweir OSQLParseNode * pParam = NULL; 1394*cdf0e10cSrcweir if (SQL_ISRULE(pNum_value_exp,parameter)) 1395*cdf0e10cSrcweir pParam = pNum_value_exp; 1396*cdf0e10cSrcweir else if(pNum_value_exp->isToken()) 1397*cdf0e10cSrcweir // Normaler Wert 1398*cdf0e10cSrcweir aValue = pNum_value_exp->getTokenValue(); 1399*cdf0e10cSrcweir else 1400*cdf0e10cSrcweir { 1401*cdf0e10cSrcweir pNum_value_exp->parseNodeToStr( aValue, m_pImpl->m_xConnection, NULL, sal_False, sal_False ); 1402*cdf0e10cSrcweir pParam = pNum_value_exp; 1403*cdf0e10cSrcweir } 1404*cdf0e10cSrcweir 1405*cdf0e10cSrcweir traverseOnePredicate(pSearchCondition->getChild(0),aValue,pParam); 1406*cdf0e10cSrcweir // if (! aIteratorStatus.IsSuccessful()) 1407*cdf0e10cSrcweir // return; 1408*cdf0e10cSrcweir } 1409*cdf0e10cSrcweir else if (SQL_ISRULE(pSearchCondition,in_predicate)) 1410*cdf0e10cSrcweir { 1411*cdf0e10cSrcweir OSL_ENSURE(pSearchCondition->count() == 2,"OSQLParseTreeIterator: error in parse tree!"); 1412*cdf0e10cSrcweir const OSQLParseNode* pPart2 = pSearchCondition->getChild(1); 1413*cdf0e10cSrcweir 1414*cdf0e10cSrcweir traverseORCriteria(pSearchCondition->getChild(0)); 1415*cdf0e10cSrcweir // if (! aIteratorStatus.IsSuccessful()) return; 1416*cdf0e10cSrcweir 1417*cdf0e10cSrcweir OSQLParseNode* pChild = pPart2->getChild(2); 1418*cdf0e10cSrcweir if ( SQL_ISRULE(pChild->getChild(0),subquery) ) 1419*cdf0e10cSrcweir { 1420*cdf0e10cSrcweir traverseTableNames( *m_pImpl->m_pSubTables ); 1421*cdf0e10cSrcweir traverseSelectionCriteria(pChild->getChild(0)->getChild(1)); 1422*cdf0e10cSrcweir } 1423*cdf0e10cSrcweir else 1424*cdf0e10cSrcweir { // '(' value_exp_commalist ')' 1425*cdf0e10cSrcweir pChild = pChild->getChild(1); 1426*cdf0e10cSrcweir sal_Int32 nCount = pChild->count(); 1427*cdf0e10cSrcweir for (sal_Int32 i=0; i < nCount; ++i) 1428*cdf0e10cSrcweir { 1429*cdf0e10cSrcweir traverseANDCriteria(pChild->getChild(i)); 1430*cdf0e10cSrcweir } 1431*cdf0e10cSrcweir } 1432*cdf0e10cSrcweir } 1433*cdf0e10cSrcweir else if (SQL_ISRULE(pSearchCondition,test_for_null) /*&& SQL_ISRULE(pSearchCondition->getChild(0),column_ref)*/) 1434*cdf0e10cSrcweir { 1435*cdf0e10cSrcweir OSL_ENSURE(pSearchCondition->count() == 2,"OSQLParseTreeIterator: error in parse tree!"); 1436*cdf0e10cSrcweir const OSQLParseNode* pPart2 = pSearchCondition->getChild(1); 1437*cdf0e10cSrcweir (void)pPart2; 1438*cdf0e10cSrcweir OSL_ENSURE(SQL_ISTOKEN(pPart2->getChild(0),IS),"OSQLParseTreeIterator: error in parse tree!"); 1439*cdf0e10cSrcweir 1440*cdf0e10cSrcweir ::rtl::OUString aString; 1441*cdf0e10cSrcweir traverseOnePredicate(pSearchCondition->getChild(0),aString,NULL); 1442*cdf0e10cSrcweir // if (! aIteratorStatus.IsSuccessful()) return; 1443*cdf0e10cSrcweir } 1444*cdf0e10cSrcweir else if (SQL_ISRULE(pSearchCondition,num_value_exp) || SQL_ISRULE(pSearchCondition,term)) 1445*cdf0e10cSrcweir { 1446*cdf0e10cSrcweir ::rtl::OUString aString; 1447*cdf0e10cSrcweir traverseOnePredicate(pSearchCondition->getChild(0),aString,pSearchCondition->getChild(0)); 1448*cdf0e10cSrcweir traverseOnePredicate(pSearchCondition->getChild(2),aString,pSearchCondition->getChild(2)); 1449*cdf0e10cSrcweir } 1450*cdf0e10cSrcweir // Fehler einfach weiterreichen. 1451*cdf0e10cSrcweir } 1452*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1453*cdf0e10cSrcweir void OSQLParseTreeIterator::traverseParameter(const OSQLParseNode* _pParseNode 1454*cdf0e10cSrcweir ,const OSQLParseNode* _pParentNode 1455*cdf0e10cSrcweir ,const ::rtl::OUString& _aColumnName 1456*cdf0e10cSrcweir ,const ::rtl::OUString& _aTableRange 1457*cdf0e10cSrcweir ,const ::rtl::OUString& _rColumnAlias) 1458*cdf0e10cSrcweir { 1459*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::traverseParameter" ); 1460*cdf0e10cSrcweir if ( !SQL_ISRULE( _pParseNode, parameter ) ) 1461*cdf0e10cSrcweir return; 1462*cdf0e10cSrcweir 1463*cdf0e10cSrcweir if ( ( m_pImpl->m_nIncludeMask & Parameters ) != Parameters ) 1464*cdf0e10cSrcweir // parameters not to be included in the traversal 1465*cdf0e10cSrcweir return; 1466*cdf0e10cSrcweir 1467*cdf0e10cSrcweir OSL_ENSURE(_pParseNode->count() > 0,"OSQLParseTreeIterator: error in parse tree!"); 1468*cdf0e10cSrcweir OSQLParseNode * pMark = _pParseNode->getChild(0); 1469*cdf0e10cSrcweir ::rtl::OUString sParameterName; 1470*cdf0e10cSrcweir 1471*cdf0e10cSrcweir if (SQL_ISPUNCTUATION(pMark,"?")) 1472*cdf0e10cSrcweir { 1473*cdf0e10cSrcweir sParameterName = _rColumnAlias.getLength() 1474*cdf0e10cSrcweir ? _rColumnAlias 1475*cdf0e10cSrcweir : _aColumnName.getLength() 1476*cdf0e10cSrcweir ? _aColumnName 1477*cdf0e10cSrcweir : ::rtl::OUString::createFromAscii("?"); 1478*cdf0e10cSrcweir } 1479*cdf0e10cSrcweir else if (SQL_ISPUNCTUATION(pMark,":")) 1480*cdf0e10cSrcweir { 1481*cdf0e10cSrcweir sParameterName = _pParseNode->getChild(1)->getTokenValue(); 1482*cdf0e10cSrcweir } 1483*cdf0e10cSrcweir else if (SQL_ISPUNCTUATION(pMark,"[")) 1484*cdf0e10cSrcweir { 1485*cdf0e10cSrcweir sParameterName = _pParseNode->getChild(1)->getTokenValue(); 1486*cdf0e10cSrcweir } 1487*cdf0e10cSrcweir else 1488*cdf0e10cSrcweir { 1489*cdf0e10cSrcweir OSL_ASSERT("OSQLParseTreeIterator: error in parse tree!"); 1490*cdf0e10cSrcweir } 1491*cdf0e10cSrcweir 1492*cdf0e10cSrcweir // found a parameter 1493*cdf0e10cSrcweir if ( _pParentNode && (SQL_ISRULE(_pParentNode,general_set_fct) || SQL_ISRULE(_pParentNode,set_fct_spec)) ) 1494*cdf0e10cSrcweir {// found a function as column_ref 1495*cdf0e10cSrcweir ::rtl::OUString sFunctionName; 1496*cdf0e10cSrcweir _pParentNode->getChild(0)->parseNodeToStr( sFunctionName, m_pImpl->m_xConnection, NULL, sal_False, sal_False ); 1497*cdf0e10cSrcweir const sal_uInt32 nCount = _pParentNode->count(); 1498*cdf0e10cSrcweir sal_uInt32 i = 0; 1499*cdf0e10cSrcweir for(; i < nCount;++i) 1500*cdf0e10cSrcweir { 1501*cdf0e10cSrcweir if ( _pParentNode->getChild(i) == _pParseNode ) 1502*cdf0e10cSrcweir break; 1503*cdf0e10cSrcweir } 1504*cdf0e10cSrcweir sal_Int32 nType = ::connectivity::OSQLParser::getFunctionParameterType( _pParentNode->getChild(0)->getTokenID(), i-1); 1505*cdf0e10cSrcweir 1506*cdf0e10cSrcweir OParseColumn* pColumn = new OParseColumn( sParameterName, 1507*cdf0e10cSrcweir ::rtl::OUString(), 1508*cdf0e10cSrcweir ::rtl::OUString(), 1509*cdf0e10cSrcweir ::rtl::OUString(), 1510*cdf0e10cSrcweir ColumnValue::NULLABLE_UNKNOWN, 1511*cdf0e10cSrcweir 0, 1512*cdf0e10cSrcweir 0, 1513*cdf0e10cSrcweir nType, 1514*cdf0e10cSrcweir sal_False, 1515*cdf0e10cSrcweir sal_False, 1516*cdf0e10cSrcweir isCaseSensitive()); 1517*cdf0e10cSrcweir pColumn->setFunction(sal_True); 1518*cdf0e10cSrcweir pColumn->setAggregateFunction(sal_True); 1519*cdf0e10cSrcweir pColumn->setRealName(sFunctionName); 1520*cdf0e10cSrcweir m_aParameters->get().push_back(pColumn); 1521*cdf0e10cSrcweir } 1522*cdf0e10cSrcweir else 1523*cdf0e10cSrcweir { 1524*cdf0e10cSrcweir sal_Bool bNotFound = sal_True; 1525*cdf0e10cSrcweir OSQLColumns::Vector::const_iterator aIter = ::connectivity::find( 1526*cdf0e10cSrcweir m_aSelectColumns->get().begin(), 1527*cdf0e10cSrcweir m_aSelectColumns->get().end(), 1528*cdf0e10cSrcweir _aColumnName,::comphelper::UStringMixEqual( isCaseSensitive() ) 1529*cdf0e10cSrcweir ); 1530*cdf0e10cSrcweir if(aIter != m_aSelectColumns->get().end()) 1531*cdf0e10cSrcweir { 1532*cdf0e10cSrcweir OParseColumn* pNewColumn = new OParseColumn(*aIter,isCaseSensitive()); 1533*cdf0e10cSrcweir pNewColumn->setName(sParameterName); 1534*cdf0e10cSrcweir pNewColumn->setRealName(_aColumnName); 1535*cdf0e10cSrcweir m_aParameters->get().push_back(pNewColumn); 1536*cdf0e10cSrcweir bNotFound = sal_False; 1537*cdf0e10cSrcweir } 1538*cdf0e10cSrcweir else if(_aColumnName.getLength())// search in the tables for the right one 1539*cdf0e10cSrcweir { 1540*cdf0e10cSrcweir 1541*cdf0e10cSrcweir Reference<XPropertySet> xColumn = findColumn( _aColumnName, _aTableRange, true ); 1542*cdf0e10cSrcweir 1543*cdf0e10cSrcweir if ( xColumn.is() ) 1544*cdf0e10cSrcweir { 1545*cdf0e10cSrcweir OParseColumn* pNewColumn = new OParseColumn(xColumn,isCaseSensitive()); 1546*cdf0e10cSrcweir pNewColumn->setName(sParameterName); 1547*cdf0e10cSrcweir pNewColumn->setRealName(_aColumnName); 1548*cdf0e10cSrcweir m_aParameters->get().push_back(pNewColumn); 1549*cdf0e10cSrcweir bNotFound = sal_False; 1550*cdf0e10cSrcweir } 1551*cdf0e10cSrcweir } 1552*cdf0e10cSrcweir if ( bNotFound ) 1553*cdf0e10cSrcweir { 1554*cdf0e10cSrcweir sal_Int32 nType = DataType::VARCHAR; 1555*cdf0e10cSrcweir OSQLParseNode* pParent = _pParentNode ? _pParentNode->getParent() : NULL; 1556*cdf0e10cSrcweir if ( pParent && (SQL_ISRULE(pParent,general_set_fct) || SQL_ISRULE(pParent,set_fct_spec)) ) 1557*cdf0e10cSrcweir { 1558*cdf0e10cSrcweir const sal_uInt32 nCount = _pParentNode->count(); 1559*cdf0e10cSrcweir sal_uInt32 i = 0; 1560*cdf0e10cSrcweir for(; i < nCount;++i) 1561*cdf0e10cSrcweir { 1562*cdf0e10cSrcweir if ( _pParentNode->getChild(i) == _pParseNode ) 1563*cdf0e10cSrcweir break; 1564*cdf0e10cSrcweir } 1565*cdf0e10cSrcweir nType = ::connectivity::OSQLParser::getFunctionParameterType( pParent->getChild(0)->getTokenID(), i+1); 1566*cdf0e10cSrcweir } 1567*cdf0e10cSrcweir 1568*cdf0e10cSrcweir ::rtl::OUString aNewColName( getUniqueColumnName( sParameterName ) ); 1569*cdf0e10cSrcweir 1570*cdf0e10cSrcweir OParseColumn* pColumn = new OParseColumn(aNewColName, 1571*cdf0e10cSrcweir ::rtl::OUString(), 1572*cdf0e10cSrcweir ::rtl::OUString(), 1573*cdf0e10cSrcweir ::rtl::OUString(), 1574*cdf0e10cSrcweir ColumnValue::NULLABLE_UNKNOWN, 1575*cdf0e10cSrcweir 0, 1576*cdf0e10cSrcweir 0, 1577*cdf0e10cSrcweir nType, 1578*cdf0e10cSrcweir sal_False, 1579*cdf0e10cSrcweir sal_False, 1580*cdf0e10cSrcweir isCaseSensitive() ); 1581*cdf0e10cSrcweir pColumn->setName(aNewColName); 1582*cdf0e10cSrcweir pColumn->setRealName(sParameterName); 1583*cdf0e10cSrcweir m_aParameters->get().push_back(pColumn); 1584*cdf0e10cSrcweir } 1585*cdf0e10cSrcweir } 1586*cdf0e10cSrcweir } 1587*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1588*cdf0e10cSrcweir void OSQLParseTreeIterator::traverseOnePredicate( 1589*cdf0e10cSrcweir OSQLParseNode * pColumnRef, 1590*cdf0e10cSrcweir ::rtl::OUString& rValue, 1591*cdf0e10cSrcweir OSQLParseNode * pParseNode) 1592*cdf0e10cSrcweir { 1593*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::traverseOnePredicate" ); 1594*cdf0e10cSrcweir if ( !pParseNode ) 1595*cdf0e10cSrcweir return; 1596*cdf0e10cSrcweir 1597*cdf0e10cSrcweir // Column-Name (und TableRange): 1598*cdf0e10cSrcweir ::rtl::OUString aColumnName, aTableRange, sColumnAlias; 1599*cdf0e10cSrcweir getColumnRange( pColumnRef, aColumnName, aTableRange, sColumnAlias); 1600*cdf0e10cSrcweir 1601*cdf0e10cSrcweir ::rtl::OUString aName; 1602*cdf0e10cSrcweir 1603*cdf0e10cSrcweir /*if (SQL_ISRULE(pParseNode,parameter)) 1604*cdf0e10cSrcweir traverseParameter( pParseNode, pColumnRef, aColumnName, aTableRange, sColumnAlias ); 1605*cdf0e10cSrcweir else */if (SQL_ISRULE(pParseNode,column_ref))// Column-Name (und TableRange): 1606*cdf0e10cSrcweir getColumnRange(pParseNode,aName,rValue); 1607*cdf0e10cSrcweir else 1608*cdf0e10cSrcweir { 1609*cdf0e10cSrcweir traverseORCriteria(pParseNode); 1610*cdf0e10cSrcweir // if (! aIteratorStatus.IsSuccessful()) return; 1611*cdf0e10cSrcweir } 1612*cdf0e10cSrcweir } 1613*cdf0e10cSrcweir 1614*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1615*cdf0e10cSrcweir void OSQLParseTreeIterator::traverseSome( sal_uInt32 _nIncludeMask ) 1616*cdf0e10cSrcweir { 1617*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::traverseSome" ); 1618*cdf0e10cSrcweir impl_traverse( _nIncludeMask ); 1619*cdf0e10cSrcweir } 1620*cdf0e10cSrcweir 1621*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1622*cdf0e10cSrcweir void OSQLParseTreeIterator::traverseAll() 1623*cdf0e10cSrcweir { 1624*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::traverseAll" ); 1625*cdf0e10cSrcweir impl_traverse( All ); 1626*cdf0e10cSrcweir } 1627*cdf0e10cSrcweir 1628*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1629*cdf0e10cSrcweir void OSQLParseTreeIterator::impl_traverse( sal_uInt32 _nIncludeMask ) 1630*cdf0e10cSrcweir { 1631*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::impl_traverse" ); 1632*cdf0e10cSrcweir impl_resetErrors(); 1633*cdf0e10cSrcweir m_pImpl->m_nIncludeMask = _nIncludeMask; 1634*cdf0e10cSrcweir 1635*cdf0e10cSrcweir if ( !traverseTableNames( *m_pImpl->m_pTables ) ) 1636*cdf0e10cSrcweir return; 1637*cdf0e10cSrcweir 1638*cdf0e10cSrcweir switch ( m_eStatementType ) 1639*cdf0e10cSrcweir { 1640*cdf0e10cSrcweir case SQL_STATEMENT_SELECT: 1641*cdf0e10cSrcweir { 1642*cdf0e10cSrcweir const OSQLParseNode* pSelectNode = m_pParseTree; 1643*cdf0e10cSrcweir traverseParameters( pSelectNode ); 1644*cdf0e10cSrcweir if ( !traverseSelectColumnNames( pSelectNode ) 1645*cdf0e10cSrcweir || !traverseOrderByColumnNames( pSelectNode ) 1646*cdf0e10cSrcweir || !traverseGroupByColumnNames( pSelectNode ) 1647*cdf0e10cSrcweir || !traverseSelectionCriteria( pSelectNode ) 1648*cdf0e10cSrcweir ) 1649*cdf0e10cSrcweir return; 1650*cdf0e10cSrcweir } 1651*cdf0e10cSrcweir break; 1652*cdf0e10cSrcweir case SQL_STATEMENT_CREATE_TABLE: 1653*cdf0e10cSrcweir { 1654*cdf0e10cSrcweir //0 | 1 | 2 |3| 4 |5 1655*cdf0e10cSrcweir //create table sc.foo ( a char(20), b char ) 1656*cdf0e10cSrcweir const OSQLParseNode* pCreateNode = m_pParseTree->getChild(4); 1657*cdf0e10cSrcweir traverseCreateColumns(pCreateNode); 1658*cdf0e10cSrcweir } 1659*cdf0e10cSrcweir break; 1660*cdf0e10cSrcweir case SQL_STATEMENT_INSERT: 1661*cdf0e10cSrcweir break; 1662*cdf0e10cSrcweir default: 1663*cdf0e10cSrcweir break; 1664*cdf0e10cSrcweir } 1665*cdf0e10cSrcweir } 1666*cdf0e10cSrcweir 1667*cdf0e10cSrcweir // Dummy-Implementationen: 1668*cdf0e10cSrcweir 1669*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1670*cdf0e10cSrcweir OSQLTable OSQLParseTreeIterator::impl_createTableObject( const ::rtl::OUString& rTableName, 1671*cdf0e10cSrcweir const ::rtl::OUString& rCatalogName, const ::rtl::OUString& rSchemaName ) 1672*cdf0e10cSrcweir { 1673*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::impl_createTableObject" ); 1674*cdf0e10cSrcweir OSL_PRECOND( m_eStatementType == SQL_STATEMENT_CREATE_TABLE, 1675*cdf0e10cSrcweir "OSQLParseTreeIterator::impl_createTableObject: only to be called for CREATE TABLE statements!" ); 1676*cdf0e10cSrcweir // (in all other cases, m_pTables is to contain the table objects as obtained from the tables 1677*cdf0e10cSrcweir // container of the connection (m_xTablesContainer) 1678*cdf0e10cSrcweir 1679*cdf0e10cSrcweir OSQLTable aReturnTable = new OTable( 1680*cdf0e10cSrcweir NULL, 1681*cdf0e10cSrcweir sal_False, 1682*cdf0e10cSrcweir rTableName, 1683*cdf0e10cSrcweir ::rtl::OUString::createFromAscii("Table"), 1684*cdf0e10cSrcweir ::rtl::OUString::createFromAscii("New Created Table"), 1685*cdf0e10cSrcweir rSchemaName, 1686*cdf0e10cSrcweir rCatalogName 1687*cdf0e10cSrcweir ); 1688*cdf0e10cSrcweir return aReturnTable; 1689*cdf0e10cSrcweir } 1690*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1691*cdf0e10cSrcweir void OSQLParseTreeIterator::appendColumns(::vos::ORef<OSQLColumns>& _rColumns,const ::rtl::OUString& _rTableAlias,const OSQLTable& _rTable) 1692*cdf0e10cSrcweir { 1693*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::appendColumns" ); 1694*cdf0e10cSrcweir 1695*cdf0e10cSrcweir if (!_rTable.is()) 1696*cdf0e10cSrcweir return; 1697*cdf0e10cSrcweir 1698*cdf0e10cSrcweir Reference<XNameAccess> xColumns = _rTable->getColumns(); 1699*cdf0e10cSrcweir if ( !xColumns.is() ) 1700*cdf0e10cSrcweir return; 1701*cdf0e10cSrcweir 1702*cdf0e10cSrcweir Sequence< ::rtl::OUString > aColNames = xColumns->getElementNames(); 1703*cdf0e10cSrcweir const ::rtl::OUString* pBegin = aColNames.getConstArray(); 1704*cdf0e10cSrcweir const ::rtl::OUString* pEnd = pBegin + aColNames.getLength(); 1705*cdf0e10cSrcweir 1706*cdf0e10cSrcweir for(;pBegin != pEnd;++pBegin) 1707*cdf0e10cSrcweir { 1708*cdf0e10cSrcweir 1709*cdf0e10cSrcweir ::rtl::OUString aName(getUniqueColumnName(*pBegin)); 1710*cdf0e10cSrcweir Reference< XPropertySet > xColumn; 1711*cdf0e10cSrcweir if(xColumns->hasByName(*pBegin) && (xColumns->getByName(*pBegin) >>= xColumn) && xColumn.is()) 1712*cdf0e10cSrcweir { 1713*cdf0e10cSrcweir OParseColumn* pColumn = new OParseColumn(aName 1714*cdf0e10cSrcweir , getString(xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPENAME))) 1715*cdf0e10cSrcweir , getString(xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_DEFAULTVALUE))) 1716*cdf0e10cSrcweir , getString(xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_DESCRIPTION))) 1717*cdf0e10cSrcweir , getINT32(xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISNULLABLE))) 1718*cdf0e10cSrcweir , getINT32(xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PRECISION))) 1719*cdf0e10cSrcweir , getINT32(xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_SCALE))) 1720*cdf0e10cSrcweir , getINT32(xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE))) 1721*cdf0e10cSrcweir , getBOOL(xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISAUTOINCREMENT))) 1722*cdf0e10cSrcweir , getBOOL(xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISCURRENCY))) 1723*cdf0e10cSrcweir , isCaseSensitive() ); 1724*cdf0e10cSrcweir 1725*cdf0e10cSrcweir pColumn->setTableName(_rTableAlias); 1726*cdf0e10cSrcweir pColumn->setRealName(*pBegin); 1727*cdf0e10cSrcweir Reference< XPropertySet> xCol = pColumn; 1728*cdf0e10cSrcweir _rColumns->get().push_back(xCol); 1729*cdf0e10cSrcweir } 1730*cdf0e10cSrcweir else 1731*cdf0e10cSrcweir impl_appendError( IParseContext::ERROR_INVALID_COLUMN, pBegin, &_rTableAlias ); 1732*cdf0e10cSrcweir } 1733*cdf0e10cSrcweir } 1734*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1735*cdf0e10cSrcweir void OSQLParseTreeIterator::setSelectColumnName(::vos::ORef<OSQLColumns>& _rColumns,const ::rtl::OUString & rColumnName,const ::rtl::OUString & rColumnAlias, const ::rtl::OUString & rTableRange,sal_Bool bFkt,sal_Int32 _nType,sal_Bool bAggFkt) 1736*cdf0e10cSrcweir { 1737*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::setSelectColumnName" ); 1738*cdf0e10cSrcweir if(rColumnName.toChar() == '*' && !rTableRange.getLength()) 1739*cdf0e10cSrcweir { // SELECT * ... 1740*cdf0e10cSrcweir OSL_ENSURE(_rColumns == m_aSelectColumns,"Invalid columns used here!"); 1741*cdf0e10cSrcweir for(ConstOSQLTablesIterator aIter = m_pImpl->m_pTables->begin(); aIter != m_pImpl->m_pTables->end();++aIter) 1742*cdf0e10cSrcweir appendColumns(_rColumns,aIter->first,aIter->second); 1743*cdf0e10cSrcweir } 1744*cdf0e10cSrcweir else if( rColumnName.toChar() == '*' && rTableRange.getLength() ) 1745*cdf0e10cSrcweir { // SELECT <table>.* 1746*cdf0e10cSrcweir OSL_ENSURE(_rColumns == m_aSelectColumns,"Invalid columns used here!"); 1747*cdf0e10cSrcweir ConstOSQLTablesIterator aFind = m_pImpl->m_pTables->find(rTableRange); 1748*cdf0e10cSrcweir 1749*cdf0e10cSrcweir if(aFind != m_pImpl->m_pTables->end()) 1750*cdf0e10cSrcweir appendColumns(_rColumns,rTableRange,aFind->second); 1751*cdf0e10cSrcweir } 1752*cdf0e10cSrcweir else if ( !rTableRange.getLength() ) 1753*cdf0e10cSrcweir { // SELECT <something> ... 1754*cdf0e10cSrcweir // without table specified 1755*cdf0e10cSrcweir if ( !bFkt ) 1756*cdf0e10cSrcweir { 1757*cdf0e10cSrcweir Reference< XPropertySet> xNewColumn; 1758*cdf0e10cSrcweir 1759*cdf0e10cSrcweir for ( OSQLTablesIterator aIter = m_pImpl->m_pTables->begin(); aIter != m_pImpl->m_pTables->end(); ++aIter ) 1760*cdf0e10cSrcweir { 1761*cdf0e10cSrcweir if ( !aIter->second.is() ) 1762*cdf0e10cSrcweir continue; 1763*cdf0e10cSrcweir 1764*cdf0e10cSrcweir Reference<XNameAccess> xColumns = aIter->second->getColumns(); 1765*cdf0e10cSrcweir Reference< XPropertySet > xColumn; 1766*cdf0e10cSrcweir if ( !xColumns->hasByName( rColumnName ) 1767*cdf0e10cSrcweir || !( xColumns->getByName( rColumnName ) >>= xColumn ) 1768*cdf0e10cSrcweir ) 1769*cdf0e10cSrcweir continue; 1770*cdf0e10cSrcweir 1771*cdf0e10cSrcweir ::rtl::OUString aNewColName(getUniqueColumnName(rColumnAlias)); 1772*cdf0e10cSrcweir 1773*cdf0e10cSrcweir OParseColumn* pColumn = new OParseColumn(xColumn,isCaseSensitive()); 1774*cdf0e10cSrcweir xNewColumn = pColumn; 1775*cdf0e10cSrcweir pColumn->setTableName(aIter->first); 1776*cdf0e10cSrcweir pColumn->setName(aNewColName); 1777*cdf0e10cSrcweir pColumn->setRealName(rColumnName); 1778*cdf0e10cSrcweir 1779*cdf0e10cSrcweir break; 1780*cdf0e10cSrcweir } 1781*cdf0e10cSrcweir 1782*cdf0e10cSrcweir if ( !xNewColumn.is() ) 1783*cdf0e10cSrcweir { 1784*cdf0e10cSrcweir // no function (due to the above !bFkt), no existing column 1785*cdf0e10cSrcweir // => assume an expression 1786*cdf0e10cSrcweir ::rtl::OUString aNewColName( getUniqueColumnName( rColumnAlias ) ); 1787*cdf0e10cSrcweir // did not find a column with this name in any of the tables 1788*cdf0e10cSrcweir OParseColumn* pColumn = new OParseColumn( 1789*cdf0e10cSrcweir aNewColName, 1790*cdf0e10cSrcweir ::rtl::OUString::createFromAscii( "VARCHAR" ), 1791*cdf0e10cSrcweir // TODO: does this match with _nType? 1792*cdf0e10cSrcweir // Or should be fill this from the getTypeInfo of the connection? 1793*cdf0e10cSrcweir ::rtl::OUString(), 1794*cdf0e10cSrcweir ::rtl::OUString(), 1795*cdf0e10cSrcweir ColumnValue::NULLABLE_UNKNOWN, 1796*cdf0e10cSrcweir 0, 1797*cdf0e10cSrcweir 0, 1798*cdf0e10cSrcweir _nType, 1799*cdf0e10cSrcweir sal_False, 1800*cdf0e10cSrcweir sal_False, 1801*cdf0e10cSrcweir isCaseSensitive() 1802*cdf0e10cSrcweir ); 1803*cdf0e10cSrcweir 1804*cdf0e10cSrcweir xNewColumn = pColumn; 1805*cdf0e10cSrcweir pColumn->setRealName( rColumnName ); 1806*cdf0e10cSrcweir } 1807*cdf0e10cSrcweir 1808*cdf0e10cSrcweir _rColumns->get().push_back( xNewColumn ); 1809*cdf0e10cSrcweir } 1810*cdf0e10cSrcweir else 1811*cdf0e10cSrcweir { 1812*cdf0e10cSrcweir ::rtl::OUString aNewColName(getUniqueColumnName(rColumnAlias)); 1813*cdf0e10cSrcweir 1814*cdf0e10cSrcweir OParseColumn* pColumn = new OParseColumn(aNewColName,::rtl::OUString(),::rtl::OUString(),::rtl::OUString(), 1815*cdf0e10cSrcweir ColumnValue::NULLABLE_UNKNOWN,0,0,_nType,sal_False,sal_False,isCaseSensitive()); 1816*cdf0e10cSrcweir pColumn->setFunction(sal_True); 1817*cdf0e10cSrcweir pColumn->setAggregateFunction(bAggFkt); 1818*cdf0e10cSrcweir pColumn->setRealName(rColumnName); 1819*cdf0e10cSrcweir 1820*cdf0e10cSrcweir Reference< XPropertySet> xCol = pColumn; 1821*cdf0e10cSrcweir _rColumns->get().push_back(xCol); 1822*cdf0e10cSrcweir } 1823*cdf0e10cSrcweir } 1824*cdf0e10cSrcweir else // ColumnName und Tablename vorhanden 1825*cdf0e10cSrcweir { 1826*cdf0e10cSrcweir ConstOSQLTablesIterator aFind = m_pImpl->m_pTables->find(rTableRange); 1827*cdf0e10cSrcweir 1828*cdf0e10cSrcweir sal_Bool bError = sal_False; 1829*cdf0e10cSrcweir if (aFind != m_pImpl->m_pTables->end() && aFind->second.is()) 1830*cdf0e10cSrcweir { 1831*cdf0e10cSrcweir if (bFkt) 1832*cdf0e10cSrcweir { 1833*cdf0e10cSrcweir ::rtl::OUString aNewColName(getUniqueColumnName(rColumnAlias)); 1834*cdf0e10cSrcweir 1835*cdf0e10cSrcweir OParseColumn* pColumn = new OParseColumn(aNewColName,::rtl::OUString(),::rtl::OUString(),::rtl::OUString(), 1836*cdf0e10cSrcweir ColumnValue::NULLABLE_UNKNOWN,0,0,_nType,sal_False,sal_False,isCaseSensitive()); 1837*cdf0e10cSrcweir pColumn->setFunction(sal_True); 1838*cdf0e10cSrcweir pColumn->setAggregateFunction(bAggFkt); 1839*cdf0e10cSrcweir pColumn->setRealName(rColumnName); 1840*cdf0e10cSrcweir pColumn->setTableName(aFind->first); 1841*cdf0e10cSrcweir 1842*cdf0e10cSrcweir Reference< XPropertySet> xCol = pColumn; 1843*cdf0e10cSrcweir _rColumns->get().push_back(xCol); 1844*cdf0e10cSrcweir } 1845*cdf0e10cSrcweir else 1846*cdf0e10cSrcweir { 1847*cdf0e10cSrcweir Reference< XPropertySet > xColumn; 1848*cdf0e10cSrcweir if (aFind->second->getColumns()->hasByName(rColumnName) && (aFind->second->getColumns()->getByName(rColumnName) >>= xColumn)) 1849*cdf0e10cSrcweir { 1850*cdf0e10cSrcweir ::rtl::OUString aNewColName(getUniqueColumnName(rColumnAlias)); 1851*cdf0e10cSrcweir 1852*cdf0e10cSrcweir OParseColumn* pColumn = new OParseColumn(xColumn,isCaseSensitive()); 1853*cdf0e10cSrcweir pColumn->setName(aNewColName); 1854*cdf0e10cSrcweir pColumn->setRealName(rColumnName); 1855*cdf0e10cSrcweir pColumn->setTableName(aFind->first); 1856*cdf0e10cSrcweir 1857*cdf0e10cSrcweir Reference< XPropertySet> xCol = pColumn; 1858*cdf0e10cSrcweir _rColumns->get().push_back(xCol); 1859*cdf0e10cSrcweir } 1860*cdf0e10cSrcweir else 1861*cdf0e10cSrcweir bError = sal_True; 1862*cdf0e10cSrcweir } 1863*cdf0e10cSrcweir } 1864*cdf0e10cSrcweir else 1865*cdf0e10cSrcweir bError = sal_True; 1866*cdf0e10cSrcweir 1867*cdf0e10cSrcweir // Tabelle existiert nicht oder Feld nicht vorhanden 1868*cdf0e10cSrcweir if (bError) 1869*cdf0e10cSrcweir { 1870*cdf0e10cSrcweir ::rtl::OUString aNewColName(getUniqueColumnName(rColumnAlias)); 1871*cdf0e10cSrcweir 1872*cdf0e10cSrcweir OParseColumn* pColumn = new OParseColumn(aNewColName,::rtl::OUString(),::rtl::OUString(),::rtl::OUString(), 1873*cdf0e10cSrcweir ColumnValue::NULLABLE_UNKNOWN,0,0,DataType::VARCHAR,sal_False,sal_False,isCaseSensitive()); 1874*cdf0e10cSrcweir pColumn->setFunction(sal_True); 1875*cdf0e10cSrcweir pColumn->setAggregateFunction(bAggFkt); 1876*cdf0e10cSrcweir 1877*cdf0e10cSrcweir Reference< XPropertySet> xCol = pColumn; 1878*cdf0e10cSrcweir _rColumns->get().push_back(xCol); 1879*cdf0e10cSrcweir } 1880*cdf0e10cSrcweir } 1881*cdf0e10cSrcweir } 1882*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1883*cdf0e10cSrcweir ::rtl::OUString OSQLParseTreeIterator::getUniqueColumnName(const ::rtl::OUString & rColumnName) const 1884*cdf0e10cSrcweir { 1885*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::getUniqueColumnName" ); 1886*cdf0e10cSrcweir ::rtl::OUString aAlias(rColumnName); 1887*cdf0e10cSrcweir 1888*cdf0e10cSrcweir OSQLColumns::Vector::const_iterator aIter = find( 1889*cdf0e10cSrcweir m_aSelectColumns->get().begin(), 1890*cdf0e10cSrcweir m_aSelectColumns->get().end(), 1891*cdf0e10cSrcweir aAlias, 1892*cdf0e10cSrcweir ::comphelper::UStringMixEqual( isCaseSensitive() ) 1893*cdf0e10cSrcweir ); 1894*cdf0e10cSrcweir sal_Int32 i=1; 1895*cdf0e10cSrcweir while(aIter != m_aSelectColumns->get().end()) 1896*cdf0e10cSrcweir { 1897*cdf0e10cSrcweir (aAlias = rColumnName) += ::rtl::OUString::valueOf(i++); 1898*cdf0e10cSrcweir aIter = find( 1899*cdf0e10cSrcweir m_aSelectColumns->get().begin(), 1900*cdf0e10cSrcweir m_aSelectColumns->get().end(), 1901*cdf0e10cSrcweir aAlias, 1902*cdf0e10cSrcweir ::comphelper::UStringMixEqual( isCaseSensitive() ) 1903*cdf0e10cSrcweir ); 1904*cdf0e10cSrcweir } 1905*cdf0e10cSrcweir return aAlias; 1906*cdf0e10cSrcweir } 1907*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1908*cdf0e10cSrcweir void OSQLParseTreeIterator::setOrderByColumnName(const ::rtl::OUString & rColumnName, const ::rtl::OUString & rTableRange,sal_Bool bAscending) 1909*cdf0e10cSrcweir { 1910*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::setOrderByColumnName" ); 1911*cdf0e10cSrcweir Reference<XPropertySet> xColumn = findColumn( rColumnName, rTableRange, false ); 1912*cdf0e10cSrcweir if ( xColumn.is() ) 1913*cdf0e10cSrcweir m_aOrderColumns->get().push_back(new OOrderColumn( xColumn, rTableRange, isCaseSensitive(), bAscending ) ); 1914*cdf0e10cSrcweir else 1915*cdf0e10cSrcweir { 1916*cdf0e10cSrcweir sal_Int32 nId = rColumnName.toInt32(); 1917*cdf0e10cSrcweir if ( nId > 0 && nId < static_cast<sal_Int32>(m_aSelectColumns->get().size()) ) 1918*cdf0e10cSrcweir m_aOrderColumns->get().push_back( new OOrderColumn( ( m_aSelectColumns->get() )[nId-1], isCaseSensitive(), bAscending ) ); 1919*cdf0e10cSrcweir } 1920*cdf0e10cSrcweir 1921*cdf0e10cSrcweir #ifdef SQL_TEST_PARSETREEITERATOR 1922*cdf0e10cSrcweir cout << "OSQLParseTreeIterator::setOrderByColumnName: " 1923*cdf0e10cSrcweir << (const char *) rColumnName << ", " 1924*cdf0e10cSrcweir << (const char *) rTableRange << ", " 1925*cdf0e10cSrcweir << (bAscending ? "sal_True" : "sal_False") 1926*cdf0e10cSrcweir << "\n"; 1927*cdf0e10cSrcweir #endif 1928*cdf0e10cSrcweir } 1929*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1930*cdf0e10cSrcweir void OSQLParseTreeIterator::setGroupByColumnName(const ::rtl::OUString & rColumnName, const ::rtl::OUString & rTableRange) 1931*cdf0e10cSrcweir { 1932*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::setGroupByColumnName" ); 1933*cdf0e10cSrcweir Reference<XPropertySet> xColumn = findColumn( rColumnName, rTableRange, false ); 1934*cdf0e10cSrcweir if ( xColumn.is() ) 1935*cdf0e10cSrcweir m_aGroupColumns->get().push_back(new OParseColumn(xColumn,isCaseSensitive())); 1936*cdf0e10cSrcweir else 1937*cdf0e10cSrcweir { 1938*cdf0e10cSrcweir sal_Int32 nId = rColumnName.toInt32(); 1939*cdf0e10cSrcweir if ( nId > 0 && nId < static_cast<sal_Int32>(m_aSelectColumns->get().size()) ) 1940*cdf0e10cSrcweir m_aGroupColumns->get().push_back(new OParseColumn((m_aSelectColumns->get())[nId-1],isCaseSensitive())); 1941*cdf0e10cSrcweir } 1942*cdf0e10cSrcweir 1943*cdf0e10cSrcweir #ifdef SQL_TEST_PARSETREEITERATOR 1944*cdf0e10cSrcweir cout << "OSQLParseTreeIterator::setOrderByColumnName: " 1945*cdf0e10cSrcweir << (const char *) rColumnName << ", " 1946*cdf0e10cSrcweir << (const char *) rTableRange << ", " 1947*cdf0e10cSrcweir << (bAscending ? "sal_True" : "sal_False") 1948*cdf0e10cSrcweir << "\n"; 1949*cdf0e10cSrcweir #endif 1950*cdf0e10cSrcweir } 1951*cdf0e10cSrcweir 1952*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1953*cdf0e10cSrcweir const OSQLParseNode* OSQLParseTreeIterator::getWhereTree() const 1954*cdf0e10cSrcweir { 1955*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::getWhereTree" ); 1956*cdf0e10cSrcweir 1957*cdf0e10cSrcweir 1958*cdf0e10cSrcweir if (!m_pParseTree) 1959*cdf0e10cSrcweir return NULL; 1960*cdf0e10cSrcweir 1961*cdf0e10cSrcweir // Parse Tree analysieren (je nach Statement-Typ) 1962*cdf0e10cSrcweir // und Zeiger auf WHERE-Klausel setzen: 1963*cdf0e10cSrcweir OSQLParseNode * pWhereClause = NULL; 1964*cdf0e10cSrcweir if(getStatementType() == SQL_STATEMENT_SELECT) 1965*cdf0e10cSrcweir { 1966*cdf0e10cSrcweir OSL_ENSURE(m_pParseTree->count() >= 4,"ParseTreeIterator: error in parse tree!"); 1967*cdf0e10cSrcweir OSQLParseNode * pTableExp = m_pParseTree->getChild(3); 1968*cdf0e10cSrcweir OSL_ENSURE(pTableExp != NULL,"OSQLParseTreeIterator: error in parse tree!"); 1969*cdf0e10cSrcweir OSL_ENSURE(SQL_ISRULE(pTableExp,table_exp),"OSQLParseTreeIterator: error in parse tree!"); 1970*cdf0e10cSrcweir OSL_ENSURE(pTableExp->count() == TABLE_EXPRESSION_CHILD_COUNT,"OSQLParseTreeIterator: error in parse tree!"); 1971*cdf0e10cSrcweir 1972*cdf0e10cSrcweir pWhereClause = pTableExp->getChild(1); 1973*cdf0e10cSrcweir } 1974*cdf0e10cSrcweir else if (SQL_ISRULE(m_pParseTree,update_statement_searched) || 1975*cdf0e10cSrcweir SQL_ISRULE(m_pParseTree,delete_statement_searched)) 1976*cdf0e10cSrcweir { 1977*cdf0e10cSrcweir pWhereClause = m_pParseTree->getChild(m_pParseTree->count()-1); 1978*cdf0e10cSrcweir } 1979*cdf0e10cSrcweir if(pWhereClause->count() != 2) 1980*cdf0e10cSrcweir pWhereClause = NULL; 1981*cdf0e10cSrcweir return pWhereClause; 1982*cdf0e10cSrcweir } 1983*cdf0e10cSrcweir 1984*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1985*cdf0e10cSrcweir const OSQLParseNode* OSQLParseTreeIterator::getOrderTree() const 1986*cdf0e10cSrcweir { 1987*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::getOrderTree" ); 1988*cdf0e10cSrcweir 1989*cdf0e10cSrcweir 1990*cdf0e10cSrcweir if (!m_pParseTree || getStatementType() != SQL_STATEMENT_SELECT) 1991*cdf0e10cSrcweir return NULL; 1992*cdf0e10cSrcweir 1993*cdf0e10cSrcweir // Parse Tree analysieren (je nach Statement-Typ) 1994*cdf0e10cSrcweir // und Zeiger auf ORDER-Klausel setzen: 1995*cdf0e10cSrcweir OSQLParseNode * pOrderClause = NULL; 1996*cdf0e10cSrcweir OSL_ENSURE(m_pParseTree->count() >= 4,"ParseTreeIterator: error in parse tree!"); 1997*cdf0e10cSrcweir OSQLParseNode * pTableExp = m_pParseTree->getChild(3); 1998*cdf0e10cSrcweir OSL_ENSURE(pTableExp != NULL,"OSQLParseTreeIterator: error in parse tree!"); 1999*cdf0e10cSrcweir OSL_ENSURE(SQL_ISRULE(pTableExp,table_exp),"OSQLParseTreeIterator: error in parse tree!"); 2000*cdf0e10cSrcweir OSL_ENSURE(pTableExp->count() == TABLE_EXPRESSION_CHILD_COUNT,"OSQLParseTreeIterator: error in parse tree!"); 2001*cdf0e10cSrcweir 2002*cdf0e10cSrcweir pOrderClause = pTableExp->getChild(ORDER_BY_CHILD_POS); 2003*cdf0e10cSrcweir // Wenn es aber eine order_by ist, dann darf sie nicht leer sein: 2004*cdf0e10cSrcweir if(pOrderClause->count() != 3) 2005*cdf0e10cSrcweir pOrderClause = NULL; 2006*cdf0e10cSrcweir return pOrderClause; 2007*cdf0e10cSrcweir } 2008*cdf0e10cSrcweir //----------------------------------------------------------------------------- 2009*cdf0e10cSrcweir const OSQLParseNode* OSQLParseTreeIterator::getGroupByTree() const 2010*cdf0e10cSrcweir { 2011*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::getGroupByTree" ); 2012*cdf0e10cSrcweir if (!m_pParseTree || getStatementType() != SQL_STATEMENT_SELECT) 2013*cdf0e10cSrcweir return NULL; 2014*cdf0e10cSrcweir 2015*cdf0e10cSrcweir // Parse Tree analysieren (je nach Statement-Typ) 2016*cdf0e10cSrcweir // und Zeiger auf ORDER-Klausel setzen: 2017*cdf0e10cSrcweir OSQLParseNode * pGroupClause = NULL; 2018*cdf0e10cSrcweir OSL_ENSURE(m_pParseTree->count() >= 4,"ParseTreeIterator: error in parse tree!"); 2019*cdf0e10cSrcweir OSQLParseNode * pTableExp = m_pParseTree->getChild(3); 2020*cdf0e10cSrcweir OSL_ENSURE(pTableExp != NULL,"OSQLParseTreeIterator: error in parse tree!"); 2021*cdf0e10cSrcweir OSL_ENSURE(SQL_ISRULE(pTableExp,table_exp),"OSQLParseTreeIterator: error in parse tree!"); 2022*cdf0e10cSrcweir OSL_ENSURE(pTableExp->count() == TABLE_EXPRESSION_CHILD_COUNT,"OSQLParseTreeIterator: error in parse tree!"); 2023*cdf0e10cSrcweir 2024*cdf0e10cSrcweir pGroupClause = pTableExp->getChild(2); 2025*cdf0e10cSrcweir // Wenn es aber eine order_by ist, dann darf sie nicht leer sein: 2026*cdf0e10cSrcweir if(pGroupClause->count() != 3) 2027*cdf0e10cSrcweir pGroupClause = NULL; 2028*cdf0e10cSrcweir return pGroupClause; 2029*cdf0e10cSrcweir } 2030*cdf0e10cSrcweir //----------------------------------------------------------------------------- 2031*cdf0e10cSrcweir const OSQLParseNode* OSQLParseTreeIterator::getHavingTree() const 2032*cdf0e10cSrcweir { 2033*cdf0e10cSrcweir if (!m_pParseTree || getStatementType() != SQL_STATEMENT_SELECT) 2034*cdf0e10cSrcweir return NULL; 2035*cdf0e10cSrcweir 2036*cdf0e10cSrcweir // Parse Tree analysieren (je nach Statement-Typ) 2037*cdf0e10cSrcweir // und Zeiger auf ORDER-Klausel setzen: 2038*cdf0e10cSrcweir OSQLParseNode * pHavingClause = NULL; 2039*cdf0e10cSrcweir OSL_ENSURE(m_pParseTree->count() >= 4,"ParseTreeIterator: error in parse tree!"); 2040*cdf0e10cSrcweir OSQLParseNode * pTableExp = m_pParseTree->getChild(3); 2041*cdf0e10cSrcweir OSL_ENSURE(pTableExp != NULL,"OSQLParseTreeIterator: error in parse tree!"); 2042*cdf0e10cSrcweir OSL_ENSURE(SQL_ISRULE(pTableExp,table_exp),"OSQLParseTreeIterator: error in parse tree!"); 2043*cdf0e10cSrcweir OSL_ENSURE(pTableExp->count() == TABLE_EXPRESSION_CHILD_COUNT,"OSQLParseTreeIterator: error in parse tree!"); 2044*cdf0e10cSrcweir 2045*cdf0e10cSrcweir pHavingClause = pTableExp->getChild(3); 2046*cdf0e10cSrcweir // Wenn es aber eine order_by ist, dann darf sie nicht leer sein: 2047*cdf0e10cSrcweir if(pHavingClause->count() < 1) 2048*cdf0e10cSrcweir pHavingClause = NULL; 2049*cdf0e10cSrcweir return pHavingClause; 2050*cdf0e10cSrcweir } 2051*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2052*cdf0e10cSrcweir sal_Bool OSQLParseTreeIterator::isTableNode(const OSQLParseNode* _pTableNode) const 2053*cdf0e10cSrcweir { 2054*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::isTableNode" ); 2055*cdf0e10cSrcweir return _pTableNode && (SQL_ISRULE(_pTableNode,catalog_name) || 2056*cdf0e10cSrcweir SQL_ISRULE(_pTableNode,schema_name) || 2057*cdf0e10cSrcweir SQL_ISRULE(_pTableNode,table_name)); 2058*cdf0e10cSrcweir } 2059*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2060*cdf0e10cSrcweir const OSQLParseNode* OSQLParseTreeIterator::getSimpleWhereTree() const 2061*cdf0e10cSrcweir { 2062*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::getSimpleWhereTree" ); 2063*cdf0e10cSrcweir const OSQLParseNode* pNode = getWhereTree(); 2064*cdf0e10cSrcweir return pNode ? pNode->getChild(1) : NULL; 2065*cdf0e10cSrcweir } 2066*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2067*cdf0e10cSrcweir const OSQLParseNode* OSQLParseTreeIterator::getSimpleOrderTree() const 2068*cdf0e10cSrcweir { 2069*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::getSimpleOrderTree" ); 2070*cdf0e10cSrcweir const OSQLParseNode* pNode = getOrderTree(); 2071*cdf0e10cSrcweir return pNode ? pNode->getChild(2) : NULL; 2072*cdf0e10cSrcweir } 2073*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2074*cdf0e10cSrcweir const OSQLParseNode* OSQLParseTreeIterator::getSimpleGroupByTree() const 2075*cdf0e10cSrcweir { 2076*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::getSimpleGroupByTree" ); 2077*cdf0e10cSrcweir const OSQLParseNode* pNode = getGroupByTree(); 2078*cdf0e10cSrcweir return pNode ? pNode->getChild(2) : NULL; 2079*cdf0e10cSrcweir } 2080*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2081*cdf0e10cSrcweir const OSQLParseNode* OSQLParseTreeIterator::getSimpleHavingTree() const 2082*cdf0e10cSrcweir { 2083*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::getSimpleHavingTree" ); 2084*cdf0e10cSrcweir const OSQLParseNode* pNode = getHavingTree(); 2085*cdf0e10cSrcweir return pNode ? pNode->getChild(1) : NULL; 2086*cdf0e10cSrcweir } 2087*cdf0e10cSrcweir 2088*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2089*cdf0e10cSrcweir Reference< XPropertySet > OSQLParseTreeIterator::findColumn( const ::rtl::OUString & rColumnName, const ::rtl::OUString & rTableRange, bool _bLookInSubTables ) 2090*cdf0e10cSrcweir { 2091*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::findColumn" ); 2092*cdf0e10cSrcweir Reference< XPropertySet > xColumn = findColumn( *m_pImpl->m_pTables, rColumnName, rTableRange ); 2093*cdf0e10cSrcweir if ( !xColumn.is() && _bLookInSubTables ) 2094*cdf0e10cSrcweir xColumn = findColumn( *m_pImpl->m_pSubTables, rColumnName, rTableRange ); 2095*cdf0e10cSrcweir return xColumn; 2096*cdf0e10cSrcweir } 2097*cdf0e10cSrcweir 2098*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2099*cdf0e10cSrcweir Reference< XPropertySet > OSQLParseTreeIterator::findColumn(const OSQLTables& _rTables,const ::rtl::OUString & rColumnName, const ::rtl::OUString & rTableRange) 2100*cdf0e10cSrcweir { 2101*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::findColumn" ); 2102*cdf0e10cSrcweir Reference< XPropertySet > xColumn; 2103*cdf0e10cSrcweir if ( rTableRange.getLength() ) 2104*cdf0e10cSrcweir { 2105*cdf0e10cSrcweir ConstOSQLTablesIterator aFind = _rTables.find(rTableRange); 2106*cdf0e10cSrcweir 2107*cdf0e10cSrcweir if ( aFind != _rTables.end() 2108*cdf0e10cSrcweir && aFind->second.is() 2109*cdf0e10cSrcweir && aFind->second->getColumns().is() 2110*cdf0e10cSrcweir && aFind->second->getColumns()->hasByName(rColumnName) ) 2111*cdf0e10cSrcweir aFind->second->getColumns()->getByName(rColumnName) >>= xColumn; 2112*cdf0e10cSrcweir } 2113*cdf0e10cSrcweir if ( !xColumn.is() ) 2114*cdf0e10cSrcweir { 2115*cdf0e10cSrcweir OSQLTables::const_iterator aEnd = _rTables.end(); 2116*cdf0e10cSrcweir for(OSQLTables::const_iterator aIter = _rTables.begin(); aIter != aEnd; ++aIter) 2117*cdf0e10cSrcweir { 2118*cdf0e10cSrcweir if ( aIter->second.is() ) 2119*cdf0e10cSrcweir { 2120*cdf0e10cSrcweir Reference<XNameAccess> xColumns = aIter->second->getColumns(); 2121*cdf0e10cSrcweir if( xColumns.is() && xColumns->hasByName(rColumnName) && (xColumns->getByName(rColumnName) >>= xColumn) ) 2122*cdf0e10cSrcweir { 2123*cdf0e10cSrcweir OSL_ENSURE(xColumn.is(),"Column isn't a propertyset!"); 2124*cdf0e10cSrcweir break; // diese Column darf nur einmal vorkommen 2125*cdf0e10cSrcweir } 2126*cdf0e10cSrcweir } 2127*cdf0e10cSrcweir } 2128*cdf0e10cSrcweir } 2129*cdf0e10cSrcweir return xColumn; 2130*cdf0e10cSrcweir } 2131*cdf0e10cSrcweir 2132*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2133*cdf0e10cSrcweir void OSQLParseTreeIterator::impl_appendError( IParseContext::ErrorCode _eError, const ::rtl::OUString* _pReplaceToken1, const ::rtl::OUString* _pReplaceToken2 ) 2134*cdf0e10cSrcweir { 2135*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::impl_appendError" ); 2136*cdf0e10cSrcweir ::rtl::OUString sErrorMessage = m_rParser.getContext().getErrorMessage( _eError ); 2137*cdf0e10cSrcweir if ( _pReplaceToken1 ) 2138*cdf0e10cSrcweir { 2139*cdf0e10cSrcweir bool bTwoTokens = ( _pReplaceToken2 != NULL ); 2140*cdf0e10cSrcweir const sal_Char* pPlaceHolder1 = bTwoTokens ? "#1" : "#"; 2141*cdf0e10cSrcweir const ::rtl::OUString sPlaceHolder1 = ::rtl::OUString::createFromAscii( pPlaceHolder1 ); 2142*cdf0e10cSrcweir 2143*cdf0e10cSrcweir sErrorMessage = sErrorMessage.replaceAt( sErrorMessage.indexOf( sPlaceHolder1 ), sPlaceHolder1.getLength(), *_pReplaceToken1 ); 2144*cdf0e10cSrcweir if ( _pReplaceToken2 ) 2145*cdf0e10cSrcweir sErrorMessage = sErrorMessage.replaceAt( sErrorMessage.indexOf( ::rtl::OUString::createFromAscii( "#2" ) ), 2, *_pReplaceToken2 ); 2146*cdf0e10cSrcweir } 2147*cdf0e10cSrcweir 2148*cdf0e10cSrcweir impl_appendError( SQLException( 2149*cdf0e10cSrcweir sErrorMessage, NULL, getStandardSQLState( SQL_GENERAL_ERROR ), 1000, Any() ) ); 2150*cdf0e10cSrcweir } 2151*cdf0e10cSrcweir 2152*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2153*cdf0e10cSrcweir void OSQLParseTreeIterator::impl_appendError( const SQLException& _rError ) 2154*cdf0e10cSrcweir { 2155*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::impl_appendError" ); 2156*cdf0e10cSrcweir if ( m_aErrors.Message.getLength() ) 2157*cdf0e10cSrcweir { 2158*cdf0e10cSrcweir SQLException* pErrorChain = &m_aErrors; 2159*cdf0e10cSrcweir while ( pErrorChain->NextException.hasValue() ) 2160*cdf0e10cSrcweir pErrorChain = static_cast< SQLException* >( pErrorChain->NextException.pData ); 2161*cdf0e10cSrcweir pErrorChain->NextException <<= _rError; 2162*cdf0e10cSrcweir } 2163*cdf0e10cSrcweir else 2164*cdf0e10cSrcweir m_aErrors = _rError; 2165*cdf0e10cSrcweir } 2166*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2167*cdf0e10cSrcweir sal_Int32 OSQLParseTreeIterator::getFunctionReturnType(const OSQLParseNode* _pNode ) 2168*cdf0e10cSrcweir { 2169*cdf0e10cSrcweir sal_Int32 nType = DataType::OTHER; 2170*cdf0e10cSrcweir ::rtl::OUString sFunctionName; 2171*cdf0e10cSrcweir if ( SQL_ISRULE(_pNode,length_exp) ) 2172*cdf0e10cSrcweir { 2173*cdf0e10cSrcweir _pNode->getChild(0)->getChild(0)->parseNodeToStr(sFunctionName, m_pImpl->m_xConnection, NULL, sal_False, sal_False ); 2174*cdf0e10cSrcweir nType = ::connectivity::OSQLParser::getFunctionReturnType( sFunctionName, &m_rParser.getContext() ); 2175*cdf0e10cSrcweir } 2176*cdf0e10cSrcweir else if ( SQL_ISRULE(_pNode,num_value_exp) || SQL_ISRULE(_pNode,term) || SQL_ISRULE(_pNode,factor) ) 2177*cdf0e10cSrcweir { 2178*cdf0e10cSrcweir nType = DataType::DOUBLE; 2179*cdf0e10cSrcweir } 2180*cdf0e10cSrcweir else 2181*cdf0e10cSrcweir { 2182*cdf0e10cSrcweir _pNode->getChild(0)->parseNodeToStr(sFunctionName, m_pImpl->m_xConnection, NULL, sal_False, sal_False ); 2183*cdf0e10cSrcweir 2184*cdf0e10cSrcweir // MIN and MAX have another return type, we have to check the expression itself. 2185*cdf0e10cSrcweir // @see http://qa.openoffice.org/issues/show_bug.cgi?id=99566 2186*cdf0e10cSrcweir if ( SQL_ISRULE(_pNode,general_set_fct) && (SQL_ISTOKEN(_pNode->getChild(0),MIN) || SQL_ISTOKEN(_pNode->getChild(0),MAX) )) 2187*cdf0e10cSrcweir { 2188*cdf0e10cSrcweir const OSQLParseNode* pValueExp = _pNode->getChild(3); 2189*cdf0e10cSrcweir if (SQL_ISRULE(pValueExp,column_ref)) 2190*cdf0e10cSrcweir { 2191*cdf0e10cSrcweir ::rtl::OUString sColumnName; 2192*cdf0e10cSrcweir ::rtl::OUString aTableRange; 2193*cdf0e10cSrcweir getColumnRange(pValueExp,sColumnName,aTableRange); 2194*cdf0e10cSrcweir OSL_ENSURE(sColumnName.getLength(),"Columnname darf nicht leer sein"); 2195*cdf0e10cSrcweir Reference<XPropertySet> xColumn = findColumn( sColumnName, aTableRange, true ); 2196*cdf0e10cSrcweir 2197*cdf0e10cSrcweir if ( xColumn.is() ) 2198*cdf0e10cSrcweir { 2199*cdf0e10cSrcweir xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex( PROPERTY_ID_TYPE)) >>= nType; 2200*cdf0e10cSrcweir } 2201*cdf0e10cSrcweir } 2202*cdf0e10cSrcweir else 2203*cdf0e10cSrcweir { 2204*cdf0e10cSrcweir if ( SQL_ISRULE(pValueExp,num_value_exp) || SQL_ISRULE(pValueExp,term) || SQL_ISRULE(pValueExp,factor) ) 2205*cdf0e10cSrcweir { 2206*cdf0e10cSrcweir nType = DataType::DOUBLE; 2207*cdf0e10cSrcweir } 2208*cdf0e10cSrcweir else if ( SQL_ISRULE(pValueExp,datetime_primary) ) 2209*cdf0e10cSrcweir { 2210*cdf0e10cSrcweir switch(pValueExp->getChild(0)->getTokenID() ) 2211*cdf0e10cSrcweir { 2212*cdf0e10cSrcweir case SQL_TOKEN_CURRENT_DATE: 2213*cdf0e10cSrcweir nType = DataType::DATE; 2214*cdf0e10cSrcweir break; 2215*cdf0e10cSrcweir case SQL_TOKEN_CURRENT_TIME: 2216*cdf0e10cSrcweir nType = DataType::TIME; 2217*cdf0e10cSrcweir break; 2218*cdf0e10cSrcweir case SQL_TOKEN_CURRENT_TIMESTAMP: 2219*cdf0e10cSrcweir nType = DataType::TIMESTAMP; 2220*cdf0e10cSrcweir break; 2221*cdf0e10cSrcweir } 2222*cdf0e10cSrcweir } 2223*cdf0e10cSrcweir else if ( SQL_ISRULE(pValueExp,value_exp_primary) ) 2224*cdf0e10cSrcweir { 2225*cdf0e10cSrcweir nType = getFunctionReturnType(pValueExp->getChild(1)); 2226*cdf0e10cSrcweir } 2227*cdf0e10cSrcweir else if ( SQL_ISRULE(pValueExp,concatenation) 2228*cdf0e10cSrcweir || SQL_ISRULE(pValueExp,char_factor) 2229*cdf0e10cSrcweir || SQL_ISRULE(pValueExp,bit_value_fct) 2230*cdf0e10cSrcweir || SQL_ISRULE(pValueExp,char_value_fct) 2231*cdf0e10cSrcweir || SQL_ISRULE(pValueExp,char_substring_fct) 2232*cdf0e10cSrcweir || SQL_ISRULE(pValueExp,fold) 2233*cdf0e10cSrcweir || SQL_ISTOKEN(pValueExp,STRING) ) 2234*cdf0e10cSrcweir { 2235*cdf0e10cSrcweir nType = DataType::VARCHAR; 2236*cdf0e10cSrcweir } 2237*cdf0e10cSrcweir } 2238*cdf0e10cSrcweir if ( nType == DataType::OTHER ) 2239*cdf0e10cSrcweir nType = DataType::DOUBLE; 2240*cdf0e10cSrcweir } 2241*cdf0e10cSrcweir else 2242*cdf0e10cSrcweir nType = ::connectivity::OSQLParser::getFunctionReturnType( sFunctionName, &m_rParser.getContext() ); 2243*cdf0e10cSrcweir } 2244*cdf0e10cSrcweir 2245*cdf0e10cSrcweir return nType; 2246*cdf0e10cSrcweir } 2247*cdf0e10cSrcweir 2248