Tag: cws_src680_dba204a
User: oj      
Date: 06/05/22 03:51:50

Modified:
 /dba/connectivity/source/parse/
  sqlbison.y, sqlnode.cxx

Log:
 #i50910# refactoring and recognize between in predicate check

File Changes:

Directory: /dba/connectivity/source/parse/
==========================================

File [changed]: sqlbison.y
Url: 
http://dba.openoffice.org/source/browse/dba/connectivity/source/parse/sqlbison.y?r1=1.51&r2=1.51.164.1
Delta lines:  +59 -96
---------------------
--- sqlbison.y  17 Feb 2005 10:15:54 -0000      1.51
+++ sqlbison.y  22 May 2006 10:51:45 -0000      1.51.164.1
@@ -1,7 +1,7 @@
 %{
 //--------------------------------------------------------------------------
 //
-// $Header: dba/connectivity/source/parse/sqlbison.y,v 1.51 2005/02/17 
10:15:54 vg Exp $
+// $Header: dba/connectivity/source/parse/sqlbison.y,v 1.51.164.1 2006/05/22 
10:51:45 oj Exp $
 //
 // Copyright 2000 Sun Microsystems, Inc. All Rights Reserved.
 //
@@ -9,7 +9,7 @@
 //     OJ
 //
 // Last change:
-//     $Author: vg $ $Date: 2005/02/17 10:15:54 $ $Revision: 1.51 $
+//     $Author: oj $ $Date: 2006/05/22 10:51:45 $ $Revision: 1.51.164.1 $
 //
 // Description:
 //
@@ -1171,8 +1171,10 @@
                }
        |       comparison row_value_constructor
                {
+                       if(xxx_pGLOBAL_SQLPARSER->inPredicateCheck())
+                       {
                        $$ = SQL_NEW_RULE;
-                       sal_Int16 nErg = 
xxx_pGLOBAL_SQLPARSER->buildComparsionRule($$,$2,$1);
+                               sal_Int16 nErg = 
xxx_pGLOBAL_SQLPARSER->buildPredicateRule($$,$2,$1);
                        if(nErg == 1)
                        {
                                OSQLParseNode* pTemp = $$;
@@ -1185,6 +1187,11 @@
                                YYABORT;
                        }
                }
+                       else
+                       {
+                               YYERROR;
+                       }
+               }
        ;
 comparison:
                SQL_LESS
@@ -1208,16 +1215,22 @@
                {
                        if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck())
                        {
-                               OSQLParseNode* pColumnRef = 
newNode(aEmptyString, 
SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::column_ref));
-                               
pColumnRef->append(newNode(xxx_pGLOBAL_SQLPARSER->getFieldName(),SQL_NODE_NAME));
-
                                $$ = SQL_NEW_RULE;
-                               $$->append(pColumnRef);
-                               $$->append($1);
-                               $$->append($2);
-                               $$->append($3);
-                               $$->append($4);
-                               $$->append($5);
+                               
+                               sal_Int16 nErg = 
xxx_pGLOBAL_SQLPARSER->buildPredicateRule($$,$3,$2,$5);
+                               if(nErg == 1)
+                               {
+                                       OSQLParseNode* pTemp = $$;
+                                       $$ = pTemp->removeAt((sal_uInt32)0);
+                                       $$->insert(1,$1);
+                                       delete pTemp;
+                                       delete $4;
+                               }
+                               else
+                               {
+                                       delete $$;
+                                       YYABORT;
+                               }
                        }
                        else
                                YYERROR;
@@ -3677,75 +3690,25 @@
        return s_nRuleIDs[(sal_uInt16)eRule];
 }
 // -------------------------------------------------------------------------
-sal_Int16 OSQLParser::buildNode(OSQLParseNode*& pAppend,OSQLParseNode* 
pLiteral,OSQLParseNode*& pCompare)
+sal_Int16 OSQLParser::buildNode(OSQLParseNode*& pAppend,OSQLParseNode* 
pCompare,OSQLParseNode* pLiteral,OSQLParseNode* pLiteral2)
 {
        OSQLParseNode* pColumnRef = new OSQLInternalNode(aEmptyString, 
SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::column_ref));
        pColumnRef->append(new OSQLInternalNode(m_sFieldName,SQL_NODE_NAME));
-       OSQLParseNode* pComp = new OSQLInternalNode(aEmptyString, 
SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::comparison_predicate));
+       OSQLParseNode* pComp = NULL;
+       if ( SQL_ISTOKEN( pCompare, BETWEEN) && pLiteral2 )
+               pComp = new OSQLInternalNode(aEmptyString, 
SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::between_predicate));
+       else
+               pComp = new OSQLInternalNode(aEmptyString, 
SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::comparison_predicate));
+       
        pComp->append(pColumnRef);
        pComp->append(pCompare);
        pComp->append(pLiteral);
-       pAppend->append(pComp);
-       return 1;
-}
-//-----------------------------------------------------------------------------
-sal_Int16 OSQLParser::buildNode_Date(const double& fValue, sal_Int32 nType, 
OSQLParseNode*& pAppend,OSQLParseNode* pLiteral,OSQLParseNode*& pCompare)
-{
-       OSQLParseNode* pColumnRef = new OSQLInternalNode(aEmptyString, 
SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::column_ref));
-       pColumnRef->append(new OSQLInternalNode(m_sFieldName,SQL_NODE_NAME));
-       OSQLParseNode* pComp = new OSQLInternalNode(aEmptyString, 
SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::comparison_predicate));
-       pComp->append(pColumnRef);
-       pComp->append(pCompare);
-
-       OSQLParseNode* pNewNode = new OSQLInternalNode(aEmptyString, 
SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::set_fct_spec));
-       pNewNode->append(new 
OSQLInternalNode(::rtl::OUString::createFromAscii("{"), SQL_NODE_PUNCTUATION));
-       OSQLParseNode* pDateNode = new OSQLInternalNode(aEmptyString, 
SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::odbc_fct_spec));
-       pNewNode->append(pDateNode);
-       pNewNode->append(new 
OSQLInternalNode(::rtl::OUString::createFromAscii("}"), SQL_NODE_PUNCTUATION));
-
-       switch (nType)
-       {
-               case DataType::DATE:
-               {
-                       Date aDate = 
DBTypeConversion::toDate(fValue,DBTypeConversion::getNULLDate(m_xFormatter->getNumberFormatsSupplier()));
-                       ::rtl::OUString aString = 
DBTypeConversion::toDateString(aDate);
-                       pDateNode->append(new OSQLInternalNode(aEmptyString, 
SQL_NODE_KEYWORD, SQL_TOKEN_D));
-                       pDateNode->append(new OSQLInternalNode(aString, 
SQL_NODE_STRING));
-                       break;
-               }
-               case DataType::TIME:
-               {
-                       Time aTime = DBTypeConversion::toTime(fValue);
-                       ::rtl::OUString aString = 
DBTypeConversion::toTimeString(aTime);
-                       pDateNode->append(new OSQLInternalNode(aEmptyString, 
SQL_NODE_KEYWORD, SQL_TOKEN_T));
-                       pDateNode->append(new OSQLInternalNode(aString, 
SQL_NODE_STRING));
-                       break;
-               }
-               case DataType::TIMESTAMP:
-               {
-                       DateTime aDateTime = 
DBTypeConversion::toDateTime(fValue,DBTypeConversion::getNULLDate(m_xFormatter->getNumberFormatsSupplier()));
-                       if (aDateTime.Seconds || aDateTime.Minutes || 
aDateTime.Hours)
-                       {
-                               ::rtl::OUString aString = 
DBTypeConversion::toDateTimeString(aDateTime);
-                               pDateNode->append(new 
OSQLInternalNode(aEmptyString, SQL_NODE_KEYWORD, SQL_TOKEN_TS));
-                               pDateNode->append(new OSQLInternalNode(aString, 
SQL_NODE_STRING));
-                       }
-                       else
+       if ( pLiteral2 )
                        {
-                               Date 
aDate(aDateTime.Day,aDateTime.Month,aDateTime.Year);
-                               pDateNode->append(new 
OSQLInternalNode(aEmptyString, SQL_NODE_KEYWORD, SQL_TOKEN_D));
-                               pDateNode->append(new 
OSQLInternalNode(DBTypeConversion::toDateString(aDate), SQL_NODE_STRING));
+               pComp->append(new OSQLInternalNode(aEmptyString, 
SQL_NODE_KEYWORD,SQL_TOKEN_AND));
+               pComp->append(pLiteral2);               
                        }
-                       break;
-               }
-       }
-
-       pComp->append(pNewNode);
        pAppend->append(pComp);
-
-       delete pLiteral;
-       pLiteral = NULL;
-
        return 1;
 }
 //-----------------------------------------------------------------------------
@@ -3785,7 +3748,7 @@
 sal_Int16 OSQLParser::buildComparsionRule(OSQLParseNode*& 
pAppend,OSQLParseNode* pLiteral)
 {
        OSQLParseNode* pComp = new 
OSQLInternalNode(::rtl::OUString::createFromAscii("="), SQL_NODE_EQUAL);
-       return buildComparsionRule(pAppend,pLiteral,pComp);
+       return buildPredicateRule(pAppend,pLiteral,pComp);
 }
 
 

File [changed]: sqlnode.cxx
Url: 
http://dba.openoffice.org/source/browse/dba/connectivity/source/parse/sqlnode.cxx?r1=1.38&r2=1.38.58.1
Delta lines:  +234 -182
-----------------------
--- sqlnode.cxx 16 Jan 2006 15:04:30 -0000      1.38
+++ sqlnode.cxx 22 May 2006 10:51:46 -0000      1.38.58.1
@@ -4,9 +4,9 @@
  *
  *  $RCSfile: sqlnode.cxx,v $
  *
- *  $Revision: 1.38 $
+ *  $Revision: 1.38.58.1 $
  *
- *  last change: $Author: obo $ $Date: 2006/01/16 15:04:30 $
+ *  last change: $Author: oj $ $Date: 2006/05/22 10:51:46 $
  *
  *  The Contents of this file are made available subject to
  *  the terms of GNU Lesser General Public License Version 2.1.
@@ -282,8 +282,6 @@
 //-----------------------------------------------------------------------------
 void OSQLParseNode::parseNodeToStr(::rtl::OUString& rString, const 
SQLParseNodeParameter& rParam) const
 {
-       
-
        if (!isToken())
        {
                // einmal auswerten wieviel Subtrees dieser Knoten besitzt
@@ -432,6 +430,8 @@
                                                }
                                        }
                                }
+                else
+                    i++;
                        }
                }
        }
@@ -566,36 +566,39 @@
        return _rTable.getLength() != 0;
 }
 // 
-----------------------------------------------------------------------------
-sal_Int16 OSQLParser::buildComparsionRule(OSQLParseNode*& 
pAppend,OSQLParseNode* pLiteral,OSQLParseNode*& pCompare)
+void OSQLParser::killThousandSeparator(OSQLParseNode* pLiteral)
 {
-       sal_Int16 nErg = 0;
-       if (m_xField.is())
+    if ( pLiteral )
        {
-               sal_Int32 nType = 0;
-               try
+        if ( 
s_xLocaleData->getLocaleItem(*m_pLocale).decimalSeparator.toChar() == ',' )
                {
-                       Any aValue;
-                       {
-                               aValue = 
m_xField->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE));
-                               aValue >>= nType;
-                       }
+                   pLiteral->m_aNodeValue = 
pLiteral->m_aNodeValue.replace('.', sal_Unicode());
+                   // and replace decimal
+                   pLiteral->m_aNodeValue = 
pLiteral->m_aNodeValue.replace(',', '.');
                }
-               catch( Exception& )
-               {
-                       return nErg;
+           else
+                   pLiteral->m_aNodeValue = 
pLiteral->m_aNodeValue.replace(',', sal_Unicode());
                }
+}
+// 
-----------------------------------------------------------------------------
+OSQLParseNode* OSQLParser::convertNode(sal_Int32 nType,OSQLParseNode*& 
pLiteral)
+{
+    if ( !pLiteral )
+        return NULL;
 
-               if (pLiteral->isRule() && !SQL_ISRULE(pLiteral,value_exp))
+    OSQLParseNode* pReturn = pLiteral;
+
+       if ( pLiteral->isRule() && !SQL_ISRULE(pLiteral,value_exp))
                {
                        switch(nType)
                        {
                                case DataType::CHAR:
                                case DataType::VARCHAR:
                                case DataType::LONGVARCHAR:
-                                       if(!SQL_ISRULE(pLiteral,char_value_exp) 
&& !buildStringNodes(pLiteral))
-                                               break;
+                               if ( !SQL_ISRULE(pReturn,char_value_exp) && 
!buildStringNodes(pReturn) )
+                                       pReturn = NULL;
                                default:
-                                       nErg = 
buildNode(pAppend,pLiteral,pCompare);
+                               break;
                        }
                }
                else
@@ -608,16 +611,12 @@
                                                case DataType::CHAR:
                                                case DataType::VARCHAR:
                                                case DataType::LONGVARCHAR:
-                                                       nErg = 
buildNode(pAppend,pLiteral,pCompare);
                                                        break;
                                                case DataType::DATE:
                                                case DataType::TIME:
                                                case DataType::TIMESTAMP:
                                                        if (m_xFormatter.is())
-                                                               nErg = 
buildDate( nType, pAppend, pLiteral, pCompare );
-                                                       else
-                                                               nErg = 
buildNode(pAppend,pLiteral,pCompare);
-
+                                                       pReturn = buildDate( 
nType, pReturn);
                                                        break;
                                                default:
                                                        m_sErrorMessage = 
m_pContext->getErrorMessage(IParseContext::ERROR_INVALID_COMPARE);
@@ -629,9 +628,8 @@
                                                case DataType::DATE:
                                                case DataType::TIME:
                                                case DataType::TIMESTAMP:
-                                                       nErg = -1;
-                                                       if (m_xFormatter.is())
-                                                               nErg = 
buildDate( nType, pAppend, pLiteral, pCompare );
+                                               if ( m_xFormatter.is() )
+                                                       pReturn = buildDate( 
nType, pReturn);
                                                        else
                                                                m_sErrorMessage 
= m_pContext->getErrorMessage(IParseContext::ERROR_INVALID_DATE_COMPARE);
                                                        break;
@@ -653,20 +651,12 @@
                                                case DataType::REAL:
                                                case DataType::DOUBLE:
                                                        // kill thousand 
seperators if any
-                                                       if 
(s_xLocaleData->getLocaleItem(*m_pLocale).decimalSeparator.toChar() == ',' )
-                                                       {
-                                                               
pLiteral->m_aNodeValue = pLiteral->m_aNodeValue.replace('.', sal_Unicode());
-                                                               // and replace 
decimal
-                                                               
pLiteral->m_aNodeValue = pLiteral->m_aNodeValue.replace(',', '.');
-                                                       }
-                                                       else
-                                                               
pLiteral->m_aNodeValue = pLiteral->m_aNodeValue.replace(',', sal_Unicode());
-                                                       nErg = 
buildNode(pAppend,pLiteral,pCompare);
+                                               killThousandSeparator(pReturn);
                                                        break;
                                                case DataType::CHAR:
                                                case DataType::VARCHAR:
                                                case DataType::LONGVARCHAR:
-                                                       nErg = 
buildNode_STR_NUM(pAppend,pLiteral,pCompare);
+                                               pReturn = 
buildNode_STR_NUM(pReturn);
                                                        break;
                                                default:
                                                        m_sErrorMessage = 
m_pContext->getErrorMessage(IParseContext::ERROR_INVALID_INT_COMPARE);
@@ -680,24 +670,13 @@
                                                case DataType::FLOAT:
                                                case DataType::REAL:
                                                case DataType::DOUBLE:
-                                                       if (inPredicateCheck())
-                                                       {
                                                                // kill 
thousand seperators if any
-                                                               if 
(s_xLocaleData->getLocaleItem(*m_pLocale).decimalSeparator.toChar() == ',' )
-                                                               {
-                                                                       
pLiteral->m_aNodeValue = pLiteral->m_aNodeValue.replace('.', sal_Unicode());
-                                                                       // and 
replace decimal
-                                                                       
pLiteral->m_aNodeValue = pLiteral->m_aNodeValue.replace(',', '.');
-                                                               }
-                                                               else
-                                                                       
pLiteral->m_aNodeValue = pLiteral->m_aNodeValue.replace(',', sal_Unicode());
-                                                       }
-                                                       nErg = 
buildNode(pAppend,pLiteral,pCompare);
+                        killThousandSeparator(pReturn);
                                                        break;
                                                case DataType::CHAR:
                                                case DataType::VARCHAR:
                                                case DataType::LONGVARCHAR:
-                                                       nErg = 
buildNode_STR_NUM(pAppend,pLiteral,pCompare);
+                                               pReturn = 
buildNode_STR_NUM(pReturn);
                                                        break;
                                                case DataType::INTEGER:
                                                default:
@@ -706,8 +685,33 @@
                                        break;
                        }
                }
-               if (!nErg)
-                       --nErg;
+    return pReturn;
+}
+// 
-----------------------------------------------------------------------------
+sal_Int16 OSQLParser::buildPredicateRule(OSQLParseNode*& 
pAppend,OSQLParseNode* pLiteral,OSQLParseNode*& pCompare,OSQLParseNode* 
pLiteral2)
+{
+    OSL_ENSURE(inPredicateCheck(),"Only in predicate check allowed!");
+       sal_Int16 nErg = 0;
+       if ( m_xField.is() )
+       {
+        sal_Int32 nType = 0;
+           try
+           {
+                   
m_xField->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE))
 >>= nType;
+           }
+           catch( Exception& )
+           {
+                   return nErg;
+           }
+
+        OSQLParseNode* pNode1 = convertNode(nType,pLiteral);
+        if ( pNode1 )
+        {
+            OSQLParseNode* pNode2 = convertNode(nType,pLiteral2);
+            if ( !m_sErrorMessage.getLength() )
+                nErg = buildNode(pAppend,pCompare,pNode1,pNode2);
+        }
+               
        }
        if (!pCompare->getParent()) // I have no parent so I was not used and I 
must die :-)
                delete pCompare;
@@ -787,40 +791,82 @@
        }
        return nErg;
 }
-// 
-----------------------------------------------------------------------------
-sal_Int16 OSQLParser::buildNode_STR_NUM(OSQLParseNode*& 
pAppend,OSQLParseNode*& pLiteral,OSQLParseNode*& pCompare)
+//-----------------------------------------------------------------------------
+OSQLParseNode* OSQLParser::buildNode_Date(const double& fValue, sal_Int32 
nType)
 {
-       static ::rtl::OUString aEmptyString;
-       OSQLParseNode* pColumnRef = new OSQLInternalNode(aEmptyString, 
SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::column_ref));
-       pColumnRef->append(new OSQLInternalNode(m_sFieldName,SQL_NODE_NAME));
-       OSQLParseNode* pComp = new OSQLInternalNode(aEmptyString, 
SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::comparison_predicate));
-       pComp->append(pColumnRef);
-       pComp->append(pCompare);
+    ::rtl::OUString aEmptyString;
+    OSQLParseNode* pNewNode = new OSQLInternalNode(aEmptyString, 
SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::set_fct_spec));
+       pNewNode->append(new 
OSQLInternalNode(::rtl::OUString::createFromAscii("{"), SQL_NODE_PUNCTUATION));
+       OSQLParseNode* pDateNode = new OSQLInternalNode(aEmptyString, 
SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::odbc_fct_spec));
+       pNewNode->append(pDateNode);
+       pNewNode->append(new 
OSQLInternalNode(::rtl::OUString::createFromAscii("}"), SQL_NODE_PUNCTUATION));
+
+       switch (nType)
+       {
+               case DataType::DATE:
+               {
+                       Date aDate = 
DBTypeConversion::toDate(fValue,DBTypeConversion::getNULLDate(m_xFormatter->getNumberFormatsSupplier()));
+                       ::rtl::OUString aString = 
DBTypeConversion::toDateString(aDate);
+                       pDateNode->append(new OSQLInternalNode(aEmptyString, 
SQL_NODE_KEYWORD, SQL_TOKEN_D));
+                       pDateNode->append(new OSQLInternalNode(aString, 
SQL_NODE_STRING));
+                       break;
+               }
+               case DataType::TIME:
+               {
+                       Time aTime = DBTypeConversion::toTime(fValue);
+                       ::rtl::OUString aString = 
DBTypeConversion::toTimeString(aTime);
+                       pDateNode->append(new OSQLInternalNode(aEmptyString, 
SQL_NODE_KEYWORD, SQL_TOKEN_T));
+                       pDateNode->append(new OSQLInternalNode(aString, 
SQL_NODE_STRING));
+                       break;
+               }
+               case DataType::TIMESTAMP:
+               {
+                       DateTime aDateTime = 
DBTypeConversion::toDateTime(fValue,DBTypeConversion::getNULLDate(m_xFormatter->getNumberFormatsSupplier()));
+                       if (aDateTime.Seconds || aDateTime.Minutes || 
aDateTime.Hours)
+                       {
+                               ::rtl::OUString aString = 
DBTypeConversion::toDateTimeString(aDateTime);
+                               pDateNode->append(new 
OSQLInternalNode(aEmptyString, SQL_NODE_KEYWORD, SQL_TOKEN_TS));
+                               pDateNode->append(new OSQLInternalNode(aString, 
SQL_NODE_STRING));
+                       }
+                       else
+                       {
+                               Date 
aDate(aDateTime.Day,aDateTime.Month,aDateTime.Year);
+                               pDateNode->append(new 
OSQLInternalNode(aEmptyString, SQL_NODE_KEYWORD, SQL_TOKEN_D));
+                               pDateNode->append(new 
OSQLInternalNode(DBTypeConversion::toDateString(aDate), SQL_NODE_STRING));
+                       }
+                       break;
+               }
+       }
 
+       return pNewNode;
+}
+// 
-----------------------------------------------------------------------------
+OSQLParseNode* OSQLParser::buildNode_STR_NUM(OSQLParseNode*& _pLiteral)
+{
+       OSQLParseNode* pReturn = NULL;
+    if ( _pLiteral )
+    {
        if (m_nFormatKey)
        {
                sal_Int16 nScale = 0;
                ::rtl::OUString aDec;
                try
                {
-                       Any aValue = getNumberFormatProperty( m_xFormatter, 
m_nFormatKey, ::rtl::OUString::createFromAscii("Decimals") );
+                Any aValue = getNumberFormatProperty( m_xFormatter, 
m_nFormatKey, ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Decimals")) );
                        aValue >>= nScale;
                }
                catch( Exception& )
                {
                }
 
-               pComp->append(new 
OSQLInternalNode(stringToDouble(pLiteral->getTokenValue(),nScale),SQL_NODE_STRING));
+                   pReturn = new 
OSQLInternalNode(stringToDouble(_pLiteral->getTokenValue(),nScale),SQL_NODE_STRING);
        }
        else
-               pComp->append(new 
OSQLInternalNode(pLiteral->getTokenValue(),SQL_NODE_STRING));
-
-       pAppend->append(pComp);
-
-       delete pLiteral;
-       pLiteral = NULL;
-
-       return 1;
+                   pReturn = new 
OSQLInternalNode(_pLiteral->getTokenValue(),SQL_NODE_STRING);
+        delete _pLiteral;
+        _pLiteral = NULL;
+    }
+    return pReturn;
 }
 // 
-----------------------------------------------------------------------------
 ::rtl::OUString OSQLParser::stringToDouble(const ::rtl::OUString& 
_rValue,sal_Int16 _nScale)
@@ -1089,14 +1135,9 @@
 
        }
 }
-
 // 
-----------------------------------------------------------------------------
-sal_Int16 OSQLParser::buildDate(sal_Int32 _nType,OSQLParseNode*& 
pAppend,OSQLParseNode* pLiteral,OSQLParseNode*& pCompare)
+bool OSQLParser::extractDate(OSQLParseNode* pLiteral,double& _rfValue)
 {
-       sal_Int16 nErg = -1;
-       double fValue = 0.0;
-    ::rtl::OUString sValue = pLiteral->getTokenValue();
-
     Reference< XNumberFormatsSupplier > xFormatSup = 
m_xFormatter->getNumberFormatsSupplier();
        Reference< XNumberFormatTypes > xFormatTypes;
     if ( xFormatSup.is() )
@@ -1109,10 +1150,9 @@
                        m_nFormatKey = ::dbtools::getDefaultNumberFormat( 
m_xField, xFormatTypes, *m_pLocale );
     }
     catch( Exception& ) { }
-
-    // try converting the string into a date, according to our format key
+    ::rtl::OUString sValue = pLiteral->getTokenValue();
     sal_Int32 nTryFormat = m_nFormatKey;
-    bool bSuccess = lcl_saveConvertToNumber( m_xFormatter, nTryFormat, sValue, 
fValue );
+    bool bSuccess = lcl_saveConvertToNumber( m_xFormatter, nTryFormat, sValue, 
_rfValue );
 
     // If our format key didn't do, try the default date format for our locale.
     if ( !bSuccess && xFormatTypes.is() )
@@ -1122,7 +1162,7 @@
             nTryFormat = xFormatTypes->getStandardFormat( NumberFormat::DATE, 
*m_pLocale );
                }
         catch( Exception& ) { }
-        bSuccess = lcl_saveConvertToNumber( m_xFormatter, nTryFormat, sValue, 
fValue );
+        bSuccess = lcl_saveConvertToNumber( m_xFormatter, nTryFormat, sValue, 
_rfValue );
     }
 
     // if this also didn't do, try ISO format
@@ -1133,21 +1173,33 @@
             nTryFormat = xFormatTypes->getFormatIndex( 
NumberFormatIndex::DATE_DIN_YYYYMMDD, *m_pLocale );
                }
         catch( Exception& ) { }
-        bSuccess = lcl_saveConvertToNumber( m_xFormatter, nTryFormat, sValue, 
fValue );
+        bSuccess = lcl_saveConvertToNumber( m_xFormatter, nTryFormat, sValue, 
_rfValue );
     }
 
     // if this also didn't do, try fallback date format (en-US)
     if ( !bSuccess )
     {
         nTryFormat = m_nDateFormatKey;
-        bSuccess = lcl_saveConvertToNumber( m_xFormatter, nTryFormat, sValue, 
fValue );
+        bSuccess = lcl_saveConvertToNumber( m_xFormatter, nTryFormat, sValue, 
_rfValue );
     }
+    return bSuccess;
+}
+// 
-----------------------------------------------------------------------------
+OSQLParseNode* OSQLParser::buildDate(sal_Int32 _nType,OSQLParseNode*& pLiteral)
+{
+    // try converting the string into a date, according to our format key
+       double fValue = 0.0;
+    OSQLParseNode* pFCTNode = NULL;
 
-    if ( bSuccess )
-               nErg = buildNode_Date( fValue, _nType, pAppend, pLiteral, 
pCompare );
-    else
+    if ( extractDate(pLiteral,fValue) )
+               pFCTNode = buildNode_Date( fValue, _nType);
+
+    delete pLiteral;
+    pLiteral = NULL;
+
+    if ( !pFCTNode )
                m_sErrorMessage = 
m_pContext->getErrorMessage(IParseContext::ERROR_INVALID_DATE_COMPARE);
 
-    return nErg;
+    return pFCTNode;
 }
 // 
-----------------------------------------------------------------------------




---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to