summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <serg@serg.mylan>2003-11-17 21:51:57 +0100
committerunknown <serg@serg.mylan>2003-11-17 21:51:57 +0100
commitcf192616699b0d562f600552397c9e5bc4ee74e8 (patch)
tree3fecf42c55fc4d9c5c40ac68e2ec3e490b1099fd
parent7c3fd7468468637a176b53374574cac138924dcc (diff)
parent8fed6653de2c298704f9ee74f96f17184af46b45 (diff)
downloadmariadb-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.result17
-rw-r--r--mysql-test/r/subselect.result29
-rw-r--r--mysql-test/t/func_time.test13
-rw-r--r--mysql-test/t/subselect.test20
-rw-r--r--sql/item_create.cc5
-rw-r--r--sql/item_create.h1
-rw-r--r--sql/item_timefunc.cc16
-rw-r--r--sql/item_timefunc.h18
-rw-r--r--sql/lex.h3
-rw-r--r--sql/sql_select.cc5
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(&ltime,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, &ltime, 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)