[Libreoffice-commits] core.git: Branch 'libreoffice-4-2' - connectivity/source dbaccess/source include/connectivity

Lionel Elie Mamane lionel at mamane.lu
Mon Dec 9 11:52:44 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 
 4 files changed, 52 insertions(+), 41 deletions(-)

New commits:
commit 962cdfb1370b983fbc7f463edfab1dad53b5a8e7
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
    Reviewed-on: https://gerrit.libreoffice.org/6974
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/connectivity/source/parse/sqlbison.y b/connectivity/source/parse/sqlbison.y
index 8ff9b0c..6e7b973 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 e818d3e..3544018 100644
--- a/connectivity/source/parse/sqlnode.cxx
+++ b/connectivity/source/parse/sqlnode.cxx
@@ -620,7 +620,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:
@@ -1385,6 +1384,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" },
@@ -1432,7 +1432,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" },
@@ -1967,7 +1966,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);
@@ -1983,10 +1982,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;
@@ -2008,29 +2028,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