mirror of
https://github.com/MariaDB/server.git
synced 2026-01-06 05:22:24 +03:00
Merge rurik.mysql.com:/home/igor/dev/mysql-5.0-0
into rurik.mysql.com:/home/igor/dev/mysql-5.1-0
This commit is contained in:
@@ -847,3 +847,28 @@ timestampdiff(year,'2004-02-28','2005-02-28')
|
||||
select timestampdiff(year,'2004-02-29','2005-02-28');
|
||||
timestampdiff(year,'2004-02-29','2005-02-28')
|
||||
0
|
||||
CREATE TABLE t1 (id int NOT NULL PRIMARY KEY, day date);
|
||||
CREATE TABLE t2 (id int NOT NULL PRIMARY KEY, day date);
|
||||
INSERT INTO t1 VALUES
|
||||
(1, '2005-06-01'), (2, '2005-02-01'), (3, '2005-07-01');
|
||||
INSERT INTO t2 VALUES
|
||||
(1, '2005-08-01'), (2, '2005-06-15'), (3, '2005-07-15');
|
||||
SELECT * FROM t1, t2
|
||||
WHERE t1.day BETWEEN
|
||||
'2005.09.01' - INTERVAL 6 MONTH AND t2.day;
|
||||
id day id day
|
||||
1 2005-06-01 1 2005-08-01
|
||||
3 2005-07-01 1 2005-08-01
|
||||
1 2005-06-01 2 2005-06-15
|
||||
1 2005-06-01 3 2005-07-15
|
||||
3 2005-07-01 3 2005-07-15
|
||||
SELECT * FROM t1, t2
|
||||
WHERE CAST(t1.day AS DATE) BETWEEN
|
||||
'2005.09.01' - INTERVAL 6 MONTH AND t2.day;
|
||||
id day id day
|
||||
1 2005-06-01 1 2005-08-01
|
||||
3 2005-07-01 1 2005-08-01
|
||||
1 2005-06-01 2 2005-06-15
|
||||
1 2005-06-01 3 2005-07-15
|
||||
3 2005-07-01 3 2005-07-15
|
||||
DROP TABLE t1,t2;
|
||||
|
||||
@@ -2924,13 +2924,13 @@ create table t3 (s1 varchar(2) binary,primary key (s1)) engine=innodb;
|
||||
create table t4 (s1 char(2) binary,primary key (s1)) engine=innodb;
|
||||
insert into t1 values (0x41),(0x4120),(0x4100);
|
||||
insert into t2 values (0x41),(0x4120),(0x4100);
|
||||
ERROR 23000: Duplicate entry 'A' for key 'PRIMARY'
|
||||
ERROR 23000: Duplicate entry 'A' for key 1
|
||||
insert into t2 values (0x41),(0x4120);
|
||||
insert into t3 values (0x41),(0x4120),(0x4100);
|
||||
ERROR 23000: Duplicate entry 'A ' for key 'PRIMARY'
|
||||
ERROR 23000: Duplicate entry 'A ' for key 1
|
||||
insert into t3 values (0x41),(0x4100);
|
||||
insert into t4 values (0x41),(0x4120),(0x4100);
|
||||
ERROR 23000: Duplicate entry 'A' for key 'PRIMARY'
|
||||
ERROR 23000: Duplicate entry 'A' for key 1
|
||||
insert into t4 values (0x41),(0x4100);
|
||||
select hex(s1) from t1;
|
||||
hex(s1)
|
||||
@@ -3132,7 +3132,7 @@ ALTER TABLE t2 DROP FOREIGN KEY t2_ibfk_0;
|
||||
SHOW CREATE TABLE t2;
|
||||
Table Create Table
|
||||
t2 CREATE TABLE `t2` (
|
||||
`a` int(11) DEFAULT NULL,
|
||||
`a` int(11) default NULL,
|
||||
KEY `t2_ibfk_0` (`a`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||
DROP TABLE t2,t1;
|
||||
@@ -3194,52 +3194,12 @@ drop trigger t2t;
|
||||
drop trigger t3t;
|
||||
drop trigger t4t;
|
||||
drop table t1, t2, t3, t4, t5;
|
||||
CREATE TABLE t1 (
|
||||
field1 varchar(8) NOT NULL DEFAULT '',
|
||||
field2 varchar(8) NOT NULL DEFAULT '',
|
||||
PRIMARY KEY (field1, field2)
|
||||
) ENGINE=InnoDB;
|
||||
CREATE TABLE t2 (
|
||||
field1 varchar(8) NOT NULL DEFAULT '' PRIMARY KEY,
|
||||
FOREIGN KEY (field1) REFERENCES t1 (field1)
|
||||
ON DELETE CASCADE ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES ('old', 'somevalu');
|
||||
INSERT INTO t1 VALUES ('other', 'anyvalue');
|
||||
INSERT INTO t2 VALUES ('old');
|
||||
INSERT INTO t2 VALUES ('other');
|
||||
UPDATE t1 SET field1 = 'other' WHERE field2 = 'somevalu';
|
||||
ERROR 23000: Upholding foreign key constraints for table 't1', entry 'other-somevalu', key 1 would lead to a duplicate entry
|
||||
DROP TABLE t2;
|
||||
DROP TABLE t1;
|
||||
create table t1 (
|
||||
c1 bigint not null,
|
||||
c2 bigint not null,
|
||||
primary key (c1),
|
||||
unique key (c2)
|
||||
) engine=innodb;
|
||||
create table t2 (
|
||||
c1 bigint not null,
|
||||
primary key (c1)
|
||||
) engine=innodb;
|
||||
alter table t1 add constraint c2_fk foreign key (c2)
|
||||
references t2(c1) on delete cascade;
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`c1` bigint(20) NOT NULL,
|
||||
`c2` bigint(20) NOT NULL,
|
||||
PRIMARY KEY (`c1`),
|
||||
UNIQUE KEY `c2` (`c2`),
|
||||
CONSTRAINT `c2_fk` FOREIGN KEY (`c2`) REFERENCES `t2` (`c1`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||
alter table t1 drop foreign key c2_fk;
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`c1` bigint(20) NOT NULL,
|
||||
`c2` bigint(20) NOT NULL,
|
||||
PRIMARY KEY (`c1`),
|
||||
UNIQUE KEY `c2` (`c2`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||
create table t1(a date) engine=innodb;
|
||||
create table t2(a date, key(a)) engine=innodb;
|
||||
insert into t1 values('2005-10-01');
|
||||
insert into t2 values('2005-10-01');
|
||||
select * from t1, t2
|
||||
where t2.a between t1.a - interval 2 day and t1.a + interval 2 day;
|
||||
a a
|
||||
2005-10-01 2005-10-01
|
||||
drop table t1, t2;
|
||||
|
||||
@@ -446,4 +446,26 @@ select timestampdiff(year,'1999-09-11','2001-9-11');
|
||||
select timestampdiff(year,'2004-02-28','2005-02-28');
|
||||
select timestampdiff(year,'2004-02-29','2005-02-28');
|
||||
|
||||
#
|
||||
# Bug #18618: BETWEEN for dates with the second argument being a constant
|
||||
# expression and the first and the third arguments being fields
|
||||
#
|
||||
|
||||
CREATE TABLE t1 (id int NOT NULL PRIMARY KEY, day date);
|
||||
CREATE TABLE t2 (id int NOT NULL PRIMARY KEY, day date);
|
||||
|
||||
INSERT INTO t1 VALUES
|
||||
(1, '2005-06-01'), (2, '2005-02-01'), (3, '2005-07-01');
|
||||
INSERT INTO t2 VALUES
|
||||
(1, '2005-08-01'), (2, '2005-06-15'), (3, '2005-07-15');
|
||||
|
||||
SELECT * FROM t1, t2
|
||||
WHERE t1.day BETWEEN
|
||||
'2005.09.01' - INTERVAL 6 MONTH AND t2.day;
|
||||
SELECT * FROM t1, t2
|
||||
WHERE CAST(t1.day AS DATE) BETWEEN
|
||||
'2005.09.01' - INTERVAL 6 MONTH AND t2.day;
|
||||
|
||||
DROP TABLE t1,t2;
|
||||
|
||||
# End of 5.0 tests
|
||||
|
||||
@@ -2138,3 +2138,13 @@ show create table t1;
|
||||
#
|
||||
drop table t1, t2;
|
||||
|
||||
# Bug #14360: problem with intervals
|
||||
#
|
||||
|
||||
create table t1(a date) engine=innodb;
|
||||
create table t2(a date, key(a)) engine=innodb;
|
||||
insert into t1 values('2005-10-01');
|
||||
insert into t2 values('2005-10-01');
|
||||
select * from t1, t2
|
||||
where t2.a between t1.a - interval 2 day and t1.a + interval 2 day;
|
||||
drop table t1, t2;
|
||||
|
||||
@@ -52,7 +52,6 @@ static void agg_cmp_type(THD *thd, Item_result *type, Item **items, uint nitems)
|
||||
{
|
||||
uint i;
|
||||
Field *field= NULL;
|
||||
bool all_constant= TRUE;
|
||||
|
||||
/* If the first argument is a FIELD_ITEM, pull out the field. */
|
||||
if (items[0]->real_item()->type() == Item::FIELD_ITEM)
|
||||
@@ -65,16 +64,9 @@ static void agg_cmp_type(THD *thd, Item_result *type, Item **items, uint nitems)
|
||||
for (i= 1; i < nitems; i++)
|
||||
{
|
||||
type[0]= item_cmp_type(type[0], items[i]->result_type());
|
||||
if (field && !convert_constant_item(thd, field, &items[i]))
|
||||
all_constant= FALSE;
|
||||
if (field && convert_constant_item(thd, field, &items[i]))
|
||||
type[0]= INT_RESULT;
|
||||
}
|
||||
|
||||
/*
|
||||
If we had a field that can be compared as a longlong, and all constant
|
||||
items, then the aggregate result will be an INT_RESULT.
|
||||
*/
|
||||
if (field && all_constant)
|
||||
type[0]= INT_RESULT;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -2002,6 +2002,41 @@ longlong Item_date_add_interval::val_int()
|
||||
((date*100L + ltime.hour)*100L+ ltime.minute)*100L + ltime.second;
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool Item_date_add_interval::eq(const Item *item, bool binary_cmp) const
|
||||
{
|
||||
INTERVAL interval, other_interval;
|
||||
String val= value; // Because of const
|
||||
|
||||
if (this == item)
|
||||
return TRUE;
|
||||
|
||||
if ((item->type() != FUNC_ITEM) ||
|
||||
(arg_count != ((Item_func*) item)->arg_count) ||
|
||||
(func_name() != ((Item_func*) item)->func_name()))
|
||||
return FALSE;
|
||||
|
||||
Item_date_add_interval *other= (Item_date_add_interval*) item;
|
||||
|
||||
if ((int_type != other->int_type) ||
|
||||
(!args[0]->eq(other->args[0], binary_cmp)) ||
|
||||
(get_interval_value(args[1], int_type, &val, &interval)))
|
||||
return FALSE;
|
||||
|
||||
val= other->value;
|
||||
|
||||
if ((get_interval_value(other->args[1], other->int_type, &val,
|
||||
&other_interval)) ||
|
||||
((date_sub_interval ^ interval.neg) ^
|
||||
(other->date_sub_interval ^ other_interval.neg)))
|
||||
return FALSE;
|
||||
|
||||
// Assume comparing same types here due to earlier check
|
||||
return memcmp(&interval, &other_interval, sizeof(INTERVAL)) == 0;
|
||||
}
|
||||
|
||||
|
||||
static const char *interval_names[]=
|
||||
{
|
||||
"year", "quarter", "month", "day", "hour",
|
||||
|
||||
@@ -647,6 +647,7 @@ public:
|
||||
double val_real() { DBUG_ASSERT(fixed == 1); return (double) val_int(); }
|
||||
longlong val_int();
|
||||
bool get_date(TIME *res, uint fuzzy_date);
|
||||
bool eq(const Item *item, bool binary_cmp) const;
|
||||
void print(String *str);
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user