List:Internals« Previous MessageNext Message »
From:Martin Skold Date:August 1 2005 11:50am
Subject:bk commit into 5.0 tree (mskold:1.1918)
View as plain text  
Below is the list of changes that have just been committed into a local
5.0 repository of marty. When marty does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet
  1.1918 05/08/01 11:50:43 mskold@stripped +2 -0
  Fixed handling of NOT LIKE after Item_func::NOTLIKE_FUNC has been removed

  sql/ha_ndbcluster.h
    1.90 05/08/01 11:50:26 mskold@stripped +66 -21
    Fixed handling of NOT LIKE after Item_func::NOTLIKE_FUNC has been removed

  sql/ha_ndbcluster.cc
    1.196 05/08/01 11:50:26 mskold@stripped +33 -14
    Fixed handling of NOT LIKE after Item_func::NOTLIKE_FUNC has been removed

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	mskold
# Host:	blowfish.ndb.mysql.com
# Root:	/usr/local/home/marty/MySQL/mysql-5.0

--- 1.195/sql/ha_ndbcluster.cc	2005-07-29 03:37:02 +02:00
+++ 1.196/sql/ha_ndbcluster.cc	2005-08-01 11:50:26 +02:00
@@ -7010,7 +7010,7 @@
     switch ((negated) ? 
             Ndb_item::negate(cond->ndb_item->qualification.function_type)
             : cond->ndb_item->qualification.function_type) {
-    case Item_func::EQ_FUNC:
+    case NDB_EQ_FUNC:
     {
       if (!value || !field) break;
       // Save value in right format for the field type
@@ -7024,7 +7024,7 @@
       cond= cond->next->next->next;
       DBUG_RETURN(0);
     }
-    case Item_func::NE_FUNC:
+    case NDB_NE_FUNC:
     {
       if (!value || !field) break;
       // Save value in right format for the field type
@@ -7038,7 +7038,7 @@
       cond= cond->next->next->next;
       DBUG_RETURN(0);
     }
-    case Item_func::LT_FUNC:
+    case NDB_LT_FUNC:
     {
       if (!value || !field) break;
       // Save value in right format for the field type
@@ -7064,7 +7064,7 @@
       cond= cond->next->next->next;
       DBUG_RETURN(0);
     }
-    case Item_func::LE_FUNC:
+    case NDB_LE_FUNC:
     {
       if (!value || !field) break;
       // Save value in right format for the field type
@@ -7090,7 +7090,7 @@
       cond= cond->next->next->next;
       DBUG_RETURN(0);
     }
-    case Item_func::GE_FUNC:
+    case NDB_GE_FUNC:
     {
       if (!value || !field) break;
       // Save value in right format for the field type
@@ -7116,7 +7116,7 @@
       cond= cond->next->next->next;
       DBUG_RETURN(0);
     }
-    case Item_func::GT_FUNC:
+    case NDB_GT_FUNC:
     {
       if (!value || !field) break;
       // Save value in right format for the field type
@@ -7142,7 +7142,7 @@
       cond= cond->next->next->next;
       DBUG_RETURN(0);
     }
-    case Item_func::LIKE_FUNC:
+    case NDB_LIKE_FUNC:
     {
       if (!value || !field) break;
       if ((value->qualification.value_type != Item::STRING_ITEM) &&
@@ -7161,7 +7161,26 @@
       cond= cond->next->next->next;
       DBUG_RETURN(0);
     }
-    case Item_func::ISNULL_FUNC:
+    case NDB_NOTLIKE_FUNC:
+    {
+      if (!value || !field) break;
+      if ((value->qualification.value_type != Item::STRING_ITEM) &&
+          (value->qualification.value_type != Item::VARBIN_ITEM))
+          break;
+      // Save value in right format for the field type
+      value->save_in_field(field);
+      DBUG_PRINT("info", ("Generating NOTLIKE filter: notlike(%d,%s,%d)", 
+                          field->get_field_no(), value->get_val(), 
+                          value->pack_length()));
+      if (filter->cmp(NdbScanFilter::COND_NOT_LIKE, 
+                      field->get_field_no(),
+                      value->get_val(),
+                      value->pack_length()) == -1)
+        DBUG_RETURN(1);
+      cond= cond->next->next->next;
+      DBUG_RETURN(0);
+    }
+    case NDB_ISNULL_FUNC:
       if (!field)
         break;
       DBUG_PRINT("info", ("Generating ISNULL filter"));
@@ -7169,7 +7188,7 @@
         DBUG_RETURN(1);
       cond= cond->next->next;
       DBUG_RETURN(0);
-    case Item_func::ISNOTNULL_FUNC:
+    case NDB_ISNOTNULL_FUNC:
     {
       if (!field)
         break;
@@ -7206,7 +7225,7 @@
     case NDB_FUNCTION:
     {
       switch (cond->ndb_item->qualification.function_type) {
-      case Item_func::COND_AND_FUNC:
+      case NDB_COND_AND_FUNC:
       {
         level++;
         DBUG_PRINT("info", ("Generating %s group %u", (negated)?"NAND":"AND",
@@ -7218,7 +7237,7 @@
         cond= cond->next;
         break;
       }
-      case Item_func::COND_OR_FUNC:
+      case NDB_COND_OR_FUNC:
       {
         level++;
         DBUG_PRINT("info", ("Generating %s group %u", (negated)?"NOR":"OR",
@@ -7230,7 +7249,7 @@
         cond= cond->next;
         break;
       }
-      case Item_func::NOT_FUNC:
+      case NDB_NOT_FUNC:
       {
         DBUG_PRINT("info", ("Generating negated query"));
         cond= cond->next;
@@ -7273,8 +7292,8 @@
     switch (cond->ndb_item->type) {
     case NDB_FUNCTION:
       switch (cond->ndb_item->qualification.function_type) {
-      case Item_func::COND_AND_FUNC:
-      case Item_func::COND_OR_FUNC:
+      case NDB_COND_AND_FUNC:
+      case NDB_COND_OR_FUNC:
         simple_cond= FALSE;
         break;
       default:

--- 1.89/sql/ha_ndbcluster.h	2005-07-29 03:37:02 +02:00
+++ 1.90/sql/ha_ndbcluster.h	2005-08-01 11:50:26 +02:00
@@ -72,10 +72,28 @@
   NDB_END_COND = 3 // End marker for condition group
 } NDB_ITEM_TYPE;
 
+typedef enum ndb_func_type {
+  NDB_EQ_FUNC = 0,
+  NDB_NE_FUNC = 1,
+  NDB_LT_FUNC = 2,
+  NDB_LE_FUNC = 3,
+  NDB_GT_FUNC = 4,
+  NDB_GE_FUNC = 5,
+  NDB_ISNULL_FUNC = 6,
+  NDB_ISNOTNULL_FUNC = 7,
+  NDB_LIKE_FUNC = 8,
+  NDB_NOTLIKE_FUNC = 9,
+  NDB_NOT_FUNC = 10,
+  NDB_UNKNOWN_FUNC = 11,
+  NDB_COND_AND_FUNC = 12,
+  NDB_COND_OR_FUNC = 13,
+  NDB_UNSUPPORTED_FUNC = 14
+} NDB_FUNC_TYPE;
+
 typedef union ndb_item_qualification {
   Item::Type value_type; 
-  enum_field_types field_type;       // Instead of Item::FIELD_ITEM
-  Item_func::Functype function_type; // Instead of Item::FUNC_ITEM
+  enum_field_types field_type; // Instead of Item::FIELD_ITEM
+  NDB_FUNC_TYPE function_type; // Instead of Item::FUNC_ITEM
 } NDB_ITEM_QUALIFICATION;
 
 typedef struct ndb_item_field_value {
@@ -91,21 +109,31 @@
 
 struct negated_function_mapping
 {
-  Item_func::Functype pos_fun;
-  Item_func::Functype neg_fun;
+  NDB_FUNC_TYPE pos_fun;
+  NDB_FUNC_TYPE neg_fun;
 };
 
+/*
+  Define what functions can be negated in condition pushdown.
+  Note, these HAVE to be in the same order as in definition enum
+*/
 static const negated_function_mapping neg_map[]= 
 {
-  {Item_func::EQ_FUNC, Item_func::NE_FUNC},
-  {Item_func::NE_FUNC, Item_func::EQ_FUNC},
-  {Item_func::LT_FUNC, Item_func::GE_FUNC},
-  {Item_func::LE_FUNC, Item_func::GT_FUNC},
-  {Item_func::GT_FUNC, Item_func::LE_FUNC},
-  {Item_func::GE_FUNC, Item_func::LT_FUNC},
-  {Item_func::ISNULL_FUNC, Item_func::ISNOTNULL_FUNC},
-  {Item_func::ISNOTNULL_FUNC, Item_func::ISNULL_FUNC},
-  {Item_func::UNKNOWN_FUNC, Item_func::NOT_FUNC}
+  {NDB_EQ_FUNC, NDB_NE_FUNC},
+  {NDB_NE_FUNC, NDB_EQ_FUNC},
+  {NDB_LT_FUNC, NDB_GE_FUNC},
+  {NDB_LE_FUNC, NDB_GT_FUNC},
+  {NDB_GT_FUNC, NDB_LE_FUNC},
+  {NDB_GE_FUNC, NDB_LT_FUNC},
+  {NDB_ISNULL_FUNC, NDB_ISNOTNULL_FUNC},
+  {NDB_ISNOTNULL_FUNC, NDB_ISNULL_FUNC},
+  {NDB_LIKE_FUNC, NDB_NOTLIKE_FUNC},
+  {NDB_NOTLIKE_FUNC, NDB_LIKE_FUNC},
+  {NDB_NOT_FUNC, NDB_UNSUPPORTED_FUNC},
+  {NDB_UNKNOWN_FUNC, NDB_UNSUPPORTED_FUNC},
+  {NDB_COND_AND_FUNC, NDB_UNSUPPORTED_FUNC},
+  {NDB_COND_OR_FUNC, NDB_UNSUPPORTED_FUNC},
+  {NDB_UNSUPPORTED_FUNC, NDB_UNSUPPORTED_FUNC}
 };
   
 /*
@@ -160,14 +188,14 @@
   Ndb_item(Item_func::Functype func_type, const Item *item_value) 
     : type(NDB_FUNCTION)
   {
-    qualification.function_type= func_type;
+    qualification.function_type= item_func_to_ndb_func(func_type);
     value.item= item_value;
     value.arg_count= ((Item_func *) item_value)->argument_count();
   };
   Ndb_item(Item_func::Functype func_type, uint no_args) 
     : type(NDB_FUNCTION)
   {
-    qualification.function_type= func_type;
+    qualification.function_type= item_func_to_ndb_func(func_type);
     value.arg_count= no_args;
   };
   ~Ndb_item()
@@ -229,13 +257,30 @@
       ((Item *)item)->save_in_field(field, false);
   };
 
-  static Item_func::Functype negate(Item_func::Functype fun)
+  static NDB_FUNC_TYPE item_func_to_ndb_func(Item_func::Functype fun)
+  {
+    switch (fun) {
+    case (Item_func::EQ_FUNC): { return NDB_EQ_FUNC; }
+    case (Item_func::NE_FUNC): { return NDB_NE_FUNC; }
+    case (Item_func::LT_FUNC): { return NDB_LT_FUNC; }
+    case (Item_func::LE_FUNC): { return NDB_LE_FUNC; }
+    case (Item_func::GT_FUNC): { return NDB_GT_FUNC; }
+    case (Item_func::GE_FUNC): { return NDB_GE_FUNC; }
+    case (Item_func::ISNULL_FUNC): { return NDB_ISNULL_FUNC; }
+    case (Item_func::ISNOTNULL_FUNC): { return NDB_ISNOTNULL_FUNC; }
+    case (Item_func::LIKE_FUNC): { return NDB_LIKE_FUNC; }
+    case (Item_func::NOT_FUNC): { return NDB_NOT_FUNC; }
+    case (Item_func::UNKNOWN_FUNC): { return NDB_UNKNOWN_FUNC; }
+    case (Item_func::COND_AND_FUNC): { return NDB_COND_AND_FUNC; }
+    case (Item_func::COND_OR_FUNC): { return NDB_COND_OR_FUNC; }
+    default: { return NDB_UNSUPPORTED_FUNC; }
+    }
+  };
+
+  static NDB_FUNC_TYPE negate(NDB_FUNC_TYPE fun)
   {
-    uint i;
-    for (i=0; 
-         fun != neg_map[i].pos_fun &&
-           neg_map[i].pos_fun != Item_func::UNKNOWN_FUNC;
-         i++);
+    uint i= (uint) fun;
+    DBUG_ASSERT(fun == neg_map[i].pos_fun);
     return  neg_map[i].neg_fun;
   };
 
Thread
bk commit into 5.0 tree (mskold:1.1918)Martin Skold1 Aug