Loading libmysql/libmysql.c +16 −11 Original line number Diff line number Diff line Loading @@ -3663,33 +3663,38 @@ static void fetch_long_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field, case MYSQL_TYPE_FLOAT: { /* We need to store data in the buffer before the truncation check to We need to mark the local variable volatile to workaround Intel FPU executive precision feature. (See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=323 for details) AFAIU it does not guarantee to work. */ float data; volatile float data; if (is_unsigned) { data= (float) ulonglong2double(value); *param->error= ((ulonglong) value) != ((ulonglong) data); } else { data= (float)value; *param->error= value != ((longlong) data); } floatstore(buffer, data); *param->error= is_unsigned ? ((ulonglong) value) != ((ulonglong) (*(float*) buffer)) : ((longlong) value) != ((longlong) (*(float*) buffer)); break; } case MYSQL_TYPE_DOUBLE: { double data; volatile double data; if (is_unsigned) { data= ulonglong2double(value); *param->error= ((ulonglong) value) != ((ulonglong) data); } else { data= (double)value; *param->error= value != ((longlong) data); } doublestore(buffer, data); *param->error= is_unsigned ? ((ulonglong) value) != ((ulonglong) (*(double*) buffer)) : ((longlong) value) != ((longlong) (*(double*) buffer)); break; } case MYSQL_TYPE_TIME: Loading mysql-test/r/bigint.result +26 −0 Original line number Diff line number Diff line Loading @@ -362,3 +362,29 @@ cast(-19999999999999999999 as signed) -9223372036854775808 Warnings: Error 1292 Truncated incorrect DECIMAL value: '' select -9223372036854775808; Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr def -9223372036854775808 8 20 20 N 32897 0 63 -9223372036854775808 -9223372036854775808 select -(9223372036854775808); Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr def -(9223372036854775808) 8 20 20 N 32897 0 63 -(9223372036854775808) -9223372036854775808 select -((9223372036854775808)); Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr def -((9223372036854775808)) 8 20 20 N 32897 0 63 -((9223372036854775808)) -9223372036854775808 select -(-(9223372036854775808)); Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr def -(-(9223372036854775808)) 246 21 19 N 129 0 63 -(-(9223372036854775808)) 9223372036854775808 select --9223372036854775808, ---9223372036854775808, ----9223372036854775808; --9223372036854775808 ---9223372036854775808 ----9223372036854775808 9223372036854775808 -9223372036854775808 9223372036854775808 select -(-9223372036854775808), -(-(-9223372036854775808)); -(-9223372036854775808) -(-(-9223372036854775808)) 9223372036854775808 -9223372036854775808 mysql-test/r/func_str.result +92 −0 Original line number Diff line number Diff line Loading @@ -2061,4 +2061,96 @@ C 2707236321 DROP TABLE t1, t2; DROP VIEW v1; SELECT LOCATE('foo', NULL) FROM DUAL; LOCATE('foo', NULL) NULL SELECT LOCATE(NULL, 'o') FROM DUAL; LOCATE(NULL, 'o') NULL SELECT LOCATE(NULL, NULL) FROM DUAL; LOCATE(NULL, NULL) NULL SELECT LOCATE('foo', NULL) IS NULL FROM DUAL; LOCATE('foo', NULL) IS NULL 1 SELECT LOCATE(NULL, 'o') IS NULL FROM DUAL; LOCATE(NULL, 'o') IS NULL 1 SELECT LOCATE(NULL, NULL) IS NULL FROM DUAL; LOCATE(NULL, NULL) IS NULL 1 SELECT ISNULL(LOCATE('foo', NULL)) FROM DUAL; ISNULL(LOCATE('foo', NULL)) 1 SELECT ISNULL(LOCATE(NULL, 'o')) FROM DUAL; ISNULL(LOCATE(NULL, 'o')) 1 SELECT ISNULL(LOCATE(NULL, NULL)) FROM DUAL; ISNULL(LOCATE(NULL, NULL)) 1 SELECT LOCATE('foo', NULL) <=> NULL FROM DUAL; LOCATE('foo', NULL) <=> NULL 1 SELECT LOCATE(NULL, 'o') <=> NULL FROM DUAL; LOCATE(NULL, 'o') <=> NULL 1 SELECT LOCATE(NULL, NULL) <=> NULL FROM DUAL; LOCATE(NULL, NULL) <=> NULL 1 CREATE TABLE t1 (id int NOT NULL PRIMARY KEY, a varchar(10), p varchar(10)); INSERT INTO t1 VALUES (1, 'foo', 'o'); INSERT INTO t1 VALUES (2, 'foo', NULL); INSERT INTO t1 VALUES (3, NULL, 'o'); INSERT INTO t1 VALUES (4, NULL, NULL); SELECT id, LOCATE(a,p) FROM t1; id LOCATE(a,p) 1 0 2 NULL 3 NULL 4 NULL SELECT id, LOCATE(a,p) IS NULL FROM t1; id LOCATE(a,p) IS NULL 1 0 2 1 3 1 4 1 SELECT id, ISNULL(LOCATE(a,p)) FROM t1; id ISNULL(LOCATE(a,p)) 1 0 2 1 3 1 4 1 SELECT id, LOCATE(a,p) <=> NULL FROM t1; id LOCATE(a,p) <=> NULL 1 0 2 1 3 1 4 1 SELECT id FROM t1 WHERE LOCATE(a,p) IS NULL; id 2 3 4 SELECT id FROM t1 WHERE LOCATE(a,p) <=> NULL; id 2 3 4 DROP TABLE t1; SELECT SUBSTR('foo',1,0) FROM DUAL; SUBSTR('foo',1,0) SELECT SUBSTR('foo',1,CAST(0 AS SIGNED)) FROM DUAL; SUBSTR('foo',1,CAST(0 AS SIGNED)) SELECT SUBSTR('foo',1,CAST(0 AS UNSIGNED)) FROM DUAL; SUBSTR('foo',1,CAST(0 AS UNSIGNED)) CREATE TABLE t1 (a varchar(10), len int unsigned); INSERT INTO t1 VALUES ('bar', 2), ('foo', 0); SELECT SUBSTR(a,1,len) FROM t1; SUBSTR(a,1,len) ba DROP TABLE t1; End of 5.0 tests mysql-test/r/insert_select.result +31 −0 Original line number Diff line number Diff line Loading @@ -688,7 +688,16 @@ ERROR 42S22: Unknown column 't2.x' in 'field list' drop table t1,t2; CREATE TABLE t1 (a int PRIMARY KEY); INSERT INTO t1 values (1), (2); flush status; INSERT INTO t1 SELECT a + 2 FROM t1 LIMIT 1; show status like 'Handler_read%'; Variable_name Value Handler_read_first 1 Handler_read_key 0 Handler_read_next 0 Handler_read_prev 0 Handler_read_rnd 0 Handler_read_rnd_next 1 DROP TABLE t1; CREATE TABLE t1 (x int, y int); CREATE TABLE t2 (z int, y int); Loading Loading @@ -773,3 +782,25 @@ d 20 20 DROP TABLE t1,t2; CREATE TABLE t1 ( id INT AUTO_INCREMENT PRIMARY KEY, prev_id INT, join_id INT DEFAULT 0); INSERT INTO t1 (prev_id) VALUES (NULL), (1), (2); SELECT * FROM t1; id prev_id join_id 1 NULL 0 2 1 0 3 2 0 CREATE TABLE t2 (join_id INT); INSERT INTO t2 (join_id) VALUES (0); INSERT INTO t1 (prev_id) SELECT id FROM t2 LEFT JOIN t1 ON t1.join_id = t2.join_id ORDER BY id DESC LIMIT 1; SELECT * FROM t1; id prev_id join_id 1 NULL 0 2 1 0 3 2 0 4 3 0 DROP TABLE t1,t2; mysql-test/r/metadata.result +41 −0 Original line number Diff line number Diff line Loading @@ -140,4 +140,45 @@ Catalog Database Table Table_alias Column Column_alias Type Length Max length Is def a v_small v_small 3 9 9 N 32769 0 63 v_small 214748364 CREATE TABLE t1 (c1 CHAR(1)); CREATE TABLE t2 (c2 CHAR(1)); CREATE VIEW v1 AS SELECT t1.c1 FROM t1; CREATE VIEW v2 AS SELECT t2.c2 FROM t2; INSERT INTO t1 VALUES ('1'), ('2'), ('3'); INSERT INTO t2 VALUES ('1'), ('2'), ('3'), ('2'); SELECT v1.c1 FROM v1 JOIN t2 ON c1=c2 ORDER BY 1; Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr def test t1 v1 c1 c1 254 1 1 Y 0 0 8 c1 1 2 2 3 SELECT v1.c1, v2.c2 FROM v1 JOIN v2 ON c1=c2; Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr def test t1 v1 c1 c1 254 1 1 Y 0 0 8 def test t2 v2 c2 c2 254 1 1 Y 0 0 8 c1 c2 1 1 2 2 3 3 2 2 SELECT v1.c1, v2.c2 FROM v1 JOIN v2 ON c1=c2 GROUP BY v1.c1; Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr def test t1 v1 c1 c1 254 1 1 Y 32768 0 8 def test t2 v2 c2 c2 254 1 1 Y 0 0 8 c1 c2 1 1 2 2 3 3 SELECT v1.c1, v2.c2 FROM v1 JOIN v2 ON c1=c2 GROUP BY v1.c1 ORDER BY v2.c2; Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr def test t1 v1 c1 c1 254 1 1 Y 32768 0 8 def test t2 v2 c2 c2 254 1 1 Y 0 0 8 c1 c2 1 1 2 2 3 3 DROP VIEW v1,v2; DROP TABLE t1,t2; End of 5.0 tests Loading
libmysql/libmysql.c +16 −11 Original line number Diff line number Diff line Loading @@ -3663,33 +3663,38 @@ static void fetch_long_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field, case MYSQL_TYPE_FLOAT: { /* We need to store data in the buffer before the truncation check to We need to mark the local variable volatile to workaround Intel FPU executive precision feature. (See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=323 for details) AFAIU it does not guarantee to work. */ float data; volatile float data; if (is_unsigned) { data= (float) ulonglong2double(value); *param->error= ((ulonglong) value) != ((ulonglong) data); } else { data= (float)value; *param->error= value != ((longlong) data); } floatstore(buffer, data); *param->error= is_unsigned ? ((ulonglong) value) != ((ulonglong) (*(float*) buffer)) : ((longlong) value) != ((longlong) (*(float*) buffer)); break; } case MYSQL_TYPE_DOUBLE: { double data; volatile double data; if (is_unsigned) { data= ulonglong2double(value); *param->error= ((ulonglong) value) != ((ulonglong) data); } else { data= (double)value; *param->error= value != ((longlong) data); } doublestore(buffer, data); *param->error= is_unsigned ? ((ulonglong) value) != ((ulonglong) (*(double*) buffer)) : ((longlong) value) != ((longlong) (*(double*) buffer)); break; } case MYSQL_TYPE_TIME: Loading
mysql-test/r/bigint.result +26 −0 Original line number Diff line number Diff line Loading @@ -362,3 +362,29 @@ cast(-19999999999999999999 as signed) -9223372036854775808 Warnings: Error 1292 Truncated incorrect DECIMAL value: '' select -9223372036854775808; Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr def -9223372036854775808 8 20 20 N 32897 0 63 -9223372036854775808 -9223372036854775808 select -(9223372036854775808); Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr def -(9223372036854775808) 8 20 20 N 32897 0 63 -(9223372036854775808) -9223372036854775808 select -((9223372036854775808)); Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr def -((9223372036854775808)) 8 20 20 N 32897 0 63 -((9223372036854775808)) -9223372036854775808 select -(-(9223372036854775808)); Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr def -(-(9223372036854775808)) 246 21 19 N 129 0 63 -(-(9223372036854775808)) 9223372036854775808 select --9223372036854775808, ---9223372036854775808, ----9223372036854775808; --9223372036854775808 ---9223372036854775808 ----9223372036854775808 9223372036854775808 -9223372036854775808 9223372036854775808 select -(-9223372036854775808), -(-(-9223372036854775808)); -(-9223372036854775808) -(-(-9223372036854775808)) 9223372036854775808 -9223372036854775808
mysql-test/r/func_str.result +92 −0 Original line number Diff line number Diff line Loading @@ -2061,4 +2061,96 @@ C 2707236321 DROP TABLE t1, t2; DROP VIEW v1; SELECT LOCATE('foo', NULL) FROM DUAL; LOCATE('foo', NULL) NULL SELECT LOCATE(NULL, 'o') FROM DUAL; LOCATE(NULL, 'o') NULL SELECT LOCATE(NULL, NULL) FROM DUAL; LOCATE(NULL, NULL) NULL SELECT LOCATE('foo', NULL) IS NULL FROM DUAL; LOCATE('foo', NULL) IS NULL 1 SELECT LOCATE(NULL, 'o') IS NULL FROM DUAL; LOCATE(NULL, 'o') IS NULL 1 SELECT LOCATE(NULL, NULL) IS NULL FROM DUAL; LOCATE(NULL, NULL) IS NULL 1 SELECT ISNULL(LOCATE('foo', NULL)) FROM DUAL; ISNULL(LOCATE('foo', NULL)) 1 SELECT ISNULL(LOCATE(NULL, 'o')) FROM DUAL; ISNULL(LOCATE(NULL, 'o')) 1 SELECT ISNULL(LOCATE(NULL, NULL)) FROM DUAL; ISNULL(LOCATE(NULL, NULL)) 1 SELECT LOCATE('foo', NULL) <=> NULL FROM DUAL; LOCATE('foo', NULL) <=> NULL 1 SELECT LOCATE(NULL, 'o') <=> NULL FROM DUAL; LOCATE(NULL, 'o') <=> NULL 1 SELECT LOCATE(NULL, NULL) <=> NULL FROM DUAL; LOCATE(NULL, NULL) <=> NULL 1 CREATE TABLE t1 (id int NOT NULL PRIMARY KEY, a varchar(10), p varchar(10)); INSERT INTO t1 VALUES (1, 'foo', 'o'); INSERT INTO t1 VALUES (2, 'foo', NULL); INSERT INTO t1 VALUES (3, NULL, 'o'); INSERT INTO t1 VALUES (4, NULL, NULL); SELECT id, LOCATE(a,p) FROM t1; id LOCATE(a,p) 1 0 2 NULL 3 NULL 4 NULL SELECT id, LOCATE(a,p) IS NULL FROM t1; id LOCATE(a,p) IS NULL 1 0 2 1 3 1 4 1 SELECT id, ISNULL(LOCATE(a,p)) FROM t1; id ISNULL(LOCATE(a,p)) 1 0 2 1 3 1 4 1 SELECT id, LOCATE(a,p) <=> NULL FROM t1; id LOCATE(a,p) <=> NULL 1 0 2 1 3 1 4 1 SELECT id FROM t1 WHERE LOCATE(a,p) IS NULL; id 2 3 4 SELECT id FROM t1 WHERE LOCATE(a,p) <=> NULL; id 2 3 4 DROP TABLE t1; SELECT SUBSTR('foo',1,0) FROM DUAL; SUBSTR('foo',1,0) SELECT SUBSTR('foo',1,CAST(0 AS SIGNED)) FROM DUAL; SUBSTR('foo',1,CAST(0 AS SIGNED)) SELECT SUBSTR('foo',1,CAST(0 AS UNSIGNED)) FROM DUAL; SUBSTR('foo',1,CAST(0 AS UNSIGNED)) CREATE TABLE t1 (a varchar(10), len int unsigned); INSERT INTO t1 VALUES ('bar', 2), ('foo', 0); SELECT SUBSTR(a,1,len) FROM t1; SUBSTR(a,1,len) ba DROP TABLE t1; End of 5.0 tests
mysql-test/r/insert_select.result +31 −0 Original line number Diff line number Diff line Loading @@ -688,7 +688,16 @@ ERROR 42S22: Unknown column 't2.x' in 'field list' drop table t1,t2; CREATE TABLE t1 (a int PRIMARY KEY); INSERT INTO t1 values (1), (2); flush status; INSERT INTO t1 SELECT a + 2 FROM t1 LIMIT 1; show status like 'Handler_read%'; Variable_name Value Handler_read_first 1 Handler_read_key 0 Handler_read_next 0 Handler_read_prev 0 Handler_read_rnd 0 Handler_read_rnd_next 1 DROP TABLE t1; CREATE TABLE t1 (x int, y int); CREATE TABLE t2 (z int, y int); Loading Loading @@ -773,3 +782,25 @@ d 20 20 DROP TABLE t1,t2; CREATE TABLE t1 ( id INT AUTO_INCREMENT PRIMARY KEY, prev_id INT, join_id INT DEFAULT 0); INSERT INTO t1 (prev_id) VALUES (NULL), (1), (2); SELECT * FROM t1; id prev_id join_id 1 NULL 0 2 1 0 3 2 0 CREATE TABLE t2 (join_id INT); INSERT INTO t2 (join_id) VALUES (0); INSERT INTO t1 (prev_id) SELECT id FROM t2 LEFT JOIN t1 ON t1.join_id = t2.join_id ORDER BY id DESC LIMIT 1; SELECT * FROM t1; id prev_id join_id 1 NULL 0 2 1 0 3 2 0 4 3 0 DROP TABLE t1,t2;
mysql-test/r/metadata.result +41 −0 Original line number Diff line number Diff line Loading @@ -140,4 +140,45 @@ Catalog Database Table Table_alias Column Column_alias Type Length Max length Is def a v_small v_small 3 9 9 N 32769 0 63 v_small 214748364 CREATE TABLE t1 (c1 CHAR(1)); CREATE TABLE t2 (c2 CHAR(1)); CREATE VIEW v1 AS SELECT t1.c1 FROM t1; CREATE VIEW v2 AS SELECT t2.c2 FROM t2; INSERT INTO t1 VALUES ('1'), ('2'), ('3'); INSERT INTO t2 VALUES ('1'), ('2'), ('3'), ('2'); SELECT v1.c1 FROM v1 JOIN t2 ON c1=c2 ORDER BY 1; Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr def test t1 v1 c1 c1 254 1 1 Y 0 0 8 c1 1 2 2 3 SELECT v1.c1, v2.c2 FROM v1 JOIN v2 ON c1=c2; Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr def test t1 v1 c1 c1 254 1 1 Y 0 0 8 def test t2 v2 c2 c2 254 1 1 Y 0 0 8 c1 c2 1 1 2 2 3 3 2 2 SELECT v1.c1, v2.c2 FROM v1 JOIN v2 ON c1=c2 GROUP BY v1.c1; Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr def test t1 v1 c1 c1 254 1 1 Y 32768 0 8 def test t2 v2 c2 c2 254 1 1 Y 0 0 8 c1 c2 1 1 2 2 3 3 SELECT v1.c1, v2.c2 FROM v1 JOIN v2 ON c1=c2 GROUP BY v1.c1 ORDER BY v2.c2; Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr def test t1 v1 c1 c1 254 1 1 Y 32768 0 8 def test t2 v2 c2 c2 254 1 1 Y 0 0 8 c1 c2 1 1 2 2 3 3 DROP VIEW v1,v2; DROP TABLE t1,t2; End of 5.0 tests