diff options
author | unknown <hf@deer.mysql.r18.ru> | 2003-01-21 20:24:22 +0400 |
---|---|---|
committer | unknown <hf@deer.mysql.r18.ru> | 2003-01-21 20:24:22 +0400 |
commit | 96b86dcc9a1e87f01f73186308e8c35f6f900452 (patch) | |
tree | d7f4d2af987de7eecb9c287d185d14b4581f38fe /sql | |
parent | aec72f3315b1b0ddf1c9ca86555bbf26004a3a2e (diff) | |
parent | dceabff13192f614efd5b688d81e73e4aeeb96b2 (diff) | |
download | mariadb-git-96b86dcc9a1e87f01f73186308e8c35f6f900452.tar.gz |
Merge abotchkov@work.mysql.com:/home/bk/mysql-4.1
into deer.mysql.r18.ru:/home/hf/work/mysql-default
sql/field.h:
Auto merged
sql/item.cc:
Auto merged
sql/item.h:
Auto merged
sql/sql_yacc.yy:
Auto merged
sql/table.cc:
Auto merged
sql/table.h:
Auto merged
Diffstat (limited to 'sql')
-rw-r--r-- | sql/field.h | 5 | ||||
-rw-r--r-- | sql/item.cc | 46 | ||||
-rw-r--r-- | sql/item.h | 58 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 16 | ||||
-rw-r--r-- | sql/table.cc | 2 | ||||
-rw-r--r-- | sql/table.h | 1 |
6 files changed, 98 insertions, 30 deletions
diff --git a/sql/field.h b/sql/field.h index 97900938e9d..dc0b1b35d5b 100644 --- a/sql/field.h +++ b/sql/field.h @@ -78,10 +78,11 @@ public: virtual void reset_fields() {} virtual void set_default() { - memcpy(ptr, ptr + table->rec_buff_length, pack_length()); + 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) | - null_ptr[table->rec_buff_length] & null_bit); + null_ptr[offset] & null_bit); } virtual bool binary() const { return 1; } virtual bool zero_pack() const { return 1; } diff --git a/sql/item.cc b/sql/item.cc index 53f63a977e0..881e65310cf 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -1126,6 +1126,52 @@ bool Item_ref::check_loop(uint id) DBUG_RETURN((*ref)->check_loop(id)); } +bool Item_default_value::eq(const Item *item, bool binary_cmp) const +{ + 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; + if (ref->ref[0]->type() != FIELD_ITEM) + { + return 1; + } + arg= ref->ref[0]; + } + Item_field *field_arg= (Item_field *)arg; + Field *def_field= (Field*) sql_alloc(field_arg->field->size_of()); + 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->table->record[0]); + set_field(def_field); + return 0; +} + +void Item_default_value::print(String *str) +{ + if (!arg) + { + str->append("DEFAULT"); + } + str->append("DEFAULT("); + arg->print(str); + str->append(')'); +} /* If item is a const function, calculate it and return a const item diff --git a/sql/item.h b/sql/item.h index 09882b26724..1881b15f6e5 100644 --- a/sql/item.h +++ b/sql/item.h @@ -37,6 +37,7 @@ public: PROC_ITEM,COND_ITEM, REF_ITEM, FIELD_STD_ITEM, FIELD_VARIANCE_ITEM, CONST_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 */ @@ -167,9 +168,9 @@ public: bool get_date(TIME *ltime,bool fuzzydate); bool get_time(TIME *ltime); bool is_null() { return field->is_null(); } + friend class Item_default_value; }; - class Item_null :public Item { public: @@ -370,26 +371,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 @@ -674,6 +655,41 @@ public: bool cmp(void); }; +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_ITEM; } + bool eq(const Item *item, bool binary_cmp) const; + bool fix_fields(THD *, struct st_table_list *, Item **); + bool check_loop(uint id) + { + return Item_field::check_loop(id) || arg->check_loop(id); + } + 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 { public: diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index f6743c868fe..d8f2bb15459 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1863,8 +1863,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; } @@ -1880,7 +1882,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)); } @@ -2087,6 +2089,8 @@ simple_expr: { $$= new Item_func_conv_charset($3,$5); } | CONVERT_SYM '(' expr ',' expr ',' expr ')' { $$= new Item_func_conv_charset3($3,$7,$5); } + | DEFAULT '(' simple_ident ')' + { $$= new Item_default_value($3); } | FUNC_ARG0 '(' ')' { $$= ((Item*(*)(void))($1.symbol->create_func))();} | FUNC_ARG1 '(' expr ')' @@ -3178,7 +3182,7 @@ values: expr_or_default: expr { $$= $1;} - | DEFAULT {$$= new Item_default(); } + | DEFAULT {$$= new Item_default_value(); } ; opt_insert_update: @@ -3216,12 +3220,12 @@ update: ; update_list: - update_list ',' simple_ident equal expr + update_list ',' simple_ident equal expr_or_default { if (add_item_to_list(YYTHD, $3) || add_value_to_list(YYTHD, $5)) YYABORT; } - | simple_ident equal expr + | simple_ident equal expr_or_default { if (add_item_to_list(YYTHD, $1) || add_value_to_list(YYTHD, $3)) YYABORT; diff --git a/sql/table.cc b/sql/table.cc index 72f0143115f..57a0831bf2e 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -260,7 +260,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, if (db_stat & HA_READ_ONLY) outparam->record[1]=outparam->record[0]; /* purecov: inspected */ } - + 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 6291b250787..ceffdcc9dc7 100644 --- a/sql/table.h +++ b/sql/table.h @@ -137,6 +137,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]; } }; |