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 "file/fcode.hxx" 27cdf0e10cSrcweir #include <osl/diagnose.h> 28cdf0e10cSrcweir #include "connectivity/sqlparse.hxx" 29cdf0e10cSrcweir #include <i18npool/mslangid.hxx> 30cdf0e10cSrcweir #include <tools/debug.hxx> 31cdf0e10cSrcweir #include <tools/string.hxx> 32cdf0e10cSrcweir #include "TConnection.hxx" 33cdf0e10cSrcweir #include <com/sun/star/sdb/SQLFilterOperator.hpp> 34cdf0e10cSrcweir #include <comphelper/types.hxx> 35cdf0e10cSrcweir #include <com/sun/star/sdb/SQLFilterOperator.hpp> 36cdf0e10cSrcweir #include <rtl/logfile.hxx> 37cdf0e10cSrcweir 38cdf0e10cSrcweir using namespace ::comphelper; 39cdf0e10cSrcweir using namespace connectivity; 40cdf0e10cSrcweir using namespace connectivity::file; 41cdf0e10cSrcweir //using namespace ::com::sun::star::uno; 42cdf0e10cSrcweir //using namespace ::com::sun::star::lang; 43cdf0e10cSrcweir using namespace ::com::sun::star::sdbc; 44cdf0e10cSrcweir using namespace ::com::sun::star::sdb; 45cdf0e10cSrcweir //using namespace ::com::sun::star::container; 46cdf0e10cSrcweir //using namespace ::com::sun::star::beans; 47cdf0e10cSrcweir //using namespace ::com::sun::star::sdbcx; 48cdf0e10cSrcweir 49cdf0e10cSrcweir TYPEINIT0(OCode); 50cdf0e10cSrcweir TYPEINIT1(OOperand, OCode); 51cdf0e10cSrcweir TYPEINIT1(OOperandRow, OOperand); 52cdf0e10cSrcweir TYPEINIT1(OOperandAttr, OOperandRow); 53cdf0e10cSrcweir TYPEINIT1(OOperandParam, OOperandRow); 54cdf0e10cSrcweir TYPEINIT1(OOperandValue, OOperand); 55cdf0e10cSrcweir TYPEINIT1(OOperandConst, OOperandValue); 56cdf0e10cSrcweir TYPEINIT1(OOperandResult, OOperandValue); 57cdf0e10cSrcweir TYPEINIT1(OStopOperand, OOperandValue); 58cdf0e10cSrcweir 59cdf0e10cSrcweir TYPEINIT1(OOperator, OCode); 60cdf0e10cSrcweir TYPEINIT1(OBoolOperator,OOperator); 61cdf0e10cSrcweir TYPEINIT1(OOp_NOT, OBoolOperator); 62cdf0e10cSrcweir TYPEINIT1(OOp_AND, OBoolOperator); 63cdf0e10cSrcweir TYPEINIT1(OOp_OR, OBoolOperator); 64cdf0e10cSrcweir TYPEINIT1(OOp_ISNULL, OBoolOperator); 65cdf0e10cSrcweir TYPEINIT1(OOp_ISNOTNULL, OOp_ISNULL); 66cdf0e10cSrcweir TYPEINIT1(OOp_LIKE, OBoolOperator); 67cdf0e10cSrcweir TYPEINIT1(OOp_NOTLIKE, OOp_LIKE); 68cdf0e10cSrcweir TYPEINIT1(OOp_COMPARE, OBoolOperator); 69cdf0e10cSrcweir TYPEINIT1(ONumOperator, OOperator); 70cdf0e10cSrcweir TYPEINIT1(ONthOperator, OOperator); 71cdf0e10cSrcweir TYPEINIT1(OBinaryOperator, OOperator); 72cdf0e10cSrcweir TYPEINIT1(OUnaryOperator, OOperator); 73cdf0e10cSrcweir 74cdf0e10cSrcweir //------------------------------------------------------------------ 75cdf0e10cSrcweir DBG_NAME(OCode ) 76cdf0e10cSrcweir OCode::OCode() 77cdf0e10cSrcweir { 78cdf0e10cSrcweir DBG_CTOR(OCode ,NULL); 79cdf0e10cSrcweir } 80cdf0e10cSrcweir // ----------------------------------------------------------------------------- 81cdf0e10cSrcweir OCode::~OCode() 82cdf0e10cSrcweir { 83cdf0e10cSrcweir DBG_DTOR(OCode,NULL); 84cdf0e10cSrcweir } 85cdf0e10cSrcweir 86cdf0e10cSrcweir //------------------------------------------------------------------ 87cdf0e10cSrcweir OEvaluateSet* OOperand::preProcess(OBoolOperator* /*pOp*/, OOperand* /*pRight*/) 88cdf0e10cSrcweir { 89cdf0e10cSrcweir return NULL; 90cdf0e10cSrcweir } 91cdf0e10cSrcweir // ----------------------------------------------------------------------------- 92cdf0e10cSrcweir OOperandRow::OOperandRow(sal_uInt16 _nPos, sal_Int32 _rType) 93cdf0e10cSrcweir : OOperand(_rType) 94cdf0e10cSrcweir , m_nRowPos(_nPos) 95cdf0e10cSrcweir {} 96cdf0e10cSrcweir //------------------------------------------------------------------ 97cdf0e10cSrcweir void OOperandRow::bindValue(const OValueRefRow& _pRow) 98cdf0e10cSrcweir { 99cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOperandRow::OOperandRow" ); 100cdf0e10cSrcweir OSL_ENSURE(_pRow.isValid(),"NO EMPTY row allowed!"); 101cdf0e10cSrcweir m_pRow = _pRow; 102cdf0e10cSrcweir OSL_ENSURE(m_pRow.isValid() && m_nRowPos < m_pRow->get().size(),"Invalid RowPos is >= vector.size()"); 103cdf0e10cSrcweir (m_pRow->get())[m_nRowPos]->setBound(sal_True); 104cdf0e10cSrcweir } 105cdf0e10cSrcweir // ----------------------------------------------------------------------------- 106cdf0e10cSrcweir void OOperandRow::setValue(const ORowSetValue& _rVal) 107cdf0e10cSrcweir { 108cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOperandRow::setValue" ); 109cdf0e10cSrcweir OSL_ENSURE(m_pRow.isValid() && m_nRowPos < m_pRow->get().size(),"Invalid RowPos is >= vector.size()"); 110cdf0e10cSrcweir (*(m_pRow->get())[m_nRowPos]) = _rVal; 111cdf0e10cSrcweir } 112cdf0e10cSrcweir //------------------------------------------------------------------ 113cdf0e10cSrcweir const ORowSetValue& OOperandRow::getValue() const 114cdf0e10cSrcweir { 115cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOperandRow::getValue" ); 116cdf0e10cSrcweir OSL_ENSURE(m_pRow.isValid() && m_nRowPos < m_pRow->get().size(),"Invalid RowPos is >= vector.size()"); 117cdf0e10cSrcweir return (m_pRow->get())[m_nRowPos]->getValue(); 118cdf0e10cSrcweir } 119cdf0e10cSrcweir 120cdf0e10cSrcweir // ----------------------------------------------------------------------------- 121cdf0e10cSrcweir void OOperandValue::setValue(const ORowSetValue& _rVal) 122cdf0e10cSrcweir { 123cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOperandValue::setValue" ); 124cdf0e10cSrcweir m_aValue = _rVal; 125cdf0e10cSrcweir } 126cdf0e10cSrcweir // ------------------------------------------------------------------------- 127cdf0e10cSrcweir sal_Bool OOperandAttr::isIndexed() const 128cdf0e10cSrcweir { 129cdf0e10cSrcweir return sal_False; 130cdf0e10cSrcweir } 131cdf0e10cSrcweir //------------------------------------------------------------------ 132cdf0e10cSrcweir OOperandParam::OOperandParam(OSQLParseNode* pNode, sal_Int32 _nPos) 133cdf0e10cSrcweir : OOperandRow(static_cast<sal_uInt16>(_nPos), DataType::VARCHAR) // Standard-Typ 134cdf0e10cSrcweir { 135cdf0e10cSrcweir OSL_ENSURE(SQL_ISRULE(pNode,parameter),"Argument ist kein Parameter"); 136cdf0e10cSrcweir OSL_ENSURE(pNode->count() > 0,"Fehler im Parse Tree"); 137cdf0e10cSrcweir OSQLParseNode *pMark = pNode->getChild(0); 138cdf0e10cSrcweir 139cdf0e10cSrcweir String aParameterName; 140cdf0e10cSrcweir if (SQL_ISPUNCTUATION(pMark,"?")) 141cdf0e10cSrcweir aParameterName = '?'; 142cdf0e10cSrcweir else if (SQL_ISPUNCTUATION(pMark,":")) 143cdf0e10cSrcweir aParameterName = pNode->getChild(1)->getTokenValue(); 144cdf0e10cSrcweir else 145cdf0e10cSrcweir { 146cdf0e10cSrcweir OSL_ASSERT("Fehler im Parse Tree"); 147cdf0e10cSrcweir } 148cdf0e10cSrcweir 149cdf0e10cSrcweir // Parameter-Column aufsetzen mit defult typ, kann zu einem spaeteren Zeitpunkt ueber DescribeParameter 150cdf0e10cSrcweir // genauer spezifiziert werden 151cdf0e10cSrcweir 152cdf0e10cSrcweir // Identitaet merken (hier eigentlich nicht erforderlich, aber aus 153cdf0e10cSrcweir // Symmetriegruenden ...) 154cdf0e10cSrcweir 155cdf0e10cSrcweir // todo 156cdf0e10cSrcweir // OColumn* pColumn = new OFILEColumn(aParameterName,eDBType,255,0,SQL_FLAGS_NULLALLOWED); 157cdf0e10cSrcweir // rParamColumns->AddColumn(pColumn); 158cdf0e10cSrcweir 159cdf0e10cSrcweir // der Wert wird erst kurz vor der Auswertung gesetzt 160cdf0e10cSrcweir } 161cdf0e10cSrcweir 162cdf0e10cSrcweir 163cdf0e10cSrcweir //------------------------------------------------------------------ 164cdf0e10cSrcweir const ORowSetValue& OOperandValue::getValue() const 165cdf0e10cSrcweir { 166cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOperandValue::getValue" ); 167cdf0e10cSrcweir return m_aValue; 168cdf0e10cSrcweir } 169cdf0e10cSrcweir 170cdf0e10cSrcweir //------------------------------------------------------------------ 171cdf0e10cSrcweir OOperandConst::OOperandConst(const OSQLParseNode& rColumnRef, const rtl::OUString& aStrValue) 172cdf0e10cSrcweir { 173cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOperandConst::OOperandConst" ); 174cdf0e10cSrcweir switch (rColumnRef.getNodeType()) 175cdf0e10cSrcweir { 176cdf0e10cSrcweir case SQL_NODE_STRING: 177cdf0e10cSrcweir m_aValue = aStrValue; 178cdf0e10cSrcweir m_eDBType = DataType::VARCHAR; 179cdf0e10cSrcweir m_aValue.setBound(sal_True); 180cdf0e10cSrcweir return; 181cdf0e10cSrcweir case SQL_NODE_INTNUM: 182cdf0e10cSrcweir case SQL_NODE_APPROXNUM: 183cdf0e10cSrcweir { 184cdf0e10cSrcweir m_aValue = aStrValue.toDouble(); 185cdf0e10cSrcweir m_eDBType = DataType::DOUBLE; 186cdf0e10cSrcweir m_aValue.setBound(sal_True); 187cdf0e10cSrcweir return; 188cdf0e10cSrcweir } 189cdf0e10cSrcweir default: 190cdf0e10cSrcweir break; 191cdf0e10cSrcweir } 192cdf0e10cSrcweir 193cdf0e10cSrcweir if (SQL_ISTOKEN(&rColumnRef,TRUE)) 194cdf0e10cSrcweir { 195cdf0e10cSrcweir m_aValue = 1.0; 196cdf0e10cSrcweir m_eDBType = DataType::BIT; 197cdf0e10cSrcweir } 198cdf0e10cSrcweir else if (SQL_ISTOKEN(&rColumnRef,FALSE)) 199cdf0e10cSrcweir { 200cdf0e10cSrcweir m_aValue = 0.0; 201cdf0e10cSrcweir m_eDBType = DataType::BIT; 202cdf0e10cSrcweir } 203cdf0e10cSrcweir else 204cdf0e10cSrcweir { 205cdf0e10cSrcweir OSL_ASSERT("Parse Error"); 206cdf0e10cSrcweir } 207cdf0e10cSrcweir m_aValue.setBound(sal_True); 208cdf0e10cSrcweir } 209cdf0e10cSrcweir 210cdf0e10cSrcweir ///////////////////////////////////////////////////////////////////////////////////////// 211cdf0e10cSrcweir // Implementation of the operators 212cdf0e10cSrcweir 213cdf0e10cSrcweir //------------------------------------------------------------------ 214cdf0e10cSrcweir sal_uInt16 OOperator::getRequestedOperands() const {return 2;} 215cdf0e10cSrcweir 216cdf0e10cSrcweir //------------------------------------------------------------------ 217cdf0e10cSrcweir sal_Bool OBoolOperator::operate(const OOperand*, const OOperand*) const 218cdf0e10cSrcweir { 219cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OBoolOperator::operate" ); 220cdf0e10cSrcweir return sal_False; 221cdf0e10cSrcweir } 222cdf0e10cSrcweir 223cdf0e10cSrcweir 224cdf0e10cSrcweir //------------------------------------------------------------------ 225cdf0e10cSrcweir void OBoolOperator::Exec(OCodeStack& rCodeStack) 226cdf0e10cSrcweir { 227cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OBoolOperator::Exec" ); 228cdf0e10cSrcweir OOperand *pRight = rCodeStack.top(); 229cdf0e10cSrcweir rCodeStack.pop(); 230cdf0e10cSrcweir OOperand *pLeft = rCodeStack.top(); 231cdf0e10cSrcweir rCodeStack.pop(); 232cdf0e10cSrcweir 233cdf0e10cSrcweir rCodeStack.push(new OOperandResultBOOL(operate(pLeft, pRight))); 234cdf0e10cSrcweir if (IS_TYPE(OOperandResult,pLeft)) 235cdf0e10cSrcweir delete pLeft; 236cdf0e10cSrcweir if (IS_TYPE(OOperandResult,pRight)) 237cdf0e10cSrcweir delete pRight; 238cdf0e10cSrcweir } 239cdf0e10cSrcweir //------------------------------------------------------------------ 240cdf0e10cSrcweir sal_Bool OOp_NOT::operate(const OOperand* pLeft, const OOperand* ) const 241cdf0e10cSrcweir { 242cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOp_AND::operate" ); 243cdf0e10cSrcweir return !pLeft->isValid(); 244cdf0e10cSrcweir } 245cdf0e10cSrcweir //------------------------------------------------------------------ 246cdf0e10cSrcweir void OOp_NOT::Exec(OCodeStack& rCodeStack) 247cdf0e10cSrcweir { 248cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOp_ISNULL::Exec" ); 249cdf0e10cSrcweir OOperand* pOperand = rCodeStack.top(); 250cdf0e10cSrcweir rCodeStack.pop(); 251cdf0e10cSrcweir 252cdf0e10cSrcweir rCodeStack.push(new OOperandResultBOOL(operate(pOperand))); 253cdf0e10cSrcweir if (IS_TYPE(OOperandResult,pOperand)) 254cdf0e10cSrcweir delete pOperand; 255cdf0e10cSrcweir } 256cdf0e10cSrcweir //------------------------------------------------------------------ 257cdf0e10cSrcweir sal_uInt16 OOp_NOT::getRequestedOperands() const 258cdf0e10cSrcweir { 259cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOp_NOT::getRequestedOperands" ); 260cdf0e10cSrcweir return 1; 261cdf0e10cSrcweir } 262cdf0e10cSrcweir 263cdf0e10cSrcweir //------------------------------------------------------------------ 264cdf0e10cSrcweir sal_Bool OOp_AND::operate(const OOperand* pLeft, const OOperand* pRight) const 265cdf0e10cSrcweir { 266cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOp_AND::operate" ); 267cdf0e10cSrcweir return pLeft->isValid() && pRight->isValid(); 268cdf0e10cSrcweir } 269cdf0e10cSrcweir 270cdf0e10cSrcweir //------------------------------------------------------------------ 271cdf0e10cSrcweir sal_Bool OOp_OR::operate(const OOperand* pLeft, const OOperand* pRight) const 272cdf0e10cSrcweir { 273cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOp_OR::operate" ); 274cdf0e10cSrcweir return pLeft->isValid() || pRight->isValid(); 275cdf0e10cSrcweir } 276cdf0e10cSrcweir 277cdf0e10cSrcweir //------------------------------------------------------------------ 278cdf0e10cSrcweir sal_uInt16 OOp_ISNULL::getRequestedOperands() const 279cdf0e10cSrcweir { 280cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOp_ISNULL::getRequestedOperands" ); 281cdf0e10cSrcweir return 1; 282cdf0e10cSrcweir } 283cdf0e10cSrcweir 284cdf0e10cSrcweir //------------------------------------------------------------------ 285cdf0e10cSrcweir void OOp_ISNULL::Exec(OCodeStack& rCodeStack) 286cdf0e10cSrcweir { 287cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOp_ISNULL::Exec" ); 288cdf0e10cSrcweir OOperand* pOperand = rCodeStack.top(); 289cdf0e10cSrcweir rCodeStack.pop(); 290cdf0e10cSrcweir 291cdf0e10cSrcweir rCodeStack.push(new OOperandResultBOOL(operate(pOperand))); 292cdf0e10cSrcweir if (IS_TYPE(OOperandResult,pOperand)) 293cdf0e10cSrcweir delete pOperand; 294cdf0e10cSrcweir } 295cdf0e10cSrcweir 296cdf0e10cSrcweir //------------------------------------------------------------------ 297cdf0e10cSrcweir sal_Bool OOp_ISNULL::operate(const OOperand* pOperand, const OOperand*) const 298cdf0e10cSrcweir { 299cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOp_ISNULL::operate" ); 300cdf0e10cSrcweir return pOperand->getValue().isNull(); 301cdf0e10cSrcweir } 302cdf0e10cSrcweir 303cdf0e10cSrcweir //------------------------------------------------------------------ 304cdf0e10cSrcweir sal_Bool OOp_ISNOTNULL::operate(const OOperand* pOperand, const OOperand*) const 305cdf0e10cSrcweir { 306cdf0e10cSrcweir return !OOp_ISNULL::operate(pOperand); 307cdf0e10cSrcweir } 308cdf0e10cSrcweir 309cdf0e10cSrcweir //------------------------------------------------------------------ 310cdf0e10cSrcweir sal_Bool OOp_LIKE::operate(const OOperand* pLeft, const OOperand* pRight) const 311cdf0e10cSrcweir { 312cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOp_ISNULL::operate" ); 313cdf0e10cSrcweir sal_Bool bMatch; 314cdf0e10cSrcweir ORowSetValue aLH(pLeft->getValue()); 315cdf0e10cSrcweir ORowSetValue aRH(pRight->getValue()); 316cdf0e10cSrcweir 317cdf0e10cSrcweir if (aLH.isNull() || aRH.isNull()) 318cdf0e10cSrcweir bMatch = sal_False; 319cdf0e10cSrcweir else 320cdf0e10cSrcweir { 321cdf0e10cSrcweir bMatch = match(aRH.getString(), aLH.getString(), cEscape); 322cdf0e10cSrcweir } 323cdf0e10cSrcweir return bMatch; 324cdf0e10cSrcweir } 325cdf0e10cSrcweir 326cdf0e10cSrcweir //------------------------------------------------------------------ 327cdf0e10cSrcweir sal_Bool OOp_NOTLIKE::operate(const OOperand* pLeft, const OOperand* pRight) const 328cdf0e10cSrcweir { 329cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOp_NOTLIKE::operate" ); 330cdf0e10cSrcweir return !OOp_LIKE::operate(pLeft, pRight); 331cdf0e10cSrcweir } 332cdf0e10cSrcweir 333cdf0e10cSrcweir //------------------------------------------------------------------ 334cdf0e10cSrcweir sal_Bool OOp_COMPARE::operate(const OOperand* pLeft, const OOperand* pRight) const 335cdf0e10cSrcweir { 336cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOp_COMPARE::operate" ); 337cdf0e10cSrcweir ORowSetValue aLH(pLeft->getValue()); 338cdf0e10cSrcweir ORowSetValue aRH(pRight->getValue()); 339cdf0e10cSrcweir 340cdf0e10cSrcweir if (aLH.isNull() || aRH.isNull()) // if (!aLH.getValue() || !aRH.getValue()) 341cdf0e10cSrcweir return sal_False; 342cdf0e10cSrcweir 343cdf0e10cSrcweir sal_Bool bResult = sal_False; 344cdf0e10cSrcweir sal_Int32 eDBType = pLeft->getDBType(); 345cdf0e10cSrcweir 346cdf0e10cSrcweir // Vergleich (je nach Datentyp): 347cdf0e10cSrcweir switch (eDBType) 348cdf0e10cSrcweir { 349cdf0e10cSrcweir case DataType::CHAR: 350cdf0e10cSrcweir case DataType::VARCHAR: 351cdf0e10cSrcweir case DataType::LONGVARCHAR: 352cdf0e10cSrcweir { 353cdf0e10cSrcweir rtl::OUString sLH = aLH, sRH = aRH; 354cdf0e10cSrcweir sal_Int32 nRes = rtl_ustr_compareIgnoreAsciiCase_WithLength 355cdf0e10cSrcweir ( 356cdf0e10cSrcweir sLH.pData->buffer, 357cdf0e10cSrcweir sLH.pData->length, 358cdf0e10cSrcweir sRH.pData->buffer, 359cdf0e10cSrcweir sRH.pData->length ); 360cdf0e10cSrcweir switch(aPredicateType) 361cdf0e10cSrcweir { 362cdf0e10cSrcweir case SQLFilterOperator::EQUAL: bResult = (nRes == 0); break; 363cdf0e10cSrcweir case SQLFilterOperator::NOT_EQUAL: bResult = (nRes != 0); break; 364cdf0e10cSrcweir case SQLFilterOperator::LESS: bResult = (nRes < 0); break; 365cdf0e10cSrcweir case SQLFilterOperator::LESS_EQUAL: bResult = (nRes <= 0); break; 366cdf0e10cSrcweir case SQLFilterOperator::GREATER: bResult = (nRes > 0); break; 367cdf0e10cSrcweir case SQLFilterOperator::GREATER_EQUAL: bResult = (nRes >= 0); break; 368cdf0e10cSrcweir default: bResult = sal_False; 369cdf0e10cSrcweir } 370cdf0e10cSrcweir } break; 371cdf0e10cSrcweir case DataType::TINYINT: 372cdf0e10cSrcweir case DataType::SMALLINT: 373cdf0e10cSrcweir case DataType::INTEGER: 374cdf0e10cSrcweir case DataType::DECIMAL: 375cdf0e10cSrcweir case DataType::NUMERIC: 376cdf0e10cSrcweir case DataType::REAL: 377cdf0e10cSrcweir case DataType::DOUBLE: 378cdf0e10cSrcweir case DataType::BIT: 379cdf0e10cSrcweir case DataType::TIMESTAMP: 380cdf0e10cSrcweir case DataType::DATE: 381cdf0e10cSrcweir case DataType::TIME: 382cdf0e10cSrcweir { 383cdf0e10cSrcweir double n = aLH ,m = aRH; 384cdf0e10cSrcweir 385cdf0e10cSrcweir switch (aPredicateType) 386cdf0e10cSrcweir { 387cdf0e10cSrcweir case SQLFilterOperator::EQUAL: bResult = (n == m); break; 388cdf0e10cSrcweir case SQLFilterOperator::LIKE: bResult = (n == m); break; 389cdf0e10cSrcweir case SQLFilterOperator::NOT_EQUAL: bResult = (n != m); break; 390cdf0e10cSrcweir case SQLFilterOperator::NOT_LIKE: bResult = (n != m); break; 391cdf0e10cSrcweir case SQLFilterOperator::LESS: bResult = (n < m); break; 392cdf0e10cSrcweir case SQLFilterOperator::LESS_EQUAL: bResult = (n <= m); break; 393cdf0e10cSrcweir case SQLFilterOperator::GREATER: bResult = (n > m); break; 394cdf0e10cSrcweir case SQLFilterOperator::GREATER_EQUAL: bResult = (n >= m); break; 395cdf0e10cSrcweir default: bResult = sal_False; 396cdf0e10cSrcweir } 397cdf0e10cSrcweir } break; 398cdf0e10cSrcweir default: 399cdf0e10cSrcweir bResult = aLH == aRH; 400cdf0e10cSrcweir } 401cdf0e10cSrcweir return bResult; 402cdf0e10cSrcweir } 403cdf0e10cSrcweir 404cdf0e10cSrcweir //------------------------------------------------------------------ 405cdf0e10cSrcweir void ONumOperator::Exec(OCodeStack& rCodeStack) 406cdf0e10cSrcweir { 407cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "ONumOperator::Exec" ); 408cdf0e10cSrcweir 409cdf0e10cSrcweir OOperand *pRight = rCodeStack.top(); 410cdf0e10cSrcweir rCodeStack.pop(); 411cdf0e10cSrcweir OOperand *pLeft = rCodeStack.top(); 412cdf0e10cSrcweir rCodeStack.pop(); 413cdf0e10cSrcweir 414cdf0e10cSrcweir rCodeStack.push(new OOperandResultNUM(operate(pLeft->getValue(), pRight->getValue()))); 415cdf0e10cSrcweir if (IS_TYPE(OOperandResult,pLeft)) 416cdf0e10cSrcweir delete pLeft; 417cdf0e10cSrcweir if (IS_TYPE(OOperandResult,pRight)) 418cdf0e10cSrcweir delete pRight; 419cdf0e10cSrcweir } 420cdf0e10cSrcweir //------------------------------------------------------------------ 421cdf0e10cSrcweir double OOp_ADD::operate(const double& fLeft,const double& fRight) const 422cdf0e10cSrcweir { 423cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOp_ADD::operate" ); 424cdf0e10cSrcweir return fLeft + fRight; 425cdf0e10cSrcweir } 426cdf0e10cSrcweir 427cdf0e10cSrcweir //------------------------------------------------------------------ 428cdf0e10cSrcweir double OOp_SUB::operate(const double& fLeft,const double& fRight) const 429cdf0e10cSrcweir { 430cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOp_SUB::operate" ); 431cdf0e10cSrcweir return fLeft - fRight; 432cdf0e10cSrcweir } 433cdf0e10cSrcweir 434cdf0e10cSrcweir //------------------------------------------------------------------ 435cdf0e10cSrcweir double OOp_MUL::operate(const double& fLeft,const double& fRight) const 436cdf0e10cSrcweir { 437cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOp_MUL::operate" ); 438cdf0e10cSrcweir return fLeft * fRight; 439cdf0e10cSrcweir } 440cdf0e10cSrcweir 441cdf0e10cSrcweir //------------------------------------------------------------------ 442cdf0e10cSrcweir double OOp_DIV::operate(const double& fLeft,const double& fRight) const 443cdf0e10cSrcweir { 444cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOp_DIV::operate" ); 445cdf0e10cSrcweir return fLeft / fRight; 446cdf0e10cSrcweir } 447cdf0e10cSrcweir // ----------------------------------------------------------------------------- 448cdf0e10cSrcweir OEvaluateSet* OOperandAttr::preProcess(OBoolOperator* /*pOp*/, OOperand* /*pRight*/) 449cdf0e10cSrcweir { 450cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOperandAttr::preProcess" ); 451cdf0e10cSrcweir return NULL; 452cdf0e10cSrcweir } 453cdf0e10cSrcweir //------------------------------------------------------------------ 454cdf0e10cSrcweir void ONthOperator::Exec(OCodeStack& rCodeStack) 455cdf0e10cSrcweir { 456cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "ONthOperator::Exec" ); 457cdf0e10cSrcweir ::std::vector<ORowSetValue> aValues; 458cdf0e10cSrcweir ::std::vector<OOperand*> aOperands; 459cdf0e10cSrcweir OOperand* pOperand; 460cdf0e10cSrcweir do 461cdf0e10cSrcweir { 462cdf0e10cSrcweir OSL_ENSURE(!rCodeStack.empty(),"Stack must be none empty!"); 463cdf0e10cSrcweir pOperand = rCodeStack.top(); 464cdf0e10cSrcweir rCodeStack.pop(); 465cdf0e10cSrcweir if ( !IS_TYPE(OStopOperand,pOperand) ) 466cdf0e10cSrcweir aValues.push_back( pOperand->getValue() ); 467cdf0e10cSrcweir aOperands.push_back( pOperand ); 468cdf0e10cSrcweir } 469cdf0e10cSrcweir while ( !IS_TYPE(OStopOperand,pOperand) ); 470cdf0e10cSrcweir 471cdf0e10cSrcweir rCodeStack.push(new OOperandResult(operate(aValues))); 472cdf0e10cSrcweir 473cdf0e10cSrcweir ::std::vector<OOperand*>::iterator aIter = aOperands.begin(); 474cdf0e10cSrcweir ::std::vector<OOperand*>::iterator aEnd = aOperands.end(); 475cdf0e10cSrcweir for (; aIter != aEnd; ++aIter) 476cdf0e10cSrcweir { 477cdf0e10cSrcweir if (IS_TYPE(OOperandResult,*aIter)) 478cdf0e10cSrcweir delete *aIter; 479cdf0e10cSrcweir } 480cdf0e10cSrcweir } 481cdf0e10cSrcweir //------------------------------------------------------------------ 482cdf0e10cSrcweir void OBinaryOperator::Exec(OCodeStack& rCodeStack) 483cdf0e10cSrcweir { 484cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OBinaryOperator::Exec" ); 485cdf0e10cSrcweir OOperand *pRight = rCodeStack.top(); 486cdf0e10cSrcweir rCodeStack.pop(); 487cdf0e10cSrcweir OOperand *pLeft = rCodeStack.top(); 488cdf0e10cSrcweir rCodeStack.pop(); 489cdf0e10cSrcweir 490cdf0e10cSrcweir if ( !rCodeStack.empty() && IS_TYPE(OStopOperand,rCodeStack.top()) ) 491cdf0e10cSrcweir rCodeStack.pop(); 492cdf0e10cSrcweir 493cdf0e10cSrcweir rCodeStack.push(new OOperandResult(operate(pLeft->getValue(),pRight->getValue()))); 494cdf0e10cSrcweir if (IS_TYPE(OOperandResult,pRight)) 495cdf0e10cSrcweir delete pRight; 496cdf0e10cSrcweir if (IS_TYPE(OOperandResult,pLeft)) 497cdf0e10cSrcweir delete pLeft; 498cdf0e10cSrcweir } 499cdf0e10cSrcweir //------------------------------------------------------------------ 500cdf0e10cSrcweir void OUnaryOperator::Exec(OCodeStack& rCodeStack) 501cdf0e10cSrcweir { 502cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OUnaryOperator::Exec" ); 503cdf0e10cSrcweir OSL_ENSURE(!rCodeStack.empty(),"Stack is empty!"); 504cdf0e10cSrcweir OOperand* pOperand = rCodeStack.top(); 505cdf0e10cSrcweir rCodeStack.pop(); 506cdf0e10cSrcweir 507cdf0e10cSrcweir rCodeStack.push(new OOperandResult(operate(pOperand->getValue()))); 508cdf0e10cSrcweir if (IS_TYPE(OOperandResult,pOperand)) 509cdf0e10cSrcweir delete pOperand; 510cdf0e10cSrcweir } 511cdf0e10cSrcweir // ----------------------------------------------------------------------------- 512cdf0e10cSrcweir sal_uInt16 OUnaryOperator::getRequestedOperands() const {return 1;} 513cdf0e10cSrcweir 514cdf0e10cSrcweir 515cdf0e10cSrcweir 516