Commit 1dc52f07 authored by unknown's avatar unknown
Browse files

after review patch


mysql-test/r/negation_elimination.result:
  new tests of negation elimination
mysql-test/t/negation_elimination.test:
  new tests of negation elimination
sql/item.h:
  test of boolean functions added
sql/item_cmpfunc.cc:
  NOT subtree is already checked, so wee need to return just argument
sql/item_cmpfunc.h:
  test of boolean functions added
sql/mysql_priv.h:
  'place' to detect WHERE clause
sql/sql_parse.cc:
  function for creation negated expression
sql/sql_select.cc:
  removed unused function
sql/sql_select.h:
  removed unused function
sql/sql_yacc.yy:
  'place' to detect WHERE clause
parent f45c482a
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -375,4 +375,17 @@ a
13
14
15
delete from t1 where a > 3;
select a, not(not(a)) from t1;
a	not(not(a))
NULL	NULL
0	0
1	1
2	1
3	1
explain extended select a, not(not(a)), not(a <= 2 and not(a)), not(a not like "1"), not (a not in (1,2)), not(a != 2) from t1 where not(not(a)) having not(not(a));
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	SIMPLE	t1	index	NULL	a	5	NULL	5	Using where; Using index
Warnings:
Note	1003	select test.t1.a AS `a`,(test.t1.a <> 0) AS `not(not(a))`,((test.t1.a > 2) or test.t1.a) AS `not(a <= 2 and not(a))`,(test.t1.a like _latin1'1') AS `not(a not like "1")`,(test.t1.a in (1,2)) AS `not (a not in (1,2))`,(test.t1.a = 2) AS `not(a != 2)` from test.t1 where test.t1.a having test.t1.a
drop table t1;
+4 −0
Original line number Diff line number Diff line
@@ -65,4 +65,8 @@ select * from t1 where not((a < 5 and a < 10) and (not(a > 16) or a > 17));
explain select * from t1 where ((a between 5 and 15) and (not(a like 10)));
select * from t1 where ((a between 5 and 15) and (not(a like 10)));

delete from t1 where a > 3;
select a, not(not(a)) from t1;
explain extended select a, not(not(a)), not(a <= 2 and not(a)), not(a not like "1"), not (a not in (1,2)), not(a != 2) from t1 where not(not(a)) having not(not(a));

drop table t1;
+2 −2
Original line number Diff line number Diff line
@@ -239,6 +239,7 @@ class Item {
  virtual void top_level_item() {}
  virtual void set_result_field(Field *field) {}
  virtual bool is_result_field() { return 0; }
  virtual bool is_bool_func() { return 0; }
  virtual void save_in_result_field(bool no_conversions) {}
  virtual void no_rows_in_result() {}
  virtual Item *copy_or_same(THD *thd) { return this; }
@@ -269,7 +270,6 @@ class Item {

  Field *tmp_table_field_from_field_type(TABLE *table);

  /* Used in sql_select.cc:eliminate_not_funcs() */
  virtual Item *neg_transformer(THD *thd) { return NULL; }
  void delete_self()
  {
+1 −4
Original line number Diff line number Diff line
@@ -2707,9 +2707,6 @@ longlong Item_cond_xor::val_int()
       IS NULL(a)         -> IS NOT NULL(a)
       IS NOT NULL(a)     -> IS NULL(a)

  NOTE
    This method is used in the eliminate_not_funcs() function.

  RETURN
    New item or
    NULL if we cannot apply NOT transformation (see Item::neg_transformer()).
@@ -2718,7 +2715,7 @@ longlong Item_cond_xor::val_int()
Item *Item_func_not::neg_transformer(THD *thd)	/* NOT(x)  ->  x */
{
  // We should apply negation elimination to the argument of the NOT function
  return eliminate_not_funcs(thd, args[0]);
  return args[0];
}


+3 −0
Original line number Diff line number Diff line
@@ -89,6 +89,7 @@ class Item_bool_func :public Item_int_func
  Item_bool_func(Item *a) :Item_int_func(a) {}
  Item_bool_func(Item *a,Item *b) :Item_int_func(a,b) {}
  Item_bool_func(THD *thd, Item_bool_func *item) :Item_int_func(thd, item) {}
  bool is_bool_func() { return 1; }
  void fix_length_and_dec() { decimals=0; max_length=1; }
};

@@ -201,6 +202,7 @@ class Item_bool_func2 :public Item_int_func
  bool have_rev_func() const { return rev_functype() != UNKNOWN_FUNC; }
  void print(String *str) { Item_func::print_op(str); }
  bool is_null() { return test(args[0]->is_null() || args[1]->is_null()); }
  bool is_bool_func() { return 1; }
  CHARSET_INFO *compare_collation() { return cmp.cmp_collation.collation; }

  friend class  Arg_comparator;
@@ -748,6 +750,7 @@ class Item_func_in :public Item_int_func
  enum Functype functype() const { return IN_FUNC; }
  const char *func_name() const { return " IN "; }
  bool nulls_in_row();
  bool is_bool_func() { return 1; }
  CHARSET_INFO *compare_collation() { return cmp_collation.collation; }
};

Loading