# # Test of procedure analyse # -- source include/have_innodb.inc --disable_warnings drop table if exists t1,t2; --enable_warnings 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(); select * from t1 procedure analyse(); select * from t1 procedure analyse(2); --error ER_PARSE_ERROR create table t2 select * from t1 procedure analyse(); drop table t1; --error ER_WRONG_USAGE EXPLAIN SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE(); # # Bug#2813 - analyse does not quote string values in enums from string # create table t1 (v varchar(128)); 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(); drop table t1; #decimal-related test create table t1 (df decimal(5,1)); insert into t1 values(1.1); insert into t1 values(2.2); select * from t1 procedure analyse(); drop table t1; # # Bug#10716 - Procedure Analyse results in wrong values for optimal field type # create table t1 (d double); insert into t1 values (100000); select * from t1 procedure analyse (1,1); drop table t1; # # Bug #14138 ROLLUP and PROCEDURE ANALYSE() hang server # 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(); drop table t1,t2; # # Bug #20305 PROCEDURE ANALYSE() returns wrong M for FLOAT(M, D) and DOUBLE(M, D) # 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); select f2 from t1 procedure analyse(1, 1); select f3 from t1 procedure analyse(1, 1); drop table t1; # # Bug#46184 Crash, SELECT ... FROM derived table procedure analyze # 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 (); --error ER_WRONG_USAGE SELECT * FROM (SELECT * FROM t1) d PROCEDURE ANALYSE(); DROP TABLE t1; --echo End of 4.1 tests --echo # --echo # Bug #48293: crash with procedure analyse, view with > 10 columns, --echo # having clause... --echo # 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; --echo #should have a derived table EXPLAIN SELECT * FROM v1; --echo #should not crash --error ER_WRONG_USAGE SELECT * FROM v1 PROCEDURE analyse(); --echo #should not crash --error ER_WRONG_USAGE SELECT * FROM t1 a, v1, t1 b PROCEDURE analyse(); --echo #should not crash --error ER_WRONG_USAGE SELECT * FROM (SELECT * FROM t1 having a > 1) x PROCEDURE analyse(); --echo #should not crash --error ER_WRONG_USAGE SELECT * FROM t1 a, (SELECT * FROM t1 having a > 1) x, t1 b PROCEDURE analyse(); --echo #should not crash --error ER_ORDER_WITH_PROC SELECT 1 FROM t1 group by a having a > 1 order by 1 PROCEDURE analyse(); DROP VIEW v1; DROP TABLE t1; CREATE TABLE t1(a INT); INSERT INTO t1 VALUES (1),(2); --echo # should not crash --error ER_PARSE_ERROR CREATE TABLE t2 SELECT 1 FROM t1, t1 t3 GROUP BY t3.a PROCEDURE ANALYSE(); DROP TABLE t1; --echo End of 5.0 tests --echo # --echo # Bug#11765202: Dbug_violation_helper::~Dbug_violation_helper(): Assertion `!_entered' failed. --echo # DROP TABLE IF EXISTS t1; CREATE TABLE t1 (a VARCHAR(2) CHARSET UTF8 NOT NULL); INSERT INTO t1 VALUES ('e'),('e'),('e-'); SELECT * FROM t1 PROCEDURE ANALYSE(); DROP TABLE t1; --echo # --echo # Bug#11756242 48137: PROCEDURE ANALYSE() LEAKS MEMORY WHEN RETURNING NULL --echo # 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(); SELECT * FROM t2 LIMIT 1 PROCEDURE ANALYSE(); DROP TABLE t1, t2; --echo End of 5.1 tests --echo # --echo # Start of 10.2 tests --echo # --error ER_PARSE_ERROR (SELECT 1 FROM DUAL PROCEDURE ANALYSE()); --error ER_PARSE_ERROR ((SELECT 1 FROM DUAL PROCEDURE ANALYSE())); (SELECT 1 FROM DUAL) PROCEDURE ANALYSE(); ((SELECT 1 FROM DUAL)) PROCEDURE ANALYSE(); create table t1 (a int); --error ER_CANT_USE_OPTION_HERE SELECT * FROM t1 UNION SELECT * FROM t1 PROCEDURE analyse(); drop table t1; --echo # --echo # MDEV-10030 sql_yacc.yy: Split table_expression and remove PROCEDURE from create_select, select_paren_derived, select_derived2, query_specification --echo # --error ER_PARSE_ERROR SELECT * FROM (SELECT * FROM t1 PROCEDURE ANALYSE()); --ERROR ER_PARSE_ERROR SELECT * FROM t1 NATURAL JOIN (SELECT * FROM t2 PROCEDURE ANALYSE()); --error ER_PARSE_ERROR SELECT (SELECT 1 FROM t1 PROCEDURE ANALYSE()) FROM t2; --error ER_PARSE_ERROR SELECT ((SELECT 1 FROM t1 PROCEDURE ANALYSE())) FROM t2; --echo # --echo # Start of 10.4 tests --echo # --echo # --echo # MDEV-16309 Split ::create_tmp_field() into virtual methods in Item --echo # CREATE TABLE t1 (a INT); INSERT INTO t1 VALUES (1),(2),(3); --vertical_results DELIMITER $$; 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; $$ DELIMITER ;$$ --horizontal_results DROP TABLE t1; --echo # --echo # End of 10.4 tests --echo #