1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_connectivity.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir 32*cdf0e10cSrcweir #include <connectivity/sqlnode.hxx> 33*cdf0e10cSrcweir #include <connectivity/sqlerror.hxx> 34*cdf0e10cSrcweir #include <internalnode.hxx> 35*cdf0e10cSrcweir #define YYBISON 1 36*cdf0e10cSrcweir #ifndef BISON_INCLUDED 37*cdf0e10cSrcweir #define BISON_INCLUDED 38*cdf0e10cSrcweir #include <sqlbison.hxx> 39*cdf0e10cSrcweir #endif 40*cdf0e10cSrcweir #include <connectivity/sqlparse.hxx> 41*cdf0e10cSrcweir #include <com/sun/star/lang/Locale.hpp> 42*cdf0e10cSrcweir #include <com/sun/star/util/XNumberFormatter.hpp> 43*cdf0e10cSrcweir #include <com/sun/star/util/XNumberFormatTypes.hpp> 44*cdf0e10cSrcweir #include <com/sun/star/i18n/NumberFormatIndex.hpp> 45*cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp> 46*cdf0e10cSrcweir #include <com/sun/star/sdbc/XDatabaseMetaData.hpp> 47*cdf0e10cSrcweir #include <com/sun/star/sdbc/DataType.hpp> 48*cdf0e10cSrcweir #include <com/sun/star/sdb/XQueriesSupplier.hpp> 49*cdf0e10cSrcweir #include <com/sun/star/sdb/ErrorCondition.hpp> 50*cdf0e10cSrcweir #include <com/sun/star/util/XNumberFormatter.hpp> 51*cdf0e10cSrcweir #include <com/sun/star/util/XNumberFormatsSupplier.hpp> 52*cdf0e10cSrcweir #include <com/sun/star/util/XNumberFormats.hpp> 53*cdf0e10cSrcweir #include <com/sun/star/util/NumberFormat.hpp> 54*cdf0e10cSrcweir #include <com/sun/star/util/XNumberFormatTypes.hpp> 55*cdf0e10cSrcweir #include <com/sun/star/lang/Locale.hpp> 56*cdf0e10cSrcweir #include <com/sun/star/i18n/KParseType.hpp> 57*cdf0e10cSrcweir #include <com/sun/star/i18n/KParseTokens.hpp> 58*cdf0e10cSrcweir #include "connectivity/dbconversion.hxx" 59*cdf0e10cSrcweir #include <com/sun/star/util/DateTime.hpp> 60*cdf0e10cSrcweir #include <com/sun/star/util/Time.hpp> 61*cdf0e10cSrcweir #include <com/sun/star/util/Date.hpp> 62*cdf0e10cSrcweir #include "TConnection.hxx" 63*cdf0e10cSrcweir #include "sqlscan.hxx" 64*cdf0e10cSrcweir #include <comphelper/numbers.hxx> 65*cdf0e10cSrcweir #include <comphelper/processfactory.hxx> 66*cdf0e10cSrcweir #include <comphelper/stl_types.hxx> 67*cdf0e10cSrcweir #include "connectivity/dbtools.hxx" 68*cdf0e10cSrcweir #include "connectivity/dbmetadata.hxx" 69*cdf0e10cSrcweir #include "connectivity/sqlerror.hxx" 70*cdf0e10cSrcweir #include <tools/diagnose_ex.h> 71*cdf0e10cSrcweir #include <string.h> 72*cdf0e10cSrcweir #include <boost/bind.hpp> 73*cdf0e10cSrcweir #include <algorithm> 74*cdf0e10cSrcweir #include <functional> 75*cdf0e10cSrcweir #include <rtl/logfile.hxx> 76*cdf0e10cSrcweir #include <rtl/ustrbuf.hxx> 77*cdf0e10cSrcweir 78*cdf0e10cSrcweir using namespace ::com::sun::star::sdbc; 79*cdf0e10cSrcweir using namespace ::com::sun::star::util; 80*cdf0e10cSrcweir using namespace ::com::sun::star::beans; 81*cdf0e10cSrcweir using namespace ::com::sun::star::sdb; 82*cdf0e10cSrcweir using namespace ::com::sun::star::uno; 83*cdf0e10cSrcweir using namespace ::com::sun::star::lang; 84*cdf0e10cSrcweir using namespace ::com::sun::star::i18n; 85*cdf0e10cSrcweir using namespace ::com::sun::star; 86*cdf0e10cSrcweir using namespace ::osl; 87*cdf0e10cSrcweir using namespace ::dbtools; 88*cdf0e10cSrcweir using namespace ::comphelper; 89*cdf0e10cSrcweir 90*cdf0e10cSrcweir 91*cdf0e10cSrcweir extern int SQLyyparse (void); 92*cdf0e10cSrcweir extern ::rtl::OUString ConvertLikeToken(const ::connectivity::OSQLParseNode* pTokenNode, const ::connectivity::OSQLParseNode* pEscapeNode, sal_Bool bInternational); 93*cdf0e10cSrcweir extern void setParser( ::connectivity::OSQLParser* ); 94*cdf0e10cSrcweir 95*cdf0e10cSrcweir namespace 96*cdf0e10cSrcweir { 97*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 98*cdf0e10cSrcweir sal_Bool lcl_saveConvertToNumber(const Reference< XNumberFormatter > & _xFormatter,sal_Int32 _nKey,const ::rtl::OUString& _sValue,double& _nrValue) 99*cdf0e10cSrcweir { 100*cdf0e10cSrcweir sal_Bool bRet = sal_False; 101*cdf0e10cSrcweir try 102*cdf0e10cSrcweir { 103*cdf0e10cSrcweir _nrValue = _xFormatter->convertStringToNumber(_nKey, _sValue); 104*cdf0e10cSrcweir bRet = sal_True; 105*cdf0e10cSrcweir } 106*cdf0e10cSrcweir catch(Exception&) 107*cdf0e10cSrcweir { 108*cdf0e10cSrcweir } 109*cdf0e10cSrcweir return bRet; 110*cdf0e10cSrcweir } 111*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 112*cdf0e10cSrcweir void replaceAndReset(connectivity::OSQLParseNode*& _pResetNode,connectivity::OSQLParseNode* _pNewNode) 113*cdf0e10cSrcweir { 114*cdf0e10cSrcweir _pResetNode->getParent()->replace(_pResetNode, _pNewNode); 115*cdf0e10cSrcweir delete _pResetNode; 116*cdf0e10cSrcweir _pResetNode = _pNewNode; 117*cdf0e10cSrcweir } 118*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 119*cdf0e10cSrcweir /** quotes a string and search for quotes inside the string and replace them with the new quote 120*cdf0e10cSrcweir @param rValue 121*cdf0e10cSrcweir The value to be quoted. 122*cdf0e10cSrcweir @param rQuot 123*cdf0e10cSrcweir The quote 124*cdf0e10cSrcweir @param rQuotToReplace 125*cdf0e10cSrcweir The quote to replace with 126*cdf0e10cSrcweir @return 127*cdf0e10cSrcweir The quoted string. 128*cdf0e10cSrcweir */ 129*cdf0e10cSrcweir ::rtl::OUString SetQuotation(const ::rtl::OUString& rValue, const ::rtl::OUString& rQuot, const ::rtl::OUString& rQuotToReplace) 130*cdf0e10cSrcweir { 131*cdf0e10cSrcweir ::rtl::OUString rNewValue = rQuot; 132*cdf0e10cSrcweir rNewValue += rValue; 133*cdf0e10cSrcweir sal_Int32 nIndex = (sal_Int32)-1; // Quotes durch zweifache Quotes ersetzen, sonst kriegt der Parser Probleme 134*cdf0e10cSrcweir 135*cdf0e10cSrcweir if (rQuot.getLength()) 136*cdf0e10cSrcweir { 137*cdf0e10cSrcweir do 138*cdf0e10cSrcweir { 139*cdf0e10cSrcweir nIndex += 2; 140*cdf0e10cSrcweir nIndex = rNewValue.indexOf(rQuot,nIndex); 141*cdf0e10cSrcweir if(nIndex != -1) 142*cdf0e10cSrcweir rNewValue = rNewValue.replaceAt(nIndex,rQuot.getLength(),rQuotToReplace); 143*cdf0e10cSrcweir } while (nIndex != -1); 144*cdf0e10cSrcweir } 145*cdf0e10cSrcweir 146*cdf0e10cSrcweir rNewValue += rQuot; 147*cdf0e10cSrcweir return rNewValue; 148*cdf0e10cSrcweir } 149*cdf0e10cSrcweir } 150*cdf0e10cSrcweir 151*cdf0e10cSrcweir namespace connectivity 152*cdf0e10cSrcweir { 153*cdf0e10cSrcweir 154*cdf0e10cSrcweir //============================================================================= 155*cdf0e10cSrcweir struct OSQLParser_Data 156*cdf0e10cSrcweir { 157*cdf0e10cSrcweir ::com::sun::star::lang::Locale aLocale; 158*cdf0e10cSrcweir ::connectivity::SQLError aErrors; 159*cdf0e10cSrcweir 160*cdf0e10cSrcweir OSQLParser_Data( const Reference< XMultiServiceFactory >& _xServiceFactory ) 161*cdf0e10cSrcweir :aErrors( _xServiceFactory ) 162*cdf0e10cSrcweir { 163*cdf0e10cSrcweir } 164*cdf0e10cSrcweir }; 165*cdf0e10cSrcweir 166*cdf0e10cSrcweir //============================================================================= 167*cdf0e10cSrcweir //= SQLParseNodeParameter 168*cdf0e10cSrcweir //============================================================================= 169*cdf0e10cSrcweir //----------------------------------------------------------------------------- 170*cdf0e10cSrcweir SQLParseNodeParameter::SQLParseNodeParameter( const Reference< XConnection >& _rxConnection, 171*cdf0e10cSrcweir const Reference< XNumberFormatter >& _xFormatter, const Reference< XPropertySet >& _xField, 172*cdf0e10cSrcweir const Locale& _rLocale, const IParseContext* _pContext, 173*cdf0e10cSrcweir bool _bIntl, bool _bQuote, sal_Char _cDecSep, bool _bPredicate, bool _bParseToSDBC ) 174*cdf0e10cSrcweir :rLocale(_rLocale) 175*cdf0e10cSrcweir ,aMetaData( _rxConnection ) 176*cdf0e10cSrcweir ,pParser( NULL ) 177*cdf0e10cSrcweir ,pSubQueryHistory( new QueryNameSet ) 178*cdf0e10cSrcweir ,xFormatter(_xFormatter) 179*cdf0e10cSrcweir ,xField(_xField) 180*cdf0e10cSrcweir ,m_rContext( _pContext ? (const IParseContext&)(*_pContext) : (const IParseContext&)OSQLParser::s_aDefaultContext ) 181*cdf0e10cSrcweir ,cDecSep(_cDecSep) 182*cdf0e10cSrcweir ,bQuote(_bQuote) 183*cdf0e10cSrcweir ,bInternational(_bIntl) 184*cdf0e10cSrcweir ,bPredicate(_bPredicate) 185*cdf0e10cSrcweir ,bParseToSDBCLevel( _bParseToSDBC ) 186*cdf0e10cSrcweir { 187*cdf0e10cSrcweir } 188*cdf0e10cSrcweir 189*cdf0e10cSrcweir //----------------------------------------------------------------------------- 190*cdf0e10cSrcweir SQLParseNodeParameter::~SQLParseNodeParameter() 191*cdf0e10cSrcweir { 192*cdf0e10cSrcweir } 193*cdf0e10cSrcweir 194*cdf0e10cSrcweir //============================================================================= 195*cdf0e10cSrcweir //= OSQLParseNode 196*cdf0e10cSrcweir //============================================================================= 197*cdf0e10cSrcweir //----------------------------------------------------------------------------- 198*cdf0e10cSrcweir ::rtl::OUString OSQLParseNode::convertDateString(const SQLParseNodeParameter& rParam, const ::rtl::OUString& rString) const 199*cdf0e10cSrcweir { 200*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::convertDateString" ); 201*cdf0e10cSrcweir Date aDate = DBTypeConversion::toDate(rString); 202*cdf0e10cSrcweir Reference< XNumberFormatsSupplier > xSupplier(rParam.xFormatter->getNumberFormatsSupplier()); 203*cdf0e10cSrcweir Reference< XNumberFormatTypes > xTypes(xSupplier->getNumberFormats(), UNO_QUERY); 204*cdf0e10cSrcweir 205*cdf0e10cSrcweir double fDate = DBTypeConversion::toDouble(aDate,DBTypeConversion::getNULLDate(xSupplier)); 206*cdf0e10cSrcweir sal_Int32 nKey = xTypes->getStandardIndex(rParam.rLocale) + 36; // XXX hack 207*cdf0e10cSrcweir return rParam.xFormatter->convertNumberToString(nKey, fDate); 208*cdf0e10cSrcweir } 209*cdf0e10cSrcweir 210*cdf0e10cSrcweir //----------------------------------------------------------------------------- 211*cdf0e10cSrcweir ::rtl::OUString OSQLParseNode::convertDateTimeString(const SQLParseNodeParameter& rParam, const ::rtl::OUString& rString) const 212*cdf0e10cSrcweir { 213*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::convertDateTimeString" ); 214*cdf0e10cSrcweir DateTime aDate = DBTypeConversion::toDateTime(rString); 215*cdf0e10cSrcweir Reference< XNumberFormatsSupplier > xSupplier(rParam.xFormatter->getNumberFormatsSupplier()); 216*cdf0e10cSrcweir Reference< XNumberFormatTypes > xTypes(xSupplier->getNumberFormats(), UNO_QUERY); 217*cdf0e10cSrcweir 218*cdf0e10cSrcweir double fDateTime = DBTypeConversion::toDouble(aDate,DBTypeConversion::getNULLDate(xSupplier)); 219*cdf0e10cSrcweir sal_Int32 nKey = xTypes->getStandardIndex(rParam.rLocale) + 51; // XXX hack 220*cdf0e10cSrcweir return rParam.xFormatter->convertNumberToString(nKey, fDateTime); 221*cdf0e10cSrcweir } 222*cdf0e10cSrcweir 223*cdf0e10cSrcweir //----------------------------------------------------------------------------- 224*cdf0e10cSrcweir ::rtl::OUString OSQLParseNode::convertTimeString(const SQLParseNodeParameter& rParam, const ::rtl::OUString& rString) const 225*cdf0e10cSrcweir { 226*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::convertTimeString" ); 227*cdf0e10cSrcweir Time aTime = DBTypeConversion::toTime(rString); 228*cdf0e10cSrcweir Reference< XNumberFormatsSupplier > xSupplier(rParam.xFormatter->getNumberFormatsSupplier()); 229*cdf0e10cSrcweir 230*cdf0e10cSrcweir Reference< XNumberFormatTypes > xTypes(xSupplier->getNumberFormats(), UNO_QUERY); 231*cdf0e10cSrcweir 232*cdf0e10cSrcweir double fTime = DBTypeConversion::toDouble(aTime); 233*cdf0e10cSrcweir sal_Int32 nKey = xTypes->getStandardIndex(rParam.rLocale) + 41; // XXX hack 234*cdf0e10cSrcweir return rParam.xFormatter->convertNumberToString(nKey, fTime); 235*cdf0e10cSrcweir } 236*cdf0e10cSrcweir 237*cdf0e10cSrcweir //----------------------------------------------------------------------------- 238*cdf0e10cSrcweir void OSQLParseNode::parseNodeToStr(::rtl::OUString& rString, 239*cdf0e10cSrcweir const Reference< XConnection >& _rxConnection, 240*cdf0e10cSrcweir const IParseContext* pContext, 241*cdf0e10cSrcweir sal_Bool _bIntl, 242*cdf0e10cSrcweir sal_Bool _bQuote) const 243*cdf0e10cSrcweir { 244*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::parseNodeToStr" ); 245*cdf0e10cSrcweir 246*cdf0e10cSrcweir parseNodeToStr( 247*cdf0e10cSrcweir rString, _rxConnection, NULL, NULL, 248*cdf0e10cSrcweir pContext ? pContext->getPreferredLocale() : OParseContext::getDefaultLocale(), 249*cdf0e10cSrcweir pContext, _bIntl, _bQuote, '.', false, false ); 250*cdf0e10cSrcweir } 251*cdf0e10cSrcweir 252*cdf0e10cSrcweir //----------------------------------------------------------------------------- 253*cdf0e10cSrcweir void OSQLParseNode::parseNodeToPredicateStr(::rtl::OUString& rString, 254*cdf0e10cSrcweir const Reference< XConnection >& _rxConnection, 255*cdf0e10cSrcweir const Reference< XNumberFormatter > & xFormatter, 256*cdf0e10cSrcweir const ::com::sun::star::lang::Locale& rIntl, 257*cdf0e10cSrcweir sal_Char _cDec, 258*cdf0e10cSrcweir const IParseContext* pContext ) const 259*cdf0e10cSrcweir { 260*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::parseNodeToPredicateStr" ); 261*cdf0e10cSrcweir 262*cdf0e10cSrcweir OSL_ENSURE(xFormatter.is(), "OSQLParseNode::parseNodeToPredicateStr:: no formatter!"); 263*cdf0e10cSrcweir 264*cdf0e10cSrcweir if (xFormatter.is()) 265*cdf0e10cSrcweir parseNodeToStr(rString, _rxConnection, xFormatter, NULL, rIntl, pContext, sal_True, sal_True, _cDec, true, false); 266*cdf0e10cSrcweir } 267*cdf0e10cSrcweir 268*cdf0e10cSrcweir //----------------------------------------------------------------------------- 269*cdf0e10cSrcweir void OSQLParseNode::parseNodeToPredicateStr(::rtl::OUString& rString, 270*cdf0e10cSrcweir const Reference< XConnection > & _rxConnection, 271*cdf0e10cSrcweir const Reference< XNumberFormatter > & xFormatter, 272*cdf0e10cSrcweir const Reference< XPropertySet > & _xField, 273*cdf0e10cSrcweir const ::com::sun::star::lang::Locale& rIntl, 274*cdf0e10cSrcweir sal_Char _cDec, 275*cdf0e10cSrcweir const IParseContext* pContext ) const 276*cdf0e10cSrcweir { 277*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::parseNodeToPredicateStr" ); 278*cdf0e10cSrcweir 279*cdf0e10cSrcweir OSL_ENSURE(xFormatter.is(), "OSQLParseNode::parseNodeToPredicateStr:: no formatter!"); 280*cdf0e10cSrcweir 281*cdf0e10cSrcweir if (xFormatter.is()) 282*cdf0e10cSrcweir parseNodeToStr( rString, _rxConnection, xFormatter, _xField, rIntl, pContext, true, true, _cDec, true, false ); 283*cdf0e10cSrcweir } 284*cdf0e10cSrcweir 285*cdf0e10cSrcweir //----------------------------------------------------------------------------- 286*cdf0e10cSrcweir void OSQLParseNode::parseNodeToStr(::rtl::OUString& rString, 287*cdf0e10cSrcweir const Reference< XConnection > & _rxConnection, 288*cdf0e10cSrcweir const Reference< XNumberFormatter > & xFormatter, 289*cdf0e10cSrcweir const Reference< XPropertySet > & _xField, 290*cdf0e10cSrcweir const ::com::sun::star::lang::Locale& rIntl, 291*cdf0e10cSrcweir const IParseContext* pContext, 292*cdf0e10cSrcweir bool _bIntl, 293*cdf0e10cSrcweir bool _bQuote, 294*cdf0e10cSrcweir sal_Char _cDecSep, 295*cdf0e10cSrcweir bool _bPredicate, 296*cdf0e10cSrcweir bool _bSubstitute) const 297*cdf0e10cSrcweir { 298*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::parseNodeToStr" ); 299*cdf0e10cSrcweir 300*cdf0e10cSrcweir OSL_ENSURE( _rxConnection.is(), "OSQLParseNode::parseNodeToStr: invalid connection!" ); 301*cdf0e10cSrcweir 302*cdf0e10cSrcweir if ( _rxConnection.is() ) 303*cdf0e10cSrcweir { 304*cdf0e10cSrcweir ::rtl::OUStringBuffer sBuffer = rString; 305*cdf0e10cSrcweir try 306*cdf0e10cSrcweir { 307*cdf0e10cSrcweir OSQLParseNode::impl_parseNodeToString_throw( sBuffer, 308*cdf0e10cSrcweir SQLParseNodeParameter( 309*cdf0e10cSrcweir _rxConnection, xFormatter, _xField, rIntl, pContext, 310*cdf0e10cSrcweir _bIntl, _bQuote, _cDecSep, _bPredicate, _bSubstitute 311*cdf0e10cSrcweir ) ); 312*cdf0e10cSrcweir } 313*cdf0e10cSrcweir catch( const SQLException& ) 314*cdf0e10cSrcweir { 315*cdf0e10cSrcweir OSL_ENSURE( false, "OSQLParseNode::parseNodeToStr: this should not throw!" ); 316*cdf0e10cSrcweir // our callers don't expect this method to throw anything. The only known situation 317*cdf0e10cSrcweir // where impl_parseNodeToString_throw can throw is when there is a cyclic reference 318*cdf0e10cSrcweir // in the sub queries, but this cannot be the case here, as we do not parse to 319*cdf0e10cSrcweir // SDBC level. 320*cdf0e10cSrcweir } 321*cdf0e10cSrcweir rString = sBuffer.makeStringAndClear(); 322*cdf0e10cSrcweir } 323*cdf0e10cSrcweir } 324*cdf0e10cSrcweir //----------------------------------------------------------------------------- 325*cdf0e10cSrcweir bool OSQLParseNode::parseNodeToExecutableStatement( ::rtl::OUString& _out_rString, const Reference< XConnection >& _rxConnection, 326*cdf0e10cSrcweir OSQLParser& _rParser, ::com::sun::star::sdbc::SQLException* _pErrorHolder ) const 327*cdf0e10cSrcweir { 328*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::parseNodeToExecutableStatement" ); 329*cdf0e10cSrcweir OSL_PRECOND( _rxConnection.is(), "OSQLParseNode::parseNodeToExecutableStatement: invalid connection!" ); 330*cdf0e10cSrcweir SQLParseNodeParameter aParseParam( _rxConnection, 331*cdf0e10cSrcweir NULL, NULL, OParseContext::getDefaultLocale(), NULL, false, true, '.', false, true ); 332*cdf0e10cSrcweir 333*cdf0e10cSrcweir if ( aParseParam.aMetaData.supportsSubqueriesInFrom() ) 334*cdf0e10cSrcweir { 335*cdf0e10cSrcweir Reference< XQueriesSupplier > xSuppQueries( _rxConnection, UNO_QUERY ); 336*cdf0e10cSrcweir OSL_ENSURE( xSuppQueries.is(), "OSQLParseNode::parseNodeToExecutableStatement: cannot substitute everything without a QueriesSupplier!" ); 337*cdf0e10cSrcweir if ( xSuppQueries.is() ) 338*cdf0e10cSrcweir aParseParam.xQueries = xSuppQueries->getQueries(); 339*cdf0e10cSrcweir } 340*cdf0e10cSrcweir 341*cdf0e10cSrcweir aParseParam.pParser = &_rParser; 342*cdf0e10cSrcweir 343*cdf0e10cSrcweir _out_rString = ::rtl::OUString(); 344*cdf0e10cSrcweir ::rtl::OUStringBuffer sBuffer; 345*cdf0e10cSrcweir bool bSuccess = false; 346*cdf0e10cSrcweir try 347*cdf0e10cSrcweir { 348*cdf0e10cSrcweir impl_parseNodeToString_throw( sBuffer, aParseParam ); 349*cdf0e10cSrcweir bSuccess = true; 350*cdf0e10cSrcweir } 351*cdf0e10cSrcweir catch( const SQLException& e ) 352*cdf0e10cSrcweir { 353*cdf0e10cSrcweir if ( _pErrorHolder ) 354*cdf0e10cSrcweir *_pErrorHolder = e; 355*cdf0e10cSrcweir } 356*cdf0e10cSrcweir _out_rString = sBuffer.makeStringAndClear(); 357*cdf0e10cSrcweir return bSuccess; 358*cdf0e10cSrcweir } 359*cdf0e10cSrcweir 360*cdf0e10cSrcweir //----------------------------------------------------------------------------- 361*cdf0e10cSrcweir namespace 362*cdf0e10cSrcweir { 363*cdf0e10cSrcweir bool lcl_isAliasNamePresent( const OSQLParseNode& _rTableNameNode ) 364*cdf0e10cSrcweir { 365*cdf0e10cSrcweir return OSQLParseNode::getTableRange(_rTableNameNode.getParent()).getLength() != 0; 366*cdf0e10cSrcweir } 367*cdf0e10cSrcweir } 368*cdf0e10cSrcweir 369*cdf0e10cSrcweir //----------------------------------------------------------------------------- 370*cdf0e10cSrcweir void OSQLParseNode::impl_parseNodeToString_throw(::rtl::OUStringBuffer& rString, const SQLParseNodeParameter& rParam) const 371*cdf0e10cSrcweir { 372*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::getTableRange" ); 373*cdf0e10cSrcweir if ( isToken() ) 374*cdf0e10cSrcweir { 375*cdf0e10cSrcweir parseLeaf(rString,rParam); 376*cdf0e10cSrcweir return; 377*cdf0e10cSrcweir } 378*cdf0e10cSrcweir 379*cdf0e10cSrcweir // einmal auswerten wieviel Subtrees dieser Knoten besitzt 380*cdf0e10cSrcweir sal_uInt32 nCount = count(); 381*cdf0e10cSrcweir 382*cdf0e10cSrcweir bool bHandled = false; 383*cdf0e10cSrcweir switch ( getKnownRuleID() ) 384*cdf0e10cSrcweir { 385*cdf0e10cSrcweir // special handling for parameters 386*cdf0e10cSrcweir case parameter: 387*cdf0e10cSrcweir { 388*cdf0e10cSrcweir if(rString.getLength()) 389*cdf0e10cSrcweir rString.appendAscii(" "); 390*cdf0e10cSrcweir if (nCount == 1) // ? 391*cdf0e10cSrcweir m_aChildren[0]->impl_parseNodeToString_throw( rString, rParam ); 392*cdf0e10cSrcweir else if (nCount == 2) // :Name 393*cdf0e10cSrcweir { 394*cdf0e10cSrcweir m_aChildren[0]->impl_parseNodeToString_throw( rString, rParam ); 395*cdf0e10cSrcweir rString.append(m_aChildren[1]->m_aNodeValue); 396*cdf0e10cSrcweir } // [Name] 397*cdf0e10cSrcweir else 398*cdf0e10cSrcweir { 399*cdf0e10cSrcweir m_aChildren[0]->impl_parseNodeToString_throw( rString, rParam ); 400*cdf0e10cSrcweir rString.append(m_aChildren[1]->m_aNodeValue); 401*cdf0e10cSrcweir rString.append(m_aChildren[2]->m_aNodeValue); 402*cdf0e10cSrcweir } 403*cdf0e10cSrcweir bHandled = true; 404*cdf0e10cSrcweir } 405*cdf0e10cSrcweir break; 406*cdf0e10cSrcweir 407*cdf0e10cSrcweir // table refs 408*cdf0e10cSrcweir case table_ref: 409*cdf0e10cSrcweir if ( ( nCount == 2 ) || ( nCount == 3 ) || ( nCount == 5 ) ) 410*cdf0e10cSrcweir { 411*cdf0e10cSrcweir impl_parseTableRangeNodeToString_throw( rString, rParam ); 412*cdf0e10cSrcweir bHandled = true; 413*cdf0e10cSrcweir } 414*cdf0e10cSrcweir break; 415*cdf0e10cSrcweir 416*cdf0e10cSrcweir // table name - might be a query name 417*cdf0e10cSrcweir case table_name: 418*cdf0e10cSrcweir bHandled = impl_parseTableNameNodeToString_throw( rString, rParam ); 419*cdf0e10cSrcweir break; 420*cdf0e10cSrcweir 421*cdf0e10cSrcweir case as: 422*cdf0e10cSrcweir if ( rParam.aMetaData.generateASBeforeCorrelationName() ) 423*cdf0e10cSrcweir rString.append(::rtl::OUString::createFromAscii( " AS" )); 424*cdf0e10cSrcweir bHandled = true; 425*cdf0e10cSrcweir break; 426*cdf0e10cSrcweir 427*cdf0e10cSrcweir case like_predicate: 428*cdf0e10cSrcweir // je nachdem ob international angegeben wird oder nicht wird like anders behandelt 429*cdf0e10cSrcweir // interanational: *, ? sind Platzhalter 430*cdf0e10cSrcweir // sonst SQL92 konform: %, _ 431*cdf0e10cSrcweir impl_parseLikeNodeToString_throw( rString, rParam ); 432*cdf0e10cSrcweir bHandled = true; 433*cdf0e10cSrcweir break; 434*cdf0e10cSrcweir 435*cdf0e10cSrcweir case general_set_fct: 436*cdf0e10cSrcweir case set_fct_spec: 437*cdf0e10cSrcweir case position_exp: 438*cdf0e10cSrcweir case extract_exp: 439*cdf0e10cSrcweir case length_exp: 440*cdf0e10cSrcweir case char_value_fct: 441*cdf0e10cSrcweir { 442*cdf0e10cSrcweir if (!addDateValue(rString, rParam)) 443*cdf0e10cSrcweir { 444*cdf0e10cSrcweir // Funktionsname nicht quoten 445*cdf0e10cSrcweir SQLParseNodeParameter aNewParam(rParam); 446*cdf0e10cSrcweir aNewParam.bQuote = ( SQL_ISRULE(this,length_exp) || SQL_ISRULE(this,char_value_fct) ); 447*cdf0e10cSrcweir 448*cdf0e10cSrcweir m_aChildren[0]->impl_parseNodeToString_throw( rString, aNewParam ); 449*cdf0e10cSrcweir aNewParam.bQuote = rParam.bQuote; 450*cdf0e10cSrcweir //aNewParam.bPredicate = sal_False; // disable [ ] around names // look at i73215 451*cdf0e10cSrcweir ::rtl::OUStringBuffer aStringPara; 452*cdf0e10cSrcweir for (sal_uInt32 i=1; i<nCount; i++) 453*cdf0e10cSrcweir { 454*cdf0e10cSrcweir const OSQLParseNode * pSubTree = m_aChildren[i]; 455*cdf0e10cSrcweir if (pSubTree) 456*cdf0e10cSrcweir { 457*cdf0e10cSrcweir pSubTree->impl_parseNodeToString_throw( aStringPara, aNewParam ); 458*cdf0e10cSrcweir 459*cdf0e10cSrcweir // bei den CommaListen zwischen alle Subtrees Commas setzen 460*cdf0e10cSrcweir if ((m_eNodeType == SQL_NODE_COMMALISTRULE) && (i < (nCount - 1))) 461*cdf0e10cSrcweir aStringPara.appendAscii(","); 462*cdf0e10cSrcweir } 463*cdf0e10cSrcweir else 464*cdf0e10cSrcweir i++; 465*cdf0e10cSrcweir } 466*cdf0e10cSrcweir rString.append(aStringPara.makeStringAndClear()); 467*cdf0e10cSrcweir } 468*cdf0e10cSrcweir bHandled = true; 469*cdf0e10cSrcweir } 470*cdf0e10cSrcweir break; 471*cdf0e10cSrcweir default: 472*cdf0e10cSrcweir break; 473*cdf0e10cSrcweir } // switch ( getKnownRuleID() ) 474*cdf0e10cSrcweir 475*cdf0e10cSrcweir if ( !bHandled ) 476*cdf0e10cSrcweir { 477*cdf0e10cSrcweir for (OSQLParseNodes::const_iterator i = m_aChildren.begin(); 478*cdf0e10cSrcweir i != m_aChildren.end();) 479*cdf0e10cSrcweir { 480*cdf0e10cSrcweir const OSQLParseNode* pSubTree = *i; 481*cdf0e10cSrcweir if ( !pSubTree ) 482*cdf0e10cSrcweir { 483*cdf0e10cSrcweir ++i; 484*cdf0e10cSrcweir continue; 485*cdf0e10cSrcweir } 486*cdf0e10cSrcweir 487*cdf0e10cSrcweir SQLParseNodeParameter aNewParam(rParam); 488*cdf0e10cSrcweir 489*cdf0e10cSrcweir // don't replace the field for subqueries 490*cdf0e10cSrcweir if (rParam.xField.is() && SQL_ISRULE(pSubTree,subquery)) 491*cdf0e10cSrcweir aNewParam.xField = NULL; 492*cdf0e10cSrcweir 493*cdf0e10cSrcweir // if there is a field given we don't display the fieldname, if there is any 494*cdf0e10cSrcweir if (rParam.xField.is() && SQL_ISRULE(pSubTree,column_ref)) 495*cdf0e10cSrcweir { 496*cdf0e10cSrcweir sal_Bool bFilter = sal_False; 497*cdf0e10cSrcweir // retrieve the fields name 498*cdf0e10cSrcweir ::rtl::OUString aFieldName; 499*cdf0e10cSrcweir try 500*cdf0e10cSrcweir { 501*cdf0e10cSrcweir sal_Int32 nNamePropertyId = PROPERTY_ID_NAME; 502*cdf0e10cSrcweir if ( rParam.xField->getPropertySetInfo()->hasPropertyByName( OMetaConnection::getPropMap().getNameByIndex( PROPERTY_ID_REALNAME ) ) ) 503*cdf0e10cSrcweir nNamePropertyId = PROPERTY_ID_REALNAME; 504*cdf0e10cSrcweir rParam.xField->getPropertyValue( OMetaConnection::getPropMap().getNameByIndex( nNamePropertyId ) ) >>= aFieldName; 505*cdf0e10cSrcweir } 506*cdf0e10cSrcweir catch ( Exception& ) 507*cdf0e10cSrcweir { 508*cdf0e10cSrcweir } 509*cdf0e10cSrcweir 510*cdf0e10cSrcweir if(pSubTree->count()) 511*cdf0e10cSrcweir { 512*cdf0e10cSrcweir const OSQLParseNode* pCol = pSubTree->m_aChildren[pSubTree->count()-1]; 513*cdf0e10cSrcweir if ( ( SQL_ISRULE(pCol,column_val) 514*cdf0e10cSrcweir && pCol->getChild(0)->getTokenValue().equalsIgnoreAsciiCase(aFieldName) 515*cdf0e10cSrcweir ) 516*cdf0e10cSrcweir || pCol->getTokenValue().equalsIgnoreAsciiCase(aFieldName) 517*cdf0e10cSrcweir ) 518*cdf0e10cSrcweir bFilter = sal_True; 519*cdf0e10cSrcweir } 520*cdf0e10cSrcweir 521*cdf0e10cSrcweir // ok we found the field, if the following node is the 522*cdf0e10cSrcweir // comparision operator '=' we filter it as well 523*cdf0e10cSrcweir if (bFilter) 524*cdf0e10cSrcweir { 525*cdf0e10cSrcweir if (SQL_ISRULE(this, comparison_predicate)) 526*cdf0e10cSrcweir { 527*cdf0e10cSrcweir ++i; 528*cdf0e10cSrcweir if(i != m_aChildren.end()) 529*cdf0e10cSrcweir { 530*cdf0e10cSrcweir pSubTree = *i; 531*cdf0e10cSrcweir if (pSubTree && pSubTree->getNodeType() == SQL_NODE_EQUAL) 532*cdf0e10cSrcweir i++; 533*cdf0e10cSrcweir } 534*cdf0e10cSrcweir } 535*cdf0e10cSrcweir else 536*cdf0e10cSrcweir i++; 537*cdf0e10cSrcweir } 538*cdf0e10cSrcweir else 539*cdf0e10cSrcweir { 540*cdf0e10cSrcweir pSubTree->impl_parseNodeToString_throw( rString, aNewParam ); 541*cdf0e10cSrcweir i++; 542*cdf0e10cSrcweir 543*cdf0e10cSrcweir // bei den CommaListen zwischen alle Subtrees Commas setzen 544*cdf0e10cSrcweir if ((m_eNodeType == SQL_NODE_COMMALISTRULE) && (i != m_aChildren.end())) 545*cdf0e10cSrcweir rString.appendAscii(","); 546*cdf0e10cSrcweir } 547*cdf0e10cSrcweir } 548*cdf0e10cSrcweir else 549*cdf0e10cSrcweir { 550*cdf0e10cSrcweir pSubTree->impl_parseNodeToString_throw( rString, aNewParam ); 551*cdf0e10cSrcweir i++; 552*cdf0e10cSrcweir 553*cdf0e10cSrcweir // bei den CommaListen zwischen alle Subtrees Commas setzen 554*cdf0e10cSrcweir if ((m_eNodeType == SQL_NODE_COMMALISTRULE) && (i != m_aChildren.end())) 555*cdf0e10cSrcweir { 556*cdf0e10cSrcweir if (SQL_ISRULE(this,value_exp_commalist) && rParam.bPredicate) 557*cdf0e10cSrcweir rString.appendAscii(";"); 558*cdf0e10cSrcweir else 559*cdf0e10cSrcweir rString.appendAscii(","); 560*cdf0e10cSrcweir } 561*cdf0e10cSrcweir } 562*cdf0e10cSrcweir } 563*cdf0e10cSrcweir } 564*cdf0e10cSrcweir } 565*cdf0e10cSrcweir 566*cdf0e10cSrcweir //----------------------------------------------------------------------------- 567*cdf0e10cSrcweir bool OSQLParseNode::impl_parseTableNameNodeToString_throw( ::rtl::OUStringBuffer& rString, const SQLParseNodeParameter& rParam ) const 568*cdf0e10cSrcweir { 569*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::impl_parseTableNameNodeToString_throw" ); 570*cdf0e10cSrcweir // is the table_name part of a table_ref? 571*cdf0e10cSrcweir OSL_ENSURE( getParent(), "OSQLParseNode::impl_parseTableNameNodeToString_throw: table_name without parent?" ); 572*cdf0e10cSrcweir if ( !getParent() || ( getParent()->getKnownRuleID() != table_ref ) ) 573*cdf0e10cSrcweir return false; 574*cdf0e10cSrcweir 575*cdf0e10cSrcweir // if it's a query, maybe we need to substitute the SQL statement ... 576*cdf0e10cSrcweir if ( !rParam.bParseToSDBCLevel ) 577*cdf0e10cSrcweir return false; 578*cdf0e10cSrcweir 579*cdf0e10cSrcweir if ( !rParam.xQueries.is() ) 580*cdf0e10cSrcweir // connection does not support queries in queries, or was no query supplier 581*cdf0e10cSrcweir return false; 582*cdf0e10cSrcweir 583*cdf0e10cSrcweir try 584*cdf0e10cSrcweir { 585*cdf0e10cSrcweir ::rtl::OUString sTableOrQueryName( getChild(0)->getTokenValue() ); 586*cdf0e10cSrcweir bool bIsQuery = rParam.xQueries->hasByName( sTableOrQueryName ); 587*cdf0e10cSrcweir if ( !bIsQuery ) 588*cdf0e10cSrcweir return false; 589*cdf0e10cSrcweir 590*cdf0e10cSrcweir // avoid recursion (e.g. "foo" defined as "SELECT * FROM bar" and "bar" defined as "SELECT * FROM foo". 591*cdf0e10cSrcweir if ( rParam.pSubQueryHistory->find( sTableOrQueryName ) != rParam.pSubQueryHistory->end() ) 592*cdf0e10cSrcweir { 593*cdf0e10cSrcweir ::rtl::OUString sMessage( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "cyclic sub queries" ) ) ); 594*cdf0e10cSrcweir OSL_ENSURE( rParam.pParser, "OSQLParseNode::impl_parseTableNameNodeToString_throw: no parser?" ); 595*cdf0e10cSrcweir if ( rParam.pParser ) 596*cdf0e10cSrcweir { 597*cdf0e10cSrcweir const SQLError& rErrors( rParam.pParser->getErrorHelper() ); 598*cdf0e10cSrcweir rErrors.raiseException( sdb::ErrorCondition::PARSER_CYCLIC_SUB_QUERIES ); 599*cdf0e10cSrcweir } 600*cdf0e10cSrcweir else 601*cdf0e10cSrcweir { 602*cdf0e10cSrcweir SQLError aErrors( ::comphelper::getProcessServiceFactory() ); 603*cdf0e10cSrcweir aErrors.raiseException( sdb::ErrorCondition::PARSER_CYCLIC_SUB_QUERIES ); 604*cdf0e10cSrcweir } 605*cdf0e10cSrcweir } 606*cdf0e10cSrcweir rParam.pSubQueryHistory->insert( sTableOrQueryName ); 607*cdf0e10cSrcweir 608*cdf0e10cSrcweir Reference< XPropertySet > xQuery( rParam.xQueries->getByName( sTableOrQueryName ), UNO_QUERY_THROW ); 609*cdf0e10cSrcweir 610*cdf0e10cSrcweir // substitute the query name with the constituting command 611*cdf0e10cSrcweir ::rtl::OUString sCommand; 612*cdf0e10cSrcweir OSL_VERIFY( xQuery->getPropertyValue( OMetaConnection::getPropMap().getNameByIndex( PROPERTY_ID_COMMAND ) ) >>= sCommand ); 613*cdf0e10cSrcweir 614*cdf0e10cSrcweir sal_Bool bEscapeProcessing = sal_False; 615*cdf0e10cSrcweir OSL_VERIFY( xQuery->getPropertyValue( OMetaConnection::getPropMap().getNameByIndex( PROPERTY_ID_ESCAPEPROCESSING ) ) >>= bEscapeProcessing ); 616*cdf0e10cSrcweir 617*cdf0e10cSrcweir // the query we found here might itself be based on another query, so parse it recursively 618*cdf0e10cSrcweir OSL_ENSURE( rParam.pParser, "OSQLParseNode::impl_parseTableNameNodeToString_throw: cannot analyze sub queries without a parser!" ); 619*cdf0e10cSrcweir if ( bEscapeProcessing && rParam.pParser ) 620*cdf0e10cSrcweir { 621*cdf0e10cSrcweir ::rtl::OUString sError; 622*cdf0e10cSrcweir ::std::auto_ptr< OSQLParseNode > pSubQueryNode( rParam.pParser->parseTree( sError, sCommand, sal_False ) ); 623*cdf0e10cSrcweir if ( pSubQueryNode.get() ) 624*cdf0e10cSrcweir { 625*cdf0e10cSrcweir // parse the sub-select to SDBC level, too 626*cdf0e10cSrcweir ::rtl::OUStringBuffer sSubSelect; 627*cdf0e10cSrcweir pSubQueryNode->impl_parseNodeToString_throw( sSubSelect, rParam ); 628*cdf0e10cSrcweir if ( sSubSelect.getLength() ) 629*cdf0e10cSrcweir sCommand = sSubSelect.makeStringAndClear(); 630*cdf0e10cSrcweir } 631*cdf0e10cSrcweir } 632*cdf0e10cSrcweir 633*cdf0e10cSrcweir rString.appendAscii( " ( " ); 634*cdf0e10cSrcweir rString.append(sCommand); 635*cdf0e10cSrcweir rString.appendAscii( " )" ); 636*cdf0e10cSrcweir 637*cdf0e10cSrcweir // append the query name as table alias, since it might be referenced in other 638*cdf0e10cSrcweir // parts of the statement - but only if there's no other alias name present 639*cdf0e10cSrcweir if ( !lcl_isAliasNamePresent( *this ) ) 640*cdf0e10cSrcweir { 641*cdf0e10cSrcweir rString.appendAscii( " AS " ); 642*cdf0e10cSrcweir if ( rParam.bQuote ) 643*cdf0e10cSrcweir rString.append(SetQuotation( sTableOrQueryName, 644*cdf0e10cSrcweir rParam.aMetaData.getIdentifierQuoteString(), rParam.aMetaData.getIdentifierQuoteString() )); 645*cdf0e10cSrcweir } 646*cdf0e10cSrcweir 647*cdf0e10cSrcweir // don't forget to remove the query name from the history, else multiple inclusions 648*cdf0e10cSrcweir // won't work 649*cdf0e10cSrcweir // #i69227# / 2006-10-10 / frank.schoenheit@sun.com 650*cdf0e10cSrcweir rParam.pSubQueryHistory->erase( sTableOrQueryName ); 651*cdf0e10cSrcweir 652*cdf0e10cSrcweir return true; 653*cdf0e10cSrcweir } 654*cdf0e10cSrcweir catch( const SQLException& ) 655*cdf0e10cSrcweir { 656*cdf0e10cSrcweir throw; 657*cdf0e10cSrcweir } 658*cdf0e10cSrcweir catch( const Exception& ) 659*cdf0e10cSrcweir { 660*cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION(); 661*cdf0e10cSrcweir } 662*cdf0e10cSrcweir return false; 663*cdf0e10cSrcweir } 664*cdf0e10cSrcweir 665*cdf0e10cSrcweir //----------------------------------------------------------------------------- 666*cdf0e10cSrcweir void OSQLParseNode::impl_parseTableRangeNodeToString_throw(::rtl::OUStringBuffer& rString, const SQLParseNodeParameter& rParam) const 667*cdf0e10cSrcweir { 668*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::impl_parseTableRangeNodeToString_throw" ); 669*cdf0e10cSrcweir OSL_PRECOND( ( count() == 2 ) || ( count() == 3 ) || ( count() == 5 ) ,"Illegal count"); 670*cdf0e10cSrcweir 671*cdf0e10cSrcweir // rString += ::rtl::OUString::createFromAscii(" "); 672*cdf0e10cSrcweir ::std::for_each(m_aChildren.begin(),m_aChildren.end(), 673*cdf0e10cSrcweir boost::bind( &OSQLParseNode::impl_parseNodeToString_throw, _1, boost::ref( rString ), boost::cref( rParam ) )); 674*cdf0e10cSrcweir } 675*cdf0e10cSrcweir 676*cdf0e10cSrcweir //----------------------------------------------------------------------------- 677*cdf0e10cSrcweir void OSQLParseNode::impl_parseLikeNodeToString_throw( ::rtl::OUStringBuffer& rString, const SQLParseNodeParameter& rParam ) const 678*cdf0e10cSrcweir { 679*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::impl_parseLikeNodeToString_throw" ); 680*cdf0e10cSrcweir OSL_ENSURE(count() == 2,"count != 2: Prepare for GPF"); 681*cdf0e10cSrcweir 682*cdf0e10cSrcweir const OSQLParseNode* pEscNode = NULL; 683*cdf0e10cSrcweir const OSQLParseNode* pParaNode = NULL; 684*cdf0e10cSrcweir 685*cdf0e10cSrcweir SQLParseNodeParameter aNewParam(rParam); 686*cdf0e10cSrcweir //aNewParam.bQuote = sal_True; // why setting this to true? @see http://www.openoffice.org/issues/show_bug.cgi?id=75557 687*cdf0e10cSrcweir 688*cdf0e10cSrcweir // if there is a field given we don't display the fieldname, if there are any 689*cdf0e10cSrcweir sal_Bool bAddName = sal_True; 690*cdf0e10cSrcweir if (rParam.xField.is()) 691*cdf0e10cSrcweir { 692*cdf0e10cSrcweir // retrieve the fields name 693*cdf0e10cSrcweir ::rtl::OUString aFieldName; 694*cdf0e10cSrcweir try 695*cdf0e10cSrcweir { 696*cdf0e10cSrcweir // retrieve the fields name 697*cdf0e10cSrcweir rtl::OUString aString; 698*cdf0e10cSrcweir rParam.xField->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME)) >>= aString; 699*cdf0e10cSrcweir aFieldName = aString.getStr(); 700*cdf0e10cSrcweir } 701*cdf0e10cSrcweir catch ( Exception& ) 702*cdf0e10cSrcweir { 703*cdf0e10cSrcweir OSL_ENSURE( false, "OSQLParseNode::impl_parseLikeNodeToString_throw Exception occured!" ); 704*cdf0e10cSrcweir } 705*cdf0e10cSrcweir if ( !m_aChildren[0]->isLeaf() ) 706*cdf0e10cSrcweir { 707*cdf0e10cSrcweir const OSQLParseNode* pCol = m_aChildren[0]->getChild(m_aChildren[0]->count()-1); 708*cdf0e10cSrcweir if ((SQL_ISRULE(pCol,column_val) && pCol->getChild(0)->getTokenValue().equalsIgnoreAsciiCase(aFieldName)) || 709*cdf0e10cSrcweir pCol->getTokenValue().equalsIgnoreAsciiCase(aFieldName) ) 710*cdf0e10cSrcweir bAddName = sal_False; 711*cdf0e10cSrcweir } 712*cdf0e10cSrcweir } 713*cdf0e10cSrcweir 714*cdf0e10cSrcweir if (bAddName) 715*cdf0e10cSrcweir m_aChildren[0]->impl_parseNodeToString_throw( rString, aNewParam ); 716*cdf0e10cSrcweir 717*cdf0e10cSrcweir const OSQLParseNode* pPart2 = m_aChildren[1]; 718*cdf0e10cSrcweir pPart2->getChild(0)->impl_parseNodeToString_throw( rString, aNewParam ); 719*cdf0e10cSrcweir pPart2->getChild(1)->impl_parseNodeToString_throw( rString, aNewParam ); 720*cdf0e10cSrcweir pParaNode = pPart2->getChild(2); 721*cdf0e10cSrcweir pEscNode = pPart2->getChild(3); 722*cdf0e10cSrcweir 723*cdf0e10cSrcweir if (pParaNode->isToken()) 724*cdf0e10cSrcweir { 725*cdf0e10cSrcweir ::rtl::OUString aStr = ConvertLikeToken(pParaNode, pEscNode, rParam.bInternational); 726*cdf0e10cSrcweir rString.appendAscii(" "); 727*cdf0e10cSrcweir rString.append(SetQuotation(aStr,::rtl::OUString::createFromAscii("\'"),::rtl::OUString::createFromAscii("\'\'"))); 728*cdf0e10cSrcweir } 729*cdf0e10cSrcweir else 730*cdf0e10cSrcweir pParaNode->impl_parseNodeToString_throw( rString, aNewParam ); 731*cdf0e10cSrcweir 732*cdf0e10cSrcweir pEscNode->impl_parseNodeToString_throw( rString, aNewParam ); 733*cdf0e10cSrcweir } 734*cdf0e10cSrcweir 735*cdf0e10cSrcweir 736*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 737*cdf0e10cSrcweir sal_Bool OSQLParseNode::getTableComponents(const OSQLParseNode* _pTableNode, 738*cdf0e10cSrcweir ::com::sun::star::uno::Any &_rCatalog, 739*cdf0e10cSrcweir ::rtl::OUString &_rSchema, 740*cdf0e10cSrcweir ::rtl::OUString &_rTable, 741*cdf0e10cSrcweir const Reference< XDatabaseMetaData >& _xMetaData) 742*cdf0e10cSrcweir { 743*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::getTableComponents" ); 744*cdf0e10cSrcweir OSL_ENSURE(_pTableNode,"Wrong use of getTableComponents! _pTableNode is not allowed to be null!"); 745*cdf0e10cSrcweir if(_pTableNode) 746*cdf0e10cSrcweir { 747*cdf0e10cSrcweir const sal_Bool bSupportsCatalog = _xMetaData.is() && _xMetaData->supportsCatalogsInDataManipulation(); 748*cdf0e10cSrcweir const sal_Bool bSupportsSchema = _xMetaData.is() && _xMetaData->supportsSchemasInDataManipulation(); 749*cdf0e10cSrcweir const OSQLParseNode* pTableNode = _pTableNode; 750*cdf0e10cSrcweir // clear the parameter given 751*cdf0e10cSrcweir _rCatalog = Any(); 752*cdf0e10cSrcweir _rSchema = _rTable = ::rtl::OUString(); 753*cdf0e10cSrcweir // see rule catalog_name: in sqlbison.y 754*cdf0e10cSrcweir if (SQL_ISRULE(pTableNode,catalog_name)) 755*cdf0e10cSrcweir { 756*cdf0e10cSrcweir OSL_ENSURE(pTableNode->getChild(0) && pTableNode->getChild(0)->isToken(),"Invalid parsenode!"); 757*cdf0e10cSrcweir _rCatalog <<= pTableNode->getChild(0)->getTokenValue(); 758*cdf0e10cSrcweir pTableNode = pTableNode->getChild(2); 759*cdf0e10cSrcweir } 760*cdf0e10cSrcweir // check if we have schema_name rule 761*cdf0e10cSrcweir if(SQL_ISRULE(pTableNode,schema_name)) 762*cdf0e10cSrcweir { 763*cdf0e10cSrcweir if ( bSupportsCatalog && !bSupportsSchema ) 764*cdf0e10cSrcweir _rCatalog <<= pTableNode->getChild(0)->getTokenValue(); 765*cdf0e10cSrcweir else 766*cdf0e10cSrcweir _rSchema = pTableNode->getChild(0)->getTokenValue(); 767*cdf0e10cSrcweir pTableNode = pTableNode->getChild(2); 768*cdf0e10cSrcweir } 769*cdf0e10cSrcweir // check if we have table_name rule 770*cdf0e10cSrcweir if(SQL_ISRULE(pTableNode,table_name)) 771*cdf0e10cSrcweir { 772*cdf0e10cSrcweir _rTable = pTableNode->getChild(0)->getTokenValue(); 773*cdf0e10cSrcweir } 774*cdf0e10cSrcweir else 775*cdf0e10cSrcweir { 776*cdf0e10cSrcweir OSL_ENSURE(0,"Error in parse tree!"); 777*cdf0e10cSrcweir } 778*cdf0e10cSrcweir } 779*cdf0e10cSrcweir return _rTable.getLength() != 0; 780*cdf0e10cSrcweir } 781*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 782*cdf0e10cSrcweir void OSQLParser::killThousandSeparator(OSQLParseNode* pLiteral) 783*cdf0e10cSrcweir { 784*cdf0e10cSrcweir if ( pLiteral ) 785*cdf0e10cSrcweir { 786*cdf0e10cSrcweir if ( s_xLocaleData->getLocaleItem( m_pData->aLocale ).decimalSeparator.toChar() == ',' ) 787*cdf0e10cSrcweir { 788*cdf0e10cSrcweir pLiteral->m_aNodeValue = pLiteral->m_aNodeValue.replace('.', sal_Unicode()); 789*cdf0e10cSrcweir // and replace decimal 790*cdf0e10cSrcweir pLiteral->m_aNodeValue = pLiteral->m_aNodeValue.replace(',', '.'); 791*cdf0e10cSrcweir } 792*cdf0e10cSrcweir else 793*cdf0e10cSrcweir pLiteral->m_aNodeValue = pLiteral->m_aNodeValue.replace(',', sal_Unicode()); 794*cdf0e10cSrcweir } 795*cdf0e10cSrcweir } 796*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 797*cdf0e10cSrcweir OSQLParseNode* OSQLParser::convertNode(sal_Int32 nType,OSQLParseNode*& pLiteral) 798*cdf0e10cSrcweir { 799*cdf0e10cSrcweir if ( !pLiteral ) 800*cdf0e10cSrcweir return NULL; 801*cdf0e10cSrcweir 802*cdf0e10cSrcweir OSQLParseNode* pReturn = pLiteral; 803*cdf0e10cSrcweir 804*cdf0e10cSrcweir if ( ( pLiteral->isRule() && !SQL_ISRULE(pLiteral,value_exp) ) || SQL_ISTOKEN(pLiteral,FALSE) || SQL_ISTOKEN(pLiteral,TRUE) ) 805*cdf0e10cSrcweir { 806*cdf0e10cSrcweir switch(nType) 807*cdf0e10cSrcweir { 808*cdf0e10cSrcweir case DataType::CHAR: 809*cdf0e10cSrcweir case DataType::VARCHAR: 810*cdf0e10cSrcweir case DataType::LONGVARCHAR: 811*cdf0e10cSrcweir case DataType::CLOB: 812*cdf0e10cSrcweir if ( !SQL_ISRULE(pReturn,char_value_exp) && !buildStringNodes(pReturn) ) 813*cdf0e10cSrcweir pReturn = NULL; 814*cdf0e10cSrcweir default: 815*cdf0e10cSrcweir break; 816*cdf0e10cSrcweir } 817*cdf0e10cSrcweir } 818*cdf0e10cSrcweir else 819*cdf0e10cSrcweir { 820*cdf0e10cSrcweir switch(pLiteral->getNodeType()) 821*cdf0e10cSrcweir { 822*cdf0e10cSrcweir case SQL_NODE_STRING: 823*cdf0e10cSrcweir switch(nType) 824*cdf0e10cSrcweir { 825*cdf0e10cSrcweir case DataType::CHAR: 826*cdf0e10cSrcweir case DataType::VARCHAR: 827*cdf0e10cSrcweir case DataType::LONGVARCHAR: 828*cdf0e10cSrcweir case DataType::CLOB: 829*cdf0e10cSrcweir break; 830*cdf0e10cSrcweir case DataType::DATE: 831*cdf0e10cSrcweir case DataType::TIME: 832*cdf0e10cSrcweir case DataType::TIMESTAMP: 833*cdf0e10cSrcweir if (m_xFormatter.is()) 834*cdf0e10cSrcweir pReturn = buildDate( nType, pReturn); 835*cdf0e10cSrcweir break; 836*cdf0e10cSrcweir default: 837*cdf0e10cSrcweir m_sErrorMessage = m_pContext->getErrorMessage(IParseContext::ERROR_INVALID_COMPARE); 838*cdf0e10cSrcweir break; 839*cdf0e10cSrcweir } 840*cdf0e10cSrcweir break; 841*cdf0e10cSrcweir case SQL_NODE_ACCESS_DATE: 842*cdf0e10cSrcweir switch(nType) 843*cdf0e10cSrcweir { 844*cdf0e10cSrcweir case DataType::DATE: 845*cdf0e10cSrcweir case DataType::TIME: 846*cdf0e10cSrcweir case DataType::TIMESTAMP: 847*cdf0e10cSrcweir if ( m_xFormatter.is() ) 848*cdf0e10cSrcweir pReturn = buildDate( nType, pReturn); 849*cdf0e10cSrcweir else 850*cdf0e10cSrcweir m_sErrorMessage = m_pContext->getErrorMessage(IParseContext::ERROR_INVALID_DATE_COMPARE); 851*cdf0e10cSrcweir break; 852*cdf0e10cSrcweir default: 853*cdf0e10cSrcweir m_sErrorMessage = m_pContext->getErrorMessage(IParseContext::ERROR_INVALID_COMPARE); 854*cdf0e10cSrcweir break; 855*cdf0e10cSrcweir } 856*cdf0e10cSrcweir break; 857*cdf0e10cSrcweir case SQL_NODE_INTNUM: 858*cdf0e10cSrcweir switch(nType) 859*cdf0e10cSrcweir { 860*cdf0e10cSrcweir case DataType::BIT: 861*cdf0e10cSrcweir case DataType::BOOLEAN: 862*cdf0e10cSrcweir case DataType::DECIMAL: 863*cdf0e10cSrcweir case DataType::NUMERIC: 864*cdf0e10cSrcweir case DataType::TINYINT: 865*cdf0e10cSrcweir case DataType::SMALLINT: 866*cdf0e10cSrcweir case DataType::INTEGER: 867*cdf0e10cSrcweir case DataType::BIGINT: 868*cdf0e10cSrcweir case DataType::FLOAT: 869*cdf0e10cSrcweir case DataType::REAL: 870*cdf0e10cSrcweir case DataType::DOUBLE: 871*cdf0e10cSrcweir // kill thousand seperators if any 872*cdf0e10cSrcweir killThousandSeparator(pReturn); 873*cdf0e10cSrcweir break; 874*cdf0e10cSrcweir case DataType::CHAR: 875*cdf0e10cSrcweir case DataType::VARCHAR: 876*cdf0e10cSrcweir case DataType::LONGVARCHAR: 877*cdf0e10cSrcweir case DataType::CLOB: 878*cdf0e10cSrcweir pReturn = buildNode_STR_NUM(pReturn); 879*cdf0e10cSrcweir break; 880*cdf0e10cSrcweir default: 881*cdf0e10cSrcweir m_sErrorMessage = m_pContext->getErrorMessage(IParseContext::ERROR_INVALID_INT_COMPARE); 882*cdf0e10cSrcweir break; 883*cdf0e10cSrcweir } 884*cdf0e10cSrcweir break; 885*cdf0e10cSrcweir case SQL_NODE_APPROXNUM: 886*cdf0e10cSrcweir switch(nType) 887*cdf0e10cSrcweir { 888*cdf0e10cSrcweir case DataType::DECIMAL: 889*cdf0e10cSrcweir case DataType::NUMERIC: 890*cdf0e10cSrcweir case DataType::FLOAT: 891*cdf0e10cSrcweir case DataType::REAL: 892*cdf0e10cSrcweir case DataType::DOUBLE: 893*cdf0e10cSrcweir // kill thousand seperators if any 894*cdf0e10cSrcweir killThousandSeparator(pReturn); 895*cdf0e10cSrcweir break; 896*cdf0e10cSrcweir case DataType::CHAR: 897*cdf0e10cSrcweir case DataType::VARCHAR: 898*cdf0e10cSrcweir case DataType::LONGVARCHAR: 899*cdf0e10cSrcweir case DataType::CLOB: 900*cdf0e10cSrcweir pReturn = buildNode_STR_NUM(pReturn); 901*cdf0e10cSrcweir break; 902*cdf0e10cSrcweir case DataType::INTEGER: 903*cdf0e10cSrcweir default: 904*cdf0e10cSrcweir m_sErrorMessage = m_pContext->getErrorMessage(IParseContext::ERROR_INVALID_REAL_COMPARE); 905*cdf0e10cSrcweir break; 906*cdf0e10cSrcweir } 907*cdf0e10cSrcweir break; 908*cdf0e10cSrcweir default: 909*cdf0e10cSrcweir ; 910*cdf0e10cSrcweir } 911*cdf0e10cSrcweir } 912*cdf0e10cSrcweir return pReturn; 913*cdf0e10cSrcweir } 914*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 915*cdf0e10cSrcweir sal_Int16 OSQLParser::buildPredicateRule(OSQLParseNode*& pAppend,OSQLParseNode* pLiteral,OSQLParseNode*& pCompare,OSQLParseNode* pLiteral2) 916*cdf0e10cSrcweir { 917*cdf0e10cSrcweir OSL_ENSURE(inPredicateCheck(),"Only in predicate check allowed!"); 918*cdf0e10cSrcweir sal_Int16 nErg = 0; 919*cdf0e10cSrcweir if ( m_xField.is() ) 920*cdf0e10cSrcweir { 921*cdf0e10cSrcweir sal_Int32 nType = 0; 922*cdf0e10cSrcweir try 923*cdf0e10cSrcweir { 924*cdf0e10cSrcweir m_xField->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE)) >>= nType; 925*cdf0e10cSrcweir } 926*cdf0e10cSrcweir catch( Exception& ) 927*cdf0e10cSrcweir { 928*cdf0e10cSrcweir return nErg; 929*cdf0e10cSrcweir } 930*cdf0e10cSrcweir 931*cdf0e10cSrcweir OSQLParseNode* pNode1 = convertNode(nType,pLiteral); 932*cdf0e10cSrcweir if ( pNode1 ) 933*cdf0e10cSrcweir { 934*cdf0e10cSrcweir OSQLParseNode* pNode2 = convertNode(nType,pLiteral2); 935*cdf0e10cSrcweir if ( !m_sErrorMessage.getLength() ) 936*cdf0e10cSrcweir nErg = buildNode(pAppend,pCompare,pNode1,pNode2); 937*cdf0e10cSrcweir } 938*cdf0e10cSrcweir } 939*cdf0e10cSrcweir if (!pCompare->getParent()) // I have no parent so I was not used and I must die :-) 940*cdf0e10cSrcweir delete pCompare; 941*cdf0e10cSrcweir return nErg; 942*cdf0e10cSrcweir } 943*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 944*cdf0e10cSrcweir sal_Int16 OSQLParser::buildLikeRule(OSQLParseNode*& pAppend, OSQLParseNode*& pLiteral, const OSQLParseNode* pEscape) 945*cdf0e10cSrcweir { 946*cdf0e10cSrcweir sal_Int16 nErg = 0; 947*cdf0e10cSrcweir sal_Int32 nType = 0; 948*cdf0e10cSrcweir 949*cdf0e10cSrcweir if (!m_xField.is()) 950*cdf0e10cSrcweir return nErg; 951*cdf0e10cSrcweir try 952*cdf0e10cSrcweir { 953*cdf0e10cSrcweir Any aValue; 954*cdf0e10cSrcweir { 955*cdf0e10cSrcweir aValue = m_xField->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE)); 956*cdf0e10cSrcweir aValue >>= nType; 957*cdf0e10cSrcweir } 958*cdf0e10cSrcweir } 959*cdf0e10cSrcweir catch( Exception& ) 960*cdf0e10cSrcweir { 961*cdf0e10cSrcweir return nErg; 962*cdf0e10cSrcweir } 963*cdf0e10cSrcweir 964*cdf0e10cSrcweir switch (nType) 965*cdf0e10cSrcweir { 966*cdf0e10cSrcweir case DataType::CHAR: 967*cdf0e10cSrcweir case DataType::VARCHAR: 968*cdf0e10cSrcweir case DataType::LONGVARCHAR: 969*cdf0e10cSrcweir case DataType::CLOB: 970*cdf0e10cSrcweir if(pLiteral->isRule()) 971*cdf0e10cSrcweir { 972*cdf0e10cSrcweir pAppend->append(pLiteral); 973*cdf0e10cSrcweir nErg = 1; 974*cdf0e10cSrcweir } 975*cdf0e10cSrcweir else 976*cdf0e10cSrcweir { 977*cdf0e10cSrcweir switch(pLiteral->getNodeType()) 978*cdf0e10cSrcweir { 979*cdf0e10cSrcweir case SQL_NODE_STRING: 980*cdf0e10cSrcweir pLiteral->m_aNodeValue = ConvertLikeToken(pLiteral, pEscape, sal_False); 981*cdf0e10cSrcweir pAppend->append(pLiteral); 982*cdf0e10cSrcweir nErg = 1; 983*cdf0e10cSrcweir break; 984*cdf0e10cSrcweir case SQL_NODE_APPROXNUM: 985*cdf0e10cSrcweir if (m_xFormatter.is() && m_nFormatKey) 986*cdf0e10cSrcweir { 987*cdf0e10cSrcweir sal_Int16 nScale = 0; 988*cdf0e10cSrcweir try 989*cdf0e10cSrcweir { 990*cdf0e10cSrcweir Any aValue = getNumberFormatProperty( m_xFormatter, m_nFormatKey, ::rtl::OUString::createFromAscii("Decimals") ); 991*cdf0e10cSrcweir aValue >>= nScale; 992*cdf0e10cSrcweir } 993*cdf0e10cSrcweir catch( Exception& ) 994*cdf0e10cSrcweir { 995*cdf0e10cSrcweir } 996*cdf0e10cSrcweir 997*cdf0e10cSrcweir pAppend->append(new OSQLInternalNode(stringToDouble(pLiteral->getTokenValue(),nScale),SQL_NODE_STRING)); 998*cdf0e10cSrcweir } 999*cdf0e10cSrcweir else 1000*cdf0e10cSrcweir pAppend->append(new OSQLInternalNode(pLiteral->getTokenValue(),SQL_NODE_STRING)); 1001*cdf0e10cSrcweir 1002*cdf0e10cSrcweir delete pLiteral; 1003*cdf0e10cSrcweir nErg = 1; 1004*cdf0e10cSrcweir break; 1005*cdf0e10cSrcweir default: 1006*cdf0e10cSrcweir m_sErrorMessage = m_pContext->getErrorMessage(IParseContext::ERROR_VALUE_NO_LIKE); 1007*cdf0e10cSrcweir m_sErrorMessage = m_sErrorMessage.replaceAt(m_sErrorMessage.indexOf(::rtl::OUString::createFromAscii("#1")),2,pLiteral->getTokenValue()); 1008*cdf0e10cSrcweir break; 1009*cdf0e10cSrcweir } 1010*cdf0e10cSrcweir } 1011*cdf0e10cSrcweir break; 1012*cdf0e10cSrcweir default: 1013*cdf0e10cSrcweir m_sErrorMessage = m_pContext->getErrorMessage(IParseContext::ERROR_FIELD_NO_LIKE); 1014*cdf0e10cSrcweir break; 1015*cdf0e10cSrcweir } 1016*cdf0e10cSrcweir return nErg; 1017*cdf0e10cSrcweir } 1018*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1019*cdf0e10cSrcweir OSQLParseNode* OSQLParser::buildNode_Date(const double& fValue, sal_Int32 nType) 1020*cdf0e10cSrcweir { 1021*cdf0e10cSrcweir ::rtl::OUString aEmptyString; 1022*cdf0e10cSrcweir OSQLParseNode* pNewNode = new OSQLInternalNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::set_fct_spec)); 1023*cdf0e10cSrcweir pNewNode->append(new OSQLInternalNode(::rtl::OUString::createFromAscii("{"), SQL_NODE_PUNCTUATION)); 1024*cdf0e10cSrcweir OSQLParseNode* pDateNode = new OSQLInternalNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::odbc_fct_spec)); 1025*cdf0e10cSrcweir pNewNode->append(pDateNode); 1026*cdf0e10cSrcweir pNewNode->append(new OSQLInternalNode(::rtl::OUString::createFromAscii("}"), SQL_NODE_PUNCTUATION)); 1027*cdf0e10cSrcweir 1028*cdf0e10cSrcweir switch (nType) 1029*cdf0e10cSrcweir { 1030*cdf0e10cSrcweir case DataType::DATE: 1031*cdf0e10cSrcweir { 1032*cdf0e10cSrcweir Date aDate = DBTypeConversion::toDate(fValue,DBTypeConversion::getNULLDate(m_xFormatter->getNumberFormatsSupplier())); 1033*cdf0e10cSrcweir ::rtl::OUString aString = DBTypeConversion::toDateString(aDate); 1034*cdf0e10cSrcweir pDateNode->append(new OSQLInternalNode(aEmptyString, SQL_NODE_KEYWORD, SQL_TOKEN_D)); 1035*cdf0e10cSrcweir pDateNode->append(new OSQLInternalNode(aString, SQL_NODE_STRING)); 1036*cdf0e10cSrcweir break; 1037*cdf0e10cSrcweir } 1038*cdf0e10cSrcweir case DataType::TIME: 1039*cdf0e10cSrcweir { 1040*cdf0e10cSrcweir Time aTime = DBTypeConversion::toTime(fValue); 1041*cdf0e10cSrcweir ::rtl::OUString aString = DBTypeConversion::toTimeString(aTime); 1042*cdf0e10cSrcweir pDateNode->append(new OSQLInternalNode(aEmptyString, SQL_NODE_KEYWORD, SQL_TOKEN_T)); 1043*cdf0e10cSrcweir pDateNode->append(new OSQLInternalNode(aString, SQL_NODE_STRING)); 1044*cdf0e10cSrcweir break; 1045*cdf0e10cSrcweir } 1046*cdf0e10cSrcweir case DataType::TIMESTAMP: 1047*cdf0e10cSrcweir { 1048*cdf0e10cSrcweir DateTime aDateTime = DBTypeConversion::toDateTime(fValue,DBTypeConversion::getNULLDate(m_xFormatter->getNumberFormatsSupplier())); 1049*cdf0e10cSrcweir if (aDateTime.Seconds || aDateTime.Minutes || aDateTime.Hours) 1050*cdf0e10cSrcweir { 1051*cdf0e10cSrcweir ::rtl::OUString aString = DBTypeConversion::toDateTimeString(aDateTime); 1052*cdf0e10cSrcweir pDateNode->append(new OSQLInternalNode(aEmptyString, SQL_NODE_KEYWORD, SQL_TOKEN_TS)); 1053*cdf0e10cSrcweir pDateNode->append(new OSQLInternalNode(aString, SQL_NODE_STRING)); 1054*cdf0e10cSrcweir } 1055*cdf0e10cSrcweir else 1056*cdf0e10cSrcweir { 1057*cdf0e10cSrcweir Date aDate(aDateTime.Day,aDateTime.Month,aDateTime.Year); 1058*cdf0e10cSrcweir pDateNode->append(new OSQLInternalNode(aEmptyString, SQL_NODE_KEYWORD, SQL_TOKEN_D)); 1059*cdf0e10cSrcweir pDateNode->append(new OSQLInternalNode(DBTypeConversion::toDateString(aDate), SQL_NODE_STRING)); 1060*cdf0e10cSrcweir } 1061*cdf0e10cSrcweir break; 1062*cdf0e10cSrcweir } 1063*cdf0e10cSrcweir } 1064*cdf0e10cSrcweir 1065*cdf0e10cSrcweir return pNewNode; 1066*cdf0e10cSrcweir } 1067*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1068*cdf0e10cSrcweir OSQLParseNode* OSQLParser::buildNode_STR_NUM(OSQLParseNode*& _pLiteral) 1069*cdf0e10cSrcweir { 1070*cdf0e10cSrcweir OSQLParseNode* pReturn = NULL; 1071*cdf0e10cSrcweir if ( _pLiteral ) 1072*cdf0e10cSrcweir { 1073*cdf0e10cSrcweir if (m_nFormatKey) 1074*cdf0e10cSrcweir { 1075*cdf0e10cSrcweir sal_Int16 nScale = 0; 1076*cdf0e10cSrcweir ::rtl::OUString aDec; 1077*cdf0e10cSrcweir try 1078*cdf0e10cSrcweir { 1079*cdf0e10cSrcweir Any aValue = getNumberFormatProperty( m_xFormatter, m_nFormatKey, ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Decimals")) ); 1080*cdf0e10cSrcweir aValue >>= nScale; 1081*cdf0e10cSrcweir } 1082*cdf0e10cSrcweir catch( Exception& ) 1083*cdf0e10cSrcweir { 1084*cdf0e10cSrcweir } 1085*cdf0e10cSrcweir 1086*cdf0e10cSrcweir pReturn = new OSQLInternalNode(stringToDouble(_pLiteral->getTokenValue(),nScale),SQL_NODE_STRING); 1087*cdf0e10cSrcweir } 1088*cdf0e10cSrcweir else 1089*cdf0e10cSrcweir pReturn = new OSQLInternalNode(_pLiteral->getTokenValue(),SQL_NODE_STRING); 1090*cdf0e10cSrcweir 1091*cdf0e10cSrcweir delete _pLiteral; 1092*cdf0e10cSrcweir _pLiteral = NULL; 1093*cdf0e10cSrcweir } 1094*cdf0e10cSrcweir return pReturn; 1095*cdf0e10cSrcweir } 1096*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1097*cdf0e10cSrcweir ::rtl::OUString OSQLParser::stringToDouble(const ::rtl::OUString& _rValue,sal_Int16 _nScale) 1098*cdf0e10cSrcweir { 1099*cdf0e10cSrcweir ::rtl::OUString aValue; 1100*cdf0e10cSrcweir if(!m_xCharClass.is()) 1101*cdf0e10cSrcweir m_xCharClass = Reference<XCharacterClassification>(m_xServiceFactory->createInstance(::rtl::OUString::createFromAscii("com.sun.star.i18n.CharacterClassification")),UNO_QUERY); 1102*cdf0e10cSrcweir if(m_xCharClass.is() && s_xLocaleData.is()) 1103*cdf0e10cSrcweir { 1104*cdf0e10cSrcweir try 1105*cdf0e10cSrcweir { 1106*cdf0e10cSrcweir ParseResult aResult = m_xCharClass->parsePredefinedToken(KParseType::ANY_NUMBER,_rValue,0,m_pData->aLocale,0,::rtl::OUString(),KParseType::ANY_NUMBER,::rtl::OUString()); 1107*cdf0e10cSrcweir if((aResult.TokenType & KParseType::IDENTNAME) && aResult.EndPos == _rValue.getLength()) 1108*cdf0e10cSrcweir { 1109*cdf0e10cSrcweir aValue = ::rtl::OUString::valueOf(aResult.Value); 1110*cdf0e10cSrcweir sal_Int32 nPos = aValue.lastIndexOf(::rtl::OUString::createFromAscii(".")); 1111*cdf0e10cSrcweir if((nPos+_nScale) < aValue.getLength()) 1112*cdf0e10cSrcweir aValue = aValue.replaceAt(nPos+_nScale,aValue.getLength()-nPos-_nScale,::rtl::OUString()); 1113*cdf0e10cSrcweir aValue = aValue.replaceAt(aValue.lastIndexOf(::rtl::OUString::createFromAscii(".")),1,s_xLocaleData->getLocaleItem(m_pData->aLocale).decimalSeparator); 1114*cdf0e10cSrcweir return aValue; 1115*cdf0e10cSrcweir } 1116*cdf0e10cSrcweir } 1117*cdf0e10cSrcweir catch(Exception&) 1118*cdf0e10cSrcweir { 1119*cdf0e10cSrcweir } 1120*cdf0e10cSrcweir } 1121*cdf0e10cSrcweir return aValue; 1122*cdf0e10cSrcweir } 1123*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1124*cdf0e10cSrcweir 1125*cdf0e10cSrcweir ::osl::Mutex& OSQLParser::getMutex() 1126*cdf0e10cSrcweir { 1127*cdf0e10cSrcweir static ::osl::Mutex aMutex; 1128*cdf0e10cSrcweir return aMutex; 1129*cdf0e10cSrcweir } 1130*cdf0e10cSrcweir 1131*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1132*cdf0e10cSrcweir OSQLParseNode* OSQLParser::predicateTree(::rtl::OUString& rErrorMessage, const ::rtl::OUString& rStatement, 1133*cdf0e10cSrcweir const Reference< ::com::sun::star::util::XNumberFormatter > & xFormatter, 1134*cdf0e10cSrcweir const Reference< XPropertySet > & xField) 1135*cdf0e10cSrcweir { 1136*cdf0e10cSrcweir 1137*cdf0e10cSrcweir 1138*cdf0e10cSrcweir // mutex for parsing 1139*cdf0e10cSrcweir static ::osl::Mutex aMutex; 1140*cdf0e10cSrcweir 1141*cdf0e10cSrcweir // Guard the parsing 1142*cdf0e10cSrcweir ::osl::MutexGuard aGuard(getMutex()); 1143*cdf0e10cSrcweir // must be reset 1144*cdf0e10cSrcweir setParser(this); 1145*cdf0e10cSrcweir 1146*cdf0e10cSrcweir 1147*cdf0e10cSrcweir // reset the parser 1148*cdf0e10cSrcweir m_xField = xField; 1149*cdf0e10cSrcweir m_xFormatter = xFormatter; 1150*cdf0e10cSrcweir 1151*cdf0e10cSrcweir if (m_xField.is()) 1152*cdf0e10cSrcweir { 1153*cdf0e10cSrcweir sal_Int32 nType=0; 1154*cdf0e10cSrcweir try 1155*cdf0e10cSrcweir { 1156*cdf0e10cSrcweir // get the field name 1157*cdf0e10cSrcweir rtl::OUString aString; 1158*cdf0e10cSrcweir 1159*cdf0e10cSrcweir // retrieve the fields name 1160*cdf0e10cSrcweir // #75243# use the RealName of the column if there is any otherwise the name which could be the alias 1161*cdf0e10cSrcweir // of the field 1162*cdf0e10cSrcweir Reference< XPropertySetInfo> xInfo = m_xField->getPropertySetInfo(); 1163*cdf0e10cSrcweir if ( xInfo->hasPropertyByName(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_REALNAME))) 1164*cdf0e10cSrcweir m_xField->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_REALNAME)) >>= aString; 1165*cdf0e10cSrcweir else 1166*cdf0e10cSrcweir m_xField->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME)) >>= aString; 1167*cdf0e10cSrcweir 1168*cdf0e10cSrcweir m_sFieldName = aString; 1169*cdf0e10cSrcweir 1170*cdf0e10cSrcweir // get the field format key 1171*cdf0e10cSrcweir if ( xInfo->hasPropertyByName(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FORMATKEY))) 1172*cdf0e10cSrcweir m_xField->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FORMATKEY)) >>= m_nFormatKey; 1173*cdf0e10cSrcweir else 1174*cdf0e10cSrcweir m_nFormatKey = 0; 1175*cdf0e10cSrcweir 1176*cdf0e10cSrcweir // get the field type 1177*cdf0e10cSrcweir m_xField->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE)) >>= nType; 1178*cdf0e10cSrcweir } 1179*cdf0e10cSrcweir catch ( Exception& ) 1180*cdf0e10cSrcweir { 1181*cdf0e10cSrcweir OSL_ASSERT(0); 1182*cdf0e10cSrcweir } 1183*cdf0e10cSrcweir 1184*cdf0e10cSrcweir if (m_nFormatKey && m_xFormatter.is()) 1185*cdf0e10cSrcweir { 1186*cdf0e10cSrcweir Any aValue = getNumberFormatProperty( m_xFormatter, m_nFormatKey, OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_LOCALE) ); 1187*cdf0e10cSrcweir OSL_ENSURE(aValue.getValueType() == ::getCppuType((const ::com::sun::star::lang::Locale*)0), "OSQLParser::PredicateTree : invalid language property !"); 1188*cdf0e10cSrcweir 1189*cdf0e10cSrcweir if (aValue.getValueType() == ::getCppuType((const ::com::sun::star::lang::Locale*)0)) 1190*cdf0e10cSrcweir aValue >>= m_pData->aLocale; 1191*cdf0e10cSrcweir } 1192*cdf0e10cSrcweir else 1193*cdf0e10cSrcweir m_pData->aLocale = m_pContext->getPreferredLocale(); 1194*cdf0e10cSrcweir 1195*cdf0e10cSrcweir if ( m_xFormatter.is() ) 1196*cdf0e10cSrcweir { 1197*cdf0e10cSrcweir try 1198*cdf0e10cSrcweir { 1199*cdf0e10cSrcweir Reference< ::com::sun::star::util::XNumberFormatsSupplier > xFormatSup = m_xFormatter->getNumberFormatsSupplier(); 1200*cdf0e10cSrcweir if ( xFormatSup.is() ) 1201*cdf0e10cSrcweir { 1202*cdf0e10cSrcweir Reference< ::com::sun::star::util::XNumberFormats > xFormats = xFormatSup->getNumberFormats(); 1203*cdf0e10cSrcweir if ( xFormats.is() ) 1204*cdf0e10cSrcweir { 1205*cdf0e10cSrcweir ::com::sun::star::lang::Locale aLocale; 1206*cdf0e10cSrcweir aLocale.Language = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("en")); 1207*cdf0e10cSrcweir aLocale.Country = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("US")); 1208*cdf0e10cSrcweir ::rtl::OUString sFormat(RTL_CONSTASCII_USTRINGPARAM("YYYY-MM-DD")); 1209*cdf0e10cSrcweir m_nDateFormatKey = xFormats->queryKey(sFormat,aLocale,sal_False); 1210*cdf0e10cSrcweir if ( m_nDateFormatKey == sal_Int32(-1) ) 1211*cdf0e10cSrcweir m_nDateFormatKey = xFormats->addNew(sFormat, aLocale); 1212*cdf0e10cSrcweir } 1213*cdf0e10cSrcweir } 1214*cdf0e10cSrcweir } 1215*cdf0e10cSrcweir catch ( Exception& ) 1216*cdf0e10cSrcweir { 1217*cdf0e10cSrcweir OSL_ENSURE(0,"DateFormatKey"); 1218*cdf0e10cSrcweir } 1219*cdf0e10cSrcweir } 1220*cdf0e10cSrcweir 1221*cdf0e10cSrcweir switch (nType) 1222*cdf0e10cSrcweir { 1223*cdf0e10cSrcweir case DataType::DATE: 1224*cdf0e10cSrcweir case DataType::TIME: 1225*cdf0e10cSrcweir case DataType::TIMESTAMP: 1226*cdf0e10cSrcweir s_pScanner->SetRule(s_pScanner->GetDATERule()); 1227*cdf0e10cSrcweir break; 1228*cdf0e10cSrcweir case DataType::CHAR: 1229*cdf0e10cSrcweir case DataType::VARCHAR: 1230*cdf0e10cSrcweir case DataType::LONGVARCHAR: 1231*cdf0e10cSrcweir case DataType::CLOB: 1232*cdf0e10cSrcweir s_pScanner->SetRule(s_pScanner->GetSTRINGRule()); 1233*cdf0e10cSrcweir break; 1234*cdf0e10cSrcweir default: 1235*cdf0e10cSrcweir if ( s_xLocaleData->getLocaleItem( m_pData->aLocale ).decimalSeparator.toChar() == ',' ) 1236*cdf0e10cSrcweir s_pScanner->SetRule(s_pScanner->GetGERRule()); 1237*cdf0e10cSrcweir else 1238*cdf0e10cSrcweir s_pScanner->SetRule(s_pScanner->GetENGRule()); 1239*cdf0e10cSrcweir } 1240*cdf0e10cSrcweir 1241*cdf0e10cSrcweir } 1242*cdf0e10cSrcweir else 1243*cdf0e10cSrcweir s_pScanner->SetRule(s_pScanner->GetSQLRule()); 1244*cdf0e10cSrcweir 1245*cdf0e10cSrcweir s_pScanner->prepareScan(rStatement, m_pContext, sal_True); 1246*cdf0e10cSrcweir 1247*cdf0e10cSrcweir SQLyylval.pParseNode = NULL; 1248*cdf0e10cSrcweir // SQLyypvt = NULL; 1249*cdf0e10cSrcweir m_pParseTree = NULL; 1250*cdf0e10cSrcweir m_sErrorMessage= ::rtl::OUString(); 1251*cdf0e10cSrcweir 1252*cdf0e10cSrcweir // ... und den Parser anwerfen ... 1253*cdf0e10cSrcweir if (SQLyyparse() != 0) 1254*cdf0e10cSrcweir { 1255*cdf0e10cSrcweir m_sFieldName= ::rtl::OUString(); 1256*cdf0e10cSrcweir m_xField.clear(); 1257*cdf0e10cSrcweir m_xFormatter.clear(); 1258*cdf0e10cSrcweir m_nFormatKey = 0; 1259*cdf0e10cSrcweir m_nDateFormatKey = 0; 1260*cdf0e10cSrcweir 1261*cdf0e10cSrcweir if (!m_sErrorMessage.getLength()) 1262*cdf0e10cSrcweir m_sErrorMessage = s_pScanner->getErrorMessage(); 1263*cdf0e10cSrcweir if (!m_sErrorMessage.getLength()) 1264*cdf0e10cSrcweir m_sErrorMessage = m_pContext->getErrorMessage(IParseContext::ERROR_GENERAL); 1265*cdf0e10cSrcweir 1266*cdf0e10cSrcweir rErrorMessage = m_sErrorMessage; 1267*cdf0e10cSrcweir 1268*cdf0e10cSrcweir // clear the garbage collector 1269*cdf0e10cSrcweir (*s_pGarbageCollector)->clearAndDelete(); 1270*cdf0e10cSrcweir return NULL; 1271*cdf0e10cSrcweir } 1272*cdf0e10cSrcweir else 1273*cdf0e10cSrcweir { 1274*cdf0e10cSrcweir (*s_pGarbageCollector)->clear(); 1275*cdf0e10cSrcweir 1276*cdf0e10cSrcweir m_sFieldName= ::rtl::OUString(); 1277*cdf0e10cSrcweir m_xField.clear(); 1278*cdf0e10cSrcweir m_xFormatter.clear(); 1279*cdf0e10cSrcweir m_nFormatKey = 0; 1280*cdf0e10cSrcweir m_nDateFormatKey = 0; 1281*cdf0e10cSrcweir 1282*cdf0e10cSrcweir // Das Ergebnis liefern (den Root Parse Node): 1283*cdf0e10cSrcweir 1284*cdf0e10cSrcweir // Stattdessen setzt die Parse-Routine jetzt den Member pParseTree 1285*cdf0e10cSrcweir // - einfach diesen zurueckliefern: 1286*cdf0e10cSrcweir OSL_ENSURE(m_pParseTree != NULL,"OSQLParser: Parser hat keinen ParseTree geliefert"); 1287*cdf0e10cSrcweir return m_pParseTree; 1288*cdf0e10cSrcweir } 1289*cdf0e10cSrcweir } 1290*cdf0e10cSrcweir 1291*cdf0e10cSrcweir //============================================================================= 1292*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1293*cdf0e10cSrcweir OSQLParser::OSQLParser(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _xServiceFactory,const IParseContext* _pContext) 1294*cdf0e10cSrcweir :m_pContext(_pContext) 1295*cdf0e10cSrcweir ,m_pParseTree(NULL) 1296*cdf0e10cSrcweir ,m_pData( new OSQLParser_Data( _xServiceFactory ) ) 1297*cdf0e10cSrcweir ,m_nFormatKey(0) 1298*cdf0e10cSrcweir ,m_nDateFormatKey(0) 1299*cdf0e10cSrcweir ,m_xServiceFactory(_xServiceFactory) 1300*cdf0e10cSrcweir { 1301*cdf0e10cSrcweir 1302*cdf0e10cSrcweir 1303*cdf0e10cSrcweir setParser(this); 1304*cdf0e10cSrcweir 1305*cdf0e10cSrcweir #ifdef SQLYYDEBUG 1306*cdf0e10cSrcweir #ifdef SQLYYDEBUG_ON 1307*cdf0e10cSrcweir SQLyydebug = 1; 1308*cdf0e10cSrcweir #endif 1309*cdf0e10cSrcweir #endif 1310*cdf0e10cSrcweir 1311*cdf0e10cSrcweir ::osl::MutexGuard aGuard(getMutex()); 1312*cdf0e10cSrcweir // do we have to initialize the data 1313*cdf0e10cSrcweir if (s_nRefCount == 0) 1314*cdf0e10cSrcweir { 1315*cdf0e10cSrcweir s_pScanner = new OSQLScanner(); 1316*cdf0e10cSrcweir s_pScanner->setScanner(); 1317*cdf0e10cSrcweir s_pGarbageCollector = new OSQLParseNodesGarbageCollector(); 1318*cdf0e10cSrcweir 1319*cdf0e10cSrcweir if(!s_xLocaleData.is()) 1320*cdf0e10cSrcweir s_xLocaleData = Reference<XLocaleData>(m_xServiceFactory->createInstance(::rtl::OUString::createFromAscii("com.sun.star.i18n.LocaleData")),UNO_QUERY); 1321*cdf0e10cSrcweir 1322*cdf0e10cSrcweir // auf 0 zuruecksetzen 1323*cdf0e10cSrcweir memset(OSQLParser::s_nRuleIDs,0,sizeof(OSQLParser::s_nRuleIDs[0]) * (OSQLParseNode::rule_count+1)); 1324*cdf0e10cSrcweir 1325*cdf0e10cSrcweir struct 1326*cdf0e10cSrcweir { 1327*cdf0e10cSrcweir OSQLParseNode::Rule eRule; // the parse node's ID for the rule 1328*cdf0e10cSrcweir ::rtl::OString sRuleName; // the name of the rule ("select_statement") 1329*cdf0e10cSrcweir } aRuleDescriptions[] = 1330*cdf0e10cSrcweir { 1331*cdf0e10cSrcweir { OSQLParseNode::select_statement, "select_statement" }, 1332*cdf0e10cSrcweir { OSQLParseNode::table_exp, "table_exp" }, 1333*cdf0e10cSrcweir { OSQLParseNode::table_ref_commalist, "table_ref_commalist" }, 1334*cdf0e10cSrcweir { OSQLParseNode::table_ref, "table_ref" }, 1335*cdf0e10cSrcweir { OSQLParseNode::catalog_name, "catalog_name" }, 1336*cdf0e10cSrcweir { OSQLParseNode::schema_name, "schema_name" }, 1337*cdf0e10cSrcweir { OSQLParseNode::table_name, "table_name" }, 1338*cdf0e10cSrcweir { OSQLParseNode::opt_column_commalist, "opt_column_commalist" }, 1339*cdf0e10cSrcweir { OSQLParseNode::column_commalist, "column_commalist" }, 1340*cdf0e10cSrcweir { OSQLParseNode::column_ref_commalist, "column_ref_commalist" }, 1341*cdf0e10cSrcweir { OSQLParseNode::column_ref, "column_ref" }, 1342*cdf0e10cSrcweir { OSQLParseNode::opt_order_by_clause, "opt_order_by_clause" }, 1343*cdf0e10cSrcweir { OSQLParseNode::ordering_spec_commalist, "ordering_spec_commalist" }, 1344*cdf0e10cSrcweir { OSQLParseNode::ordering_spec, "ordering_spec" }, 1345*cdf0e10cSrcweir { OSQLParseNode::opt_asc_desc, "opt_asc_desc" }, 1346*cdf0e10cSrcweir { OSQLParseNode::where_clause, "where_clause" }, 1347*cdf0e10cSrcweir { OSQLParseNode::opt_where_clause, "opt_where_clause" }, 1348*cdf0e10cSrcweir { OSQLParseNode::search_condition, "search_condition" }, 1349*cdf0e10cSrcweir { OSQLParseNode::comparison_predicate, "comparison_predicate" }, 1350*cdf0e10cSrcweir { OSQLParseNode::between_predicate, "between_predicate" }, 1351*cdf0e10cSrcweir { OSQLParseNode::like_predicate, "like_predicate" }, 1352*cdf0e10cSrcweir { OSQLParseNode::opt_escape, "opt_escape" }, 1353*cdf0e10cSrcweir { OSQLParseNode::test_for_null, "test_for_null" }, 1354*cdf0e10cSrcweir { OSQLParseNode::scalar_exp_commalist, "scalar_exp_commalist" }, 1355*cdf0e10cSrcweir { OSQLParseNode::scalar_exp, "scalar_exp" }, 1356*cdf0e10cSrcweir { OSQLParseNode::parameter_ref, "parameter_ref" }, 1357*cdf0e10cSrcweir { OSQLParseNode::parameter, "parameter" }, 1358*cdf0e10cSrcweir { OSQLParseNode::general_set_fct, "general_set_fct" }, 1359*cdf0e10cSrcweir { OSQLParseNode::range_variable, "range_variable" }, 1360*cdf0e10cSrcweir { OSQLParseNode::column, "column" }, 1361*cdf0e10cSrcweir { OSQLParseNode::delete_statement_positioned, "delete_statement_positioned" }, 1362*cdf0e10cSrcweir { OSQLParseNode::delete_statement_searched, "delete_statement_searched" }, 1363*cdf0e10cSrcweir { OSQLParseNode::update_statement_positioned, "update_statement_positioned" }, 1364*cdf0e10cSrcweir { OSQLParseNode::update_statement_searched, "update_statement_searched" }, 1365*cdf0e10cSrcweir { OSQLParseNode::assignment_commalist, "assignment_commalist" }, 1366*cdf0e10cSrcweir { OSQLParseNode::assignment, "assignment" }, 1367*cdf0e10cSrcweir { OSQLParseNode::values_or_query_spec, "values_or_query_spec" }, 1368*cdf0e10cSrcweir { OSQLParseNode::insert_statement, "insert_statement" }, 1369*cdf0e10cSrcweir { OSQLParseNode::insert_atom_commalist, "insert_atom_commalist" }, 1370*cdf0e10cSrcweir { OSQLParseNode::insert_atom, "insert_atom" }, 1371*cdf0e10cSrcweir { OSQLParseNode::predicate_check, "predicate_check" }, 1372*cdf0e10cSrcweir { OSQLParseNode::from_clause, "from_clause" }, 1373*cdf0e10cSrcweir { OSQLParseNode::qualified_join, "qualified_join" }, 1374*cdf0e10cSrcweir { OSQLParseNode::cross_union, "cross_union" }, 1375*cdf0e10cSrcweir { OSQLParseNode::select_sublist, "select_sublist" }, 1376*cdf0e10cSrcweir { OSQLParseNode::derived_column, "derived_column" }, 1377*cdf0e10cSrcweir { OSQLParseNode::column_val, "column_val" }, 1378*cdf0e10cSrcweir { OSQLParseNode::set_fct_spec, "set_fct_spec" }, 1379*cdf0e10cSrcweir { OSQLParseNode::boolean_term, "boolean_term" }, 1380*cdf0e10cSrcweir { OSQLParseNode::boolean_primary, "boolean_primary" }, 1381*cdf0e10cSrcweir { OSQLParseNode::num_value_exp, "num_value_exp" }, 1382*cdf0e10cSrcweir { OSQLParseNode::join_type, "join_type" }, 1383*cdf0e10cSrcweir { OSQLParseNode::position_exp, "position_exp" }, 1384*cdf0e10cSrcweir { OSQLParseNode::extract_exp, "extract_exp" }, 1385*cdf0e10cSrcweir { OSQLParseNode::length_exp, "length_exp" }, 1386*cdf0e10cSrcweir { OSQLParseNode::char_value_fct, "char_value_fct" }, 1387*cdf0e10cSrcweir { OSQLParseNode::odbc_call_spec, "odbc_call_spec" }, 1388*cdf0e10cSrcweir { OSQLParseNode::in_predicate, "in_predicate" }, 1389*cdf0e10cSrcweir { OSQLParseNode::existence_test, "existence_test" }, 1390*cdf0e10cSrcweir { OSQLParseNode::unique_test, "unique_test" }, 1391*cdf0e10cSrcweir { OSQLParseNode::all_or_any_predicate, "all_or_any_predicate" }, 1392*cdf0e10cSrcweir { OSQLParseNode::named_columns_join, "named_columns_join" }, 1393*cdf0e10cSrcweir { OSQLParseNode::join_condition, "join_condition" }, 1394*cdf0e10cSrcweir { OSQLParseNode::joined_table, "joined_table" }, 1395*cdf0e10cSrcweir { OSQLParseNode::boolean_factor, "boolean_factor" }, 1396*cdf0e10cSrcweir { OSQLParseNode::sql_not, "sql_not" }, 1397*cdf0e10cSrcweir { OSQLParseNode::boolean_test, "boolean_test" }, 1398*cdf0e10cSrcweir { OSQLParseNode::manipulative_statement, "manipulative_statement" }, 1399*cdf0e10cSrcweir { OSQLParseNode::subquery, "subquery" }, 1400*cdf0e10cSrcweir { OSQLParseNode::value_exp_commalist, "value_exp_commalist" }, 1401*cdf0e10cSrcweir { OSQLParseNode::odbc_fct_spec, "odbc_fct_spec" }, 1402*cdf0e10cSrcweir { OSQLParseNode::union_statement, "union_statement" }, 1403*cdf0e10cSrcweir { OSQLParseNode::outer_join_type, "outer_join_type" }, 1404*cdf0e10cSrcweir { OSQLParseNode::char_value_exp, "char_value_exp" }, 1405*cdf0e10cSrcweir { OSQLParseNode::term, "term" }, 1406*cdf0e10cSrcweir { OSQLParseNode::value_exp_primary, "value_exp_primary" }, 1407*cdf0e10cSrcweir { OSQLParseNode::value_exp, "value_exp" }, 1408*cdf0e10cSrcweir { OSQLParseNode::selection, "selection" }, 1409*cdf0e10cSrcweir { OSQLParseNode::fold, "fold" }, 1410*cdf0e10cSrcweir { OSQLParseNode::char_substring_fct, "char_substring_fct" }, 1411*cdf0e10cSrcweir { OSQLParseNode::factor, "factor" }, 1412*cdf0e10cSrcweir { OSQLParseNode::base_table_def, "base_table_def" }, 1413*cdf0e10cSrcweir { OSQLParseNode::base_table_element_commalist, "base_table_element_commalist" }, 1414*cdf0e10cSrcweir { OSQLParseNode::data_type, "data_type" }, 1415*cdf0e10cSrcweir { OSQLParseNode::column_def, "column_def" }, 1416*cdf0e10cSrcweir { OSQLParseNode::table_node, "table_node" }, 1417*cdf0e10cSrcweir { OSQLParseNode::as, "as" }, 1418*cdf0e10cSrcweir { OSQLParseNode::op_column_commalist, "op_column_commalist" }, 1419*cdf0e10cSrcweir { OSQLParseNode::table_primary_as_range_column, "table_primary_as_range_column" }, 1420*cdf0e10cSrcweir { OSQLParseNode::datetime_primary, "datetime_primary" }, 1421*cdf0e10cSrcweir { OSQLParseNode::concatenation, "concatenation" }, 1422*cdf0e10cSrcweir { OSQLParseNode::char_factor, "char_factor" }, 1423*cdf0e10cSrcweir { OSQLParseNode::bit_value_fct, "bit_value_fct" }, 1424*cdf0e10cSrcweir { OSQLParseNode::comparison_predicate_part_2, "comparison_predicate_part_2" }, 1425*cdf0e10cSrcweir { OSQLParseNode::parenthesized_boolean_value_expression, "parenthesized_boolean_value_expression" }, 1426*cdf0e10cSrcweir { OSQLParseNode::character_string_type, "character_string_type" }, 1427*cdf0e10cSrcweir { OSQLParseNode::other_like_predicate_part_2, "other_like_predicate_part_2" }, 1428*cdf0e10cSrcweir { OSQLParseNode::between_predicate_part_2, "between_predicate_part_2" }, 1429*cdf0e10cSrcweir { OSQLParseNode::cast_spec, "cast_spec" } 1430*cdf0e10cSrcweir }; 1431*cdf0e10cSrcweir size_t nRuleMapCount = sizeof( aRuleDescriptions ) / sizeof( aRuleDescriptions[0] ); 1432*cdf0e10cSrcweir OSL_ENSURE( nRuleMapCount == size_t( OSQLParseNode::rule_count ), "OSQLParser::OSQLParser: added a new rule? Adjust this map!" ); 1433*cdf0e10cSrcweir 1434*cdf0e10cSrcweir for ( size_t mapEntry = 0; mapEntry < nRuleMapCount; ++mapEntry ) 1435*cdf0e10cSrcweir { 1436*cdf0e10cSrcweir // look up the rule description in the our identifier map 1437*cdf0e10cSrcweir sal_uInt32 nParserRuleID = StrToRuleID( aRuleDescriptions[ mapEntry ].sRuleName ); 1438*cdf0e10cSrcweir // map the parser's rule ID to the OSQLParseNode::Rule 1439*cdf0e10cSrcweir s_aReverseRuleIDLookup[ nParserRuleID ] = aRuleDescriptions[ mapEntry ].eRule; 1440*cdf0e10cSrcweir // and map the OSQLParseNode::Rule to the parser's rule ID 1441*cdf0e10cSrcweir s_nRuleIDs[ aRuleDescriptions[ mapEntry ].eRule ] = nParserRuleID; 1442*cdf0e10cSrcweir } 1443*cdf0e10cSrcweir } 1444*cdf0e10cSrcweir ++s_nRefCount; 1445*cdf0e10cSrcweir 1446*cdf0e10cSrcweir if (m_pContext == NULL) 1447*cdf0e10cSrcweir // take the default context 1448*cdf0e10cSrcweir m_pContext = &s_aDefaultContext; 1449*cdf0e10cSrcweir 1450*cdf0e10cSrcweir m_pData->aLocale = m_pContext->getPreferredLocale(); 1451*cdf0e10cSrcweir } 1452*cdf0e10cSrcweir 1453*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1454*cdf0e10cSrcweir OSQLParser::~OSQLParser() 1455*cdf0e10cSrcweir { 1456*cdf0e10cSrcweir { 1457*cdf0e10cSrcweir ::osl::MutexGuard aGuard(getMutex()); 1458*cdf0e10cSrcweir OSL_ENSURE(s_nRefCount > 0, "OSQLParser::~OSQLParser() : suspicious call : have a refcount of 0 !"); 1459*cdf0e10cSrcweir if (!--s_nRefCount) 1460*cdf0e10cSrcweir { 1461*cdf0e10cSrcweir s_pScanner->setScanner(sal_True); 1462*cdf0e10cSrcweir delete s_pScanner; 1463*cdf0e10cSrcweir s_pScanner = NULL; 1464*cdf0e10cSrcweir 1465*cdf0e10cSrcweir delete s_pGarbageCollector; 1466*cdf0e10cSrcweir s_pGarbageCollector = NULL; 1467*cdf0e10cSrcweir // is only set the first time so we should delete it only when there no more instances 1468*cdf0e10cSrcweir s_xLocaleData = NULL; 1469*cdf0e10cSrcweir 1470*cdf0e10cSrcweir RuleIDMap aEmpty; 1471*cdf0e10cSrcweir s_aReverseRuleIDLookup.swap( aEmpty ); 1472*cdf0e10cSrcweir } 1473*cdf0e10cSrcweir m_pParseTree = NULL; 1474*cdf0e10cSrcweir } 1475*cdf0e10cSrcweir } 1476*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1477*cdf0e10cSrcweir void OSQLParseNode::substituteParameterNames(OSQLParseNode* _pNode) 1478*cdf0e10cSrcweir { 1479*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::substituteParameterNames" ); 1480*cdf0e10cSrcweir sal_Int32 nCount = _pNode->count(); 1481*cdf0e10cSrcweir for(sal_Int32 i=0;i < nCount;++i) 1482*cdf0e10cSrcweir { 1483*cdf0e10cSrcweir OSQLParseNode* pChildNode = _pNode->getChild(i); 1484*cdf0e10cSrcweir if(SQL_ISRULE(pChildNode,parameter) && pChildNode->count() > 1) 1485*cdf0e10cSrcweir { 1486*cdf0e10cSrcweir OSQLParseNode* pNewNode = new OSQLParseNode(::rtl::OUString::createFromAscii("?") ,SQL_NODE_PUNCTUATION,0); 1487*cdf0e10cSrcweir delete pChildNode->replace(pChildNode->getChild(0),pNewNode); 1488*cdf0e10cSrcweir sal_Int32 nChildCount = pChildNode->count(); 1489*cdf0e10cSrcweir for(sal_Int32 j=1;j < nChildCount;++j) 1490*cdf0e10cSrcweir delete pChildNode->removeAt(1); 1491*cdf0e10cSrcweir } 1492*cdf0e10cSrcweir else 1493*cdf0e10cSrcweir substituteParameterNames(pChildNode); 1494*cdf0e10cSrcweir 1495*cdf0e10cSrcweir } 1496*cdf0e10cSrcweir } 1497*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1498*cdf0e10cSrcweir bool OSQLParser::extractDate(OSQLParseNode* pLiteral,double& _rfValue) 1499*cdf0e10cSrcweir { 1500*cdf0e10cSrcweir Reference< XNumberFormatsSupplier > xFormatSup = m_xFormatter->getNumberFormatsSupplier(); 1501*cdf0e10cSrcweir Reference< XNumberFormatTypes > xFormatTypes; 1502*cdf0e10cSrcweir if ( xFormatSup.is() ) 1503*cdf0e10cSrcweir xFormatTypes = xFormatTypes.query( xFormatSup->getNumberFormats() ); 1504*cdf0e10cSrcweir 1505*cdf0e10cSrcweir // if there is no format key, yet, make sure we have a feasible one for our locale 1506*cdf0e10cSrcweir try 1507*cdf0e10cSrcweir { 1508*cdf0e10cSrcweir if ( !m_nFormatKey && xFormatTypes.is() ) 1509*cdf0e10cSrcweir m_nFormatKey = ::dbtools::getDefaultNumberFormat( m_xField, xFormatTypes, m_pData->aLocale ); 1510*cdf0e10cSrcweir } 1511*cdf0e10cSrcweir catch( Exception& ) { } 1512*cdf0e10cSrcweir ::rtl::OUString sValue = pLiteral->getTokenValue(); 1513*cdf0e10cSrcweir sal_Int32 nTryFormat = m_nFormatKey; 1514*cdf0e10cSrcweir bool bSuccess = lcl_saveConvertToNumber( m_xFormatter, nTryFormat, sValue, _rfValue ); 1515*cdf0e10cSrcweir 1516*cdf0e10cSrcweir // If our format key didn't do, try the default date format for our locale. 1517*cdf0e10cSrcweir if ( !bSuccess && xFormatTypes.is() ) 1518*cdf0e10cSrcweir { 1519*cdf0e10cSrcweir try 1520*cdf0e10cSrcweir { 1521*cdf0e10cSrcweir nTryFormat = xFormatTypes->getStandardFormat( NumberFormat::DATE, m_pData->aLocale ); 1522*cdf0e10cSrcweir } 1523*cdf0e10cSrcweir catch( Exception& ) { } 1524*cdf0e10cSrcweir bSuccess = lcl_saveConvertToNumber( m_xFormatter, nTryFormat, sValue, _rfValue ); 1525*cdf0e10cSrcweir } 1526*cdf0e10cSrcweir 1527*cdf0e10cSrcweir // if this also didn't do, try ISO format 1528*cdf0e10cSrcweir if ( !bSuccess && xFormatTypes.is() ) 1529*cdf0e10cSrcweir { 1530*cdf0e10cSrcweir try 1531*cdf0e10cSrcweir { 1532*cdf0e10cSrcweir nTryFormat = xFormatTypes->getFormatIndex( NumberFormatIndex::DATE_DIN_YYYYMMDD, m_pData->aLocale ); 1533*cdf0e10cSrcweir } 1534*cdf0e10cSrcweir catch( Exception& ) { } 1535*cdf0e10cSrcweir bSuccess = lcl_saveConvertToNumber( m_xFormatter, nTryFormat, sValue, _rfValue ); 1536*cdf0e10cSrcweir } 1537*cdf0e10cSrcweir 1538*cdf0e10cSrcweir // if this also didn't do, try fallback date format (en-US) 1539*cdf0e10cSrcweir if ( !bSuccess ) 1540*cdf0e10cSrcweir { 1541*cdf0e10cSrcweir nTryFormat = m_nDateFormatKey; 1542*cdf0e10cSrcweir bSuccess = lcl_saveConvertToNumber( m_xFormatter, nTryFormat, sValue, _rfValue ); 1543*cdf0e10cSrcweir } 1544*cdf0e10cSrcweir return bSuccess; 1545*cdf0e10cSrcweir } 1546*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1547*cdf0e10cSrcweir OSQLParseNode* OSQLParser::buildDate(sal_Int32 _nType,OSQLParseNode*& pLiteral) 1548*cdf0e10cSrcweir { 1549*cdf0e10cSrcweir // try converting the string into a date, according to our format key 1550*cdf0e10cSrcweir double fValue = 0.0; 1551*cdf0e10cSrcweir OSQLParseNode* pFCTNode = NULL; 1552*cdf0e10cSrcweir 1553*cdf0e10cSrcweir if ( extractDate(pLiteral,fValue) ) 1554*cdf0e10cSrcweir pFCTNode = buildNode_Date( fValue, _nType); 1555*cdf0e10cSrcweir 1556*cdf0e10cSrcweir delete pLiteral; 1557*cdf0e10cSrcweir pLiteral = NULL; 1558*cdf0e10cSrcweir 1559*cdf0e10cSrcweir if ( !pFCTNode ) 1560*cdf0e10cSrcweir m_sErrorMessage = m_pContext->getErrorMessage(IParseContext::ERROR_INVALID_DATE_COMPARE); 1561*cdf0e10cSrcweir 1562*cdf0e10cSrcweir return pFCTNode; 1563*cdf0e10cSrcweir } 1564*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1565*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1566*cdf0e10cSrcweir OSQLParseNode::OSQLParseNode(const sal_Char * pNewValue, 1567*cdf0e10cSrcweir SQLNodeType eNewNodeType, 1568*cdf0e10cSrcweir sal_uInt32 nNewNodeID) 1569*cdf0e10cSrcweir :m_pParent(NULL) 1570*cdf0e10cSrcweir ,m_aNodeValue(pNewValue,strlen(pNewValue),RTL_TEXTENCODING_UTF8) 1571*cdf0e10cSrcweir ,m_eNodeType(eNewNodeType) 1572*cdf0e10cSrcweir ,m_nNodeID(nNewNodeID) 1573*cdf0e10cSrcweir { 1574*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::OSQLParseNode" ); 1575*cdf0e10cSrcweir 1576*cdf0e10cSrcweir OSL_ENSURE(m_eNodeType >= SQL_NODE_RULE && m_eNodeType <= SQL_NODE_CONCAT,"OSQLParseNode: mit unzulaessigem NodeType konstruiert"); 1577*cdf0e10cSrcweir } 1578*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1579*cdf0e10cSrcweir OSQLParseNode::OSQLParseNode(const ::rtl::OString &_rNewValue, 1580*cdf0e10cSrcweir SQLNodeType eNewNodeType, 1581*cdf0e10cSrcweir sal_uInt32 nNewNodeID) 1582*cdf0e10cSrcweir :m_pParent(NULL) 1583*cdf0e10cSrcweir ,m_aNodeValue(_rNewValue,_rNewValue.getLength(),RTL_TEXTENCODING_UTF8) 1584*cdf0e10cSrcweir ,m_eNodeType(eNewNodeType) 1585*cdf0e10cSrcweir ,m_nNodeID(nNewNodeID) 1586*cdf0e10cSrcweir { 1587*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::OSQLParseNode" ); 1588*cdf0e10cSrcweir 1589*cdf0e10cSrcweir OSL_ENSURE(m_eNodeType >= SQL_NODE_RULE && m_eNodeType <= SQL_NODE_CONCAT,"OSQLParseNode: mit unzulaessigem NodeType konstruiert"); 1590*cdf0e10cSrcweir } 1591*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1592*cdf0e10cSrcweir OSQLParseNode::OSQLParseNode(const sal_Unicode * pNewValue, 1593*cdf0e10cSrcweir SQLNodeType eNewNodeType, 1594*cdf0e10cSrcweir sal_uInt32 nNewNodeID) 1595*cdf0e10cSrcweir :m_pParent(NULL) 1596*cdf0e10cSrcweir ,m_aNodeValue(pNewValue) 1597*cdf0e10cSrcweir ,m_eNodeType(eNewNodeType) 1598*cdf0e10cSrcweir ,m_nNodeID(nNewNodeID) 1599*cdf0e10cSrcweir { 1600*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::OSQLParseNode" ); 1601*cdf0e10cSrcweir 1602*cdf0e10cSrcweir OSL_ENSURE(m_eNodeType >= SQL_NODE_RULE && m_eNodeType <= SQL_NODE_CONCAT,"OSQLParseNode: mit unzulaessigem NodeType konstruiert"); 1603*cdf0e10cSrcweir } 1604*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1605*cdf0e10cSrcweir OSQLParseNode::OSQLParseNode(const ::rtl::OUString &_rNewValue, 1606*cdf0e10cSrcweir SQLNodeType eNewNodeType, 1607*cdf0e10cSrcweir sal_uInt32 nNewNodeID) 1608*cdf0e10cSrcweir :m_pParent(NULL) 1609*cdf0e10cSrcweir ,m_aNodeValue(_rNewValue) 1610*cdf0e10cSrcweir ,m_eNodeType(eNewNodeType) 1611*cdf0e10cSrcweir ,m_nNodeID(nNewNodeID) 1612*cdf0e10cSrcweir { 1613*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::OSQLParseNode" ); 1614*cdf0e10cSrcweir 1615*cdf0e10cSrcweir OSL_ENSURE(m_eNodeType >= SQL_NODE_RULE && m_eNodeType <= SQL_NODE_CONCAT,"OSQLParseNode: mit unzulaessigem NodeType konstruiert"); 1616*cdf0e10cSrcweir } 1617*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1618*cdf0e10cSrcweir OSQLParseNode::OSQLParseNode(const OSQLParseNode& rParseNode) 1619*cdf0e10cSrcweir { 1620*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::OSQLParseNode" ); 1621*cdf0e10cSrcweir 1622*cdf0e10cSrcweir // klemm den getParent auf NULL 1623*cdf0e10cSrcweir m_pParent = NULL; 1624*cdf0e10cSrcweir 1625*cdf0e10cSrcweir // kopiere die member 1626*cdf0e10cSrcweir m_aNodeValue = rParseNode.m_aNodeValue; 1627*cdf0e10cSrcweir m_eNodeType = rParseNode.m_eNodeType; 1628*cdf0e10cSrcweir m_nNodeID = rParseNode.m_nNodeID; 1629*cdf0e10cSrcweir 1630*cdf0e10cSrcweir 1631*cdf0e10cSrcweir // denk dran, dass von Container abgeleitet wurde, laut SV-Help erzeugt 1632*cdf0e10cSrcweir // copy-Constructor des Containers einen neuen Container mit den gleichen 1633*cdf0e10cSrcweir // Zeigern als Inhalt -> d.h. nach dem Kopieren des Container wird fuer 1634*cdf0e10cSrcweir // alle Zeiger ungleich NULL eine Kopie hergestellt und anstelle des alten 1635*cdf0e10cSrcweir // Zeigers wieder eingehangen. 1636*cdf0e10cSrcweir 1637*cdf0e10cSrcweir // wenn kein Blatt, dann SubTrees bearbeiten 1638*cdf0e10cSrcweir for (OSQLParseNodes::const_iterator i = rParseNode.m_aChildren.begin(); 1639*cdf0e10cSrcweir i != rParseNode.m_aChildren.end(); i++) 1640*cdf0e10cSrcweir append(new OSQLParseNode(**i)); 1641*cdf0e10cSrcweir } 1642*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1643*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1644*cdf0e10cSrcweir OSQLParseNode& OSQLParseNode::operator=(const OSQLParseNode& rParseNode) 1645*cdf0e10cSrcweir { 1646*cdf0e10cSrcweir if (this != &rParseNode) 1647*cdf0e10cSrcweir { 1648*cdf0e10cSrcweir // kopiere die member - pParent bleibt der alte 1649*cdf0e10cSrcweir m_aNodeValue = rParseNode.m_aNodeValue; 1650*cdf0e10cSrcweir m_eNodeType = rParseNode.m_eNodeType; 1651*cdf0e10cSrcweir m_nNodeID = rParseNode.m_nNodeID; 1652*cdf0e10cSrcweir 1653*cdf0e10cSrcweir for (OSQLParseNodes::const_iterator i = m_aChildren.begin(); 1654*cdf0e10cSrcweir i != m_aChildren.end(); i++) 1655*cdf0e10cSrcweir delete *i; 1656*cdf0e10cSrcweir 1657*cdf0e10cSrcweir m_aChildren.clear(); 1658*cdf0e10cSrcweir 1659*cdf0e10cSrcweir for (OSQLParseNodes::const_iterator j = rParseNode.m_aChildren.begin(); 1660*cdf0e10cSrcweir j != rParseNode.m_aChildren.end(); j++) 1661*cdf0e10cSrcweir append(new OSQLParseNode(**j)); 1662*cdf0e10cSrcweir } 1663*cdf0e10cSrcweir return *this; 1664*cdf0e10cSrcweir } 1665*cdf0e10cSrcweir 1666*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1667*cdf0e10cSrcweir sal_Bool OSQLParseNode::operator==(OSQLParseNode& rParseNode) const 1668*cdf0e10cSrcweir { 1669*cdf0e10cSrcweir // die member muessen gleich sein 1670*cdf0e10cSrcweir sal_Bool bResult = (m_nNodeID == rParseNode.m_nNodeID) && 1671*cdf0e10cSrcweir (m_eNodeType == rParseNode.m_eNodeType) && 1672*cdf0e10cSrcweir (m_aNodeValue == rParseNode.m_aNodeValue) && 1673*cdf0e10cSrcweir count() == rParseNode.count(); 1674*cdf0e10cSrcweir 1675*cdf0e10cSrcweir // Parameters are not equal! 1676*cdf0e10cSrcweir bResult = bResult && !SQL_ISRULE(this, parameter); 1677*cdf0e10cSrcweir 1678*cdf0e10cSrcweir // compare childs 1679*cdf0e10cSrcweir for (sal_uInt32 i=0; bResult && i < count(); i++) 1680*cdf0e10cSrcweir bResult = *getChild(i) == *rParseNode.getChild(i); 1681*cdf0e10cSrcweir 1682*cdf0e10cSrcweir return bResult; 1683*cdf0e10cSrcweir } 1684*cdf0e10cSrcweir 1685*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1686*cdf0e10cSrcweir OSQLParseNode::~OSQLParseNode() 1687*cdf0e10cSrcweir { 1688*cdf0e10cSrcweir for (OSQLParseNodes::const_iterator i = m_aChildren.begin(); 1689*cdf0e10cSrcweir i != m_aChildren.end(); i++) 1690*cdf0e10cSrcweir delete *i; 1691*cdf0e10cSrcweir m_aChildren.clear(); 1692*cdf0e10cSrcweir } 1693*cdf0e10cSrcweir 1694*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1695*cdf0e10cSrcweir void OSQLParseNode::append(OSQLParseNode* pNewNode) 1696*cdf0e10cSrcweir { 1697*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::append" ); 1698*cdf0e10cSrcweir 1699*cdf0e10cSrcweir OSL_ENSURE(pNewNode != NULL, "OSQLParseNode: ungueltiger NewSubTree"); 1700*cdf0e10cSrcweir OSL_ENSURE(pNewNode->getParent() == NULL, "OSQLParseNode: Knoten ist kein Waise"); 1701*cdf0e10cSrcweir OSL_ENSURE(::std::find(m_aChildren.begin(), m_aChildren.end(), pNewNode) == m_aChildren.end(), 1702*cdf0e10cSrcweir "OSQLParseNode::append() Node already element of parent"); 1703*cdf0e10cSrcweir 1704*cdf0e10cSrcweir // stelle Verbindung zum getParent her: 1705*cdf0e10cSrcweir pNewNode->setParent( this ); 1706*cdf0e10cSrcweir // und haenge den SubTree hinten an 1707*cdf0e10cSrcweir m_aChildren.push_back(pNewNode); 1708*cdf0e10cSrcweir } 1709*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1710*cdf0e10cSrcweir sal_Bool OSQLParseNode::addDateValue(::rtl::OUStringBuffer& rString, const SQLParseNodeParameter& rParam) const 1711*cdf0e10cSrcweir { 1712*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::addDateValue" ); 1713*cdf0e10cSrcweir // special display for date/time values 1714*cdf0e10cSrcweir if (SQL_ISRULE(this,set_fct_spec) && SQL_ISPUNCTUATION(m_aChildren[0],"{")) 1715*cdf0e10cSrcweir { 1716*cdf0e10cSrcweir const OSQLParseNode* pODBCNode = m_aChildren[1]; 1717*cdf0e10cSrcweir const OSQLParseNode* pODBCNodeChild = pODBCNode->m_aChildren[0]; 1718*cdf0e10cSrcweir 1719*cdf0e10cSrcweir if (pODBCNodeChild->getNodeType() == SQL_NODE_KEYWORD && ( 1720*cdf0e10cSrcweir SQL_ISTOKEN(pODBCNodeChild, D) || 1721*cdf0e10cSrcweir SQL_ISTOKEN(pODBCNodeChild, T) || 1722*cdf0e10cSrcweir SQL_ISTOKEN(pODBCNodeChild, TS) )) 1723*cdf0e10cSrcweir { 1724*cdf0e10cSrcweir ::rtl::OUString suQuote(::rtl::OUString::createFromAscii("'")); 1725*cdf0e10cSrcweir if (rParam.bPredicate) 1726*cdf0e10cSrcweir { 1727*cdf0e10cSrcweir if (rParam.aMetaData.shouldEscapeDateTime()) 1728*cdf0e10cSrcweir { 1729*cdf0e10cSrcweir suQuote = ::rtl::OUString::createFromAscii("#"); 1730*cdf0e10cSrcweir } 1731*cdf0e10cSrcweir } 1732*cdf0e10cSrcweir else 1733*cdf0e10cSrcweir { 1734*cdf0e10cSrcweir if (rParam.aMetaData.shouldEscapeDateTime()) 1735*cdf0e10cSrcweir { 1736*cdf0e10cSrcweir // suQuote = ::rtl::OUString::createFromAscii("'"); 1737*cdf0e10cSrcweir return sal_False; 1738*cdf0e10cSrcweir } 1739*cdf0e10cSrcweir } 1740*cdf0e10cSrcweir 1741*cdf0e10cSrcweir if (rString.getLength()) 1742*cdf0e10cSrcweir rString.appendAscii(" "); 1743*cdf0e10cSrcweir rString.append(suQuote); 1744*cdf0e10cSrcweir const ::rtl::OUString sTokenValue = pODBCNode->m_aChildren[1]->getTokenValue(); 1745*cdf0e10cSrcweir if (SQL_ISTOKEN(pODBCNodeChild, D)) 1746*cdf0e10cSrcweir { 1747*cdf0e10cSrcweir rString.append(rParam.bPredicate ? convertDateString(rParam, sTokenValue) : sTokenValue); 1748*cdf0e10cSrcweir } 1749*cdf0e10cSrcweir else if (SQL_ISTOKEN(pODBCNodeChild, T)) 1750*cdf0e10cSrcweir { 1751*cdf0e10cSrcweir rString.append(rParam.bPredicate ? convertTimeString(rParam, sTokenValue) : sTokenValue); 1752*cdf0e10cSrcweir } 1753*cdf0e10cSrcweir else 1754*cdf0e10cSrcweir { 1755*cdf0e10cSrcweir rString.append(rParam.bPredicate ? convertDateTimeString(rParam, sTokenValue) : sTokenValue); 1756*cdf0e10cSrcweir } 1757*cdf0e10cSrcweir rString.append(suQuote); 1758*cdf0e10cSrcweir return sal_True; 1759*cdf0e10cSrcweir } 1760*cdf0e10cSrcweir } 1761*cdf0e10cSrcweir return sal_False; 1762*cdf0e10cSrcweir } 1763*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1764*cdf0e10cSrcweir void OSQLParseNode::replaceNodeValue(const ::rtl::OUString& rTableAlias,const ::rtl::OUString& rColumnName) 1765*cdf0e10cSrcweir { 1766*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::replaceNodeValue" ); 1767*cdf0e10cSrcweir for (sal_uInt32 i=0;i<count();++i) 1768*cdf0e10cSrcweir { 1769*cdf0e10cSrcweir if (SQL_ISRULE(this,column_ref) && count() == 1 && getChild(0)->getTokenValue() == rColumnName) 1770*cdf0e10cSrcweir { 1771*cdf0e10cSrcweir OSQLParseNode * pCol = removeAt((sal_uInt32)0); 1772*cdf0e10cSrcweir append(new OSQLParseNode(rTableAlias,SQL_NODE_NAME)); 1773*cdf0e10cSrcweir append(new OSQLParseNode(::rtl::OUString::createFromAscii("."),SQL_NODE_PUNCTUATION)); 1774*cdf0e10cSrcweir append(pCol); 1775*cdf0e10cSrcweir } 1776*cdf0e10cSrcweir else 1777*cdf0e10cSrcweir getChild(i)->replaceNodeValue(rTableAlias,rColumnName); 1778*cdf0e10cSrcweir } 1779*cdf0e10cSrcweir } 1780*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1781*cdf0e10cSrcweir OSQLParseNode* OSQLParseNode::getByRule(OSQLParseNode::Rule eRule) const 1782*cdf0e10cSrcweir { 1783*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::getByRule" ); 1784*cdf0e10cSrcweir OSQLParseNode* pRetNode = 0; 1785*cdf0e10cSrcweir if (isRule() && OSQLParser::RuleID(eRule) == getRuleID()) 1786*cdf0e10cSrcweir pRetNode = (OSQLParseNode*)this; 1787*cdf0e10cSrcweir else 1788*cdf0e10cSrcweir { 1789*cdf0e10cSrcweir for (OSQLParseNodes::const_iterator i = m_aChildren.begin(); 1790*cdf0e10cSrcweir !pRetNode && i != m_aChildren.end(); i++) 1791*cdf0e10cSrcweir pRetNode = (*i)->getByRule(eRule); 1792*cdf0e10cSrcweir } 1793*cdf0e10cSrcweir return pRetNode; 1794*cdf0e10cSrcweir } 1795*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1796*cdf0e10cSrcweir OSQLParseNode* MakeANDNode(OSQLParseNode *pLeftLeaf,OSQLParseNode *pRightLeaf) 1797*cdf0e10cSrcweir { 1798*cdf0e10cSrcweir OSQLParseNode* pNewNode = new OSQLParseNode(::rtl::OUString(),SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::boolean_term)); 1799*cdf0e10cSrcweir pNewNode->append(pLeftLeaf); 1800*cdf0e10cSrcweir pNewNode->append(new OSQLParseNode(::rtl::OUString::createFromAscii("AND"),SQL_NODE_KEYWORD,SQL_TOKEN_AND)); 1801*cdf0e10cSrcweir pNewNode->append(pRightLeaf); 1802*cdf0e10cSrcweir return pNewNode; 1803*cdf0e10cSrcweir } 1804*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1805*cdf0e10cSrcweir OSQLParseNode* MakeORNode(OSQLParseNode *pLeftLeaf,OSQLParseNode *pRightLeaf) 1806*cdf0e10cSrcweir { 1807*cdf0e10cSrcweir OSQLParseNode* pNewNode = new OSQLParseNode(::rtl::OUString(),SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::search_condition)); 1808*cdf0e10cSrcweir pNewNode->append(pLeftLeaf); 1809*cdf0e10cSrcweir pNewNode->append(new OSQLParseNode(::rtl::OUString::createFromAscii("OR"),SQL_NODE_KEYWORD,SQL_TOKEN_OR)); 1810*cdf0e10cSrcweir pNewNode->append(pRightLeaf); 1811*cdf0e10cSrcweir return pNewNode; 1812*cdf0e10cSrcweir } 1813*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1814*cdf0e10cSrcweir void OSQLParseNode::disjunctiveNormalForm(OSQLParseNode*& pSearchCondition) 1815*cdf0e10cSrcweir { 1816*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::disjunctiveNormalForm" ); 1817*cdf0e10cSrcweir if(!pSearchCondition) // no where condition at entry point 1818*cdf0e10cSrcweir return; 1819*cdf0e10cSrcweir 1820*cdf0e10cSrcweir OSQLParseNode::absorptions(pSearchCondition); 1821*cdf0e10cSrcweir // '(' search_condition ')' 1822*cdf0e10cSrcweir if (SQL_ISRULE(pSearchCondition,boolean_primary)) 1823*cdf0e10cSrcweir { 1824*cdf0e10cSrcweir OSQLParseNode* pLeft = pSearchCondition->getChild(1); 1825*cdf0e10cSrcweir disjunctiveNormalForm(pLeft); 1826*cdf0e10cSrcweir } 1827*cdf0e10cSrcweir // search_condition SQL_TOKEN_OR boolean_term 1828*cdf0e10cSrcweir else if (SQL_ISRULE(pSearchCondition,search_condition)) 1829*cdf0e10cSrcweir { 1830*cdf0e10cSrcweir OSQLParseNode* pLeft = pSearchCondition->getChild(0); 1831*cdf0e10cSrcweir disjunctiveNormalForm(pLeft); 1832*cdf0e10cSrcweir 1833*cdf0e10cSrcweir OSQLParseNode* pRight = pSearchCondition->getChild(2); 1834*cdf0e10cSrcweir disjunctiveNormalForm(pRight); 1835*cdf0e10cSrcweir } 1836*cdf0e10cSrcweir // boolean_term SQL_TOKEN_AND boolean_factor 1837*cdf0e10cSrcweir else if (SQL_ISRULE(pSearchCondition,boolean_term)) 1838*cdf0e10cSrcweir { 1839*cdf0e10cSrcweir OSQLParseNode* pLeft = pSearchCondition->getChild(0); 1840*cdf0e10cSrcweir disjunctiveNormalForm(pLeft); 1841*cdf0e10cSrcweir 1842*cdf0e10cSrcweir OSQLParseNode* pRight = pSearchCondition->getChild(2); 1843*cdf0e10cSrcweir disjunctiveNormalForm(pRight); 1844*cdf0e10cSrcweir 1845*cdf0e10cSrcweir OSQLParseNode* pNewNode = NULL; 1846*cdf0e10cSrcweir // '(' search_condition ')' on left side 1847*cdf0e10cSrcweir if(pLeft->count() == 3 && SQL_ISRULE(pLeft,boolean_primary) && SQL_ISRULE(pLeft->getChild(1),search_condition)) 1848*cdf0e10cSrcweir { 1849*cdf0e10cSrcweir // and-or tree on left side 1850*cdf0e10cSrcweir OSQLParseNode* pOr = pLeft->getChild(1); 1851*cdf0e10cSrcweir OSQLParseNode* pNewLeft = NULL; 1852*cdf0e10cSrcweir OSQLParseNode* pNewRight = NULL; 1853*cdf0e10cSrcweir 1854*cdf0e10cSrcweir // cut right from parent 1855*cdf0e10cSrcweir pSearchCondition->removeAt(2); 1856*cdf0e10cSrcweir 1857*cdf0e10cSrcweir pNewRight = MakeANDNode(pOr->removeAt(2) ,pRight); 1858*cdf0e10cSrcweir pNewLeft = MakeANDNode(pOr->removeAt((sal_uInt32)0) ,new OSQLParseNode(*pRight)); 1859*cdf0e10cSrcweir pNewNode = MakeORNode(pNewLeft,pNewRight); 1860*cdf0e10cSrcweir // and append new Node 1861*cdf0e10cSrcweir replaceAndReset(pSearchCondition,pNewNode); 1862*cdf0e10cSrcweir 1863*cdf0e10cSrcweir disjunctiveNormalForm(pSearchCondition); 1864*cdf0e10cSrcweir } 1865*cdf0e10cSrcweir else if(pRight->count() == 3 && SQL_ISRULE(pRight,boolean_primary) && SQL_ISRULE(pRight->getChild(1),search_condition)) 1866*cdf0e10cSrcweir { // '(' search_condition ')' on right side 1867*cdf0e10cSrcweir // and-or tree on right side 1868*cdf0e10cSrcweir // a and (b or c) 1869*cdf0e10cSrcweir OSQLParseNode* pOr = pRight->getChild(1); 1870*cdf0e10cSrcweir OSQLParseNode* pNewLeft = NULL; 1871*cdf0e10cSrcweir OSQLParseNode* pNewRight = NULL; 1872*cdf0e10cSrcweir 1873*cdf0e10cSrcweir // cut left from parent 1874*cdf0e10cSrcweir pSearchCondition->removeAt((sal_uInt32)0); 1875*cdf0e10cSrcweir 1876*cdf0e10cSrcweir pNewRight = MakeANDNode(pLeft,pOr->removeAt(2)); 1877*cdf0e10cSrcweir pNewLeft = MakeANDNode(new OSQLParseNode(*pLeft),pOr->removeAt((sal_uInt32)0)); 1878*cdf0e10cSrcweir pNewNode = MakeORNode(pNewLeft,pNewRight); 1879*cdf0e10cSrcweir 1880*cdf0e10cSrcweir // and append new Node 1881*cdf0e10cSrcweir replaceAndReset(pSearchCondition,pNewNode); 1882*cdf0e10cSrcweir disjunctiveNormalForm(pSearchCondition); 1883*cdf0e10cSrcweir } 1884*cdf0e10cSrcweir else if(SQL_ISRULE(pLeft,boolean_primary) && (!SQL_ISRULE(pLeft->getChild(1),search_condition) || !SQL_ISRULE(pLeft->getChild(1),boolean_term))) 1885*cdf0e10cSrcweir pSearchCondition->replace(pLeft, pLeft->removeAt(1)); 1886*cdf0e10cSrcweir else if(SQL_ISRULE(pRight,boolean_primary) && (!SQL_ISRULE(pRight->getChild(1),search_condition) || !SQL_ISRULE(pRight->getChild(1),boolean_term))) 1887*cdf0e10cSrcweir pSearchCondition->replace(pRight, pRight->removeAt(1)); 1888*cdf0e10cSrcweir } 1889*cdf0e10cSrcweir } 1890*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1891*cdf0e10cSrcweir void OSQLParseNode::negateSearchCondition(OSQLParseNode*& pSearchCondition,sal_Bool bNegate) 1892*cdf0e10cSrcweir { 1893*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::negateSearchCondition" ); 1894*cdf0e10cSrcweir if(!pSearchCondition) // no where condition at entry point 1895*cdf0e10cSrcweir return; 1896*cdf0e10cSrcweir // '(' search_condition ')' 1897*cdf0e10cSrcweir if (pSearchCondition->count() == 3 && SQL_ISRULE(pSearchCondition,boolean_primary)) 1898*cdf0e10cSrcweir { 1899*cdf0e10cSrcweir OSQLParseNode* pRight = pSearchCondition->getChild(1); 1900*cdf0e10cSrcweir negateSearchCondition(pRight,bNegate); 1901*cdf0e10cSrcweir } 1902*cdf0e10cSrcweir // search_condition SQL_TOKEN_OR boolean_term 1903*cdf0e10cSrcweir else if (SQL_ISRULE(pSearchCondition,search_condition)) 1904*cdf0e10cSrcweir { 1905*cdf0e10cSrcweir OSQLParseNode* pLeft = pSearchCondition->getChild(0); 1906*cdf0e10cSrcweir OSQLParseNode* pRight = pSearchCondition->getChild(2); 1907*cdf0e10cSrcweir if(bNegate) 1908*cdf0e10cSrcweir { 1909*cdf0e10cSrcweir OSQLParseNode* pNewNode = new OSQLParseNode(::rtl::OUString(),SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::boolean_term)); 1910*cdf0e10cSrcweir pNewNode->append(pSearchCondition->removeAt((sal_uInt32)0)); 1911*cdf0e10cSrcweir pNewNode->append(new OSQLParseNode(::rtl::OUString::createFromAscii("AND"),SQL_NODE_KEYWORD,SQL_TOKEN_AND)); 1912*cdf0e10cSrcweir pNewNode->append(pSearchCondition->removeAt((sal_uInt32)1)); 1913*cdf0e10cSrcweir replaceAndReset(pSearchCondition,pNewNode); 1914*cdf0e10cSrcweir 1915*cdf0e10cSrcweir pLeft = pNewNode->getChild(0); 1916*cdf0e10cSrcweir pRight = pNewNode->getChild(2); 1917*cdf0e10cSrcweir } 1918*cdf0e10cSrcweir 1919*cdf0e10cSrcweir negateSearchCondition(pLeft,bNegate); 1920*cdf0e10cSrcweir negateSearchCondition(pRight,bNegate); 1921*cdf0e10cSrcweir } 1922*cdf0e10cSrcweir // boolean_term SQL_TOKEN_AND boolean_factor 1923*cdf0e10cSrcweir else if (SQL_ISRULE(pSearchCondition,boolean_term)) 1924*cdf0e10cSrcweir { 1925*cdf0e10cSrcweir OSQLParseNode* pLeft = pSearchCondition->getChild(0); 1926*cdf0e10cSrcweir OSQLParseNode* pRight = pSearchCondition->getChild(2); 1927*cdf0e10cSrcweir if(bNegate) 1928*cdf0e10cSrcweir { 1929*cdf0e10cSrcweir OSQLParseNode* pNewNode = new OSQLParseNode(::rtl::OUString(),SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::search_condition)); 1930*cdf0e10cSrcweir pNewNode->append(pSearchCondition->removeAt((sal_uInt32)0)); 1931*cdf0e10cSrcweir pNewNode->append(new OSQLParseNode(::rtl::OUString::createFromAscii("OR"),SQL_NODE_KEYWORD,SQL_TOKEN_OR)); 1932*cdf0e10cSrcweir pNewNode->append(pSearchCondition->removeAt((sal_uInt32)1)); 1933*cdf0e10cSrcweir replaceAndReset(pSearchCondition,pNewNode); 1934*cdf0e10cSrcweir 1935*cdf0e10cSrcweir pLeft = pNewNode->getChild(0); 1936*cdf0e10cSrcweir pRight = pNewNode->getChild(2); 1937*cdf0e10cSrcweir } 1938*cdf0e10cSrcweir 1939*cdf0e10cSrcweir negateSearchCondition(pLeft,bNegate); 1940*cdf0e10cSrcweir negateSearchCondition(pRight,bNegate); 1941*cdf0e10cSrcweir } 1942*cdf0e10cSrcweir // SQL_TOKEN_NOT ( boolean_test ) 1943*cdf0e10cSrcweir else if (SQL_ISRULE(pSearchCondition,boolean_factor)) 1944*cdf0e10cSrcweir { 1945*cdf0e10cSrcweir OSQLParseNode *pNot = pSearchCondition->removeAt((sal_uInt32)0); 1946*cdf0e10cSrcweir delete pNot; 1947*cdf0e10cSrcweir OSQLParseNode *pBooleanTest = pSearchCondition->removeAt((sal_uInt32)0); 1948*cdf0e10cSrcweir // TODO is this needed // pBooleanTest->setParent(NULL); 1949*cdf0e10cSrcweir replaceAndReset(pSearchCondition,pBooleanTest); 1950*cdf0e10cSrcweir 1951*cdf0e10cSrcweir if (!bNegate) 1952*cdf0e10cSrcweir negateSearchCondition(pSearchCondition,sal_True); // negate all deeper values 1953*cdf0e10cSrcweir } 1954*cdf0e10cSrcweir // row_value_constructor comparison row_value_constructor 1955*cdf0e10cSrcweir // row_value_constructor comparison any_all_some subquery 1956*cdf0e10cSrcweir else if(bNegate && (SQL_ISRULE(pSearchCondition,comparison_predicate) || SQL_ISRULE(pSearchCondition,all_or_any_predicate))) 1957*cdf0e10cSrcweir { 1958*cdf0e10cSrcweir OSQLParseNode* pComparison = pSearchCondition->getChild(1); 1959*cdf0e10cSrcweir OSQLParseNode* pNewComparison = NULL; 1960*cdf0e10cSrcweir switch(pComparison->getNodeType()) 1961*cdf0e10cSrcweir { 1962*cdf0e10cSrcweir case SQL_NODE_EQUAL: 1963*cdf0e10cSrcweir pNewComparison = new OSQLParseNode(::rtl::OUString::createFromAscii("<>"),SQL_NODE_NOTEQUAL,SQL_NOTEQUAL); 1964*cdf0e10cSrcweir break; 1965*cdf0e10cSrcweir case SQL_NODE_LESS: 1966*cdf0e10cSrcweir pNewComparison = new OSQLParseNode(::rtl::OUString::createFromAscii(">="),SQL_NODE_GREATEQ,SQL_GREATEQ); 1967*cdf0e10cSrcweir break; 1968*cdf0e10cSrcweir case SQL_NODE_GREAT: 1969*cdf0e10cSrcweir pNewComparison = new OSQLParseNode(::rtl::OUString::createFromAscii("<="),SQL_NODE_LESSEQ,SQL_LESSEQ); 1970*cdf0e10cSrcweir break; 1971*cdf0e10cSrcweir case SQL_NODE_LESSEQ: 1972*cdf0e10cSrcweir pNewComparison = new OSQLParseNode(::rtl::OUString::createFromAscii(">"),SQL_NODE_GREAT,SQL_GREAT); 1973*cdf0e10cSrcweir break; 1974*cdf0e10cSrcweir case SQL_NODE_GREATEQ: 1975*cdf0e10cSrcweir pNewComparison = new OSQLParseNode(::rtl::OUString::createFromAscii("<"),SQL_NODE_LESS,SQL_LESS); 1976*cdf0e10cSrcweir break; 1977*cdf0e10cSrcweir case SQL_NODE_NOTEQUAL: 1978*cdf0e10cSrcweir pNewComparison = new OSQLParseNode(::rtl::OUString::createFromAscii("="),SQL_NODE_EQUAL,SQL_EQUAL); 1979*cdf0e10cSrcweir break; 1980*cdf0e10cSrcweir default: 1981*cdf0e10cSrcweir OSL_ENSURE( false, "OSQLParseNode::negateSearchCondition: unexpected node type!" ); 1982*cdf0e10cSrcweir break; 1983*cdf0e10cSrcweir } 1984*cdf0e10cSrcweir pSearchCondition->replace(pComparison, pNewComparison); 1985*cdf0e10cSrcweir delete pComparison; 1986*cdf0e10cSrcweir } 1987*cdf0e10cSrcweir 1988*cdf0e10cSrcweir else if(bNegate && (SQL_ISRULE(pSearchCondition,test_for_null) || SQL_ISRULE(pSearchCondition,in_predicate) || 1989*cdf0e10cSrcweir SQL_ISRULE(pSearchCondition,between_predicate) || SQL_ISRULE(pSearchCondition,boolean_test) )) 1990*cdf0e10cSrcweir { 1991*cdf0e10cSrcweir OSQLParseNode* pPart2 = pSearchCondition; 1992*cdf0e10cSrcweir if ( !SQL_ISRULE(pSearchCondition,boolean_test) ) 1993*cdf0e10cSrcweir pPart2 = pSearchCondition->getChild(1); 1994*cdf0e10cSrcweir sal_uInt32 nNotPos = 0; 1995*cdf0e10cSrcweir if ( SQL_ISRULE( pSearchCondition, test_for_null ) ) 1996*cdf0e10cSrcweir nNotPos = 1; 1997*cdf0e10cSrcweir else if ( SQL_ISRULE( pSearchCondition, boolean_test ) ) 1998*cdf0e10cSrcweir nNotPos = 2; 1999*cdf0e10cSrcweir 2000*cdf0e10cSrcweir OSQLParseNode* pNot = pPart2->getChild(nNotPos); 2001*cdf0e10cSrcweir OSQLParseNode* pNotNot = NULL; 2002*cdf0e10cSrcweir if(pNot->isRule()) 2003*cdf0e10cSrcweir pNotNot = new OSQLParseNode(::rtl::OUString::createFromAscii("NOT"),SQL_NODE_KEYWORD,SQL_TOKEN_NOT); 2004*cdf0e10cSrcweir else 2005*cdf0e10cSrcweir pNotNot = new OSQLParseNode(::rtl::OUString(),SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::sql_not)); 2006*cdf0e10cSrcweir pPart2->replace(pNot, pNotNot); 2007*cdf0e10cSrcweir delete pNot; 2008*cdf0e10cSrcweir } 2009*cdf0e10cSrcweir else if(bNegate && (SQL_ISRULE(pSearchCondition,like_predicate))) 2010*cdf0e10cSrcweir { 2011*cdf0e10cSrcweir OSQLParseNode* pNot = pSearchCondition->getChild( 1 )->getChild( 0 ); 2012*cdf0e10cSrcweir OSQLParseNode* pNotNot = NULL; 2013*cdf0e10cSrcweir if(pNot->isRule()) 2014*cdf0e10cSrcweir pNotNot = new OSQLParseNode(::rtl::OUString::createFromAscii("NOT"),SQL_NODE_KEYWORD,SQL_TOKEN_NOT); 2015*cdf0e10cSrcweir else 2016*cdf0e10cSrcweir pNotNot = new OSQLParseNode(::rtl::OUString(),SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::sql_not)); 2017*cdf0e10cSrcweir pSearchCondition->getChild( 1 )->replace(pNot, pNotNot); 2018*cdf0e10cSrcweir delete pNot; 2019*cdf0e10cSrcweir } 2020*cdf0e10cSrcweir } 2021*cdf0e10cSrcweir //----------------------------------------------------------------------------- 2022*cdf0e10cSrcweir void OSQLParseNode::eraseBraces(OSQLParseNode*& pSearchCondition) 2023*cdf0e10cSrcweir { 2024*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::eraseBraces" ); 2025*cdf0e10cSrcweir if (pSearchCondition && (SQL_ISRULE(pSearchCondition,boolean_primary) || (pSearchCondition->count() == 3 && SQL_ISPUNCTUATION(pSearchCondition->getChild(0),"(") && 2026*cdf0e10cSrcweir SQL_ISPUNCTUATION(pSearchCondition->getChild(2),")")))) 2027*cdf0e10cSrcweir { 2028*cdf0e10cSrcweir OSQLParseNode* pRight = pSearchCondition->getChild(1); 2029*cdf0e10cSrcweir absorptions(pRight); 2030*cdf0e10cSrcweir // if child is not a or or and tree then delete () around child 2031*cdf0e10cSrcweir if(!(SQL_ISRULE(pSearchCondition->getChild(1),boolean_term) || SQL_ISRULE(pSearchCondition->getChild(1),search_condition)) || 2032*cdf0e10cSrcweir SQL_ISRULE(pSearchCondition->getChild(1),boolean_term) || // and can always stand without () 2033*cdf0e10cSrcweir (SQL_ISRULE(pSearchCondition->getChild(1),search_condition) && SQL_ISRULE(pSearchCondition->getParent(),search_condition))) 2034*cdf0e10cSrcweir { 2035*cdf0e10cSrcweir OSQLParseNode* pNode = pSearchCondition->removeAt(1); 2036*cdf0e10cSrcweir replaceAndReset(pSearchCondition,pNode); 2037*cdf0e10cSrcweir } 2038*cdf0e10cSrcweir } 2039*cdf0e10cSrcweir } 2040*cdf0e10cSrcweir //----------------------------------------------------------------------------- 2041*cdf0e10cSrcweir void OSQLParseNode::absorptions(OSQLParseNode*& pSearchCondition) 2042*cdf0e10cSrcweir { 2043*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::absorptions" ); 2044*cdf0e10cSrcweir if(!pSearchCondition) // no where condition at entry point 2045*cdf0e10cSrcweir return; 2046*cdf0e10cSrcweir 2047*cdf0e10cSrcweir eraseBraces(pSearchCondition); 2048*cdf0e10cSrcweir 2049*cdf0e10cSrcweir if(SQL_ISRULE(pSearchCondition,boolean_term) || SQL_ISRULE(pSearchCondition,search_condition)) 2050*cdf0e10cSrcweir { 2051*cdf0e10cSrcweir OSQLParseNode* pLeft = pSearchCondition->getChild(0); 2052*cdf0e10cSrcweir absorptions(pLeft); 2053*cdf0e10cSrcweir OSQLParseNode* pRight = pSearchCondition->getChild(2); 2054*cdf0e10cSrcweir absorptions(pRight); 2055*cdf0e10cSrcweir } 2056*cdf0e10cSrcweir 2057*cdf0e10cSrcweir sal_uInt32 nPos = 0; 2058*cdf0e10cSrcweir // a and a || a or a 2059*cdf0e10cSrcweir OSQLParseNode* pNewNode = NULL; 2060*cdf0e10cSrcweir if(( SQL_ISRULE(pSearchCondition,boolean_term) || SQL_ISRULE(pSearchCondition,search_condition)) 2061*cdf0e10cSrcweir && *pSearchCondition->getChild(0) == *pSearchCondition->getChild(2)) 2062*cdf0e10cSrcweir { 2063*cdf0e10cSrcweir pNewNode = pSearchCondition->removeAt((sal_uInt32)0); 2064*cdf0e10cSrcweir replaceAndReset(pSearchCondition,pNewNode); 2065*cdf0e10cSrcweir } 2066*cdf0e10cSrcweir // (a or b) and a || ( b or c ) and a 2067*cdf0e10cSrcweir // a and ( a or b) || a and ( b or c ) 2068*cdf0e10cSrcweir else if ( SQL_ISRULE(pSearchCondition,boolean_term) 2069*cdf0e10cSrcweir && ( 2070*cdf0e10cSrcweir ( SQL_ISRULE(pSearchCondition->getChild(nPos = 0),boolean_primary) 2071*cdf0e10cSrcweir || SQL_ISRULE(pSearchCondition->getChild(nPos),search_condition) 2072*cdf0e10cSrcweir ) 2073*cdf0e10cSrcweir || ( SQL_ISRULE(pSearchCondition->getChild(nPos = 2),boolean_primary) 2074*cdf0e10cSrcweir || SQL_ISRULE(pSearchCondition->getChild(nPos),search_condition) 2075*cdf0e10cSrcweir ) 2076*cdf0e10cSrcweir ) 2077*cdf0e10cSrcweir ) 2078*cdf0e10cSrcweir { 2079*cdf0e10cSrcweir OSQLParseNode* p2ndSearch = pSearchCondition->getChild(nPos); 2080*cdf0e10cSrcweir if ( SQL_ISRULE(p2ndSearch,boolean_primary) ) 2081*cdf0e10cSrcweir p2ndSearch = p2ndSearch->getChild(1); 2082*cdf0e10cSrcweir 2083*cdf0e10cSrcweir if ( *p2ndSearch->getChild(0) == *pSearchCondition->getChild(2-nPos) ) // a and ( a or b) -> a or b 2084*cdf0e10cSrcweir { 2085*cdf0e10cSrcweir pNewNode = pSearchCondition->removeAt((sal_uInt32)0); 2086*cdf0e10cSrcweir replaceAndReset(pSearchCondition,pNewNode); 2087*cdf0e10cSrcweir 2088*cdf0e10cSrcweir } 2089*cdf0e10cSrcweir else if ( *p2ndSearch->getChild(2) == *pSearchCondition->getChild(2-nPos) ) // a and ( b or a) -> a or b 2090*cdf0e10cSrcweir { 2091*cdf0e10cSrcweir pNewNode = pSearchCondition->removeAt((sal_uInt32)2); 2092*cdf0e10cSrcweir replaceAndReset(pSearchCondition,pNewNode); 2093*cdf0e10cSrcweir } 2094*cdf0e10cSrcweir else if ( p2ndSearch->getByRule(OSQLParseNode::search_condition) ) 2095*cdf0e10cSrcweir { 2096*cdf0e10cSrcweir // a and ( b or c ) -> ( a and b ) or ( a and c ) 2097*cdf0e10cSrcweir // ( b or c ) and a -> ( a and b ) or ( a and c ) 2098*cdf0e10cSrcweir OSQLParseNode* pC = p2ndSearch->removeAt((sal_uInt32)2); 2099*cdf0e10cSrcweir OSQLParseNode* pB = p2ndSearch->removeAt((sal_uInt32)0); 2100*cdf0e10cSrcweir OSQLParseNode* pA = pSearchCondition->removeAt((sal_uInt32)2-nPos); 2101*cdf0e10cSrcweir 2102*cdf0e10cSrcweir OSQLParseNode* p1stAnd = MakeANDNode(pA,pB); 2103*cdf0e10cSrcweir OSQLParseNode* p2ndAnd = MakeANDNode(new OSQLParseNode(*pA),pC); 2104*cdf0e10cSrcweir pNewNode = MakeORNode(p1stAnd,p2ndAnd); 2105*cdf0e10cSrcweir OSQLParseNode* pNode = new OSQLParseNode(::rtl::OUString(),SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::boolean_primary)); 2106*cdf0e10cSrcweir pNode->append(new OSQLParseNode(::rtl::OUString::createFromAscii("("),SQL_NODE_PUNCTUATION)); 2107*cdf0e10cSrcweir pNode->append(pNewNode); 2108*cdf0e10cSrcweir pNode->append(new OSQLParseNode(::rtl::OUString::createFromAscii(")"),SQL_NODE_PUNCTUATION)); 2109*cdf0e10cSrcweir OSQLParseNode::eraseBraces(p1stAnd); 2110*cdf0e10cSrcweir OSQLParseNode::eraseBraces(p2ndAnd); 2111*cdf0e10cSrcweir replaceAndReset(pSearchCondition,pNode); 2112*cdf0e10cSrcweir } 2113*cdf0e10cSrcweir } 2114*cdf0e10cSrcweir // a or a and b || a or b and a 2115*cdf0e10cSrcweir else if(SQL_ISRULE(pSearchCondition,search_condition) && SQL_ISRULE(pSearchCondition->getChild(2),boolean_term)) 2116*cdf0e10cSrcweir { 2117*cdf0e10cSrcweir if(*pSearchCondition->getChild(2)->getChild(0) == *pSearchCondition->getChild(0)) 2118*cdf0e10cSrcweir { 2119*cdf0e10cSrcweir pNewNode = pSearchCondition->removeAt((sal_uInt32)0); 2120*cdf0e10cSrcweir replaceAndReset(pSearchCondition,pNewNode); 2121*cdf0e10cSrcweir } 2122*cdf0e10cSrcweir else if(*pSearchCondition->getChild(2)->getChild(2) == *pSearchCondition->getChild(0)) 2123*cdf0e10cSrcweir { 2124*cdf0e10cSrcweir pNewNode = pSearchCondition->removeAt((sal_uInt32)0); 2125*cdf0e10cSrcweir replaceAndReset(pSearchCondition,pNewNode); 2126*cdf0e10cSrcweir } 2127*cdf0e10cSrcweir } 2128*cdf0e10cSrcweir // a and b or a || b and a or a 2129*cdf0e10cSrcweir else if(SQL_ISRULE(pSearchCondition,search_condition) && SQL_ISRULE(pSearchCondition->getChild(0),boolean_term)) 2130*cdf0e10cSrcweir { 2131*cdf0e10cSrcweir if(*pSearchCondition->getChild(0)->getChild(0) == *pSearchCondition->getChild(2)) 2132*cdf0e10cSrcweir { 2133*cdf0e10cSrcweir pNewNode = pSearchCondition->removeAt((sal_uInt32)2); 2134*cdf0e10cSrcweir replaceAndReset(pSearchCondition,pNewNode); 2135*cdf0e10cSrcweir } 2136*cdf0e10cSrcweir else if(*pSearchCondition->getChild(0)->getChild(2) == *pSearchCondition->getChild(2)) 2137*cdf0e10cSrcweir { 2138*cdf0e10cSrcweir pNewNode = pSearchCondition->removeAt((sal_uInt32)2); 2139*cdf0e10cSrcweir replaceAndReset(pSearchCondition,pNewNode); 2140*cdf0e10cSrcweir } 2141*cdf0e10cSrcweir } 2142*cdf0e10cSrcweir eraseBraces(pSearchCondition); 2143*cdf0e10cSrcweir } 2144*cdf0e10cSrcweir //----------------------------------------------------------------------------- 2145*cdf0e10cSrcweir void OSQLParseNode::compress(OSQLParseNode *&pSearchCondition) 2146*cdf0e10cSrcweir { 2147*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::compress" ); 2148*cdf0e10cSrcweir if(!pSearchCondition) // no where condition at entry point 2149*cdf0e10cSrcweir return; 2150*cdf0e10cSrcweir 2151*cdf0e10cSrcweir OSQLParseNode::eraseBraces(pSearchCondition); 2152*cdf0e10cSrcweir 2153*cdf0e10cSrcweir if(SQL_ISRULE(pSearchCondition,boolean_term) || SQL_ISRULE(pSearchCondition,search_condition)) 2154*cdf0e10cSrcweir { 2155*cdf0e10cSrcweir OSQLParseNode* pLeft = pSearchCondition->getChild(0); 2156*cdf0e10cSrcweir compress(pLeft); 2157*cdf0e10cSrcweir 2158*cdf0e10cSrcweir OSQLParseNode* pRight = pSearchCondition->getChild(2); 2159*cdf0e10cSrcweir compress(pRight); 2160*cdf0e10cSrcweir } 2161*cdf0e10cSrcweir else if( SQL_ISRULE(pSearchCondition,boolean_primary) || (pSearchCondition->count() == 3 && SQL_ISPUNCTUATION(pSearchCondition->getChild(0),"(") && 2162*cdf0e10cSrcweir SQL_ISPUNCTUATION(pSearchCondition->getChild(2),")"))) 2163*cdf0e10cSrcweir { 2164*cdf0e10cSrcweir OSQLParseNode* pRight = pSearchCondition->getChild(1); 2165*cdf0e10cSrcweir compress(pRight); 2166*cdf0e10cSrcweir // if child is not a or or and tree then delete () around child 2167*cdf0e10cSrcweir if(!(SQL_ISRULE(pSearchCondition->getChild(1),boolean_term) || SQL_ISRULE(pSearchCondition->getChild(1),search_condition)) || 2168*cdf0e10cSrcweir (SQL_ISRULE(pSearchCondition->getChild(1),boolean_term) && SQL_ISRULE(pSearchCondition->getParent(),boolean_term)) || 2169*cdf0e10cSrcweir (SQL_ISRULE(pSearchCondition->getChild(1),search_condition) && SQL_ISRULE(pSearchCondition->getParent(),search_condition))) 2170*cdf0e10cSrcweir { 2171*cdf0e10cSrcweir OSQLParseNode* pNode = pSearchCondition->removeAt(1); 2172*cdf0e10cSrcweir replaceAndReset(pSearchCondition,pNode); 2173*cdf0e10cSrcweir } 2174*cdf0e10cSrcweir } 2175*cdf0e10cSrcweir 2176*cdf0e10cSrcweir // or with two and trees where one element of the and trees are equal 2177*cdf0e10cSrcweir if(SQL_ISRULE(pSearchCondition,search_condition) && SQL_ISRULE(pSearchCondition->getChild(0),boolean_term) && SQL_ISRULE(pSearchCondition->getChild(2),boolean_term)) 2178*cdf0e10cSrcweir { 2179*cdf0e10cSrcweir if(*pSearchCondition->getChild(0)->getChild(0) == *pSearchCondition->getChild(2)->getChild(0)) 2180*cdf0e10cSrcweir { 2181*cdf0e10cSrcweir OSQLParseNode* pLeft = pSearchCondition->getChild(0)->removeAt(2); 2182*cdf0e10cSrcweir OSQLParseNode* pRight = pSearchCondition->getChild(2)->removeAt(2); 2183*cdf0e10cSrcweir OSQLParseNode* pNode = MakeORNode(pLeft,pRight); 2184*cdf0e10cSrcweir 2185*cdf0e10cSrcweir OSQLParseNode* pNewRule = new OSQLParseNode(::rtl::OUString(),SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::boolean_primary)); 2186*cdf0e10cSrcweir pNewRule->append(new OSQLParseNode(::rtl::OUString::createFromAscii("("),SQL_NODE_PUNCTUATION)); 2187*cdf0e10cSrcweir pNewRule->append(pNode); 2188*cdf0e10cSrcweir pNewRule->append(new OSQLParseNode(::rtl::OUString::createFromAscii(")"),SQL_NODE_PUNCTUATION)); 2189*cdf0e10cSrcweir 2190*cdf0e10cSrcweir OSQLParseNode::eraseBraces(pLeft); 2191*cdf0e10cSrcweir OSQLParseNode::eraseBraces(pRight); 2192*cdf0e10cSrcweir 2193*cdf0e10cSrcweir pNode = MakeANDNode(pSearchCondition->getChild(0)->removeAt((sal_uInt32)0),pNewRule); 2194*cdf0e10cSrcweir replaceAndReset(pSearchCondition,pNode); 2195*cdf0e10cSrcweir } 2196*cdf0e10cSrcweir else if(*pSearchCondition->getChild(0)->getChild(2) == *pSearchCondition->getChild(2)->getChild(0)) 2197*cdf0e10cSrcweir { 2198*cdf0e10cSrcweir OSQLParseNode* pLeft = pSearchCondition->getChild(0)->removeAt((sal_uInt32)0); 2199*cdf0e10cSrcweir OSQLParseNode* pRight = pSearchCondition->getChild(2)->removeAt(2); 2200*cdf0e10cSrcweir OSQLParseNode* pNode = MakeORNode(pLeft,pRight); 2201*cdf0e10cSrcweir 2202*cdf0e10cSrcweir OSQLParseNode* pNewRule = new OSQLParseNode(::rtl::OUString(),SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::boolean_primary)); 2203*cdf0e10cSrcweir pNewRule->append(new OSQLParseNode(::rtl::OUString::createFromAscii("("),SQL_NODE_PUNCTUATION)); 2204*cdf0e10cSrcweir pNewRule->append(pNode); 2205*cdf0e10cSrcweir pNewRule->append(new OSQLParseNode(::rtl::OUString::createFromAscii(")"),SQL_NODE_PUNCTUATION)); 2206*cdf0e10cSrcweir 2207*cdf0e10cSrcweir OSQLParseNode::eraseBraces(pLeft); 2208*cdf0e10cSrcweir OSQLParseNode::eraseBraces(pRight); 2209*cdf0e10cSrcweir 2210*cdf0e10cSrcweir pNode = MakeANDNode(pSearchCondition->getChild(0)->removeAt(1),pNewRule); 2211*cdf0e10cSrcweir replaceAndReset(pSearchCondition,pNode); 2212*cdf0e10cSrcweir } 2213*cdf0e10cSrcweir else if(*pSearchCondition->getChild(0)->getChild(0) == *pSearchCondition->getChild(2)->getChild(2)) 2214*cdf0e10cSrcweir { 2215*cdf0e10cSrcweir OSQLParseNode* pLeft = pSearchCondition->getChild(0)->removeAt(2); 2216*cdf0e10cSrcweir OSQLParseNode* pRight = pSearchCondition->getChild(2)->removeAt((sal_uInt32)0); 2217*cdf0e10cSrcweir OSQLParseNode* pNode = MakeORNode(pLeft,pRight); 2218*cdf0e10cSrcweir 2219*cdf0e10cSrcweir OSQLParseNode* pNewRule = new OSQLParseNode(::rtl::OUString(),SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::boolean_primary)); 2220*cdf0e10cSrcweir pNewRule->append(new OSQLParseNode(::rtl::OUString::createFromAscii("("),SQL_NODE_PUNCTUATION)); 2221*cdf0e10cSrcweir pNewRule->append(pNode); 2222*cdf0e10cSrcweir pNewRule->append(new OSQLParseNode(::rtl::OUString::createFromAscii(")"),SQL_NODE_PUNCTUATION)); 2223*cdf0e10cSrcweir 2224*cdf0e10cSrcweir OSQLParseNode::eraseBraces(pLeft); 2225*cdf0e10cSrcweir OSQLParseNode::eraseBraces(pRight); 2226*cdf0e10cSrcweir 2227*cdf0e10cSrcweir pNode = MakeANDNode(pSearchCondition->getChild(0)->removeAt((sal_uInt32)0),pNewRule); 2228*cdf0e10cSrcweir replaceAndReset(pSearchCondition,pNode); 2229*cdf0e10cSrcweir } 2230*cdf0e10cSrcweir else if(*pSearchCondition->getChild(0)->getChild(2) == *pSearchCondition->getChild(2)->getChild(2)) 2231*cdf0e10cSrcweir { 2232*cdf0e10cSrcweir OSQLParseNode* pLeft = pSearchCondition->getChild(0)->removeAt((sal_uInt32)0); 2233*cdf0e10cSrcweir OSQLParseNode* pRight = pSearchCondition->getChild(2)->removeAt((sal_uInt32)0); 2234*cdf0e10cSrcweir OSQLParseNode* pNode = MakeORNode(pLeft,pRight); 2235*cdf0e10cSrcweir 2236*cdf0e10cSrcweir OSQLParseNode* pNewRule = new OSQLParseNode(::rtl::OUString(),SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::boolean_primary)); 2237*cdf0e10cSrcweir pNewRule->append(new OSQLParseNode(::rtl::OUString::createFromAscii("("),SQL_NODE_PUNCTUATION)); 2238*cdf0e10cSrcweir pNewRule->append(pNode); 2239*cdf0e10cSrcweir pNewRule->append(new OSQLParseNode(::rtl::OUString::createFromAscii(")"),SQL_NODE_PUNCTUATION)); 2240*cdf0e10cSrcweir 2241*cdf0e10cSrcweir OSQLParseNode::eraseBraces(pLeft); 2242*cdf0e10cSrcweir OSQLParseNode::eraseBraces(pRight); 2243*cdf0e10cSrcweir 2244*cdf0e10cSrcweir pNode = MakeANDNode(pSearchCondition->getChild(0)->removeAt(1),pNewRule); 2245*cdf0e10cSrcweir replaceAndReset(pSearchCondition,pNode); 2246*cdf0e10cSrcweir } 2247*cdf0e10cSrcweir } 2248*cdf0e10cSrcweir } 2249*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 0 2250*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2251*cdf0e10cSrcweir void OSQLParseNode::showParseTree( ::rtl::OUString& rString ) const 2252*cdf0e10cSrcweir { 2253*cdf0e10cSrcweir ::rtl::OUStringBuffer aBuf; 2254*cdf0e10cSrcweir showParseTree( aBuf, 0 ); 2255*cdf0e10cSrcweir rString = aBuf.makeStringAndClear(); 2256*cdf0e10cSrcweir } 2257*cdf0e10cSrcweir 2258*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2259*cdf0e10cSrcweir void OSQLParseNode::showParseTree( ::rtl::OUStringBuffer& _inout_rBuffer, sal_uInt32 nLevel ) const 2260*cdf0e10cSrcweir { 2261*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::showParseTree" ); 2262*cdf0e10cSrcweir 2263*cdf0e10cSrcweir for ( sal_uInt32 j=0; j<nLevel; ++j) 2264*cdf0e10cSrcweir _inout_rBuffer.appendAscii( " " ); 2265*cdf0e10cSrcweir 2266*cdf0e10cSrcweir if ( !isToken() ) 2267*cdf0e10cSrcweir { 2268*cdf0e10cSrcweir // Regelnamen als rule: ... 2269*cdf0e10cSrcweir _inout_rBuffer.appendAscii( "RULE_ID: " ); 2270*cdf0e10cSrcweir _inout_rBuffer.append( (sal_Int32)getRuleID() ); 2271*cdf0e10cSrcweir _inout_rBuffer.append( sal_Unicode( '(' ) ); 2272*cdf0e10cSrcweir _inout_rBuffer.append( OSQLParser::RuleIDToStr( getRuleID() ) ); 2273*cdf0e10cSrcweir _inout_rBuffer.append( sal_Unicode( ')' ) ); 2274*cdf0e10cSrcweir _inout_rBuffer.append( sal_Unicode( '\n' ) ); 2275*cdf0e10cSrcweir 2276*cdf0e10cSrcweir // hol dir den ersten Subtree 2277*cdf0e10cSrcweir for ( OSQLParseNodes::const_iterator i = m_aChildren.begin(); 2278*cdf0e10cSrcweir i != m_aChildren.end(); 2279*cdf0e10cSrcweir ++i 2280*cdf0e10cSrcweir ) 2281*cdf0e10cSrcweir (*i)->showParseTree( _inout_rBuffer, nLevel+1 ); 2282*cdf0e10cSrcweir } 2283*cdf0e10cSrcweir else 2284*cdf0e10cSrcweir { 2285*cdf0e10cSrcweir // ein Token gefunden 2286*cdf0e10cSrcweir switch (m_eNodeType) 2287*cdf0e10cSrcweir { 2288*cdf0e10cSrcweir 2289*cdf0e10cSrcweir case SQL_NODE_KEYWORD: 2290*cdf0e10cSrcweir _inout_rBuffer.appendAscii( "SQL_KEYWORD: " ); 2291*cdf0e10cSrcweir _inout_rBuffer.append( ::rtl::OStringToOUString( OSQLParser::TokenIDToStr( getTokenID() ), RTL_TEXTENCODING_UTF8 ) ); 2292*cdf0e10cSrcweir _inout_rBuffer.append( sal_Unicode( '\n' ) ); 2293*cdf0e10cSrcweir break; 2294*cdf0e10cSrcweir 2295*cdf0e10cSrcweir case SQL_NODE_COMPARISON: 2296*cdf0e10cSrcweir _inout_rBuffer.appendAscii( "SQL_COMPARISON: " ); 2297*cdf0e10cSrcweir _inout_rBuffer.append( m_aNodeValue ); 2298*cdf0e10cSrcweir _inout_rBuffer.append( sal_Unicode( '\n' ) ); 2299*cdf0e10cSrcweir break; 2300*cdf0e10cSrcweir 2301*cdf0e10cSrcweir case SQL_NODE_NAME: 2302*cdf0e10cSrcweir _inout_rBuffer.appendAscii( "SQL_NAME: " ); 2303*cdf0e10cSrcweir _inout_rBuffer.append( sal_Unicode( '"' ) ); 2304*cdf0e10cSrcweir _inout_rBuffer.append( m_aNodeValue ); 2305*cdf0e10cSrcweir _inout_rBuffer.append( sal_Unicode( '"' ) ); 2306*cdf0e10cSrcweir _inout_rBuffer.append( sal_Unicode( '\n' ) ); 2307*cdf0e10cSrcweir break; 2308*cdf0e10cSrcweir 2309*cdf0e10cSrcweir case SQL_NODE_STRING: 2310*cdf0e10cSrcweir _inout_rBuffer.appendAscii( "SQL_STRING: " ); 2311*cdf0e10cSrcweir _inout_rBuffer.append( sal_Unicode( '\'' ) ); 2312*cdf0e10cSrcweir _inout_rBuffer.append( m_aNodeValue ); 2313*cdf0e10cSrcweir _inout_rBuffer.append( sal_Unicode( '\'' ) ); 2314*cdf0e10cSrcweir _inout_rBuffer.append( sal_Unicode( '\n' ) ); 2315*cdf0e10cSrcweir break; 2316*cdf0e10cSrcweir 2317*cdf0e10cSrcweir case SQL_NODE_INTNUM: 2318*cdf0e10cSrcweir _inout_rBuffer.appendAscii( "SQL_INTNUM: " ); 2319*cdf0e10cSrcweir _inout_rBuffer.append( m_aNodeValue ); 2320*cdf0e10cSrcweir _inout_rBuffer.append( sal_Unicode( '\n' ) ); 2321*cdf0e10cSrcweir break; 2322*cdf0e10cSrcweir 2323*cdf0e10cSrcweir case SQL_NODE_APPROXNUM: 2324*cdf0e10cSrcweir _inout_rBuffer.appendAscii( "SQL_APPROXNUM: " ); 2325*cdf0e10cSrcweir _inout_rBuffer.append( m_aNodeValue ); 2326*cdf0e10cSrcweir _inout_rBuffer.append( sal_Unicode( '\n' ) ); 2327*cdf0e10cSrcweir break; 2328*cdf0e10cSrcweir 2329*cdf0e10cSrcweir case SQL_NODE_PUNCTUATION: 2330*cdf0e10cSrcweir _inout_rBuffer.appendAscii( "SQL_PUNCTUATION: " ); 2331*cdf0e10cSrcweir _inout_rBuffer.append( m_aNodeValue ); 2332*cdf0e10cSrcweir _inout_rBuffer.append( sal_Unicode( '\n' ) ); 2333*cdf0e10cSrcweir break; 2334*cdf0e10cSrcweir 2335*cdf0e10cSrcweir case SQL_NODE_AMMSC: 2336*cdf0e10cSrcweir _inout_rBuffer.appendAscii( "SQL_AMMSC: " ); 2337*cdf0e10cSrcweir _inout_rBuffer.append( m_aNodeValue ); 2338*cdf0e10cSrcweir _inout_rBuffer.append( sal_Unicode( '\n' ) ); 2339*cdf0e10cSrcweir break; 2340*cdf0e10cSrcweir 2341*cdf0e10cSrcweir case SQL_NODE_EQUAL: 2342*cdf0e10cSrcweir case SQL_NODE_LESS: 2343*cdf0e10cSrcweir case SQL_NODE_GREAT: 2344*cdf0e10cSrcweir case SQL_NODE_LESSEQ: 2345*cdf0e10cSrcweir case SQL_NODE_GREATEQ: 2346*cdf0e10cSrcweir case SQL_NODE_NOTEQUAL: 2347*cdf0e10cSrcweir _inout_rBuffer.append( m_aNodeValue ); 2348*cdf0e10cSrcweir _inout_rBuffer.append( sal_Unicode( '\n' ) ); 2349*cdf0e10cSrcweir break; 2350*cdf0e10cSrcweir 2351*cdf0e10cSrcweir case SQL_NODE_ACCESS_DATE: 2352*cdf0e10cSrcweir _inout_rBuffer.appendAscii( "SQL_ACCESS_DATE: " ); 2353*cdf0e10cSrcweir _inout_rBuffer.append( m_aNodeValue ); 2354*cdf0e10cSrcweir _inout_rBuffer.append( sal_Unicode( '\n' ) ); 2355*cdf0e10cSrcweir break; 2356*cdf0e10cSrcweir 2357*cdf0e10cSrcweir case SQL_NODE_DATE: 2358*cdf0e10cSrcweir _inout_rBuffer.appendAscii( "SQL_DATE: " ); 2359*cdf0e10cSrcweir _inout_rBuffer.append( m_aNodeValue ); 2360*cdf0e10cSrcweir _inout_rBuffer.append( sal_Unicode( '\n' ) ); 2361*cdf0e10cSrcweir break; 2362*cdf0e10cSrcweir 2363*cdf0e10cSrcweir case SQL_NODE_CONCAT: 2364*cdf0e10cSrcweir _inout_rBuffer.appendAscii( "||" ); 2365*cdf0e10cSrcweir _inout_rBuffer.append( sal_Unicode( '\n' ) ); 2366*cdf0e10cSrcweir break; 2367*cdf0e10cSrcweir 2368*cdf0e10cSrcweir default: 2369*cdf0e10cSrcweir OSL_TRACE( "-- %i", int( m_eNodeType ) ); 2370*cdf0e10cSrcweir OSL_ENSURE( false, "OSQLParser::ShowParseTree: unzulaessiger NodeType" ); 2371*cdf0e10cSrcweir } 2372*cdf0e10cSrcweir } 2373*cdf0e10cSrcweir } 2374*cdf0e10cSrcweir #endif // OSL_DEBUG_LEVEL > 0 2375*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2376*cdf0e10cSrcweir // Insert-Methoden 2377*cdf0e10cSrcweir //----------------------------------------------------------------------------- 2378*cdf0e10cSrcweir void OSQLParseNode::insert(sal_uInt32 nPos, OSQLParseNode* pNewSubTree) 2379*cdf0e10cSrcweir { 2380*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::insert" ); 2381*cdf0e10cSrcweir OSL_ENSURE(pNewSubTree != NULL, "OSQLParseNode: ungueltiger NewSubTree"); 2382*cdf0e10cSrcweir OSL_ENSURE(pNewSubTree->getParent() == NULL, "OSQLParseNode: Knoten ist kein Waise"); 2383*cdf0e10cSrcweir 2384*cdf0e10cSrcweir // stelle Verbindung zum getParent her: 2385*cdf0e10cSrcweir pNewSubTree->setParent( this ); 2386*cdf0e10cSrcweir m_aChildren.insert(m_aChildren.begin() + nPos, pNewSubTree); 2387*cdf0e10cSrcweir } 2388*cdf0e10cSrcweir 2389*cdf0e10cSrcweir // removeAt-Methoden 2390*cdf0e10cSrcweir //----------------------------------------------------------------------------- 2391*cdf0e10cSrcweir OSQLParseNode* OSQLParseNode::removeAt(sal_uInt32 nPos) 2392*cdf0e10cSrcweir { 2393*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::removeAt" ); 2394*cdf0e10cSrcweir OSL_ENSURE(nPos < m_aChildren.size(),"Illegal position for removeAt"); 2395*cdf0e10cSrcweir OSQLParseNodes::iterator aPos(m_aChildren.begin() + nPos); 2396*cdf0e10cSrcweir OSQLParseNode* pNode = *aPos; 2397*cdf0e10cSrcweir 2398*cdf0e10cSrcweir // setze den getParent des removeten auf NULL 2399*cdf0e10cSrcweir pNode->setParent( NULL ); 2400*cdf0e10cSrcweir 2401*cdf0e10cSrcweir m_aChildren.erase(aPos); 2402*cdf0e10cSrcweir return pNode; 2403*cdf0e10cSrcweir } 2404*cdf0e10cSrcweir //----------------------------------------------------------------------------- 2405*cdf0e10cSrcweir OSQLParseNode* OSQLParseNode::remove(OSQLParseNode* pSubTree) 2406*cdf0e10cSrcweir { 2407*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::remove" ); 2408*cdf0e10cSrcweir OSL_ENSURE(pSubTree != NULL, "OSQLParseNode: ungueltiger SubTree"); 2409*cdf0e10cSrcweir OSQLParseNodes::iterator aPos = ::std::find(m_aChildren.begin(), m_aChildren.end(), pSubTree); 2410*cdf0e10cSrcweir if (aPos != m_aChildren.end()) 2411*cdf0e10cSrcweir { 2412*cdf0e10cSrcweir // setze den getParent des removeten auf NULL 2413*cdf0e10cSrcweir pSubTree->setParent( NULL ); 2414*cdf0e10cSrcweir m_aChildren.erase(aPos); 2415*cdf0e10cSrcweir return pSubTree; 2416*cdf0e10cSrcweir } 2417*cdf0e10cSrcweir else 2418*cdf0e10cSrcweir return NULL; 2419*cdf0e10cSrcweir } 2420*cdf0e10cSrcweir 2421*cdf0e10cSrcweir // Replace-Methoden 2422*cdf0e10cSrcweir //----------------------------------------------------------------------------- 2423*cdf0e10cSrcweir OSQLParseNode* OSQLParseNode::replaceAt(sal_uInt32 nPos, OSQLParseNode* pNewSubNode) 2424*cdf0e10cSrcweir { 2425*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::replaceAt" ); 2426*cdf0e10cSrcweir OSL_ENSURE(pNewSubNode != NULL, "OSQLParseNode: invalid nodes"); 2427*cdf0e10cSrcweir OSL_ENSURE(pNewSubNode->getParent() == NULL, "OSQLParseNode: node already has getParent"); 2428*cdf0e10cSrcweir OSL_ENSURE(nPos < m_aChildren.size(), "OSQLParseNode: invalid position"); 2429*cdf0e10cSrcweir OSL_ENSURE(::std::find(m_aChildren.begin(), m_aChildren.end(), pNewSubNode) == m_aChildren.end(), 2430*cdf0e10cSrcweir "OSQLParseNode::Replace() Node already element of parent"); 2431*cdf0e10cSrcweir 2432*cdf0e10cSrcweir OSQLParseNode* pOldSubNode = m_aChildren[nPos]; 2433*cdf0e10cSrcweir 2434*cdf0e10cSrcweir // stelle Verbindung zum getParent her: 2435*cdf0e10cSrcweir pNewSubNode->setParent( this ); 2436*cdf0e10cSrcweir pOldSubNode->setParent( NULL ); 2437*cdf0e10cSrcweir 2438*cdf0e10cSrcweir m_aChildren[nPos] = pNewSubNode; 2439*cdf0e10cSrcweir return pOldSubNode; 2440*cdf0e10cSrcweir } 2441*cdf0e10cSrcweir 2442*cdf0e10cSrcweir //----------------------------------------------------------------------------- 2443*cdf0e10cSrcweir OSQLParseNode* OSQLParseNode::replace (OSQLParseNode* pOldSubNode, OSQLParseNode* pNewSubNode ) 2444*cdf0e10cSrcweir { 2445*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::replace " ); 2446*cdf0e10cSrcweir OSL_ENSURE(pOldSubNode != NULL && pNewSubNode != NULL, "OSQLParseNode: invalid nodes"); 2447*cdf0e10cSrcweir OSL_ENSURE(pNewSubNode->getParent() == NULL, "OSQLParseNode: node already has getParent"); 2448*cdf0e10cSrcweir OSL_ENSURE(::std::find(m_aChildren.begin(), m_aChildren.end(), pOldSubNode) != m_aChildren.end(), 2449*cdf0e10cSrcweir "OSQLParseNode::Replace() Node not element of parent"); 2450*cdf0e10cSrcweir OSL_ENSURE(::std::find(m_aChildren.begin(), m_aChildren.end(), pNewSubNode) == m_aChildren.end(), 2451*cdf0e10cSrcweir "OSQLParseNode::Replace() Node already element of parent"); 2452*cdf0e10cSrcweir 2453*cdf0e10cSrcweir pOldSubNode->setParent( NULL ); 2454*cdf0e10cSrcweir pNewSubNode->setParent( this ); 2455*cdf0e10cSrcweir ::std::replace(m_aChildren.begin(), m_aChildren.end(), pOldSubNode, pNewSubNode); 2456*cdf0e10cSrcweir return pOldSubNode; 2457*cdf0e10cSrcweir } 2458*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2459*cdf0e10cSrcweir void OSQLParseNode::parseLeaf(::rtl::OUStringBuffer& rString, const SQLParseNodeParameter& rParam) const 2460*cdf0e10cSrcweir { 2461*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::parseLeaf" ); 2462*cdf0e10cSrcweir // ein Blatt ist gefunden 2463*cdf0e10cSrcweir // Inhalt dem Ausgabestring anfuegen 2464*cdf0e10cSrcweir switch (m_eNodeType) 2465*cdf0e10cSrcweir { 2466*cdf0e10cSrcweir case SQL_NODE_KEYWORD: 2467*cdf0e10cSrcweir { 2468*cdf0e10cSrcweir if (rString.getLength()) 2469*cdf0e10cSrcweir rString.appendAscii(" "); 2470*cdf0e10cSrcweir 2471*cdf0e10cSrcweir const ::rtl::OString sT = OSQLParser::TokenIDToStr(m_nNodeID, rParam.bInternational ? &rParam.m_rContext : NULL); 2472*cdf0e10cSrcweir rString.append(::rtl::OUString(sT,sT.getLength(),RTL_TEXTENCODING_UTF8)); 2473*cdf0e10cSrcweir } break; 2474*cdf0e10cSrcweir case SQL_NODE_STRING: 2475*cdf0e10cSrcweir if (rString.getLength()) 2476*cdf0e10cSrcweir rString.appendAscii(" "); 2477*cdf0e10cSrcweir rString.append(SetQuotation(m_aNodeValue,::rtl::OUString::createFromAscii("\'"),::rtl::OUString::createFromAscii("\'\'"))); 2478*cdf0e10cSrcweir break; 2479*cdf0e10cSrcweir case SQL_NODE_NAME: 2480*cdf0e10cSrcweir if (rString.getLength()) 2481*cdf0e10cSrcweir { 2482*cdf0e10cSrcweir switch(rString.charAt(rString.getLength()-1) ) 2483*cdf0e10cSrcweir { 2484*cdf0e10cSrcweir case ' ' : 2485*cdf0e10cSrcweir case '.' : break; 2486*cdf0e10cSrcweir default : 2487*cdf0e10cSrcweir if ( !rParam.aMetaData.getCatalogSeparator().getLength() 2488*cdf0e10cSrcweir || rString.charAt( rString.getLength()-1 ) != rParam.aMetaData.getCatalogSeparator().toChar() 2489*cdf0e10cSrcweir ) 2490*cdf0e10cSrcweir rString.appendAscii(" "); break; 2491*cdf0e10cSrcweir } 2492*cdf0e10cSrcweir } 2493*cdf0e10cSrcweir if (rParam.bQuote) 2494*cdf0e10cSrcweir { 2495*cdf0e10cSrcweir if (rParam.bPredicate) 2496*cdf0e10cSrcweir { 2497*cdf0e10cSrcweir rString.appendAscii("["); 2498*cdf0e10cSrcweir rString.append(m_aNodeValue); 2499*cdf0e10cSrcweir rString.appendAscii("]"); 2500*cdf0e10cSrcweir } 2501*cdf0e10cSrcweir else 2502*cdf0e10cSrcweir rString.append(SetQuotation(m_aNodeValue, 2503*cdf0e10cSrcweir rParam.aMetaData.getIdentifierQuoteString(), rParam.aMetaData.getIdentifierQuoteString() )); 2504*cdf0e10cSrcweir } 2505*cdf0e10cSrcweir else 2506*cdf0e10cSrcweir rString.append(m_aNodeValue); 2507*cdf0e10cSrcweir break; 2508*cdf0e10cSrcweir case SQL_NODE_ACCESS_DATE: 2509*cdf0e10cSrcweir if (rString.getLength()) 2510*cdf0e10cSrcweir rString.appendAscii(" "); 2511*cdf0e10cSrcweir rString.appendAscii("#"); 2512*cdf0e10cSrcweir rString.append(m_aNodeValue); 2513*cdf0e10cSrcweir rString.appendAscii("#"); 2514*cdf0e10cSrcweir break; 2515*cdf0e10cSrcweir 2516*cdf0e10cSrcweir case SQL_NODE_INTNUM: 2517*cdf0e10cSrcweir case SQL_NODE_APPROXNUM: 2518*cdf0e10cSrcweir { 2519*cdf0e10cSrcweir ::rtl::OUString aTmp = m_aNodeValue; 2520*cdf0e10cSrcweir if (rParam.bInternational && rParam.bPredicate && rParam.cDecSep != '.') 2521*cdf0e10cSrcweir aTmp = aTmp.replace('.', rParam.cDecSep); 2522*cdf0e10cSrcweir 2523*cdf0e10cSrcweir if (rString.getLength()) 2524*cdf0e10cSrcweir rString.appendAscii(" "); 2525*cdf0e10cSrcweir rString.append(aTmp); 2526*cdf0e10cSrcweir 2527*cdf0e10cSrcweir } break; 2528*cdf0e10cSrcweir case SQL_NODE_PUNCTUATION: 2529*cdf0e10cSrcweir if ( getParent() && SQL_ISRULE(getParent(),cast_spec) && m_aNodeValue.toChar() == '(' ) // no spaces in front of '(' 2530*cdf0e10cSrcweir { 2531*cdf0e10cSrcweir rString.append(m_aNodeValue); 2532*cdf0e10cSrcweir break; 2533*cdf0e10cSrcweir } 2534*cdf0e10cSrcweir // fall through 2535*cdf0e10cSrcweir default: 2536*cdf0e10cSrcweir if (rString.getLength() && m_aNodeValue.toChar() != '.' && m_aNodeValue.toChar() != ':' ) 2537*cdf0e10cSrcweir { 2538*cdf0e10cSrcweir switch( rString.charAt(rString.getLength()-1) ) 2539*cdf0e10cSrcweir { 2540*cdf0e10cSrcweir case ' ' : 2541*cdf0e10cSrcweir case '.' : break; 2542*cdf0e10cSrcweir default : 2543*cdf0e10cSrcweir if ( !rParam.aMetaData.getCatalogSeparator().getLength() 2544*cdf0e10cSrcweir || rString.charAt( rString.getLength()-1 ) != rParam.aMetaData.getCatalogSeparator().toChar() 2545*cdf0e10cSrcweir ) 2546*cdf0e10cSrcweir rString.appendAscii(" "); break; 2547*cdf0e10cSrcweir } 2548*cdf0e10cSrcweir } 2549*cdf0e10cSrcweir rString.append(m_aNodeValue); 2550*cdf0e10cSrcweir } 2551*cdf0e10cSrcweir } 2552*cdf0e10cSrcweir 2553*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2554*cdf0e10cSrcweir sal_Int32 OSQLParser::getFunctionReturnType(const ::rtl::OUString& _sFunctionName, const IParseContext* pContext) 2555*cdf0e10cSrcweir { 2556*cdf0e10cSrcweir sal_Int32 nType = DataType::VARCHAR; 2557*cdf0e10cSrcweir ::rtl::OString sFunctionName(_sFunctionName,_sFunctionName.getLength(),RTL_TEXTENCODING_UTF8); 2558*cdf0e10cSrcweir 2559*cdf0e10cSrcweir if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_ASCII,pContext))) nType = DataType::INTEGER; 2560*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_BIT_LENGTH,pContext))) nType = DataType::INTEGER; 2561*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_CHAR,pContext))) nType = DataType::VARCHAR; 2562*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_CHAR_LENGTH,pContext))) nType = DataType::INTEGER; 2563*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_CONCAT,pContext))) nType = DataType::VARCHAR; 2564*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_DIFFERENCE,pContext))) nType = DataType::VARCHAR; 2565*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_INSERT,pContext))) nType = DataType::VARCHAR; 2566*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_LCASE,pContext))) nType = DataType::VARCHAR; 2567*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_LEFT,pContext))) nType = DataType::VARCHAR; 2568*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_LENGTH,pContext))) nType = DataType::INTEGER; 2569*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_LOCATE,pContext))) nType = DataType::VARCHAR; 2570*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_LOCATE_2,pContext))) nType = DataType::VARCHAR; 2571*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_LTRIM,pContext))) nType = DataType::VARCHAR; 2572*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_OCTET_LENGTH,pContext))) nType = DataType::INTEGER; 2573*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_POSITION,pContext))) nType = DataType::INTEGER; 2574*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_REPEAT,pContext))) nType = DataType::VARCHAR; 2575*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_REPLACE,pContext))) nType = DataType::VARCHAR; 2576*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_RIGHT,pContext))) nType = DataType::VARCHAR; 2577*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_RTRIM,pContext))) nType = DataType::VARCHAR; 2578*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_SOUNDEX,pContext))) nType = DataType::VARCHAR; 2579*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_SPACE,pContext))) nType = DataType::VARCHAR; 2580*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_SUBSTRING,pContext))) nType = DataType::VARCHAR; 2581*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_UCASE,pContext))) nType = DataType::VARCHAR; 2582*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_CURRENT_DATE,pContext))) nType = DataType::DATE; 2583*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_CURRENT_TIME,pContext))) nType = DataType::TIME; 2584*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_CURRENT_TIMESTAMP,pContext))) nType = DataType::TIMESTAMP; 2585*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_CURDATE,pContext))) nType = DataType::DATE; 2586*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_DATEDIFF,pContext))) nType = DataType::INTEGER; 2587*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_DATEVALUE,pContext))) nType = DataType::DATE; 2588*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_CURTIME,pContext))) nType = DataType::TIME; 2589*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_DAYNAME,pContext))) nType = DataType::VARCHAR; 2590*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_DAYOFMONTH,pContext))) nType = DataType::INTEGER; 2591*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_DAYOFWEEK,pContext))) nType = DataType::INTEGER; 2592*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_DAYOFYEAR,pContext))) nType = DataType::INTEGER; 2593*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_EXTRACT,pContext))) nType = DataType::VARCHAR; 2594*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_HOUR,pContext))) nType = DataType::INTEGER; 2595*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_MINUTE,pContext))) nType = DataType::INTEGER; 2596*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_MONTH,pContext))) nType = DataType::INTEGER; 2597*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_MONTHNAME,pContext))) nType = DataType::VARCHAR; 2598*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_NOW,pContext))) nType = DataType::TIMESTAMP; 2599*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_QUARTER,pContext))) nType = DataType::INTEGER; 2600*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_SECOND,pContext))) nType = DataType::INTEGER; 2601*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_TIMESTAMPADD,pContext))) nType = DataType::TIMESTAMP; 2602*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_TIMESTAMPDIFF,pContext))) nType = DataType::TIMESTAMP; 2603*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_TIMEVALUE,pContext))) nType = DataType::TIMESTAMP; 2604*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_WEEK,pContext))) nType = DataType::INTEGER; 2605*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_YEAR,pContext))) nType = DataType::INTEGER; 2606*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_ABS,pContext))) nType = DataType::DOUBLE; 2607*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_ACOS,pContext))) nType = DataType::DOUBLE; 2608*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_ASIN,pContext))) nType = DataType::DOUBLE; 2609*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_ATAN,pContext))) nType = DataType::DOUBLE; 2610*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_ATAN2,pContext))) nType = DataType::DOUBLE; 2611*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_CEILING,pContext))) nType = DataType::DOUBLE; 2612*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_COS,pContext))) nType = DataType::DOUBLE; 2613*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_COT,pContext))) nType = DataType::DOUBLE; 2614*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_DEGREES,pContext))) nType = DataType::DOUBLE; 2615*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_EXP,pContext))) nType = DataType::DOUBLE; 2616*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_FLOOR,pContext))) nType = DataType::DOUBLE; 2617*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_LOGF,pContext))) nType = DataType::DOUBLE; 2618*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_LOG,pContext))) nType = DataType::DOUBLE; 2619*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_LOG10,pContext))) nType = DataType::DOUBLE; 2620*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_LN,pContext))) nType = DataType::DOUBLE; 2621*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_MOD,pContext))) nType = DataType::DOUBLE; 2622*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_PI,pContext))) nType = DataType::DOUBLE; 2623*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_POWER,pContext))) nType = DataType::DOUBLE; 2624*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_RADIANS,pContext))) nType = DataType::DOUBLE; 2625*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_RAND,pContext))) nType = DataType::DOUBLE; 2626*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_ROUND,pContext))) nType = DataType::DOUBLE; 2627*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_ROUNDMAGIC,pContext))) nType = DataType::DOUBLE; 2628*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_SIGN,pContext))) nType = DataType::DOUBLE; 2629*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_SIN,pContext))) nType = DataType::DOUBLE; 2630*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_SQRT,pContext))) nType = DataType::DOUBLE; 2631*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_TAN,pContext))) nType = DataType::DOUBLE; 2632*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_TRUNCATE,pContext))) nType = DataType::DOUBLE; 2633*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_COUNT,pContext))) nType = DataType::INTEGER; 2634*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_MAX,pContext))) nType = DataType::DOUBLE; 2635*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_MIN,pContext))) nType = DataType::DOUBLE; 2636*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_AVG,pContext))) nType = DataType::DOUBLE; 2637*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_SUM,pContext))) nType = DataType::DOUBLE; 2638*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_LOWER,pContext))) nType = DataType::VARCHAR; 2639*cdf0e10cSrcweir else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_UPPER,pContext))) nType = DataType::VARCHAR; 2640*cdf0e10cSrcweir 2641*cdf0e10cSrcweir return nType; 2642*cdf0e10cSrcweir } 2643*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2644*cdf0e10cSrcweir sal_Int32 OSQLParser::getFunctionParameterType(sal_uInt32 _nTokenId, sal_uInt32 _nPos) 2645*cdf0e10cSrcweir { 2646*cdf0e10cSrcweir sal_Int32 nType = DataType::VARCHAR; 2647*cdf0e10cSrcweir 2648*cdf0e10cSrcweir if(_nTokenId == SQL_TOKEN_CHAR) nType = DataType::INTEGER; 2649*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_INSERT) 2650*cdf0e10cSrcweir { 2651*cdf0e10cSrcweir if ( _nPos == 2 || _nPos == 3 ) 2652*cdf0e10cSrcweir nType = DataType::INTEGER; 2653*cdf0e10cSrcweir } 2654*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_LEFT) 2655*cdf0e10cSrcweir { 2656*cdf0e10cSrcweir if ( _nPos == 2 ) 2657*cdf0e10cSrcweir nType = DataType::INTEGER; 2658*cdf0e10cSrcweir } 2659*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_LOCATE) 2660*cdf0e10cSrcweir { 2661*cdf0e10cSrcweir if ( _nPos == 3 ) 2662*cdf0e10cSrcweir nType = DataType::INTEGER; 2663*cdf0e10cSrcweir } 2664*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_LOCATE_2) 2665*cdf0e10cSrcweir { 2666*cdf0e10cSrcweir if ( _nPos == 3 ) 2667*cdf0e10cSrcweir nType = DataType::INTEGER; 2668*cdf0e10cSrcweir } 2669*cdf0e10cSrcweir else if( _nTokenId == SQL_TOKEN_REPEAT || _nTokenId == SQL_TOKEN_RIGHT ) 2670*cdf0e10cSrcweir { 2671*cdf0e10cSrcweir if ( _nPos == 2 ) 2672*cdf0e10cSrcweir nType = DataType::INTEGER; 2673*cdf0e10cSrcweir } 2674*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_SPACE ) 2675*cdf0e10cSrcweir { 2676*cdf0e10cSrcweir nType = DataType::INTEGER; 2677*cdf0e10cSrcweir } 2678*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_SUBSTRING) 2679*cdf0e10cSrcweir { 2680*cdf0e10cSrcweir if ( _nPos != 1 ) 2681*cdf0e10cSrcweir nType = DataType::INTEGER; 2682*cdf0e10cSrcweir } 2683*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_DATEDIFF) 2684*cdf0e10cSrcweir { 2685*cdf0e10cSrcweir if ( _nPos != 1 ) 2686*cdf0e10cSrcweir nType = DataType::TIMESTAMP; 2687*cdf0e10cSrcweir } 2688*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_DATEVALUE) 2689*cdf0e10cSrcweir nType = DataType::DATE; 2690*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_DAYNAME) 2691*cdf0e10cSrcweir nType = DataType::DATE; 2692*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_DAYOFMONTH) 2693*cdf0e10cSrcweir nType = DataType::DATE; 2694*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_DAYOFWEEK) 2695*cdf0e10cSrcweir nType = DataType::DATE; 2696*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_DAYOFYEAR) 2697*cdf0e10cSrcweir nType = DataType::DATE; 2698*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_EXTRACT) nType = DataType::VARCHAR; 2699*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_HOUR) nType = DataType::TIME; 2700*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_MINUTE) nType = DataType::TIME; 2701*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_MONTH) nType = DataType::DATE; 2702*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_MONTHNAME) nType = DataType::DATE; 2703*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_NOW) nType = DataType::TIMESTAMP; 2704*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_QUARTER) nType = DataType::DATE; 2705*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_SECOND) nType = DataType::TIME; 2706*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_TIMESTAMPADD) nType = DataType::TIMESTAMP; 2707*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_TIMESTAMPDIFF) nType = DataType::TIMESTAMP; 2708*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_TIMEVALUE) nType = DataType::TIMESTAMP; 2709*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_WEEK) nType = DataType::DATE; 2710*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_YEAR) nType = DataType::DATE; 2711*cdf0e10cSrcweir 2712*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_ABS) nType = DataType::DOUBLE; 2713*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_ACOS) nType = DataType::DOUBLE; 2714*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_ASIN) nType = DataType::DOUBLE; 2715*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_ATAN) nType = DataType::DOUBLE; 2716*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_ATAN2) nType = DataType::DOUBLE; 2717*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_CEILING) nType = DataType::DOUBLE; 2718*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_COS) nType = DataType::DOUBLE; 2719*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_COT) nType = DataType::DOUBLE; 2720*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_DEGREES) nType = DataType::DOUBLE; 2721*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_EXP) nType = DataType::DOUBLE; 2722*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_FLOOR) nType = DataType::DOUBLE; 2723*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_LOGF) nType = DataType::DOUBLE; 2724*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_LOG) nType = DataType::DOUBLE; 2725*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_LOG10) nType = DataType::DOUBLE; 2726*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_LN) nType = DataType::DOUBLE; 2727*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_MOD) nType = DataType::DOUBLE; 2728*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_PI) nType = DataType::DOUBLE; 2729*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_POWER) nType = DataType::DOUBLE; 2730*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_RADIANS) nType = DataType::DOUBLE; 2731*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_RAND) nType = DataType::DOUBLE; 2732*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_ROUND) nType = DataType::DOUBLE; 2733*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_ROUNDMAGIC) nType = DataType::DOUBLE; 2734*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_SIGN) nType = DataType::DOUBLE; 2735*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_SIN) nType = DataType::DOUBLE; 2736*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_SQRT) nType = DataType::DOUBLE; 2737*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_TAN) nType = DataType::DOUBLE; 2738*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_TRUNCATE) nType = DataType::DOUBLE; 2739*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_COUNT) nType = DataType::INTEGER; 2740*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_MAX) nType = DataType::DOUBLE; 2741*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_MIN) nType = DataType::DOUBLE; 2742*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_AVG) nType = DataType::DOUBLE; 2743*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_SUM) nType = DataType::DOUBLE; 2744*cdf0e10cSrcweir 2745*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_LOWER) nType = DataType::VARCHAR; 2746*cdf0e10cSrcweir else if(_nTokenId == SQL_TOKEN_UPPER) nType = DataType::VARCHAR; 2747*cdf0e10cSrcweir 2748*cdf0e10cSrcweir return nType; 2749*cdf0e10cSrcweir } 2750*cdf0e10cSrcweir 2751*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2752*cdf0e10cSrcweir const SQLError& OSQLParser::getErrorHelper() const 2753*cdf0e10cSrcweir { 2754*cdf0e10cSrcweir return m_pData->aErrors; 2755*cdf0e10cSrcweir } 2756*cdf0e10cSrcweir 2757*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2758*cdf0e10cSrcweir OSQLParseNode::Rule OSQLParseNode::getKnownRuleID() const 2759*cdf0e10cSrcweir { 2760*cdf0e10cSrcweir if ( !isRule() ) 2761*cdf0e10cSrcweir return UNKNOWN_RULE; 2762*cdf0e10cSrcweir return OSQLParser::RuleIDToRule( getRuleID() ); 2763*cdf0e10cSrcweir } 2764*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2765*cdf0e10cSrcweir ::rtl::OUString OSQLParseNode::getTableRange(const OSQLParseNode* _pTableRef) 2766*cdf0e10cSrcweir { 2767*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::getTableRange" ); 2768*cdf0e10cSrcweir OSL_ENSURE(_pTableRef && _pTableRef->count() > 1 && _pTableRef->getKnownRuleID() == OSQLParseNode::table_ref,"Invalid node give, only table ref is allowed!"); 2769*cdf0e10cSrcweir const sal_uInt32 nCount = _pTableRef->count(); 2770*cdf0e10cSrcweir ::rtl::OUString sTableRange; 2771*cdf0e10cSrcweir if ( nCount == 2 || (nCount == 3 && !_pTableRef->getChild(0)->isToken()) || nCount == 5 ) 2772*cdf0e10cSrcweir { 2773*cdf0e10cSrcweir const OSQLParseNode* pNode = _pTableRef->getChild(nCount - (nCount == 2 ? 1 : 2)); 2774*cdf0e10cSrcweir OSL_ENSURE(pNode && (pNode->getKnownRuleID() == OSQLParseNode::table_primary_as_range_column 2775*cdf0e10cSrcweir || pNode->getKnownRuleID() == OSQLParseNode::range_variable) 2776*cdf0e10cSrcweir ,"SQL grammar changed!"); 2777*cdf0e10cSrcweir if ( !pNode->isLeaf() ) 2778*cdf0e10cSrcweir sTableRange = pNode->getChild(1)->getTokenValue(); 2779*cdf0e10cSrcweir } // if ( nCount == 2 || nCount == 3 || nCount == 5) 2780*cdf0e10cSrcweir 2781*cdf0e10cSrcweir return sTableRange; 2782*cdf0e10cSrcweir } 2783*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2784*cdf0e10cSrcweir OSQLParseNodesContainer::OSQLParseNodesContainer() 2785*cdf0e10cSrcweir { 2786*cdf0e10cSrcweir } 2787*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2788*cdf0e10cSrcweir OSQLParseNodesContainer::~OSQLParseNodesContainer() 2789*cdf0e10cSrcweir { 2790*cdf0e10cSrcweir } 2791*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2792*cdf0e10cSrcweir void OSQLParseNodesContainer::push_back(OSQLParseNode* _pNode) 2793*cdf0e10cSrcweir { 2794*cdf0e10cSrcweir ::osl::MutexGuard aGuard(m_aMutex); 2795*cdf0e10cSrcweir m_aNodes.push_back(_pNode); 2796*cdf0e10cSrcweir } 2797*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2798*cdf0e10cSrcweir void OSQLParseNodesContainer::erase(OSQLParseNode* _pNode) 2799*cdf0e10cSrcweir { 2800*cdf0e10cSrcweir ::osl::MutexGuard aGuard(m_aMutex); 2801*cdf0e10cSrcweir if ( !m_aNodes.empty() ) 2802*cdf0e10cSrcweir { 2803*cdf0e10cSrcweir ::std::vector< OSQLParseNode* >::iterator aFind = ::std::find(m_aNodes.begin(), m_aNodes.end(),_pNode); 2804*cdf0e10cSrcweir if ( aFind != m_aNodes.end() ) 2805*cdf0e10cSrcweir m_aNodes.erase(aFind); 2806*cdf0e10cSrcweir } 2807*cdf0e10cSrcweir } 2808*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2809*cdf0e10cSrcweir bool OSQLParseNodesContainer::empty() const 2810*cdf0e10cSrcweir { 2811*cdf0e10cSrcweir return m_aNodes.empty(); 2812*cdf0e10cSrcweir } 2813*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2814*cdf0e10cSrcweir void OSQLParseNodesContainer::clear() 2815*cdf0e10cSrcweir { 2816*cdf0e10cSrcweir ::osl::MutexGuard aGuard(m_aMutex); 2817*cdf0e10cSrcweir m_aNodes.clear(); 2818*cdf0e10cSrcweir } 2819*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2820*cdf0e10cSrcweir void OSQLParseNodesContainer::clearAndDelete() 2821*cdf0e10cSrcweir { 2822*cdf0e10cSrcweir ::osl::MutexGuard aGuard(m_aMutex); 2823*cdf0e10cSrcweir // clear the garbage collector 2824*cdf0e10cSrcweir while ( !m_aNodes.empty() ) 2825*cdf0e10cSrcweir { 2826*cdf0e10cSrcweir OSQLParseNode* pNode = m_aNodes[0]; 2827*cdf0e10cSrcweir while ( pNode->getParent() ) 2828*cdf0e10cSrcweir { 2829*cdf0e10cSrcweir pNode = pNode->getParent(); 2830*cdf0e10cSrcweir } 2831*cdf0e10cSrcweir delete pNode; 2832*cdf0e10cSrcweir } 2833*cdf0e10cSrcweir } 2834*cdf0e10cSrcweir } // namespace connectivity 2835