diff options
author | unknown <serg@serg.mylan> | 2003-11-17 21:51:57 +0100 |
---|---|---|
committer | unknown <serg@serg.mylan> | 2003-11-17 21:51:57 +0100 |
commit | cf192616699b0d562f600552397c9e5bc4ee74e8 (patch) | |
tree | 3fecf42c55fc4d9c5c40ac68e2ec3e490b1099fd | |
parent | 7c3fd7468468637a176b53374574cac138924dcc (diff) | |
parent | 8fed6653de2c298704f9ee74f96f17184af46b45 (diff) | |
download | mariadb-git-cf192616699b0d562f600552397c9e5bc4ee74e8.tar.gz |
Merge bk-internal:/home/bk/mysql-4.1/
into serg.mylan:/usr/home/serg/Abk/mysql-4.1
-rw-r--r-- | mysql-test/r/func_time.result | 17 | ||||
-rw-r--r-- | mysql-test/r/subselect.result | 29 | ||||
-rw-r--r-- | mysql-test/t/func_time.test | 13 | ||||
-rw-r--r-- | mysql-test/t/subselect.test | 20 | ||||
-rw-r--r-- | sql/item_create.cc | 5 | ||||
-rw-r--r-- | sql/item_create.h | 1 | ||||
-rw-r--r-- | sql/item_timefunc.cc | 16 | ||||
-rw-r--r-- | sql/item_timefunc.h | 18 | ||||
-rw-r--r-- | sql/lex.h | 3 | ||||
-rw-r--r-- | sql/sql_select.cc | 5 |
10 files changed, 123 insertions, 4 deletions
diff --git a/mysql-test/r/func_time.result b/mysql-test/r/func_time.result index 9d38083f48a..feaebc9b514 100644 --- a/mysql-test/r/func_time.result +++ b/mysql-test/r/func_time.result @@ -468,6 +468,23 @@ select date_add(time,INTERVAL 1 SECOND) from t1; date_add(time,INTERVAL 1 SECOND) 2006-07-08 00:00:01 drop table t1; +select last_day('2000-02-05') as f1, last_day('2002-12-31') as f2, +last_day('2003-03-32') as f3, last_day('2003-04-01') as f4, +last_day('2001-01-01 01:01:01') as f5, last_day(NULL), +last_day('2001-02-12'); +f1 f2 f3 f4 f5 last_day(NULL) last_day('2001-02-12') +2000-02-29 2002-12-31 NULL 2003-04-30 2001-01-31 NULL 2001-02-28 +create table t1 select last_day('2000-02-05') as a; +describe t1; +Field Type Null Key Default Extra +a date 0000-00-00 +select * from t1; +a +2000-02-29 +drop table t1; +select last_day('2000-02-05'); +last_day('2000-02-05') +2000-02-29 select strcmp(date_sub(localtimestamp(), interval 3 hour), utc_timestamp())=0; strcmp(date_sub(localtimestamp(), interval 3 hour), utc_timestamp())=0 1 diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index 31b5ff84365..518cc699c38 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -1569,3 +1569,32 @@ INSERT INTO t2 VALUES (100, 200, 'C'); SELECT DISTINCT COLC FROM t1 WHERE COLA = (SELECT COLA FROM t2 WHERE COLB = 200 AND COLC ='C' LIMIT 1); COLC DROP TABLE t1, t2; +create table t11 (a int NOT NULL, b int, primary key (a)); +create table t12 (a int NOT NULL, b int, primary key (a)); +create table t2 (a int NOT NULL, b int, primary key (a)); +insert into t11 values (0, 10),(1, 11),(2, 12); +insert into t12 values (33, 10),(22, 11),(2, 12); +insert into t2 values (1, 21),(2, 12),(3, 23); +select * from t11; +a b +0 10 +1 11 +2 12 +select * from t12; +a b +33 10 +22 11 +2 12 +select * from t2; +a b +1 21 +2 12 +3 23 +delete t11.*, t12.* from t11,t12 where t11.a = t12.a and t11.b > (select b from t2); +ERROR 21000: Subquery returns more than 1 row +select * from t2; +a b +1 21 +2 12 +3 23 +drop table t11, t12, t2; diff --git a/mysql-test/t/func_time.test b/mysql-test/t/func_time.test index 96bdb547469..f1a24a4c3cb 100644 --- a/mysql-test/t/func_time.test +++ b/mysql-test/t/func_time.test @@ -224,6 +224,19 @@ select date_add(date,INTERVAL "1 1:1:1" DAY_SECOND) from t1; select date_add(time,INTERVAL 1 SECOND) from t1; drop table t1; +# test for last_day +select last_day('2000-02-05') as f1, last_day('2002-12-31') as f2, + last_day('2003-03-32') as f3, last_day('2003-04-01') as f4, + last_day('2001-01-01 01:01:01') as f5, last_day(NULL), + last_day('2001-02-12'); + +create table t1 select last_day('2000-02-05') as a; +describe t1; +select * from t1; +drop table t1; +select last_day('2000-02-05'); + + # Test SAPDB UTC_% functions. This part is TZ dependant (It is supposed that # TZ variable set to GMT-3 select strcmp(date_sub(localtimestamp(), interval 3 hour), utc_timestamp())=0; diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index f356e7931c8..90d5ad24d17 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -1008,4 +1008,22 @@ CREATE TABLE t2(COLA FLOAT NOT NULL,COLB FLOAT NOT NULL,COLC CHAR(1) NOT NULL,PR INSERT INTO t1 VALUES (1,1,'1A3240'), (1,2,'4W2365'); INSERT INTO t2 VALUES (100, 200, 'C'); SELECT DISTINCT COLC FROM t1 WHERE COLA = (SELECT COLA FROM t2 WHERE COLB = 200 AND COLC ='C' LIMIT 1); -DROP TABLE t1, t2;s +DROP TABLE t1, t2; + +# +# errors handling +# + +create table t11 (a int NOT NULL, b int, primary key (a)); +create table t12 (a int NOT NULL, b int, primary key (a)); +create table t2 (a int NOT NULL, b int, primary key (a)); +insert into t11 values (0, 10),(1, 11),(2, 12); +insert into t12 values (33, 10),(22, 11),(2, 12); +insert into t2 values (1, 21),(2, 12),(3, 23); +select * from t11; +select * from t12; +select * from t2; +-- error 1241 +delete t11.*, t12.* from t11,t12 where t11.a = t12.a and t11.b > (select b from t2); +select * from t2; +drop table t11, t12, t2; diff --git a/sql/item_create.cc b/sql/item_create.cc index 5c44d8b00ff..0195f0c24bc 100644 --- a/sql/item_create.cc +++ b/sql/item_create.cc @@ -707,3 +707,8 @@ Item *create_func_str_to_date(Item* a,Item* b) { return new Item_func_str_to_date(a, b); } + +Item *create_func_last_day(Item *a) +{ + return new Item_func_last_day(a); +} diff --git a/sql/item_create.h b/sql/item_create.h index 5d6cbe1d58f..083868d87a6 100644 --- a/sql/item_create.h +++ b/sql/item_create.h @@ -150,3 +150,4 @@ Item *create_func_subtime(Item* a,Item* b); Item *create_func_timediff(Item* a,Item* b); Item *create_func_maketime(Item* a,Item* b,Item* c); Item *create_func_str_to_date(Item* a,Item* b); +Item *create_func_last_day(Item *a); diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc index cf71f2b3bef..bcb7ddb1054 100644 --- a/sql/item_timefunc.cc +++ b/sql/item_timefunc.cc @@ -2310,3 +2310,19 @@ String *Item_func_str_to_date::val_str(String *str) return str; return 0; } + + +String *Item_func_last_day::val_str(String *str) +{ + TIME ltime; + if (!get_arg0_date(<ime,0)) + { + uint month_idx= ltime.month-1; + ltime.day= days_in_month[month_idx]; + if ( month_idx == 1 && calc_days_in_year(ltime.year) == 366) + ltime.day+= 1; + if (!make_datetime(DATE_ONLY, <ime, str)) + return str; + } + return 0; +} diff --git a/sql/item_timefunc.h b/sql/item_timefunc.h index ef7fa1abfa0..a81b9f28d92 100644 --- a/sql/item_timefunc.h +++ b/sql/item_timefunc.h @@ -809,3 +809,21 @@ public: max_length=MAX_DATETIME_FULL_WIDTH*MY_CHARSET_BIN_MB_MAXLEN; } }; + +class Item_func_last_day :public Item_str_func +{ +public: + Item_func_last_day(Item *a) :Item_str_func(a) {} + String *val_str(String *str); + const char *func_name() const { return "last_day"; } + enum_field_types field_type() const { return MYSQL_TYPE_DATE; } + void fix_length_and_dec() + { + decimals=0; + max_length=MAX_DATE_WIDTH*MY_CHARSET_BIN_MB_MAXLEN; + } + Field *tmp_table_field(TABLE *t_arg) + { + return (new Field_date(maybe_null, name, t_arg, &my_charset_bin)); + } +}; diff --git a/sql/lex.h b/sql/lex.h index 7f3328fa7cb..fd13af348d1 100644 --- a/sql/lex.h +++ b/sql/lex.h @@ -551,7 +551,8 @@ static SYMBOL sql_functions[] = { { "IS_FREE_LOCK", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_is_free_lock)}, { "IS_USED_LOCK", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_is_used_lock)}, { "LAST_INSERT_ID", SYM(LAST_INSERT_ID),0,0}, - { "ISSIMPLE", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_issimple)}, + { "ISSIMPLE", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_issimple)}, + { "LAST_DAY", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_last_day)}, { "LCASE", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_lcase)}, { "LEAST", SYM(LEAST_SYM),0,0}, { "LENGTH", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_length)}, diff --git a/sql/sql_select.cc b/sql/sql_select.cc index c7f9de2ef6d..9d19ab1e470 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -5590,6 +5590,7 @@ sub_select(JOIN *join,JOIN_TAB *join_tab,bool end_of_records) int error; bool found=0; COND *on_expr=join_tab->on_expr, *select_cond=join_tab->select_cond; + my_bool *report_error= &(join->thd->net.report_error); if (!(error=(*join_tab->read_first_record)(join_tab))) { @@ -5628,9 +5629,9 @@ sub_select(JOIN *join,JOIN_TAB *join_tab,bool end_of_records) else info->file->unlock_row(); } - } while (!(error=info->read_record(info))); + } while (!(error=info->read_record(info)) && !(*report_error)); } - if (error > 0) // Fatal error + if (error > 0 || (*report_error)) // Fatal error return -1; if (!found && on_expr) |