LCOV - code coverage report
Current view: top level - connectivity/source/drivers/file - fcomp.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 97 437 22.2 %
Date: 2012-08-25 Functions: 9 15 60.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 148 987 15.0 %

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

Generated by: LCOV version 1.10