mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 12:02:42 +01:00
3ad228d7fb
The problem is that the offset argument of the limit clause might be truncated on a 32-bits server built without big tables support. The truncation was happening because the original 64-bits long argument was being cast to a 32-bits (ha_rows) offset counter. The solution is to check if the conversing resulted in value truncation and if so, the offset is set to the maximum possible value that can fit on the type. mysql-test/r/limit.result: Add test case result for Bug#37075 mysql-test/t/limit.test: Add test case for Bug#37075 sql/sql_lex.cc: Check for truncation of the offset value. If value was truncated, set to the maximum possible value.
105 lines
2.5 KiB
Text
105 lines
2.5 KiB
Text
#
|
|
# Test of update and delete with limit
|
|
#
|
|
|
|
--disable_warnings
|
|
drop table if exists t1;
|
|
--enable_warnings
|
|
|
|
create table t1 (a int not null default 0 primary key, b int not null default 0);
|
|
insert into t1 () values (); # Testing default values
|
|
insert into t1 values (1,1),(2,1),(3,1);
|
|
update t1 set a=4 where b=1 limit 1;
|
|
select * from t1;
|
|
update t1 set b=2 where b=1 limit 2;
|
|
select * from t1;
|
|
update t1 set b=4 where b=1;
|
|
select * from t1;
|
|
delete from t1 where b=2 limit 1;
|
|
select * from t1;
|
|
delete from t1 limit 1;
|
|
select * from t1;
|
|
drop table t1;
|
|
|
|
create table t1 (i int);
|
|
insert into t1 (i) values(1),(1),(1);
|
|
delete from t1 limit 1;
|
|
update t1 set i=2 limit 1;
|
|
delete from t1 limit 0;
|
|
update t1 set i=3 limit 0;
|
|
select * from t1;
|
|
drop table t1;
|
|
|
|
# LIMIT 0
|
|
|
|
select 0 limit 0;
|
|
|
|
#
|
|
# Test with DELETE, ORDER BY and limit (bug #1024)
|
|
#
|
|
|
|
CREATE TABLE t1(id int auto_increment primary key, id2 int, index(id2));
|
|
INSERT INTO t1 (id2) values (0),(0),(0);
|
|
DELETE FROM t1 WHERE id=1;
|
|
INSERT INTO t1 SET id2=0;
|
|
SELECT * FROM t1;
|
|
DELETE FROM t1 WHERE id2 = 0 ORDER BY id LIMIT 1;
|
|
# should have deleted WHERE id=2
|
|
SELECT * FROM t1;
|
|
DELETE FROM t1 WHERE id2 = 0 ORDER BY id desc LIMIT 1;
|
|
SELECT * FROM t1;
|
|
DROP TABLE t1;
|
|
|
|
#
|
|
# Bug#8023 - limit on UNION with from DUAL, causes syntax error
|
|
#
|
|
create table t1 (a integer);
|
|
insert into t1 values (1);
|
|
# both queries must return one row
|
|
select 1 as a from t1 union all select 1 from dual limit 1;
|
|
(select 1 as a from t1) union all (select 1 from dual) limit 1;
|
|
drop table t1;
|
|
|
|
#
|
|
# Bug #21787: COUNT(*) + ORDER BY + LIMIT returns wrong result
|
|
#
|
|
create table t1 (a int);
|
|
insert into t1 values (1),(2),(3),(4),(5),(6),(7);
|
|
explain select count(*) c FROM t1 WHERE a > 0 ORDER BY c LIMIT 3;
|
|
select count(*) c FROM t1 WHERE a > 0 ORDER BY c LIMIT 3;
|
|
explain select sum(a) c FROM t1 WHERE a > 0 ORDER BY c LIMIT 3;
|
|
select sum(a) c FROM t1 WHERE a > 0 ORDER BY c LIMIT 3;
|
|
drop table t1;
|
|
# End of 4.1 tests
|
|
|
|
#
|
|
# Bug #28464: a string argument to 'limit ?' PS
|
|
#
|
|
|
|
prepare s from "select 1 limit ?";
|
|
set @a='qwe';
|
|
execute s using @a;
|
|
set @a=-1;
|
|
--error ER_WRONG_ARGUMENTS
|
|
execute s using @a;
|
|
prepare s from "select 1 limit 1, ?";
|
|
--error ER_WRONG_ARGUMENTS
|
|
execute s using @a;
|
|
prepare s from "select 1 limit ?, ?";
|
|
--error ER_WRONG_ARGUMENTS
|
|
execute s using @a, @a;
|
|
set @a=14632475938453979136;
|
|
execute s using @a, @a;
|
|
set @a=-14632475938453979136;
|
|
--error ER_WRONG_ARGUMENTS
|
|
execute s using @a, @a;
|
|
|
|
--echo End of 5.0 tests
|
|
|
|
#
|
|
# Bug#37075: offset of limit clause might be truncated to 0 on 32-bits server w/o big tables
|
|
#
|
|
|
|
select 1 as a limit 4294967296,10;
|
|
|
|
--echo End of 5.1 tests
|