[Libreoffice-commits] core.git: 2 commits - connectivity/source dbaccess/source include/connectivity reportdesign/source

Lionel Elie Mamane lionel at mamane.lu
Sat Dec 7 12:36:48 PST 2013


 connectivity/source/parse/sqlbison.y               |   44 +++++++-------------
 connectivity/source/parse/sqlnode.cxx              |   45 +++++++++++++++------
 dbaccess/source/ui/querydesign/QueryDesignView.cxx |    2 
 include/connectivity/sqlnode.hxx                   |    2 
 reportdesign/source/filter/xml/xmlExport.cxx       |    2 
 5 files changed, 53 insertions(+), 42 deletions(-)

New commits:
commit eb60095292b5ef8dc94a0b166151d3a79c9df156
Author: Lionel Elie Mamane <lionel at mamane.lu>
Date:   Sat Dec 7 21:34:17 2013 +0100

    fdo#72391 empty formula is "rpt:", not starts with "rpt:"
    
    (all?) functions start with rpt:
    correction of erroneous cleanup wrt to equalsAsciiL
    
    Change-Id: I0568ef28a1e677f68016b8593c2b30d0ffba1bb5

diff --git a/reportdesign/source/filter/xml/xmlExport.cxx b/reportdesign/source/filter/xml/xmlExport.cxx
index 954bce4..c2c9a03 100644
--- a/reportdesign/source/filter/xml/xmlExport.cxx
+++ b/reportdesign/source/filter/xml/xmlExport.cxx
@@ -1020,7 +1020,7 @@ void ORptExport::exportContainer(const Reference< XSection>& _xSection)
 OUString ORptExport::convertFormula(const OUString& _sFormula)
 {
     OUString sFormula = _sFormula;
-    if ( _sFormula.startsWith("rpt:") )
+    if ( _sFormula == "rpt:" )
         sFormula = "";
     return sFormula;
 }
commit ee712dd6964daafa463febea8a948ea277ad16c7
Author: Lionel Elie Mamane <lionel at mamane.lu>
Date:   Sat Dec 7 20:39:33 2013 +0100

    fdo#72267 boolean_test is subsumed by general case "foo IS [NOT] bar"
    
    Change-Id: Ie9666b1c8878dd26593629b4b64d74b7448f98c1

diff --git a/connectivity/source/parse/sqlbison.y b/connectivity/source/parse/sqlbison.y
index d145599..bdc76bd 100644
--- a/connectivity/source/parse/sqlbison.y
+++ b/connectivity/source/parse/sqlbison.y
@@ -222,7 +222,7 @@ using namespace connectivity;
 %type <pParseNode> non_join_query_term non_join_query_primary simple_table
 %type <pParseNode> table_value_const_list row_value_constructor row_value_const_list row_value_constructor_elem
 %type <pParseNode> qualified_join value_exp query_term join_type outer_join_type join_condition boolean_term
-%type <pParseNode> boolean_factor truth_value boolean_test boolean_primary named_columns_join join_spec
+%type <pParseNode> boolean_factor boolean_primary named_columns_join join_spec
 %type <pParseNode> cast_operand cast_target factor datetime_value_exp /*interval_value_exp*/ datetime_term datetime_factor
 %type <pParseNode> datetime_primary datetime_value_fct time_zone time_zone_specifier /*interval_term*/ interval_qualifier
 %type <pParseNode> start_field non_second_datetime_field end_field single_datetime_field extract_field datetime_field time_zone_field
@@ -1081,12 +1081,6 @@ opt_having_clause:
 	;
 
 	/* search conditions */
-truth_value:
-		SQL_TOKEN_TRUE
-	  | SQL_TOKEN_FALSE
-	  | SQL_TOKEN_UNKNOWN
-	  | SQL_TOKEN_NULL
-	  ;
 boolean_primary:
 		predicate
 	|   '(' search_condition ')'
@@ -1130,20 +1124,9 @@ parenthesized_boolean_value_expression:
 		$$->append(newNode(")", SQL_NODE_PUNCTUATION));
 	}
 	;
-boolean_test:
-		boolean_primary
-	|	boolean_primary SQL_TOKEN_IS sql_not truth_value
-		{
-			$$ = SQL_NEW_RULE;
-			$$->append($1);
-			$$->append($2);
-			$$->append($3);
-			$$->append($4);
-		}
-	;
 boolean_factor:
-        boolean_test
-	|   SQL_TOKEN_NOT boolean_test
+	    boolean_primary
+	|   SQL_TOKEN_NOT boolean_primary
 		{ // boolean_factor: rule 1
 		    $$ = SQL_NEW_RULE;
 		    $$->append($1);
@@ -1171,12 +1154,12 @@ search_condition:
 		}
 	;
 predicate:
-		comparison_predicate
+		comparison_predicate     %dprec 2
 	|       between_predicate
 	|       all_or_any_predicate
 	|       existence_test
 	|		unique_test
-	|		test_for_null
+	|		test_for_null    %dprec 1
 	|       in_predicate
 	|       like_predicate
 	;
@@ -1384,13 +1367,20 @@ opt_escape:
 	;
 
 null_predicate_part_2:
-	SQL_TOKEN_IS sql_not SQL_TOKEN_NULL
-	{
+	  SQL_TOKEN_IS sql_not SQL_TOKEN_NULL
+	  {
 		$$ = SQL_NEW_RULE; // test_for_null: rule 1
 		$$->append($1);
 		$$->append($2);
 		$$->append($3);
-	}
+	  }
+	| SQL_TOKEN_IS sql_not SQL_TOKEN_UNKNOWN
+	  {
+		$$ = SQL_NEW_RULE; // test_for_null: rule 1
+		$$->append($1);
+		$$->append($2);
+		$$->append($3);
+	  }
 	;
 test_for_null:
 		row_value_constructor null_predicate_part_2
@@ -3959,11 +3949,11 @@ when_operand_list:
 	;
 when_operand:
 		row_value_constructor_elem
-	|	comparison_predicate_part_2
+	|	comparison_predicate_part_2        %dprec 2
 	|	between_predicate_part_2
 	|	in_predicate_part_2
 	|	character_like_predicate_part_2
-	|	null_predicate_part_2
+	|	null_predicate_part_2              %dprec 1
 ;
 searched_when_clause_list:
 		searched_when_clause
diff --git a/connectivity/source/parse/sqlnode.cxx b/connectivity/source/parse/sqlnode.cxx
index 759da1b..6f13f4a 100644
--- a/connectivity/source/parse/sqlnode.cxx
+++ b/connectivity/source/parse/sqlnode.cxx
@@ -619,7 +619,6 @@ void OSQLParseNode::impl_parseNodeToString_throw(OUStringBuffer& rString, const
             case unique_test:
             case all_or_any_predicate:
             case join_condition:
-            case boolean_test:
             case comparison_predicate_part_2:
             case parenthesized_boolean_value_expression:
             case other_like_predicate_part_2:
@@ -1384,6 +1383,7 @@ OSQLParser::OSQLParser(const ::com::sun::star::uno::Reference< ::com::sun::star:
             { OSQLParseNode::where_clause, "where_clause" },
             { OSQLParseNode::opt_where_clause, "opt_where_clause" },
             { OSQLParseNode::search_condition, "search_condition" },
+            { OSQLParseNode::comparison, "comparison" },
             { OSQLParseNode::comparison_predicate, "comparison_predicate" },
             { OSQLParseNode::between_predicate, "between_predicate" },
             { OSQLParseNode::like_predicate, "like_predicate" },
@@ -1431,7 +1431,6 @@ OSQLParser::OSQLParser(const ::com::sun::star::uno::Reference< ::com::sun::star:
             { OSQLParseNode::joined_table, "joined_table" },
             { OSQLParseNode::boolean_factor, "boolean_factor" },
             { OSQLParseNode::sql_not, "sql_not" },
-            { OSQLParseNode::boolean_test, "boolean_test" },
             { OSQLParseNode::manipulative_statement, "manipulative_statement" },
             { OSQLParseNode::subquery, "subquery" },
             { OSQLParseNode::value_exp_commalist, "value_exp_commalist" },
@@ -1966,7 +1965,7 @@ void OSQLParseNode::negateSearchCondition(OSQLParseNode*& pSearchCondition, sal_
         negateSearchCondition(pLeft,bNegate);
         negateSearchCondition(pRight,bNegate);
     }
-    // SQL_TOKEN_NOT ( boolean_test )
+    // SQL_TOKEN_NOT ( boolean_primary )
     else if (SQL_ISRULE(pSearchCondition,boolean_factor))
     {
         OSQLParseNode *pNot = pSearchCondition->removeAt((sal_uInt32)0);
@@ -1982,10 +1981,31 @@ void OSQLParseNode::negateSearchCondition(OSQLParseNode*& pSearchCondition, sal_
     // row_value_constructor comparison any_all_some subquery
     else if(bNegate && (SQL_ISRULE(pSearchCondition,comparison_predicate) || SQL_ISRULE(pSearchCondition,all_or_any_predicate)))
     {
+        assert(pSearchCondition->count() == 3);
         OSQLParseNode* pComparison = pSearchCondition->getChild(1);
         OSQLParseNode* pNewComparison = NULL;
-        switch(pComparison->getNodeType())
+        if(SQL_ISRULE(pComparison, comparison))
         {
+            assert(pComparison->count() == 2 ||
+                   pComparison->count() == 4);
+            assert(SQL_ISTOKEN(pComparison->getChild(0), IS));
+
+            OSQLParseNode* pNot = pComparison->getChild(1);
+            OSQLParseNode* pNotNot = NULL;
+            if(pNot->isRule()) // no NOT token (empty rule)
+                pNotNot = new OSQLParseNode(OUString("NOT"),SQL_NODE_KEYWORD,SQL_TOKEN_NOT);
+            else
+            {
+                assert(SQL_ISTOKEN(pNot,NOT));
+                pNotNot = new OSQLParseNode(OUString(),SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::sql_not));
+            }
+            pComparison->replace(pNot, pNotNot);
+            delete pNot;
+        }
+        else
+        {
+            switch(pComparison->getNodeType())
+            {
             case SQL_NODE_EQUAL:
                 pNewComparison = new OSQLParseNode(OUString("<>"),SQL_NODE_NOTEQUAL,SQL_NOTEQUAL);
                 break;
@@ -2007,29 +2027,30 @@ void OSQLParseNode::negateSearchCondition(OSQLParseNode*& pSearchCondition, sal_
             default:
                 SAL_WARN( "connectivity.parse", "OSQLParseNode::negateSearchCondition: unexpected node type!" );
                 break;
+            }
         }
         pSearchCondition->replace(pComparison, pNewComparison);
         delete pComparison;
     }
 
-    else if(bNegate && (SQL_ISRULE(pSearchCondition,test_for_null) || SQL_ISRULE(pSearchCondition,in_predicate) ||
-                        SQL_ISRULE(pSearchCondition,between_predicate) || SQL_ISRULE(pSearchCondition,boolean_test) ))
+    else if(bNegate && (SQL_ISRULE(pSearchCondition,test_for_null) ||
+                        SQL_ISRULE(pSearchCondition,in_predicate)  ||
+                        SQL_ISRULE(pSearchCondition,between_predicate) ))
     {
-        OSQLParseNode* pPart2 = pSearchCondition;
-        if ( !SQL_ISRULE(pSearchCondition,boolean_test) )
-            pPart2 = pSearchCondition->getChild(1);
+        OSQLParseNode* pPart2 = pSearchCondition->getChild(1);
         sal_uInt32 nNotPos = 0;
         if  ( SQL_ISRULE( pSearchCondition, test_for_null ) )
             nNotPos = 1;
-        else if ( SQL_ISRULE( pSearchCondition, boolean_test ) )
-            nNotPos = 2;
 
         OSQLParseNode* pNot = pPart2->getChild(nNotPos);
         OSQLParseNode* pNotNot = NULL;
-        if(pNot->isRule())
+        if(pNot->isRule()) // no NOT token (empty rule)
             pNotNot = new OSQLParseNode(OUString("NOT"),SQL_NODE_KEYWORD,SQL_TOKEN_NOT);
         else
+        {
+            assert(SQL_ISTOKEN(pNot,NOT));
             pNotNot = new OSQLParseNode(OUString(),SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::sql_not));
+        }
         pPart2->replace(pNot, pNotNot);
         delete pNot;
     }
diff --git a/dbaccess/source/ui/querydesign/QueryDesignView.cxx b/dbaccess/source/ui/querydesign/QueryDesignView.cxx
index 678bd44..fcf8732 100644
--- a/dbaccess/source/ui/querydesign/QueryDesignView.cxx
+++ b/dbaccess/source/ui/querydesign/QueryDesignView.cxx
@@ -3345,6 +3345,7 @@ void OQueryDesignView::fillFunctionInfo(  const ::connectivity::OSQLParseNode* p
         case OSQLParseNode::op_column_commalist:
         case OSQLParseNode::table_primary_as_range_column:
         case OSQLParseNode::character_string_type:
+        case OSQLParseNode::comparison:
             OSL_FAIL("Unexpected SQL RuleID");
             break;
         case OSQLParseNode::column:
@@ -3373,7 +3374,6 @@ void OQueryDesignView::fillFunctionInfo(  const ::connectivity::OSQLParseNode* p
         case OSQLParseNode::all_or_any_predicate:
         case OSQLParseNode::join_condition:
         case OSQLParseNode::boolean_factor:
-        case OSQLParseNode::boolean_test:
         case OSQLParseNode::comparison_predicate_part_2:
         case OSQLParseNode::parenthesized_boolean_value_expression:
         case OSQLParseNode::other_like_predicate_part_2:
diff --git a/include/connectivity/sqlnode.hxx b/include/connectivity/sqlnode.hxx
index cc9a26a..d1c4cf7 100644
--- a/include/connectivity/sqlnode.hxx
+++ b/include/connectivity/sqlnode.hxx
@@ -149,6 +149,7 @@ namespace connectivity
             where_clause,
             opt_where_clause,
             search_condition,
+            comparison,
             comparison_predicate,
             between_predicate,
             like_predicate,
@@ -196,7 +197,6 @@ namespace connectivity
             joined_table,
             boolean_factor,
             sql_not,
-            boolean_test,
             manipulative_statement,
             subquery,
             value_exp_commalist,


More information about the Libreoffice-commits mailing list