mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 03:52:35 +01:00
Fixes for binary protocol (complement to last push)
Changed timestamp to return string in YYYY-MM-DD HH:MM:SS format. DATE_ADD() and related functions now returns correct DATE/DATETIME type depending on argument types. Now all tests passes, still some work left to remove warnings in log files from mysql-test-run mysql-test/r/cast.result: New result for time mysql-test/r/delayed.result: Timestamp update mysql-test/r/derived.result: Fix after bulk insert change mysql-test/r/explain.result: Fix after bulk insert change mysql-test/r/func_date_add.result: Timestamp change mysql-test/r/func_str.result: Timestamp change mysql-test/r/func_time.result: Timestamp change mysql-test/r/innodb.result: Timestamp change mysql-test/r/join_outer.result: Fix after bulk insert change mysql-test/r/key_primary.result: Fix after bulk insert change mysql-test/r/keywords.result: Timestamp change mysql-test/r/merge.result: Removed warning mysql-test/r/odbc.result: Fix after bulk insert change mysql-test/r/range.result: Fix after bulk insert change mysql-test/r/select.result: Fix after bulk insert change mysql-test/r/subselect.result: Fixed EXPLAIN output mysql-test/r/type_datetime.result: Timestamp update mysql-test/r/type_ranges.result: Timestamp update mysql-test/r/type_timestamp.result: Timestamp update mysql-test/r/union.result: EXPLAIN UPDATE mysql-test/t/func_str.test: Timestamp update mysql-test/t/func_time.test: New test for interval type result mysql-test/t/merge.test: Remove warnings of wrong drop table mysql-test/t/type_datetime.test: Timestamp change mysql-test/t/type_timestamp.test: Timestamp change sql/field.cc: Changed timestamp to return string in YYYY-MM-DD HH:MM:SS format sql/field.h: Changed timestamp to return string in YYYY-MM-DD HH:MM:SS format sql/item.cc: Binary protocol update sql/item.h: Binary protocol update sql/item_func.cc: Added comment sql/item_func.h: @variables are always returned to the client as strings sql/item_timefunc.cc: Changed INTERVAL to return correct type sql/item_timefunc.h: Changed INTERVAL to return correct type sql/mysqld.cc: Changed default pthread_attr_setstacksize to 129K sql/protocol.cc: More type checking sql/set_var.cc: Fixed that @convert works ok with new protocol sql/sql_analyse.cc: Fixed bug in analyze sql/sql_class.cc: Fixed bug from last push in LIMIT sql/sql_error.cc: More optimal types sql/sql_repl.cc: Binary protocol changes sql/sql_select.cc: Fixed bug in multi-table-update Changed EXPLAIN to return NULL instead of empty strings sql/sql_show.cc: Binary protocol
This commit is contained in:
parent
4a81706558
commit
f935c6a286
42 changed files with 399 additions and 263 deletions
|
@ -27,7 +27,7 @@ cast("2001-1-1" as DATE) cast("2001-1-1" as DATETIME)
|
|||
2001-01-01 2001-01-01 00:00:00
|
||||
select cast("1:2:3" as TIME);
|
||||
cast("1:2:3" as TIME)
|
||||
1:02:03
|
||||
01:02:03
|
||||
select cast("2001-1-1" as date) = "2001-01-01";
|
||||
cast("2001-1-1" as date) = "2001-01-01"
|
||||
0
|
||||
|
|
|
@ -12,9 +12,9 @@ select * from t1 where tmsp=0;
|
|||
a tmsp
|
||||
select * from t1 where tmsp=19711006010203;
|
||||
a tmsp
|
||||
5 19711006010203
|
||||
6 19711006010203
|
||||
8 19711006010203
|
||||
5 1971-10-06 01:02:03
|
||||
6 1971-10-06 01:02:03
|
||||
8 1971-10-06 01:02:03
|
||||
drop table t1;
|
||||
create table t1 (a int not null auto_increment primary key, b char(10));
|
||||
insert delayed into t1 values (1,"b");
|
||||
|
|
|
@ -89,7 +89,7 @@ a t
|
|||
20 20
|
||||
explain select count(*) from t1 as tt1, (select * from t1) as tt2;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY Select tables optimized away
|
||||
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
||||
2 DERIVED tt1 index NULL a 4 NULL 10000 Using index
|
||||
drop table if exists t1;
|
||||
SELECT * FROM (SELECT (SELECT * FROM (SELECT 1 as a) as a )) as b;
|
||||
|
|
|
@ -27,4 +27,4 @@ Key column 'foo' doesn't exist in table
|
|||
drop table t1;
|
||||
explain select 1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE No tables used
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
|
|
|
@ -31,17 +31,17 @@ INSERT INTO t1 VALUES (357917728,7,2,2,20000319145027);
|
|||
select visitor_id,max(ts) as mts from t1 group by visitor_id
|
||||
having mts < DATE_SUB(NOW(),INTERVAL 3 MONTH);
|
||||
visitor_id mts
|
||||
48985536 20000319013932
|
||||
173865424 20000318233615
|
||||
357917728 20000319145027
|
||||
465931136 20000318160953
|
||||
1092858576 20000319013445
|
||||
48985536 2000-03-19 01:39:32
|
||||
173865424 2000-03-18 23:36:15
|
||||
357917728 2000-03-19 14:50:27
|
||||
465931136 2000-03-18 16:09:53
|
||||
1092858576 2000-03-19 01:34:45
|
||||
select visitor_id,max(ts) as mts from t1 group by visitor_id
|
||||
having DATE_ADD(mts,INTERVAL 3 MONTH) < NOW();
|
||||
visitor_id mts
|
||||
48985536 20000319013932
|
||||
173865424 20000318233615
|
||||
357917728 20000319145027
|
||||
465931136 20000318160953
|
||||
1092858576 20000319013445
|
||||
48985536 2000-03-19 01:39:32
|
||||
173865424 2000-03-18 23:36:15
|
||||
357917728 2000-03-19 14:50:27
|
||||
465931136 2000-03-18 16:09:53
|
||||
1092858576 2000-03-19 01:34:45
|
||||
drop table t1;
|
||||
|
|
|
@ -213,14 +213,14 @@ bugstatus int(10) unsigned default NULL,
|
|||
submitter int(10) unsigned default NULL
|
||||
) TYPE=MyISAM;
|
||||
INSERT INTO t1 VALUES (1,'Link',1,1,1,'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa','2001-02-28 08:40:16',20010228084016,0,4);
|
||||
SELECT CONCAT('"',CONCAT_WS('";"',title,prio,category,program,bugdesc,created,modified,bugstatus,submitter), '"') FROM t1;
|
||||
CONCAT('"',CONCAT_WS('";"',title,prio,category,program,bugdesc,created,modified,bugstatus,submitter), '"')
|
||||
SELECT CONCAT('"',CONCAT_WS('";"',title,prio,category,program,bugdesc,created,modified+0,bugstatus,submitter), '"') FROM t1;
|
||||
CONCAT('"',CONCAT_WS('";"',title,prio,category,program,bugdesc,created,modified+0,bugstatus,submitter), '"')
|
||||
"Link";"1";"1";"1";"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";"2001-02-28 08:40:16";"20010228084016";"0";"4"
|
||||
SELECT CONCAT('"',CONCAT_WS('";"',title,prio,category,program,bugstatus,submitter), '"') FROM t1;
|
||||
CONCAT('"',CONCAT_WS('";"',title,prio,category,program,bugstatus,submitter), '"')
|
||||
"Link";"1";"1";"1";"0";"4"
|
||||
SELECT CONCAT_WS('";"',title,prio,category,program,bugdesc,created,modified,bugstatus,submitter) FROM t1;
|
||||
CONCAT_WS('";"',title,prio,category,program,bugdesc,created,modified,bugstatus,submitter)
|
||||
SELECT CONCAT_WS('";"',title,prio,category,program,bugdesc,created,modified+0,bugstatus,submitter) FROM t1;
|
||||
CONCAT_WS('";"',title,prio,category,program,bugdesc,created,modified+0,bugstatus,submitter)
|
||||
Link";"1";"1";"1";"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";"2001-02-28 08:40:16";"20010228084016";"0";"4
|
||||
drop table t1;
|
||||
CREATE TABLE t1 (id int(11) NOT NULL auto_increment, tmp text NOT NULL, KEY id (id)) TYPE=MyISAM;
|
||||
|
|
|
@ -392,11 +392,71 @@ CREATE TABLE t3 (ctime1 char(19) NOT NULL, ctime2 char(19) NOT NULL);
|
|||
INSERT INTO t3 VALUES ("2002-10-29 16:51:06","2002-11-05 16:47:31");
|
||||
select * from t1, t2 where t1.start between t2.ctime1 and t2.ctime2;
|
||||
start ctime1 ctime2
|
||||
2002-11-04 00:00:00 20021029165106 20021105164731
|
||||
2002-11-04 00:00:00 2002-10-29 16:51:06 2002-11-05 16:47:31
|
||||
select * from t1, t2 where t1.start >= t2.ctime1 and t1.start <= t2.ctime2;
|
||||
start ctime1 ctime2
|
||||
2002-11-04 00:00:00 20021029165106 20021105164731
|
||||
2002-11-04 00:00:00 2002-10-29 16:51:06 2002-11-05 16:47:31
|
||||
select * from t1, t3 where t1.start between t3.ctime1 and t3.ctime2;
|
||||
start ctime1 ctime2
|
||||
2002-11-04 00:00:00 2002-10-29 16:51:06 2002-11-05 16:47:31
|
||||
drop table t1,t2,t3;
|
||||
CREATE TABLE t1 (datetime datetime, timestamp timestamp, date date, time time);
|
||||
INSERT INTO t1 values ("2001-01-02 03:04:05", "2002-01-02 03:04:05", "2003-01-02", "06:07:08");
|
||||
SELECT * from t1;
|
||||
datetime timestamp date time
|
||||
2001-01-02 03:04:05 2002-01-02 03:04:05 2003-01-02 06:07:08
|
||||
select date_add("1997-12-31",INTERVAL 1 SECOND);
|
||||
date_add("1997-12-31",INTERVAL 1 SECOND)
|
||||
1997-12-31 00:00:01
|
||||
select date_add("1997-12-31",INTERVAL "1 1" YEAR_MONTH);
|
||||
date_add("1997-12-31",INTERVAL "1 1" YEAR_MONTH)
|
||||
1999-01-31
|
||||
select date_add(datetime, INTERVAL 1 SECOND) from t1;
|
||||
date_add(datetime, INTERVAL 1 SECOND)
|
||||
2001-01-02 03:04:06
|
||||
select date_add(datetime, INTERVAL 1 YEAR) from t1;
|
||||
date_add(datetime, INTERVAL 1 YEAR)
|
||||
2002-01-02 03:04:05
|
||||
select date_add(date,INTERVAL 1 SECOND) from t1;
|
||||
date_add(date,INTERVAL 1 SECOND)
|
||||
2003-01-02 00:00:01
|
||||
select date_add(date,INTERVAL 1 MINUTE) from t1;
|
||||
date_add(date,INTERVAL 1 MINUTE)
|
||||
2003-01-02 00:01:00
|
||||
select date_add(date,INTERVAL 1 HOUR) from t1;
|
||||
date_add(date,INTERVAL 1 HOUR)
|
||||
2003-01-02 01:00:00
|
||||
select date_add(date,INTERVAL 1 DAY) from t1;
|
||||
date_add(date,INTERVAL 1 DAY)
|
||||
2003-01-03
|
||||
select date_add(date,INTERVAL 1 MONTH) from t1;
|
||||
date_add(date,INTERVAL 1 MONTH)
|
||||
2003-02-02
|
||||
select date_add(date,INTERVAL 1 YEAR) from t1;
|
||||
date_add(date,INTERVAL 1 YEAR)
|
||||
2004-01-02
|
||||
select date_add(date,INTERVAL "1:1" MINUTE_SECOND) from t1;
|
||||
date_add(date,INTERVAL "1:1" MINUTE_SECOND)
|
||||
2003-01-02 00:01:01
|
||||
select date_add(date,INTERVAL "1:1" HOUR_MINUTE) from t1;
|
||||
date_add(date,INTERVAL "1:1" HOUR_MINUTE)
|
||||
2003-01-02 01:01:00
|
||||
select date_add(date,INTERVAL "1:1" DAY_HOUR) from t1;
|
||||
date_add(date,INTERVAL "1:1" DAY_HOUR)
|
||||
2003-01-03 01:00:00
|
||||
select date_add(date,INTERVAL "1 1" YEAR_MONTH) from t1;
|
||||
date_add(date,INTERVAL "1 1" YEAR_MONTH)
|
||||
2004-02-02
|
||||
select date_add(date,INTERVAL "1:1:1" HOUR_SECOND) from t1;
|
||||
date_add(date,INTERVAL "1:1:1" HOUR_SECOND)
|
||||
2003-01-02 01:01:01
|
||||
select date_add(date,INTERVAL "1 1:1" DAY_MINUTE) from t1;
|
||||
date_add(date,INTERVAL "1 1:1" DAY_MINUTE)
|
||||
2003-01-03 01:01:00
|
||||
select date_add(date,INTERVAL "1 1:1:1" DAY_SECOND) from t1;
|
||||
date_add(date,INTERVAL "1 1:1:1" DAY_SECOND)
|
||||
2003-01-03 01:01:01
|
||||
select date_add(time,INTERVAL 1 SECOND) from t1;
|
||||
date_add(time,INTERVAL 1 SECOND)
|
||||
2006-07-08 00:00:01
|
||||
drop table t1;
|
||||
|
|
|
@ -959,29 +959,29 @@ INSERT INTO t2 VALUES (650,'San Francisco',90,0,20020109113158,342,0000000000000
|
|||
INSERT INTO t2 VALUES (333,'tubs',99,2,20020109113453,501,20020109113453,500,3,10,0);
|
||||
select * from t1;
|
||||
number cname carrier_id privacy last_mod_date last_mod_id last_app_date last_app_id version assigned_scps status
|
||||
4077711111 SeanWheeler 90 2 20020111112846 500 00000000000000 -1 2 3 1
|
||||
9197722223 berry 90 3 20020111112809 500 20020102114532 501 4 10 0
|
||||
650 San Francisco 0 0 20011227111336 342 00000000000000 -1 1 24 1
|
||||
302467 Sue's Subshop 90 3 20020109113241 500 20020102115111 501 7 24 0
|
||||
6014911113 SudzCarwash 520 1 20020102115234 500 20020102115259 501 33 32768 0
|
||||
333 tubs 99 2 20020109113440 501 20020109113440 500 3 10 0
|
||||
4077711111 SeanWheeler 90 2 2002-01-11 11:28:46 500 0000-00-00 00:00:00 -1 2 3 1
|
||||
9197722223 berry 90 3 2002-01-11 11:28:09 500 2002-01-02 11:45:32 501 4 10 0
|
||||
650 San Francisco 0 0 2001-12-27 11:13:36 342 0000-00-00 00:00:00 -1 1 24 1
|
||||
302467 Sue's Subshop 90 3 2002-01-09 11:32:41 500 2002-01-02 11:51:11 501 7 24 0
|
||||
6014911113 SudzCarwash 520 1 2002-01-02 11:52:34 500 2002-01-02 11:52:59 501 33 32768 0
|
||||
333 tubs 99 2 2002-01-09 11:34:40 501 2002-01-09 11:34:40 500 3 10 0
|
||||
select * from t2;
|
||||
number cname carrier_id privacy last_mod_date last_mod_id last_app_date last_app_id version assigned_scps status
|
||||
4077711111 SeanWheeler 0 2 20020111112853 500 00000000000000 -1 2 3 1
|
||||
9197722223 berry 90 3 20020111112818 500 20020102114532 501 4 10 0
|
||||
650 San Francisco 90 0 20020109113158 342 00000000000000 -1 1 24 1
|
||||
333 tubs 99 2 20020109113453 501 20020109113453 500 3 10 0
|
||||
4077711111 SeanWheeler 0 2 2002-01-11 11:28:53 500 0000-00-00 00:00:00 -1 2 3 1
|
||||
9197722223 berry 90 3 2002-01-11 11:28:18 500 2002-01-02 11:45:32 501 4 10 0
|
||||
650 San Francisco 90 0 2002-01-09 11:31:58 342 0000-00-00 00:00:00 -1 1 24 1
|
||||
333 tubs 99 2 2002-01-09 11:34:53 501 2002-01-09 11:34:53 500 3 10 0
|
||||
delete t1, t2 from t1 left join t2 on t1.number=t2.number where (t1.carrier_id=90 and t1.number=t2.number) or (t2.carrier_id=90 and t1.number=t2.number) or (t1.carrier_id=90 and t2.number is null);
|
||||
select * from t1;
|
||||
number cname carrier_id privacy last_mod_date last_mod_id last_app_date last_app_id version assigned_scps status
|
||||
6014911113 SudzCarwash 520 1 20020102115234 500 20020102115259 501 33 32768 0
|
||||
333 tubs 99 2 20020109113440 501 20020109113440 500 3 10 0
|
||||
6014911113 SudzCarwash 520 1 2002-01-02 11:52:34 500 2002-01-02 11:52:59 501 33 32768 0
|
||||
333 tubs 99 2 2002-01-09 11:34:40 501 2002-01-09 11:34:40 500 3 10 0
|
||||
select * from t2;
|
||||
number cname carrier_id privacy last_mod_date last_mod_id last_app_date last_app_id version assigned_scps status
|
||||
333 tubs 99 2 20020109113453 501 20020109113453 500 3 10 0
|
||||
333 tubs 99 2 2002-01-09 11:34:53 501 2002-01-09 11:34:53 500 3 10 0
|
||||
select * from t2;
|
||||
number cname carrier_id privacy last_mod_date last_mod_id last_app_date last_app_id version assigned_scps status
|
||||
333 tubs 99 2 20020109113453 501 20020109113453 500 3 10 0
|
||||
333 tubs 99 2 2002-01-09 11:34:53 501 2002-01-09 11:34:53 500 3 10 0
|
||||
drop table t1,t2;
|
||||
create table t1 (id int unsigned not null auto_increment, code tinyint unsigned not null, name char(20) not null, primary key (id), key (code), unique (name)) type=innodb;
|
||||
BEGIN;
|
||||
|
|
|
@ -91,7 +91,7 @@ grp a c id a c d
|
|||
NULL NULL NULL NULL NULL NULL
|
||||
explain select t1.*,t2.* from t1,t2 where t1.a=t2.a and isnull(t2.a)=1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE Impossible WHERE noticed after reading const tables
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||
explain select t1.*,t2.* from t1 left join t2 on t1.a=t2.a where isnull(t2.a)=1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ALL NULL NULL NULL NULL 7
|
||||
|
|
|
@ -16,5 +16,5 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||
1 SIMPLE t1 const PRIMARY PRIMARY 3 const 1
|
||||
describe select * from t1 where t1="ABCD";
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE Impossible WHERE noticed after reading const tables
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||
drop table t1;
|
||||
|
|
|
@ -3,7 +3,7 @@ create table t1 (time time, date date, timestamp timestamp);
|
|||
insert into t1 values ("12:22:22","97:02:03","1997-01-02");
|
||||
select * from t1;
|
||||
time date timestamp
|
||||
12:22:22 1997-02-03 19970102000000
|
||||
12:22:22 1997-02-03 1997-01-02 00:00:00
|
||||
select t1.time+0,t1.date+0,t1.timestamp+0,concat(date," ",time) from t1;
|
||||
t1.time+0 t1.date+0 t1.timestamp+0 concat(date," ",time)
|
||||
122222 19970203 19970102000000 1997-02-03 12:22:22
|
||||
|
|
|
@ -560,7 +560,7 @@ select * from t6;
|
|||
a
|
||||
1
|
||||
2
|
||||
drop table if exists t1, t2, t3, t4, t5, t6;
|
||||
drop table if exists t6, t3, t1, t2, t4, t5;
|
||||
DROP TABLE IF EXISTS t1, t2;
|
||||
CREATE TABLE t1 (
|
||||
fileset_id tinyint(3) unsigned NOT NULL default '0',
|
||||
|
@ -595,4 +595,4 @@ EXPLAIN SELECT * FROM t2 WHERE fileset_id = 2
|
|||
AND file_code = '0000000115' LIMIT 1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t2 const PRIMARY,files PRIMARY 33 const,const 1
|
||||
DROP TABLE IF EXISTS t1, t2;
|
||||
DROP TABLE IF EXISTS t2, t1;
|
||||
|
|
|
@ -12,5 +12,5 @@ select * from t1 where a is null;
|
|||
a b
|
||||
explain select * from t1 where b is null;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE Impossible WHERE noticed after reading const tables
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||
drop table t1;
|
||||
|
|
|
@ -16,7 +16,7 @@ event_date type event_id
|
|||
1999-07-14 100600 10
|
||||
explain select event_date,type,event_id from t1 WHERE type = 100601 and event_date >= "1999-07-01" AND event_date < "1999-07-15" AND (type=100600 OR type=100100) ORDER BY event_date;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE Impossible WHERE
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE
|
||||
select event_date,type,event_id from t1 WHERE event_date >= "1999-07-01" AND event_date <= "1999-07-15" AND (type=100600 OR type=100100) or event_date >= "1999-07-01" AND event_date <= "1999-07-15" AND type=100099;
|
||||
event_date type event_id
|
||||
1999-07-10 100100 24
|
||||
|
|
|
@ -3097,7 +3097,7 @@ fld1 sum(price)
|
|||
038008 234298
|
||||
explain select fld3 from t2 where 1>2 or 2>3;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE Impossible WHERE
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE
|
||||
explain select fld3 from t2 where fld1=fld1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t2 ALL NULL NULL NULL NULL 1199
|
||||
|
@ -3152,7 +3152,7 @@ count(*)
|
|||
4181
|
||||
explain select min(fld1),max(fld1),count(*) from t2;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE Select tables optimized away
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
||||
select min(fld1),max(fld1),count(*) from t2;
|
||||
min(fld1) max(fld1) count(*)
|
||||
0 1232609 1199
|
||||
|
|
|
@ -20,8 +20,8 @@ Reference 'a' not supported (forward reference in item list)
|
|||
EXPLAIN SELECT 1 FROM (SELECT 1 as a) as b HAVING (SELECT a)=1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY <derived2> system NULL NULL NULL NULL 1
|
||||
3 DEPENDENT SUBSELECT No tables used
|
||||
2 DERIVED No tables used
|
||||
3 DEPENDENT SUBSELECT NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
2 DERIVED NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
SELECT 1 FROM (SELECT 1 as a) as b HAVING (SELECT a)=1;
|
||||
1
|
||||
1
|
||||
|
@ -280,7 +280,7 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||
1 SIMPLE t1 index NULL PRIMARY 41 NULL 2 Using where; Using index
|
||||
EXPLAIN SELECT (SELECT DISTINCT date FROM t1 WHERE date='2002-08-03');
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY No tables used
|
||||
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
2 SUBSELECT t1 index NULL PRIMARY 41 NULL 2 Using where; Using index
|
||||
SELECT DISTINCT date FROM t1 WHERE date='2002-08-03';
|
||||
date
|
||||
|
@ -298,8 +298,8 @@ Subselect returns more than 1 record
|
|||
EXPLAIN SELECT 1 FROM t1 WHERE 1=(SELECT 1 UNION SELECT 1);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 index NULL topic 3 NULL 2 Using index
|
||||
2 SUBSELECT No tables used
|
||||
3 UNION No tables used
|
||||
2 SUBSELECT NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
3 UNION NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
drop table t1;
|
||||
CREATE TABLE `t1` (
|
||||
`numeropost` mediumint(8) unsigned NOT NULL auto_increment,
|
||||
|
@ -394,11 +394,11 @@ EXPLAIN SELECT numreponse FROM t1 WHERE numeropost='1' AND numreponse=(SELECT 1
|
|||
Subselect returns more than 1 record
|
||||
EXPLAIN SELECT MAX(numreponse) FROM t1 WHERE numeropost='1';
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE Select tables optimized away
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
||||
EXPLAIN SELECT numreponse FROM t1 WHERE numeropost='1' AND numreponse=(SELECT MAX(numreponse) FROM t1 WHERE numeropost='1');
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 const PRIMARY,numreponse PRIMARY 7 const,const 1
|
||||
2 SUBSELECT Select tables optimized away
|
||||
2 SUBSELECT NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
||||
drop table t1;
|
||||
CREATE TABLE t1 (a int(1));
|
||||
INSERT INTO t1 VALUES (1);
|
||||
|
@ -574,14 +574,14 @@ id
|
|||
EXPLAIN SELECT * FROM t WHERE id IN (SELECT 1+(select 1));
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t ref id id 5 const 1 Using where; Using index
|
||||
3 SUBSELECT No tables used
|
||||
3 SUBSELECT NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
Warnings:
|
||||
Note 1247 Select 2 was reduced during optimisation
|
||||
EXPLAIN SELECT * FROM t WHERE id IN (SELECT 1 UNION SELECT 3);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t index NULL id 5 NULL 2 Using where; Using index
|
||||
2 DEPENDENT SUBSELECT No tables used
|
||||
3 UNION No tables used
|
||||
2 DEPENDENT SUBSELECT NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
3 UNION NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
SELECT * FROM t WHERE id IN (SELECT 5 UNION SELECT 3);
|
||||
id
|
||||
SELECT * FROM t WHERE id IN (SELECT 5 UNION SELECT 2);
|
||||
|
|
|
@ -41,8 +41,8 @@ t
|
|||
drop table t1;
|
||||
CREATE TABLE t1 (a timestamp, b date, c time, d datetime);
|
||||
insert into t1 (b,c,d) values(now(),curtime(),now());
|
||||
select date_format(a,"%Y-%m-%d")=b,right(a,6)=c+0,a=d+0 from t1;
|
||||
date_format(a,"%Y-%m-%d")=b right(a,6)=c+0 a=d+0
|
||||
select date_format(a,"%Y-%m-%d")=b,right(a+0,6)=c+0,a=d+0 from t1;
|
||||
date_format(a,"%Y-%m-%d")=b right(a+0,6)=c+0 a=d+0
|
||||
1 1 1
|
||||
drop table t1;
|
||||
CREATE TABLE t1 (a datetime not null);
|
||||
|
|
|
@ -53,7 +53,7 @@ ushort smallint(5) unsigned zerofill MUL 00000 select,insert,update,references
|
|||
umedium mediumint(8) unsigned MUL 0 select,insert,update,references
|
||||
ulong int(11) unsigned MUL 0 select,insert,update,references
|
||||
ulonglong bigint(13) unsigned MUL 0 select,insert,update,references
|
||||
time_stamp timestamp(14) YES NULL select,insert,update,references
|
||||
time_stamp timestamp YES NULL select,insert,update,references
|
||||
date_field date YES NULL select,insert,update,references
|
||||
time_field time YES NULL select,insert,update,references
|
||||
date_time datetime YES NULL select,insert,update,references
|
||||
|
@ -183,7 +183,7 @@ ushort smallint(5) unsigned zerofill 00000 select,insert,update,references
|
|||
umedium mediumint(8) unsigned MUL 0 select,insert,update,references
|
||||
ulong int(11) unsigned MUL 0 select,insert,update,references
|
||||
ulonglong bigint(13) unsigned MUL 0 select,insert,update,references
|
||||
time_stamp timestamp(14) YES NULL select,insert,update,references
|
||||
time_stamp timestamp YES NULL select,insert,update,references
|
||||
date_field varchar(10) character set latin1 YES NULL select,insert,update,references
|
||||
time_field time YES NULL select,insert,update,references
|
||||
date_time datetime YES NULL select,insert,update,references
|
||||
|
@ -209,7 +209,7 @@ ushort smallint(5) unsigned zerofill 00000 select,insert,update,references
|
|||
umedium mediumint(8) unsigned 0 select,insert,update,references
|
||||
ulong int(11) unsigned 0 select,insert,update,references
|
||||
ulonglong bigint(13) unsigned 0 select,insert,update,references
|
||||
time_stamp timestamp(14) YES NULL select,insert,update,references
|
||||
time_stamp timestamp YES NULL select,insert,update,references
|
||||
date_field varchar(10) character set latin1 YES NULL select,insert,update,references
|
||||
time_field time YES NULL select,insert,update,references
|
||||
date_time datetime YES NULL select,insert,update,references
|
||||
|
|
|
@ -15,26 +15,26 @@ SET TIMESTAMP=1238;
|
|||
insert into t1 (a) select a+1 from t2 where a=8;
|
||||
select * from t1;
|
||||
a t
|
||||
1 19700101032034
|
||||
2 20020303000000
|
||||
3 19700101032035
|
||||
4 19700101032036
|
||||
5 20020304000000
|
||||
6 19700101032037
|
||||
7 20020305000000
|
||||
8 00000000000000
|
||||
9 19700101032038
|
||||
1 1970-01-01 03:20:34
|
||||
2 2002-03-03 00:00:00
|
||||
3 1970-01-01 03:20:35
|
||||
4 1970-01-01 03:20:36
|
||||
5 2002-03-04 00:00:00
|
||||
6 1970-01-01 03:20:37
|
||||
7 2002-03-05 00:00:00
|
||||
8 0000-00-00 00:00:00
|
||||
9 1970-01-01 03:20:38
|
||||
drop table t1,t2;
|
||||
SET TIMESTAMP=1234;
|
||||
CREATE TABLE t1 (value TEXT NOT NULL, id VARCHAR(32) NOT NULL, stamp timestamp, PRIMARY KEY (id));
|
||||
INSERT INTO t1 VALUES ("my value", "myKey","1999-04-02 00:00:00");
|
||||
SELECT stamp FROM t1 WHERE id="myKey";
|
||||
stamp
|
||||
19990402000000
|
||||
1999-04-02 00:00:00
|
||||
UPDATE t1 SET value="my value" WHERE id="myKey";
|
||||
SELECT stamp FROM t1 WHERE id="myKey";
|
||||
stamp
|
||||
19990402000000
|
||||
1999-04-02 00:00:00
|
||||
drop table t1;
|
||||
create table t1 (a timestamp);
|
||||
insert into t1 values (now());
|
||||
|
@ -44,8 +44,8 @@ date_format(a,"%Y %y") year(a) year(now())
|
|||
drop table t1;
|
||||
create table t1 (ix timestamp);
|
||||
insert into t1 values (19991101000000),(19990102030405),(19990630232922),(19990601000000),(19990930232922),(19990531232922),(19990501000000),(19991101000000),(19990501000000);
|
||||
select * from t1;
|
||||
ix
|
||||
select ix+0 from t1;
|
||||
ix+0
|
||||
19991101000000
|
||||
19990102030405
|
||||
19990630232922
|
||||
|
@ -71,16 +71,16 @@ INSERT INTO t1 VALUES ("2005-01-01","2005-01-01 00:00:00",20050101000000);
|
|||
INSERT INTO t1 VALUES ("2030-01-01","2030-01-01 00:00:00",20300101000000);
|
||||
SELECT * FROM t1;
|
||||
date date_time time_stamp
|
||||
1998-12-31 1998-12-31 23:59:59 19981231235959
|
||||
1999-01-01 1999-01-01 00:00:00 19990101000000
|
||||
1999-09-09 1999-09-09 23:59:59 19990909235959
|
||||
2000-01-01 2000-01-01 00:00:00 20000101000000
|
||||
2000-02-28 2000-02-28 00:00:00 20000228000000
|
||||
2000-02-29 2000-02-29 00:00:00 20000229000000
|
||||
2000-03-01 2000-03-01 00:00:00 20000301000000
|
||||
2000-12-31 2000-12-31 23:59:59 20001231235959
|
||||
2001-01-01 2001-01-01 00:00:00 20010101000000
|
||||
2004-12-31 2004-12-31 23:59:59 20041231235959
|
||||
2005-01-01 2005-01-01 00:00:00 20050101000000
|
||||
2030-01-01 2030-01-01 00:00:00 20300101000000
|
||||
1998-12-31 1998-12-31 23:59:59 1998-12-31 23:59:59
|
||||
1999-01-01 1999-01-01 00:00:00 1999-01-01 00:00:00
|
||||
1999-09-09 1999-09-09 23:59:59 1999-09-09 23:59:59
|
||||
2000-01-01 2000-01-01 00:00:00 2000-01-01 00:00:00
|
||||
2000-02-28 2000-02-28 00:00:00 2000-02-28 00:00:00
|
||||
2000-02-29 2000-02-29 00:00:00 2000-02-29 00:00:00
|
||||
2000-03-01 2000-03-01 00:00:00 2000-03-01 00:00:00
|
||||
2000-12-31 2000-12-31 23:59:59 2000-12-31 23:59:59
|
||||
2001-01-01 2001-01-01 00:00:00 2001-01-01 00:00:00
|
||||
2004-12-31 2004-12-31 23:59:59 2004-12-31 23:59:59
|
||||
2005-01-01 2005-01-01 00:00:00 2005-01-01 00:00:00
|
||||
2030-01-01 2030-01-01 00:00:00 2030-01-01 00:00:00
|
||||
drop table t1;
|
||||
|
|
|
@ -102,16 +102,16 @@ Unknown column 'xx' in 'field list'
|
|||
explain select a,b from t1 union select 1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 4
|
||||
2 UNION No tables used
|
||||
2 UNION NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
explain select 1 union select a,b from t1 union select 1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY No tables used
|
||||
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
2 UNION t1 ALL NULL NULL NULL NULL 4
|
||||
3 UNION No tables used
|
||||
3 UNION NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
explain select a,b from t1 union select 1 limit 0;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY Impossible WHERE
|
||||
2 UNION Impossible WHERE
|
||||
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE
|
||||
2 UNION NULL NULL NULL NULL NULL NULL NULL Impossible WHERE
|
||||
select a,b from t1 into outfile 'skr' union select a,b from t2;
|
||||
Wrong usage of UNION and INTO
|
||||
select a,b from t1 order by a union select a,b from t2;
|
||||
|
|
|
@ -110,9 +110,9 @@ CREATE TABLE t1 (
|
|||
) TYPE=MyISAM;
|
||||
|
||||
INSERT INTO t1 VALUES (1,'Link',1,1,1,'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa','2001-02-28 08:40:16',20010228084016,0,4);
|
||||
SELECT CONCAT('"',CONCAT_WS('";"',title,prio,category,program,bugdesc,created,modified,bugstatus,submitter), '"') FROM t1;
|
||||
SELECT CONCAT('"',CONCAT_WS('";"',title,prio,category,program,bugdesc,created,modified+0,bugstatus,submitter), '"') FROM t1;
|
||||
SELECT CONCAT('"',CONCAT_WS('";"',title,prio,category,program,bugstatus,submitter), '"') FROM t1;
|
||||
SELECT CONCAT_WS('";"',title,prio,category,program,bugdesc,created,modified,bugstatus,submitter) FROM t1;
|
||||
SELECT CONCAT_WS('";"',title,prio,category,program,bugdesc,created,modified+0,bugstatus,submitter) FROM t1;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
|
|
|
@ -183,3 +183,34 @@ select * from t1, t2 where t1.start between t2.ctime1 and t2.ctime2;
|
|||
select * from t1, t2 where t1.start >= t2.ctime1 and t1.start <= t2.ctime2;
|
||||
select * from t1, t3 where t1.start between t3.ctime1 and t3.ctime2;
|
||||
drop table t1,t2,t3;
|
||||
|
||||
#
|
||||
# Test types from + INTERVAL
|
||||
#
|
||||
|
||||
CREATE TABLE t1 (datetime datetime, timestamp timestamp, date date, time time);
|
||||
INSERT INTO t1 values ("2001-01-02 03:04:05", "2002-01-02 03:04:05", "2003-01-02", "06:07:08");
|
||||
SELECT * from t1;
|
||||
select date_add("1997-12-31",INTERVAL 1 SECOND);
|
||||
select date_add("1997-12-31",INTERVAL "1 1" YEAR_MONTH);
|
||||
|
||||
select date_add(datetime, INTERVAL 1 SECOND) from t1;
|
||||
select date_add(datetime, INTERVAL 1 YEAR) from t1;
|
||||
|
||||
select date_add(date,INTERVAL 1 SECOND) from t1;
|
||||
select date_add(date,INTERVAL 1 MINUTE) from t1;
|
||||
select date_add(date,INTERVAL 1 HOUR) from t1;
|
||||
select date_add(date,INTERVAL 1 DAY) from t1;
|
||||
select date_add(date,INTERVAL 1 MONTH) from t1;
|
||||
select date_add(date,INTERVAL 1 YEAR) from t1;
|
||||
select date_add(date,INTERVAL "1:1" MINUTE_SECOND) from t1;
|
||||
select date_add(date,INTERVAL "1:1" HOUR_MINUTE) from t1;
|
||||
select date_add(date,INTERVAL "1:1" DAY_HOUR) from t1;
|
||||
select date_add(date,INTERVAL "1 1" YEAR_MONTH) from t1;
|
||||
select date_add(date,INTERVAL "1:1:1" HOUR_SECOND) from t1;
|
||||
select date_add(date,INTERVAL "1 1:1" DAY_MINUTE) from t1;
|
||||
select date_add(date,INTERVAL "1 1:1:1" DAY_SECOND) from t1;
|
||||
|
||||
# The following is not as one would expect...
|
||||
select date_add(time,INTERVAL 1 SECOND) from t1;
|
||||
drop table t1;
|
||||
|
|
|
@ -202,7 +202,7 @@ insert into t4 values (1);
|
|||
insert into t5 values (2);
|
||||
create temporary table t6 (a int not null) TYPE=MERGE UNION=(t4,t5);
|
||||
select * from t6;
|
||||
drop table if exists t1, t2, t3, t4, t5, t6;
|
||||
drop table if exists t6, t3, t1, t2, t4, t5;
|
||||
|
||||
#
|
||||
# testing merge::records_in_range and optimizer
|
||||
|
@ -235,5 +235,5 @@ EXPLAIN SELECT * FROM t1 WHERE fileset_id = 2
|
|||
AND file_code BETWEEN '0000000115' AND '0000000120' LIMIT 1;
|
||||
EXPLAIN SELECT * FROM t2 WHERE fileset_id = 2
|
||||
AND file_code = '0000000115' LIMIT 1;
|
||||
DROP TABLE IF EXISTS t1, t2;
|
||||
DROP TABLE IF EXISTS t2, t1;
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ drop table t1;
|
|||
|
||||
CREATE TABLE t1 (a timestamp, b date, c time, d datetime);
|
||||
insert into t1 (b,c,d) values(now(),curtime(),now());
|
||||
select date_format(a,"%Y-%m-%d")=b,right(a,6)=c+0,a=d+0 from t1;
|
||||
select date_format(a,"%Y-%m-%d")=b,right(a+0,6)=c+0,a=d+0 from t1;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
|
|
|
@ -35,7 +35,7 @@ drop table t1;
|
|||
|
||||
create table t1 (ix timestamp);
|
||||
insert into t1 values (19991101000000),(19990102030405),(19990630232922),(19990601000000),(19990930232922),(19990531232922),(19990501000000),(19991101000000),(19990501000000);
|
||||
select * from t1;
|
||||
select ix+0 from t1;
|
||||
drop table t1;
|
||||
|
||||
CREATE TABLE t1 (date date, date_time datetime, time_stamp timestamp);
|
||||
|
|
154
sql/field.cc
154
sql/field.cc
|
@ -2585,10 +2585,10 @@ void Field_double::sql_type(String &res) const
|
|||
Field_timestamp::Field_timestamp(char *ptr_arg, uint32 len_arg,
|
||||
enum utype unireg_check_arg,
|
||||
const char *field_name_arg,
|
||||
struct st_table *table_arg)
|
||||
:Field_num(ptr_arg, len_arg, (uchar*) 0,0,
|
||||
unireg_check_arg, field_name_arg, table_arg,
|
||||
0, 1, 1)
|
||||
struct st_table *table_arg,
|
||||
CHARSET_INFO *cs)
|
||||
:Field_str(ptr_arg, 19, (uchar*) 0,0,
|
||||
unireg_check_arg, field_name_arg, table_arg, cs)
|
||||
{
|
||||
if (table && !table->timestamp_field)
|
||||
{
|
||||
|
@ -2613,35 +2613,6 @@ int Field_timestamp::store(const char *from,uint len,CHARSET_INFO *cs)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void Field_timestamp::fill_and_store(char *from,uint len)
|
||||
{
|
||||
uint res_length;
|
||||
if (len <= field_length)
|
||||
res_length=field_length;
|
||||
else if (len <= 12)
|
||||
res_length=12; /* purecov: inspected */
|
||||
else if (len <= 14)
|
||||
res_length=14; /* purecov: inspected */
|
||||
else
|
||||
res_length=(len+1)/2*2; // must be even
|
||||
if (res_length != len)
|
||||
{
|
||||
bmove_upp(from+res_length,from+len,len);
|
||||
bfill(from,res_length-len,'0');
|
||||
len=res_length;
|
||||
}
|
||||
long tmp=(long) str_to_timestamp(from,len);
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
if (table->db_low_byte_first)
|
||||
{
|
||||
int4store(ptr,tmp);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
longstore(ptr,tmp);
|
||||
}
|
||||
|
||||
|
||||
int Field_timestamp::store(double nr)
|
||||
{
|
||||
int error= 0;
|
||||
|
@ -2752,44 +2723,34 @@ longlong Field_timestamp::val_int(void)
|
|||
time_arg=(time_t) temp;
|
||||
localtime_r(&time_arg,&tm_tmp);
|
||||
l_time=&tm_tmp;
|
||||
res=(longlong) 0;
|
||||
for (pos=len=0; len+1 < (uint) field_length ; len+=2,pos++)
|
||||
{
|
||||
bool year_flag=0;
|
||||
switch (dayord.pos[pos]) {
|
||||
case 0: part_time=l_time->tm_year % 100; year_flag=1 ; break;
|
||||
case 1: part_time=l_time->tm_mon+1; break;
|
||||
case 2: part_time=l_time->tm_mday; break;
|
||||
case 3: part_time=l_time->tm_hour; break;
|
||||
case 4: part_time=l_time->tm_min; break;
|
||||
case 5: part_time=l_time->tm_sec; break;
|
||||
default: part_time=0; break; /* purecov: deadcode */
|
||||
}
|
||||
if (year_flag && (field_length == 8 || field_length == 14))
|
||||
{
|
||||
res=res*(longlong) 10000+(part_time+
|
||||
((part_time < YY_PART_YEAR) ? 2000 : 1900));
|
||||
len+=2;
|
||||
}
|
||||
else
|
||||
res=res*(longlong) 100+part_time;
|
||||
}
|
||||
return (longlong) res;
|
||||
|
||||
part_time= l_time->tm_year % 100;
|
||||
res= ((longlong) (part_time+ ((part_time < YY_PART_YEAR) ? 2000 : 1900))*
|
||||
LL(10000000000));
|
||||
part_time= l_time->tm_mon+1;
|
||||
res+= (longlong) part_time * LL(100000000);
|
||||
part_time=l_time->tm_mday;
|
||||
res+= (longlong) ((long) part_time * 1000000L);
|
||||
part_time=l_time->tm_hour;
|
||||
res+= (longlong) (part_time * 10000L);
|
||||
part_time=l_time->tm_min;
|
||||
res+= (longlong) (part_time * 100);
|
||||
part_time=l_time->tm_sec;
|
||||
return res+part_time;
|
||||
}
|
||||
|
||||
|
||||
String *Field_timestamp::val_str(String *val_buffer,
|
||||
String *val_ptr __attribute__((unused)))
|
||||
{
|
||||
uint pos;
|
||||
int part_time;
|
||||
uint32 temp;
|
||||
uint32 temp, temp2;
|
||||
time_t time_arg;
|
||||
struct tm *l_time;
|
||||
struct tm tm_tmp;
|
||||
|
||||
val_buffer->alloc(field_length+1);
|
||||
char *to=(char*) val_buffer->ptr(),*end=to+field_length;
|
||||
val_buffer->length(field_length);
|
||||
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
if (table->db_low_byte_first)
|
||||
|
@ -2800,41 +2761,53 @@ String *Field_timestamp::val_str(String *val_buffer,
|
|||
|
||||
if (temp == 0L)
|
||||
{ /* Zero time is "000000" */
|
||||
VOID(strfill(to,field_length,'0'));
|
||||
val_buffer->length(field_length);
|
||||
strmov(to, "0000-00-00 00:00:00");
|
||||
return val_buffer;
|
||||
}
|
||||
time_arg=(time_t) temp;
|
||||
localtime_r(&time_arg,&tm_tmp);
|
||||
l_time=&tm_tmp;
|
||||
for (pos=0; to < end ; pos++)
|
||||
|
||||
temp= l_time->tm_year % 100;
|
||||
if (temp < YY_PART_YEAR)
|
||||
{
|
||||
bool year_flag=0;
|
||||
switch (dayord.pos[pos]) {
|
||||
case 0: part_time=l_time->tm_year % 100; year_flag=1; break;
|
||||
case 1: part_time=l_time->tm_mon+1; break;
|
||||
case 2: part_time=l_time->tm_mday; break;
|
||||
case 3: part_time=l_time->tm_hour; break;
|
||||
case 4: part_time=l_time->tm_min; break;
|
||||
case 5: part_time=l_time->tm_sec; break;
|
||||
default: part_time=0; break; /* purecov: deadcode */
|
||||
}
|
||||
if (year_flag && (field_length == 8 || field_length == 14))
|
||||
{
|
||||
if (part_time < YY_PART_YEAR)
|
||||
{
|
||||
*to++='2'; *to++='0'; /* purecov: inspected */
|
||||
}
|
||||
else
|
||||
{
|
||||
*to++='1'; *to++='9';
|
||||
}
|
||||
}
|
||||
*to++=(char) ('0'+((uint) part_time/10));
|
||||
*to++=(char) ('0'+((uint) part_time % 10));
|
||||
*to++= '2';
|
||||
*to++= '0';
|
||||
}
|
||||
*to=0; // Safeguard
|
||||
val_buffer->length((uint) (to-val_buffer->ptr()));
|
||||
else
|
||||
{
|
||||
*to++= '1';
|
||||
*to++= '9';
|
||||
}
|
||||
temp2=temp/10; temp=temp-temp2*10;
|
||||
*to++= (char) ('0'+(char) (temp2));
|
||||
*to++= (char) ('0'+(char) (temp));
|
||||
*to++= '-';
|
||||
temp=l_time->tm_mon+1;
|
||||
temp2=temp/10; temp=temp-temp2*10;
|
||||
*to++= (char) ('0'+(char) (temp2));
|
||||
*to++= (char) ('0'+(char) (temp));
|
||||
*to++= '-';
|
||||
temp=l_time->tm_mday;
|
||||
temp2=temp/10; temp=temp-temp2*10;
|
||||
*to++= (char) ('0'+(char) (temp2));
|
||||
*to++= (char) ('0'+(char) (temp));
|
||||
*to++= ' ';
|
||||
temp=l_time->tm_hour;
|
||||
temp2=temp/10; temp=temp-temp2*10;
|
||||
*to++= (char) ('0'+(char) (temp2));
|
||||
*to++= (char) ('0'+(char) (temp));
|
||||
*to++= ':';
|
||||
temp=l_time->tm_min;
|
||||
temp2=temp/10; temp=temp-temp2*10;
|
||||
*to++= (char) ('0'+(char) (temp2));
|
||||
*to++= (char) ('0'+(char) (temp));
|
||||
*to++= ':';
|
||||
temp=l_time->tm_sec;
|
||||
temp2=temp/10; temp=temp-temp2*10;
|
||||
*to++= (char) ('0'+(char) (temp2));
|
||||
*to++= (char) ('0'+(char) (temp));
|
||||
*to= 0;
|
||||
return val_buffer;
|
||||
}
|
||||
|
||||
|
@ -2929,10 +2902,7 @@ void Field_timestamp::sort_string(char *to,uint length __attribute__((unused)))
|
|||
|
||||
void Field_timestamp::sql_type(String &res) const
|
||||
{
|
||||
ulong length= my_sprintf((char*) res.ptr(),
|
||||
((char*) res.ptr(),"timestamp(%d)",
|
||||
(int) field_length));
|
||||
res.length(length);
|
||||
res.set("timestamp", 9, default_charset_info);
|
||||
}
|
||||
|
||||
|
||||
|
@ -5310,7 +5280,7 @@ Field *make_field(char *ptr, uint32 field_length,
|
|||
f_is_dec(pack_flag) == 0);
|
||||
case FIELD_TYPE_TIMESTAMP:
|
||||
return new Field_timestamp(ptr,field_length,
|
||||
unireg_check, field_name, table);
|
||||
unireg_check, field_name, table, field_charset);
|
||||
case FIELD_TYPE_YEAR:
|
||||
return new Field_year(ptr,field_length,null_pos,null_bit,
|
||||
unireg_check, field_name, table);
|
||||
|
|
|
@ -561,14 +561,15 @@ public:
|
|||
};
|
||||
|
||||
|
||||
class Field_timestamp :public Field_num {
|
||||
class Field_timestamp :public Field_str {
|
||||
public:
|
||||
Field_timestamp(char *ptr_arg, uint32 len_arg,
|
||||
enum utype unireg_check_arg, const char *field_name_arg,
|
||||
struct st_table *table_arg);
|
||||
enum Item_result result_type () const { return field_length == 8 || field_length == 14 ? INT_RESULT : STRING_RESULT; }
|
||||
struct st_table *table_arg,
|
||||
CHARSET_INFO *cs);
|
||||
enum_field_types type() const { return FIELD_TYPE_TIMESTAMP;}
|
||||
enum ha_base_keytype key_type() const { return HA_KEYTYPE_ULONG_INT; }
|
||||
enum Item_result cmp_type () const { return INT_RESULT; }
|
||||
int store(const char *to,uint length,CHARSET_INFO *charset);
|
||||
int store(double nr);
|
||||
int store(longlong nr);
|
||||
|
@ -598,7 +599,6 @@ public:
|
|||
longget(tmp,ptr);
|
||||
return tmp;
|
||||
}
|
||||
void fill_and_store(char *from,uint len);
|
||||
bool get_date(TIME *ltime,bool fuzzydate);
|
||||
bool get_time(TIME *ltime);
|
||||
};
|
||||
|
|
13
sql/item.cc
13
sql/item.cc
|
@ -873,8 +873,15 @@ bool Item::send(Protocol *protocol, String *buffer)
|
|||
|
||||
switch ((type=field_type())) {
|
||||
default:
|
||||
DBUG_ASSERT(1);
|
||||
/* If not assert on, send as a string */
|
||||
case MYSQL_TYPE_NULL:
|
||||
case MYSQL_TYPE_DECIMAL:
|
||||
case MYSQL_TYPE_ENUM:
|
||||
case MYSQL_TYPE_SET:
|
||||
case MYSQL_TYPE_TINY_BLOB:
|
||||
case MYSQL_TYPE_MEDIUM_BLOB:
|
||||
case MYSQL_TYPE_LONG_BLOB:
|
||||
case MYSQL_TYPE_BLOB:
|
||||
case MYSQL_TYPE_GEOMETRY:
|
||||
case MYSQL_TYPE_STRING:
|
||||
case MYSQL_TYPE_VAR_STRING:
|
||||
{
|
||||
|
@ -899,6 +906,7 @@ bool Item::send(Protocol *protocol, String *buffer)
|
|||
result= protocol->store_short(nr);
|
||||
break;
|
||||
}
|
||||
case MYSQL_TYPE_INT24:
|
||||
case MYSQL_TYPE_LONG:
|
||||
{
|
||||
longlong nr;
|
||||
|
@ -925,6 +933,7 @@ bool Item::send(Protocol *protocol, String *buffer)
|
|||
}
|
||||
case MYSQL_TYPE_DATETIME:
|
||||
case MYSQL_TYPE_DATE:
|
||||
case MYSQL_TYPE_TIMESTAMP:
|
||||
{
|
||||
TIME tm;
|
||||
get_date(&tm, 1);
|
||||
|
|
|
@ -565,6 +565,7 @@ public:
|
|||
|
||||
class Item_copy_string :public Item
|
||||
{
|
||||
enum enum_field_types cached_field_type;
|
||||
public:
|
||||
Item *item;
|
||||
Item_copy_string(Item *i) :item(i)
|
||||
|
@ -573,11 +574,12 @@ public:
|
|||
decimals=item->decimals;
|
||||
max_length=item->max_length;
|
||||
name=item->name;
|
||||
cached_field_type= item->field_type();
|
||||
}
|
||||
~Item_copy_string() { delete item; }
|
||||
enum Type type() const { return COPY_STR_ITEM; }
|
||||
enum Item_result result_type () const { return STRING_RESULT; }
|
||||
enum_field_types field_type() const { return MYSQL_TYPE_STRING; }
|
||||
enum_field_types field_type() const { return cached_field_type; }
|
||||
double val()
|
||||
{ return null_value ? 0.0 : my_strntod(str_value.charset(),str_value.ptr(),str_value.length(),NULL); }
|
||||
longlong val_int()
|
||||
|
|
|
@ -1945,6 +1945,7 @@ static user_var_entry *get_variable(HASH *hash, LEX_STRING &name,
|
|||
bool Item_func_set_user_var::fix_fields(THD *thd, TABLE_LIST *tables,
|
||||
Item **ref)
|
||||
{
|
||||
/* fix_fields will call Item_func_set_user_var::fix_length_and_dec */
|
||||
if (Item_func::fix_fields(thd, tables, ref) ||
|
||||
!(entry= get_variable(&thd->user_vars, name, 1)))
|
||||
return 1;
|
||||
|
|
|
@ -940,6 +940,11 @@ public:
|
|||
void fix_length_and_dec();
|
||||
void print(String *str);
|
||||
enum Item_result result_type() const;
|
||||
/*
|
||||
We must always return variables as strings to guard against selects of type
|
||||
select @t1:=1,@t1,@t:="hello",@t from foo where (@t1:= t2.b)
|
||||
*/
|
||||
enum_field_types field_type() const { return MYSQL_TYPE_STRING; }
|
||||
const char *func_name() const { return "get_user_var"; }
|
||||
bool const_item() const { return const_var_flag; }
|
||||
table_map used_tables() const
|
||||
|
|
|
@ -295,8 +295,8 @@ longlong Item_func_time_to_sec::val_int()
|
|||
|
||||
|
||||
/*
|
||||
** Convert a string to a interval value
|
||||
** To make code easy, allow interval objects without separators.
|
||||
Convert a string to a interval value
|
||||
To make code easy, allow interval objects without separators.
|
||||
*/
|
||||
|
||||
static bool get_interval_value(Item *args,interval_type int_type,
|
||||
|
@ -516,12 +516,14 @@ void Item_func_curtime::fix_length_and_dec()
|
|||
(int) start->tm_sec);
|
||||
}
|
||||
|
||||
|
||||
String *Item_func_now::val_str(String *str)
|
||||
{
|
||||
str_value.set(buff,buff_length,thd_charset());
|
||||
return &str_value;
|
||||
}
|
||||
|
||||
|
||||
void Item_func_now::fix_length_and_dec()
|
||||
{
|
||||
struct tm tm_tmp,*start;
|
||||
|
@ -540,13 +542,14 @@ void Item_func_now::fix_length_and_dec()
|
|||
(ulong) (((uint) start->tm_min)*100L+
|
||||
(uint) start->tm_sec)));
|
||||
|
||||
buff_length= (uint) cs->snprintf(cs,buff, sizeof(buff),"%04d-%02d-%02d %02d:%02d:%02d",
|
||||
((int) (start->tm_year+1900)) % 10000,
|
||||
(int) start->tm_mon+1,
|
||||
(int) start->tm_mday,
|
||||
(int) start->tm_hour,
|
||||
(int) start->tm_min,
|
||||
(int) start->tm_sec);
|
||||
buff_length= (uint) cs->snprintf(cs,buff, sizeof(buff),
|
||||
"%04d-%02d-%02d %02d:%02d:%02d",
|
||||
((int) (start->tm_year+1900)) % 10000,
|
||||
(int) start->tm_mon+1,
|
||||
(int) start->tm_mday,
|
||||
(int) start->tm_hour,
|
||||
(int) start->tm_min,
|
||||
(int) start->tm_sec);
|
||||
/* For getdate */
|
||||
ltime.year= start->tm_year+1900;
|
||||
ltime.month= start->tm_mon+1;
|
||||
|
@ -995,7 +998,42 @@ bool Item_func_from_unixtime::get_date(TIME *ltime,
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* Here arg[1] is a Item_interval object */
|
||||
|
||||
void Item_date_add_interval::fix_length_and_dec()
|
||||
{
|
||||
enum_field_types arg0_field_type;
|
||||
set_charset(thd_charset());
|
||||
maybe_null=1;
|
||||
max_length=19*thd_charset()->mbmaxlen;
|
||||
value.alloc(32);
|
||||
|
||||
/*
|
||||
The field type for the result of an Item_date function is defined as
|
||||
follows:
|
||||
|
||||
- If first arg is a MYSQL_TYPE_DATETIME result is MYSQL_TYPE_DATETIME
|
||||
- If first arg is a MYSQL_TYPE_DATE and the interval type uses hours,
|
||||
minutes or seconds then type is MYSQL_TYPE_DATETIME.
|
||||
- Otherwise the result is MYSQL_TYPE_STRING
|
||||
(This is because you can't know if the string contains a DATE, TIME or
|
||||
DATETIME argument)
|
||||
*/
|
||||
cached_field_type= MYSQL_TYPE_STRING;
|
||||
arg0_field_type= args[0]->field_type();
|
||||
if (arg0_field_type == MYSQL_TYPE_DATETIME ||
|
||||
arg0_field_type == MYSQL_TYPE_TIMESTAMP)
|
||||
cached_field_type= MYSQL_TYPE_DATETIME;
|
||||
else if (arg0_field_type == MYSQL_TYPE_DATE)
|
||||
{
|
||||
if (int_type <= INTERVAL_MONTH || int_type == INTERVAL_YEAR_MONTH)
|
||||
cached_field_type= arg0_field_type;
|
||||
else
|
||||
cached_field_type= MYSQL_TYPE_DATETIME;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Here arg[1] is a Item_interval object */
|
||||
|
||||
bool Item_date_add_interval::get_date(TIME *ltime, bool fuzzy_date)
|
||||
{
|
||||
|
|
|
@ -443,7 +443,6 @@ class Item_func_from_unixtime :public Item_date_func
|
|||
decimals=0;
|
||||
max_length=19*thd_charset()->mbmaxlen;
|
||||
}
|
||||
// enum Item_result result_type () const { return STRING_RESULT; }
|
||||
bool get_date(TIME *res,bool fuzzy_date);
|
||||
};
|
||||
|
||||
|
@ -470,32 +469,34 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
/*
|
||||
The following must be sorted so that simple intervals comes first.
|
||||
(get_interval_value() depends on this)
|
||||
*/
|
||||
|
||||
enum interval_type
|
||||
{
|
||||
INTERVAL_YEAR, INTERVAL_MONTH, INTERVAL_DAY, INTERVAL_HOUR, INTERVAL_MINUTE,
|
||||
INTERVAL_SECOND, INTERVAL_YEAR_MONTH, INTERVAL_DAY_HOUR, INTERVAL_DAY_MINUTE,
|
||||
INTERVAL_DAY_SECOND, INTERVAL_HOUR_MINUTE, INTERVAL_HOUR_SECOND,
|
||||
INTERVAL_MINUTE_SECOND
|
||||
};
|
||||
|
||||
enum interval_type { INTERVAL_YEAR, INTERVAL_MONTH, INTERVAL_DAY,
|
||||
INTERVAL_HOUR, INTERVAL_MINUTE, INTERVAL_SECOND,
|
||||
INTERVAL_YEAR_MONTH, INTERVAL_DAY_HOUR,
|
||||
INTERVAL_DAY_MINUTE, INTERVAL_DAY_SECOND,
|
||||
INTERVAL_HOUR_MINUTE, INTERVAL_HOUR_SECOND,
|
||||
INTERVAL_MINUTE_SECOND};
|
||||
|
||||
class Item_date_add_interval :public Item_date_func
|
||||
{
|
||||
const interval_type int_type;
|
||||
String value;
|
||||
const bool date_sub_interval;
|
||||
enum_field_types cached_field_type;
|
||||
|
||||
public:
|
||||
Item_date_add_interval(Item *a,Item *b,interval_type type_arg,bool neg_arg)
|
||||
:Item_date_func(a,b),int_type(type_arg), date_sub_interval(neg_arg) {}
|
||||
String *val_str(String *);
|
||||
const char *func_name() const { return "date_add_interval"; }
|
||||
void fix_length_and_dec()
|
||||
{
|
||||
set_charset(thd_charset());
|
||||
maybe_null=1;
|
||||
max_length=19*thd_charset()->mbmaxlen;
|
||||
value.alloc(32);
|
||||
}
|
||||
void fix_length_and_dec();
|
||||
enum_field_types field_type() const { return cached_field_type; }
|
||||
double val() { return (double) val_int(); }
|
||||
longlong val_int();
|
||||
bool get_date(TIME *res,bool fuzzy_date);
|
||||
|
|
|
@ -1537,7 +1537,7 @@ static void start_signal_handler(void)
|
|||
(void) pthread_attr_setdetachstate(&thr_attr,PTHREAD_CREATE_DETACHED);
|
||||
if (!(opt_specialflag & SPECIAL_NO_PRIOR))
|
||||
my_pthread_attr_setprio(&thr_attr,INTERRUPT_PRIOR);
|
||||
pthread_attr_setstacksize(&thr_attr,32768);
|
||||
pthread_attr_setstacksize(&thr_attr, 129*1024);
|
||||
#endif
|
||||
|
||||
(void) pthread_mutex_lock(&LOCK_thread_count);
|
||||
|
|
|
@ -577,18 +577,19 @@ bool Protocol::store(I_List<i_string>* str_list)
|
|||
{
|
||||
char buf[256];
|
||||
String tmp(buf, sizeof(buf), default_charset_info);
|
||||
tmp.length(0);
|
||||
uint32 len;
|
||||
I_List_iterator<i_string> it(*str_list);
|
||||
i_string* s;
|
||||
|
||||
tmp.length(0);
|
||||
while ((s=it++))
|
||||
{
|
||||
if (tmp.length())
|
||||
tmp.append(',');
|
||||
tmp.append(s->ptr);
|
||||
tmp.append(',');
|
||||
}
|
||||
|
||||
return store((char*) tmp.ptr(), tmp.length());
|
||||
if ((len= tmp.length()))
|
||||
len--; // Remove last ','
|
||||
return store((char*) tmp.ptr(), len);
|
||||
}
|
||||
|
||||
|
||||
|
@ -623,8 +624,9 @@ bool Protocol_simple::store(const char *from, uint length)
|
|||
{
|
||||
#ifndef DEBUG_OFF
|
||||
DBUG_ASSERT(field_types == 0 ||
|
||||
field_types[field_pos] == MYSQL_TYPE_STRING ||
|
||||
field_types[field_pos] == MYSQL_TYPE_VAR_STRING);
|
||||
field_types[field_pos] == MYSQL_TYPE_DECIMAL ||
|
||||
(field_types[field_pos] >= MYSQL_TYPE_ENUM &&
|
||||
field_types[field_pos] <= MYSQL_TYPE_GEOMETRY));
|
||||
field_pos++;
|
||||
#endif
|
||||
if (convert)
|
||||
|
@ -702,11 +704,11 @@ bool Protocol_simple::store(double from, uint32 decimals, String *buffer)
|
|||
|
||||
bool Protocol_simple::store(Field *field)
|
||||
{
|
||||
if (field->is_null())
|
||||
return store_null();
|
||||
#ifndef DEBUG_OFF
|
||||
field_pos++;
|
||||
#endif
|
||||
if (field->is_null())
|
||||
return store_null();
|
||||
char buff[MAX_FIELD_WIDTH];
|
||||
String tmp(buff,sizeof(buff),default_charset_info);
|
||||
field->val_str(&tmp,&tmp);
|
||||
|
@ -720,7 +722,9 @@ bool Protocol_simple::store(TIME *tm)
|
|||
{
|
||||
#ifndef DEBUG_OFF
|
||||
DBUG_ASSERT(field_types == 0 ||
|
||||
field_types[field_pos++] == MYSQL_TYPE_DATETIME);
|
||||
field_types[field_pos] == MYSQL_TYPE_DATETIME ||
|
||||
field_types[field_pos] == MYSQL_TYPE_TIMESTAMP);
|
||||
field_pos++;
|
||||
#endif
|
||||
char buff[40];
|
||||
uint length;
|
||||
|
@ -759,7 +763,7 @@ bool Protocol_simple::store_time(TIME *tm)
|
|||
#endif
|
||||
char buff[40];
|
||||
uint length;
|
||||
length= my_sprintf(buff,(buff, "%s%ld:%02d:%02d",
|
||||
length= my_sprintf(buff,(buff, "%s%02ld:%02d:%02d",
|
||||
tm->neg ? "-" : "",
|
||||
(long) tm->day*3600L+(long) tm->hour,
|
||||
(int) tm->minute,
|
||||
|
@ -796,8 +800,9 @@ bool Protocol_prep::store(const char *from,uint length)
|
|||
{
|
||||
#ifndef DEBUG_OFF
|
||||
DBUG_ASSERT(field_types == 0 ||
|
||||
field_types[field_pos] == MYSQL_TYPE_STRING ||
|
||||
field_types[field_pos] == MYSQL_TYPE_VAR_STRING);
|
||||
field_types[field_pos] == MYSQL_TYPE_DECIMAL ||
|
||||
(field_types[field_pos] >= MYSQL_TYPE_ENUM &&
|
||||
field_types[field_pos] <= MYSQL_TYPE_GEOMETRY));
|
||||
#endif
|
||||
field_pos++;
|
||||
if (convert)
|
||||
|
@ -922,7 +927,8 @@ bool Protocol_prep::store(TIME *tm)
|
|||
#ifndef DEBUG_OFF
|
||||
DBUG_ASSERT(field_types == 0 ||
|
||||
field_types[field_pos] == MYSQL_TYPE_DATETIME ||
|
||||
field_types[field_pos] == MYSQL_TYPE_DATE);
|
||||
field_types[field_pos] == MYSQL_TYPE_DATE ||
|
||||
field_types[field_pos] == MYSQL_TYPE_TIMESTAMP);
|
||||
#endif
|
||||
char buff[12],*pos;
|
||||
uint length;
|
||||
|
|
|
@ -992,8 +992,12 @@ bool sys_var_thd_conv_charset::update(THD *thd, set_var *var)
|
|||
if (var->type == OPT_GLOBAL)
|
||||
global_system_variables.convert_set= var->save_result.convert;
|
||||
else
|
||||
{
|
||||
thd->lex.convert_set= thd->variables.convert_set=
|
||||
var->save_result.convert;
|
||||
thd->protocol_simple.init(thd);
|
||||
thd->protocol_prep.init(thd);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -310,30 +310,7 @@ void field_str::add()
|
|||
was_maybe_zerofill = num_info.maybe_zerofill;
|
||||
}
|
||||
|
||||
if (room_in_tree)
|
||||
{
|
||||
if (res != &s)
|
||||
s.copy(*res);
|
||||
if (!tree_search(&tree, (void*) &s, tree.custom_arg)) // If not in tree
|
||||
{
|
||||
s.copy(); // slow, when SAFE_MALLOC is in use
|
||||
if (!tree_insert(&tree, (void*) &s, 0, tree.custom_arg))
|
||||
{
|
||||
room_in_tree = 0; // Remove tree, out of RAM ?
|
||||
delete_tree(&tree);
|
||||
}
|
||||
else
|
||||
{
|
||||
bzero((char*) &s, sizeof(s)); // Let tree handle free of this
|
||||
if ((treemem += length) > pc->max_treemem)
|
||||
{
|
||||
room_in_tree = 0; // Remove tree, too big tree
|
||||
delete_tree(&tree);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Update min and max arguments */
|
||||
if (!found)
|
||||
{
|
||||
found = 1;
|
||||
|
@ -364,6 +341,31 @@ void field_str::add()
|
|||
max_arg.copy(*res);
|
||||
}
|
||||
}
|
||||
|
||||
if (room_in_tree)
|
||||
{
|
||||
if (res != &s)
|
||||
s.copy(*res);
|
||||
if (!tree_search(&tree, (void*) &s, tree.custom_arg)) // If not in tree
|
||||
{
|
||||
s.copy(); // slow, when SAFE_MALLOC is in use
|
||||
if (!tree_insert(&tree, (void*) &s, 0, tree.custom_arg))
|
||||
{
|
||||
room_in_tree = 0; // Remove tree, out of RAM ?
|
||||
delete_tree(&tree);
|
||||
}
|
||||
else
|
||||
{
|
||||
bzero((char*) &s, sizeof(s)); // Let tree handle free of this
|
||||
if ((treemem += length) > pc->max_treemem)
|
||||
{
|
||||
room_in_tree = 0; // Remove tree, too big tree
|
||||
delete_tree(&tree);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((num_info.zerofill && (max_length != min_length)) ||
|
||||
(was_zero_fill && (max_length != min_length)))
|
||||
can_be_still_num = 0; // zerofilled numbers must be of same length
|
||||
|
|
|
@ -520,6 +520,7 @@ bool select_send::send_data(List<Item> &items)
|
|||
if (unit->offset_limit_cnt)
|
||||
{ // using limit offset,count
|
||||
unit->offset_limit_cnt--;
|
||||
return 0;
|
||||
}
|
||||
|
||||
List_iterator_fast<Item> li(items);
|
||||
|
|
|
@ -158,7 +158,7 @@ my_bool mysqld_show_warnings(THD *thd, ulong levels_to_show)
|
|||
DBUG_ENTER("mysqld_show_warnings");
|
||||
|
||||
field_list.push_back(new Item_empty_string("Level", 7));
|
||||
field_list.push_back(new Item_int("Code",0,4));
|
||||
field_list.push_back(new Item_return_int("Code",4, MYSQL_TYPE_LONG));
|
||||
field_list.push_back(new Item_empty_string("Message",MYSQL_ERRMSG_SIZE));
|
||||
|
||||
if (thd->protocol->send_fields(&field_list,1))
|
||||
|
|
|
@ -1043,7 +1043,6 @@ int show_binlog_info(THD* thd)
|
|||
DBUG_RETURN(-1);
|
||||
protocol->prepare_for_resend();
|
||||
|
||||
|
||||
if (mysql_bin_log.is_open())
|
||||
{
|
||||
LOG_INFO li;
|
||||
|
@ -1103,8 +1102,8 @@ int show_binlogs(THD* thd)
|
|||
/* The file ends with EOF or empty line */
|
||||
while ((length=my_b_gets(index_file, fname, sizeof(fname))) > 1)
|
||||
{
|
||||
protocol->prepare_for_resend();
|
||||
int dir_len = dirname_length(fname);
|
||||
packet->length(0);
|
||||
/* The -1 is for removing newline from fname */
|
||||
protocol->store(fname + dir_len, length-1-dir_len);
|
||||
if (protocol->write())
|
||||
|
|
|
@ -3047,6 +3047,7 @@ join_free(JOIN *join, bool full)
|
|||
if (join->tables > join->const_tables) // Test for not-const tables
|
||||
free_io_cache(join->table[join->const_tables]);
|
||||
if (join->select_lex->dependent && !full)
|
||||
{
|
||||
for (tab=join->join_tab,end=tab+join->tables ; tab != end ; tab++)
|
||||
{
|
||||
if (tab->table)
|
||||
|
@ -3061,6 +3062,7 @@ join_free(JOIN *join, bool full)
|
|||
tab->table->file->index_end();
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (tab=join->join_tab,end=tab+join->tables ; tab != end ; tab++)
|
||||
|
@ -3078,6 +3080,11 @@ join_free(JOIN *join, bool full)
|
|||
/* Don't free index if we are using read_record */
|
||||
if (!tab->read_record.table)
|
||||
tab->table->file->index_end();
|
||||
/*
|
||||
We need to reset this for next select
|
||||
(Tested in part_of_refkey)
|
||||
*/
|
||||
tab->table->reginfo.join_tab= 0;
|
||||
}
|
||||
end_read_record(&tab->read_record);
|
||||
}
|
||||
|
@ -7487,9 +7494,8 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order,
|
|||
item_list.push_back(new Item_string(join->select_lex->type,
|
||||
strlen(join->select_lex->type),
|
||||
default_charset_info));
|
||||
Item *empty= new Item_empty_string("",0);
|
||||
for (uint i=0 ; i < 7; i++)
|
||||
item_list.push_back(empty);
|
||||
item_list.push_back(item_null);
|
||||
item_list.push_back(new Item_string(message,strlen(message),
|
||||
default_charset_info));
|
||||
if (result->send_data(item_list))
|
||||
|
|
|
@ -802,6 +802,7 @@ mysqld_show_create(THD *thd, TABLE_LIST *table_list)
|
|||
DBUG_RETURN(1);
|
||||
protocol->prepare_for_resend();
|
||||
protocol->store(table->table_name);
|
||||
buffer.length(0);
|
||||
if (store_create_info(thd, table, &buffer))
|
||||
DBUG_RETURN(-1);
|
||||
protocol->store(buffer.ptr(), buffer.length());
|
||||
|
|
Loading…
Reference in a new issue