diff options
Diffstat (limited to 'mysql-test/suite/engines/iuds/t/insert_decimal.test')
-rw-r--r-- | mysql-test/suite/engines/iuds/t/insert_decimal.test | 976 |
1 files changed, 976 insertions, 0 deletions
diff --git a/mysql-test/suite/engines/iuds/t/insert_decimal.test b/mysql-test/suite/engines/iuds/t/insert_decimal.test new file mode 100644 index 00000000..c75fa195 --- /dev/null +++ b/mysql-test/suite/engines/iuds/t/insert_decimal.test @@ -0,0 +1,976 @@ +--disable_warnings +DROP TABLE IF EXISTS t1,t2; +--enable_warnings + +######## Running INSERT tests for DECIMAL ######## + +# Create tables +CREATE TABLE t1(c1 DECIMAL(10,5) UNSIGNED NOT NULL, c2 DECIMAL(10,5) SIGNED NULL, c3 DECIMAL, c4 INT, UNIQUE INDEX idx(c1,c2)); +CREATE TABLE t2(c1 DECIMAL(10,0) SIGNED NOT NULL, c2 DECIMAL(10) UNSIGNED NULL, c3 DECIMAL, c4 INT); + +# Test insert values, trailing zeroes are not stripped +INSERT INTO t1 VALUES('00100.05000','-00100.05000','00100.05000',1); +INSERT INTO t2 VALUES('-1000000000','1000000000','1000000000',2); + +# Test no approximation +INSERT INTO t1(c1) VALUES('12345.000009'); + +# Test insert max values +INSERT INTO t1 VALUES('99999.99999','-99999.99999','99999.99999',3); +INSERT IGNORE INTO t2 VALUES('-9999999999','-9999999999','9999999999',4); + +# Test insert outside max value, would be clipped to closest endpoint +--sorted_result +SELECT * FROM t1; +--error ER_DUP_ENTRY +SET STATEMENT sql_mode = '' FOR +INSERT INTO t1 VALUES('100000.000002','-100000.000002','100000.000002',5); +DELETE FROM t1 WHERE c1='99999.99999' AND c2='-99999.99999'; +--sorted_result +SELECT * FROM t1; +INSERT IGNORE INTO t1 VALUES('100000.000002','-100000.000002','100000.000002',5); +INSERT IGNORE INTO t2 VALUES('10000000000','-10000000000','10000000000',6); + +# Test insert leading zero, +/- signs, overflow handling +insert into t1 values ("0.0","0.0","0.0",7),("01.0","01.0","01.0",10); +insert ignore into t1 values ("-.1","-.1","-.1",13); +insert ignore into t1 values ("+111111111.11","+111111111.11","+111111111.11",19); +insert ignore into t2 values ("0.0","0.0","0.0",7),("-0.0","-0.0","-0.0",8),("+0.0","+0.0","+0.0",9),("01.0","01.0","01.0",10),("+01.0","+01.0","+01.0",11),("-01.0","-01.0","-01.0",12); +insert ignore into t2 values ("-.1","-.1","-.1",13),("+.1","+.1","+.1",14),(".1",".1",".1",15); +insert ignore into t2 values ("00000000000001","00000000000001","00000000000001",16),("+0000000000001","+0000000000001","+0000000000001",17),("-0000000000001","-0000000000001","-0000000000001",18); +insert ignore into t2 values ("+111111111.11","+111111111.11","+111111111.11",19),("111111111.11","111111111.11","111111111.11",20),("-11111111.11","-11111111.11","-11111111.11",21); +insert ignore into t2 values ("-111111111.11","-111111111.11","-111111111.11",22),("+1111111111.11","+1111111111.11","+1111111111.11",23),("1111111111.11","1111111111.11","1111111111.11",24); +insert ignore into t2 values ("1e+1000","1e+1000","1e+1000",25),("1e-1000","1e-1000","1e-1000",26),("-1e+1000","-1e+1000","-1e+1000",27); +insert ignore into t2 values ("1e+4294967296","1e+4294967296","1e+4294967296",28),("1e-4294967296","1e-4294967296","1e-4294967296",29); +insert ignore into t2 values ("1e+18446744073709551615","1e+18446744073709551615","1e+18446744073709551615",30),("1e+18446744073709551616","1e+18446744073709551616","1e+18446744073709551616",31),("1e-9223372036854775807","1e-9223372036854775807","1e-9223372036854775807",32),("1e-9223372036854775809","1e-9223372036854775809","1e-9223372036854775809",33); + +# Now Select +--sorted_result +SELECT * FROM t1; +--sorted_result +SELECT * FROM t2; +SELECT count(*) as total_rows, min(c1) as min_value, max(c1) as max_value, sum(c1) as sum, avg(c1) as avg FROM t1; +SELECT count(*) as total_rows, min(c2) as min_value, max(c2) as max_value, sum(c2) as sum, avg(c2) as avg FROM t1; +SELECT count(*) as total_rows, min(c3) as min_value, max(c3) as max_value, sum(c3) as sum, avg(c3) as avg FROM t1; +SELECT count(*) as total_rows, min(c1) as min_value, max(c1) as max_value, sum(c1) as sum, avg(c1) as avg FROM t2; +SELECT count(*) as total_rows, min(c2) as min_value, max(c2) as max_value, sum(c2) as sum, avg(c2) as avg FROM t2; +SELECT count(*) as total_rows, min(c3) as min_value, max(c3) as max_value, sum(c3) as sum, avg(c3) as avg FROM t2; + +# Select using various access methods +## Full table scan ## +--sorted_result +SELECT * FROM t1; +--sorted_result +SELECT count(*) as total_rows, min(c1) as min_value, max(c1) FROM t1; +--sorted_result +SELECT * FROM t1 WHERE c3 = '0.0'; + +## Forward index scan, covering ## +--sorted_result +SELECT c1,c2 FROM t1; + +## Backward index scan, covering ## +SELECT c1,c2 FROM t1 ORDER BY c1,c2 DESC; + +## Forward index scan, non-covering ## +SELECT * FROM t1 ORDER BY c1,c2 LIMIT 2; + +## Backward index scan, non-covering ## +SELECT * FROM t1 ORDER BY c1,c2 DESC LIMIT 2; + +## ref type access +SELECT * FROM t1 WHERE c1 = '0.0' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 = '0.0' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 = '0.0' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 = '0.0' ORDER BY c1,c2 DESC LIMIT 2; + +## Range access, ordered ## +SELECT * FROM t1 WHERE c1 <> '0.0' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 <> '0.0' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 > '0.0' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 > '0.0' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 >= '0.0' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 >= '0.0' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 < '0.0' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 < '0.0' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 <= '0.0' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 <= '0.0' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 <=> '0.0' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 <=> '0.0' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 BETWEEN '0.0' AND '99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 BETWEEN '0.0' AND '99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 IN ('0.0','99999.99999') ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 IN ('0.0','99999.99999') ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 >= '0.0' AND c1 < '99999.99999' AND c2 = '1.0' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 >= '0.0' AND c1 < '99999.99999' AND c2 = '1.0' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 IS NULL ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 IS NULL ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 IS NOT NULL ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 IS NOT NULL ORDER BY c1,c2 LIMIT 2; + +## Range access, backwards scan ## +SELECT * FROM t1 WHERE c1 <> '0.0' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 <> '0.0' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 > '0.0' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 > '0.0' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 >= '0.0' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 >= '0.0' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 < '0.0' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 < '0.0' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 <= '0.0' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 <= '0.0' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 <=> '0.0' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 <=> '0.0' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 BETWEEN '0.0' AND '99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 BETWEEN '0.0' AND '99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 IN ('0.0','99999.99999') ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 IN ('0.0','99999.99999') ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 >= '0.0' AND c1 < '99999.99999' AND c2 = '1.0' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 >= '0.0' AND c1 < '99999.99999' AND c2 = '1.0' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 IS NULL ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 IS NULL ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 IS NOT NULL ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 IS NOT NULL ORDER BY c1,c2 DESC LIMIT 2; +## Full table scan ## +--sorted_result +SELECT * FROM t1; +--sorted_result +SELECT count(*) as total_rows, min(c1) as min_value, max(c1) FROM t1; +--sorted_result +SELECT * FROM t1 WHERE c3 = '-0.0'; + +## Forward index scan, covering ## +--sorted_result +SELECT c1,c2 FROM t1; + +## Backward index scan, covering ## +SELECT c1,c2 FROM t1 ORDER BY c1,c2 DESC; + +## Forward index scan, non-covering ## +SELECT * FROM t1 ORDER BY c1,c2 LIMIT 2; + +## Backward index scan, non-covering ## +SELECT * FROM t1 ORDER BY c1,c2 DESC LIMIT 2; + +## ref type access +SELECT * FROM t1 WHERE c1 = '99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 = '99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 = '99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 = '99999.99999' ORDER BY c1,c2 DESC LIMIT 2; + +## Range access, ordered ## +SELECT * FROM t1 WHERE c1 <> '99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 <> '99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 > '99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 > '99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 >= '99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 >= '99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 < '99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 < '99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 <= '99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 <= '99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 <=> '99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 <=> '99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 BETWEEN '100.05' AND '99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 BETWEEN '100.05' AND '99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 IN ('100.05','99999.99999') ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 IN ('100.05','99999.99999') ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 >= '100.05' AND c1 < '99999.99999' AND c2 = '99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 >= '100.05' AND c1 < '99999.99999' AND c2 = '99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 IS NULL ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 IS NULL ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 IS NOT NULL ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 IS NOT NULL ORDER BY c1,c2 LIMIT 2; + +## Range access, backwards scan ## +SELECT * FROM t1 WHERE c1 <> '99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 <> '99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 > '99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 > '99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 >= '99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 >= '99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 < '99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 < '99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 <= '99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 <= '99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 <=> '99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 <=> '99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 BETWEEN '100.05' AND '99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 BETWEEN '100.05' AND '99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 IN ('100.05','99999.99999') ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 IN ('100.05','99999.99999') ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 >= '100.05' AND c1 < '99999.99999' AND c2 = '99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 >= '100.05' AND c1 < '99999.99999' AND c2 = '99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 IS NULL ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 IS NULL ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 IS NOT NULL ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 IS NOT NULL ORDER BY c1,c2 DESC LIMIT 2; +## Full table scan ## +--sorted_result +SELECT * FROM t1; +--sorted_result +SELECT count(*) as total_rows, min(c2) as min_value, max(c2) FROM t1; +--sorted_result +SELECT * FROM t1 WHERE c3 = '-0.0'; + +## Forward index scan, covering ## +--sorted_result +SELECT c1,c2 FROM t1; + +## Backward index scan, covering ## +SELECT c1,c2 FROM t1 ORDER BY c1,c2 DESC; + +## Forward index scan, non-covering ## +SELECT * FROM t1 ORDER BY c1,c2 LIMIT 2; + +## Backward index scan, non-covering ## +SELECT * FROM t1 ORDER BY c1,c2 DESC LIMIT 2; + +## ref type access +SELECT * FROM t1 WHERE c2 = '-99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c2 = '-99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c2 = '-99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c2 = '-99999.99999' ORDER BY c1,c2 DESC LIMIT 2; + +## Range access, ordered ## +SELECT * FROM t1 WHERE c2 <> '-99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c2 <> '-99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c2 > '-99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c2 > '-99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c2 >= '-99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c2 >= '-99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c2 < '-99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c2 < '-99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c2 <= '-99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c2 <= '-99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c2 <=> '-99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c2 <=> '-99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c2 BETWEEN '-99999.99999' AND '0.0' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c2 BETWEEN '-99999.99999' AND '0.0' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c2 IN ('-99999.99999','0.0') ORDER BY c1,c2; +SELECT * FROM t1 WHERE c2 IN ('-99999.99999','0.0') ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c2 >= '-99999.99999' AND c2 < '0.0' AND c1 = '99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c2 >= '-99999.99999' AND c2 < '0.0' AND c1 = '99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c2 IS NULL ORDER BY c1,c2; +SELECT * FROM t1 WHERE c2 IS NULL ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c2 IS NOT NULL ORDER BY c1,c2; +SELECT * FROM t1 WHERE c2 IS NOT NULL ORDER BY c1,c2 LIMIT 2; + +## Range access, backwards scan ## +SELECT * FROM t1 WHERE c2 <> '-99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c2 <> '-99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c2 > '-99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c2 > '-99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c2 >= '-99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c2 >= '-99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c2 < '-99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c2 < '-99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c2 <= '-99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c2 <= '-99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c2 <=> '-99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c2 <=> '-99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c2 BETWEEN '-99999.99999' AND '0.0' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c2 BETWEEN '-99999.99999' AND '0.0' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c2 IN ('-99999.99999','0.0') ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c2 IN ('-99999.99999','0.0') ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c2 >= '-99999.99999' AND c2 < '0.0' AND c1 = '99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c2 >= '-99999.99999' AND c2 < '0.0' AND c1 = '99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c2 IS NULL ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c2 IS NULL ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c2 IS NOT NULL ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c2 IS NOT NULL ORDER BY c1,c2 DESC LIMIT 2; + +# Using index for group-by +--sorted_result +SELECT c1 FROM t1 GROUP BY c1; +--sorted_result +SELECT DISTINCT c1 FROM t1; +--sorted_result +SELECT c1,MIN(c2) FROM t1 GROUP BY c1; + +# Test extremes +CREATE TABLE t5(c1 DECIMAL(65,0) UNSIGNED NOT NULL, c2 DECIMAL(65,0) SIGNED NULL, c3 DECIMAL, c4 INT, INDEX idx(c1,c2)); +INSERT IGNORE INTO t5 VALUES('1e+64','-1e+64','1e+64',1),('1e-64','-1e-64','1e-64',2); +INSERT IGNORE INTO t5 VALUES('1.2e+65','-1.2e+65','1.2e+65',3),('1.2e-65','-1.2e-65','1.2e-65',4); +--sorted_result +SELECT * FROM t5; +DROP TABLE t5; + +# Test encoding to various bytes +CREATE TABLE t5(c1 DECIMAL(18,9) UNSIGNED, c2 DECIMAL(18,9) SIGNED) /* requires 8 bytes */; +INSERT INTO t5 VALUES(123456789.123456789,-123456789.123456789); +--sorted_result +SELECT c1,c2 FROM t5; +ALTER TABLE t5 CHANGE c1 c1 DECIMAL(19,9) UNSIGNED, CHANGE c2 c2 DECIMAL(19,9) SIGNED /* requires 9 bytes */; +INSERT INTO t5 VALUES(1234567891.123456789,-1234567891.123456789); +--sorted_result +SELECT c1,c2 FROM t5; +ALTER TABLE t5 CHANGE c1 c1 DECIMAL(21,10) UNSIGNED, CHANGE c2 c2 DECIMAL(21,10) SIGNED /* requires 10 bytes */; +INSERT INTO t5 VALUES(12345678912.1234567891,-12345678912.1234567891); +--sorted_result +SELECT c1,c2 FROM t5; +ALTER TABLE t5 CHANGE c1 c1 DECIMAL(23,11) UNSIGNED, CHANGE c2 c2 DECIMAL(23,11) SIGNED /* requires 11 bytes */; +INSERT INTO t5 VALUES(123456789123.12345678912,-123456789123.12345678912); +--sorted_result +SELECT c1,c2 FROM t5; +ALTER TABLE t5 CHANGE c1 c1 DECIMAL(25,12) UNSIGNED, CHANGE c2 c2 DECIMAL(25,12) SIGNED /* requires 12 bytes */; +INSERT INTO t5 VALUES(1234567891234.123456789123,-1234567891234.123456789123); +--sorted_result +SELECT c1,c2 FROM t5; +SELECT SUM(c1),SUM(c2) FROM t5; +DROP TABLE t5; + +# Test ROUND() and TRUNCATE() +CREATE TABLE t5(c1 DECIMAL(16,6), c2 tinyint); +INSERT INTO t5 VALUES(1.1325,3); +SELECT ROUND(c1,c2),TRUNCATE(c1,c2) FROM t5; +DROP TABLE t5; + +# Test wrong decimal types +--error ER_TOO_BIG_PRECISION +CREATE TABLE t7(c1 DECIMAL(66,0)); +--error ER_M_BIGGER_THAN_D +CREATE TABLE t7(c1 DECIMAL(5,10)); +DROP TABLE t1,t2; + +######## Running INSERT tests for FLOAT ######## + +# Create tables +CREATE TABLE t1(c1 FLOAT(10,5) UNSIGNED NOT NULL, c2 FLOAT(10,5) SIGNED NULL, c3 FLOAT, c4 INT, UNIQUE INDEX idx(c1,c2)); +CREATE TABLE t2(c1 FLOAT(10,0) SIGNED NOT NULL, c2 FLOAT(10,0) UNSIGNED NULL, c3 FLOAT, c4 INT); + +# Test insert values, trailing zeroes are not stripped +INSERT INTO t1 VALUES('00100.05000','-00100.05000','00100.05000',1); +INSERT INTO t2 VALUES('-1000000000','1000000000','1000000000',2); + +# Test approximation +INSERT INTO t1(c1) VALUES('12345.000009'); + +# Test insert max values +INSERT INTO t1 VALUES('99999.99999','-99999.99999','99999.99999',3); +INSERT IGNORE INTO t2 VALUES('-9999999999','-9999999999','9999999999',4); + +# Test insert outside max value, would be clipped to closest endpoint +SELECT * FROM t1; +--error ER_DUP_ENTRY +SET STATEMENT sql_mode = '' FOR +INSERT INTO t1 VALUES('100000.000002','-100000.000002','100000.000002',5); +DELETE FROM t1 WHERE c1='100000.00000' AND c2='-100000.00000'; +INSERT IGNORE INTO t1 VALUES('100000.000002','-100000.000002','100000.000002',5); +INSERT IGNORE INTO t2 VALUES('10000000000','-10000000000','10000000000',6); + +# Test insert leading zero, +/- signs, overflow handling +insert into t1 values ("0.0","0.0","0.0",7),("01.0","01.0","01.0",10); +insert ignore into t1 values ("-.1","-.1","-.1",13); +insert ignore into t1 values ("+111111111.11","+111111111.11","+111111111.11",19); +insert ignore into t2 values ("0.0","0.0","0.0",7),("-0.0","-0.0","-0.0",8),("+0.0","+0.0","+0.0",9),("01.0","01.0","01.0",10),("+01.0","+01.0","+01.0",11),("-01.0","-01.0","-01.0",12); +insert ignore into t2 values ("-.1","-.1","-.1",13),("+.1","+.1","+.1",14),(".1",".1",".1",15); +insert ignore into t2 values ("00000000000001","00000000000001","00000000000001",16),("+0000000000001","+0000000000001","+0000000000001",17),("-0000000000001","-0000000000001","-0000000000001",18); +insert ignore into t2 values ("+111111111.11","+111111111.11","+111111111.11",19),("111111111.11","111111111.11","111111111.11",20),("-11111111.11","-11111111.11","-11111111.11",21); +insert ignore into t2 values ("-111111111.11","-111111111.11","-111111111.11",22),("+1111111111.11","+1111111111.11","+1111111111.11",23),("1111111111.11","1111111111.11","1111111111.11",24); +insert ignore into t2 values ("1e+1000","1e+1000","1e+1000",25),("1e-1000","1e-1000","1e-1000",26),("-1e+1000","-1e+1000","-1e+1000",27); +insert ignore into t2 values ("1e+4294967296","1e+4294967296","1e+4294967296",28),("1e-4294967296","1e-4294967296","1e-4294967296",29); +insert ignore into t2 values ("1e+18446744073709551615","1e+18446744073709551615","1e+18446744073709551615",30),("1e+18446744073709551616","1e+18446744073709551616","1e+18446744073709551616",31),("1e-9223372036854775807","1e-9223372036854775807","1e-9223372036854775807",32),("1e-9223372036854775809","1e-9223372036854775809","1e-9223372036854775809",33); + +# Now Select +--sorted_result +SELECT * FROM t1; +--sorted_result +SELECT * FROM t2; +SELECT count(*) as total_rows, min(c1) as min_value, max(c1) as max_value, sum(c1) as sum, avg(c1) as avg FROM t1; +SELECT count(*) as total_rows, min(c2) as min_value, max(c2) as max_value, sum(c2) as sum, avg(c2) as avg FROM t1; +SELECT count(*) as total_rows, min(c3) as min_value, max(c3) as max_value, sum(c3) as sum, avg(c3) as avg FROM t1; +SELECT count(*) as total_rows, min(c1) as min_value, max(c1) as max_value, sum(c1) as sum, avg(c1) as avg FROM t2; +SELECT count(*) as total_rows, min(c2) as min_value, max(c2) as max_value, sum(c2) as sum, avg(c2) as avg FROM t2; +SELECT count(*) as total_rows, min(c3) as min_value, max(c3) as max_value, sum(c3) as sum, avg(c3) as avg FROM t2; + +# Select using various access methods +## Full table scan ## +--sorted_result +SELECT * FROM t1; +--sorted_result +SELECT count(*) as total_rows, min(c1) as min_value, max(c1) FROM t1; +--sorted_result +SELECT * FROM t1 WHERE c3 = '0.0'; + +## Forward index scan, covering ## +--sorted_result +SELECT c1,c2 FROM t1; + +## Backward index scan, covering ## +SELECT c1,c2 FROM t1 ORDER BY c1,c2 DESC; + +## Forward index scan, non-covering ## +SELECT * FROM t1 ORDER BY c1,c2 LIMIT 2; + +## Backward index scan, non-covering ## +SELECT * FROM t1 ORDER BY c1,c2 DESC LIMIT 2; + +## ref type access +SELECT * FROM t1 WHERE c1 = '0.0' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 = '0.0' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 = '0.0' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 = '0.0' ORDER BY c1,c2 DESC LIMIT 2; + +## Range access, ordered ## +SELECT * FROM t1 WHERE c1 <> '0.0' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 <> '0.0' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 > '0.0' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 > '0.0' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 >= '0.0' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 >= '0.0' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 < '0.0' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 < '0.0' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 <= '0.0' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 <= '0.0' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 <=> '0.0' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 <=> '0.0' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 BETWEEN '0.0' AND '99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 BETWEEN '0.0' AND '99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 IN ('0.0','99999.99999') ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 IN ('0.0','99999.99999') ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 >= '0.0' AND c1 < '99999.99999' AND c2 = '1.0' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 >= '0.0' AND c1 < '99999.99999' AND c2 = '1.0' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 IS NULL ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 IS NULL ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 IS NOT NULL ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 IS NOT NULL ORDER BY c1,c2 LIMIT 2; + +## Range access, backwards scan ## +SELECT * FROM t1 WHERE c1 <> '0.0' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 <> '0.0' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 > '0.0' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 > '0.0' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 >= '0.0' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 >= '0.0' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 < '0.0' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 < '0.0' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 <= '0.0' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 <= '0.0' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 <=> '0.0' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 <=> '0.0' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 BETWEEN '0.0' AND '99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 BETWEEN '0.0' AND '99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 IN ('0.0','99999.99999') ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 IN ('0.0','99999.99999') ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 >= '0.0' AND c1 < '99999.99999' AND c2 = '1.0' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 >= '0.0' AND c1 < '99999.99999' AND c2 = '1.0' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 IS NULL ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 IS NULL ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 IS NOT NULL ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 IS NOT NULL ORDER BY c1,c2 DESC LIMIT 2; +## Full table scan ## +--sorted_result +SELECT * FROM t1; +--sorted_result +SELECT count(*) as total_rows, min(c1) as min_value, max(c1) FROM t1; +--sorted_result +SELECT * FROM t1 WHERE c3 = '-0.0'; + +## Forward index scan, covering ## +--sorted_result +SELECT c1,c2 FROM t1; + +## Backward index scan, covering ## +SELECT c1,c2 FROM t1 ORDER BY c1,c2 DESC; + +## Forward index scan, non-covering ## +SELECT * FROM t1 ORDER BY c1,c2 LIMIT 2; + +## Backward index scan, non-covering ## +SELECT * FROM t1 ORDER BY c1,c2 DESC LIMIT 2; + +## ref type access +SELECT * FROM t1 WHERE c1 = '99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 = '99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 = '99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 = '99999.99999' ORDER BY c1,c2 DESC LIMIT 2; + +## Range access, ordered ## +SELECT * FROM t1 WHERE c1 <> '99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 <> '99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 > '99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 > '99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 >= '99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 >= '99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 < '99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 < '99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 <= '99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 <= '99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 <=> '99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 <=> '99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 BETWEEN '100.05' AND '99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 BETWEEN '100.05' AND '99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 IN ('100.05','99999.99999') ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 IN ('100.05','99999.99999') ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 >= '100.05' AND c1 < '99999.99999' AND c2 = '99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 >= '100.05' AND c1 < '99999.99999' AND c2 = '99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 IS NULL ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 IS NULL ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 IS NOT NULL ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 IS NOT NULL ORDER BY c1,c2 LIMIT 2; + +## Range access, backwards scan ## +SELECT * FROM t1 WHERE c1 <> '99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 <> '99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 > '99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 > '99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 >= '99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 >= '99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 < '99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 < '99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 <= '99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 <= '99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 <=> '99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 <=> '99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 BETWEEN '100.05' AND '99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 BETWEEN '100.05' AND '99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 IN ('100.05','99999.99999') ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 IN ('100.05','99999.99999') ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 >= '100.05' AND c1 < '99999.99999' AND c2 = '99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 >= '100.05' AND c1 < '99999.99999' AND c2 = '99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 IS NULL ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 IS NULL ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 IS NOT NULL ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 IS NOT NULL ORDER BY c1,c2 DESC LIMIT 2; +## Full table scan ## +--sorted_result +SELECT * FROM t1; +--sorted_result +SELECT count(*) as total_rows, min(c2) as min_value, max(c2) FROM t1; +--sorted_result +SELECT * FROM t1 WHERE c3 = '-0.0'; + +## Forward index scan, covering ## +--sorted_result +SELECT c1,c2 FROM t1; + +## Backward index scan, covering ## +SELECT c1,c2 FROM t1 ORDER BY c1,c2 DESC; + +## Forward index scan, non-covering ## +SELECT * FROM t1 ORDER BY c1,c2 LIMIT 2; + +## Backward index scan, non-covering ## +SELECT * FROM t1 ORDER BY c1,c2 DESC LIMIT 2; + +## ref type access +SELECT * FROM t1 WHERE c2 = '-99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c2 = '-99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c2 = '-99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c2 = '-99999.99999' ORDER BY c1,c2 DESC LIMIT 2; + +## Range access, ordered ## +SELECT * FROM t1 WHERE c2 <> '-99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c2 <> '-99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c2 > '-99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c2 > '-99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c2 >= '-99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c2 >= '-99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c2 < '-99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c2 < '-99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c2 <= '-99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c2 <= '-99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c2 <=> '-99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c2 <=> '-99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c2 BETWEEN '-99999.99999' AND '0.0' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c2 BETWEEN '-99999.99999' AND '0.0' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c2 IN ('-99999.99999','0.0') ORDER BY c1,c2; +SELECT * FROM t1 WHERE c2 IN ('-99999.99999','0.0') ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c2 >= '-99999.99999' AND c2 < '0.0' AND c1 = '99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c2 >= '-99999.99999' AND c2 < '0.0' AND c1 = '99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c2 IS NULL ORDER BY c1,c2; +SELECT * FROM t1 WHERE c2 IS NULL ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c2 IS NOT NULL ORDER BY c1,c2; +SELECT * FROM t1 WHERE c2 IS NOT NULL ORDER BY c1,c2 LIMIT 2; + +## Range access, backwards scan ## +SELECT * FROM t1 WHERE c2 <> '-99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c2 <> '-99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c2 > '-99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c2 > '-99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c2 >= '-99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c2 >= '-99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c2 < '-99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c2 < '-99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c2 <= '-99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c2 <= '-99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c2 <=> '-99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c2 <=> '-99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c2 BETWEEN '-99999.99999' AND '0.0' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c2 BETWEEN '-99999.99999' AND '0.0' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c2 IN ('-99999.99999','0.0') ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c2 IN ('-99999.99999','0.0') ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c2 >= '-99999.99999' AND c2 < '0.0' AND c1 = '99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c2 >= '-99999.99999' AND c2 < '0.0' AND c1 = '99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c2 IS NULL ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c2 IS NULL ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c2 IS NOT NULL ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c2 IS NOT NULL ORDER BY c1,c2 DESC LIMIT 2; + +# Using index for group-by +--sorted_result +SELECT c1 FROM t1 GROUP BY c1; +--sorted_result +SELECT DISTINCT c1 FROM t1; +--sorted_result +SELECT c1,MIN(c2) FROM t1 GROUP BY c1; + +# Test encoding to 4 or 8 bytes +CREATE TABLE t5(c1 FLOAT(23,0) UNSIGNED NOT NULL, c2 FLOAT(23,0) SIGNED NULL, c3 FLOAT, c4 INT, INDEX idx(c1,c2)); +INSERT INTO t5 VALUES('1e+22','-1e+22','1e+22',1),('1e-22','-1e-22','1e-22',2); +#Output is platform dependent +--disable_result_log +--sorted_result +SELECT * FROM t5; +--enable_result_log +SET STATEMENT sql_mode = 'NO_ENGINE_SUBSTITUTION' FOR +ALTER TABLE t5 CHANGE c1 c1 FLOAT(24,0) SIGNED NOT NULL, CHANGE c2 c2 FLOAT(24,0) UNSIGNED NULL; +INSERT INTO t5 VALUES('-1e+23','1e+23','1e+23',3),('-1e-23','1e-23','1e-23',4); +#Output is platform dependent +--disable_result_log +--sorted_result +SELECT * FROM t5; +--enable_result_log +SET STATEMENT sql_mode = 'NO_ENGINE_SUBSTITUTION' FOR +ALTER TABLE t5 CHANGE c1 c1 FLOAT(53,0) UNSIGNED, CHANGE c2 c2 FLOAT(53,0) SIGNED; +INSERT IGNORE INTO t5 VALUES('1e+52','-1e+52','1e+52',5),('1e-52','-1e-52','1e-52',6); +INSERT IGNORE INTO t5 VALUES('1e+53','-1e+53','1e+53',7),('1e-53','-1e-53','1e-53',8); + +#Output is platform dependent +--replace_column 1 # 2 # +--sorted_result +SELECT * FROM t5; +DROP TABLE t5; + +# Test ROUND() and TRUNCATE() +CREATE TABLE t5(c1 FLOAT(16,6), c2 tinyint); +INSERT INTO t5 VALUES(1.1325,3); +SELECT ROUND(c1,c2),TRUNCATE(c1,c2) FROM t5; +DROP TABLE t5; + +# Test wrong decimal types +--error ER_M_BIGGER_THAN_D +CREATE TABLE t7(c1 FLOAT(5,10)); +DROP TABLE t1,t2; + +######## Running INSERT tests for DOUBLE ######## + +# Create tables +CREATE TABLE t1(c1 DOUBLE(10,5) UNSIGNED NOT NULL, c2 DOUBLE(10,5) SIGNED NULL, c3 DOUBLE, c4 INT, UNIQUE INDEX idx(c1,c2)); +CREATE TABLE t2(c1 DOUBLE(10,0) SIGNED NOT NULL, c2 DOUBLE(10,0) UNSIGNED NULL, c3 DOUBLE, c4 INT); + +# Test insert values, trailing zeroes are not stripped +INSERT INTO t1 VALUES('00100.05000','-00100.05000','00100.05000',1); +INSERT INTO t2 VALUES('-1000000000','1000000000','1000000000',2); + +# Test approximation +INSERT INTO t1(c1) VALUES('12345.000009'); + +# Test insert max values +INSERT INTO t1 VALUES('99999.99999','-99999.99999','99999.99999',3); +INSERT IGNORE INTO t2 VALUES('-9999999999','-9999999999','9999999999',4); + +# Test insert outside max value, would be clipped to closest endpoint +SELECT * FROM t1; +--error ER_DUP_ENTRY +SET STATEMENT sql_mode = '' FOR +INSERT INTO t1 VALUES('100000.000002','-100000.000002','100000.000002',5); +DELETE FROM t1 WHERE c1='99999.99999' AND c2='-99999.99999'; +INSERT IGNORE INTO t1 VALUES('100000.000002','-100000.000002','100000.000002',5); +INSERT IGNORE INTO t2 VALUES('10000000000','-10000000000','10000000000',6); + +# Test insert leading zero, +/- signs, overflow handling +insert into t1 values ("0.0","0.0","0.0",7),("01.0","01.0","01.0",10); +insert ignore into t1 values ("-.1","-.1","-.1",13); +insert ignore into t1 values ("+111111111.11","+111111111.11","+111111111.11",19); +insert ignore into t2 values ("0.0","0.0","0.0",7),("-0.0","-0.0","-0.0",8),("+0.0","+0.0","+0.0",9),("01.0","01.0","01.0",10),("+01.0","+01.0","+01.0",11),("-01.0","-01.0","-01.0",12); +insert ignore into t2 values ("-.1","-.1","-.1",13),("+.1","+.1","+.1",14),(".1",".1",".1",15); +insert ignore into t2 values ("00000000000001","00000000000001","00000000000001",16),("+0000000000001","+0000000000001","+0000000000001",17),("-0000000000001","-0000000000001","-0000000000001",18); +insert ignore into t2 values ("+111111111.11","+111111111.11","+111111111.11",19),("111111111.11","111111111.11","111111111.11",20),("-11111111.11","-11111111.11","-11111111.11",21); +insert ignore into t2 values ("-111111111.11","-111111111.11","-111111111.11",22),("+1111111111.11","+1111111111.11","+1111111111.11",23),("1111111111.11","1111111111.11","1111111111.11",24); +insert ignore into t2 values ("1e+1000","1e+1000","1e+1000",25),("1e-1000","1e-1000","1e-1000",26),("-1e+1000","-1e+1000","-1e+1000",27); +insert ignore into t2 values ("1e+4294967296","1e+4294967296","1e+4294967296",28),("1e-4294967296","1e-4294967296","1e-4294967296",29); +insert ignore into t2 values ("1e+18446744073709551615","1e+18446744073709551615","1e+18446744073709551615",30),("1e+18446744073709551616","1e+18446744073709551616","1e+18446744073709551616",31),("1e-9223372036854775807","1e-9223372036854775807","1e-9223372036854775807",32),("1e-9223372036854775809","1e-9223372036854775809","1e-9223372036854775809",33); + +# Now Select +--sorted_result +SELECT * FROM t1; +--sorted_result +SELECT * FROM t2; +SELECT count(*) as total_rows, min(c1) as min_value, max(c1) as max_value, sum(c1) as sum, avg(c1) as avg FROM t1; +SELECT count(*) as total_rows, min(c2) as min_value, max(c2) as max_value, sum(c2) as sum, avg(c2) as avg FROM t1; +SELECT count(*) as total_rows, min(c3) as min_value, max(c3) as max_value, sum(c3) as sum, avg(c3) as avg FROM t1; +SELECT count(*) as total_rows, min(c1) as min_value, max(c1) as max_value, sum(c1) as sum, avg(c1) as avg FROM t2; +SELECT count(*) as total_rows, min(c2) as min_value, max(c2) as max_value, sum(c2) as sum, avg(c2) as avg FROM t2; +#SELECT below outputs 'inf' and 'infinity' for Linux/SunOS respectively +--replace_column 4 inf 5 inf +SELECT count(*) as total_rows, min(c3) as min_value, max(c3) as max_value, sum(c3) as sum, avg(c3) as avg FROM t2; + +# Select using various access methods +## Full table scan ## +--sorted_result +SELECT * FROM t1; +--sorted_result +SELECT count(*) as total_rows, min(c1) as min_value, max(c1) FROM t1; +--sorted_result +SELECT * FROM t1 WHERE c3 = '0.0'; + +## Forward index scan, covering ## +--sorted_result +SELECT c1,c2 FROM t1; + +## Backward index scan, covering ## +SELECT c1,c2 FROM t1 ORDER BY c1,c2 DESC; + +## Forward index scan, non-covering ## +SELECT * FROM t1 ORDER BY c1,c2 LIMIT 2; + +## Backward index scan, non-covering ## +SELECT * FROM t1 ORDER BY c1,c2 DESC LIMIT 2; + +## ref type access +SELECT * FROM t1 WHERE c1 = '0.0' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 = '0.0' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 = '0.0' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 = '0.0' ORDER BY c1,c2 DESC LIMIT 2; + +## Range access, ordered ## +SELECT * FROM t1 WHERE c1 <> '0.0' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 <> '0.0' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 > '0.0' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 > '0.0' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 >= '0.0' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 >= '0.0' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 < '0.0' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 < '0.0' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 <= '0.0' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 <= '0.0' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 <=> '0.0' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 <=> '0.0' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 BETWEEN '0.0' AND '99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 BETWEEN '0.0' AND '99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 IN ('0.0','99999.99999') ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 IN ('0.0','99999.99999') ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 >= '0.0' AND c1 < '99999.99999' AND c2 = '1.0' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 >= '0.0' AND c1 < '99999.99999' AND c2 = '1.0' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 IS NULL ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 IS NULL ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 IS NOT NULL ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 IS NOT NULL ORDER BY c1,c2 LIMIT 2; + +## Range access, backwards scan ## +SELECT * FROM t1 WHERE c1 <> '0.0' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 <> '0.0' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 > '0.0' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 > '0.0' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 >= '0.0' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 >= '0.0' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 < '0.0' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 < '0.0' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 <= '0.0' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 <= '0.0' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 <=> '0.0' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 <=> '0.0' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 BETWEEN '0.0' AND '99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 BETWEEN '0.0' AND '99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 IN ('0.0','99999.99999') ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 IN ('0.0','99999.99999') ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 >= '0.0' AND c1 < '99999.99999' AND c2 = '1.0' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 >= '0.0' AND c1 < '99999.99999' AND c2 = '1.0' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 IS NULL ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 IS NULL ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 IS NOT NULL ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 IS NOT NULL ORDER BY c1,c2 DESC LIMIT 2; +## Full table scan ## +--sorted_result +SELECT * FROM t1; +--sorted_result +SELECT count(*) as total_rows, min(c1) as min_value, max(c1) FROM t1; +--sorted_result +SELECT * FROM t1 WHERE c3 = '-0.0'; + +## Forward index scan, covering ## +--sorted_result +SELECT c1,c2 FROM t1; + +## Backward index scan, covering ## +SELECT c1,c2 FROM t1 ORDER BY c1,c2 DESC; + +## Forward index scan, non-covering ## +SELECT * FROM t1 ORDER BY c1,c2 LIMIT 2; + +## Backward index scan, non-covering ## +SELECT * FROM t1 ORDER BY c1,c2 DESC LIMIT 2; + +## ref type access +SELECT * FROM t1 WHERE c1 = '99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 = '99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 = '99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 = '99999.99999' ORDER BY c1,c2 DESC LIMIT 2; + +## Range access, ordered ## +SELECT * FROM t1 WHERE c1 <> '99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 <> '99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 > '99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 > '99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 >= '99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 >= '99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 < '99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 < '99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 <= '99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 <= '99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 <=> '99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 <=> '99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 BETWEEN '100.05' AND '99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 BETWEEN '100.05' AND '99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 IN ('100.05','99999.99999') ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 IN ('100.05','99999.99999') ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 >= '100.05' AND c1 < '99999.99999' AND c2 = '99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 >= '100.05' AND c1 < '99999.99999' AND c2 = '99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 IS NULL ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 IS NULL ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c1 IS NOT NULL ORDER BY c1,c2; +SELECT * FROM t1 WHERE c1 IS NOT NULL ORDER BY c1,c2 LIMIT 2; + +## Range access, backwards scan ## +SELECT * FROM t1 WHERE c1 <> '99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 <> '99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 > '99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 > '99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 >= '99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 >= '99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 < '99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 < '99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 <= '99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 <= '99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 <=> '99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 <=> '99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 BETWEEN '100.05' AND '99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 BETWEEN '100.05' AND '99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 IN ('100.05','99999.99999') ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 IN ('100.05','99999.99999') ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 >= '100.05' AND c1 < '99999.99999' AND c2 = '99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 >= '100.05' AND c1 < '99999.99999' AND c2 = '99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 IS NULL ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 IS NULL ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c1 IS NOT NULL ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c1 IS NOT NULL ORDER BY c1,c2 DESC LIMIT 2; +## Full table scan ## +--sorted_result +SELECT * FROM t1; +--sorted_result +SELECT count(*) as total_rows, min(c2) as min_value, max(c2) FROM t1; +--sorted_result +SELECT * FROM t1 WHERE c3 = '-0.0'; + +## Forward index scan, covering ## +--sorted_result +SELECT c1,c2 FROM t1; + +## Backward index scan, covering ## +SELECT c1,c2 FROM t1 ORDER BY c1,c2 DESC; + +## Forward index scan, non-covering ## +SELECT * FROM t1 ORDER BY c1,c2 LIMIT 2; + +## Backward index scan, non-covering ## +SELECT * FROM t1 ORDER BY c1,c2 DESC LIMIT 2; + +## ref type access +SELECT * FROM t1 WHERE c2 = '-99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c2 = '-99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c2 = '-99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c2 = '-99999.99999' ORDER BY c1,c2 DESC LIMIT 2; + +## Range access, ordered ## +SELECT * FROM t1 WHERE c2 <> '-99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c2 <> '-99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c2 > '-99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c2 > '-99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c2 >= '-99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c2 >= '-99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c2 < '-99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c2 < '-99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c2 <= '-99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c2 <= '-99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c2 <=> '-99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c2 <=> '-99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c2 BETWEEN '-99999.99999' AND '0.0' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c2 BETWEEN '-99999.99999' AND '0.0' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c2 IN ('-99999.99999','0.0') ORDER BY c1,c2; +SELECT * FROM t1 WHERE c2 IN ('-99999.99999','0.0') ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c2 >= '-99999.99999' AND c2 < '0.0' AND c1 = '99999.99999' ORDER BY c1,c2; +SELECT * FROM t1 WHERE c2 >= '-99999.99999' AND c2 < '0.0' AND c1 = '99999.99999' ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c2 IS NULL ORDER BY c1,c2; +SELECT * FROM t1 WHERE c2 IS NULL ORDER BY c1,c2 LIMIT 2; +SELECT * FROM t1 WHERE c2 IS NOT NULL ORDER BY c1,c2; +SELECT * FROM t1 WHERE c2 IS NOT NULL ORDER BY c1,c2 LIMIT 2; + +## Range access, backwards scan ## +SELECT * FROM t1 WHERE c2 <> '-99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c2 <> '-99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c2 > '-99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c2 > '-99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c2 >= '-99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c2 >= '-99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c2 < '-99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c2 < '-99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c2 <= '-99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c2 <= '-99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c2 <=> '-99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c2 <=> '-99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c2 BETWEEN '-99999.99999' AND '0.0' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c2 BETWEEN '-99999.99999' AND '0.0' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c2 IN ('-99999.99999','0.0') ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c2 IN ('-99999.99999','0.0') ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c2 >= '-99999.99999' AND c2 < '0.0' AND c1 = '99999.99999' ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c2 >= '-99999.99999' AND c2 < '0.0' AND c1 = '99999.99999' ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c2 IS NULL ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c2 IS NULL ORDER BY c1,c2 DESC LIMIT 2; +SELECT * FROM t1 WHERE c2 IS NOT NULL ORDER BY c1,c2 DESC; +SELECT * FROM t1 WHERE c2 IS NOT NULL ORDER BY c1,c2 DESC LIMIT 2; + +# Using index for group-by +--sorted_result +SELECT c1 FROM t1 GROUP BY c1; +--sorted_result +SELECT DISTINCT c1 FROM t1; +--sorted_result +SELECT c1,MIN(c2) FROM t1 GROUP BY c1; + +# Test encoding to 4 or 8 bytes +CREATE TABLE t5(c1 DOUBLE(23,0) UNSIGNED NOT NULL, c2 DOUBLE(23,0) SIGNED NULL, c3 DOUBLE, c4 INT, INDEX idx(c1,c2)); +INSERT INTO t5 VALUES('1e+22','-1e+22','1e+22',1),('1e-22','-1e-22','1e-22',2); +--sorted_result +SELECT * FROM t5; +SET STATEMENT sql_mode = 'NO_ENGINE_SUBSTITUTION' FOR +ALTER TABLE t5 CHANGE c1 c1 DOUBLE(24,0) SIGNED NOT NULL, CHANGE c2 c2 DOUBLE(24,0) UNSIGNED NULL; +INSERT INTO t5 VALUES('-1e+23','1e+23','1e+23',3),('-1e-23','1e-23','1e-23',4); +#Output is platform dependent +--disable_result_log +--sorted_result +SELECT * FROM t5; +--enable_result_log +SET STATEMENT sql_mode = 'NO_ENGINE_SUBSTITUTION' FOR +ALTER TABLE t5 CHANGE c1 c1 DOUBLE(53,0) UNSIGNED, CHANGE c2 c2 DOUBLE(53,0) SIGNED; +INSERT INTO t5 VALUES('1e+52','-1e+52','1e+52',5),('1e-52','-1e-52','1e-52',6); +INSERT INTO t5 VALUES('1e+53','-1e+53','1e+53',7),('1e-53','-1e-53','1e-53',8); +#Output is platform dependent +--disable_result_log +--sorted_result +SELECT * FROM t5; +--enable_result_log +DROP TABLE t5; + +# Test ROUND() and TRUNCATE() +CREATE TABLE t5(c1 DOUBLE(16,6), c2 tinyint); +INSERT INTO t5 VALUES(1.1325,3); +SELECT ROUND(c1,c2),TRUNCATE(c1,c2) FROM t5; +DROP TABLE t5; + +# Test wrong decimal types +--error ER_M_BIGGER_THAN_D +CREATE TABLE t7(c1 DOUBLE(5,10)); +DROP TABLE t1,t2; + |