diff --git a/sql/field.h b/sql/field.h index 4cebb237f8b..f5c3dcbca68 100644 --- a/sql/field.h +++ b/sql/field.h @@ -78,7 +78,7 @@ public: virtual void reset_fields() {} virtual void set_default() { - my_ptrdiff_t offset = table->default_values - table->record[0]; + my_ptrdiff_t offset = table->default_values() - table->record[0]; memcpy(ptr, ptr + offset, pack_length()); if (null_ptr) *null_ptr= ((*null_ptr & (uchar) ~null_bit) | diff --git a/sql/item.cc b/sql/item.cc index d2d1856d592..ae5fd287a24 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -1121,15 +1121,20 @@ bool Item_ref::check_loop(uint id) bool Item_default_value::eq(const Item *item, bool binary_cmp) const { - return item->type() == DEFAULT_VALUE_ITEM && + return item->type() == DEFAULT_ITEM && ((Item_default_value *)item)->arg->eq(arg, binary_cmp); } bool Item_default_value::fix_fields(THD *thd, struct st_table_list *table_list, Item **items) { + if (!arg) + return false; bool res= arg->fix_fields(thd, table_list, items); if (res) return res; + /* arg->type() can be only REF_ITEM or FIELD_ITEM for it defined as + simple_ident in sql_yacc.yy + */ if (arg->type() == REF_ITEM) { Item_ref *ref= (Item_ref *)arg; @@ -1144,7 +1149,7 @@ bool Item_default_value::fix_fields(THD *thd, struct st_table_list *table_list, if (!def_field) return 1; memcpy(def_field, field_arg->field, field_arg->field->size_of()); - def_field->move_field(def_field->table->default_values - + def_field->move_field(def_field->table->default_values() - def_field->table->record[0]); set_field(def_field); return 0; @@ -1152,7 +1157,11 @@ bool Item_default_value::fix_fields(THD *thd, struct st_table_list *table_list, void Item_default_value::print(String *str) { - str->append("default("); + if (!arg) + { + str->append("DEFAULT"); + } + str->append("DEFAULT("); arg->print(str); str->append(')'); } diff --git a/sql/item.h b/sql/item.h index a4bbb7560b3..ec28cfe64cf 100644 --- a/sql/item.h +++ b/sql/item.h @@ -36,8 +36,8 @@ public: COPY_STR_ITEM, FIELD_AVG_ITEM, DEFAULT_ITEM, PROC_ITEM,COND_ITEM, REF_ITEM, FIELD_STD_ITEM, FIELD_VARIANCE_ITEM, CONST_ITEM, - SUBSELECT_ITEM, ROW_ITEM, CACHE_ITEM, - DEFAULT_VALUE_ITEM}; + SUBSELECT_ITEM, ROW_ITEM, CACHE_ITEM}; + enum cond_result { COND_UNDEF,COND_OK,COND_TRUE,COND_FALSE }; String str_value; /* used to store value */ @@ -369,26 +369,6 @@ public: void print(String *str); }; - -/* For INSERT ... VALUES (DEFAULT) */ - -class Item_default :public Item -{ -public: - Item_default() { name= (char*) "DEFAULT"; } - enum Type type() const { return DEFAULT_ITEM; } - int save_in_field(Field *field, bool no_conversions) - { - field->set_default(); - return 0; - } - virtual double val() { return 0.0; } - virtual longlong val_int() { return 0; } - virtual String *val_str(String *str) { return 0; } - bool basic_const_item() const { return 1; } -}; - - /* for show tables */ class Item_datetime :public Item_string @@ -669,9 +649,11 @@ class Item_default_value : public Item_field { public: Item *arg; + Item_default_value() : + Item_field((const char *)NULL, (const char *)NULL, (const char *)NULL), arg(NULL) {} Item_default_value(Item *a) : Item_field((const char *)NULL, (const char *)NULL, (const char *)NULL), arg(a) {} - enum Type type() const { return DEFAULT_VALUE_ITEM; } + enum Type type() const { return DEFAULT_ITEM; } bool eq(const Item *item, bool binary_cmp) const; bool fix_fields(THD *, struct st_table_list *, Item **); bool check_loop(uint id) @@ -680,6 +662,22 @@ public: } void set_outer_resolving() { arg->set_outer_resolving(); } void print(String *str); + virtual bool basic_const_item() const { return true; } + int save_in_field(Field *field, bool no_conversions) + { + if (!arg) + { + field->set_default(); + return 0; + } + return Item_field::save_in_field(field, no_conversions); + } + table_map used_tables() const + { + if (!arg) + return (table_map) 0L; + return Item_field::used_tables(); + } }; class Item_cache: public Item diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index d06b9a08ad6..0c403abb4b0 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1831,8 +1831,10 @@ optional_braces: | '(' ')' {}; /* all possible expressions */ -expr: expr_expr { $$= $1; } - | simple_expr { $$= $1; }; +expr: + expr_expr { $$= $1; } + | simple_expr { $$= $1; } + ; comp_op: EQ { $$ = &comp_eq_creator; } | GE { $$ = &comp_ge_creator; } @@ -1848,7 +1850,7 @@ all_or_any: ALL { $$ = 1; } /* expressions that begin with 'expr' */ expr_expr: - expr IN_SYM '(' expr_list ')' + expr IN_SYM '(' expr_list ')' { $$= new Item_func_in($1,*$4); } | expr NOT IN_SYM '(' expr_list ')' { $$= new Item_func_not(new Item_func_in($1,*$5)); } @@ -2055,10 +2057,10 @@ simple_expr: { $$= new Item_func_conv_charset($3,$5); } | CONVERT_SYM '(' expr ',' expr ',' expr ')' { $$= new Item_func_conv_charset3($3,$7,$5); } - | FUNC_ARG0 '(' ')' - { $$= ((Item*(*)(void))($1.symbol->create_func))();} | DEFAULT '(' simple_ident ')' { $$= new Item_default_value($3); } + | FUNC_ARG0 '(' ')' + { $$= ((Item*(*)(void))($1.symbol->create_func))();} | FUNC_ARG1 '(' expr ')' { $$= ((Item*(*)(Item*))($1.symbol->create_func))($3);} | FUNC_ARG2 '(' expr ',' expr ')' @@ -3122,7 +3124,7 @@ values: expr_or_default: expr { $$= $1;} - | DEFAULT {$$= new Item_default(); } + | DEFAULT {$$= new Item_default_value(); } ; opt_insert_update: diff --git a/sql/table.cc b/sql/table.cc index 2fcf19fddae..f6dbaaf3584 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -261,8 +261,6 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, outparam->record[1]=outparam->record[0]; /* purecov: inspected */ } - outparam->default_values= outparam->record[2]; - VOID(my_seek(file,pos,MY_SEEK_SET,MYF(0))); if (my_read(file,(byte*) head,288,MYF(MY_NABP))) goto err_not_open; if (crypted) diff --git a/sql/table.h b/sql/table.h index 75f16797050..dedad37f6c6 100644 --- a/sql/table.h +++ b/sql/table.h @@ -54,7 +54,6 @@ struct st_table { Field_blob **blob_field; /* Pointer to blob fields */ HASH name_hash; /* hash of field names */ byte *record[3]; /* Pointer to records */ - byte *default_values; uint fields; /* field count */ uint reclength; /* Recordlength */ uint rec_buff_length; @@ -137,6 +136,7 @@ struct st_table { uint derived_select_number; THD *in_use; /* Which thread uses this */ struct st_table *next,*prev; + byte *default_values() { return record[2]; } };