summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <hf@deer.mysql.r18.ru>2003-01-21 20:24:22 +0400
committerunknown <hf@deer.mysql.r18.ru>2003-01-21 20:24:22 +0400
commit96b86dcc9a1e87f01f73186308e8c35f6f900452 (patch)
treed7f4d2af987de7eecb9c287d185d14b4581f38fe /sql
parentaec72f3315b1b0ddf1c9ca86555bbf26004a3a2e (diff)
parentdceabff13192f614efd5b688d81e73e4aeeb96b2 (diff)
downloadmariadb-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.h5
-rw-r--r--sql/item.cc46
-rw-r--r--sql/item.h58
-rw-r--r--sql/sql_yacc.yy16
-rw-r--r--sql/table.cc2
-rw-r--r--sql/table.h1
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]; }
};