@@ -1364,6 +1364,203 @@ ORDER BY t2.c LIMIT 1;
13641364
13651365DROP TABLE t1,t2,t3;
13661366
1367+ -- echo #
1368+ -- echo # WL#1393 - Optimizing filesort with small limit
1369+ -- echo #
1370+
1371+ CREATE TABLE t1 (f0 int auto_increment primary key , f1 int , f2 varchar (200 ));
1372+ INSERT INTO t1(f1, f2) VALUES
1373+ (0 ," 0" ),(1 ," 1" ),(2 ," 2" ),(3 ," 3" ),(4 ," 4" ),(5 ," 5" ),
1374+ (6 ," 6" ),(7 ," 7" ),(8 ," 8" ),(9 ," 9" ),(10 ," 10" ),
1375+ (11 ," 11" ),(12 ," 12" ),(13 ," 13" ),(14 ," 14" ),(15 ," 15" ),
1376+ (16 ," 16" ),(17 ," 17" ),(18 ," 18" ),(19 ," 19" ),(20 ," 20" ),
1377+ (21 ," 21" ),(22 ," 22" ),(23 ," 23" ),(24 ," 24" ),(25 ," 25" ),
1378+ (26 ," 26" ),(27 ," 27" ),(28 ," 28" ),(29 ," 29" ),(30 ," 30" ),
1379+ (31 ," 31" ),(32 ," 32" ),(33 ," 33" ),(34 ," 34" ),(35 ," 35" ),
1380+ (36 ," 36" ),(37 ," 37" ),(38 ," 38" ),(39 ," 39" ),(40 ," 40" ),
1381+ (41 ," 41" ),(42 ," 42" ),(43 ," 43" ),(44 ," 44" ),(45 ," 45" ),
1382+ (46 ," 46" ),(47 ," 47" ),(48 ," 48" ),(49 ," 49" ),(50 ," 50" ),
1383+ (51 ," 51" ),(52 ," 52" ),(53 ," 53" ),(54 ," 54" ),(55 ," 55" ),
1384+ (56 ," 56" ),(57 ," 57" ),(58 ," 58" ),(59 ," 59" ),(60 ," 60" ),
1385+ (61 ," 61" ),(62 ," 62" ),(63 ," 63" ),(64 ," 64" ),(65 ," 65" ),
1386+ (66 ," 66" ),(67 ," 67" ),(68 ," 68" ),(69 ," 69" ),(70 ," 70" ),
1387+ (71 ," 71" ),(72 ," 72" ),(73 ," 73" ),(74 ," 74" ),(75 ," 75" ),
1388+ (76 ," 76" ),(77 ," 77" ),(78 ," 78" ),(79 ," 79" ),(80 ," 80" ),
1389+ (81 ," 81" ),(82 ," 82" ),(83 ," 83" ),(84 ," 84" ),(85 ," 85" ),
1390+ (86 ," 86" ),(87 ," 87" ),(88 ," 88" ),(89 ," 89" ),(90 ," 90" ),
1391+ (91 ," 91" ),(92 ," 92" ),(93 ," 93" ),(94 ," 94" ),(95 ," 95" ),
1392+ (96 ," 96" ),(97 ," 97" ),(98 ," 98" ),(99 ," 99" );
1393+
1394+ # ###############
1395+ # # Test sort when source data fits in memory
1396+
1397+ SELECT * FROM t1 ORDER BY f1 ASC , f0 LIMIT 100 ;
1398+ SELECT * FROM t1 ORDER BY f1 ASC , f0 LIMIT 30 ;
1399+ SELECT * FROM t1 ORDER BY f1 ASC , f0 LIMIT 0 ;
1400+ SELECT * FROM t1 ORDER BY f2 DESC , f0 LIMIT 30 ;
1401+ SELECT * FROM t1 ORDER BY f2 DESC , f0 LIMIT 0 ;
1402+ SELECT * FROM t1 WHERE f1> 10 ORDER BY f2, f0 LIMIT 20 ;
1403+ SELECT * FROM t1 WHERE f1> 10 ORDER BY f2, f0 LIMIT 0 ;
1404+ SELECT * FROM t1 WHERE f1> 10 ORDER BY f2, f0 LIMIT 10 OFFSET 10 ;
1405+ SELECT * FROM t1 WHERE f1> 10 ORDER BY f2, f0 LIMIT 0 OFFSET 10 ;
1406+
1407+ # ###############
1408+ # # Test sort when source data does not fit in memory
1409+ set sort_buffer_size= 32768 ;
1410+ CREATE TEMPORARY TABLE tmp (f1 int , f2 varchar (20 ));
1411+ INSERT INTO tmp SELECT f1, f2 FROM t1;
1412+ INSERT INTO t1(f1, f2) SELECT * FROM tmp;
1413+ INSERT INTO tmp SELECT f1, f2 FROM t1;
1414+ INSERT INTO t1(f1, f2) SELECT * FROM tmp;
1415+
1416+ SELECT * FROM t1 ORDER BY f1 ASC , f0 LIMIT 30 ;
1417+ SELECT * FROM t1 ORDER BY f1 ASC , f0 LIMIT 0 ;
1418+ SELECT * FROM t1 ORDER BY f2 DESC , f0 LIMIT 30 ;
1419+ SELECT * FROM t1 ORDER BY f2 DESC , f0 LIMIT 0 ;
1420+ SELECT * FROM t1 WHERE f1> 10 ORDER BY f2, f0 LIMIT 20 ;
1421+ SELECT * FROM t1 WHERE f1> 10 ORDER BY f2, f0 LIMIT 0 ;
1422+ SELECT * FROM t1 WHERE f1> 10 ORDER BY f2, f0 LIMIT 10 OFFSET 10 ;
1423+ SELECT * FROM t1 WHERE f1> 10 ORDER BY f2, f0 LIMIT 0 OFFSET 10 ;
1424+
1425+ # ###############
1426+ # # Test with SQL_CALC_FOUND_ROWS
1427+ set sort_buffer_size= 32768 ;
1428+ SELECT SQL_CALC_FOUND_ROWS * FROM t1
1429+ ORDER BY f1, f0 LIMIT 30 ;
1430+ SELECT FOUND_ROWS();
1431+
1432+ SELECT SQL_CALC_FOUND_ROWS * FROM t1
1433+ ORDER BY f1, f0 LIMIT 0 ;
1434+ SELECT FOUND_ROWS();
1435+
1436+ SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE f1> 10
1437+ ORDER BY f2, f0 LIMIT 20 ;
1438+ SELECT FOUND_ROWS();
1439+
1440+ SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE f1> 10
1441+ ORDER BY f2, f0 LIMIT 0 ;
1442+ SELECT FOUND_ROWS();
1443+
1444+ SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE f1> 10
1445+ ORDER BY f2, f0 LIMIT 10 OFFSET 10 ;
1446+ SELECT FOUND_ROWS();
1447+
1448+ SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE f1> 10
1449+ ORDER BY f2, f0 LIMIT 0 OFFSET 10 ;
1450+ SELECT FOUND_ROWS();
1451+
1452+ # ###############
1453+ # # Test sorting with join
1454+ # # These are re-written to use PQ during execution.
1455+ set sort_buffer_size= 327680 ;
1456+
1457+ SELECT * FROM t1 JOIN tmp on t1 .f2 = tmp .f2
1458+ ORDER BY tmp .f1 , f0 LIMIT 30 ;
1459+
1460+ SELECT * FROM t1 JOIN tmp on t1 .f2 = tmp .f2
1461+ ORDER BY tmp .f1 , f0 LIMIT 30 OFFSET 30 ;
1462+
1463+ SELECT SQL_CALC_FOUND_ROWS * FROM t1 JOIN tmp on t1 .f2 = tmp .f2
1464+ ORDER BY tmp .f1 , f0 LIMIT 30 OFFSET 30 ;
1465+ SELECT FOUND_ROWS();
1466+
1467+ SELECT SQL_CALC_FOUND_ROWS * FROM t1 JOIN tmp on t1 .f2 = tmp .f2
1468+ WHERE t1 .f2 > 20
1469+ ORDER BY tmp .f1 , f0 LIMIT 30 OFFSET 30 ;
1470+ SELECT FOUND_ROWS();
1471+
1472+ # ###############
1473+ # # Test views
1474+ CREATE VIEW v1 as SELECT * FROM t1 ORDER BY f1, f0 LIMIT 30 ;
1475+ SELECT * FROM v1;
1476+ drop view v1;
1477+
1478+ CREATE VIEW v1 as SELECT * FROM t1 ORDER BY f1, f0 LIMIT 100 ;
1479+ SELECT * FROM v1 ORDER BY f2, f0 LIMIT 30 ;
1480+
1481+ CREATE VIEW v2 as SELECT * FROM t1 ORDER BY f2, f0 LIMIT 100 ;
1482+ SELECT * FROM v1 JOIN v2 on v1 .f1 = v2 .f1 ORDER BY v1 .f2 ,v1 .f0 ,v2 .f0
1483+ LIMIT 30 ;
1484+
1485+ # ###############
1486+ # # Test group & having
1487+ SELECT floor(f1/ 10 ) f3, count (f2) FROM t1
1488+ GROUP BY 1 ORDER BY 2 ,1 LIMIT 5 ;
1489+
1490+ SELECT floor(f1/ 10 ) f3, count (f2) FROM t1
1491+ GROUP BY 1 ORDER BY 2 ,1 LIMIT 0 ;
1492+
1493+ # ###############
1494+ # # Test SP
1495+ delimiter |;
1496+ CREATE PROCEDURE wl1393_sp_test()
1497+ BEGIN
1498+ SELECT * FROM t1 WHERE f1> 10 ORDER BY f2, f0 LIMIT 30 ;
1499+ SELECT * FROM t1 WHERE f1> 10 ORDER BY f2, f0 LIMIT 15 OFFSET 15 ;
1500+ SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE f1> 10
1501+ ORDER BY f2, f0 LIMIT 15 OFFSET 15 ;
1502+ SELECT FOUND_ROWS();
1503+ SELECT * FROM v1 ORDER BY f2, f0 LIMIT 30 ;
1504+ END|
1505+ CALL wl1393_sp_test()|
1506+ DROP PROCEDURE wl1393_sp_test|
1507+ delimiter ;|
1508+
1509+ # ###############
1510+ # # Test with subqueries
1511+ SELECT d1 .f1 , d1 .f2 FROM t1
1512+ LEFT JOIN (SELECT * FROM t1 ORDER BY f1 LIMIT 30 ) d1 on t1 .f1 = d1 .f1
1513+ ORDER BY d1 .f2 DESC LIMIT 30 ;
1514+
1515+ SELECT * FROM t1 WHERE f1 = (SELECT f1 FROM t1 ORDER BY 1 LIMIT 1 );
1516+
1517+ -- error ER_SUBQUERY_NO_1_ROW
1518+ SELECT * FROM t1 WHERE f1 = (SELECT f1 FROM t1 ORDER BY 1 LIMIT 2 );
1519+
1520+ DROP TABLE t1, tmp;
1521+ DROP VIEW v1, v2;
1522+
1523+ -- echo # end of WL#1393 - Optimizing filesort with small limit
1524+
1525+ -- echo #
1526+ -- echo # Bug #58761
1527+ -- echo # Crash in Field::is_null in field.h on subquery in WHERE clause
1528+ -- echo #
1529+
1530+ CREATE TABLE t1 (
1531+ pk INT NOT NULL AUTO_INCREMENT,
1532+ col_int_key INT DEFAULT NULL ,
1533+ col_varchar_key VARCHAR (1 ) DEFAULT NULL ,
1534+ PRIMARY KEY (pk),
1535+ KEY col_varchar_key (col_varchar_key,col_int_key)
1536+ );
1537+
1538+ INSERT INTO t1 VALUES (27 ,7 ,' x' );
1539+ INSERT INTO t1 VALUES (28 ,6 ,' m' );
1540+ INSERT INTO t1 VALUES (29 ,4 ,' c' );
1541+
1542+ CREATE TABLE where_subselect
1543+ SELECT DISTINCT ` pk` AS field1 , ` pk` AS field2
1544+ FROM t1 AS alias1
1545+ WHERE alias1 . ` col_int_key` > 229
1546+ OR alias1 . ` col_varchar_key` IS NOT NULL
1547+ GROUP BY field1, field2
1548+ ;
1549+
1550+ SELECT *
1551+ FROM where_subselect
1552+ WHERE (field1, field2) IN (
1553+ SELECT DISTINCT ` pk` AS field1 , ` pk` AS field2
1554+ FROM t1 AS alias1
1555+ WHERE alias1 . ` col_int_key` > 229
1556+ OR alias1 . ` col_varchar_key` IS NOT NULL
1557+ GROUP BY field1, field2
1558+ );
1559+
1560+ DROP TABLE t1;
1561+ DROP TABLE where_subselect;
1562+
1563+ -- echo # End of Bug #58761
13671564
13681565#
13691566# Bug#35844: Covering index for ref access not compatible with ORDER BY list
0 commit comments