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