xref: /AOO41X/main/connectivity/source/parse/sqliterator.cxx (revision 9b5730f6ddef7eb82608ca4d31dc0d7678e652cf)
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 
OSQLParseTreeIteratorImplconnectivity::OSQLParseTreeIteratorImpl84cdf0e10cSrcweir         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:
isQueryAllowedconnectivity::OSQLParseTreeIteratorImpl110cdf0e10cSrcweir         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:
ForbidQueryName(OSQLParseTreeIteratorImpl & _rIteratorImpl,const::rtl::OUString _rForbiddenQueryName)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 
~ForbidQueryName()138cdf0e10cSrcweir         ~ForbidQueryName()
139cdf0e10cSrcweir         {
140cdf0e10cSrcweir             m_rpAllForbiddenNames->erase( m_sForbiddenQueryName );
141cdf0e10cSrcweir         }
142cdf0e10cSrcweir     };
143cdf0e10cSrcweir }
144cdf0e10cSrcweir //-----------------------------------------------------------------------------
OSQLParseTreeIterator(const Reference<XConnection> & _rxConnection,const Reference<XNameAccess> & _rxTables,const OSQLParser & _rParser,const OSQLParseNode * pRoot)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 //-----------------------------------------------------------------------------
OSQLParseTreeIterator(const OSQLParseTreeIterator & _rParentIterator,const OSQLParser & _rParser,const OSQLParseNode * pRoot)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 //-----------------------------------------------------------------------------
~OSQLParseTreeIterator()167cdf0e10cSrcweir OSQLParseTreeIterator::~OSQLParseTreeIterator()
168cdf0e10cSrcweir {
169cdf0e10cSrcweir 	dispose();
170cdf0e10cSrcweir }
171cdf0e10cSrcweir 
172cdf0e10cSrcweir // -----------------------------------------------------------------------------
getTables() const173cdf0e10cSrcweir 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 // -----------------------------------------------------------------------------
isCaseSensitive() const180cdf0e10cSrcweir 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 // -----------------------------------------------------------------------------
dispose()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 //-----------------------------------------------------------------------------
setParseTree(const OSQLParseNode * pNewParseTree)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     //.........................................................................
impl_getRowString(const Reference<XRow> & _rxRow,const sal_Int32 _nColumnIndex,::rtl::OUString & _out_rString)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     //.........................................................................
lcl_findTableInMetaData(const Reference<XDatabaseMetaData> & _rxDBMeta,const::rtl::OUString & _rCatalog,const::rtl::OUString & _rSchema,const::rtl::OUString & _rTableName)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 //-----------------------------------------------------------------------------
impl_getQueryParameterColumns(const OSQLTable & _rQuery)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 //-----------------------------------------------------------------------------
impl_locateRecordSource(const::rtl::OUString & _rComposedName)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 //-----------------------------------------------------------------------------
traverseOneTableName(OSQLTables & _rTables,const OSQLParseNode * pTableName,const::rtl::OUString & rTableRange)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 //-----------------------------------------------------------------------------
impl_fillJoinConditions(const OSQLParseNode * i_pJoinCondition)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 //-----------------------------------------------------------------------------
getJoinConditions() const512cdf0e10cSrcweir ::std::vector< TNodePair >& OSQLParseTreeIterator::getJoinConditions() const
513cdf0e10cSrcweir {
514cdf0e10cSrcweir     return m_pImpl->m_aJoinConditions;
515cdf0e10cSrcweir }
516cdf0e10cSrcweir //-----------------------------------------------------------------------------
getQualified_join(OSQLTables & _rTables,const OSQLParseNode * pTableRef,::rtl::OUString & aTableRange)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 //-----------------------------------------------------------------------------
getTableNode(OSQLTables & _rTables,const OSQLParseNode * pTableRef,::rtl::OUString & rTableRange)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 //-----------------------------------------------------------------------------
getSelect_statement(OSQLTables & _rTables,const OSQLParseNode * pSelect)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 //-----------------------------------------------------------------------------
traverseTableNames(OSQLTables & _rTables)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 //-----------------------------------------------------------------------------
getColumnAlias(const OSQLParseNode * _pDerivedColumn)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 {
lcl_getColumnRange(const OSQLParseNode * _pColumnRef,const Reference<XConnection> & _rxConnection,::rtl::OUString & _out_rColumnName,::rtl::OUString & _out_rTableRange,const OSQLColumns * _pSelectColumns,::rtl::OUString & _out_rColumnAliasIfPresent)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 // -----------------------------------------------------------------------------
getColumnRange(const OSQLParseNode * _pColumnRef,::rtl::OUString & _rColumnName,::rtl::OUString & _rTableRange) const775cdf0e10cSrcweir 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 // -----------------------------------------------------------------------------
getColumnRange(const OSQLParseNode * _pColumnRef,::rtl::OUString & _rColumnName,::rtl::OUString & _rTableRange,::rtl::OUString & _out_rColumnAliasIfPresent) const785cdf0e10cSrcweir 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 //-----------------------------------------------------------------------------
getColumnRange(const OSQLParseNode * _pColumnRef,const Reference<XConnection> & _rxConnection,::rtl::OUString & _out_rColumnName,::rtl::OUString & _out_rTableRange)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 //-----------------------------------------------------------------------------
getColumnTableRange(const OSQLParseNode * pNode,::rtl::OUString & rTableRange) const804cdf0e10cSrcweir 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 //-----------------------------------------------------------------------------
traverseCreateColumns(const OSQLParseNode * pSelectNode)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 //-----------------------------------------------------------------------------
traverseSelectColumnNames(const OSQLParseNode * pSelectNode)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 //-----------------------------------------------------------------------------
traverseOrderByColumnNames(const OSQLParseNode * pSelectNode)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 //-----------------------------------------------------------------------------
traverseByColumnNames(const OSQLParseNode * pSelectNode,sal_Bool _bOrder)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 //-----------------------------------------------------------------------------
traverseGroupByColumnNames(const OSQLParseNode * pSelectNode)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 {
lcl_generateParameterName(const OSQLParseNode & _rParentNode,const OSQLParseNode & _rParamNode)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 // -----------------------------------------------------------------------------
traverseParameters(const OSQLParseNode * _pNode)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 //-----------------------------------------------------------------------------
traverseSelectionCriteria(const OSQLParseNode * pSelectNode)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 //-----------------------------------------------------------------------------
traverseORCriteria(OSQLParseNode * pSearchCondition)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 //-----------------------------------------------------------------------------
traverseANDCriteria(OSQLParseNode * pSearchCondition)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 //-----------------------------------------------------------------------------
traverseParameter(const OSQLParseNode * _pParseNode,const OSQLParseNode * _pParentNode,const::rtl::OUString & _aColumnName,const::rtl::OUString & _aTableRange,const::rtl::OUString & _rColumnAlias)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 //-----------------------------------------------------------------------------
traverseOnePredicate(OSQLParseNode * pColumnRef,::rtl::OUString & rValue,OSQLParseNode * pParseNode)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 //-----------------------------------------------------------------------------
traverseSome(sal_uInt32 _nIncludeMask)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 //-----------------------------------------------------------------------------
traverseAll()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 //-----------------------------------------------------------------------------
impl_traverse(sal_uInt32 _nIncludeMask)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 //-----------------------------------------------------------------------------
impl_createTableObject(const::rtl::OUString & rTableName,const::rtl::OUString & rCatalogName,const::rtl::OUString & rSchemaName)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 //-----------------------------------------------------------------------------
appendColumns(::vos::ORef<OSQLColumns> & _rColumns,const::rtl::OUString & _rTableAlias,const OSQLTable & _rTable)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 //-----------------------------------------------------------------------------
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)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 //-----------------------------------------------------------------------------
getUniqueColumnName(const::rtl::OUString & rColumnName) const1879cdf0e10cSrcweir ::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 //-----------------------------------------------------------------------------
setOrderByColumnName(const::rtl::OUString & rColumnName,const::rtl::OUString & rTableRange,sal_Bool bAscending)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 //-----------------------------------------------------------------------------
setGroupByColumnName(const::rtl::OUString & rColumnName,const::rtl::OUString & rTableRange)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 //-----------------------------------------------------------------------------
getWhereTree() const1949cdf0e10cSrcweir 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 //-----------------------------------------------------------------------------
getOrderTree() const1981cdf0e10cSrcweir 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 //-----------------------------------------------------------------------------
getGroupByTree() const2005cdf0e10cSrcweir 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 //-----------------------------------------------------------------------------
getHavingTree() const2027cdf0e10cSrcweir 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 // -----------------------------------------------------------------------------
isTableNode(const OSQLParseNode * _pTableNode) const2048cdf0e10cSrcweir 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 // -----------------------------------------------------------------------------
getSimpleWhereTree() const2056cdf0e10cSrcweir 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 // -----------------------------------------------------------------------------
getSimpleOrderTree() const2063cdf0e10cSrcweir 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 // -----------------------------------------------------------------------------
getSimpleGroupByTree() const2070cdf0e10cSrcweir 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 // -----------------------------------------------------------------------------
getSimpleHavingTree() const2077cdf0e10cSrcweir 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 // -----------------------------------------------------------------------------
findColumn(const::rtl::OUString & rColumnName,const::rtl::OUString & rTableRange,bool _bLookInSubTables)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 // -----------------------------------------------------------------------------
findColumn(const OSQLTables & _rTables,const::rtl::OUString & rColumnName,const::rtl::OUString & rTableRange)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 // -----------------------------------------------------------------------------
impl_appendError(IParseContext::ErrorCode _eError,const::rtl::OUString * _pReplaceToken1,const::rtl::OUString * _pReplaceToken2)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 // -----------------------------------------------------------------------------
impl_appendError(const SQLException & _rError)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 // -----------------------------------------------------------------------------
getFunctionReturnType(const OSQLParseNode * _pNode)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