1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_connectivity.hxx"
26*b1cdbd2cSJim Jagielski #include "file/fcomp.hxx"
27*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
28*b1cdbd2cSJim Jagielski #include "TConnection.hxx"
29*b1cdbd2cSJim Jagielski #include "connectivity/sqlparse.hxx"
30*b1cdbd2cSJim Jagielski #include "file/fanalyzer.hxx"
31*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbc/XColumnLocate.hpp>
32*b1cdbd2cSJim Jagielski #include <com/sun/star/util/DateTime.hpp>
33*b1cdbd2cSJim Jagielski #include <com/sun/star/util/Date.hpp>
34*b1cdbd2cSJim Jagielski #include <com/sun/star/util/Time.hpp>
35*b1cdbd2cSJim Jagielski #include "connectivity/dbexception.hxx"
36*b1cdbd2cSJim Jagielski #include "connectivity/dbconversion.hxx"
37*b1cdbd2cSJim Jagielski #include <com/sun/star/sdb/SQLFilterOperator.hpp>
38*b1cdbd2cSJim Jagielski #include "resource/file_res.hrc"
39*b1cdbd2cSJim Jagielski #include "file/FStringFunctions.hxx"
40*b1cdbd2cSJim Jagielski #include "file/FDateFunctions.hxx"
41*b1cdbd2cSJim Jagielski #include "file/FNumericFunctions.hxx"
42*b1cdbd2cSJim Jagielski #include "file/FConnection.hxx"
43*b1cdbd2cSJim Jagielski #include <com/sun/star/sdb/SQLFilterOperator.hpp>
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski using namespace connectivity;
46*b1cdbd2cSJim Jagielski using namespace connectivity::file;
47*b1cdbd2cSJim Jagielski using namespace com::sun::star::uno;
48*b1cdbd2cSJim Jagielski using namespace com::sun::star::sdbc;
49*b1cdbd2cSJim Jagielski using namespace com::sun::star::sdb;
50*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::container;
51*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::util;
52*b1cdbd2cSJim Jagielski 
DBG_NAME(OPredicateCompiler)53*b1cdbd2cSJim Jagielski DBG_NAME(OPredicateCompiler)
54*b1cdbd2cSJim Jagielski //------------------------------------------------------------------
55*b1cdbd2cSJim Jagielski OPredicateCompiler::OPredicateCompiler(OSQLAnalyzer* pAnalyzer)//,OCursor& rCurs)
56*b1cdbd2cSJim Jagielski 					 //	: m_rCursor(rCurs)
57*b1cdbd2cSJim Jagielski 					 : m_pAnalyzer(pAnalyzer)
58*b1cdbd2cSJim Jagielski 					 , m_nParamCounter(0)
59*b1cdbd2cSJim Jagielski                      , m_bORCondition(sal_False)
60*b1cdbd2cSJim Jagielski {
61*b1cdbd2cSJim Jagielski 	DBG_CTOR(OPredicateCompiler,NULL);
62*b1cdbd2cSJim Jagielski }
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski //------------------------------------------------------------------
~OPredicateCompiler()65*b1cdbd2cSJim Jagielski OPredicateCompiler::~OPredicateCompiler()
66*b1cdbd2cSJim Jagielski {
67*b1cdbd2cSJim Jagielski 	Clean();
68*b1cdbd2cSJim Jagielski 	DBG_DTOR(OPredicateCompiler,NULL);
69*b1cdbd2cSJim Jagielski }
70*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
dispose()71*b1cdbd2cSJim Jagielski void OPredicateCompiler::dispose()
72*b1cdbd2cSJim Jagielski {
73*b1cdbd2cSJim Jagielski 	Clean();
74*b1cdbd2cSJim Jagielski 	m_orgColumns		= NULL;
75*b1cdbd2cSJim Jagielski m_xIndexes.clear();
76*b1cdbd2cSJim Jagielski }
77*b1cdbd2cSJim Jagielski //------------------------------------------------------------------
78*b1cdbd2cSJim Jagielski //	inline OCursor& OPredicateCompiler::Cursor() const {return m_rCursor;}
79*b1cdbd2cSJim Jagielski //------------------------------------------------------------------
start(OSQLParseNode * pSQLParseNode)80*b1cdbd2cSJim Jagielski void OPredicateCompiler::start(OSQLParseNode* pSQLParseNode)
81*b1cdbd2cSJim Jagielski {
82*b1cdbd2cSJim Jagielski 	if (!pSQLParseNode)
83*b1cdbd2cSJim Jagielski 		return;
84*b1cdbd2cSJim Jagielski 
85*b1cdbd2cSJim Jagielski 	m_nParamCounter = 0;
86*b1cdbd2cSJim Jagielski 	// Parse Tree analysieren (je nach Statement-Typ)
87*b1cdbd2cSJim Jagielski 	// und Zeiger auf WHERE-Klausel setzen:
88*b1cdbd2cSJim Jagielski 	OSQLParseNode * pWhereClause = NULL;
89*b1cdbd2cSJim Jagielski 	OSQLParseNode * pOrderbyClause = NULL;
90*b1cdbd2cSJim Jagielski 
91*b1cdbd2cSJim Jagielski 	if (SQL_ISRULE(pSQLParseNode,select_statement))
92*b1cdbd2cSJim Jagielski 	{
93*b1cdbd2cSJim Jagielski 		DBG_ASSERT(pSQLParseNode->count() >= 4,"OFILECursor: Fehler im Parse Tree");
94*b1cdbd2cSJim Jagielski 
95*b1cdbd2cSJim Jagielski 		OSQLParseNode * pTableExp = pSQLParseNode->getChild(3);
96*b1cdbd2cSJim Jagielski 		DBG_ASSERT(pTableExp != NULL,"Fehler im Parse Tree");
97*b1cdbd2cSJim Jagielski 		DBG_ASSERT(SQL_ISRULE(pTableExp,table_exp)," Fehler im Parse Tree");
98*b1cdbd2cSJim Jagielski 		DBG_ASSERT(pTableExp->count() == TABLE_EXPRESSION_CHILD_COUNT,"Fehler im Parse Tree");
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski 		// check that we don't use anything other than count(*) as function
101*b1cdbd2cSJim Jagielski 		OSQLParseNode* pSelection = pSQLParseNode->getChild(2);
102*b1cdbd2cSJim Jagielski 		if ( SQL_ISRULE(pSelection,scalar_exp_commalist) )
103*b1cdbd2cSJim Jagielski 		{
104*b1cdbd2cSJim Jagielski 			for (sal_uInt32 i = 0; i < pSelection->count(); i++)
105*b1cdbd2cSJim Jagielski 			{
106*b1cdbd2cSJim Jagielski 				OSQLParseNode *pColumnRef = pSelection->getChild(i)->getChild(0);
107*b1cdbd2cSJim Jagielski 				if ( SQL_ISRULE(pColumnRef,general_set_fct) && pColumnRef->count() != 4 )
108*b1cdbd2cSJim Jagielski 				{
109*b1cdbd2cSJim Jagielski                     m_pAnalyzer->getConnection()->throwGenericSQLException(STR_QUERY_COMPLEX_COUNT,NULL);
110*b1cdbd2cSJim Jagielski 				}
111*b1cdbd2cSJim Jagielski 			}
112*b1cdbd2cSJim Jagielski 		}
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski 
115*b1cdbd2cSJim Jagielski 		pWhereClause	= pTableExp->getChild(1);
116*b1cdbd2cSJim Jagielski 		pOrderbyClause	= pTableExp->getChild(ORDER_BY_CHILD_POS);
117*b1cdbd2cSJim Jagielski 	}
118*b1cdbd2cSJim Jagielski 	else if (SQL_ISRULE(pSQLParseNode,update_statement_searched))
119*b1cdbd2cSJim Jagielski 	{
120*b1cdbd2cSJim Jagielski 		DBG_ASSERT(pSQLParseNode->count() == 5,"OFILECursor: Fehler im Parse Tree");
121*b1cdbd2cSJim Jagielski 		pWhereClause = pSQLParseNode->getChild(4);
122*b1cdbd2cSJim Jagielski 	}
123*b1cdbd2cSJim Jagielski 	else if (SQL_ISRULE(pSQLParseNode,delete_statement_searched))
124*b1cdbd2cSJim Jagielski 	{
125*b1cdbd2cSJim Jagielski 		DBG_ASSERT(pSQLParseNode->count() == 4,"Fehler im Parse Tree");
126*b1cdbd2cSJim Jagielski 		pWhereClause = pSQLParseNode->getChild(3);
127*b1cdbd2cSJim Jagielski 	}
128*b1cdbd2cSJim Jagielski 	else
129*b1cdbd2cSJim Jagielski 			// Anderes Statement. Keine Selektionskriterien.
130*b1cdbd2cSJim Jagielski 		return;
131*b1cdbd2cSJim Jagielski 
132*b1cdbd2cSJim Jagielski 	if (SQL_ISRULE(pWhereClause,where_clause))
133*b1cdbd2cSJim Jagielski 	{
134*b1cdbd2cSJim Jagielski 		// Wenn es aber eine where_clause ist, dann darf sie nicht leer sein:
135*b1cdbd2cSJim Jagielski 		DBG_ASSERT(pWhereClause->count() == 2,"OFILECursor: Fehler im Parse Tree");
136*b1cdbd2cSJim Jagielski 
137*b1cdbd2cSJim Jagielski 		OSQLParseNode * pComparisonPredicate = pWhereClause->getChild(1);
138*b1cdbd2cSJim Jagielski 		DBG_ASSERT(pComparisonPredicate != NULL,"OFILECursor: Fehler im Parse Tree");
139*b1cdbd2cSJim Jagielski 
140*b1cdbd2cSJim Jagielski 		execute( pComparisonPredicate );
141*b1cdbd2cSJim Jagielski 	}
142*b1cdbd2cSJim Jagielski 	else
143*b1cdbd2cSJim Jagielski 	{
144*b1cdbd2cSJim Jagielski 		// Die Where Clause ist meistens optional, d. h. es koennte sich auch
145*b1cdbd2cSJim Jagielski 		// um "optional_where_clause" handeln.
146*b1cdbd2cSJim Jagielski 		DBG_ASSERT(SQL_ISRULE(pWhereClause,opt_where_clause),"OPredicateCompiler: Fehler im Parse Tree");
147*b1cdbd2cSJim Jagielski 	}
148*b1cdbd2cSJim Jagielski }
149*b1cdbd2cSJim Jagielski 
150*b1cdbd2cSJim Jagielski //------------------------------------------------------------------
execute(OSQLParseNode * pPredicateNode)151*b1cdbd2cSJim Jagielski OOperand* OPredicateCompiler::execute(OSQLParseNode* pPredicateNode)
152*b1cdbd2cSJim Jagielski {
153*b1cdbd2cSJim Jagielski 	OOperand* pOperand = NULL;
154*b1cdbd2cSJim Jagielski 	if (pPredicateNode->count() == 3 &&							// Ausdruck is geklammert
155*b1cdbd2cSJim Jagielski 		SQL_ISPUNCTUATION(pPredicateNode->getChild(0),"(") &&
156*b1cdbd2cSJim Jagielski 		SQL_ISPUNCTUATION(pPredicateNode->getChild(2),")"))
157*b1cdbd2cSJim Jagielski 	{
158*b1cdbd2cSJim Jagielski 		execute(pPredicateNode->getChild(1));
159*b1cdbd2cSJim Jagielski 	}
160*b1cdbd2cSJim Jagielski 	else if ((SQL_ISRULE(pPredicateNode,search_condition) || (SQL_ISRULE(pPredicateNode,boolean_term)))
161*b1cdbd2cSJim Jagielski 							&&			// AND/OR-Verknuepfung:
162*b1cdbd2cSJim Jagielski                             pPredicateNode->count() == 3)
163*b1cdbd2cSJim Jagielski 	{
164*b1cdbd2cSJim Jagielski 		execute(pPredicateNode->getChild(0));						    // Bearbeiten des linken Zweigs
165*b1cdbd2cSJim Jagielski 		execute(pPredicateNode->getChild(2));							// Bearbeiten des rechten Zweigs
166*b1cdbd2cSJim Jagielski 
167*b1cdbd2cSJim Jagielski 		if (SQL_ISTOKEN(pPredicateNode->getChild(1),OR))				// OR-Operator
168*b1cdbd2cSJim Jagielski 		{
169*b1cdbd2cSJim Jagielski 			m_aCodeList.push_back(new OOp_OR());
170*b1cdbd2cSJim Jagielski 			m_bORCondition = sal_True;
171*b1cdbd2cSJim Jagielski 		}
172*b1cdbd2cSJim Jagielski 		else if (SQL_ISTOKEN(pPredicateNode->getChild(1),AND))		// AND-Operator
173*b1cdbd2cSJim Jagielski 			m_aCodeList.push_back(new OOp_AND());
174*b1cdbd2cSJim Jagielski 		else
175*b1cdbd2cSJim Jagielski 		{
176*b1cdbd2cSJim Jagielski 			DBG_ERROR("OPredicateCompiler: Fehler im Parse Tree");
177*b1cdbd2cSJim Jagielski 		}
178*b1cdbd2cSJim Jagielski 	}
179*b1cdbd2cSJim Jagielski     else if (SQL_ISRULE(pPredicateNode,boolean_factor))
180*b1cdbd2cSJim Jagielski 	{
181*b1cdbd2cSJim Jagielski 		execute(pPredicateNode->getChild(1));
182*b1cdbd2cSJim Jagielski         m_aCodeList.push_back(new OOp_NOT());
183*b1cdbd2cSJim Jagielski 	}
184*b1cdbd2cSJim Jagielski 	else if (SQL_ISRULE(pPredicateNode,comparison_predicate))
185*b1cdbd2cSJim Jagielski 	{
186*b1cdbd2cSJim Jagielski 		execute_COMPARE(pPredicateNode);
187*b1cdbd2cSJim Jagielski 	}
188*b1cdbd2cSJim Jagielski 	else if (SQL_ISRULE(pPredicateNode,like_predicate))
189*b1cdbd2cSJim Jagielski 	{
190*b1cdbd2cSJim Jagielski 		execute_LIKE(pPredicateNode);
191*b1cdbd2cSJim Jagielski 	}
192*b1cdbd2cSJim Jagielski 	else if (SQL_ISRULE(pPredicateNode,between_predicate))
193*b1cdbd2cSJim Jagielski 	{
194*b1cdbd2cSJim Jagielski 		execute_BETWEEN(pPredicateNode);
195*b1cdbd2cSJim Jagielski 	}
196*b1cdbd2cSJim Jagielski 	else if (SQL_ISRULE(pPredicateNode,test_for_null))
197*b1cdbd2cSJim Jagielski 	{
198*b1cdbd2cSJim Jagielski 		execute_ISNULL(pPredicateNode);
199*b1cdbd2cSJim Jagielski 	}
200*b1cdbd2cSJim Jagielski 	else if(SQL_ISRULE(pPredicateNode,num_value_exp))
201*b1cdbd2cSJim Jagielski 	{
202*b1cdbd2cSJim Jagielski 		execute(pPredicateNode->getChild(0));						    // Bearbeiten des linken Zweigs
203*b1cdbd2cSJim Jagielski 		execute(pPredicateNode->getChild(2));							// Bearbeiten des rechten Zweigs
204*b1cdbd2cSJim Jagielski 		if (SQL_ISPUNCTUATION(pPredicateNode->getChild(1),"+"))
205*b1cdbd2cSJim Jagielski 		{
206*b1cdbd2cSJim Jagielski 			m_aCodeList.push_back(new OOp_ADD());
207*b1cdbd2cSJim Jagielski 		}
208*b1cdbd2cSJim Jagielski 		else if (SQL_ISPUNCTUATION(pPredicateNode->getChild(1),"-"))
209*b1cdbd2cSJim Jagielski 			m_aCodeList.push_back(new OOp_SUB());
210*b1cdbd2cSJim Jagielski 		else
211*b1cdbd2cSJim Jagielski 		{
212*b1cdbd2cSJim Jagielski 			DBG_ERROR("OPredicateCompiler: Fehler im Parse Tree num_value_exp");
213*b1cdbd2cSJim Jagielski 		}
214*b1cdbd2cSJim Jagielski 	}
215*b1cdbd2cSJim Jagielski 	else if(SQL_ISRULE(pPredicateNode,term))
216*b1cdbd2cSJim Jagielski 	{
217*b1cdbd2cSJim Jagielski 		execute(pPredicateNode->getChild(0));						    // Bearbeiten des linken Zweigs
218*b1cdbd2cSJim Jagielski 		execute(pPredicateNode->getChild(2));							// Bearbeiten des rechten Zweigs
219*b1cdbd2cSJim Jagielski 		if (SQL_ISPUNCTUATION(pPredicateNode->getChild(1),"*"))
220*b1cdbd2cSJim Jagielski 		{
221*b1cdbd2cSJim Jagielski 			m_aCodeList.push_back(new OOp_MUL());
222*b1cdbd2cSJim Jagielski 		}
223*b1cdbd2cSJim Jagielski 		else if (SQL_ISPUNCTUATION(pPredicateNode->getChild(1),"/"))
224*b1cdbd2cSJim Jagielski 			m_aCodeList.push_back(new OOp_DIV());
225*b1cdbd2cSJim Jagielski 		else
226*b1cdbd2cSJim Jagielski 		{
227*b1cdbd2cSJim Jagielski 			DBG_ERROR("OPredicateCompiler: Fehler im Parse Tree num_value_exp");
228*b1cdbd2cSJim Jagielski 		}
229*b1cdbd2cSJim Jagielski 	}
230*b1cdbd2cSJim Jagielski 	else
231*b1cdbd2cSJim Jagielski 		pOperand = execute_Operand(pPredicateNode);						// jetzt werden nur einfache Operanden verarbeitet
232*b1cdbd2cSJim Jagielski 
233*b1cdbd2cSJim Jagielski 	return pOperand;
234*b1cdbd2cSJim Jagielski }
235*b1cdbd2cSJim Jagielski 
236*b1cdbd2cSJim Jagielski //------------------------------------------------------------------
execute_COMPARE(OSQLParseNode * pPredicateNode)237*b1cdbd2cSJim Jagielski OOperand* OPredicateCompiler::execute_COMPARE(OSQLParseNode* pPredicateNode)  throw(SQLException, RuntimeException)
238*b1cdbd2cSJim Jagielski {
239*b1cdbd2cSJim Jagielski 	DBG_ASSERT(pPredicateNode->count() == 3,"OFILECursor: Fehler im Parse Tree");
240*b1cdbd2cSJim Jagielski 
241*b1cdbd2cSJim Jagielski 	if ( !(SQL_ISRULE(pPredicateNode->getChild(0),column_ref)				||
242*b1cdbd2cSJim Jagielski 		  pPredicateNode->getChild(2)->getNodeType() == SQL_NODE_STRING 	||
243*b1cdbd2cSJim Jagielski 		  pPredicateNode->getChild(2)->getNodeType() == SQL_NODE_INTNUM 	||
244*b1cdbd2cSJim Jagielski 		  pPredicateNode->getChild(2)->getNodeType() == SQL_NODE_APPROXNUM	||
245*b1cdbd2cSJim Jagielski 		  SQL_ISTOKEN(pPredicateNode->getChild(2),TRUE)						||
246*b1cdbd2cSJim Jagielski 		  SQL_ISTOKEN(pPredicateNode->getChild(2),FALSE)					||
247*b1cdbd2cSJim Jagielski 		  SQL_ISRULE(pPredicateNode->getChild(2),parameter)					||
248*b1cdbd2cSJim Jagielski 		  // odbc date
249*b1cdbd2cSJim Jagielski 		  SQL_ISRULE(pPredicateNode->getChild(2),set_fct_spec)				||
250*b1cdbd2cSJim Jagielski 		  SQL_ISRULE(pPredicateNode->getChild(2),position_exp)				||
251*b1cdbd2cSJim Jagielski 		  SQL_ISRULE(pPredicateNode->getChild(2),char_substring_fct)		||
252*b1cdbd2cSJim Jagielski 		  // upper, lower etc.
253*b1cdbd2cSJim Jagielski 		  SQL_ISRULE(pPredicateNode->getChild(2),fold)) )
254*b1cdbd2cSJim Jagielski 	{
255*b1cdbd2cSJim Jagielski         m_pAnalyzer->getConnection()->throwGenericSQLException(STR_QUERY_TOO_COMPLEX,NULL);
256*b1cdbd2cSJim Jagielski 		return NULL;
257*b1cdbd2cSJim Jagielski 	}
258*b1cdbd2cSJim Jagielski 
259*b1cdbd2cSJim Jagielski     sal_Int32 ePredicateType( SQLFilterOperator::EQUAL );
260*b1cdbd2cSJim Jagielski 	OSQLParseNode *pPrec = pPredicateNode->getChild(1);
261*b1cdbd2cSJim Jagielski 
262*b1cdbd2cSJim Jagielski 	if (pPrec->getNodeType() == SQL_NODE_EQUAL)
263*b1cdbd2cSJim Jagielski 		ePredicateType = SQLFilterOperator::EQUAL;
264*b1cdbd2cSJim Jagielski 	else if (pPrec->getNodeType() == SQL_NODE_NOTEQUAL)
265*b1cdbd2cSJim Jagielski 		ePredicateType = SQLFilterOperator::NOT_EQUAL;
266*b1cdbd2cSJim Jagielski 	else if (pPrec->getNodeType() == SQL_NODE_LESS)
267*b1cdbd2cSJim Jagielski 		ePredicateType = SQLFilterOperator::LESS;
268*b1cdbd2cSJim Jagielski 	else if (pPrec->getNodeType() == SQL_NODE_LESSEQ)
269*b1cdbd2cSJim Jagielski 		ePredicateType = SQLFilterOperator::LESS_EQUAL;
270*b1cdbd2cSJim Jagielski 	else if (pPrec->getNodeType() == SQL_NODE_GREATEQ)
271*b1cdbd2cSJim Jagielski 		ePredicateType = SQLFilterOperator::GREATER_EQUAL;
272*b1cdbd2cSJim Jagielski 	else if (pPrec->getNodeType() == SQL_NODE_GREAT)
273*b1cdbd2cSJim Jagielski 		ePredicateType = SQLFilterOperator::GREATER;
274*b1cdbd2cSJim Jagielski     else
275*b1cdbd2cSJim Jagielski         OSL_ENSURE( false, "OPredicateCompiler::execute_COMPARE: unexpected node type!" );
276*b1cdbd2cSJim Jagielski 
277*b1cdbd2cSJim Jagielski 	execute(pPredicateNode->getChild(0));
278*b1cdbd2cSJim Jagielski 	execute(pPredicateNode->getChild(2));
279*b1cdbd2cSJim Jagielski     m_aCodeList.push_back( new OOp_COMPARE(ePredicateType) );
280*b1cdbd2cSJim Jagielski 
281*b1cdbd2cSJim Jagielski 	return NULL;
282*b1cdbd2cSJim Jagielski }
283*b1cdbd2cSJim Jagielski 
284*b1cdbd2cSJim Jagielski //------------------------------------------------------------------
execute_LIKE(OSQLParseNode * pPredicateNode)285*b1cdbd2cSJim Jagielski OOperand* OPredicateCompiler::execute_LIKE(OSQLParseNode* pPredicateNode) throw(SQLException, RuntimeException)
286*b1cdbd2cSJim Jagielski {
287*b1cdbd2cSJim Jagielski 	DBG_ASSERT(pPredicateNode->count() == 2,"OFILECursor: Fehler im Parse Tree");
288*b1cdbd2cSJim Jagielski     const OSQLParseNode* pPart2 = pPredicateNode->getChild(1);
289*b1cdbd2cSJim Jagielski 
290*b1cdbd2cSJim Jagielski 	sal_Unicode cEscape = L'\0';
291*b1cdbd2cSJim Jagielski     const bool bNotLike = pPart2->getChild(0)->isToken();
292*b1cdbd2cSJim Jagielski 
293*b1cdbd2cSJim Jagielski 	OSQLParseNode* pAtom		= pPart2->getChild(pPart2->count()-2);
294*b1cdbd2cSJim Jagielski 	OSQLParseNode* pOptEscape	= pPart2->getChild(pPart2->count()-1);
295*b1cdbd2cSJim Jagielski 
296*b1cdbd2cSJim Jagielski 	if (!(pAtom->getNodeType() == SQL_NODE_STRING 	||
297*b1cdbd2cSJim Jagielski 		  SQL_ISRULE(pAtom,parameter)				||
298*b1cdbd2cSJim Jagielski 		  // odbc date
299*b1cdbd2cSJim Jagielski 		  SQL_ISRULE(pAtom,set_fct_spec)			||
300*b1cdbd2cSJim Jagielski 		  SQL_ISRULE(pAtom,position_exp)			||
301*b1cdbd2cSJim Jagielski 		  SQL_ISRULE(pAtom,char_substring_fct)		||
302*b1cdbd2cSJim Jagielski 		  // upper, lower etc.
303*b1cdbd2cSJim Jagielski 		  SQL_ISRULE(pAtom,fold)) )
304*b1cdbd2cSJim Jagielski 	{
305*b1cdbd2cSJim Jagielski         m_pAnalyzer->getConnection()->throwGenericSQLException(STR_QUERY_TOO_COMPLEX,NULL);
306*b1cdbd2cSJim Jagielski 		return NULL;
307*b1cdbd2cSJim Jagielski 	}
308*b1cdbd2cSJim Jagielski 
309*b1cdbd2cSJim Jagielski 	if (pOptEscape->count() != 0)
310*b1cdbd2cSJim Jagielski 	{
311*b1cdbd2cSJim Jagielski 		if (pOptEscape->count() != 2)
312*b1cdbd2cSJim Jagielski 		{
313*b1cdbd2cSJim Jagielski             m_pAnalyzer->getConnection()->throwGenericSQLException(STR_QUERY_INVALID_LIKE_STRING,NULL);
314*b1cdbd2cSJim Jagielski 		}
315*b1cdbd2cSJim Jagielski 		OSQLParseNode *pEscNode = pOptEscape->getChild(1);
316*b1cdbd2cSJim Jagielski 		if (pEscNode->getNodeType() != SQL_NODE_STRING)
317*b1cdbd2cSJim Jagielski 		{
318*b1cdbd2cSJim Jagielski 			m_pAnalyzer->getConnection()->throwGenericSQLException(STR_QUERY_INVALID_LIKE_STRING,NULL);
319*b1cdbd2cSJim Jagielski 		}
320*b1cdbd2cSJim Jagielski 		else
321*b1cdbd2cSJim Jagielski 			cEscape = pEscNode->getTokenValue().toChar();
322*b1cdbd2cSJim Jagielski 	}
323*b1cdbd2cSJim Jagielski 
324*b1cdbd2cSJim Jagielski 	execute(pPredicateNode->getChild(0));
325*b1cdbd2cSJim Jagielski 	execute(pAtom);
326*b1cdbd2cSJim Jagielski 
327*b1cdbd2cSJim Jagielski 	OBoolOperator* pOperator = bNotLike
328*b1cdbd2cSJim Jagielski 									? new OOp_NOTLIKE(cEscape)
329*b1cdbd2cSJim Jagielski 									: new OOp_LIKE(cEscape);
330*b1cdbd2cSJim Jagielski 	m_aCodeList.push_back(pOperator);
331*b1cdbd2cSJim Jagielski 
332*b1cdbd2cSJim Jagielski 	return NULL;
333*b1cdbd2cSJim Jagielski }
334*b1cdbd2cSJim Jagielski //------------------------------------------------------------------
execute_BETWEEN(OSQLParseNode * pPredicateNode)335*b1cdbd2cSJim Jagielski OOperand* OPredicateCompiler::execute_BETWEEN(OSQLParseNode* pPredicateNode) throw(SQLException, RuntimeException)
336*b1cdbd2cSJim Jagielski {
337*b1cdbd2cSJim Jagielski 	DBG_ASSERT(pPredicateNode->count() == 2,"OFILECursor: Fehler im Parse Tree");
338*b1cdbd2cSJim Jagielski 
339*b1cdbd2cSJim Jagielski 	OSQLParseNode* pColumn = pPredicateNode->getChild(0);
340*b1cdbd2cSJim Jagielski     const OSQLParseNode* pPart2 = pPredicateNode->getChild(1);
341*b1cdbd2cSJim Jagielski 	OSQLParseNode* p1stValue = pPart2->getChild(2);
342*b1cdbd2cSJim Jagielski 	OSQLParseNode* p2ndtValue = pPart2->getChild(4);
343*b1cdbd2cSJim Jagielski 
344*b1cdbd2cSJim Jagielski 	if (
345*b1cdbd2cSJim Jagielski 			!(p1stValue->getNodeType() == SQL_NODE_STRING || SQL_ISRULE(p1stValue,parameter))
346*b1cdbd2cSJim Jagielski 		&&	!(p2ndtValue->getNodeType() == SQL_NODE_STRING || SQL_ISRULE(p2ndtValue,parameter))
347*b1cdbd2cSJim Jagielski 		)
348*b1cdbd2cSJim Jagielski 	{
349*b1cdbd2cSJim Jagielski         m_pAnalyzer->getConnection()->throwGenericSQLException(STR_QUERY_INVALID_BETWEEN,NULL);
350*b1cdbd2cSJim Jagielski 	}
351*b1cdbd2cSJim Jagielski 
352*b1cdbd2cSJim Jagielski 	sal_Bool bNot = SQL_ISTOKEN(pPart2->getChild(0),NOT);
353*b1cdbd2cSJim Jagielski 
354*b1cdbd2cSJim Jagielski 	OOperand* pColumnOp = execute(pColumn);
355*b1cdbd2cSJim Jagielski 	OOperand* pOb1 = execute(p1stValue);
356*b1cdbd2cSJim Jagielski 	OBoolOperator* pOperator = new OOp_COMPARE(bNot ? SQLFilterOperator::LESS_EQUAL : SQLFilterOperator::GREATER);
357*b1cdbd2cSJim Jagielski 	m_aCodeList.push_back(pOperator);
358*b1cdbd2cSJim Jagielski 
359*b1cdbd2cSJim Jagielski 	execute(pColumn);
360*b1cdbd2cSJim Jagielski 	OOperand* pOb2 = execute(p2ndtValue);
361*b1cdbd2cSJim Jagielski 	pOperator = new OOp_COMPARE(bNot ? SQLFilterOperator::GREATER_EQUAL : SQLFilterOperator::LESS);
362*b1cdbd2cSJim Jagielski 	m_aCodeList.push_back(pOperator);
363*b1cdbd2cSJim Jagielski 
364*b1cdbd2cSJim Jagielski 	if ( pColumnOp && pOb1 && pOb2 )
365*b1cdbd2cSJim Jagielski 	{
366*b1cdbd2cSJim Jagielski 		switch(pColumnOp->getDBType())
367*b1cdbd2cSJim Jagielski 		{
368*b1cdbd2cSJim Jagielski 			case DataType::CHAR:
369*b1cdbd2cSJim Jagielski 			case DataType::VARCHAR:
370*b1cdbd2cSJim Jagielski 			case DataType::LONGVARCHAR:
371*b1cdbd2cSJim Jagielski 				pOb1->setValue(pOb1->getValue().getString());
372*b1cdbd2cSJim Jagielski 				pOb2->setValue(pOb2->getValue().getString());
373*b1cdbd2cSJim Jagielski 				break;
374*b1cdbd2cSJim Jagielski 			case DataType::DECIMAL:
375*b1cdbd2cSJim Jagielski 			case DataType::NUMERIC:
376*b1cdbd2cSJim Jagielski 				pOb1->setValue((double)pOb1->getValue());
377*b1cdbd2cSJim Jagielski 				pOb2->setValue((double)pOb2->getValue());
378*b1cdbd2cSJim Jagielski 				break;
379*b1cdbd2cSJim Jagielski 			case DataType::FLOAT:
380*b1cdbd2cSJim Jagielski 				pOb1->setValue((float)pOb1->getValue());
381*b1cdbd2cSJim Jagielski 				pOb2->setValue((float)pOb2->getValue());
382*b1cdbd2cSJim Jagielski 				break;
383*b1cdbd2cSJim Jagielski 			case DataType::DOUBLE:
384*b1cdbd2cSJim Jagielski 			case DataType::REAL:
385*b1cdbd2cSJim Jagielski 				pOb1->setValue((double)pOb1->getValue());
386*b1cdbd2cSJim Jagielski 				pOb2->setValue((double)pOb2->getValue());
387*b1cdbd2cSJim Jagielski 				break;
388*b1cdbd2cSJim Jagielski 			case DataType::DATE:
389*b1cdbd2cSJim Jagielski 				pOb1->setValue((Date)pOb1->getValue());
390*b1cdbd2cSJim Jagielski 				pOb2->setValue((Date)pOb2->getValue());
391*b1cdbd2cSJim Jagielski 				break;
392*b1cdbd2cSJim Jagielski 			case DataType::TIME:
393*b1cdbd2cSJim Jagielski 				pOb1->setValue((Time)pOb1->getValue());
394*b1cdbd2cSJim Jagielski 				pOb2->setValue((Time)pOb2->getValue());
395*b1cdbd2cSJim Jagielski 				break;
396*b1cdbd2cSJim Jagielski 			case DataType::TIMESTAMP:
397*b1cdbd2cSJim Jagielski 				pOb1->setValue((DateTime)pOb1->getValue());
398*b1cdbd2cSJim Jagielski 				pOb2->setValue((DateTime)pOb2->getValue());
399*b1cdbd2cSJim Jagielski 				break;
400*b1cdbd2cSJim Jagielski 		}
401*b1cdbd2cSJim Jagielski 	}
402*b1cdbd2cSJim Jagielski 
403*b1cdbd2cSJim Jagielski 
404*b1cdbd2cSJim Jagielski 
405*b1cdbd2cSJim Jagielski 	OBoolOperator* pBoolOp = NULL;
406*b1cdbd2cSJim Jagielski 	if ( bNot )
407*b1cdbd2cSJim Jagielski 		pBoolOp = new OOp_OR();
408*b1cdbd2cSJim Jagielski 	else
409*b1cdbd2cSJim Jagielski 		pBoolOp = new OOp_AND();
410*b1cdbd2cSJim Jagielski 	m_aCodeList.push_back(pBoolOp);
411*b1cdbd2cSJim Jagielski 
412*b1cdbd2cSJim Jagielski 	return NULL;
413*b1cdbd2cSJim Jagielski }
414*b1cdbd2cSJim Jagielski //------------------------------------------------------------------
execute_ISNULL(OSQLParseNode * pPredicateNode)415*b1cdbd2cSJim Jagielski OOperand* OPredicateCompiler::execute_ISNULL(OSQLParseNode* pPredicateNode)	throw(SQLException, RuntimeException)
416*b1cdbd2cSJim Jagielski {
417*b1cdbd2cSJim Jagielski 	DBG_ASSERT(pPredicateNode->count() == 2,"OFILECursor: Fehler im Parse Tree");
418*b1cdbd2cSJim Jagielski     const OSQLParseNode* pPart2 = pPredicateNode->getChild(1);
419*b1cdbd2cSJim Jagielski 	DBG_ASSERT(SQL_ISTOKEN(pPart2->getChild(0),IS),"OFILECursor: Fehler im Parse Tree");
420*b1cdbd2cSJim Jagielski 
421*b1cdbd2cSJim Jagielski 	sal_Int32 ePredicateType;
422*b1cdbd2cSJim Jagielski 	if (SQL_ISTOKEN(pPart2->getChild(1),NOT))
423*b1cdbd2cSJim Jagielski 		ePredicateType = SQLFilterOperator::NOT_SQLNULL;
424*b1cdbd2cSJim Jagielski 	else
425*b1cdbd2cSJim Jagielski 		ePredicateType = SQLFilterOperator::SQLNULL;
426*b1cdbd2cSJim Jagielski 
427*b1cdbd2cSJim Jagielski 	execute(pPredicateNode->getChild(0));
428*b1cdbd2cSJim Jagielski 	OBoolOperator* pOperator = (ePredicateType == SQLFilterOperator::SQLNULL) ?
429*b1cdbd2cSJim Jagielski 								new OOp_ISNULL() : new OOp_ISNOTNULL();
430*b1cdbd2cSJim Jagielski 	m_aCodeList.push_back(pOperator);
431*b1cdbd2cSJim Jagielski 
432*b1cdbd2cSJim Jagielski 	return NULL;
433*b1cdbd2cSJim Jagielski }
434*b1cdbd2cSJim Jagielski //------------------------------------------------------------------
execute_Operand(OSQLParseNode * pPredicateNode)435*b1cdbd2cSJim Jagielski OOperand* OPredicateCompiler::execute_Operand(OSQLParseNode* pPredicateNode) throw(SQLException, RuntimeException)
436*b1cdbd2cSJim Jagielski {
437*b1cdbd2cSJim Jagielski 	OOperand* pOperand = NULL;
438*b1cdbd2cSJim Jagielski 
439*b1cdbd2cSJim Jagielski 	if (SQL_ISRULE(pPredicateNode,column_ref))
440*b1cdbd2cSJim Jagielski 	{
441*b1cdbd2cSJim Jagielski 		::rtl::OUString	aColumnName;
442*b1cdbd2cSJim Jagielski 		if (pPredicateNode->count() == 1)
443*b1cdbd2cSJim Jagielski 		{
444*b1cdbd2cSJim Jagielski 			aColumnName = pPredicateNode->getChild(0)->getTokenValue();
445*b1cdbd2cSJim Jagielski 		}
446*b1cdbd2cSJim Jagielski 		else if (pPredicateNode->count() == 3)
447*b1cdbd2cSJim Jagielski 		{
448*b1cdbd2cSJim Jagielski 			::rtl::OUString aTableName = pPredicateNode->getChild(0)->getTokenValue();
449*b1cdbd2cSJim Jagielski 			if(SQL_ISRULE(pPredicateNode->getChild(2),column_val))
450*b1cdbd2cSJim Jagielski 				aColumnName = pPredicateNode->getChild(2)->getChild(0)->getTokenValue();
451*b1cdbd2cSJim Jagielski 			else
452*b1cdbd2cSJim Jagielski 				aColumnName = pPredicateNode->getChild(2)->getTokenValue();
453*b1cdbd2cSJim Jagielski 		}
454*b1cdbd2cSJim Jagielski 
455*b1cdbd2cSJim Jagielski 		if(!m_orgColumns->hasByName(aColumnName))
456*b1cdbd2cSJim Jagielski 		{
457*b1cdbd2cSJim Jagielski             const ::rtl::OUString sError( m_pAnalyzer->getConnection()->getResources().getResourceStringWithSubstitution(
458*b1cdbd2cSJim Jagielski                     STR_INVALID_COLUMNNAME,
459*b1cdbd2cSJim Jagielski                     "$columnname$", aColumnName
460*b1cdbd2cSJim Jagielski                  ) );
461*b1cdbd2cSJim Jagielski             ::dbtools::throwGenericSQLException( sError, NULL );
462*b1cdbd2cSJim Jagielski 		}
463*b1cdbd2cSJim Jagielski 		::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet> xCol;
464*b1cdbd2cSJim Jagielski 		try
465*b1cdbd2cSJim Jagielski 		{
466*b1cdbd2cSJim Jagielski 			if (m_orgColumns->getByName(aColumnName) >>= xCol)
467*b1cdbd2cSJim Jagielski 			{
468*b1cdbd2cSJim Jagielski 				pOperand = m_pAnalyzer->createOperandAttr(Reference< XColumnLocate>(m_orgColumns,UNO_QUERY)->findColumn(aColumnName),xCol,m_xIndexes);
469*b1cdbd2cSJim Jagielski 			}
470*b1cdbd2cSJim Jagielski 			else
471*b1cdbd2cSJim Jagielski 			{// Column existiert nicht im Resultset
472*b1cdbd2cSJim Jagielski 				const ::rtl::OUString sError( m_pAnalyzer->getConnection()->getResources().getResourceStringWithSubstitution(
473*b1cdbd2cSJim Jagielski                     STR_INVALID_COLUMNNAME,
474*b1cdbd2cSJim Jagielski                     "$columnname$", aColumnName
475*b1cdbd2cSJim Jagielski                  ) );
476*b1cdbd2cSJim Jagielski                 ::dbtools::throwGenericSQLException( sError, NULL );
477*b1cdbd2cSJim Jagielski 			}
478*b1cdbd2cSJim Jagielski 		}
479*b1cdbd2cSJim Jagielski 		catch(Exception &)
480*b1cdbd2cSJim Jagielski 		{
481*b1cdbd2cSJim Jagielski 			OSL_ENSURE(0,"OPredicateCompiler::execute_Operand Exception");
482*b1cdbd2cSJim Jagielski 		}
483*b1cdbd2cSJim Jagielski 	}
484*b1cdbd2cSJim Jagielski 	else if (SQL_ISRULE(pPredicateNode,parameter))
485*b1cdbd2cSJim Jagielski 	{
486*b1cdbd2cSJim Jagielski 		pOperand = new OOperandParam(pPredicateNode, ++m_nParamCounter);
487*b1cdbd2cSJim Jagielski 	}
488*b1cdbd2cSJim Jagielski 	else if (pPredicateNode->getNodeType() == SQL_NODE_STRING ||
489*b1cdbd2cSJim Jagielski 			 pPredicateNode->getNodeType() == SQL_NODE_INTNUM ||
490*b1cdbd2cSJim Jagielski 			 pPredicateNode->getNodeType() == SQL_NODE_APPROXNUM ||
491*b1cdbd2cSJim Jagielski 			 pPredicateNode->getNodeType() == SQL_NODE_NAME ||
492*b1cdbd2cSJim Jagielski 			 SQL_ISTOKEN(pPredicateNode,TRUE) ||
493*b1cdbd2cSJim Jagielski 			 SQL_ISTOKEN(pPredicateNode,FALSE) ||
494*b1cdbd2cSJim Jagielski 			 SQL_ISRULE(pPredicateNode,parameter))
495*b1cdbd2cSJim Jagielski 	{
496*b1cdbd2cSJim Jagielski 		pOperand = new OOperandConst(*pPredicateNode, pPredicateNode->getTokenValue());
497*b1cdbd2cSJim Jagielski 	}
498*b1cdbd2cSJim Jagielski 	else if((pPredicateNode->count() == 2) &&
499*b1cdbd2cSJim Jagielski 			(SQL_ISPUNCTUATION(pPredicateNode->getChild(0),"+") || SQL_ISPUNCTUATION(pPredicateNode->getChild(0),"-")) &&
500*b1cdbd2cSJim Jagielski 			pPredicateNode->getChild(1)->getNodeType() == SQL_NODE_INTNUM)
501*b1cdbd2cSJim Jagielski 	{ // falls -1 bzw. +1 vorhanden ist
502*b1cdbd2cSJim Jagielski 		::rtl::OUString aValue(pPredicateNode->getChild(0)->getTokenValue());
503*b1cdbd2cSJim Jagielski 		aValue += pPredicateNode->getChild(1)->getTokenValue();
504*b1cdbd2cSJim Jagielski 		pOperand = new OOperandConst(*pPredicateNode->getChild(1), aValue);
505*b1cdbd2cSJim Jagielski 	}
506*b1cdbd2cSJim Jagielski 	else if( SQL_ISRULE(pPredicateNode,set_fct_spec) && SQL_ISPUNCTUATION(pPredicateNode->getChild(0),"{") )
507*b1cdbd2cSJim Jagielski 	{
508*b1cdbd2cSJim Jagielski 		const OSQLParseNode* pODBCNode = pPredicateNode->getChild(1);
509*b1cdbd2cSJim Jagielski 		const OSQLParseNode* pODBCNodeChild = pODBCNode->getChild(0);
510*b1cdbd2cSJim Jagielski 
511*b1cdbd2cSJim Jagielski 		// Odbc Date or time
512*b1cdbd2cSJim Jagielski 		if (pODBCNodeChild->getNodeType() == SQL_NODE_KEYWORD && (
513*b1cdbd2cSJim Jagielski 			SQL_ISTOKEN(pODBCNodeChild,D) ||
514*b1cdbd2cSJim Jagielski 			SQL_ISTOKEN(pODBCNodeChild,T) ||
515*b1cdbd2cSJim Jagielski 			SQL_ISTOKEN(pODBCNodeChild,TS) ))
516*b1cdbd2cSJim Jagielski 		{
517*b1cdbd2cSJim Jagielski 			::rtl::OUString sDateTime = pODBCNode->getChild(1)->getTokenValue();
518*b1cdbd2cSJim Jagielski 			pOperand = new OOperandConst(*pODBCNode->getChild(1), sDateTime);
519*b1cdbd2cSJim Jagielski 			if(SQL_ISTOKEN(pODBCNodeChild,D))
520*b1cdbd2cSJim Jagielski 			{
521*b1cdbd2cSJim Jagielski 				pOperand->setValue(::dbtools::DBTypeConversion::toDouble(::dbtools::DBTypeConversion::toDate(sDateTime)));
522*b1cdbd2cSJim Jagielski 			}
523*b1cdbd2cSJim Jagielski 			else if(SQL_ISTOKEN(pODBCNodeChild,T))
524*b1cdbd2cSJim Jagielski 			{
525*b1cdbd2cSJim Jagielski 				pOperand->setValue(::dbtools::DBTypeConversion::toDouble(::dbtools::DBTypeConversion::toTime(sDateTime)));
526*b1cdbd2cSJim Jagielski 			}
527*b1cdbd2cSJim Jagielski 			else if(SQL_ISTOKEN(pODBCNodeChild,TS))
528*b1cdbd2cSJim Jagielski 			{
529*b1cdbd2cSJim Jagielski 				pOperand->setValue(::dbtools::DBTypeConversion::toDouble(::dbtools::DBTypeConversion::toDateTime(sDateTime)));
530*b1cdbd2cSJim Jagielski 			}
531*b1cdbd2cSJim Jagielski 		}
532*b1cdbd2cSJim Jagielski 		else
533*b1cdbd2cSJim Jagielski 			m_pAnalyzer->getConnection()->throwGenericSQLException(STR_QUERY_TOO_COMPLEX,NULL);
534*b1cdbd2cSJim Jagielski 
535*b1cdbd2cSJim Jagielski 	}
536*b1cdbd2cSJim Jagielski 	else if( SQL_ISRULE(pPredicateNode,fold) )
537*b1cdbd2cSJim Jagielski 	{
538*b1cdbd2cSJim Jagielski 		execute_Fold(pPredicateNode);
539*b1cdbd2cSJim Jagielski 	}
540*b1cdbd2cSJim Jagielski 	else if(	SQL_ISRULE(pPredicateNode,set_fct_spec)
541*b1cdbd2cSJim Jagielski 			||	SQL_ISRULE(pPredicateNode,position_exp)
542*b1cdbd2cSJim Jagielski 			||	SQL_ISRULE(pPredicateNode,char_substring_fct)
543*b1cdbd2cSJim Jagielski 			)
544*b1cdbd2cSJim Jagielski 	{
545*b1cdbd2cSJim Jagielski 		executeFunction(pPredicateNode);
546*b1cdbd2cSJim Jagielski 	}
547*b1cdbd2cSJim Jagielski 	else if( SQL_ISRULE(pPredicateNode,length_exp) )
548*b1cdbd2cSJim Jagielski 	{
549*b1cdbd2cSJim Jagielski 		executeFunction(pPredicateNode->getChild(0));
550*b1cdbd2cSJim Jagielski 	}
551*b1cdbd2cSJim Jagielski 	else
552*b1cdbd2cSJim Jagielski 	{
553*b1cdbd2cSJim Jagielski 		m_pAnalyzer->getConnection()->throwGenericSQLException(STR_QUERY_TOO_COMPLEX,NULL);
554*b1cdbd2cSJim Jagielski 	}
555*b1cdbd2cSJim Jagielski 	if (pOperand)
556*b1cdbd2cSJim Jagielski 		m_aCodeList.push_back(pOperand);
557*b1cdbd2cSJim Jagielski 	return pOperand;
558*b1cdbd2cSJim Jagielski }
559*b1cdbd2cSJim Jagielski 
560*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////
evaluate(OCodeList & rCodeList)561*b1cdbd2cSJim Jagielski sal_Bool OPredicateInterpreter::evaluate(OCodeList& rCodeList)
562*b1cdbd2cSJim Jagielski {
563*b1cdbd2cSJim Jagielski 	static sal_Bool bResult;
564*b1cdbd2cSJim Jagielski 
565*b1cdbd2cSJim Jagielski 	OCodeList::iterator aIter = rCodeList.begin();
566*b1cdbd2cSJim Jagielski 	if (!(*aIter))
567*b1cdbd2cSJim Jagielski         return sal_True;        // kein Praedikat
568*b1cdbd2cSJim Jagielski 
569*b1cdbd2cSJim Jagielski 	for(;aIter != rCodeList.end();++aIter)
570*b1cdbd2cSJim Jagielski 	{
571*b1cdbd2cSJim Jagielski 		OOperand* pOperand = PTR_CAST(OOperand,(*aIter));
572*b1cdbd2cSJim Jagielski 		if (pOperand)
573*b1cdbd2cSJim Jagielski 			m_aStack.push(pOperand);
574*b1cdbd2cSJim Jagielski 		else
575*b1cdbd2cSJim Jagielski 			((OOperator *)(*aIter))->Exec(m_aStack);
576*b1cdbd2cSJim Jagielski 	}
577*b1cdbd2cSJim Jagielski 
578*b1cdbd2cSJim Jagielski 	OOperand* pOperand = m_aStack.top();
579*b1cdbd2cSJim Jagielski 	m_aStack.pop();
580*b1cdbd2cSJim Jagielski 
581*b1cdbd2cSJim Jagielski 	DBG_ASSERT(m_aStack.size() == 0, "StackFehler");
582*b1cdbd2cSJim Jagielski 	DBG_ASSERT(pOperand, "StackFehler");
583*b1cdbd2cSJim Jagielski 
584*b1cdbd2cSJim Jagielski 	bResult = pOperand->isValid();
585*b1cdbd2cSJim Jagielski 	if (IS_TYPE(OOperandResult,pOperand))
586*b1cdbd2cSJim Jagielski 		delete pOperand;
587*b1cdbd2cSJim Jagielski 	return bResult;
588*b1cdbd2cSJim Jagielski }
589*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
evaluateSelection(OCodeList & rCodeList,ORowSetValueDecoratorRef & _rVal)590*b1cdbd2cSJim Jagielski void OPredicateInterpreter::evaluateSelection(OCodeList& rCodeList,ORowSetValueDecoratorRef& _rVal)
591*b1cdbd2cSJim Jagielski {
592*b1cdbd2cSJim Jagielski 	OCodeList::iterator aIter = rCodeList.begin();
593*b1cdbd2cSJim Jagielski 	if (!(*aIter))
594*b1cdbd2cSJim Jagielski         return ;        // kein Praedikat
595*b1cdbd2cSJim Jagielski 
596*b1cdbd2cSJim Jagielski 	for(;aIter != rCodeList.end();++aIter)
597*b1cdbd2cSJim Jagielski 	{
598*b1cdbd2cSJim Jagielski 		OOperand* pOperand = PTR_CAST(OOperand,(*aIter));
599*b1cdbd2cSJim Jagielski 		if (pOperand)
600*b1cdbd2cSJim Jagielski 			m_aStack.push(pOperand);
601*b1cdbd2cSJim Jagielski 		else
602*b1cdbd2cSJim Jagielski 			((OOperator *)(*aIter))->Exec(m_aStack);
603*b1cdbd2cSJim Jagielski 	}
604*b1cdbd2cSJim Jagielski 
605*b1cdbd2cSJim Jagielski 	OOperand* pOperand = m_aStack.top();
606*b1cdbd2cSJim Jagielski 	m_aStack.pop();
607*b1cdbd2cSJim Jagielski 
608*b1cdbd2cSJim Jagielski 	DBG_ASSERT(m_aStack.size() == 0, "StackFehler");
609*b1cdbd2cSJim Jagielski 	DBG_ASSERT(pOperand, "StackFehler");
610*b1cdbd2cSJim Jagielski 
611*b1cdbd2cSJim Jagielski 	(*_rVal) = pOperand->getValue();
612*b1cdbd2cSJim Jagielski 	if (IS_TYPE(OOperandResult,pOperand))
613*b1cdbd2cSJim Jagielski 		delete pOperand;
614*b1cdbd2cSJim Jagielski }
615*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
execute_Fold(OSQLParseNode * pPredicateNode)616*b1cdbd2cSJim Jagielski OOperand* OPredicateCompiler::execute_Fold(OSQLParseNode* pPredicateNode)	throw(SQLException, RuntimeException)
617*b1cdbd2cSJim Jagielski {
618*b1cdbd2cSJim Jagielski 	DBG_ASSERT(pPredicateNode->count() >= 4,"OFILECursor: Fehler im Parse Tree");
619*b1cdbd2cSJim Jagielski 
620*b1cdbd2cSJim Jagielski 	sal_Bool bUpper = SQL_ISTOKEN(pPredicateNode->getChild(0),UPPER);
621*b1cdbd2cSJim Jagielski 
622*b1cdbd2cSJim Jagielski 	execute(pPredicateNode->getChild(2));
623*b1cdbd2cSJim Jagielski 	OOperator* pOperator = NULL;
624*b1cdbd2cSJim Jagielski 	if ( bUpper )
625*b1cdbd2cSJim Jagielski 		pOperator = new OOp_Upper();
626*b1cdbd2cSJim Jagielski 	else
627*b1cdbd2cSJim Jagielski 		pOperator = new OOp_Lower();
628*b1cdbd2cSJim Jagielski 
629*b1cdbd2cSJim Jagielski 	m_aCodeList.push_back(pOperator);
630*b1cdbd2cSJim Jagielski 	return NULL;
631*b1cdbd2cSJim Jagielski }
632*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
executeFunction(OSQLParseNode * pPredicateNode)633*b1cdbd2cSJim Jagielski OOperand* OPredicateCompiler::executeFunction(OSQLParseNode* pPredicateNode)	throw(SQLException, RuntimeException)
634*b1cdbd2cSJim Jagielski {
635*b1cdbd2cSJim Jagielski 	OOperator* pOperator = NULL;
636*b1cdbd2cSJim Jagielski 
637*b1cdbd2cSJim Jagielski 	OSL_ENSURE(pPredicateNode->getChild(0)->isToken(),"The first one must be the name of the function!");
638*b1cdbd2cSJim Jagielski 	sal_Int32 nTokenId = pPredicateNode->getChild(0)->getTokenID();
639*b1cdbd2cSJim Jagielski 	switch ( nTokenId )
640*b1cdbd2cSJim Jagielski 	{
641*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_CHAR_LENGTH:
642*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_LENGTH:
643*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_OCTET_LENGTH:
644*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_ASCII:
645*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_LCASE:
646*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_LTRIM:
647*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_RTRIM:
648*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_SPACE:
649*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_UCASE:
650*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_ABS:
651*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_ACOS:
652*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_ASIN:
653*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_ATAN:
654*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_CEILING:
655*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_COS:
656*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_DEGREES:
657*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_EXP:
658*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_FLOOR:
659*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_LOG10:
660*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_LN:
661*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_RADIANS:
662*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_SIGN:
663*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_SIN:
664*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_SQRT:
665*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_TAN:
666*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_DAYNAME:
667*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_DAYOFMONTH:
668*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_DAYOFWEEK:
669*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_DAYOFYEAR:
670*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_HOUR:
671*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_MINUTE:
672*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_MONTH:
673*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_MONTHNAME:
674*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_QUARTER:
675*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_SECOND:
676*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_YEAR:
677*b1cdbd2cSJim Jagielski 
678*b1cdbd2cSJim Jagielski 			execute(pPredicateNode->getChild(2));
679*b1cdbd2cSJim Jagielski 
680*b1cdbd2cSJim Jagielski 			switch( nTokenId )
681*b1cdbd2cSJim Jagielski 			{
682*b1cdbd2cSJim Jagielski 				case SQL_TOKEN_CHAR_LENGTH:
683*b1cdbd2cSJim Jagielski 				case SQL_TOKEN_LENGTH:
684*b1cdbd2cSJim Jagielski 				case SQL_TOKEN_OCTET_LENGTH:
685*b1cdbd2cSJim Jagielski 					pOperator = new OOp_CharLength();
686*b1cdbd2cSJim Jagielski 					break;
687*b1cdbd2cSJim Jagielski 				case SQL_TOKEN_ASCII:
688*b1cdbd2cSJim Jagielski 					pOperator = new OOp_Ascii();
689*b1cdbd2cSJim Jagielski 					break;
690*b1cdbd2cSJim Jagielski 				case SQL_TOKEN_LCASE:
691*b1cdbd2cSJim Jagielski 					pOperator = new OOp_Lower();
692*b1cdbd2cSJim Jagielski 					break;
693*b1cdbd2cSJim Jagielski 
694*b1cdbd2cSJim Jagielski 				case SQL_TOKEN_LTRIM:
695*b1cdbd2cSJim Jagielski 					pOperator = new OOp_LTrim();
696*b1cdbd2cSJim Jagielski 					break;
697*b1cdbd2cSJim Jagielski 				case SQL_TOKEN_RTRIM:
698*b1cdbd2cSJim Jagielski 					pOperator = new OOp_RTrim();
699*b1cdbd2cSJim Jagielski 					break;
700*b1cdbd2cSJim Jagielski 				case SQL_TOKEN_SPACE:
701*b1cdbd2cSJim Jagielski 					pOperator = new OOp_Space();
702*b1cdbd2cSJim Jagielski 					break;
703*b1cdbd2cSJim Jagielski 				case SQL_TOKEN_UCASE:
704*b1cdbd2cSJim Jagielski 					pOperator = new OOp_Upper();
705*b1cdbd2cSJim Jagielski 					break;
706*b1cdbd2cSJim Jagielski 				case SQL_TOKEN_ABS:
707*b1cdbd2cSJim Jagielski 					pOperator = new OOp_Abs();
708*b1cdbd2cSJim Jagielski 					break;
709*b1cdbd2cSJim Jagielski 				case SQL_TOKEN_ACOS:
710*b1cdbd2cSJim Jagielski 					pOperator = new OOp_ACos();
711*b1cdbd2cSJim Jagielski 					break;
712*b1cdbd2cSJim Jagielski 				case SQL_TOKEN_ASIN:
713*b1cdbd2cSJim Jagielski 					pOperator = new OOp_ASin();
714*b1cdbd2cSJim Jagielski 					break;
715*b1cdbd2cSJim Jagielski 				case SQL_TOKEN_ATAN:
716*b1cdbd2cSJim Jagielski 					pOperator = new OOp_ATan();
717*b1cdbd2cSJim Jagielski 					break;
718*b1cdbd2cSJim Jagielski 				case SQL_TOKEN_CEILING:
719*b1cdbd2cSJim Jagielski 					pOperator = new OOp_Ceiling();
720*b1cdbd2cSJim Jagielski 					break;
721*b1cdbd2cSJim Jagielski 				case SQL_TOKEN_COS:
722*b1cdbd2cSJim Jagielski 					pOperator = new OOp_Cos();
723*b1cdbd2cSJim Jagielski 					break;
724*b1cdbd2cSJim Jagielski 				case SQL_TOKEN_DEGREES:
725*b1cdbd2cSJim Jagielski 					pOperator = new OOp_Degrees();
726*b1cdbd2cSJim Jagielski 					break;
727*b1cdbd2cSJim Jagielski 				case SQL_TOKEN_EXP:
728*b1cdbd2cSJim Jagielski 					pOperator = new OOp_Exp();
729*b1cdbd2cSJim Jagielski 					break;
730*b1cdbd2cSJim Jagielski 				case SQL_TOKEN_FLOOR:
731*b1cdbd2cSJim Jagielski 					pOperator = new OOp_Floor();
732*b1cdbd2cSJim Jagielski 					break;
733*b1cdbd2cSJim Jagielski 				case SQL_TOKEN_LOG10:
734*b1cdbd2cSJim Jagielski 					pOperator = new OOp_Log10();
735*b1cdbd2cSJim Jagielski 					break;
736*b1cdbd2cSJim Jagielski 				case SQL_TOKEN_LN:
737*b1cdbd2cSJim Jagielski 					pOperator = new OOp_Ln();
738*b1cdbd2cSJim Jagielski 					break;
739*b1cdbd2cSJim Jagielski 				case SQL_TOKEN_RADIANS:
740*b1cdbd2cSJim Jagielski 					pOperator = new OOp_Radians();
741*b1cdbd2cSJim Jagielski 					break;
742*b1cdbd2cSJim Jagielski 				case SQL_TOKEN_SIGN:
743*b1cdbd2cSJim Jagielski 					pOperator = new OOp_Sign();
744*b1cdbd2cSJim Jagielski 					break;
745*b1cdbd2cSJim Jagielski 				case SQL_TOKEN_SIN:
746*b1cdbd2cSJim Jagielski 					pOperator = new OOp_Sin();
747*b1cdbd2cSJim Jagielski 					break;
748*b1cdbd2cSJim Jagielski 				case SQL_TOKEN_SQRT:
749*b1cdbd2cSJim Jagielski 					pOperator = new OOp_Sqrt();
750*b1cdbd2cSJim Jagielski 					break;
751*b1cdbd2cSJim Jagielski 				case SQL_TOKEN_TAN:
752*b1cdbd2cSJim Jagielski 					pOperator = new OOp_Tan();
753*b1cdbd2cSJim Jagielski 					break;
754*b1cdbd2cSJim Jagielski 				case SQL_TOKEN_DAYOFWEEK:
755*b1cdbd2cSJim Jagielski 					pOperator = new OOp_DayOfWeek();
756*b1cdbd2cSJim Jagielski 					break;
757*b1cdbd2cSJim Jagielski 				case SQL_TOKEN_DAYOFMONTH:
758*b1cdbd2cSJim Jagielski 					pOperator = new OOp_DayOfMonth();
759*b1cdbd2cSJim Jagielski 					break;
760*b1cdbd2cSJim Jagielski 				case SQL_TOKEN_DAYOFYEAR:
761*b1cdbd2cSJim Jagielski 					pOperator = new OOp_DayOfYear();
762*b1cdbd2cSJim Jagielski 					break;
763*b1cdbd2cSJim Jagielski 				case SQL_TOKEN_MONTH:
764*b1cdbd2cSJim Jagielski 					pOperator = new OOp_Month();
765*b1cdbd2cSJim Jagielski 					break;
766*b1cdbd2cSJim Jagielski 				case SQL_TOKEN_DAYNAME:
767*b1cdbd2cSJim Jagielski 					pOperator = new OOp_DayName();
768*b1cdbd2cSJim Jagielski 					break;
769*b1cdbd2cSJim Jagielski 				case SQL_TOKEN_MONTHNAME:
770*b1cdbd2cSJim Jagielski 					pOperator = new OOp_MonthName();
771*b1cdbd2cSJim Jagielski 					break;
772*b1cdbd2cSJim Jagielski 				case SQL_TOKEN_QUARTER:
773*b1cdbd2cSJim Jagielski 					pOperator = new OOp_Quarter();
774*b1cdbd2cSJim Jagielski 					break;
775*b1cdbd2cSJim Jagielski 				case SQL_TOKEN_YEAR:
776*b1cdbd2cSJim Jagielski 					pOperator = new OOp_Year();
777*b1cdbd2cSJim Jagielski 					break;
778*b1cdbd2cSJim Jagielski 				case SQL_TOKEN_HOUR:
779*b1cdbd2cSJim Jagielski 					pOperator = new OOp_Hour();
780*b1cdbd2cSJim Jagielski 					break;
781*b1cdbd2cSJim Jagielski 				case SQL_TOKEN_MINUTE:
782*b1cdbd2cSJim Jagielski 					pOperator = new OOp_Minute();
783*b1cdbd2cSJim Jagielski 					break;
784*b1cdbd2cSJim Jagielski 				case SQL_TOKEN_SECOND:
785*b1cdbd2cSJim Jagielski 					pOperator = new OOp_Second();
786*b1cdbd2cSJim Jagielski 					break;
787*b1cdbd2cSJim Jagielski 				default:
788*b1cdbd2cSJim Jagielski 					OSL_ENSURE(0,"Error in switch!");
789*b1cdbd2cSJim Jagielski 			}
790*b1cdbd2cSJim Jagielski 			break;
791*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_CHAR:
792*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_CONCAT:
793*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_INSERT:
794*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_LEFT:
795*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_LOCATE:
796*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_LOCATE_2:
797*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_REPEAT:
798*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_REPLACE:
799*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_RIGHT:
800*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_MOD:
801*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_ROUND:
802*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_LOGF:
803*b1cdbd2cSJim Jagielski         case SQL_TOKEN_LOG:
804*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_POWER:
805*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_ATAN2:
806*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_PI:
807*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_CURDATE:
808*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_CURTIME:
809*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_NOW:
810*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_WEEK:
811*b1cdbd2cSJim Jagielski 			{
812*b1cdbd2cSJim Jagielski 				m_aCodeList.push_back(new OStopOperand);
813*b1cdbd2cSJim Jagielski 				OSQLParseNode* pList = pPredicateNode->getChild(2);
814*b1cdbd2cSJim Jagielski 				for (sal_uInt32 i=0; i < pList->count(); ++i)
815*b1cdbd2cSJim Jagielski 					execute(pList->getChild(i));
816*b1cdbd2cSJim Jagielski 
817*b1cdbd2cSJim Jagielski 				switch( nTokenId )
818*b1cdbd2cSJim Jagielski 				{
819*b1cdbd2cSJim Jagielski 					case SQL_TOKEN_CHAR:
820*b1cdbd2cSJim Jagielski 						pOperator = new OOp_Char();
821*b1cdbd2cSJim Jagielski 						break;
822*b1cdbd2cSJim Jagielski 					case SQL_TOKEN_CONCAT:
823*b1cdbd2cSJim Jagielski 						pOperator = new OOp_Concat();
824*b1cdbd2cSJim Jagielski 						break;
825*b1cdbd2cSJim Jagielski 					case SQL_TOKEN_INSERT:
826*b1cdbd2cSJim Jagielski 						pOperator = new OOp_Insert();
827*b1cdbd2cSJim Jagielski 						break;
828*b1cdbd2cSJim Jagielski 					case SQL_TOKEN_LEFT:
829*b1cdbd2cSJim Jagielski 						pOperator = new OOp_Left();
830*b1cdbd2cSJim Jagielski 						break;
831*b1cdbd2cSJim Jagielski 					case SQL_TOKEN_LOCATE:
832*b1cdbd2cSJim Jagielski 					case SQL_TOKEN_LOCATE_2:
833*b1cdbd2cSJim Jagielski 						pOperator = new OOp_Locate();
834*b1cdbd2cSJim Jagielski 						break;
835*b1cdbd2cSJim Jagielski 					case SQL_TOKEN_REPEAT:
836*b1cdbd2cSJim Jagielski 						pOperator = new OOp_Repeat();
837*b1cdbd2cSJim Jagielski 						break;
838*b1cdbd2cSJim Jagielski 					case SQL_TOKEN_REPLACE:
839*b1cdbd2cSJim Jagielski 						pOperator = new OOp_Replace();
840*b1cdbd2cSJim Jagielski 						break;
841*b1cdbd2cSJim Jagielski 					case SQL_TOKEN_RIGHT:
842*b1cdbd2cSJim Jagielski 						pOperator = new OOp_Right();
843*b1cdbd2cSJim Jagielski 						break;
844*b1cdbd2cSJim Jagielski 					case SQL_TOKEN_MOD:
845*b1cdbd2cSJim Jagielski 						pOperator = new OOp_Mod();
846*b1cdbd2cSJim Jagielski 						break;
847*b1cdbd2cSJim Jagielski 					case SQL_TOKEN_ROUND:
848*b1cdbd2cSJim Jagielski 						pOperator = new OOp_Round();
849*b1cdbd2cSJim Jagielski 						break;
850*b1cdbd2cSJim Jagielski 					case SQL_TOKEN_LOGF:
851*b1cdbd2cSJim Jagielski                     case SQL_TOKEN_LOG:
852*b1cdbd2cSJim Jagielski 						pOperator = new OOp_Log();
853*b1cdbd2cSJim Jagielski 						break;
854*b1cdbd2cSJim Jagielski 					case SQL_TOKEN_POWER:
855*b1cdbd2cSJim Jagielski 						pOperator = new OOp_Pow();
856*b1cdbd2cSJim Jagielski 						break;
857*b1cdbd2cSJim Jagielski 					case SQL_TOKEN_ATAN2:
858*b1cdbd2cSJim Jagielski 						pOperator = new OOp_ATan2();
859*b1cdbd2cSJim Jagielski 						break;
860*b1cdbd2cSJim Jagielski 					case SQL_TOKEN_PI:
861*b1cdbd2cSJim Jagielski 						pOperator = new OOp_Pi();
862*b1cdbd2cSJim Jagielski 						break;
863*b1cdbd2cSJim Jagielski 					case SQL_TOKEN_CURDATE:
864*b1cdbd2cSJim Jagielski 						pOperator = new OOp_CurDate();
865*b1cdbd2cSJim Jagielski 						break;
866*b1cdbd2cSJim Jagielski 					case SQL_TOKEN_CURTIME:
867*b1cdbd2cSJim Jagielski 						pOperator = new OOp_CurTime();
868*b1cdbd2cSJim Jagielski 						break;
869*b1cdbd2cSJim Jagielski 					case SQL_TOKEN_NOW:
870*b1cdbd2cSJim Jagielski 						pOperator = new OOp_Now();
871*b1cdbd2cSJim Jagielski 						break;
872*b1cdbd2cSJim Jagielski 					case SQL_TOKEN_WEEK:
873*b1cdbd2cSJim Jagielski 						pOperator = new OOp_Week();
874*b1cdbd2cSJim Jagielski 						break;
875*b1cdbd2cSJim Jagielski 					default:
876*b1cdbd2cSJim Jagielski 						OSL_ENSURE(0,"Error in switch!");
877*b1cdbd2cSJim Jagielski 				}
878*b1cdbd2cSJim Jagielski 			}
879*b1cdbd2cSJim Jagielski 			break;
880*b1cdbd2cSJim Jagielski 
881*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_SUBSTRING:
882*b1cdbd2cSJim Jagielski 			m_aCodeList.push_back(new OStopOperand);
883*b1cdbd2cSJim Jagielski 			if ( pPredicateNode->count() == 4 ) //char_substring_fct
884*b1cdbd2cSJim Jagielski 			{
885*b1cdbd2cSJim Jagielski 				OSQLParseNode* pList = pPredicateNode->getChild(2);
886*b1cdbd2cSJim Jagielski 				for (sal_uInt32 i=0; i < pList->count(); ++i)
887*b1cdbd2cSJim Jagielski 					execute(pList->getChild(i));
888*b1cdbd2cSJim Jagielski 			}
889*b1cdbd2cSJim Jagielski 			else
890*b1cdbd2cSJim Jagielski 			{
891*b1cdbd2cSJim Jagielski 				execute(pPredicateNode->getChild(2));
892*b1cdbd2cSJim Jagielski 				execute(pPredicateNode->getChild(4));
893*b1cdbd2cSJim Jagielski 				execute(pPredicateNode->getChild(5)->getChild(1));
894*b1cdbd2cSJim Jagielski 			}
895*b1cdbd2cSJim Jagielski 			pOperator = new OOp_SubString();
896*b1cdbd2cSJim Jagielski 			break;
897*b1cdbd2cSJim Jagielski 
898*b1cdbd2cSJim Jagielski 		case SQL_TOKEN_POSITION:
899*b1cdbd2cSJim Jagielski 			m_aCodeList.push_back(new OStopOperand);
900*b1cdbd2cSJim Jagielski 			if ( pPredicateNode->count() == 4 ) //position_exp
901*b1cdbd2cSJim Jagielski 			{
902*b1cdbd2cSJim Jagielski 				OSQLParseNode* pList = pPredicateNode->getChild(2);
903*b1cdbd2cSJim Jagielski 				for (sal_uInt32 i=0; i < pList->count(); ++i)
904*b1cdbd2cSJim Jagielski 					execute(pList->getChild(i));
905*b1cdbd2cSJim Jagielski 			}
906*b1cdbd2cSJim Jagielski 			else
907*b1cdbd2cSJim Jagielski 			{
908*b1cdbd2cSJim Jagielski 				execute(pPredicateNode->getChild(2));
909*b1cdbd2cSJim Jagielski 				execute(pPredicateNode->getChild(4));
910*b1cdbd2cSJim Jagielski 			}
911*b1cdbd2cSJim Jagielski 			pOperator = new OOp_Locate();
912*b1cdbd2cSJim Jagielski 			break;
913*b1cdbd2cSJim Jagielski 		default:
914*b1cdbd2cSJim Jagielski             m_pAnalyzer->getConnection()->throwGenericSQLException(STR_QUERY_FUNCTION_NOT_SUPPORTED,NULL);
915*b1cdbd2cSJim Jagielski 	}
916*b1cdbd2cSJim Jagielski 
917*b1cdbd2cSJim Jagielski 	m_aCodeList.push_back(pOperator);
918*b1cdbd2cSJim Jagielski 	return NULL;
919*b1cdbd2cSJim Jagielski }
920*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
921*b1cdbd2cSJim Jagielski 
922*b1cdbd2cSJim Jagielski 
923