diff options
author | bell@sanja.is.com.ua <> | 2002-11-28 01:00:09 +0200 |
---|---|---|
committer | bell@sanja.is.com.ua <> | 2002-11-28 01:00:09 +0200 |
commit | ac80cc73eacc810154f71fcf11be29848d4640ba (patch) | |
tree | a80b66d9ce687c3e951c2d43bebee883e77fb776 | |
parent | d7bd717ec8103b4af98e1bf2b80aeaed36129c04 (diff) | |
download | mariadb-git-ac80cc73eacc810154f71fcf11be29848d4640ba.tar.gz |
changed compare engine in basic row items (SCRUM)
fixed layout
-rw-r--r-- | .bzrignore | 1 | ||||
-rw-r--r-- | sql/item_cmpfunc.cc | 111 | ||||
-rw-r--r-- | sql/item_cmpfunc.h | 63 | ||||
-rw-r--r-- | sql/item_func.h | 80 | ||||
-rw-r--r-- | sql/sql_select.cc | 4 |
5 files changed, 124 insertions, 135 deletions
diff --git a/.bzrignore b/.bzrignore index 88995ac7c65..f0fcf652045 100644 --- a/.bzrignore +++ b/.bzrignore @@ -567,3 +567,4 @@ bkpull.log.5 bkpull.log.6 bkpush.log sql/sql_yacc.output +libmysqld/item_row.cc diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index b1cbe405e73..9f3457d8b8d 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -107,7 +107,7 @@ void Item_bool_func2::fix_length_and_dec() { if (convert_constant_item(field,&args[1])) { - cmp_func= new Compare_func_int(this); // Works for all types. + arg_store.set_compare_func(this, INT_RESULT); // Works for all types. return; } } @@ -119,52 +119,63 @@ void Item_bool_func2::fix_length_and_dec() { if (convert_constant_item(field,&args[0])) { - cmp_func= new Compare_func_int(this); // Works for all types. + arg_store.set_compare_func(this, INT_RESULT); // Works for all types. return; } } } - set_cmp_func(args[0], args[1]); + set_cmp_func(); } -Compare_func* Compare_func::get_compare_func(Item_bool_func2 *owner, - Item *a, Item* b) +int Arg_comparator::set_compare_func(Item_bool_func2 *item, Item_result type) { - switch (item_cmp_type(a->result_type(), b->result_type())) + owner= item; + switch (type) { case STRING_RESULT: - return new Compare_func_string(owner); + func= &Arg_comparator::compare_string; + break; case REAL_RESULT: - return new Compare_func_real(owner); + func= &Arg_comparator::compare_real; + break; case INT_RESULT: - return new Compare_func_int(owner); + func= &Arg_comparator::compare_int; + break; case ROW_RESULT: - return new Compare_func_row(owner, a, b); - } - return 0; -} - -Compare_func_row::Compare_func_row(Item_bool_func2 *owner, Item *a, Item* b): - Compare_func(owner) -{ - uint n= a->cols(); - if (n != b->cols()) { - my_error(ER_CARDINALITY_COL, MYF(0), n); - cmp_func= 0; - return; + func= &Arg_comparator::compare_row; + uint n= args[0]->cols(); + if (n != args[1]->cols()) + { + my_error(ER_CARDINALITY_COL, MYF(0), n); + comparators= 0; + return 1; + } + if ((comparators= (Arg_comparator *) sql_alloc(sizeof(Arg_comparator)*n))) + for (uint i=0; i < n; i++) + { + comparators[i].set_arg(0, args[0]->el(i)); + comparators[i].set_arg(1, args[1]->el(i)); + comparators[i].set_compare_func(owner); + } + else + { + my_message(ER_OUT_OF_RESOURCES, ER(ER_OUT_OF_RESOURCES), MYF(0)); + current_thd->fatal_error= 1; + return 1; + } + break; } - cmp_func= (Compare_func **) sql_alloc(sizeof(Compare_func*)*n); - for (uint i=0; i < n; i++) - cmp_func[i]= Compare_func::get_compare_func(owner, a->el(i), b->el(i)); + } + return 0; } -int Compare_func_string::compare(Item *a, Item *b) +int Arg_comparator::compare_string() { String *res1,*res2; - if ((res1= a->val_str(&owner->tmp_value1))) + if ((res1= args[0]->val_str(&owner->tmp_value1))) { - if ((res2= b->val_str(&owner->tmp_value2))) + if ((res2= args[1]->val_str(&owner->tmp_value2))) { owner->null_value= 0; return owner->binary() ? stringcmp(res1,res2) : sortcmp(res1,res2); @@ -174,13 +185,13 @@ int Compare_func_string::compare(Item *a, Item *b) return -1; } -int Compare_func_real::compare(Item *a, Item *b) +int Arg_comparator::compare_real() { - double val1= a->val(); - if (!a->null_value) + double val1= args[0]->val(); + if (!args[0]->null_value) { - double val2= b->val(); - if (!b->null_value) + double val2= args[1]->val(); + if (!args[1]->null_value) { owner->null_value= 0; if (val1 < val2) return -1; @@ -193,13 +204,13 @@ int Compare_func_real::compare(Item *a, Item *b) } -int Compare_func_int::compare(Item *a, Item *b) +int Arg_comparator::compare_int() { - longlong val1= a->val_int(); - if (!a->null_value) + longlong val1= args[0]->val_int(); + if (!args[0]->null_value) { - longlong val2= b->val_int(); - if (!b->null_value) + longlong val2= args[1]->val_int(); + if (!args[1]->null_value) { owner->null_value= 0; if (val1 < val2) return -1; @@ -211,13 +222,13 @@ int Compare_func_int::compare(Item *a, Item *b) return -1; } -int Compare_func_row::compare(Item *a, Item *b) +int Arg_comparator::compare_row() { int res= 0; - uint n= a->cols(); + uint n= args[0]->cols(); for (uint i= 0; i<n; i++) { - if ((res= cmp_func[i]->compare(a->el(i), b->el(i)))) + if ((res= comparators[i].compare())) return res; if (owner->null_value) return -1; @@ -227,7 +238,7 @@ int Compare_func_row::compare(Item *a, Item *b) longlong Item_func_eq::val_int() { - int value= cmp_func->compare(args[0], args[1]); + int value= arg_store.compare(); return value == 0 ? 1 : 0; } @@ -281,34 +292,34 @@ longlong Item_func_equal::val_int() longlong Item_func_ne::val_int() { - int value= cmp_func->compare(args[0], args[1]); + int value= arg_store.compare(); return value != 0 && !null_value ? 1 : 0; } longlong Item_func_ge::val_int() { - int value= cmp_func->compare(args[0], args[1]); + int value= arg_store.compare(); return value >= 0 ? 1 : 0; } longlong Item_func_gt::val_int() { - int value= cmp_func->compare(args[0], args[1]); + int value= arg_store.compare(); return value > 0 ? 1 : 0; } longlong Item_func_le::val_int() { - int value= cmp_func->compare(args[0], args[1]); + int value= arg_store.compare(); return value <= 0 && !null_value ? 1 : 0; } longlong Item_func_lt::val_int() { - int value= cmp_func->compare(args[0], args[1]); + int value= arg_store.compare(); return value < 0 && !null_value ? 1 : 0; } @@ -657,7 +668,7 @@ double Item_func_nullif::val() { double value; - if (!cmp_func->compare(args[0], args[1]) || null_value) + if (!arg_store.compare() || null_value) { null_value=1; return 0.0; @@ -671,7 +682,7 @@ longlong Item_func_nullif::val_int() { longlong value; - if (!cmp_func->compare(args[0], args[1]) || null_value) + if (!arg_store.compare() || null_value) { null_value=1; return 0; @@ -685,7 +696,7 @@ String * Item_func_nullif::val_str(String *str) { String *res; - if (!cmp_func->compare(args[0], args[1]) || null_value) + if (!arg_store.compare() || null_value) { null_value=1; return 0; diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h index 8f7bfa0fda4..b9511e82e32 100644 --- a/sql/item_cmpfunc.h +++ b/sql/item_cmpfunc.h @@ -30,61 +30,6 @@ public: void fix_length_and_dec() { decimals=0; max_length=1; } }; -class Item_bool_func2; - -class Compare_func -{ -protected: - Item_bool_func2 *owner; -public: - static void *operator new(size_t size) - { - return (void*) sql_alloc((uint) size); - } - static void operator delete(void *ptr,size_t size) {} - - Compare_func(Item_bool_func2 *o) { owner= o; } - virtual ~Compare_func() {}; - virtual int compare(Item *, Item*)= 0; - - static Compare_func* get_compare_func(Item_bool_func2 *owner, - Item* a, Item* b); -}; - -class Compare_func_string: public Compare_func -{ -public: - Compare_func_string(Item_bool_func2 *owner): Compare_func(owner) {}; - int compare(Item *, Item*); -}; - -class Compare_func_real: public Compare_func -{ -public: - Compare_func_real(Item_bool_func2 *owner): Compare_func(owner) {}; - int compare(Item *, Item*); -}; - -class Compare_func_int: public Compare_func -{ -public: - Compare_func_int(Item_bool_func2 *owner): Compare_func(owner) {}; - int compare(Item *, Item*); -}; - -class Compare_func_row: public Compare_func -{ - Compare_func **cmp_func; -public: - Compare_func_row(Item_bool_func2 *owner, Item* a, Item* b); - ~Compare_func_row() - { - if(cmp_func) - sql_element_free(cmp_func); - } - int compare(Item *, Item*); -}; - class Item_bool_func2 :public Item_int_func { /* Bool with 2 string args */ protected: @@ -92,10 +37,9 @@ protected: public: Item_bool_func2(Item *a,Item *b) :Item_int_func(a,b) {} void fix_length_and_dec(); - Compare_func *cmp_func; - void set_cmp_func(Item *a, Item *b) + void set_cmp_func() { - cmp_func= Compare_func::get_compare_func(this, args[0], args[1]); + arg_store.set_compare_func(this); } optimize_type select_optimize() const { return OPTIMIZE_OP; } virtual enum Functype rev_functype() const { return UNKNOWN_FUNC; } @@ -103,13 +47,14 @@ public: void print(String *str) { Item_func::print_op(str); } bool is_null() { return test(args[0]->is_null() || args[1]->is_null()); } - friend class Compare_func_string; static Item_bool_func2* eq_creator(Item *a, Item *b); static Item_bool_func2* ne_creator(Item *a, Item *b); static Item_bool_func2* gt_creator(Item *a, Item *b); static Item_bool_func2* lt_creator(Item *a, Item *b); static Item_bool_func2* ge_creator(Item *a, Item *b); static Item_bool_func2* le_creator(Item *a, Item *b); + + friend class Arg_comparator; }; class Item_bool_rowready_func2 :public Item_bool_func2 diff --git a/sql/item_func.h b/sql/item_func.h index 43fb28e77e8..61bac374152 100644 --- a/sql/item_func.h +++ b/sql/item_func.h @@ -28,10 +28,42 @@ extern "C" /* Bug in BSDI include file */ } #endif +extern Item_result item_cmp_type(Item_result a,Item_result b); +class Item_bool_func2; +class Arg_comparator; + +typedef int (Arg_comparator::*arg_cmp_func)(); + +class Arg_comparator: public Sql_alloc +{ + Item *args[2]; + arg_cmp_func func; + Item_bool_func2 *owner; + Arg_comparator *comparators; // used only for compare_row() + +public: + inline void set_arg(int i, Item *item) { args[i]= item; } + int set_compare_func(Item_bool_func2 *owner, Item_result type); + inline int set_compare_func(Item_bool_func2 *owner) + { + return set_compare_func(owner, item_cmp_type(args[0]->result_type(), + args[1]->result_type())); + } + inline int compare() { return (this->*func)(); } + + int compare_string(); // compare args[0] & args[1] + int compare_real(); // compare args[0] & args[1] + int compare_int(); // compare args[0] & args[1] + int compare_row(); // compare args[0] & args[1] + + friend class Item_func; +}; + class Item_func :public Item_result_field { protected: - Item **args,*tmp_arg[2]; + Item **args; + Arg_comparator arg_store; uint allowed_arg_cols; public: uint arg_count; @@ -53,54 +85,54 @@ public: Item_func(void): allowed_arg_cols(1), arg_count(0) { - with_sum_func=0; + with_sum_func= 0; } Item_func(Item *a): allowed_arg_cols(1), arg_count(1) { - args=tmp_arg; - args[0]=a; - with_sum_func=a->with_sum_func; + args= arg_store.args; + args[0]= a; + with_sum_func= a->with_sum_func; } Item_func(Item *a,Item *b): allowed_arg_cols(1), arg_count(2) { - args=tmp_arg; - args[0]=a; args[1]=b; - with_sum_func=a->with_sum_func || b->with_sum_func; + args= arg_store.args; + args[0]= a; args[1]= b; + with_sum_func= a->with_sum_func || b->with_sum_func; } Item_func(Item *a,Item *b,Item *c): allowed_arg_cols(1) { - arg_count=0; - if ((args=(Item**) sql_alloc(sizeof(Item*)*3))) + arg_count= 0; + if ((args= (Item**) sql_alloc(sizeof(Item*)*3))) { - arg_count=3; - args[0]=a; args[1]=b; args[2]=c; - with_sum_func=a->with_sum_func || b->with_sum_func || c->with_sum_func; + arg_count= 3; + args[0]= a; args[1]= b; args[2]= c; + with_sum_func= a->with_sum_func || b->with_sum_func || c->with_sum_func; } } Item_func(Item *a,Item *b,Item *c,Item *d): allowed_arg_cols(1) { - arg_count=0; - if ((args=(Item**) sql_alloc(sizeof(Item*)*4))) + arg_count= 0; + if ((args= (Item**) sql_alloc(sizeof(Item*)*4))) { - arg_count=4; - args[0]=a; args[1]=b; args[2]=c; args[3]=d; - with_sum_func=a->with_sum_func || b->with_sum_func || c->with_sum_func || - d->with_sum_func; + arg_count= 4; + args[0]= a; args[1]= b; args[2]= c; args[3]= d; + with_sum_func= a->with_sum_func || b->with_sum_func || + c->with_sum_func || d->with_sum_func; } } Item_func(Item *a,Item *b,Item *c,Item *d,Item* e): allowed_arg_cols(1) { - arg_count=5; - if ((args=(Item**) sql_alloc(sizeof(Item*)*5))) + arg_count= 5; + if ((args= (Item**) sql_alloc(sizeof(Item*)*5))) { - args[0]=a; args[1]=b; args[2]=c; args[3]=d; args[4]=e; - with_sum_func=a->with_sum_func || b->with_sum_func || c->with_sum_func || - d->with_sum_func || e->with_sum_func ; + args[0]= a; args[1]= b; args[2]= c; args[3]= d; args[4]= e; + with_sum_func= a->with_sum_func || b->with_sum_func || + c->with_sum_func || d->with_sum_func || e->with_sum_func ; } } Item_func(List<Item> &list); diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 3c063428509..f560cb7907f 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -3340,7 +3340,7 @@ change_cond_ref_to_const(I_List<COND_CMP> *save_list,Item *and_father, if ((tmp2=new COND_CMP(and_father,func))) save_list->push_back(tmp2); } - func->set_cmp_func(func->arguments()[0],func->arguments()[1]); + func->set_cmp_func(); } } else if (left_item->eq(field,0) && right_item != value) @@ -3360,7 +3360,7 @@ change_cond_ref_to_const(I_List<COND_CMP> *save_list,Item *and_father, if ((tmp2=new COND_CMP(and_father,func))) save_list->push_back(tmp2); } - func->set_cmp_func(func->arguments()[0], func->arguments()[1]); + func->set_cmp_func(); } } } |