mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-03 14:33:32 +03:00 
			
		
		
		
	This is backport of 25ad623d64 for 10.2.
The issue is similar to the one from MDEV-13240. Item::save_in_field()
returns an error during tmp table population in a create table from select query
as we try to save an empty string as a date value when
force_return_blank is set to true for window functions.
    MDEV-13240 Wrong warning with MAX(datetime_field) OVER (...)
    The problem resided in Item_window_func implementation,
    and it was revealed by bb-10.2-ext specific changes:
    Item_window_func::save_in_field() works differently in bb-10.2-ext vs 10.2:
    - 10.2 goes through val_str()
    - bb-10.2-ext goes through get_date(), due to Type_handler related changes.
      get_date() tries to convert empty string to DATETIME, hence the warning.
    During a discussion with Vicentiu, it was decided to fix
    Item_window_func::val_xxx() to return NULL
    (instead of an "empty" value, such as 0 for numbers and '' for strings)
    when force_return_blank is set.
		
	
		
			
				
	
	
		
			80 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
CREATE TABLE t1 (c1 INT, c2 VARCHAR(30));
 | 
						|
 | 
						|
PREPARE populate_table FROM "INSERT into t1 values (1, 'manual_insert_1'),
 | 
						|
                                                   (4, 'manual_insert_2')";
 | 
						|
 | 
						|
INSERT INTO t1 SELECT row_number() over(), "should_not_add_any_rows" FROM t1;
 | 
						|
INSERT INTO t1 SELECT 1 + row_number() over(), "should_not_add_any_rows" FROM t1;
 | 
						|
 | 
						|
EXECUTE populate_table;
 | 
						|
 | 
						|
INSERT INTO t1 SELECT 10 + row_number() over(), "should repeat 2 times [11-12]" FROM t1;
 | 
						|
 | 
						|
SELECT c1, c2 FROM t1 ORDER BY c2, c1;
 | 
						|
 | 
						|
DELETE FROM t1;
 | 
						|
EXECUTE populate_table;
 | 
						|
 | 
						|
 | 
						|
INSERT INTO t1
 | 
						|
    SELECT 10 + (dense_rank() over(order by c1)), "dense_rank_insert" from t1;
 | 
						|
 | 
						|
SELECT c1, c2 FROM t1 ORDER BY c2, c1;
 | 
						|
 | 
						|
DELETE FROM t1;
 | 
						|
EXECUTE populate_table;
 | 
						|
 | 
						|
INSERT INTO t1
 | 
						|
    SELECT 100 + (rank() over(order by c1)), "rank_insert" from t1;
 | 
						|
 | 
						|
SELECT c1, c2 FROM t1 ORDER BY c2, c1;
 | 
						|
 | 
						|
DELETE FROM t1;
 | 
						|
EXECUTE populate_table;
 | 
						|
 | 
						|
INSERT INTO t1
 | 
						|
    SELECT 100 + (ntile(10) over(order by c1)), "ntile_insert" from t1;
 | 
						|
 | 
						|
SELECT c1, c2 FROM t1 ORDER BY c2, c1;
 | 
						|
 | 
						|
DELETE FROM t1;
 | 
						|
EXECUTE populate_table;
 | 
						|
 | 
						|
INSERT INTO t1
 | 
						|
    SELECT 1000 + (percent_rank() over(order by c1)), "percent_rank_insert" from t1;
 | 
						|
 | 
						|
SELECT c1, c2 FROM t1 ORDER BY c2, c1;
 | 
						|
 | 
						|
DELETE FROM t1;
 | 
						|
EXECUTE populate_table;
 | 
						|
 | 
						|
INSERT INTO t1
 | 
						|
    SELECT 1000 + (count(*) over(order by c1)), "count_insert" from t1;
 | 
						|
 | 
						|
SELECT c1, c2 FROM t1 ORDER BY c2, c1;
 | 
						|
 | 
						|
DELETE FROM t1;
 | 
						|
EXECUTE populate_table;
 | 
						|
 | 
						|
--echo #
 | 
						|
--echo # Test how avg interacts when the results need to be rounded.
 | 
						|
--echo #
 | 
						|
SELECT 1000 + (avg(c1) over(order by c1)) as avg_expr, c1, "This will be inserted into t1" from t1;
 | 
						|
 | 
						|
INSERT INTO t1
 | 
						|
    SELECT 1000 + (avg(c1) over(order by c1)), "avg_insert" from t1;
 | 
						|
 | 
						|
SELECT c1, c2 FROM t1 ORDER BY c2, c1;
 | 
						|
 | 
						|
DELETE FROM t1;
 | 
						|
EXECUTE populate_table;
 | 
						|
 | 
						|
INSERT INTO t1
 | 
						|
    SELECT 1000 + (sum(c1) over(order by c1)), "sum_insert" from t1;
 | 
						|
 | 
						|
SELECT c1, c2
 | 
						|
FROM t1
 | 
						|
ORDER BY c2, c1;
 | 
						|
 | 
						|
DROP table t1;
 |