mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-31 19:06:14 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			1084 lines
		
	
	
	
		
			21 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			1084 lines
		
	
	
	
		
			21 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| --echo #
 | |
| --echo # The following entries are meant for testing the parser, ensuring
 | |
| --echo # the right values are passed down to the executor, for all possible
 | |
| --echo # syntax combinations.
 | |
| --echo #
 | |
| --echo # Test basic syntax.
 | |
| --echo #
 | |
| 
 | |
| create table t1 (a int);
 | |
| create table t_keyword (`offset` int);
 | |
| 
 | |
| insert into t1 values (1), (1), (2), (3), (2);
 | |
| insert into t_keyword values (1), (1), (2), (3), (2);
 | |
| 
 | |
| --echo #
 | |
| --echo # Make sure the FETCH clause addition didn't introduce problems with
 | |
| --echo # the offset keyword.
 | |
| --echo #
 | |
| #enable after fix MDEV-29645
 | |
| --disable_view_protocol
 | |
| select * from t1
 | |
| order by a
 | |
| offset 2 rows;
 | |
| 
 | |
| 
 | |
| --sorted_result
 | |
| select * from t1
 | |
| offset 2 rows;
 | |
| --enable_view_protocol
 | |
| 
 | |
| --echo #
 | |
| --echo # Offset is now a reserved keyword. Column names can not have that name
 | |
| --echo # without escaping the identifier.
 | |
| --echo #
 | |
| --error 1064
 | |
| select * from t_keyword
 | |
| order by offset;
 | |
| 
 | |
| select * from t_keyword
 | |
| order by `offset`;
 | |
| 
 | |
| 
 | |
| --echo #
 | |
| --echo # Test syntax without a specific limit. (implicit one row)
 | |
| --echo # Test the alias between row / rows and first / next.
 | |
| --echo # Test ONLY vs WITH TIES.
 | |
| --echo #
 | |
| select * from t1
 | |
| fetch first row only;
 | |
| 
 | |
| select * from t1
 | |
| fetch first rows only;
 | |
| 
 | |
| select * from t1
 | |
| fetch next row only;
 | |
| 
 | |
| select * from t1
 | |
| fetch next rows only;
 | |
| 
 | |
| --echo #
 | |
| --echo # Row / rows are mandatory after offset <n>
 | |
| --echo #
 | |
| --error 1064
 | |
| select * from t1
 | |
| order by a
 | |
| offset 2
 | |
| fetch first row only;
 | |
| 
 | |
| --error 1064
 | |
| select * from t1
 | |
| order by a
 | |
| offset 2;
 | |
| 
 | |
| select * from t1
 | |
| order by a
 | |
| offset 2 row
 | |
| fetch first row only;
 | |
| 
 | |
| select * from t1
 | |
| order by a
 | |
| offset 2 rows
 | |
| fetch first row only;
 | |
| 
 | |
| --echo #
 | |
| --echo # Include offset before fetch clause.
 | |
| --echo #
 | |
| select * from t1
 | |
| order by a
 | |
| offset 2 rows
 | |
| fetch first row only;
 | |
| 
 | |
| select * from t1
 | |
| order by a
 | |
| offset 2 rows
 | |
| fetch first rows only;
 | |
| 
 | |
| select * from t1
 | |
| offset 2 rows
 | |
| fetch next row only;
 | |
| 
 | |
| select * from t1
 | |
| offset 2 rows
 | |
| fetch next rows only;
 | |
| 
 | |
| 
 | |
| --echo #
 | |
| --echo # Repeat the tests, but now with WITH TIES.
 | |
| --echo # WITH TIES requires order by.
 | |
| --echo #
 | |
| 
 | |
| --error ER_WITH_TIES_NEEDS_ORDER
 | |
| select * from t1
 | |
| fetch first row with ties;
 | |
| 
 | |
| --error ER_WITH_TIES_NEEDS_ORDER
 | |
| select * from t1
 | |
| fetch first rows with ties;
 | |
| 
 | |
| --error ER_WITH_TIES_NEEDS_ORDER
 | |
| select * from t1
 | |
| fetch next row with ties;
 | |
| 
 | |
| --error ER_WITH_TIES_NEEDS_ORDER
 | |
| select * from t1
 | |
| fetch next rows with ties;
 | |
| 
 | |
| select * from t1
 | |
| order by a
 | |
| fetch first row with ties;
 | |
| 
 | |
| select * from t1
 | |
| order by a
 | |
| fetch first rows with ties;
 | |
| 
 | |
| select * from t1
 | |
| order by a
 | |
| fetch next row with ties;
 | |
| 
 | |
| select * from t1
 | |
| order by a
 | |
| fetch next rows with ties;
 | |
| 
 | |
| --echo #
 | |
| --echo # Include offset before fetch clause.
 | |
| --echo #
 | |
| 
 | |
| select * from t1
 | |
| order by a
 | |
| offset 2 rows
 | |
| fetch first row with ties;
 | |
| 
 | |
| select * from t1
 | |
| order by a
 | |
| offset 2 rows
 | |
| fetch first rows with ties;
 | |
| 
 | |
| select * from t1
 | |
| order by a
 | |
| offset 2 rows
 | |
| fetch next row with ties;
 | |
| 
 | |
| select * from t1
 | |
| order by a
 | |
| offset 2 rows
 | |
| fetch next rows with ties;
 | |
| 
 | |
| 
 | |
| --echo #
 | |
| --echo # Test syntax with a specific limit
 | |
| --echo #
 | |
| select * from t1
 | |
| fetch first 3 row only;
 | |
| 
 | |
| select * from t1
 | |
| fetch first 3 rows only;
 | |
| 
 | |
| select * from t1
 | |
| fetch next 3 row only;
 | |
| 
 | |
| select * from t1
 | |
| fetch next 3 rows only;
 | |
| 
 | |
| --echo #
 | |
| --echo # Include offset before fetch clause.
 | |
| --echo #
 | |
| select * from t1
 | |
| order by a
 | |
| offset 2 rows
 | |
| fetch first 3 row only;
 | |
| 
 | |
| select * from t1
 | |
| order by a
 | |
| offset 2 rows
 | |
| fetch first 3 rows only;
 | |
| 
 | |
| select * from t1
 | |
| offset 2 rows
 | |
| fetch next 3 row only;
 | |
| 
 | |
| select * from t1
 | |
| offset 2 rows
 | |
| fetch next 3 rows only;
 | |
| 
 | |
| 
 | |
| --echo #
 | |
| --echo # Repeat the tests, but now with WITH TIES.
 | |
| --echo # WITH TIES requires order by.
 | |
| --echo #
 | |
| 
 | |
| --error ER_WITH_TIES_NEEDS_ORDER
 | |
| select * from t1
 | |
| fetch first 3 row with ties;
 | |
| 
 | |
| --error ER_WITH_TIES_NEEDS_ORDER
 | |
| select * from t1
 | |
| fetch first 3 rows with ties;
 | |
| 
 | |
| --error ER_WITH_TIES_NEEDS_ORDER
 | |
| select * from t1
 | |
| fetch next 3 row with ties;
 | |
| 
 | |
| --error ER_WITH_TIES_NEEDS_ORDER
 | |
| select * from t1
 | |
| fetch next 3 rows with ties;
 | |
| 
 | |
| select * from t1
 | |
| order by a
 | |
| fetch first 3 row with ties;
 | |
| 
 | |
| select * from t1
 | |
| order by a
 | |
| fetch first 3 rows with ties;
 | |
| 
 | |
| select * from t1
 | |
| order by a
 | |
| fetch next 3 row with ties;
 | |
| 
 | |
| select * from t1
 | |
| order by a
 | |
| fetch next 3 rows with ties;
 | |
| 
 | |
| --echo #
 | |
| --echo # Include offset before fetch clause.
 | |
| --echo #
 | |
| 
 | |
| --error ER_WITH_TIES_NEEDS_ORDER
 | |
| select * from t1
 | |
| offset 2 rows
 | |
| fetch first row with ties;
 | |
| 
 | |
| select * from t1
 | |
| order by a
 | |
| offset 2 rows
 | |
| fetch first 3 row with ties;
 | |
| 
 | |
| select * from t1
 | |
| order by a
 | |
| offset 2 rows
 | |
| fetch first 3 rows with ties;
 | |
| 
 | |
| select * from t1
 | |
| order by a
 | |
| offset 2 rows
 | |
| fetch next 3 row with ties;
 | |
| 
 | |
| select * from t1
 | |
| order by a
 | |
| offset 2 rows
 | |
| fetch next 3 rows with ties;
 | |
| 
 | |
| 
 | |
| drop table t1;
 | |
| drop table t_keyword;
 | |
| 
 | |
| --echo #
 | |
| --echo # Test behaviour with a simple select.
 | |
| --echo #
 | |
| 
 | |
| create table t1 (id int, first_name varchar(100), last_name varchar(100), score double);
 | |
| insert into t1 values
 | |
|   (1, 'Alice', 'Fowler', 5),
 | |
|   (2, 'John', 'Doe', 6),
 | |
|   (3, 'John', 'Smith', 6),
 | |
|   (4, 'John', 'Smith', 6),
 | |
|   (5, 'John', 'Smith', 7),
 | |
|   (6, 'John', 'Elton', 8.1),
 | |
|   (7, 'Bob',  'Trasc', 9),
 | |
|   (8, 'Silvia', 'Ganush', 10);
 | |
| 
 | |
| create table t2
 | |
|   (id int,
 | |
|    location varchar(100),
 | |
|    fk int,
 | |
|    constraint `fk_t1`
 | |
|      FOREIGN KEY (fk) REFERENCES t1 (id)
 | |
|      ON DELETE CASCADE
 | |
|      ON UPDATE RESTRICT);
 | |
| insert into t2 values
 | |
|   (1, 'L1', 1),
 | |
|   (2, 'L2', 2),
 | |
|   (3, 'L3', 3),
 | |
|   (4, 'L3', 4),
 | |
|   (5, 'L4', 5),
 | |
|   (6, 'L4', 6),
 | |
|   (7, 'L4', 7),
 | |
|   (7, null, 8);
 | |
| 
 | |
| 
 | |
| select * from t1
 | |
| order by id
 | |
| fetch first 3 rows only;
 | |
| 
 | |
| select * from t1
 | |
| order by id
 | |
| fetch first 3 rows with ties;
 | |
| 
 | |
| select * from t1
 | |
| order by first_name
 | |
| fetch first 3 rows only;
 | |
| 
 | |
| select * from t1
 | |
| order by first_name
 | |
| fetch first 3 rows with ties;
 | |
| 
 | |
| --echo #
 | |
| --echo # Test multi-part order by.
 | |
| --echo #
 | |
| select * from t1
 | |
| order by first_name, last_name
 | |
| fetch first 3 rows with ties;
 | |
| 
 | |
| select * from t1
 | |
| order by first_name, last_name
 | |
| fetch first 4 rows with ties;
 | |
| 
 | |
| 
 | |
| select * from t1
 | |
| order by first_name, last_name
 | |
| offset 1 rows
 | |
| fetch first 3 rows with ties;
 | |
| 
 | |
| select * from t1
 | |
| order by first_name, last_name
 | |
| offset 1 rows
 | |
| fetch first 3 rows only;
 | |
| 
 | |
| select * from t1
 | |
| order by first_name, last_name
 | |
| offset 1 rows
 | |
| fetch first 3 rows with ties;
 | |
| 
 | |
| select * from t1
 | |
| order by first_name, last_name
 | |
| offset 2 rows
 | |
| fetch first 3 rows only;
 | |
| 
 | |
| select * from t1
 | |
| order by first_name, last_name
 | |
| offset 2 rows
 | |
| fetch first 3 rows with ties;
 | |
| 
 | |
| select * from t1
 | |
| order by first_name, last_name
 | |
| offset 3 rows
 | |
| fetch first 3 rows only;
 | |
| 
 | |
| select * from t1
 | |
| order by first_name, last_name
 | |
| offset 3 rows
 | |
| fetch first 3 rows with ties;
 | |
| 
 | |
| select * from t1
 | |
| order by first_name, last_name
 | |
| offset 4 rows
 | |
| fetch first 3 rows only;
 | |
| 
 | |
| select * from t1
 | |
| order by first_name, last_name
 | |
| offset 4 rows
 | |
| fetch first 3 rows with ties;
 | |
| 
 | |
| --echo #
 | |
| --echo # Test offset crossing into a new peer-group.
 | |
| --echo #
 | |
| select * from t1
 | |
| order by first_name, last_name
 | |
| offset 5 rows
 | |
| fetch first 3 rows with ties;
 | |
| 
 | |
| select * from t1
 | |
| order by first_name, last_name
 | |
| offset 5 rows
 | |
| fetch first 3 rows only;
 | |
| 
 | |
| --echo #
 | |
| --echo # Simple join with 2 tables, order by without columns in the
 | |
| --echo # second table and also with columns in the second table.
 | |
| --echo #
 | |
| --echo # Cover both only and with ties.
 | |
| --echo #
 | |
| select t1.id, t1.first_name, t1.last_name, t1.score, t2.location
 | |
| from t1 inner join t2 on t1.id = t2.fk
 | |
| order by t1.first_name, t1.last_name
 | |
| fetch first 3 rows only;
 | |
| 
 | |
| select t1.id, t1.first_name, t1.last_name, t1.score, t2.location
 | |
| from t1 inner join t2 on t1.id = t2.fk
 | |
| order by t2.location, t1.first_name, t1.last_name
 | |
| fetch first 3 rows only;
 | |
| 
 | |
| select t1.id, t1.first_name, t1.last_name, t1.score, t2.location
 | |
| from t1 inner join t2 on t1.id = t2.fk
 | |
| order by t1.first_name, t1.last_name
 | |
| fetch first 3 rows with ties;
 | |
| 
 | |
| select t1.id, t1.first_name, t1.last_name, t1.score, t2.location
 | |
| from t1 inner join t2 on t1.id = t2.fk
 | |
| order by t2.location, t1.first_name, t1.last_name
 | |
| fetch first 3 rows with ties;
 | |
| 
 | |
| --echo #
 | |
| --echo # Test descending order by.
 | |
| --echo #
 | |
| select t1.id, t1.first_name, t1.last_name, t1.score, t2.location
 | |
| from t1 inner join t2 on t1.id = t2.fk
 | |
| order by t2.location desc, t1.first_name, t1.last_name
 | |
| fetch first 3 rows only;
 | |
| 
 | |
| --sorted_result
 | |
| select * from t2
 | |
| order by t2.location desc
 | |
| fetch first 2 rows with ties;
 | |
| 
 | |
| --sorted_result
 | |
| select * from t2
 | |
| order by t2.location desc
 | |
| offset 1 rows
 | |
| fetch first 2 rows with ties;
 | |
| 
 | |
| --sorted_result
 | |
| select * from t2
 | |
| order by t2.location desc
 | |
| offset 2 rows
 | |
| fetch first 2 rows with ties;
 | |
| 
 | |
| --echo #
 | |
| --echo # Test a join with descending order by.
 | |
| --echo #
 | |
| select t1.id, t1.first_name, t1.last_name, t1.score, t2.location
 | |
| from t1 inner join t2 on t1.id = t2.fk
 | |
| order by t2.location desc, t1.first_name, t1.last_name
 | |
| fetch first 3 rows with ties;
 | |
| 
 | |
| --echo #
 | |
| --echo # Test subqueries.
 | |
| --echo #
 | |
| select * from (
 | |
|   select * from t2
 | |
|   order by t2.location desc
 | |
|   offset 2 rows
 | |
|   fetch first 2 rows with ties
 | |
| ) temp;
 | |
| 
 | |
| 
 | |
| select * from t2
 | |
| order by t2.location desc
 | |
| offset 0 rows
 | |
| fetch first 2 rows with ties;
 | |
| 
 | |
| create view v1 as (
 | |
|   select * from t2
 | |
|   order by t2.location desc
 | |
|   offset 0 rows
 | |
|   fetch first 2 rows with ties
 | |
| );
 | |
| 
 | |
| create view v2 as (
 | |
|   select * from t2
 | |
|   order by t2.location desc
 | |
|   offset 1 rows
 | |
|   fetch first 2 rows with ties
 | |
| );
 | |
| 
 | |
| create view v3 as (
 | |
|   select * from t2
 | |
|   order by t2.location desc
 | |
|   offset 2 rows
 | |
|   fetch first row with ties
 | |
| );
 | |
| 
 | |
| 
 | |
| 
 | |
| select * from v1;
 | |
| select * from v2;
 | |
| select * from v3;
 | |
| 
 | |
| show create view v1;
 | |
| show create view v2;
 | |
| show create view v3;
 | |
| 
 | |
| --echo #
 | |
| --echo # Test joins with views and order by referenced from the view.
 | |
| --echo #
 | |
| 
 | |
| --sorted_result
 | |
| select *
 | |
| from t1 inner join v1 on t1.id = v1.fk
 | |
| order by v1.location desc, t1.first_name
 | |
| offset 1 rows
 | |
| fetch first 1 rows with ties;
 | |
| 
 | |
| select first_name, last_name, sum(score)
 | |
| from t1
 | |
| group by first_name, last_name
 | |
| order by first_name;
 | |
| 
 | |
| --echo #
 | |
| --echo # Test with ties with group by. Make sure that if order by is a less
 | |
| --echo # specific sort of group by, that WITH TIES still gets executed.
 | |
| --echo #
 | |
| 
 | |
| explain
 | |
| select first_name, last_name, sum(score)
 | |
| from t1
 | |
| group by first_name, last_name
 | |
| order by first_name
 | |
| offset 1 rows
 | |
| fetch first 2 rows with ties;
 | |
| 
 | |
| --sorted_result
 | |
| select first_name, last_name, sum(score)
 | |
| from t1
 | |
| group by first_name, last_name
 | |
| order by first_name
 | |
| offset 1 rows
 | |
| fetch first 2 rows with ties;
 | |
| 
 | |
| 
 | |
| 
 | |
| drop table t1;
 | |
| drop table t2;
 | |
| drop view v1;
 | |
| drop view v2;
 | |
| drop view v3;
 | |
| 
 | |
| --echo #
 | |
| --echo # Test with ties when an index is used to provide the order by.
 | |
| --echo #
 | |
| create table t1 (id int, first_name varchar(100), last_name varchar(100), score double);
 | |
| 
 | |
| create index t1_name on t1 (first_name, last_name);
 | |
| 
 | |
| insert into t1 values
 | |
|   (1, 'Alice', 'Fowler', 5),
 | |
|   (2, 'John', 'Doe', 6),
 | |
|   (3, 'John', 'Smith', 6),
 | |
|   (4, 'John', 'Smith', 6),
 | |
|   (5, 'John', 'Smith', 7),
 | |
|   (6, 'John', 'Elton', 8.1),
 | |
|   (7, 'Bob',  'Trasc', 9),
 | |
|   (8, 'Silvia', 'Ganush', 10);
 | |
| 
 | |
| explain select first_name, last_name
 | |
| from t1
 | |
| order by first_name
 | |
| offset 1 rows
 | |
| fetch first 2 rows with ties;
 | |
| 
 | |
| explain select first_name, last_name
 | |
| from t1
 | |
| order by first_name desc
 | |
| fetch first 2 rows with ties;
 | |
| 
 | |
| 
 | |
| select first_name, last_name
 | |
| from t1
 | |
| order by first_name
 | |
| offset 1 rows
 | |
| fetch first 2 rows with ties;
 | |
| 
 | |
| select first_name, last_name
 | |
| from t1
 | |
| order by first_name desc
 | |
| fetch first 2 rows with ties;
 | |
| 
 | |
| 
 | |
| select first_name, last_name
 | |
| from t1
 | |
| order by first_name desc
 | |
| offset 1 rows
 | |
| fetch first 2 rows with ties;
 | |
| 
 | |
| select first_name, last_name
 | |
| from t1
 | |
| order by first_name desc
 | |
| offset 4 rows
 | |
| fetch first 2 rows with ties;
 | |
| 
 | |
| select first_name, last_name
 | |
| from t1
 | |
| order by first_name desc
 | |
| offset 4 rows
 | |
| fetch first 3 rows with ties;
 | |
| 
 | |
| explain select first_name, last_name
 | |
| from t1
 | |
| where first_name != 'John'
 | |
| order by first_name
 | |
| fetch first 2 rows with ties;
 | |
| 
 | |
| select first_name, last_name
 | |
| from t1
 | |
| where first_name != 'John'
 | |
| order by first_name
 | |
| fetch first 2 rows with ties;
 | |
| 
 | |
| 
 | |
| 
 | |
| select first_name, last_name
 | |
| from t1
 | |
| where first_name != 'John'
 | |
| group by first_name, last_name
 | |
| order by first_name
 | |
| fetch first 2 rows with ties;
 | |
| 
 | |
| 
 | |
| --echo #
 | |
| --echo # Test CTE support.
 | |
| --echo #
 | |
| explain with temp_table as (
 | |
|   select first_name, last_name
 | |
|   from t1
 | |
|   where first_name != 'John'
 | |
|   group by first_name, last_name
 | |
|   order by first_name
 | |
|   fetch first 2 rows with ties
 | |
| )
 | |
| select * from temp_table
 | |
| order by first_name, last_name;
 | |
| 
 | |
| with temp_table as (
 | |
|   select first_name, last_name
 | |
|   from t1
 | |
|   group by first_name, last_name
 | |
|   order by first_name
 | |
|   fetch first 3 rows with ties
 | |
| )
 | |
| select * from temp_table
 | |
| order by first_name, last_name;
 | |
| 
 | |
| with temp_table as (
 | |
|   select first_name, last_name
 | |
|   from t1
 | |
|   group by first_name, last_name
 | |
|   order by first_name
 | |
|   fetch first 3 rows with ties
 | |
| )
 | |
| select * from temp_table
 | |
| order by last_name
 | |
| fetch first 3 rows with ties;
 | |
| 
 | |
| --sorted_result
 | |
| with temp_table as (
 | |
|   select first_name, last_name
 | |
|   from t1
 | |
|   group by first_name, last_name
 | |
|   order by first_name
 | |
|   fetch first 3 rows with ties
 | |
| )
 | |
| select * from temp_table
 | |
| order by first_name
 | |
| fetch first 3 rows with ties;
 | |
| 
 | |
| --sorted_result
 | |
| with temp_table as (
 | |
|   select first_name, last_name
 | |
|   from t1
 | |
|   group by first_name, last_name
 | |
|   order by first_name
 | |
|   fetch first 3 rows with ties
 | |
| )
 | |
| select * from temp_table
 | |
| order by first_name
 | |
| offset 1 rows
 | |
| fetch first 2 rows with ties;
 | |
| 
 | |
| #enable after fix MDEV-29645
 | |
| --disable_view_protocol
 | |
| select first_name, row_number() over () rn
 | |
| from t1
 | |
| order by rn
 | |
| offset 1 rows
 | |
| fetch first 2 rows with ties;
 | |
| 
 | |
| select first_name, row_number() over () rn
 | |
| from t1
 | |
| order by rn desc
 | |
| offset 1 rows
 | |
| fetch first 2 rows with ties;
 | |
| --enable_view_protocol
 | |
| 
 | |
| select first_name, score, rank() over (ORDER BY score)
 | |
| from t1
 | |
| order by rank() over (ORDER BY score)
 | |
| fetch first 3 rows with ties;
 | |
| 
 | |
| select first_name, score, rank() over (ORDER BY score)
 | |
| from t1
 | |
| order by rank() over (ORDER BY score)
 | |
| offset 1 rows
 | |
| fetch first 2 rows with ties;
 | |
| 
 | |
| select first_name, score, rank() over (ORDER BY score)
 | |
| from t1
 | |
| order by rank() over (ORDER BY score)
 | |
| fetch first 6 rows with ties;
 | |
| 
 | |
| 
 | |
| --echo #
 | |
| --echo # Test nulls.
 | |
| --echo #
 | |
| create table t2 (id int, location varchar(100), time datetime, value int, fk int);
 | |
| 
 | |
| insert into t2 values (1, 'home', '2020-01-01 10:00', 10, 1);
 | |
| insert into t2 values (2, 'home', '2020-01-01 11:00', 11, 2);
 | |
| insert into t2 values (3, 'home', '2020-01-01 12:00', 12, 3);
 | |
| insert into t2 values (4, 'home', '2020-01-01 13:00', 13, 3);
 | |
| insert into t2 values (5, 'home', '2020-01-01 14:00', 13, 3);
 | |
| insert into t2 values (6, 'home', '2020-01-01 15:00', 13, 2);
 | |
| insert into t2 values (7, 'home', '2020-01-01 16:00', 13, 6);
 | |
| insert into t2 values (8, 'outside', '2020-01-01 17:00', 17, 6);
 | |
| insert into t2 values (9, 'outside', '2020-01-01 18:00', 17, 6);
 | |
| insert into t2 values (10, 'outside', '2020-01-01 19:00', 17, 8);
 | |
| insert into t2 values (11, 'outside', '2020-01-01 20:00', 16, 7);
 | |
| insert into t2 values (12, 'outside', '2020-01-01 21:00', 16, 7);
 | |
| 
 | |
| --sorted_result
 | |
| select *
 | |
| from t1 left join t2 on t1.id = t2.fk
 | |
| order by t2.location;
 | |
| 
 | |
| --sorted_result
 | |
| select *
 | |
| from t1 left join t2 on t1.id = t2.fk
 | |
| order by t2.location
 | |
| fetch first 1 row with ties;
 | |
| 
 | |
| --sorted_result
 | |
| select *
 | |
| from t1 left join t2 on t1.id = t2.fk
 | |
| order by t2.location
 | |
| fetch first 2 row with ties;
 | |
| 
 | |
| --sorted_result
 | |
| select *
 | |
| from t1 left join t2 on t1.id = t2.fk
 | |
| order by t2.location
 | |
| fetch first 3 row with ties;
 | |
| 
 | |
| --sorted_result
 | |
| select *
 | |
| from t1 left join t2 on t1.id = t2.fk
 | |
| order by t2.location
 | |
| offset 2 rows
 | |
| fetch first 1 row with ties;
 | |
| 
 | |
| 
 | |
| --echo #
 | |
| --echo # Test union-like operator with multiple fetch first clauses.
 | |
| --echo #
 | |
| select * from t1 order by 1 fetch first 3 rows with ties;
 | |
| select * from t1 order by first_name desc fetch first 3 rows with ties;
 | |
| 
 | |
| --sorted_result
 | |
| (select * from t1 order by 1 fetch first 3 rows with ties)
 | |
| intersect
 | |
| (select * from t1 order by first_name desc fetch first 3 rows with ties)
 | |
| order by first_name
 | |
| fetch first 1 row with ties;
 | |
| 
 | |
| --sorted_result
 | |
| (select * from t1 order by 1 fetch first 3 rows with ties)
 | |
| except
 | |
| (select * from t1 order by first_name desc fetch first 3 rows with ties)
 | |
| order by first_name
 | |
| fetch first 1 row with ties;
 | |
| 
 | |
| --sorted_result
 | |
| (select * from t1 order by 1 fetch first 3 rows with ties)
 | |
| except
 | |
| (select * from t1 order by first_name desc fetch first 3 rows with ties)
 | |
| order by first_name
 | |
| offset 1 rows
 | |
| fetch first 1 row with ties;
 | |
| 
 | |
| --sorted_result
 | |
| select sum(score)
 | |
| from t1
 | |
| order by 1
 | |
| fetch first 2 rows with ties;
 | |
| 
 | |
| --sorted_result
 | |
| select sum(score)
 | |
| from t1
 | |
| group by id
 | |
| order by 1
 | |
| fetch first 2 rows with ties;
 | |
| 
 | |
| drop table t1;
 | |
| drop table t2;
 | |
| 
 | |
| --echo #
 | |
| --echo # Test SQL_CALC_FOUND_ROWS
 | |
| --echo #
 | |
| create table t1 (a int, b int, index (a,b));
 | |
| insert into t1 values (1,1), (1,2), (1,3), (2,1), (2,2), (3,1);
 | |
| 
 | |
| #enable after fix MDEV-29645
 | |
| --disable_view_protocol
 | |
| select SQL_CALC_FOUND_ROWS a, b, count(*)
 | |
| from t1
 | |
| group by a, b
 | |
| order by a
 | |
| fetch first 1 rows with ties;
 | |
| --disable_ps2_protocol
 | |
| SELECT FOUND_ROWS();
 | |
| --enable_ps2_protocol
 | |
| 
 | |
| --sorted_result
 | |
| select SQL_CALC_FOUND_ROWS a, b
 | |
| from t1
 | |
| order by a
 | |
| fetch first 1 rows with ties;
 | |
| --disable_ps2_protocol
 | |
| SELECT FOUND_ROWS();
 | |
| --enable_ps2_protocol
 | |
| --enable_view_protocol
 | |
| 
 | |
| --echo #
 | |
| --echo # Test index read optimization with ORDER BY as sub part of GROUP BY
 | |
| --echo #
 | |
| explain select a, b, count(*)
 | |
| from t1
 | |
| group by a, b
 | |
| order by a;
 | |
| 
 | |
| explain select a, b, count(*)
 | |
| from t1
 | |
| group by a, b
 | |
| order by a
 | |
| fetch first 1 rows with ties;
 | |
| 
 | |
| --echo #
 | |
| --echo # Test FETCH ... WITH TIES / ONLY with prepared statements
 | |
| --echo #
 | |
| 
 | |
| prepare s from "select a, b from t1 order by a fetch first ? rows with ties";
 | |
| 
 | |
| set @a='qwe';
 | |
| execute s using @a;
 | |
| 
 | |
| set @a=-1;
 | |
| --error ER_WRONG_ARGUMENTS
 | |
| execute s using @a;
 | |
| 
 | |
| prepare s2 from "select a, b from t1 order by a offset ? rows fetch first ? rows with ties";
 | |
| set @offset=1;
 | |
| set @limit_count= 2;
 | |
| execute s2 using @offset, @limit_count;
 | |
| 
 | |
| execute s2 using @offset, 3;
 | |
| 
 | |
| --error ER_WRONG_ARGUMENTS
 | |
| execute s2 using -1, 3;
 | |
| 
 | |
| --echo #
 | |
| --echo # Test with ties with a constant order by.
 | |
| --echo #
 | |
| select a, b
 | |
| from t1
 | |
| order by 'x'
 | |
| fetch first 2 rows with ties;
 | |
| 
 | |
| select b, sum(a)
 | |
| from t1
 | |
| group by b
 | |
| order by 'x', 'y', 'z'
 | |
| fetch first 2 rows with ties;
 | |
| 
 | |
| --echo #
 | |
| --echo # Test with ties when group by is used and order by gets eliminated.
 | |
| --echo #
 | |
| --sorted_result
 | |
| select b, sum(a)
 | |
| from t1
 | |
| group by b
 | |
| order by 'x', 'y', 'z'
 | |
| fetch first 2 rows with ties;
 | |
| 
 | |
| --echo #
 | |
| --echo # Test an ill formed SELECT using MySQL/MariaDBs group by extension
 | |
| --echo # of not requiring all non-aggregate fields to be part of group
 | |
| --echo # by.
 | |
| --echo #
 | |
| --sorted_result
 | |
| select b, a, sum(a)
 | |
| from t1
 | |
| group by a
 | |
| order by b, 'x', 'y', 'z'
 | |
| fetch first 2 rows with ties;
 | |
| 
 | |
| delete from t1;
 | |
| insert into t1 values (1,1), (1,2), (1,3), (2,1), (2,2), (3,2), (3, 3);
 | |
| 
 | |
| --sorted_result
 | |
| select b, a, sum(a)
 | |
| from t1
 | |
| group by a
 | |
| order by b, 'x', 'y', 'z'
 | |
| fetch first 1 rows with ties;
 | |
| 
 | |
| --sorted_result
 | |
| select b, a, sum(a)
 | |
| from t1
 | |
| group by a
 | |
| order by 'x', b, 'x', 'y', 'z'
 | |
| fetch first 1 rows with ties;
 | |
| 
 | |
| --sorted_result
 | |
| select b, a, sum(a)
 | |
| from t1
 | |
| group by a
 | |
| order by 'x', 'y', b
 | |
| fetch first 1 rows with ties;
 | |
| 
 | |
| 
 | |
| --echo #
 | |
| --echo # Test with ties when order by a const column is used.
 | |
| --echo #
 | |
| select a, b
 | |
| from t1
 | |
| order by a, 'a'
 | |
| fetch first 2 rows with ties;
 | |
| 
 | |
| --echo #
 | |
| --echo # Order by aggregates.
 | |
| --echo #
 | |
| --sorted_result
 | |
| select a, b, sum(a)
 | |
| from t1
 | |
| group by a, b
 | |
| order by sum(a)
 | |
| fetch first 1 rows with ties;
 | |
| 
 | |
| --echo # Test different sum function in order by, not present in select list.
 | |
| --sorted_result
 | |
| select a, b, sum(a)
 | |
| from t1
 | |
| group by a, b
 | |
| order by sum(b)
 | |
| fetch first 1 rows with ties;
 | |
| 
 | |
| --echo # Test aggregates with constant columns in order by.
 | |
| --sorted_result
 | |
| select a, b, sum(a)
 | |
| from t1
 | |
| group by a, b
 | |
| order by a
 | |
| fetch first 1 rows with ties;
 | |
| 
 | |
| select a, b, sum(a)
 | |
| from t1
 | |
| group by a, b
 | |
| order by a, 'x'
 | |
| fetch first 1 rows with ties;
 | |
| 
 | |
| select a, b, sum(a)
 | |
| from t1
 | |
| group by a, b
 | |
| order by a, b
 | |
| fetch first 1 rows with ties;
 | |
| 
 | |
| select a, b, sum(a)
 | |
| from t1
 | |
| group by a, b
 | |
| order by a, b
 | |
| fetch first 2 rows with ties;
 | |
| 
 | |
| select a, b, sum(a)
 | |
| from t1
 | |
| group by a, b
 | |
| order by a, b, 'x'
 | |
| fetch first 1 rows with ties;
 | |
| 
 | |
| select a, b, sum(a)
 | |
| from t1
 | |
| group by a, 'x', b
 | |
| order by a, b, 'x'
 | |
| fetch first 1 rows with ties;
 | |
| 
 | |
| select a, b, sum(a)
 | |
| from t1
 | |
| group by 'x', a, b
 | |
| order by a, b, 'x'
 | |
| fetch first 1 rows with ties;
 | |
| 
 | |
| 
 | |
| select a, b, sum(a)
 | |
| from t1
 | |
| group by a, b
 | |
| order by 'x', a, 'x', b, 't', b
 | |
| fetch first 1 rows with ties;
 | |
| 
 | |
| --sorted_result
 | |
| select a, b, sum(a)
 | |
| from t1
 | |
| group by a, b
 | |
| order by b, 't', b
 | |
| fetch first 1 rows with ties;
 | |
| 
 | |
| --echo #
 | |
| --echo # Test with subqueries in order by
 | |
| --echo #
 | |
| select a, b, sum(a)
 | |
| from t1
 | |
| group by a, b
 | |
| order by (select 1)
 | |
| fetch first 1 rows with ties;
 | |
| 
 | |
| select a, b, sum(a)
 | |
| from t1
 | |
| group by a, b
 | |
| order by (select 1), a
 | |
| fetch first 1 rows with ties;
 | |
| 
 | |
| select a, b, sum(a)
 | |
| from t1
 | |
| group by a, b
 | |
| order by (select 1), a
 | |
| fetch first 1 rows with ties;
 | |
| 
 | |
| drop table t1;
 | |
| 
 | |
| --echo #
 | |
| --echo # MDEV-25441
 | |
| --echo # WITH TIES is not respected with SQL_BUFFER_RESULT and constant in ORDER BY
 | |
| --echo #
 | |
| CREATE TABLE t1 (a INT);
 | |
| INSERT INTO t1 values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);
 | |
| 
 | |
| explain SELECT SQL_BUFFER_RESULT 1 AS f FROM t1 ORDER BY f FETCH NEXT 2 ROW WITH TIES;
 | |
| SELECT SQL_BUFFER_RESULT 1 AS f FROM t1 ORDER BY f FETCH NEXT 2 ROW WITH TIES;
 | |
| SELECT 1 AS f FROM t1 ORDER BY f FETCH NEXT 2 ROW WITH TIES;
 | |
| 
 | |
| drop table t1;
 | |
| 
 | |
| --echo #
 | |
| --echo # MDEV-25481: Memory leak upon query WITH TIES involving a blob
 | |
| --echo #
 | |
| CREATE TABLE t (a TEXT);
 | |
| INSERT INTO t VALUES ('foo'),('bar');
 | |
| SELECT a FROM t ORDER BY a FETCH FIRST 2 ROWS WITH TIES;
 | |
| 
 | |
| # Cleanup
 | |
| DROP TABLE t;
 | |
| 
 | |
| --echo #
 | |
| --echo # MDEV-30324: Wrong result upon SELECT DISTINCT .. WITH TIES using index
 | |
| --echo #
 | |
| CREATE TABLE t1 (a int, b char(3), KEY (a));
 | |
| INSERT INTO t1 VALUES (2,'foo'),(3,'bar'),(3,'bar'),(3,'zzz');
 | |
| 
 | |
| EXPLAIN SELECT DISTINCT a, b FROM t1 ORDER BY a FETCH FIRST 1 ROWS WITH TIES;
 | |
| --sorted_result
 | |
| SELECT DISTINCT a, b FROM t1 ORDER BY a FETCH FIRST 1 ROWS WITH TIES;
 | |
| EXPLAIN SELECT DISTINCT a, b FROM t1 ORDER BY a FETCH FIRST 2 ROWS WITH TIES;
 | |
| --sorted_result
 | |
| SELECT DISTINCT a, b FROM t1 ORDER BY a FETCH FIRST 2 ROWS WITH TIES;
 | |
| EXPLAIN SELECT DISTINCT a, b FROM t1 ORDER BY a FETCH FIRST 3 ROWS WITH TIES;
 | |
| --sorted_result
 | |
| SELECT DISTINCT a, b FROM t1 ORDER BY a FETCH FIRST 3 ROWS WITH TIES;
 | |
|  
 | |
| # Cleanup
 | |
| DROP TABLE t1;
 | 
