#Get deafult engine value --let $DEFAULT_ENGINE = `select @@global.default_storage_engine` # # Testing of misc functions # SET sql_mode = 'NO_ENGINE_SUBSTITUTION'; --disable_warnings DROP TABLE IF EXISTS t1, t2; --enable_warnings select format(1.5555,0),format(123.5555,1),format(1234.5555,2),format(12345.55555,3),format(123456.5555,4),format(1234567.5555,5),format("12345.2399",2); select inet_ntoa(inet_aton("255.255.255.255.255.255.255.255")); select inet_aton("255.255.255.255.255"),inet_aton("255.255.1.255"),inet_aton("0.1.255"); select inet_ntoa(1099511627775),inet_ntoa(4294902271),inet_ntoa(511); select hex(inet_aton('127')); select hex(inet_aton('127.1')); select hex(inet_aton('127.1.1')); select inet_aton("122.256"); select inet_aton("122.226."); select inet_aton(""); explain extended select inet_aton("122.256"),inet_aton("122.226."),inet_aton(""); select length(uuid()), charset(uuid()), length(unhex(replace(uuid(),_utf8'-',_utf8''))); # As we can assume we are the only user for the mysqld server, the difference # between two calls should be -1 set @a= uuid_short(); set @b= uuid_short(); select @b - @a; # # Test for core dump with nan # select length(format('nan', 2)) > 0; # # Test for bug #628 # select concat("$",format(2500,2)); # Test for BUG#7716 create table t1 ( a timestamp ); insert into t1 values ( '2004-01-06 12:34' ); select a from t1 where left(a+0,6) in ( left(20040106,6) ); select a from t1 where left(a+0,6) = ( left(20040106,6) ); select a from t1 where right(a+0,6) in ( right(20040106123400,6) ); select a from t1 where right(a+0,6) = ( right(20040106123400,6) ); select a from t1 where mid(a+0,6,3) in ( mid(20040106123400,6,3) ); select a from t1 where mid(a+0,6,3) = ( mid(20040106123400,6,3) ); drop table t1; # # Bug #21531: EXPORT_SET() doesn't accept args with coercible character sets # select export_set(3, _latin1'foo', _utf8'bar', ',', 4); --echo End of 4.1 tests # # Test for BUG#9535 # --disable_warnings create table t1 as select uuid(), length(uuid()); --enable_warnings #Replace default engine value with static engine string --replace_result $DEFAULT_ENGINE ENGINE show create table t1; drop table t1; # # Bug#6760: Add SLEEP() function (feature request) # # Logics of original test: # Reveal that a query with SLEEP does not need less time than estimated. # # Bug#12689: SLEEP() gets incorrectly cached/optimized-away # # Description from bug report (slightly modified) # # Bug 1 (happened all time): # SELECT * FROM t1 WHERE SLEEP(1) will only result in a sleep of 1 # second, regardless of the number of rows in t1. # Bug 2 (happened all time): # Such a query will also get cached by the query cache, but should not. # # Notes (mleich, 2008-05) # ======================= # # Experiments around # Bug#36345 Test 'func_misc' fails on RHAS3 x86_64 # showed that the tests for both bugs could produce in case of parallel # artificial system time (like via ntpd) # - decreases false alarm # - increases false success # # We try here to circumvent these issues by reimplementation of the tests # and sophisticated scripting, although the cause of the problems is a massive # error within the setup of the testing environment. # Tests relying on or checking derivates of the system time must never meet # parallel manipulations of system time. # # Results of experiments with/without manipulation of system time, # information_schema.processlist content, high load on testing box # ---------------------------------------------------------------- # Definition: Predicted_cumulative_sleep_time = # #_of_result_rows * sleep_time_per_result_row # # 1. Total (real sleep time) ~= predicted_cumulative_sleep_time !! # 2. The state of a session within the PROCESSLIST changes to 'User sleep' # if the sessions runs a statement containing the sleep function and the # processing of the statement is just within the phase where the sleep # is done. (*) # 3. NOW() and processlist.time behave "synchronous" to system time and # show also the "jumps" caused by system time manipulations. (*) # 4. processlist.time is unsigned, the "next" value below 0 is ~ 4G (*) # 5. Current processlist.time ~= current real sleep time if the system time # was not manipulated. (*) # 6. High system load can cause delays of <= 2 seconds. # 7. Thanks to Davi for excellent hints and ideas. # # (*) # - information_schema.processlist is not available before MySQL 5.1. # - Observation of processlist content requires a # - "worker" session sending the query with "send" and pulling results # with "reap" # - session observing the processlist parallel to the worker session # "send" and "reap" do not work in case of an embedded server. # Conclusion: Tests based on processlist have too many restrictions. # # Solutions for subtests based on TIMEDIFF of values filled via NOW() # ------------------------------------------------------------------- # Run the following sequence three times # 1. SELECT # 2. Query with SLEEP # 3. SELECT # If TIMEDIFF(,) is at least two times within a # reasonable range assume that we did not met errors we were looking for. # # It is extreme unlikely that we have two system time changes within the # < 30 seconds runtime. Even if the unlikely happens, there are so # frequent runs of this test on this or another testing box which will # catch the problem. # --echo #------------------------------------------------------------------------ --echo # Tests for Bug#6760 and Bug#12689 # Number of rows within the intended result set. SET @row_count = 4; # Parameter within SLEEP function SET @sleep_time_per_result_row = 1; # Maximum acceptable delay caused by high load on testing box SET @max_acceptable_delay = 2; # TIMEDIFF = time for query with sleep (mostly the time caused by SLEEP) # + time for delays caused by high load on testing box # Ensure that at least a reasonable fraction of TIMEDIFF belongs to the SLEEP # by appropriate setting of variables. # Ensure that any "judging" has a base of minimum three attempts. # (Test 2 uses all attempts except the first one.) if (!` SELECT (@sleep_time_per_result_row * @row_count - @max_acceptable_delay > @sleep_time_per_result_row) AND (@row_count - 1 >= 3)`) { --echo # Have to abort because of error in plausibility check --echo ###################################################### --vertical_results SELECT @sleep_time_per_result_row * @row_count - @max_acceptable_delay > @sleep_time_per_result_row AS must_be_1, @row_count - 1 >= 3 AS must_be_also_1, @sleep_time_per_result_row, @row_count, @max_acceptable_delay; exit; } SET @@global.query_cache_size = 1024 * 64; --disable_warnings DROP TEMPORARY TABLE IF EXISTS t_history; DROP TABLE IF EXISTS t1; --enable_warnings CREATE TEMPORARY TABLE t_history (attempt SMALLINT, start_ts DATETIME, end_ts DATETIME, start_cached INTEGER, end_cached INTEGER); CREATE TABLE t1 (f1 BIGINT); let $num = `SELECT @row_count`; while ($num) { INSERT INTO t1 VALUES (1); dec $num; } let $loops = 4; let $num = $loops; while ($num) { let $Qcache_queries_in_cache = query_get_value(SHOW STATUS LIKE 'Qcache_queries_in_cache', Value, 1); eval INSERT INTO t_history SET attempt = $loops - $num + 1, start_ts = NOW(), start_cached = $Qcache_queries_in_cache; SELECT *, SLEEP(@sleep_time_per_result_row) FROM t1; # # Do not determine Qcache_queries_in_cache before updating end_ts. The SHOW # might cost too much time on an overloaded box. eval UPDATE t_history SET end_ts = NOW() WHERE attempt = $loops - $num + 1; let $Qcache_queries_in_cache = query_get_value(SHOW STATUS LIKE 'Qcache_queries_in_cache', Value, 1); eval UPDATE t_history SET end_cached = $Qcache_queries_in_cache WHERE attempt = $loops - $num + 1; # DEBUG eval SELECT * FROM t_history WHERE attempt = $loops - $num + 1; dec $num; } # 1. The majority of queries with SLEEP must need a reasonable time # -> SLEEP has an impact on runtime # = Replacement for original Bug#6760 test # -> total runtime is clear more needed than for one result row needed # = Replacement for one of the original Bug#12689 tests --echo # Test 1: Does the query with SLEEP need a reasonable time? eval SELECT COUNT(*) >= $loops - 1 INTO @aux1 FROM t_history WHERE TIMEDIFF(end_ts,start_ts) - @sleep_time_per_result_row * @row_count BETWEEN 0 AND @max_acceptable_delay; SELECT @aux1 AS "Expect 1"; # # 2. The majority of queries (the first one must be ignored) with SLEEP must # need a reasonable time # -> If we assume that the result of a cached query will be sent back # immediate, without any sleep, than the query with SLEEP cannot be cached # (current and intended behaviour for queries with SLEEP). # -> It could be also not excluded that the query was cached but the server # honoured somehow the SLEEP. Such a behaviour would be also acceptable. # = Replacement for one of the original Bug#12689 tests --echo # Test 2: Does the query with SLEEP need a reasonable time even in case --echo # of the non first execution? eval SELECT COUNT(*) >= $loops - 1 - 1 INTO @aux2 FROM t_history WHERE TIMEDIFF(end_ts,start_ts) - @sleep_time_per_result_row * @row_count BETWEEN 0 AND @max_acceptable_delay AND attempt > 1; SELECT @aux2 AS "Expect 1"; # # 3. The query with SLEEP should be not cached. # -> SHOW STATUS Qcache_queries_in_cache must be not incremented after # the execution of the query with SLEEP --echo # Test 3: The query with SLEEP must be not cached. eval SELECT COUNT(*) = $loops INTO @aux3 FROM t_history WHERE end_cached = start_cached; SELECT @aux3 AS "Expect 1"; # # Dump the content of t_history if one of the tests failed. if (`SELECT @aux1 + @aux2 + @aux3 <> 3`) { --echo # Some tests failed, dumping the content of t_history SELECT * FROM t_history; } DROP TABLE t1; DROP TEMPORARY TABLE t_history; SET @@global.query_cache_size = default; # # Bug #21466: INET_ATON() returns signed, not unsigned # create table t1 select INET_ATON('255.255.0.1') as `a`; #Replace default engine value with static engine string --replace_result $DEFAULT_ENGINE ENGINE show create table t1; drop table t1; # # Bug#26093 (SELECT BENCHMARK() for SELECT statements does not produce # valid results) # --disable_warnings drop table if exists table_26093; drop function if exists func_26093_a; drop function if exists func_26093_b; --enable_warnings create table table_26093(a int); insert into table_26093 values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10); delimiter //; create function func_26093_a(x int) returns int begin set @invoked := @invoked + 1; return x; end// create function func_26093_b(x int, y int) returns int begin set @invoked := @invoked + 1; return x; end// delimiter ;// select avg(a) from table_26093; select benchmark(100, (select avg(a) from table_26093)); set @invoked := 0; select benchmark(100, (select avg(func_26093_a(a)) from table_26093)); # Returns only 10, since intermediate results are cached. select @invoked; set @invoked := 0; select benchmark(100, (select avg(func_26093_b(a, rand())) from table_26093)); # Returns 1000, due to rand() preventing caching. select @invoked; --error ER_SUBQUERY_NO_1_ROW select benchmark(100, (select (a) from table_26093)); --error ER_OPERAND_COLUMNS select benchmark(100, (select 1, 1)); drop table table_26093; drop function func_26093_a; drop function func_26093_b; # # Bug #30832: Assertion + crash with select name_const('test',now()); # --error ER_WRONG_ARGUMENTS SELECT NAME_CONST('test', NOW()); --error ER_WRONG_ARGUMENTS SELECT NAME_CONST('test', UPPER('test')); SELECT NAME_CONST('test', NULL); SELECT NAME_CONST('test', 1); SELECT NAME_CONST('test', -1); SELECT NAME_CONST('test', 1.0); SELECT NAME_CONST('test', -1.0); SELECT NAME_CONST('test', 'test'); # # Bug #34749: Server crash when using NAME_CONST() with an aggregate function # CREATE TABLE t1 (a INT); INSERT INTO t1 VALUES (1),(2),(3); # NAME_CONST() + aggregate. SELECT NAME_CONST('flag',1) * MAX(a) FROM t1; SELECT NAME_CONST('flag',1.5) * MAX(a) FROM t1; # Now, wrap the INT_ITEM in Item_func_neg and watch the pretty explosions SELECT NAME_CONST('flag',-1) * MAX(a) FROM t1; SELECT NAME_CONST('flag',-1.5) * MAX(a) FROM t1; --error ER_WRONG_ARGUMENTS SELECT NAME_CONST('flag', SQRT(4)) * MAX(a) FROM t1; --error ER_WRONG_ARGUMENTS SELECT NAME_CONST('flag',-SQRT(4)) * MAX(a) FROM t1; DROP TABLE t1; # # Bug #27545: erroneous usage of NAME_CONST with a name as the first parameter # resolved against a column name of a derived table hangs the client # CREATE TABLE t1 (a int); INSERT INTO t1 VALUES (5), (2); --error ER_WRONG_ARGUMENTS SELECT NAME_CONST(x,2) FROM (SELECT a x FROM t1) t; DROP TABLE t1; # # Bug #32559: connection hangs on query with name_const # CREATE TABLE t1(a INT); INSERT INTO t1 VALUES (), (), (); --error ER_WRONG_ARGUMENTS SELECT NAME_CONST(a, '1') FROM t1; --error ER_WRONG_ARGUMENTS SET INSERT_ID= NAME_CONST(a, a); DROP TABLE t1; # # Bug #31349: ERROR 1062 (23000): Duplicate entry '' for key 'group_key' # create table t1 (a int not null); insert into t1 values (-1), (-2); select min(a) from t1 group by inet_ntoa(a); drop table t1; # # BUG#34289 - Incorrect NAME_CONST substitution in stored procedures breaks # replication # SELECT NAME_CONST('var', 'value') COLLATE latin1_general_cs; # # Bug #35848: UUID() returns UUIDs with the wrong time # select @@session.time_zone into @save_tz; # make sure all times are UTC so the DayNr won't differ set @@session.time_zone='UTC'; select uuid() into @my_uuid; # if version nibble isn't 1, the following calculations will be rubbish select mid(@my_uuid,15,1); select 24 * 60 * 60 * 1000 * 1000 * 10 into @my_uuid_one_day; select concat('0',mid(@my_uuid,16,3),mid(@my_uuid,10,4),left(@my_uuid,8)) into @my_uuidate; select floor(conv(@my_uuidate,16,10)/@my_uuid_one_day) into @my_uuid_date; select 141427 + datediff(curdate(),'1970-01-01') into @my_uuid_synthetic; # these should be identical; date part of UUID should be current date select @my_uuid_date - @my_uuid_synthetic; set @@session.time_zone=@save_tz; # # Bug#42014: Crash, name_const with collate # CREATE TABLE t1 (a DATE); SELECT * FROM t1 WHERE a = NAME_CONST('reportDate', _binary'2009-01-09' COLLATE 'binary'); DROP TABLE t1; # # Bug#35515: Aliases of variables in binary log are ignored with NAME_CONST # select NAME_CONST('_id',1234) as id; --echo End of 5.0 tests # # Bug#12735545 - PARSER STACK OVERFLOW WITH NAME_CONST # CONTAINING OR EXPRESSION # --error ER_WRONG_ARGUMENTS SELECT NAME_CONST('a', -(1 OR 2)) OR 1; --error ER_WRONG_ARGUMENTS SELECT NAME_CONST('a', -(1 AND 2)) OR 1; SELECT NAME_CONST('a', -(1)) OR 1; # # # Bug #30389: connection_id() always return 0 in embedded server # select connection_id() > 0; --echo # --echo # Bug #54461: crash with longblob and union or update with subquery --echo # CREATE TABLE t1 (a INT, b LONGBLOB); INSERT INTO t1 VALUES (1, '2'), (2, '3'), (3, '2'); SELECT DISTINCT LEAST(a, (SELECT b FROM t1 LIMIT 1)) FROM t1 UNION SELECT 1; SELECT DISTINCT GREATEST(a, (SELECT b FROM t1 LIMIT 1)) FROM t1 UNION SELECT 1; DROP TABLE t1; # # Bug #57283: inet_ntoa() crashes # SELECT INET_NTOA(0); SELECT '1' IN ('1', INET_NTOA(0)); --echo # --echo # Bug #52165: Assertion failed: file .\dtoa.c, line 465 --echo # CREATE TABLE t1 (a SET('a'), b INT); INSERT INTO t1 VALUES ('', 0); SELECT COALESCE(a) = COALESCE(b) FROM t1; DROP TABLE t1; --echo # --echo # Bug #54461: crash with longblob and union or update with subquery --echo # CREATE TABLE t1 (a INT, b LONGBLOB); INSERT INTO t1 VALUES (1, '2'), (2, '3'), (3, '2'); SELECT DISTINCT LEAST(a, (SELECT b FROM t1 LIMIT 1)) FROM t1 UNION SELECT 1; SELECT DISTINCT GREATEST(a, (SELECT b FROM t1 LIMIT 1)) FROM t1 UNION SELECT 1; DROP TABLE t1; # # Bug #57283: inet_ntoa() crashes # SELECT INET_NTOA(0); SELECT '1' IN ('1', INET_NTOA(0)); --echo # --echo # End of 5.1 tests --echo # --echo # --echo # Bug #58199: name_const in the having clause crashes --echo # CREATE TABLE t1 (a INT); # NAME_CONST() would seg.fault when used wrongly in a HAVING clause --error ER_WRONG_ARGUMENTS SELECT 1 from t1 HAVING NAME_CONST('', a); DROP TABLE t1; --echo # --echo # End of 5.5 tests --echo # --echo --echo # -- --echo # -- WL#5787: IPv6-capable INET_ATON and INET_NTOA functions. --echo # -- --echo --echo # -- INET6_ATON: checking NULL, invalid types, out-of range values... --echo SELECT INET6_ATON(NULL) IS NULL; SELECT INET6_ATON(123) IS NULL; SELECT INET6_ATON(123.45) IS NULL; SELECT INET6_ATON(str_to_date('2014,2,28 09', '%Y,%m,%d %h')) IS NULL; SELECT INET6_ATON('1.2.3') IS NULL; SELECT INET6_ATON('1.2.3.') IS NULL; SELECT INET6_ATON('1..3.4') IS NULL; SELECT INET6_ATON('-1.2.3.4') IS NULL; SELECT INET6_ATON('1.2.3.256') IS NULL; SELECT INET6_ATON('1.2.3.4.5') IS NULL; SELECT INET6_ATON('0001.2.3.4') IS NULL; SELECT INET6_ATON('0x1.2.3.4') IS NULL; SELECT INET6_ATON('a.2.3.4') IS NULL; SELECT INET6_ATON('1.2.3.4:80') IS NULL; SELECT INET6_ATON('1.2.3.4/32') IS NULL; SELECT INET6_ATON('mysql.com') IS NULL; SELECT INET6_ATON(':::') IS NULL; SELECT INET6_ATON(':1:2:3') IS NULL; SELECT INET6_ATON('1:2:3:') IS NULL; SELECT INET6_ATON(':1::2:3') IS NULL; SELECT INET6_ATON('1::2:3:') IS NULL; SELECT INET6_ATON('::00001') IS NULL; SELECT INET6_ATON('::00001:2') IS NULL; SELECT INET6_ATON('::12345') IS NULL; SELECT INET6_ATON('1020::3040::5060') IS NULL; SELECT INET6_ATON('::ABCZ') IS NULL; SELECT INET6_ATON('::0x1.2.3.4') IS NULL; SELECT INET6_ATON('::1.0x2.3.4') IS NULL; SELECT INET6_ATON('::a.b.c.d') IS NULL; SELECT INET6_ATON('::FFFF:0x1.2.3.4') IS NULL; SELECT INET6_ATON('::FFFF:1.0x2.3.4') IS NULL; SELECT INET6_ATON('::FFFF:a.b.c.d') IS NULL; SELECT INET6_ATON('::1.2.3.4:ABCD') IS NULL; --echo # NOTE: such addresses are supported because getaddrinfo() supports them. --echo # This is just to record the current behaviour. SELECT HEX(INET6_ATON('::ABCD:1.2.3.4')); --echo --echo # -- INET6_ATON: checking binary representation... --echo SELECT HEX(INET6_ATON('0.0.0.0')); SELECT HEX(INET6_ATON('00.00.00.00')); SELECT HEX(INET6_ATON('000.000.000.000')); SELECT HEX(INET6_ATON('1.2.3.4')); SELECT HEX(INET6_ATON('01.02.03.04')); SELECT HEX(INET6_ATON('001.002.003.004')); SELECT HEX(INET6_ATON('255.255.255.255')); SELECT HEX(INET6_ATON('::')); SELECT HEX(INET6_ATON('0::0')); SELECT HEX(INET6_ATON('1::2')); SELECT HEX(INET6_ATON('0::')); SELECT HEX(INET6_ATON('1::')); SELECT HEX(INET6_ATON('::0')); SELECT HEX(INET6_ATON('::1')); SELECT HEX(INET6_ATON('1:2:3:4:5:6:7:8')); SELECT HEX(INET6_ATON('::2:3:4:5:6:7:8')); SELECT HEX(INET6_ATON('1::3:4:5:6:7:8')); SELECT HEX(INET6_ATON('1:2::4:5:6:7:8')); SELECT HEX(INET6_ATON('1:2:3::5:6:7:8')); SELECT HEX(INET6_ATON('1:2:3:4::6:7:8')); SELECT HEX(INET6_ATON('1:2:3:4:5::7:8')); SELECT HEX(INET6_ATON('1:2:3:4:5:6::8')); SELECT HEX(INET6_ATON('1:2:3:4:5:6:7::')); SELECT HEX(INET6_ATON('0000:0000::0000:0001')); SELECT HEX(INET6_ATON('1234:5678:9abc:def0:4321:8765:cba9:0fed')); SELECT HEX(INET6_ATON('0000:0000:0000:0000:0000:0000:0000:0001')); SELECT HEX(INET6_ATON('::C0A8:0102')); SELECT HEX(INET6_ATON('::c0a8:0102')); SELECT HEX(INET6_ATON('::192.168.1.2')); SELECT HEX(INET6_ATON('::FfFf:C0a8:0102')); SELECT HEX(INET6_ATON('::ffff:c0a8:0102')); SELECT HEX(INET6_ATON('::ffff:192.168.1.2')); SELECT HEX(INET6_ATON('::01.2.3.4')); SELECT HEX(INET6_ATON('::1.02.3.4')); SELECT HEX(INET6_ATON('::1.2.03.4')); SELECT HEX(INET6_ATON('::1.2.3.04')); SELECT HEX(INET6_ATON('::1.2.3.00')); SELECT HEX(INET6_ATON('::FFFF:01.2.3.4')); SELECT HEX(INET6_ATON('::FFFF:1.02.3.4')); SELECT HEX(INET6_ATON('::FFFF:1.2.03.4')); SELECT HEX(INET6_ATON('::FFFF:1.2.3.04')); SELECT HEX(INET6_ATON('::FFFF:1.2.3.00')); --echo --echo # -- INET6_ATON: checking the length is either 4 or 16... --echo SELECT LENGTH(INET6_ATON('0.0.0.0')); SELECT LENGTH(INET6_ATON('255.255.255.255')); SELECT LENGTH(INET6_ATON('::')); SELECT LENGTH(INET6_ATON('1020:3040:5060:7080:90A0:B0C0:D0E0:F010')); --echo --echo # -- INET6_NTOA: checking NULL, invalid types, out-of range values... --echo SELECT INET6_NTOA(NULL); SELECT INET6_NTOA(123); SELECT INET6_NTOA(123.456); SELECT INET6_NTOA(str_to_date('2014,2,28 09', '%Y,%m,%d %h')); SELECT INET6_NTOA(UNHEX('C0A801')); # 3 bytes -> NULL SELECT INET6_NTOA(UNHEX('C0A80102')); # 4 bytes -> 192.168.1.2 SELECT INET6_NTOA(UNHEX('C0A8010203')); # 5 bytes -> NULL SELECT INET6_NTOA(UNHEX('0102030405060708090A0B0C0D0E0F')); # 15 bytes -> NULL SELECT INET6_NTOA(UNHEX('0102030405060708090A0B0C0D0E0F10')); # 16 bytes -> IP SELECT INET6_NTOA(UNHEX('0102030405060708090A0B0C0D0E0F1011')); # 17 bytes -> NULL SELECT INET6_NTOA('1234'), INET6_NTOA(BINARY('1234')); SELECT INET6_NTOA('0123456789abcdef'), INET6_NTOA(BINARY('0123456789abcdef')); --echo --echo # -- Checking double-conversion... --echo SELECT INET6_NTOA(INET6_ATON('::')); SELECT INET6_NTOA(INET6_ATON('0::0')); SELECT INET6_NTOA(INET6_ATON('1::2')); SELECT INET6_NTOA(INET6_ATON('0::')); SELECT INET6_NTOA(INET6_ATON('1::')); SELECT INET6_NTOA(INET6_ATON('::0')); SELECT INET6_NTOA(INET6_ATON('::1')); SELECT INET6_NTOA(INET6_ATON('1:2:3:4:5:6:7:8')); SELECT INET6_NTOA(INET6_ATON('::2:3:4:5:6:7:8')); SELECT INET6_NTOA(INET6_ATON('1::3:4:5:6:7:8')); SELECT INET6_NTOA(INET6_ATON('1:2::4:5:6:7:8')); SELECT INET6_NTOA(INET6_ATON('1:2:3::5:6:7:8')); SELECT INET6_NTOA(INET6_ATON('1:2:3:4::6:7:8')); SELECT INET6_NTOA(INET6_ATON('1:2:3:4:5::7:8')); SELECT INET6_NTOA(INET6_ATON('1:2:3:4:5:6::8')); SELECT INET6_NTOA(INET6_ATON('1:2:3:4:5:6:7::')); SELECT INET6_NTOA(INET6_ATON('0000:0000::0000:0001')); SELECT INET6_NTOA(INET6_ATON('1234:5678:9abc:def0:4321:8765:cba9:0fed')); SELECT INET6_NTOA(INET6_ATON('0000:0000:0000:0000:0000:0000:0000:0001')); SELECT INET6_NTOA(INET6_ATON('::C0A8:0102')); SELECT INET6_NTOA(INET6_ATON('::c0a8:0102')); SELECT INET6_NTOA(INET6_ATON('::192.168.1.2')); SELECT INET6_NTOA(INET6_ATON('::FfFf:C0a8:0102')); SELECT INET6_NTOA(INET6_ATON('::ffff:c0a8:0102')); SELECT INET6_NTOA(INET6_ATON('::ffff:192.168.1.2')); SELECT INET6_NTOA(INET6_ATON('::01.2.3.4')); SELECT INET6_NTOA(INET6_ATON('::1.02.3.4')); SELECT INET6_NTOA(INET6_ATON('::1.2.03.4')); SELECT INET6_NTOA(INET6_ATON('::1.2.3.04')); SELECT INET6_NTOA(INET6_ATON('::1.2.3.00')); SELECT INET6_NTOA(INET6_ATON('::FFFF:01.2.3.4')); SELECT INET6_NTOA(INET6_ATON('::FFFF:1.02.3.4')); SELECT INET6_NTOA(INET6_ATON('::FFFF:1.2.03.4')); SELECT INET6_NTOA(INET6_ATON('::FFFF:1.2.3.04')); SELECT INET6_NTOA(INET6_ATON('::FFFF:1.2.3.00')); --echo --echo # -- Comparing INET_ATON() and INET6_ATON()... --echo SELECT HEX(INET_ATON('192.168.1.2')); SELECT HEX(INET6_ATON('192.168.1.2')); SELECT HEX(INET_ATON('255.255.255.255')); SELECT HEX(INET6_ATON('255.255.255.255')); SELECT HEX(INET_ATON('192.168.08.2')); SELECT HEX(INET6_ATON('192.168.08.2')); SELECT HEX(INET_ATON('192.168.0x8.2')); SELECT HEX(INET6_ATON('192.168.0x8.2')); SELECT HEX(INET_ATON('1.2.255')); SELECT HEX(INET6_ATON('1.2.255')); SELECT HEX(INET_ATON('1.2.256')); SELECT HEX(INET6_ATON('1.2.256')); SELECT HEX(INET_ATON('1.0002.3.4')); SELECT HEX(INET6_ATON('1.0002.3.4')); SELECT HEX(INET_ATON('1.2.3.4.5')); SELECT HEX(INET6_ATON('1.2.3.4.5')); --echo --echo # -- Checking mix of INET- and INET6- functions... --echo SELECT HEX(INET6_ATON(INET_NTOA(INET_ATON('1.2.3.4')))) AS x; --echo --echo # -- Checking IS_IPV4() / IS_IPV6()... --echo SELECT IS_IPV4(NULL); SELECT IS_IPV4(1); SELECT IS_IPV4(1.0); SELECT IS_IPV4('1.2.3.4'); SELECT IS_IPV4('001.02.000.255'); SELECT IS_IPV4('::1.2.0.255'); SELECT IS_IPV4('::1'); SELECT IS_IPV4(BINARY('1.2.3.4')); SELECT IS_IPV6(NULL); SELECT IS_IPV6(1); SELECT IS_IPV6(1.0); SELECT IS_IPV6('1.2.3.4'); SELECT IS_IPV6('001.02.000.255'); SELECT IS_IPV6('::001.02.000.255'); SELECT IS_IPV6('::1.2.0.255'); SELECT IS_IPV6('::1'); SELECT IS_IPV6('0000:0000:0000:0000:0000:0000:0000:0001'); SELECT IS_IPV6(BINARY('0000:0000:0000:0000:0000:0000:0000:0001')); --echo --echo # -- Checking IS_IPV4_MAPPED() and IS_IPV4_COMPAT()... --echo SELECT IS_IPV4_MAPPED(INET6_ATON('1.2.3.4')), IS_IPV4_COMPAT(INET6_ATON('1.2.3.4')); SELECT IS_IPV4_MAPPED(INET6_ATON('::1.2.3.4')), IS_IPV4_COMPAT(INET6_ATON('::1.2.3.4')); SELECT IS_IPV4_MAPPED(INET6_ATON('::FFFF:1.2.3.4')), IS_IPV4_COMPAT(INET6_ATON('::FFFF:1.2.3.4')); SELECT IS_IPV4_MAPPED(INET6_ATON('::ABCD:1.2.3.4')), IS_IPV4_COMPAT(INET6_ATON('::ABCD:1.2.3.4')); SELECT IS_IPV4_MAPPED(INET6_ATON('::1')), IS_IPV4_COMPAT(INET6_ATON('::1')); SELECT IS_IPV4_MAPPED(INET6_ATON('::')), IS_IPV4_COMPAT(INET6_ATON('::')); # NOTE: IS_IPV4_COMPAT() / IS_IPV4_MAPPED() could work with "regular strings in # binary collation" too, but there is no way to create a "regular string" # starting with \0. --echo --echo # -- Checking IS_IPV4_COMPAT()... --echo --echo --echo # -- Working with a table... --echo --disable_warnings DROP TABLE IF EXISTS t1; DROP TABLE IF EXISTS t2; --enable_warnings CREATE TABLE t1(ip INT UNSIGNED); CREATE TABLE t2(ip VARBINARY(16)); --echo INSERT INTO t1 VALUES (INET_ATON('1.2.3.4')), (INET_ATON('255.255.255.255')); SELECT INET_NTOA(ip) FROM t1; --echo INSERT INTO t2 SELECT INET6_ATON(INET_NTOA(ip)) FROM t1; SELECT INET6_NTOA(ip), HEX(ip), LENGTH(ip) FROM t2; DELETE FROM t2; --echo INSERT INTO t2 VALUES (INET6_ATON('1.2.3.4')), (INET6_ATON('255.255.255.255')), (INET6_ATON('::1.2.3.4')), (INET6_ATON('::ffff:255.255.255.255')), (INET6_ATON('::')), (INET6_ATON('::1')), (INET6_ATON('1020:3040:5060:7080:90A0:B0C0:D0E0:F010')); SELECT INET6_NTOA(ip), HEX(ip), LENGTH(ip) FROM t2; --echo DELETE FROM t2; INSERT INTO t2 VALUES (INET6_ATON('1.0002.3.4')); INSERT INTO t2 VALUES (INET6_ATON('1.2.255')); INSERT INTO t2 VALUES (INET6_ATON('1.2.256')); INSERT INTO t2 VALUES (INET6_ATON('192.168.0x8.2')); INSERT INTO t2 VALUES (inet_aton("122.256")); INSERT INTO t2 VALUES (inet_aton("122.226.")); INSERT INTO t2 VALUES (inet_aton("")); INSERT INTO t2 VALUES (UNHEX('Z0Q80F02')); SELECT INET6_NTOA(ip), HEX(ip), LENGTH(ip) FROM t2; DELETE FROM t2; --echo SET sql_mode = default; --error ER_WRONG_VALUE_FOR_TYPE INSERT INTO t2 VALUES (INET6_ATON('1.0002.3.4')); --error ER_WRONG_VALUE_FOR_TYPE INSERT INTO t2 VALUES (INET6_ATON('1.2.255')); --error ER_WRONG_VALUE_FOR_TYPE INSERT INTO t2 VALUES (INET6_ATON('1.2.256')); --error ER_WRONG_VALUE_FOR_TYPE INSERT INTO t2 VALUES (INET6_ATON('192.168.0x8.2')); --error ER_WRONG_VALUE_FOR_TYPE INSERT INTO t2 VALUES (inet_aton("122.256")); --error ER_WRONG_VALUE_FOR_TYPE INSERT INTO t2 VALUES (inet_aton("122.226.")); --error ER_WRONG_VALUE_FOR_TYPE INSERT INTO t2 VALUES (inet_aton("")); --echo --error ER_WRONG_VALUE_FOR_TYPE INSERT INTO t2 VALUES (UNHEX('Z0Q80F02')); SELECT INET6_NTOA(ip), HEX(ip), LENGTH(ip) FROM t2; DROP TABLE t1; DROP TABLE t2; --echo # --echo # Bug#22071558 INET_ATON ACCEPTS MORE THAN FOUR GROUPS OF DIGITS AND RETURNS INT BIGGER THAN 4G --echo # select inet_aton("0.255.255.255.255"); select inet_aton("255.255.255.2551"); --echo --echo # -- Done. --echo --echo # --echo # End of tests --echo #