mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-31 10:56:12 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			259 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			259 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| drop table if exists t1,t2;
 | |
| create table t1 (i int, j int, empty_string char(10), bool char(1), d date);
 | |
| insert into t1 values (1,2,"","Y","2002-03-03"), (3,4,"","N","2002-03-04"), (5,6,"","Y","2002-03-04"), (7,8,"","N","2002-03-05");
 | |
| select count(*) from t1 procedure analyse();
 | |
| Field_name	Min_value	Max_value	Min_length	Max_length	Empties_or_zeros	Nulls	Avg_value_or_avg_length	Std	Optimal_fieldtype
 | |
| count(*)	4	4	1	1	0	0	4.0000	0.0000	ENUM('4') NOT NULL
 | |
| select * from t1 procedure analyse();
 | |
| Field_name	Min_value	Max_value	Min_length	Max_length	Empties_or_zeros	Nulls	Avg_value_or_avg_length	Std	Optimal_fieldtype
 | |
| test.t1.i	1	7	1	1	0	0	4.0000	2.2361	ENUM('1','3','5','7') NOT NULL
 | |
| test.t1.j	2	8	1	1	0	0	5.0000	2.2361	ENUM('2','4','6','8') NOT NULL
 | |
| test.t1.empty_string			0	0	4	0	0.0000	NULL	CHAR(0) NOT NULL
 | |
| test.t1.bool	N	Y	1	1	0	0	1.0000	NULL	ENUM('N','Y') NOT NULL
 | |
| test.t1.d	2002-03-03	2002-03-05	10	10	0	0	10.0000	NULL	ENUM('2002-03-03','2002-03-04','2002-03-05') NOT NULL
 | |
| select * from t1 procedure analyse(2);
 | |
| Field_name	Min_value	Max_value	Min_length	Max_length	Empties_or_zeros	Nulls	Avg_value_or_avg_length	Std	Optimal_fieldtype
 | |
| test.t1.i	1	7	1	1	0	0	4.0000	2.2361	TINYINT(1) UNSIGNED NOT NULL
 | |
| test.t1.j	2	8	1	1	0	0	5.0000	2.2361	TINYINT(1) UNSIGNED NOT NULL
 | |
| test.t1.empty_string			0	0	4	0	0.0000	NULL	CHAR(0) NOT NULL
 | |
| test.t1.bool	N	Y	1	1	0	0	1.0000	NULL	ENUM('N','Y') NOT NULL
 | |
| test.t1.d	2002-03-03	2002-03-05	10	10	0	0	10.0000	NULL	ENUM('2002-03-03','2002-03-04','2002-03-05') NOT NULL
 | |
| create table t2 select * from t1 procedure analyse();
 | |
| ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'procedure analyse()' at line 1
 | |
| drop table t1;
 | |
| EXPLAIN SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE();
 | |
| ERROR HY000: Incorrect usage of PROCEDURE and subquery
 | |
| create table t1 (v varchar(128)) charset=latin1;
 | |
| insert into t1 values ('abc'),('abc\'def\\hij\"klm\0opq'),('\''),('\"'),('\\'),('a\0'),('b\''),('c\"'),('d\\'),('\'b'),('\"c'),('\\d'),('a\0\0\0b'),('a\'\'\'\'b'),('a\"\"\"\"b'),('a\\\\\\\\b'),('\'\0\\\"'),('\'\''),('\"\"'),('\\\\'),('The\ZEnd');
 | |
| select * from t1 procedure analyse();
 | |
| Field_name	Min_value	Max_value	Min_length	Max_length	Empties_or_zeros	Nulls	Avg_value_or_avg_length	Std	Optimal_fieldtype
 | |
| test.t1.v	"	\\	1	19	0	0	3.7619	NULL	ENUM('"','""','"c','\'\0\\"','\'','\'\'','\'b','a\0\0\0b','a\0','a""""b','a\'\'\'\'b','abc','abc\'def\\hij"klm\0opq','a\\\\\\\\b','b\'','c"','d\\','The\ZEnd','\\','\\d','\\\\') NOT NULL
 | |
| drop table t1;
 | |
| create table t1 (df decimal(5,1));
 | |
| insert into t1 values(1.1);
 | |
| insert into t1 values(2.2);
 | |
| select * from t1 procedure analyse();
 | |
| Field_name	Min_value	Max_value	Min_length	Max_length	Empties_or_zeros	Nulls	Avg_value_or_avg_length	Std	Optimal_fieldtype
 | |
| test.t1.df	1.1	2.2	13	13	0	0	1.65000	0.55000	ENUM('1.1','2.2') NOT NULL
 | |
| drop table t1;
 | |
| create table t1 (d double);
 | |
| insert into t1 values (100000);
 | |
| select * from t1 procedure analyse (1,1);
 | |
| Field_name	Min_value	Max_value	Min_length	Max_length	Empties_or_zeros	Nulls	Avg_value_or_avg_length	Std	Optimal_fieldtype
 | |
| test.t1.d	100000	100000	6	6	0	0	100000	0	MEDIUMINT(6) UNSIGNED NOT NULL
 | |
| drop table t1;
 | |
| create table t1 (product varchar(32), country_id int not null, year int,
 | |
| profit int);
 | |
| insert into t1  values ( 'Computer', 2,2000, 1200),
 | |
| ( 'TV', 1, 1999, 150),
 | |
| ( 'Calculator', 1, 1999,50),
 | |
| ( 'Computer', 1, 1999,1500),
 | |
| ( 'Computer', 1, 2000,1500),
 | |
| ( 'TV', 1, 2000, 150),
 | |
| ( 'TV', 2, 2000, 100),
 | |
| ( 'TV', 2, 2000, 100),
 | |
| ( 'Calculator', 1, 2000,75),
 | |
| ( 'Calculator', 2, 2000,75),
 | |
| ( 'TV', 1, 1999, 100),
 | |
| ( 'Computer', 1, 1999,1200),
 | |
| ( 'Computer', 2, 2000,1500),
 | |
| ( 'Calculator', 2, 2000,75),
 | |
| ( 'Phone', 3, 2003,10)
 | |
| ;
 | |
| create table t2 (country_id int primary key, country char(20) not null);
 | |
| insert into t2 values (1, 'USA'),(2,'India'), (3,'Finland');
 | |
| select product, sum(profit),avg(profit) from t1 group by product with rollup procedure analyse();
 | |
| Field_name	Min_value	Max_value	Min_length	Max_length	Empties_or_zeros	Nulls	Avg_value_or_avg_length	Std	Optimal_fieldtype
 | |
| test.t1.product	Computer	TV	2	8	0	0	4.2500	NULL	ENUM('Computer','Phone','TV') NOT NULL
 | |
| sum(profit)	10	6900	11	11	0	0	1946.2500	2867.6719	ENUM('10','275','600','6900') NOT NULL
 | |
| avg(profit)	10.0000	1380.0000	16	16	0	0	394.68750000	570.20033144	ENUM('10.0000','68.7500','120.0000','1380.0000') NOT NULL
 | |
| drop table t1,t2;
 | |
| create table t1 (f1 double(10,5), f2 char(10), f3 double(10,5));
 | |
| insert into t1 values (5.999, "5.9999", 5.99999), (9.555, "9.5555", 9.55555);
 | |
| select f1 from t1 procedure analyse(1, 1);
 | |
| Field_name	Min_value	Max_value	Min_length	Max_length	Empties_or_zeros	Nulls	Avg_value_or_avg_length	Std	Optimal_fieldtype
 | |
| test.t1.f1	5.99900	9.55500	7	7	0	0	7.77700	1.77800	FLOAT(4,3) NOT NULL
 | |
| select f2 from t1 procedure analyse(1, 1);
 | |
| Field_name	Min_value	Max_value	Min_length	Max_length	Empties_or_zeros	Nulls	Avg_value_or_avg_length	Std	Optimal_fieldtype
 | |
| test.t1.f2	5.9999	9.5555	6	6	0	0	6.0000	NULL	FLOAT(5,4) UNSIGNED NOT NULL
 | |
| select f3 from t1 procedure analyse(1, 1);
 | |
| Field_name	Min_value	Max_value	Min_length	Max_length	Empties_or_zeros	Nulls	Avg_value_or_avg_length	Std	Optimal_fieldtype
 | |
| test.t1.f3	5.99999	9.55555	7	7	0	0	7.77777	1.77778	FLOAT(6,5) NOT NULL
 | |
| drop table t1;
 | |
| CREATE TABLE t1(a INT,b INT,c INT,d INT,e INT,f INT,g INT,h INT,i INT,j INT,k INT);
 | |
| INSERT INTO t1 VALUES ();
 | |
| SELECT * FROM (SELECT * FROM t1) d PROCEDURE ANALYSE();
 | |
| ERROR HY000: Incorrect usage of PROCEDURE and subquery
 | |
| DROP TABLE t1;
 | |
| End of 4.1 tests
 | |
| #
 | |
| # Bug #48293: crash with procedure analyse, view with > 10 columns, 
 | |
| #  having clause...
 | |
| #
 | |
| CREATE TABLE t1(a INT, b INT, c INT, d INT, e INT,
 | |
| f INT, g INT, h INT, i INT, j INT,k INT);
 | |
| INSERT INTO t1 VALUES (),();
 | |
| CREATE ALGORITHM=TEMPTABLE VIEW v1 AS SELECT * FROM t1;
 | |
| #should have a derived table
 | |
| EXPLAIN SELECT * FROM v1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	2	
 | |
| 2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	2	
 | |
| #should not crash
 | |
| SELECT * FROM v1 PROCEDURE analyse();
 | |
| ERROR HY000: Incorrect usage of PROCEDURE and view
 | |
| #should not crash
 | |
| SELECT * FROM t1 a, v1, t1 b PROCEDURE analyse();
 | |
| ERROR HY000: Incorrect usage of PROCEDURE and view
 | |
| #should not crash
 | |
| SELECT * FROM (SELECT * FROM t1 having a > 1) x PROCEDURE analyse();
 | |
| ERROR HY000: Incorrect usage of PROCEDURE and subquery
 | |
| #should not crash
 | |
| SELECT * FROM t1 a, (SELECT * FROM t1 having a > 1) x, t1 b PROCEDURE analyse();
 | |
| ERROR HY000: Incorrect usage of PROCEDURE and subquery
 | |
| #should not crash
 | |
| SELECT 1 FROM t1 group by a having a > 1 order by 1 PROCEDURE analyse();
 | |
| ERROR HY000: Can't use ORDER clause with this procedure
 | |
| DROP VIEW v1;
 | |
| DROP TABLE t1;
 | |
| CREATE TABLE t1(a INT);
 | |
| INSERT INTO t1 VALUES (1),(2);
 | |
| # should not crash
 | |
| CREATE TABLE t2 SELECT 1 FROM t1, t1 t3 GROUP BY t3.a PROCEDURE ANALYSE();
 | |
| ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'PROCEDURE ANALYSE()' at line 1
 | |
| DROP TABLE t1;
 | |
| End of 5.0 tests
 | |
| #
 | |
| # Bug#11765202: Dbug_violation_helper::~Dbug_violation_helper(): Assertion `!_entered' failed.
 | |
| #
 | |
| DROP TABLE IF EXISTS t1;
 | |
| Warnings:
 | |
| Note	1051	Unknown table 'test.t1'
 | |
| CREATE TABLE t1 (a VARCHAR(2) CHARSET UTF8 NOT NULL);
 | |
| INSERT INTO t1 VALUES ('e'),('e'),('e-');
 | |
| SELECT * FROM t1 PROCEDURE ANALYSE();
 | |
| Field_name	Min_value	Max_value	Min_length	Max_length	Empties_or_zeros	Nulls	Avg_value_or_avg_length	Std	Optimal_fieldtype
 | |
| test.t1.a	e	e-	1	2	0	0	1.3333	NULL	ENUM('e','e-') NOT NULL
 | |
| DROP TABLE t1;
 | |
| #
 | |
| # Bug#11756242  48137: PROCEDURE ANALYSE() LEAKS MEMORY WHEN RETURNING NULL
 | |
| #
 | |
| CREATE TABLE t1(f1 INT) ENGINE=MYISAM;
 | |
| CREATE TABLE t2(f2 INT) ENGINE=INNODB;
 | |
| INSERT INTO t2 VALUES (1);
 | |
| SELECT DISTINCTROW f1 FROM t1 NATURAL RIGHT OUTER JOIN t2 PROCEDURE ANALYSE();
 | |
| Field_name	Min_value	Max_value	Min_length	Max_length	Empties_or_zeros	Nulls	Avg_value_or_avg_length	Std	Optimal_fieldtype
 | |
| test.t1.f1	NULL	NULL	0	0	0	1	0.0	0.0	CHAR(0)
 | |
| SELECT * FROM t2 LIMIT 1 PROCEDURE ANALYSE();
 | |
| Field_name	Min_value	Max_value	Min_length	Max_length	Empties_or_zeros	Nulls	Avg_value_or_avg_length	Std	Optimal_fieldtype
 | |
| test.t2.f2	1	1	1	1	0	0	1.0000	0.0000	ENUM('1') NOT NULL
 | |
| DROP TABLE t1, t2;
 | |
| End of 5.1 tests
 | |
| #
 | |
| # Start of 10.2 tests
 | |
| #
 | |
| (SELECT 1 FROM DUAL PROCEDURE ANALYSE());
 | |
| ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'PROCEDURE ANALYSE())' at line 1
 | |
| ((SELECT 1 FROM DUAL PROCEDURE ANALYSE()));
 | |
| ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'PROCEDURE ANALYSE()))' at line 1
 | |
| (SELECT 1 FROM DUAL) PROCEDURE ANALYSE();
 | |
| Field_name	Min_value	Max_value	Min_length	Max_length	Empties_or_zeros	Nulls	Avg_value_or_avg_length	Std	Optimal_fieldtype
 | |
| 1	1	1	1	1	0	0	1.0000	0.0000	ENUM('1') NOT NULL
 | |
| ((SELECT 1 FROM DUAL)) PROCEDURE ANALYSE();
 | |
| Field_name	Min_value	Max_value	Min_length	Max_length	Empties_or_zeros	Nulls	Avg_value_or_avg_length	Std	Optimal_fieldtype
 | |
| 1	1	1	1	1	0	0	1.0000	0.0000	ENUM('1') NOT NULL
 | |
| create table t1 (a int);
 | |
| SELECT * FROM t1 UNION SELECT * FROM t1 PROCEDURE analyse();
 | |
| ERROR 42000: Incorrect usage/placement of 'PROCEDURE'
 | |
| drop table t1;
 | |
| #
 | |
| # MDEV-10030 sql_yacc.yy: Split table_expression and remove PROCEDURE from create_select, select_paren_derived, select_derived2, query_specification
 | |
| #
 | |
| SELECT * FROM (SELECT * FROM t1 PROCEDURE ANALYSE());
 | |
| ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'PROCEDURE ANALYSE())' at line 1
 | |
| SELECT * FROM t1 NATURAL JOIN (SELECT * FROM t2 PROCEDURE ANALYSE());
 | |
| ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'PROCEDURE ANALYSE())' at line 1
 | |
| SELECT (SELECT 1 FROM t1 PROCEDURE ANALYSE()) FROM t2;
 | |
| ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'PROCEDURE ANALYSE()) FROM t2' at line 1
 | |
| SELECT ((SELECT 1 FROM t1 PROCEDURE ANALYSE())) FROM t2;
 | |
| ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'PROCEDURE ANALYSE())) FROM t2' at line 1
 | |
| #
 | |
| # Start of 10.4 tests
 | |
| #
 | |
| #
 | |
| # MDEV-16309 Split ::create_tmp_field() into virtual methods in Item
 | |
| #
 | |
| CREATE TABLE t1 (a INT);
 | |
| INSERT INTO t1 VALUES (1),(2),(3);
 | |
| BEGIN NOT ATOMIC
 | |
| DECLARE rec ROW(Field_name TEXT,
 | |
| Min_value TEXT,
 | |
| Max_value TEXT,
 | |
| Min_length TEXT,
 | |
| Max_length TEXT,
 | |
| Empties_or_zeros TEXT,
 | |
| Nulls TEXT,
 | |
| Avg_value_or_avg_length TEXT,
 | |
| Std TEXT,
 | |
| Optimal_fieldtype TEXT);
 | |
| DECLARE c CURSOR FOR SELECT * FROM t1 PROCEDURE analyse();
 | |
| OPEN c;
 | |
| FETCH c INTO rec;
 | |
| CLOSE c;
 | |
| SELECT rec.field_name,
 | |
| rec.Min_value, rec.Max_value,
 | |
| rec.Min_length, rec. Max_length,
 | |
| rec.Empties_or_zeros, rec.Nulls,
 | |
| rec.Avg_value_or_avg_length, rec.Std,
 | |
| rec.Optimal_fieldtype;
 | |
| END;
 | |
| $$
 | |
| rec.field_name	test.t1.a
 | |
| rec.Min_value	1
 | |
| rec.Max_value	3
 | |
| rec.Min_length	1
 | |
| rec. Max_length	1
 | |
| rec.Empties_or_zeros	0
 | |
| rec.Nulls	0
 | |
| rec.Avg_value_or_avg_length	2.0000
 | |
| rec.Std	0.8165
 | |
| rec.Optimal_fieldtype	ENUM('1','2','3') NOT NULL
 | |
| DROP TABLE t1;
 | |
| #
 | |
| # End of 10.4 tests
 | |
| #
 | |
| #
 | |
| # Start of 10.5 tests
 | |
| #
 | |
| #
 | |
| # MDEV-28345 ASAN: use-after-poison or unknown-crash in my_strtod_int from charset_info_st::strntod or test_if_number
 | |
| #
 | |
| SET sql_mode='';
 | |
| CREATE TABLE t1 (c CHAR(10) KEY);
 | |
| INSERT INTO t1 VALUES (1.755555555);
 | |
| Warnings:
 | |
| Warning	1265	Data truncated for column 'c' at row 1
 | |
| SELECT * FROM t1 PROCEDURE ANALYSE();
 | |
| Field_name	Min_value	Max_value	Min_length	Max_length	Empties_or_zeros	Nulls	Avg_value_or_avg_length	Std	Optimal_fieldtype
 | |
| test.t1.c	1.75555555	1.75555555	10	10	0	0	10.0000	NULL	ENUM('1.75555555') NOT NULL
 | |
| DROP TABLE t1;
 | |
| SET sql_mode=DEFAULT;
 | |
| CREATE TABLE t1 (c BLOB) ENGINE=InnoDB;
 | |
| INSERT INTO t1 VALUES (1.3),(1.1);
 | |
| SELECT * FROM t1 PROCEDURE ANALYSE();
 | |
| Field_name	Min_value	Max_value	Min_length	Max_length	Empties_or_zeros	Nulls	Avg_value_or_avg_length	Std	Optimal_fieldtype
 | |
| test.t1.c	1.1	1.3	3	3	0	0	3.0000	NULL	ENUM('1.1','1.3') NOT NULL
 | |
| DROP TABLE t1;
 | |
| #
 | |
| # MDEV-31881 ASAN: unknown-crash in check_ulonglong (sql/sql_analyse.cc) on SELECT ... FROM ... PROCEDURE ANALYSE()
 | |
| #
 | |
| CREATE TABLE t (a INT, b CHAR(10));
 | |
| INSERT INTO t VALUES (0,'0000000000');
 | |
| SELECT * FROM t PROCEDURE ANALYSE();
 | |
| Field_name	Min_value	Max_value	Min_length	Max_length	Empties_or_zeros	Nulls	Avg_value_or_avg_length	Std	Optimal_fieldtype
 | |
| test.t.a	0	0	1	1	1	0	0.0000	0.0000	ENUM('0') NOT NULL
 | |
| test.t.b	0000000000	0000000000	10	10	0	0	10.0000	NULL	ENUM('0000000000') NOT NULL
 | |
| DROP TABLE t;
 | |
| #
 | |
| # End of 10.5 tests
 | |
| #
 | 
