type_timestamp.test
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:11k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. #
  2. # Test timestamp
  3. #
  4. --disable_warnings
  5. drop table if exists t1,t2;
  6. --enable_warnings
  7. CREATE TABLE t1 (a int, t timestamp);
  8. CREATE TABLE t2 (a int, t datetime);
  9. SET TIMESTAMP=1234;
  10. insert into t1 values(1,NULL);
  11. insert into t1 values(2,"2002-03-03");
  12. SET TIMESTAMP=1235;
  13. insert into t1 values(3,NULL);
  14. SET TIMESTAMP=1236;
  15. insert into t1 (a) values(4);
  16. insert into t2 values(5,"2002-03-04"),(6,NULL),(7,"2002-03-05"),(8,"00-00-00");
  17. SET TIMESTAMP=1237;
  18. insert into t1 select * from t2;
  19. SET TIMESTAMP=1238;
  20. insert into t1 (a) select a+1 from t2 where a=8;
  21. select * from t1;
  22. drop table t1,t2;
  23. SET TIMESTAMP=1234;
  24. CREATE TABLE t1 (value TEXT NOT NULL, id VARCHAR(32) NOT NULL, stamp timestamp, PRIMARY KEY (id));
  25. INSERT INTO t1 VALUES ("my value", "myKey","1999-04-02 00:00:00");
  26. SELECT stamp FROM t1 WHERE id="myKey";
  27. UPDATE t1 SET value="my value" WHERE id="myKey";
  28. SELECT stamp FROM t1 WHERE id="myKey";
  29. drop table t1;
  30. create table t1 (a timestamp);
  31. insert into t1 values (now());
  32. select date_format(a,"%Y %y"),year(a),year(now()) from t1;
  33. drop table t1;
  34. create table t1 (ix timestamp);
  35. insert into t1 values (19991101000000),(19990102030405),(19990630232922),(19990601000000),(19990930232922),(19990531232922),(19990501000000),(19991101000000),(19990501000000);
  36. select ix+0 from t1;
  37. delete from t1;
  38. insert into t1 values ("19991101000000"),("19990102030405"),("19990630232922"),("19990601000000");
  39. select ix+0 from t1;
  40. drop table t1;
  41. CREATE TABLE t1 (date date, date_time datetime, time_stamp timestamp);
  42. INSERT INTO t1 VALUES ("1998-12-31","1998-12-31 23:59:59",19981231235959);
  43. INSERT INTO t1 VALUES ("1999-01-01","1999-01-01 00:00:00",19990101000000);
  44. INSERT INTO t1 VALUES ("1999-09-09","1999-09-09 23:59:59",19990909235959);
  45. INSERT INTO t1 VALUES ("2000-01-01","2000-01-01 00:00:00",20000101000000);
  46. INSERT INTO t1 VALUES ("2000-02-28","2000-02-28 00:00:00",20000228000000);
  47. INSERT INTO t1 VALUES ("2000-02-29","2000-02-29 00:00:00",20000229000000);
  48. INSERT INTO t1 VALUES ("2000-03-01","2000-03-01 00:00:00",20000301000000);
  49. INSERT INTO t1 VALUES ("2000-12-31","2000-12-31 23:59:59",20001231235959);
  50. INSERT INTO t1 VALUES ("2001-01-01","2001-01-01 00:00:00",20010101000000);
  51. INSERT INTO t1 VALUES ("2004-12-31","2004-12-31 23:59:59",20041231235959);
  52. INSERT INTO t1 VALUES ("2005-01-01","2005-01-01 00:00:00",20050101000000);
  53. INSERT INTO t1 VALUES ("2030-01-01","2030-01-01 00:00:00",20300101000000);
  54. # The following will get you an different answer on 64 bit machines
  55. #INSERT INTO t1 VALUES ("2050-01-01","2050-01-01 00:00:00",20500101000000);
  56. SELECT * FROM t1;
  57. drop table t1;
  58. create table t1 (t2 timestamp(2), t4 timestamp(4), t6 timestamp(6),
  59.                  t8 timestamp(8), t10 timestamp(10), t12 timestamp(12),
  60.                  t14 timestamp(14));
  61. insert t1 values (0,0,0,0,0,0,0),
  62. ("1997-12-31 23:47:59", "1997-12-31 23:47:59", "1997-12-31 23:47:59",
  63. "1997-12-31 23:47:59", "1997-12-31 23:47:59", "1997-12-31 23:47:59",
  64. "1997-12-31 23:47:59");
  65. select * from t1;
  66. select * from t1;
  67. drop table t1;
  68. #
  69. # Let us check if we properly treat wrong datetimes and produce proper warnings
  70. # (for both strings and numbers)
  71. #
  72. create table t1 (ix timestamp);
  73. insert into t1 values (0),(20030101010160),(20030101016001),(20030101240101),(20030132010101),(20031301010101),(20031200000000),(20030000000000);
  74. select ix+0 from t1;
  75. delete from t1;
  76. insert into t1 values ("00000000000000"),("20030101010160"),("20030101016001"),("20030101240101"),("20030132010101"),("20031301010101"),("20031200000000"),("20030000000000");
  77. select ix+0 from t1;
  78. delete from t1;
  79. insert into t1 values ("0000-00-00 00:00:00 some trailer"),("2003-01-01 00:00:00 some trailer");
  80. select ix+0 from t1;
  81. drop table t1;
  82. #
  83. # Test for TIMESTAMP column with default now() and on update now() clauses
  84. #
  85. # These statements should fail.
  86. --error 1293
  87. create table t1 (t1 timestamp, t2 timestamp default now());
  88. --error 1293
  89. create table t1 (t1 timestamp, t2 timestamp on update now());
  90. --error 1293
  91. create table t1 (t1 timestamp, t2 timestamp default now() on update now());
  92. --error 1293
  93. create table t1 (t1 timestamp default now(), t2 timestamp on update now());
  94. --error 1293
  95. create table t1 (t1 timestamp on update now(), t2 timestamp default now() on update now());
  96. # Let us test TIMESTAMP auto-update behaviour
  97. # Also we will test behaviour of TIMESTAMP field in SHOW CREATE TABLE and
  98. # behaviour of DEFAULT literal for such fields
  99. create table t1 (t1 timestamp default '2003-01-01 00:00:00', t2 datetime, t3 timestamp);
  100. SET TIMESTAMP=1000000000;
  101. insert into t1 values ();
  102. SET TIMESTAMP=1000000001;
  103. update t1 set t2=now();
  104. SET TIMESTAMP=1000000002;
  105. insert into t1 (t1,t3) values (default, default);
  106. select * from t1;
  107. show create table t1;
  108. show columns from t1;
  109. drop table t1;
  110. create table t1 (t1 timestamp default now(), t2 datetime, t3 timestamp);
  111. SET TIMESTAMP=1000000002;
  112. insert into t1 values ();
  113. SET TIMESTAMP=1000000003;
  114. update t1 set t2=now();
  115. SET TIMESTAMP=1000000003;
  116. insert into t1 (t1,t3) values (default, default);
  117. select * from t1;
  118. show create table t1;
  119. show columns from t1;
  120. drop table t1;
  121. create table t1 (t1 timestamp default '2003-01-01 00:00:00' on update now(), t2 datetime);
  122. SET TIMESTAMP=1000000004;
  123. insert into t1 values ();
  124. select * from t1;
  125. SET TIMESTAMP=1000000005;
  126. update t1 set t2=now();
  127. SET TIMESTAMP=1000000005;
  128. insert into t1 (t1) values (default);
  129. select * from t1;
  130. show create table t1;
  131. show columns from t1;
  132. drop table t1;
  133. create table t1 (t1 timestamp default now() on update now(), t2 datetime);
  134. SET TIMESTAMP=1000000006;
  135. insert into t1 values ();
  136. select * from t1;
  137. SET TIMESTAMP=1000000007;
  138. update t1 set t2=now();
  139. SET TIMESTAMP=1000000007;
  140. insert into t1 (t1) values (default);
  141. select * from t1;
  142. show create table t1;
  143. show columns from t1;
  144. drop table t1;
  145. create table t1 (t1 timestamp, t2 datetime, t3 timestamp);
  146. SET TIMESTAMP=1000000007;
  147. insert into t1 values ();
  148. select * from t1;
  149. SET TIMESTAMP=1000000008;
  150. update t1 set t2=now();
  151. SET TIMESTAMP=1000000008;
  152. insert into t1 (t1,t3) values (default, default);
  153. select * from t1;
  154. show create table t1;
  155. show columns from t1;
  156. drop table t1;
  157. # Let us test if CURRENT_TIMESTAMP also works well as default value
  158. # (Of course NOW and CURRENT_TIMESTAMP are same for parser but still just
  159. # for demonstartion.)
  160. create table t1 (t1 timestamp default current_timestamp on update current_timestamp, t2 datetime);
  161. SET TIMESTAMP=1000000009;
  162. insert into t1 values ();
  163. select * from t1;
  164. SET TIMESTAMP=1000000010;
  165. update t1 set t2=now();
  166. SET TIMESTAMP=1000000011;
  167. insert into t1 (t1) values (default);
  168. select * from t1;
  169. show create table t1;
  170. show columns from t1;
  171. delete from t1;
  172. # Let us test some cases when auto-set should be disabled or influence
  173. # on server behavior in some other way.
  174. #
  175. # Update statement that explicitly sets field should not auto-set it. 
  176. insert into t1 values ('2004-04-01 00:00:00', '2004-04-01 00:00:00');
  177. SET TIMESTAMP=1000000012;
  178. update t1 set t1= '2004-04-02 00:00:00';
  179. select * from t1;
  180. # The same for multi updates
  181. update t1 as ta, t1 as tb set tb.t1= '2004-04-03 00:00:00';
  182. select * from t1;
  183. drop table t1;
  184. # Now let us test replace it should behave exactly like delete+insert
  185. # Case where optimization is possible DEFAULT = ON UPDATE
  186. create table t1 (pk int primary key, t1 timestamp default current_timestamp on update current_timestamp, bulk int);
  187. insert into t1 values (1, '2004-04-01 00:00:00', 10);
  188. SET TIMESTAMP=1000000013;
  189. replace into t1 set pk = 1, bulk= 20; 
  190. select * from t1;
  191. drop table t1;
  192. # Case in which there should not be optimisation
  193. create table t1 (pk int primary key, t1 timestamp default '2003-01-01 00:00:00' on update current_timestamp, bulk int);
  194. insert into t1 values (1, '2004-04-01 00:00:00', 10);
  195. SET TIMESTAMP=1000000014;
  196. replace into t1 set pk = 1, bulk= 20; 
  197. select * from t1;
  198. drop table t1;
  199. # Other similar case
  200. create table t1 (pk int primary key, t1 timestamp default current_timestamp, bulk int);
  201. insert into t1 values (1, '2004-04-01 00:00:00', 10);
  202. SET TIMESTAMP=1000000015;
  203. replace into t1 set pk = 1, bulk= 20; 
  204. select * from t1;
  205. drop table t1;
  206. # Let us test alter now
  207. create table t1 (t1 timestamp default current_timestamp on update current_timestamp);
  208. insert into t1 values ('2004-04-01 00:00:00');
  209. SET TIMESTAMP=1000000016;
  210. alter table t1 add i int default 10;
  211. select * from t1;
  212. drop table t1;
  213. #
  214. # Test for TIMESTAMP columns which are able to store NULLs
  215. #
  216. # Unlike for default TIMESTAMP fields we don't interpret first field
  217. # in this table as TIMESTAMP with DEFAULT NOW() ON UPDATE NOW() properties.
  218. create table t1 (a timestamp null, b timestamp null);
  219. show create table t1;
  220. insert into t1 values (NULL, NULL);
  221. SET TIMESTAMP=1000000017;
  222. insert into t1 values ();
  223. select * from t1;
  224. drop table t1;
  225. # But explicit auto-set properties still should be OK.
  226. create table t1 (a timestamp null default current_timestamp on update current_timestamp, b timestamp null);
  227. show create table t1;
  228. insert into t1 values (NULL, NULL);
  229. SET TIMESTAMP=1000000018;
  230. insert into t1 values ();
  231. select * from t1;
  232. drop table t1;
  233. # It is also OK to specify NULL as default explicitly for such fields.
  234. # This is also a test for bug #2464, DEFAULT keyword in INSERT statement
  235. # should return default value for column.
  236. create table t1 (a timestamp null default null, b timestamp null default '2003-01-01 00:00:00');
  237. show create table t1;
  238. insert into t1 values (NULL, NULL);
  239. insert into t1 values (DEFAULT, DEFAULT);
  240. select * from t1;
  241. drop table t1;
  242. #
  243. # Let us test behavior of ALTER TABLE when it converts columns 
  244. # containing NULL to TIMESTAMP columns.
  245. #
  246. create table t1 (a bigint, b bigint);
  247. insert into t1 values (NULL, NULL), (20030101000000, 20030102000000);
  248. set timestamp=1000000019;
  249. alter table t1 modify a timestamp, modify b timestamp;
  250. select * from t1;
  251. drop table t1;
  252. #
  253. # Test for bug #4131, TIMESTAMP columns missing minutes and seconds when
  254. # using GROUP BY in @@new=1 mode.
  255. #
  256. create table t1 (a char(2), t timestamp);
  257. insert into t1 values ('a', '2004-01-01 00:00:00'), ('a', '2004-01-01 01:00:00'),
  258.                       ('b', '2004-02-01 00:00:00');
  259. select max(t) from t1 group by a;
  260. drop table t1;
  261. #
  262. # Test for bug #7418 "TIMESTAMP not always converted to DATETIME in MAXDB
  263. # mode". TIMESTAMP columns should be converted DATETIME columns in MAXDB
  264. # mode regardless of whether a display width is given.
  265. #
  266. set sql_mode='maxdb';
  267. create table t1 (a timestamp, b timestamp(19));
  268. show create table t1;
  269. # restore default mode
  270. set sql_mode='';
  271. drop table t1;
  272. #
  273. # Bug#7806 - insert on duplicate key and auto-update of timestamp
  274. #
  275. create table t1 (a int auto_increment primary key, b int, c timestamp);
  276. insert into t1 (a, b, c) values (1, 0, '2001-01-01 01:01:01'),
  277.   (2, 0, '2002-02-02 02:02:02'), (3, 0, '2003-03-03 03:03:03');
  278. select * from t1;
  279. update t1 set b = 2, c = c where a = 2;
  280. select * from t1;
  281. insert into t1 (a) values (4);
  282. select * from t1;
  283. update t1 set c = '2004-04-04 04:04:04' where a = 4;
  284. select * from t1;
  285. insert into t1 (a) values (3), (5) on duplicate key update b = 3, c = c;
  286. select * from t1;
  287. insert into t1 (a, c) values (4, '2004-04-04 00:00:00'),
  288.   (6, '2006-06-06 06:06:06') on duplicate key update b = 4;
  289. select * from t1;
  290. drop table t1;
  291. # End of 4.1 tests