You've already forked mariadb-columnstore-engine
							
							
				mirror of
				https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
				synced 2025-11-03 17:13:17 +03:00 
			
		
		
		
	The most important fix here is the fix of possible buffer overrun in DATEFORMAT() function. A "%W" format, repeated enough times, would overflow the 256-bytes buffer for result. Now we use ostringstream to construct result and we are safe. Changes in date/time projection functions made me fix difference between us and server behavior. The new, better behavior is reflected in changes in tests' results. Also, there was incorrect logic in TRUNCATE() and ROUND() functions in computing the decimal "shift."
		
			
				
	
	
		
			94 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
#
 | 
						|
# Test Date Functions
 | 
						|
# Author: Bharath, bharath.bokka@mariadb.com
 | 
						|
#
 | 
						|
-- source ../include/have_columnstore.inc
 | 
						|
 | 
						|
--disable_warnings
 | 
						|
DROP DATABASE IF EXISTS mcs92_db;
 | 
						|
--enable_warnings
 | 
						|
 | 
						|
CREATE DATABASE mcs92_db;
 | 
						|
USE mcs92_db;
 | 
						|
 | 
						|
CREATE TABLE t1(t1_d DATE, t1_t TIME, t1_dt DATETIME)ENGINE=Columnstore;
 | 
						|
INSERT INTO t1 VALUES(NULL, NULL, NULL);
 | 
						|
INSERT INTO t1 VALUES('0000-00-00', '00:00:00', '0000-00-00');
 | 
						|
INSERT INTO t1 VALUES('2222-11-11', '12:12:12', '2020-11-11 12:12:12');
 | 
						|
INSERT INTO t1 VALUES('2020-01-01', '11:11:11', '2020-12-31 12:34:56');
 | 
						|
INSERT INTO t1 VALUES('2016-02-01', '11:11:11', '2017-02-01 12:12:12');
 | 
						|
 | 
						|
SELECT t1_d, t1_t, t1_dt, DATEDIFF(t1_dt, t1_d) FROM t1;
 | 
						|
SELECT t1_d, t1_t, t1_dt, DATEDIFF(t1_dt, t1_d) "Datediff in days" FROM t1 WHERE t1_dt > 0;
 | 
						|
SELECT t1_d, t1_t, t1_dt, DAY(t1_dt), DAY(t1_d) FROM t1;
 | 
						|
 | 
						|
SELECT t1_dt, DATE_ADD(t1_dt, INTERVAL 1 SECOND) FROM t1;
 | 
						|
SELECT t1_dt, DATE_ADD(t1_dt, INTERVAL -1 SECOND) FROM t1;
 | 
						|
SELECT t1_dt, DATE_ADD(t1_dt, INTERVAL 1 DAY) FROM t1;
 | 
						|
SELECT t1_dt, DATE_ADD(t1_dt, INTERVAL -1 DAY) FROM t1;
 | 
						|
SELECT t1_dt, DATE_ADD(t1_dt, INTERVAL 1 MONTH) FROM t1;
 | 
						|
SELECT t1_dt, DATE_ADD(t1_dt, INTERVAL -1 MONTH) FROM t1;
 | 
						|
SELECT t1_dt, DATE_ADD(t1_dt, INTERVAL 0 MONTH) FROM t1;
 | 
						|
SELECT t1_dt, DATE_ADD(t1_dt, INTERVAL '2:1' MINUTE_SECOND) FROM t1;
 | 
						|
SELECT t1_dt, DATE_ADD(t1_dt, INTERVAL '-2:1' MINUTE_SECOND) FROM t1;
 | 
						|
SELECT t1_dt, DATE_ADD(t1_dt, INTERVAL '2:-1' MINUTE_SECOND) FROM t1;
 | 
						|
SELECT t1_dt, DATE_ADD(t1_dt, INTERVAL '-2:-1' MINUTE_SECOND) FROM t1;
 | 
						|
SELECT t1_dt, DATE_ADD(t1_dt, INTERVAL '-1 2' DAY_HOUR) FROM t1;
 | 
						|
SELECT t1_dt, DATE_ADD(t1_dt, INTERVAL '1 2' DAY_HOUR) FROM t1;
 | 
						|
SELECT t1_dt, DATE_ADD(t1_dt, INTERVAL '-1 -2' DAY_HOUR) FROM t1;
 | 
						|
SELECT t1_dt, DATE_ADD(t1_dt, INTERVAL '1 -2' DAY_HOUR) FROM t1;
 | 
						|
SELECT t1_dt, DATE_ADD(t1_dt, INTERVAL '1.9' SECOND_MICROSECOND) FROM t1;
 | 
						|
SELECT t1_dt, DATE_ADD(t1_dt, INTERVAL '-1.9' SECOND_MICROSECOND) FROM t1;
 | 
						|
SELECT t1_dt, DATE_ADD(t1_dt, INTERVAL 12 HOUR) FROM t1;
 | 
						|
SELECT t1_dt, DATE_ADD(t1_dt, INTERVAL -1 HOUR) FROM t1;
 | 
						|
 | 
						|
SELECT t1_dt, DATE_SUB(t1_dt, INTERVAL 1 SECOND) FROM t1;
 | 
						|
SELECT t1_dt, DATE_SUB(t1_dt, INTERVAL -1 SECOND) FROM t1;
 | 
						|
SELECT t1_dt, DATE_SUB(t1_dt, INTERVAL 1 DAY) FROM t1;
 | 
						|
SELECT t1_dt, DATE_SUB(t1_dt, INTERVAL -1 DAY) FROM t1;
 | 
						|
SELECT t1_dt, DATE_SUB(t1_dt, INTERVAL 1 MONTH) FROM t1;
 | 
						|
SELECT t1_dt, DATE_SUB(t1_dt, INTERVAL -1 MONTH) FROM t1;
 | 
						|
SELECT t1_dt, DATE_SUB(t1_dt, INTERVAL 0 MONTH) FROM t1;
 | 
						|
SELECT t1_dt, DATE_SUB(t1_dt, INTERVAL '2:1' MINUTE_SECOND) FROM t1;
 | 
						|
SELECT t1_dt, DATE_SUB(t1_dt, INTERVAL '-2:1' MINUTE_SECOND) FROM t1;
 | 
						|
SELECT t1_dt, DATE_SUB(t1_dt, INTERVAL '2:-1' MINUTE_SECOND) FROM t1;
 | 
						|
SELECT t1_dt, DATE_SUB(t1_dt, INTERVAL '-2:-1' MINUTE_SECOND) FROM t1;
 | 
						|
SELECT t1_dt, DATE_SUB(t1_dt, INTERVAL '-1 2' DAY_HOUR) FROM t1;
 | 
						|
SELECT t1_dt, DATE_SUB(t1_dt, INTERVAL '1 2' DAY_HOUR) FROM t1;
 | 
						|
SELECT t1_dt, DATE_SUB(t1_dt, INTERVAL '-1 -2' DAY_HOUR) FROM t1;
 | 
						|
SELECT t1_dt, DATE_SUB(t1_dt, INTERVAL '1 -2' DAY_HOUR) FROM t1;
 | 
						|
SELECT t1_dt, DATE_SUB(t1_dt, INTERVAL '1.9' SECOND_MICROSECOND) FROM t1;
 | 
						|
SELECT t1_dt, DATE_SUB(t1_dt, INTERVAL '-1.9' SECOND_MICROSECOND) FROM t1;
 | 
						|
SELECT t1_dt, DATE_SUB(t1_dt, INTERVAL 12 HOUR) FROM t1;
 | 
						|
SELECT t1_dt, DATE_SUB(t1_dt, INTERVAL -1 HOUR) FROM t1;
 | 
						|
 | 
						|
SELECT t1_dt, DATE_FORMAT(t1_dt, '%Y-%m-%d') a, DATE_FORMAT(t1_d, '%a %D %b %Y') b, DATE_FORMAT(t1_d, '%W %D %M %Y') c FROM t1;
 | 
						|
SELECT t1_dt, DATE_FORMAT(t1_dt, '%Y/%m/%d %T') a, DATE_FORMAT(t1_dt, '%a %D %b %Y %H:%i') b, DATE_FORMAT(t1_dt, '%W %D %M %Y %T') c FROM t1;
 | 
						|
 | 
						|
SELECT @@lc_time_names;
 | 
						|
SELECT t1_dt, DAYNAME(t1_dt), DAYOFWEEK(t1_dt), WEEKDAY(t1_dt) FROM t1;
 | 
						|
SELECT t1_d, DAYNAME(t1_d), DAYOFWEEK(t1_d), WEEKDAY(t1_d) FROM t1;
 | 
						|
 | 
						|
SELECT t1_dt, EXTRACT(SECOND FROM t1_dt) 'SECOND', EXTRACT(DAY_HOUR FROM t1_dt) 'DAY_HOUR', EXTRACT(HOUR FROM t1_dt) 'HOUR', EXTRACT(MINUTE FROM t1_dt) 'MINUTE' FROM t1; 
 | 
						|
# please note that server's 613566753 is much more nonsensical than our new 1.
 | 
						|
# returning NULL would be even more sensible.
 | 
						|
SELECT t1_dt, EXTRACT(DAY FROM t1_dt) 'DAY', EXTRACT(YEAR FROM t1_dt) 'YEAR', EXTRACT(MONTH FROM t1_dt) 'MONTH', EXTRACT(WEEK FROM t1_dt) 'WEEK' FROM t1;
 | 
						|
 | 
						|
SELECT t1_dt, MONTH(t1_dt) FROM t1;
 | 
						|
SELECT t1_dt, t1_t, TIMEDIFF(t1_dt, t1_t) FROM t1;
 | 
						|
SELECT t1_dt, TIMEDIFF(t1_dt, '5555-11-11 12:58:11') FROM t1;
 | 
						|
SELECT t1_t, TIMEDIFF('12:58:11', t1_t) FROM t1;
 | 
						|
 | 
						|
SELECT t1_d, t1_dt, TIMESTAMPDIFF(MONTH, t1_d, t1_dt) FROM t1;
 | 
						|
SELECT t1_d, t1_dt, TIMESTAMPDIFF(DAY, t1_d, t1_dt) FROM t1;
 | 
						|
SELECT t1_d, t1_dt, TIMESTAMPDIFF(MINUTE, t1_d, t1_dt) FROM t1;
 | 
						|
SELECT t1_d, t1_dt, TIMESTAMPDIFF(SECOND, t1_d, t1_dt) FROM t1;
 | 
						|
 | 
						|
# please note that server's 613566753 is much more nonsensical than our new 1.
 | 
						|
# returning NULL would be even more sensible.
 | 
						|
SELECT t1_d, WEEK(t1_d), t1_dt, WEEK(t1_dt) FROM t1;
 | 
						|
SELECT t1_d, YEAR(t1_d), t1_dt, YEAR(t1_dt) FROM t1;
 | 
						|
 | 
						|
# Clean UP
 | 
						|
DROP DATABASE mcs92_db;
 |