diff options
Diffstat (limited to 'plugin')
60 files changed, 8016 insertions, 96 deletions
diff --git a/plugin/feedback/utils.cc b/plugin/feedback/utils.cc index bbbd5850089..c31422cc7ec 100644 --- a/plugin/feedback/utils.cc +++ b/plugin/feedback/utils.cc @@ -403,7 +403,7 @@ int fill_collation_statistics(THD *thd, TABLE_LIST *tables) if (my_collation_is_known_id(id) && (count= my_collation_statistics_get_use_count(id))) { - char name[MY_CS_NAME_SIZE + 32]; + char name[MY_CS_COLLATION_NAME_SIZE + 32]; size_t namelen= my_snprintf(name, sizeof(name), "Collation used %s", get_charset_name(id)); diff --git a/plugin/password_reuse_check/password_reuse_check.c b/plugin/password_reuse_check/password_reuse_check.c index 8f5973721d8..47c9b4531a8 100644 --- a/plugin/password_reuse_check/password_reuse_check.c +++ b/plugin/password_reuse_check/password_reuse_check.c @@ -95,7 +95,7 @@ static int create_table(MYSQL *mysql) // 512/8 = 64 STRING_WITH_LEN("CREATE TABLE mysql." HISTORY_DB_NAME " ( hash binary(64)," - " time timestamp default current_timestamp," + " time timestamp not null default current_timestamp," " primary key (hash), index tm (time) )" " ENGINE=Aria"))) { diff --git a/plugin/qc_info/qc_info.cc b/plugin/qc_info/qc_info.cc index a46e2d9fbf2..a73bc8ea9ec 100644 --- a/plugin/qc_info/qc_info.cc +++ b/plugin/qc_info/qc_info.cc @@ -96,7 +96,7 @@ static ST_FIELD_INFO qc_info_fields[]= Column("GROUP_CONCAT_MAX_LENGTH",SLonglong(MY_INT32_NUM_DECIMAL_DIGITS), NOT_NULL), Column("CHARACTER_SET_CLIENT", CSName(), NOT_NULL), Column("CHARACTER_SET_RESULT", CSName(), NOT_NULL), - Column("COLLATION", CSName(), NOT_NULL), + Column("COLLATION", CLName(), NOT_NULL), Column("TIMEZONE", Varchar(50), NOT_NULL), Column("DEFAULT_WEEK_FORMAT", SLong(), NOT_NULL), Column("DIV_PRECISION_INCREMENT",SLong(), NOT_NULL), diff --git a/plugin/type_inet/item_inetfunc.cc b/plugin/type_inet/item_inetfunc.cc index b23ae04a861..514a3760cd5 100644 --- a/plugin/type_inet/item_inetfunc.cc +++ b/plugin/type_inet/item_inetfunc.cc @@ -151,7 +151,7 @@ String *Item_func_inet6_aton::val_str(String *buffer) if ((null_value= tmp.is_null())) return NULL; - Inet4_null ipv4(*tmp.string()); + Inet4Bundle::Fbt_null ipv4(*tmp.string()); if (!ipv4.is_null()) { ipv4.to_binary(buffer); @@ -190,7 +190,7 @@ String *Item_func_inet6_ntoa::val_str_ascii(String *buffer) if ((null_value= tmp.is_null())) return NULL; - Inet4_null ipv4(static_cast<const Binary_string&>(*tmp.string())); + Inet4Bundle::Fbt_null ipv4(static_cast<const Binary_string&>(*tmp.string())); if (!ipv4.is_null()) { ipv4.to_string(buffer); @@ -218,7 +218,7 @@ longlong Item_func_is_ipv4::val_int() { DBUG_ASSERT(fixed()); String_ptr_and_buffer<STRING_BUFFER_USUAL_SIZE> tmp(args[0]); - return !tmp.is_null() && !Inet4_null(*tmp.string()).is_null(); + return !tmp.is_null() && !Inet4Bundle::Fbt_null(*tmp.string()).is_null(); } class IP6 : public Inet6Bundle::Fbt_null diff --git a/plugin/type_inet/mysql-test/type_inet/binlog_stm_type_inet4.result b/plugin/type_inet/mysql-test/type_inet/binlog_stm_type_inet4.result new file mode 100644 index 00000000000..81500ee78f4 --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/binlog_stm_type_inet4.result @@ -0,0 +1,43 @@ +# +# Start of 10.10 tests +# +# +# MDEV-23287 The INET4 data type +# +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('0.0.0.0'); +INSERT INTO t1 VALUES ('255.255.255.255'); +PREPARE stmt FROM 'INSERT INTO t1 VALUES (?)'; +EXECUTE stmt USING CAST('0.0.0.1' AS INET4); +EXECUTE stmt USING CAST(CONCAT(REPEAT(0x00,3), 0x02) AS INET4); +DEALLOCATE PREPARE stmt; +BEGIN NOT ATOMIC +DECLARE a INET4 DEFAULT '0.0.0.3'; +INSERT INTO t1 VALUES (a); +END; +$$ +DROP TABLE t1; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # use `test`; CREATE TABLE t1 (a INET4) +master-bin.000001 # Gtid # # BEGIN GTID #-#-# +master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES ('0.0.0.0') +master-bin.000001 # Query # # COMMIT +master-bin.000001 # Gtid # # BEGIN GTID #-#-# +master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES ('255.255.255.255') +master-bin.000001 # Query # # COMMIT +master-bin.000001 # Gtid # # BEGIN GTID #-#-# +master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES ('0.0.0.1') +master-bin.000001 # Query # # COMMIT +master-bin.000001 # Gtid # # BEGIN GTID #-#-# +master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES ('0.0.0.2') +master-bin.000001 # Query # # COMMIT +master-bin.000001 # Gtid # # BEGIN GTID #-#-# +master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES ( NAME_CONST('a','0.0.0.3')) +master-bin.000001 # Query # # COMMIT +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # use `test`; DROP TABLE `t1` /* generated by server */ +# +# End of 10.10 tests +# diff --git a/plugin/type_inet/mysql-test/type_inet/binlog_stm_type_inet4.test b/plugin/type_inet/mysql-test/type_inet/binlog_stm_type_inet4.test new file mode 100644 index 00000000000..87e8bbe2f46 --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/binlog_stm_type_inet4.test @@ -0,0 +1,40 @@ +--source include/not_embedded.inc +--source include/have_binlog_format_statement.inc + +--echo # +--echo # Start of 10.10 tests +--echo # + +--echo # +--echo # MDEV-23287 The INET4 data type +--echo # + +--disable_query_log +reset master; # get rid of previous tests binlog +--enable_query_log + +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('0.0.0.0'); +INSERT INTO t1 VALUES ('255.255.255.255'); + +PREPARE stmt FROM 'INSERT INTO t1 VALUES (?)'; +EXECUTE stmt USING CAST('0.0.0.1' AS INET4); +EXECUTE stmt USING CAST(CONCAT(REPEAT(0x00,3), 0x02) AS INET4); +DEALLOCATE PREPARE stmt; + +DELIMITER $$; +BEGIN NOT ATOMIC + DECLARE a INET4 DEFAULT '0.0.0.3'; + INSERT INTO t1 VALUES (a); +END; +$$ +DELIMITER ;$$ + +DROP TABLE t1; + +--let $binlog_file = LAST +source include/show_binlog_events.inc; + +--echo # +--echo # End of 10.10 tests +--echo # diff --git a/plugin/type_inet/mysql-test/type_inet/binlog_table_map_optional_metadata_type_inet4.result b/plugin/type_inet/mysql-test/type_inet/binlog_table_map_optional_metadata_type_inet4.result new file mode 100644 index 00000000000..f3694903793 --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/binlog_table_map_optional_metadata_type_inet4.result @@ -0,0 +1,61 @@ +# +# Start of 10.10 tests +# +# +# MDEV-23287 The INET4 data type +# MDEV-20822 INET6 crashes in combination with RBR extended metadata +# +# Using DEFAULT_CHARSET format +RESET MASTER; +SET GLOBAL binlog_row_metadata = NO_LOG; +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES('0.0.0.0'); +# Columns(BINARY(4)) +DROP TABLE t1; +RESET MASTER; +RESET MASTER; +SET GLOBAL binlog_row_metadata = MINIMAL; +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES('0.0.0.0'); +# Columns(BINARY(4)) +DROP TABLE t1; +RESET MASTER; +RESET MASTER; +SET GLOBAL binlog_row_metadata = FULL; +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES('0.0.0.0'); +# Columns(`a` BINARY(4)) +DROP TABLE t1; +RESET MASTER; +# Using COLUMN_CHARSET format +RESET MASTER; +SET GLOBAL binlog_row_metadata = NO_LOG; +CREATE TABLE t1 (a INET4, b CHAR(16) CHARACTER SET latin1, c CHAR(16) CHARACTER SET utf8); +INSERT INTO t1 VALUES('0.0.0.0','',''); +# Columns(BINARY(4), +# BINARY(16), +# BINARY(48)) +DROP TABLE t1; +RESET MASTER; +RESET MASTER; +SET GLOBAL binlog_row_metadata = MINIMAL; +CREATE TABLE t1 (a INET4, b CHAR(16) CHARACTER SET latin1, c CHAR(16) CHARACTER SET utf8); +INSERT INTO t1 VALUES('0.0.0.0','',''); +# Columns(BINARY(4), +# CHAR(16) CHARSET latin1 COLLATE latin1_swedish_ci, +# CHAR(16) CHARSET utf8mb3 COLLATE utf8mb3_general_ci) +DROP TABLE t1; +RESET MASTER; +RESET MASTER; +SET GLOBAL binlog_row_metadata = FULL; +CREATE TABLE t1 (a INET4, b CHAR(16) CHARACTER SET latin1, c CHAR(16) CHARACTER SET utf8); +INSERT INTO t1 VALUES('0.0.0.0','',''); +# Columns(`a` BINARY(4), +# `b` CHAR(16) CHARSET latin1 COLLATE latin1_swedish_ci, +# `c` CHAR(16) CHARSET utf8mb3 COLLATE utf8mb3_general_ci) +DROP TABLE t1; +RESET MASTER; +SET GLOBAL binlog_row_metadata = DEFAULT; +# +# End of 10.10 tests +# diff --git a/plugin/type_inet/mysql-test/type_inet/binlog_table_map_optional_metadata_type_inet4.test b/plugin/type_inet/mysql-test/type_inet/binlog_table_map_optional_metadata_type_inet4.test new file mode 100644 index 00000000000..82e76401053 --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/binlog_table_map_optional_metadata_type_inet4.test @@ -0,0 +1,73 @@ +--source include/have_debug.inc +--source include/have_binlog_format_row.inc + +--let $MYSQLD_DATADIR= `select @@datadir` +--let $binlog_file= $MYSQLD_DATADIR/master-bin.000001 + + +--echo # +--echo # Start of 10.10 tests +--echo # + +--echo # +--echo # MDEV-23287 The INET4 data type +--echo # MDEV-20822 INET6 crashes in combination with RBR extended metadata +--echo # + +--echo # Using DEFAULT_CHARSET format + +RESET MASTER; +SET GLOBAL binlog_row_metadata = NO_LOG; +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES('0.0.0.0'); +--source suite/binlog/include/print_optional_metadata.inc +DROP TABLE t1; +RESET MASTER; + +RESET MASTER; +SET GLOBAL binlog_row_metadata = MINIMAL; +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES('0.0.0.0'); +--source suite/binlog/include/print_optional_metadata.inc +DROP TABLE t1; +RESET MASTER; + +RESET MASTER; +SET GLOBAL binlog_row_metadata = FULL; +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES('0.0.0.0'); +--source suite/binlog/include/print_optional_metadata.inc +DROP TABLE t1; +RESET MASTER; + +--echo # Using COLUMN_CHARSET format + +RESET MASTER; +SET GLOBAL binlog_row_metadata = NO_LOG; +CREATE TABLE t1 (a INET4, b CHAR(16) CHARACTER SET latin1, c CHAR(16) CHARACTER SET utf8); +INSERT INTO t1 VALUES('0.0.0.0','',''); +--source suite/binlog/include/print_optional_metadata.inc +DROP TABLE t1; +RESET MASTER; + +RESET MASTER; +SET GLOBAL binlog_row_metadata = MINIMAL; +CREATE TABLE t1 (a INET4, b CHAR(16) CHARACTER SET latin1, c CHAR(16) CHARACTER SET utf8); +INSERT INTO t1 VALUES('0.0.0.0','',''); +--source suite/binlog/include/print_optional_metadata.inc +DROP TABLE t1; +RESET MASTER; + +RESET MASTER; +SET GLOBAL binlog_row_metadata = FULL; +CREATE TABLE t1 (a INET4, b CHAR(16) CHARACTER SET latin1, c CHAR(16) CHARACTER SET utf8); +INSERT INTO t1 VALUES('0.0.0.0','',''); +--source suite/binlog/include/print_optional_metadata.inc +DROP TABLE t1; +RESET MASTER; + +SET GLOBAL binlog_row_metadata = DEFAULT; + +--echo # +--echo # End of 10.10 tests +--echo # diff --git a/plugin/type_inet/mysql-test/type_inet/rpl_row_binary_to_inet4.result b/plugin/type_inet/mysql-test/type_inet/rpl_row_binary_to_inet4.result new file mode 100644 index 00000000000..5921ab25974 --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/rpl_row_binary_to_inet4.result @@ -0,0 +1,36 @@ +include/master-slave.inc +[connection master] +# +# Start of 10.10 tests +# +# +# MDEV-23287 The INET4 data type +# MDEV-20844 RBR from binary(16) to inet6 fails with error 171: The event was corrupt, leading to illegal data being read +# +CREATE TABLE t1 (a BINARY(4)); +connection slave; +ALTER TABLE t1 MODIFY a INET4; +connection master; +INSERT INTO t1 VALUES (0x00000000); +INSERT INTO t1 VALUES (0xa0000001); +INSERT INTO t1 VALUES (0xf0000000); +INSERT INTO t1 VALUES (0xff000001); +SELECT CAST(a AS INET4) FROM t1 ORDER BY a; +CAST(a AS INET4) +0.0.0.0 +160.0.0.1 +240.0.0.0 +255.0.0.1 +connection slave; +SELECT * FROM t1 ORDER BY a; +a +0.0.0.0 +160.0.0.1 +240.0.0.0 +255.0.0.1 +connection master; +DROP TABLE t1; +# +# End of 10.10 tests +# +include/rpl_end.inc diff --git a/plugin/type_inet/mysql-test/type_inet/rpl_row_binary_to_inet4.test b/plugin/type_inet/mysql-test/type_inet/rpl_row_binary_to_inet4.test new file mode 100644 index 00000000000..0b96293dc8b --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/rpl_row_binary_to_inet4.test @@ -0,0 +1,34 @@ +--source include/have_binlog_format_row.inc +--source include/master-slave.inc + +--echo # +--echo # Start of 10.10 tests +--echo # + +--echo # +--echo # MDEV-23287 The INET4 data type +--echo # MDEV-20844 RBR from binary(16) to inet6 fails with error 171: The event was corrupt, leading to illegal data being read +--echo # + +CREATE TABLE t1 (a BINARY(4)); + +--sync_slave_with_master +ALTER TABLE t1 MODIFY a INET4; + +--connection master +INSERT INTO t1 VALUES (0x00000000); +INSERT INTO t1 VALUES (0xa0000001); +INSERT INTO t1 VALUES (0xf0000000); +INSERT INTO t1 VALUES (0xff000001); +SELECT CAST(a AS INET4) FROM t1 ORDER BY a; +--sync_slave_with_master +SELECT * FROM t1 ORDER BY a; + +--connection master +DROP TABLE t1; + +--echo # +--echo # End of 10.10 tests +--echo # + +--source include/rpl_end.inc diff --git a/plugin/type_inet/mysql-test/type_inet/rpl_row_inet4_to_binary.result b/plugin/type_inet/mysql-test/type_inet/rpl_row_inet4_to_binary.result new file mode 100644 index 00000000000..169300563f9 --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/rpl_row_inet4_to_binary.result @@ -0,0 +1,36 @@ +include/master-slave.inc +[connection master] +# +# Start of 10.10 tests +# +# +# MDEV-23287 The INET4 data type +# MDEV-20844 RBR from binary(16) to inet6 fails with error 171: The event was corrupt, leading to illegal data being read +# +CREATE TABLE t1 (a INET4); +connection slave; +ALTER TABLE t1 MODIFY a BINARY(4); +connection master; +INSERT INTO t1 VALUES ('0.0.0.0'); +INSERT INTO t1 VALUES ('192.168.0.1'); +INSERT INTO t1 VALUES ('255.0.0.0'); +INSERT INTO t1 VALUES ('255.0.0.1'); +SELECT a FROM t1 ORDER BY a; +a +0.0.0.0 +192.168.0.1 +255.0.0.0 +255.0.0.1 +connection slave; +SELECT CAST(a AS INET4) FROM t1 ORDER BY a; +CAST(a AS INET4) +0.0.0.0 +192.168.0.1 +255.0.0.0 +255.0.0.1 +connection master; +DROP TABLE t1; +# +# End of 10.10 tests +# +include/rpl_end.inc diff --git a/plugin/type_inet/mysql-test/type_inet/rpl_row_inet4_to_binary.test b/plugin/type_inet/mysql-test/type_inet/rpl_row_inet4_to_binary.test new file mode 100644 index 00000000000..6200760e1fb --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/rpl_row_inet4_to_binary.test @@ -0,0 +1,34 @@ +--source include/have_binlog_format_row.inc +--source include/master-slave.inc + +--echo # +--echo # Start of 10.10 tests +--echo # + +--echo # +--echo # MDEV-23287 The INET4 data type +--echo # MDEV-20844 RBR from binary(16) to inet6 fails with error 171: The event was corrupt, leading to illegal data being read +--echo # + +CREATE TABLE t1 (a INET4); + +--sync_slave_with_master +ALTER TABLE t1 MODIFY a BINARY(4); + +--connection master +INSERT INTO t1 VALUES ('0.0.0.0'); +INSERT INTO t1 VALUES ('192.168.0.1'); +INSERT INTO t1 VALUES ('255.0.0.0'); +INSERT INTO t1 VALUES ('255.0.0.1'); +SELECT a FROM t1 ORDER BY a; +--sync_slave_with_master +SELECT CAST(a AS INET4) FROM t1 ORDER BY a; + +--connection master +DROP TABLE t1; + +--echo # +--echo # End of 10.10 tests +--echo # + +--source include/rpl_end.inc diff --git a/plugin/type_inet/mysql-test/type_inet/rpl_type_inet4.result b/plugin/type_inet/mysql-test/type_inet/rpl_type_inet4.result new file mode 100644 index 00000000000..bd1c3dac5c1 --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/rpl_type_inet4.result @@ -0,0 +1,23 @@ +include/master-slave.inc +[connection master] +# +# Start of 10.10 tests +# +# +# MDEV-23287 The INET4 data type +# +connection master; +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('0.0.0.0'),('255.255.255.255'); +connection slave; +SELECT HEX(a), a FROM t1; +HEX(a) a +00000000 0.0.0.0 +FFFFFFFF 255.255.255.255 +connection master; +DROP TABLE t1; +connection slave; +# +# Start of 10.10 tests +# +include/rpl_end.inc diff --git a/plugin/type_inet/mysql-test/type_inet/rpl_type_inet4.test b/plugin/type_inet/mysql-test/type_inet/rpl_type_inet4.test new file mode 100644 index 00000000000..af9f6eee54f --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/rpl_type_inet4.test @@ -0,0 +1,24 @@ +--source include/master-slave.inc + +--echo # +--echo # Start of 10.10 tests +--echo # + +--echo # +--echo # MDEV-23287 The INET4 data type +--echo # + +connection master; +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('0.0.0.0'),('255.255.255.255'); +sync_slave_with_master; +SELECT HEX(a), a FROM t1; +connection master; +DROP TABLE t1; +sync_slave_with_master; + +--echo # +--echo # Start of 10.10 tests +--echo # + +--source include/rpl_end.inc diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet4-debug.result b/plugin/type_inet/mysql-test/type_inet/type_inet4-debug.result new file mode 100644 index 00000000000..db0eb4332e9 --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet4-debug.result @@ -0,0 +1,24 @@ +# +# Start of 10.10 tests +# +# +# MDEV-23287 The INET4 data type +# +SET @old_debug_dbug=@@debug_dbug; +SET debug_dbug="+d,frm_data_type_info"; +CREATE TABLE t1 (c01 INET4, c02 INET4); +Warnings: +Note 1105 build_frm_image: Field data type info length: 14 +Note 1105 DBUG: [0] name='c01' type_info='inet4' +Note 1105 DBUG: [1] name='c02' type_info='inet4' +SET debug_dbug=@old_debug_dbug; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c01` inet4 DEFAULT NULL, + `c02` inet4 DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t1; +# +# End of 10.10 tests +# diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet4-debug.test b/plugin/type_inet/mysql-test/type_inet/type_inet4-debug.test new file mode 100644 index 00000000000..8910c6c3c57 --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet4-debug.test @@ -0,0 +1,22 @@ +--source include/have_debug.inc + +--echo # +--echo # Start of 10.10 tests +--echo # + +--echo # +--echo # MDEV-23287 The INET4 data type +--echo # + +SET @old_debug_dbug=@@debug_dbug; + +SET debug_dbug="+d,frm_data_type_info"; +CREATE TABLE t1 (c01 INET4, c02 INET4); +SET debug_dbug=@old_debug_dbug; + +SHOW CREATE TABLE t1; +DROP TABLE t1; + +--echo # +--echo # End of 10.10 tests +--echo # diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet4.result b/plugin/type_inet/mysql-test/type_inet/type_inet4.result new file mode 100644 index 00000000000..7763b28e1fb --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet4.result @@ -0,0 +1,2019 @@ +# +# Start of 10.10 tests +# +# +# MDEV-23287 The INET4 data type +# +# +# Basic CREATE functionality, defaults, metadata +# +CREATE TABLE t1 (a INET4 AUTO_INCREMENT); +ERROR 42000: Incorrect column specifier for column 'a' +CREATE TABLE t1 (a INET4); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` inet4 DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DESCRIBE t1; +Field Type Null Key Default Extra +a inet4 YES NULL +SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='test' AND table_name='t1'; +TABLE_CATALOG def +TABLE_SCHEMA test +TABLE_NAME t1 +COLUMN_NAME a +ORDINAL_POSITION 1 +COLUMN_DEFAULT NULL +IS_NULLABLE YES +DATA_TYPE inet4 +CHARACTER_MAXIMUM_LENGTH NULL +CHARACTER_OCTET_LENGTH NULL +NUMERIC_PRECISION NULL +NUMERIC_SCALE NULL +DATETIME_PRECISION NULL +CHARACTER_SET_NAME NULL +COLLATION_NAME NULL +COLUMN_TYPE inet4 +COLUMN_KEY +EXTRA +PRIVILEGES # +COLUMN_COMMENT +IS_GENERATED NEVER +GENERATION_EXPRESSION NULL +DROP TABLE t1; +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('0.0.0.1'); +SELECT * FROM t1; +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def test t1 t1 a a 254 (type=inet4) 15 7 Y 160 0 8 +a +0.0.0.1 +SELECT CAST('0.0.0.1' AS INET4) AS a; +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def a 254 (type=inet4) 15 7 N 33 0 8 +a +0.0.0.1 +DROP TABLE t1; +CREATE TABLE t1 ( +c1 INET4 DEFAULT 0x00000000, +c2 INET4 DEFAULT 0xFFFFFFFF, +c3 INET4 DEFAULT '0.0.0.255', +c4 INET4 DEFAULT '255.0.0.255', +c5 INET4 DEFAULT CAST(X'FFFF00FF' AS INET4) +); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` inet4 DEFAULT '0.0.0.0', + `c2` inet4 DEFAULT '255.255.255.255', + `c3` inet4 DEFAULT '0.0.0.255', + `c4` inet4 DEFAULT '255.0.0.255', + `c5` inet4 DEFAULT cast(X'ffff00ff' as inet4) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DESCRIBE t1; +Field Type Null Key Default Extra +c1 inet4 YES 0.0.0.0 +c2 inet4 YES 255.255.255.255 +c3 inet4 YES 0.0.0.255 +c4 inet4 YES 255.0.0.255 +c5 inet4 YES cast(X'ffff00ff' as inet4) +SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='test' AND table_name='t1'; +TABLE_CATALOG def +TABLE_SCHEMA test +TABLE_NAME t1 +COLUMN_NAME c1 +ORDINAL_POSITION 1 +COLUMN_DEFAULT '0.0.0.0' +IS_NULLABLE YES +DATA_TYPE inet4 +CHARACTER_MAXIMUM_LENGTH NULL +CHARACTER_OCTET_LENGTH NULL +NUMERIC_PRECISION NULL +NUMERIC_SCALE NULL +DATETIME_PRECISION NULL +CHARACTER_SET_NAME NULL +COLLATION_NAME NULL +COLUMN_TYPE inet4 +COLUMN_KEY +EXTRA +PRIVILEGES # +COLUMN_COMMENT +IS_GENERATED NEVER +GENERATION_EXPRESSION NULL +TABLE_CATALOG def +TABLE_SCHEMA test +TABLE_NAME t1 +COLUMN_NAME c2 +ORDINAL_POSITION 2 +COLUMN_DEFAULT '255.255.255.255' +IS_NULLABLE YES +DATA_TYPE inet4 +CHARACTER_MAXIMUM_LENGTH NULL +CHARACTER_OCTET_LENGTH NULL +NUMERIC_PRECISION NULL +NUMERIC_SCALE NULL +DATETIME_PRECISION NULL +CHARACTER_SET_NAME NULL +COLLATION_NAME NULL +COLUMN_TYPE inet4 +COLUMN_KEY +EXTRA +PRIVILEGES # +COLUMN_COMMENT +IS_GENERATED NEVER +GENERATION_EXPRESSION NULL +TABLE_CATALOG def +TABLE_SCHEMA test +TABLE_NAME t1 +COLUMN_NAME c3 +ORDINAL_POSITION 3 +COLUMN_DEFAULT '0.0.0.255' +IS_NULLABLE YES +DATA_TYPE inet4 +CHARACTER_MAXIMUM_LENGTH NULL +CHARACTER_OCTET_LENGTH NULL +NUMERIC_PRECISION NULL +NUMERIC_SCALE NULL +DATETIME_PRECISION NULL +CHARACTER_SET_NAME NULL +COLLATION_NAME NULL +COLUMN_TYPE inet4 +COLUMN_KEY +EXTRA +PRIVILEGES # +COLUMN_COMMENT +IS_GENERATED NEVER +GENERATION_EXPRESSION NULL +TABLE_CATALOG def +TABLE_SCHEMA test +TABLE_NAME t1 +COLUMN_NAME c4 +ORDINAL_POSITION 4 +COLUMN_DEFAULT '255.0.0.255' +IS_NULLABLE YES +DATA_TYPE inet4 +CHARACTER_MAXIMUM_LENGTH NULL +CHARACTER_OCTET_LENGTH NULL +NUMERIC_PRECISION NULL +NUMERIC_SCALE NULL +DATETIME_PRECISION NULL +CHARACTER_SET_NAME NULL +COLLATION_NAME NULL +COLUMN_TYPE inet4 +COLUMN_KEY +EXTRA +PRIVILEGES # +COLUMN_COMMENT +IS_GENERATED NEVER +GENERATION_EXPRESSION NULL +TABLE_CATALOG def +TABLE_SCHEMA test +TABLE_NAME t1 +COLUMN_NAME c5 +ORDINAL_POSITION 5 +COLUMN_DEFAULT cast(X'ffff00ff' as inet4) +IS_NULLABLE YES +DATA_TYPE inet4 +CHARACTER_MAXIMUM_LENGTH NULL +CHARACTER_OCTET_LENGTH NULL +NUMERIC_PRECISION NULL +NUMERIC_SCALE NULL +DATETIME_PRECISION NULL +CHARACTER_SET_NAME NULL +COLLATION_NAME NULL +COLUMN_TYPE inet4 +COLUMN_KEY +EXTRA +PRIVILEGES # +COLUMN_COMMENT +IS_GENERATED NEVER +GENERATION_EXPRESSION NULL +DROP TABLE t1; +CREATE TABLE t1 (c1 INET4 DEFAULT 0x00); +ERROR 42000: Invalid default value for 'c1' +CREATE TABLE t1 (c1 INET4 DEFAULT ''); +ERROR 42000: Invalid default value for 'c1' +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('x'); +ERROR 22007: Incorrect inet4 value: 'x' for column `test`.`t1`.`a` at row 1 +INSERT INTO t1 VALUES (1); +ERROR HY000: Cannot cast 'int' as 'inet4' in assignment of `test`.`t1`.`a` +INSERT INTO t1 VALUES (TIME'10:20:30'); +ERROR HY000: Cannot cast 'time' as 'inet4' in assignment of `test`.`t1`.`a` +INSERT INTO t1 VALUES (0x00); +ERROR 22007: Incorrect inet4 value: '\x00' for column `test`.`t1`.`a` at row 1 +DROP TABLE t1; +# +# CAST +# +SELECT CAST('garbage' AS INET4); +CAST('garbage' AS INET4) +NULL +Warnings: +Warning 1292 Incorrect inet4 value: 'garbage' +SELECT CAST(0x01 AS INET4); +CAST(0x01 AS INET4) +NULL +Warnings: +Warning 1292 Incorrect inet4 value: '\x01' +SELECT CAST(REPEAT(0x00,16) AS INET4); +CAST(REPEAT(0x00,16) AS INET4) +NULL +Warnings: +Warning 1292 Incorrect inet4 value: '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' +SELECT CAST(REPEAT(0x11,16) AS INET4); +CAST(REPEAT(0x11,16) AS INET4) +NULL +Warnings: +Warning 1292 Incorrect inet4 value: '\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11' +CREATE TABLE t1 AS SELECT CAST('0.0.0.0' AS INET4); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `CAST('0.0.0.0' AS INET4)` inet4 NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t1; +# +# Text and binary formats, comparison operators +# +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES (0x00000000); +INSERT INTO t1 VALUES (0x00000001); +INSERT INTO t1 VALUES (0xFF000001); +INSERT INTO t1 VALUES (0xFF000002); +SELECT * FROM t1 ORDER BY a; +a +0.0.0.0 +0.0.0.1 +255.0.0.1 +255.0.0.2 +SELECT * FROM t1 ORDER BY a DESC; +a +255.0.0.2 +255.0.0.1 +0.0.0.1 +0.0.0.0 +SELECT HEX(a),a FROM t1 ORDER BY a; +HEX(a) a +00000000 0.0.0.0 +00000001 0.0.0.1 +FF000001 255.0.0.1 +FF000002 255.0.0.2 +SELECT * FROM t1 WHERE a='0.0.0.0'; +a +0.0.0.0 +SELECT * FROM t1 WHERE a='0.0.0.1'; +a +0.0.0.1 +SELECT * FROM t1 WHERE a='255.0.0.1'; +a +255.0.0.1 +SELECT * FROM t1 WHERE a='255.0.0.2'; +a +255.0.0.2 +SELECT * FROM t1 WHERE a='255.000.000.002'; +a +255.0.0.2 +SELECT * FROM t1 WHERE a=0x00000000; +a +0.0.0.0 +SELECT * FROM t1 WHERE a=0x00000001; +a +0.0.0.1 +SELECT * FROM t1 WHERE a=0xff000001; +a +255.0.0.1 +SELECT * FROM t1 WHERE a=0xff000002; +a +255.0.0.2 +SELECT * FROM t1 WHERE a<'0.0.0.0'; +a +SELECT * FROM t1 WHERE a<='0.0.0.0'; +a +0.0.0.0 +SELECT * FROM t1 WHERE a>='255.0.0.2'; +a +255.0.0.2 +SELECT * FROM t1 WHERE a>'255.0.0.2'; +a +SELECT * FROM t1 WHERE a IN ('0.0.0.0', '255.0.0.1') ORDER BY a; +a +0.0.0.0 +255.0.0.1 +SELECT * FROM t1 WHERE a IN ('0.0.0.0', 0xff000002) ORDER BY a; +a +0.0.0.0 +255.0.0.2 +SELECT * FROM t1 WHERE a<'garbage'; +a +Warnings: +Warning 1292 Incorrect inet4 value: 'garbage' +SELECT * FROM t1 WHERE a<='garbage'; +a +Warnings: +Warning 1292 Incorrect inet4 value: 'garbage' +SELECT * FROM t1 WHERE a='garbage'; +a +Warnings: +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +SELECT * FROM t1 WHERE a>='garbage'; +a +Warnings: +Warning 1292 Incorrect inet4 value: 'garbage' +SELECT * FROM t1 WHERE a>'garbage'; +a +Warnings: +Warning 1292 Incorrect inet4 value: 'garbage' +SELECT * FROM t1 WHERE a<0x01; +a +Warnings: +Warning 1292 Incorrect inet4 value: '\x01' +SELECT * FROM t1 WHERE a<=0x01; +a +Warnings: +Warning 1292 Incorrect inet4 value: '\x01' +SELECT * FROM t1 WHERE a=0x01; +a +Warnings: +Warning 1292 Incorrect inet4 value: '\x01' +Warning 1292 Incorrect inet4 value: '\x01' +SELECT * FROM t1 WHERE a>=0x01; +a +Warnings: +Warning 1292 Incorrect inet4 value: '\x01' +SELECT * FROM t1 WHERE a>0x01; +a +Warnings: +Warning 1292 Incorrect inet4 value: '\x01' +SELECT * FROM t1 WHERE a='0.0.0.00'; +a +0.0.0.0 +SELECT * FROM t1 WHERE a='0.0.0.000'; +a +0.0.0.0 +SELECT * FROM t1 WHERE a='0.0.00.000'; +a +0.0.0.0 +SELECT * FROM t1 WHERE a='0.0.0.01'; +a +0.0.0.1 +SELECT * FROM t1 WHERE a='0.0.0.001'; +a +0.0.0.1 +SELECT * FROM t1 WHERE a='0.0.00.001'; +a +0.0.0.1 +SELECT * FROM t1 WHERE a='0.0.0.0000'; +a +Warnings: +Warning 1292 Incorrect inet4 value: '0.0.0.0000' +Warning 1292 Incorrect inet4 value: '0.0.0.0000' +SELECT * FROM t1 WHERE a=0; +ERROR HY000: Illegal parameter data types inet4 and int for operation '=' +SELECT * FROM t1 WHERE a=0.0; +ERROR HY000: Illegal parameter data types inet4 and decimal for operation '=' +SELECT * FROM t1 WHERE a=0e0; +ERROR HY000: Illegal parameter data types inet4 and double for operation '=' +SELECT * FROM t1 WHERE a=TIME'10:20:30'; +ERROR HY000: Illegal parameter data types inet4 and time for operation '=' +SELECT * FROM t1 WHERE a IN ('0.0.0.0', 10); +ERROR HY000: Illegal parameter data types inet4 and int for operation 'in' +DROP TABLE t1; +# +# cmp_item_fbt: IN for non-constants +# +CREATE TABLE t1 (a INET4, b INET4); +INSERT INTO t1 VALUES ('0.0.0.1', '0.0.0.2'); +SELECT * FROM t1 WHERE '0.0.0.0' IN (a, b); +a b +SELECT * FROM t1 WHERE '0.0.0.1' IN (a, b); +a b +0.0.0.1 0.0.0.2 +SELECT * FROM t1 WHERE '0.0.0.1' IN (a, b); +a b +0.0.0.1 0.0.0.2 +SELECT * FROM t1 WHERE '0.0.0.01' IN (a, b); +a b +0.0.0.1 0.0.0.2 +SELECT * FROM t1 WHERE '0.0.0.001' IN (a, b); +a b +0.0.0.1 0.0.0.2 +SELECT * FROM t1 WHERE '0.0.0.0001' IN (a, b); +a b +Warnings: +Warning 1292 Incorrect inet4 value: '0.0.0.0001' +DROP TABLE t1; +# +# CASE abbreviations +# +CREATE TABLE t1 ( +c INET4, +c_char CHAR(32), +c_varchar VARCHAR(32), +c_tinytext TINYTEXT, +c_text TEXT, +c_mediumtext TEXT, +c_longtext LONGTEXT +); +CREATE TABLE t2 AS SELECT +COALESCE(c, c_char), +COALESCE(c, c_varchar), +COALESCE(c, c_tinytext), +COALESCE(c, c_text), +COALESCE(c, c_mediumtext), +COALESCE(c, c_longtext) +FROM t1; +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `COALESCE(c, c_char)` inet4 DEFAULT NULL, + `COALESCE(c, c_varchar)` inet4 DEFAULT NULL, + `COALESCE(c, c_tinytext)` inet4 DEFAULT NULL, + `COALESCE(c, c_text)` inet4 DEFAULT NULL, + `COALESCE(c, c_mediumtext)` inet4 DEFAULT NULL, + `COALESCE(c, c_longtext)` inet4 DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t2; +CREATE TABLE t2 AS SELECT +LEAST(c, c_char), +LEAST(c, c_varchar), +LEAST(c, c_tinytext), +LEAST(c, c_text), +LEAST(c, c_mediumtext), +LEAST(c, c_longtext) +FROM t1; +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `LEAST(c, c_char)` inet4 DEFAULT NULL, + `LEAST(c, c_varchar)` inet4 DEFAULT NULL, + `LEAST(c, c_tinytext)` inet4 DEFAULT NULL, + `LEAST(c, c_text)` inet4 DEFAULT NULL, + `LEAST(c, c_mediumtext)` inet4 DEFAULT NULL, + `LEAST(c, c_longtext)` inet4 DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t2; +DROP TABLE t1; +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES (NULL),('0.0.0.1'),('0.0.0.2'); +SELECT COALESCE(a, '0.0.0.0') FROM t1 ORDER BY a; +COALESCE(a, '0.0.0.0') +0.0.0.0 +0.0.0.1 +0.0.0.2 +SELECT a, LEAST(a,'0.0.0.0'), LEAST(a,'0.0.0.255') FROM t1 ORDER BY a; +a LEAST(a,'0.0.0.0') LEAST(a,'0.0.0.255') +NULL NULL NULL +0.0.0.1 0.0.0.0 0.0.0.1 +0.0.0.2 0.0.0.0 0.0.0.2 +SELECT a, GREATEST(a,'0.0.0.0'), GREATEST(a,'0.0.0.255') FROM t1 ORDER BY a; +a GREATEST(a,'0.0.0.0') GREATEST(a,'0.0.0.255') +NULL NULL NULL +0.0.0.1 0.0.0.1 0.0.0.255 +0.0.0.2 0.0.0.2 0.0.0.255 +CREATE TABLE t2 AS SELECT +COALESCE(a, '0.0.0.0'), +LEAST(a,'0.0.0.0'), +GREATEST(a,'0.0.0.0') +FROM t1; +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `COALESCE(a, '0.0.0.0')` inet4 DEFAULT NULL, + `LEAST(a,'0.0.0.0')` inet4 DEFAULT NULL, + `GREATEST(a,'0.0.0.0')` inet4 DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t2; +SELECT COALESCE(a, 0x00000000) FROM t1 ORDER BY a; +COALESCE(a, 0x00000000) +0.0.0.0 +0.0.0.1 +0.0.0.2 +SELECT a, +LEAST(a, 0x00000000), +LEAST(a, 0x0000000f) +FROM t1 ORDER BY a; +a LEAST(a, 0x00000000) LEAST(a, 0x0000000f) +NULL NULL NULL +0.0.0.1 0.0.0.0 0.0.0.1 +0.0.0.2 0.0.0.0 0.0.0.2 +SELECT a, +GREATEST(a, 0x00000000), +GREATEST(a, 0x0000000f) +FROM t1 ORDER BY a; +a GREATEST(a, 0x00000000) GREATEST(a, 0x0000000f) +NULL NULL NULL +0.0.0.1 0.0.0.1 0.0.0.15 +0.0.0.2 0.0.0.2 0.0.0.15 +CREATE TABLE t2 AS SELECT +COALESCE(a, 0x00000000), +LEAST(a,0x00000000), +GREATEST(a,0x00000000) +FROM t1; +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `COALESCE(a, 0x00000000)` inet4 DEFAULT NULL, + `LEAST(a,0x00000000)` inet4 DEFAULT NULL, + `GREATEST(a,0x00000000)` inet4 DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t2; +SELECT COALESCE(a, 10) FROM t1; +ERROR HY000: Illegal parameter data types inet4 and int for operation 'coalesce' +SELECT LEAST(a, 10) FROM t1; +ERROR HY000: Illegal parameter data types inet4 and int for operation 'least' +SELECT GREATEST(a, 10) FROM t1; +ERROR HY000: Illegal parameter data types inet4 and int for operation 'greatest' +DROP TABLE t1; +SELECT COALESCE('garbage', CAST('0.0.0.1' AS INET4)); +COALESCE('garbage', CAST('0.0.0.1' AS INET4)) +0.0.0.1 +Warnings: +Warning 1292 Incorrect inet4 value: 'garbage' +SELECT COALESCE(0x01, CAST('0.0.0.1' AS INET4)); +COALESCE(0x01, CAST('0.0.0.1' AS INET4)) +0.0.0.1 +Warnings: +Warning 1292 Incorrect inet4 value: '\x01' +# +# Uniqueness +# +CREATE TABLE t1 (a INET4 NOT NULL PRIMARY KEY); +INSERT INTO t1 VALUES ('65.0.0.1'),('97.0.0.1'); +INSERT INTO t1 VALUES ('97.0.0.1'); +ERROR 23000: Duplicate entry '97.0.0.1' for key 'PRIMARY' +SELECT * FROM t1; +a +65.0.0.1 +97.0.0.1 +DROP TABLE t1; +# +# Indexes +# +CREATE TABLE t1 (a INET4, KEY(a(1))); +ERROR HY000: Incorrect prefix key; the used key part isn't a string, the used length is longer than the key part, or the storage engine doesn't support unique prefix keys +# +# Explicit CAST on INSERT +# +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES (CAST('1.0.0.1' AS INET4)); +INSERT INTO t1 VALUES (CAST('1.0.0.2' AS INET4)); +INSERT INTO t1 VALUES (CAST('1.0.0.3' AS INET4)); +INSERT INTO t1 VALUES (CAST(CONCAT('2','0.0.0.1') AS INET4)); +INSERT INTO t1 VALUES (CAST(CONCAT('2','0.0.0.2') AS INET4)); +INSERT INTO t1 VALUES (CAST(CONCAT('2','0.0.0.3') AS INET4)); +SELECT * FROM t1 ORDER BY a; +a +1.0.0.1 +1.0.0.2 +1.0.0.3 +20.0.0.1 +20.0.0.2 +20.0.0.3 +DROP TABLE t1; +# +# Explicit CAST and implicit CAST on ALTER +# +CREATE TABLE t1 (a VARCHAR(64)); +INSERT INTO t1 VALUES ('garbage'),('0.0.0.0'),('0.0.0.1'),('255.0.0.1'),('255.0.0.2'); +SELECT a, CAST(a AS INET4) FROM t1 ORDER BY a; +a CAST(a AS INET4) +0.0.0.0 0.0.0.0 +0.0.0.1 0.0.0.1 +255.0.0.1 255.0.0.1 +255.0.0.2 255.0.0.2 +garbage NULL +Warnings: +Warning 1292 Incorrect inet4 value: 'garbage' +SELECT a, CAST(a AS INET4) FROM t1 ORDER BY CAST(a AS INET4); +a CAST(a AS INET4) +garbage NULL +0.0.0.0 0.0.0.0 +0.0.0.1 0.0.0.1 +255.0.0.1 255.0.0.1 +255.0.0.2 255.0.0.2 +Warnings: +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +ALTER TABLE t1 MODIFY a INET4; +ERROR 22007: Incorrect inet4 value: 'garbage' for column `test`.`t1`.`a` at row 1 +SET sql_mode=''; +ALTER TABLE t1 MODIFY a INET4; +Warnings: +Warning 1292 Incorrect inet4 value: 'garbage' for column `test`.`t1`.`a` at row 1 +SET sql_mode=DEFAULT; +SELECT * FROM t1 ORDER BY a; +a +NULL +0.0.0.0 +0.0.0.1 +255.0.0.1 +255.0.0.2 +DROP TABLE t1; +CREATE TABLE t1 (a BINARY(4)); +INSERT INTO t1 VALUES (0x00000000); +INSERT INTO t1 VALUES (0x00000001); +INSERT INTO t1 VALUES (0xff000001); +INSERT INTO t1 VALUES (0xff000002); +SELECT HEX(a), CAST(a AS INET4) FROM t1 ORDER BY a; +HEX(a) CAST(a AS INET4) +00000000 0.0.0.0 +00000001 0.0.0.1 +FF000001 255.0.0.1 +FF000002 255.0.0.2 +ALTER TABLE t1 MODIFY a INET4; +SELECT * FROM t1 ORDER BY a; +a +0.0.0.0 +0.0.0.1 +255.0.0.1 +255.0.0.2 +DROP TABLE t1; +# +# INSERT..SELECT, same data types +# +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('0.0.0.0'),('0.0.0.1'),('0.0.0.2'); +CREATE TABLE t2 (a INET4); +INSERT INTO t2 SELECT a FROM t1; +SELECT * FROM t2; +a +0.0.0.0 +0.0.0.1 +0.0.0.2 +DROP TABLE t1,t2; +# +# Implicit CAST on INSERT..SELECT, text format +# +CREATE TABLE t1 (a VARCHAR(64)); +INSERT INTO t1 VALUES ('garbage'),('0.0.0.0'),('0.0.0.1'),('255.0.0.1'),('255.0.0.2'); +CREATE TABLE t2 (a INET4); +INSERT INTO t2 SELECT a FROM t1; +ERROR 22007: Incorrect inet4 value: 'garbage' for column `test`.`t2`.`a` at row 1 +SET sql_mode=''; +INSERT INTO t2 SELECT a FROM t1; +Warnings: +Warning 1292 Incorrect inet4 value: 'garbage' for column `test`.`t2`.`a` at row 1 +SELECT * FROM t2 ORDER BY a; +a +NULL +0.0.0.0 +0.0.0.1 +255.0.0.1 +255.0.0.2 +SET sql_mode=DEFAULT; +DROP TABLE t2; +CREATE TABLE t2 (a INET4 NOT NULL); +INSERT INTO t2 SELECT a FROM t1; +ERROR 22007: Incorrect inet4 value: 'garbage' for column `test`.`t2`.`a` at row 1 +SET sql_mode=''; +INSERT INTO t2 SELECT a FROM t1; +Warnings: +Warning 1292 Incorrect inet4 value: 'garbage' for column `test`.`t2`.`a` at row 1 +SELECT * FROM t2 ORDER BY a; +a +0.0.0.0 +0.0.0.0 +0.0.0.1 +255.0.0.1 +255.0.0.2 +SET sql_mode=DEFAULT; +DROP TABLE t2; +DROP TABLE t1; +# +# Implicit CAST on INSERT..SELECT, binary format +# +CREATE TABLE t1 (a BINARY(4)); +INSERT INTO t1 VALUES (0x00000000); +INSERT INTO t1 VALUES (0x00000001); +INSERT INTO t1 VALUES (0xff000001); +INSERT INTO t1 VALUES (0xff000002); +CREATE TABLE t2 (a INET4); +INSERT INTO t2 SELECT a FROM t1; +SELECT a FROM t2 ORDER BY a; +a +0.0.0.0 +0.0.0.1 +255.0.0.1 +255.0.0.2 +DROP TABLE t1,t2; +# +# CAST to other data types +# +SELECT CAST(CAST('0.0.0.0' AS INET4) AS DOUBLE); +ERROR HY000: Illegal parameter data type inet4 for operation 'double_typecast' +SELECT CAST(CAST('0.0.0.0' AS INET4) AS FLOAT); +ERROR HY000: Illegal parameter data type inet4 for operation 'float_typecast' +SELECT CAST(CAST('0.0.0.0' AS INET4) AS DECIMAL); +ERROR HY000: Illegal parameter data type inet4 for operation 'decimal_typecast' +SELECT CAST(CAST('0.0.0.0' AS INET4) AS SIGNED); +ERROR HY000: Illegal parameter data type inet4 for operation 'cast_as_signed' +SELECT CAST(CAST('0.0.0.0' AS INET4) AS UNSIGNED); +ERROR HY000: Illegal parameter data type inet4 for operation 'cast_as_unsigned' +SELECT CAST(CAST('0.0.0.0' AS INET4) AS TIME); +ERROR HY000: Illegal parameter data type inet4 for operation 'cast_as_time' +SELECT CAST(CAST('0.0.0.0' AS INET4) AS DATE); +ERROR HY000: Illegal parameter data type inet4 for operation 'cast_as_date' +SELECT CAST(CAST('0.0.0.0' AS INET4) AS DATETIME); +ERROR HY000: Illegal parameter data type inet4 for operation 'cast_as_datetime' +SELECT CAST(CAST('0.0.0.0' AS INET4) AS CHAR); +CAST(CAST('0.0.0.0' AS INET4) AS CHAR) +0.0.0.0 +CREATE TABLE t1 AS SELECT CAST(CAST('0.0.0.0' AS INET4) AS CHAR) AS a; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` varchar(15) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t1; +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('255.0.0.255'); +CREATE TABLE t2 AS SELECT +CAST(a AS CHAR), +CAST(a AS CHAR(15)), +CAST(a AS CHAR(530)), +CAST(a AS CHAR(65535)), +CAST(a AS CHAR(66000)), +CAST(a AS CHAR(16777215)), +CAST(a AS CHAR(16777216)) +FROM t1; +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `CAST(a AS CHAR)` varchar(15) DEFAULT NULL, + `CAST(a AS CHAR(15))` varchar(15) DEFAULT NULL, + `CAST(a AS CHAR(530))` text DEFAULT NULL, + `CAST(a AS CHAR(65535))` text DEFAULT NULL, + `CAST(a AS CHAR(66000))` mediumtext DEFAULT NULL, + `CAST(a AS CHAR(16777215))` mediumtext DEFAULT NULL, + `CAST(a AS CHAR(16777216))` longtext DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +SELECT * FROM t2; +CAST(a AS CHAR) 255.0.0.255 +CAST(a AS CHAR(15)) 255.0.0.255 +CAST(a AS CHAR(530)) 255.0.0.255 +CAST(a AS CHAR(65535)) 255.0.0.255 +CAST(a AS CHAR(66000)) 255.0.0.255 +CAST(a AS CHAR(16777215)) 255.0.0.255 +CAST(a AS CHAR(16777216)) 255.0.0.255 +DROP TABLE t2; +DROP TABLE t1; +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('255.0.0.255'); +CREATE TABLE t2 AS SELECT +CAST(a AS BINARY(4)) AS cb4, +CAST(a AS BINARY) AS cb, +CAST(a AS BINARY(16)) AS cb16, +CAST(a AS BINARY(32)) AS cb32, +CAST(a AS BINARY(530)) AS cb530, +CAST(a AS BINARY(65535)) AS cb65535, +CAST(a AS BINARY(66000)) AS cb66000, +CAST(a AS BINARY(16777215)) AS cb16777215, +CAST(a AS BINARY(16777216)) AS cb16777216 +FROM t1 LIMIT 0; +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `cb4` binary(4) DEFAULT NULL, + `cb` binary(4) DEFAULT NULL, + `cb16` binary(16) DEFAULT NULL, + `cb32` binary(32) DEFAULT NULL, + `cb530` varbinary(530) DEFAULT NULL, + `cb65535` blob DEFAULT NULL, + `cb66000` mediumblob DEFAULT NULL, + `cb16777215` mediumblob DEFAULT NULL, + `cb16777216` longblob DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t2; +CREATE TABLE t2 AS SELECT +CAST(a AS BINARY(4)) AS cb4, +CAST(a AS BINARY) AS cb, +CAST(a AS BINARY(16)) AS cb16, +CAST(a AS BINARY(32)) AS cb32, +CAST(a AS BINARY(530)) AS cb530, +CAST(a AS BINARY(65535)) AS cb65535 +FROM t1; +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `cb4` binary(4) DEFAULT NULL, + `cb` binary(4) DEFAULT NULL, + `cb16` binary(16) DEFAULT NULL, + `cb32` binary(32) DEFAULT NULL, + `cb530` varbinary(530) DEFAULT NULL, + `cb65535` blob DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +SELECT +HEX(cb4), +HEX(cb), +HEX(cb16), +HEX(cb32), +LENGTH(cb530), +LENGTH(cb65535) +FROM t2; +HEX(cb4) FF0000FF +HEX(cb) FF0000FF +HEX(cb16) FF0000FF000000000000000000000000 +HEX(cb32) FF0000FF00000000000000000000000000000000000000000000000000000000 +LENGTH(cb530) 530 +LENGTH(cb65535) 65535 +DROP TABLE t2; +DROP TABLE t1; +# +# Implicit conversion to other types in INSERT +# +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (CAST('0.0.0.0' AS INET4)); +ERROR HY000: Cannot cast 'inet4' as 'int' in assignment of `test`.`t1`.`a` +DROP TABLE t1; +CREATE TABLE t1 (a DOUBLE); +INSERT INTO t1 VALUES (CAST('0.0.0.0' AS INET4)); +ERROR HY000: Cannot cast 'inet4' as 'double' in assignment of `test`.`t1`.`a` +DROP TABLE t1; +CREATE TABLE t1 (a DECIMAL(32,0)); +INSERT INTO t1 VALUES (CAST('0.0.0.0' AS INET4)); +ERROR HY000: Cannot cast 'inet4' as 'decimal' in assignment of `test`.`t1`.`a` +DROP TABLE t1; +CREATE TABLE t1 (a VARCHAR(64)); +INSERT INTO t1 VALUES (CAST('0.0.0.0' AS INET4)); +SELECT * FROM t1; +a +0.0.0.0 +DROP TABLE t1; +CREATE TABLE t1 (a TEXT); +INSERT INTO t1 VALUES (CAST('0.0.0.0' AS INET4)); +SELECT * FROM t1; +a +0.0.0.0 +DROP TABLE t1; +# +# Boolean context +# +SELECT +CAST('0.0.0.0' AS INET4) IS TRUE, +CAST('0.0.0.0' AS INET4) IS FALSE, +CAST('0.0.0.1' AS INET4) IS TRUE, +CAST('0.0.0.1' AS INET4) IS FALSE; +CAST('0.0.0.0' AS INET4) IS TRUE CAST('0.0.0.0' AS INET4) IS FALSE CAST('0.0.0.1' AS INET4) IS TRUE CAST('0.0.0.1' AS INET4) IS FALSE +0 1 1 0 +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('0.0.0.0'),('0.0.0.1'); +SELECT a, a IS TRUE, a IS FALSE FROM t1 ORDER BY a; +a a IS TRUE a IS FALSE +0.0.0.0 0 1 +0.0.0.1 1 0 +DROP TABLE t1; +# +# GROUP BY +# +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('0.0.0.0'),('0.0.0.0'); +INSERT INTO t1 VALUES ('0.0.0.1'),('0.0.0.01'),('0.0.0.001'); +INSERT INTO t1 VALUES ('0.0.0.2'),('0.0.0.2'),('0.0.0.2'),('0.0.0.2'); +SELECT a, COUNT(*) FROM t1 GROUP BY a; +a COUNT(*) +0.0.0.0 2 +0.0.0.1 3 +0.0.0.2 4 +DROP TABLE t1; +# +# Aggregate functions +# +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('0.0.0.0'),('0.0.0.0'); +INSERT INTO t1 VALUES ('0.0.0.1'),('0.0.0.01'),('0.0.0.001'); +INSERT INTO t1 VALUES ('0.0.0.2'),('0.0.0.2'),('0.0.0.2'),('0.0.0.2'); +SELECT MIN(a),MAX(a) FROM t1; +MIN(a) MAX(a) +0.0.0.0 0.0.0.2 +CREATE TABLE t2 AS SELECT MIN(a), MAX(a) FROM t1; +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `MIN(a)` inet4 DEFAULT NULL, + `MAX(a)` inet4 DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t2; +SELECT AVG(a) FROM t1; +ERROR HY000: Illegal parameter data type inet4 for operation 'avg(' +SELECT AVG(DISTINCT a) FROM t1; +ERROR HY000: Illegal parameter data type inet4 for operation 'avg(distinct ' +SELECT SUM(a) FROM t1; +ERROR HY000: Illegal parameter data type inet4 for operation 'sum(' +SELECT SUM(DISTINCT a) FROM t1; +ERROR HY000: Illegal parameter data type inet4 for operation 'sum(distinct ' +SELECT STDDEV(a) FROM t1; +ERROR HY000: Illegal parameter data type inet4 for operation 'std(' +SELECT GROUP_CONCAT(a ORDER BY a) FROM t1; +GROUP_CONCAT(a ORDER BY a) +0.0.0.0,0.0.0.0,0.0.0.1,0.0.0.1,0.0.0.1,0.0.0.2,0.0.0.2,0.0.0.2,0.0.0.2 +SELECT a, GROUP_CONCAT(a ORDER BY a) FROM t1 GROUP BY a; +a GROUP_CONCAT(a ORDER BY a) +0.0.0.0 0.0.0.0,0.0.0.0 +0.0.0.1 0.0.0.1,0.0.0.1,0.0.0.1 +0.0.0.2 0.0.0.2,0.0.0.2,0.0.0.2,0.0.0.2 +DROP TABLE t1; +# +# MDEV-21765 Possibly inconsistent behavior of BIT_xx functions with INET4 field +# +CREATE TABLE t1 (a INET4); +SELECT BIT_AND(a) FROM t1; +ERROR HY000: Illegal parameter data type inet4 for operation 'bit_and(' +SELECT BIT_OR(a) FROM t1; +ERROR HY000: Illegal parameter data type inet4 for operation 'bit_or(' +SELECT BIT_XOR(a) FROM t1; +ERROR HY000: Illegal parameter data type inet4 for operation 'bit_xor(' +DROP TABLE t1; +# +# Window functions +# +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('0.0.0.1'),('0.0.0.2'),('0.0.0.3'),('0.0.0.004'); +SELECT +a, +LAG(a) OVER (ORDER BY a), +LEAD(a) OVER (ORDER BY a) +FROM t1 ORDER BY a; +a LAG(a) OVER (ORDER BY a) LEAD(a) OVER (ORDER BY a) +0.0.0.1 NULL 0.0.0.2 +0.0.0.2 0.0.0.1 0.0.0.3 +0.0.0.3 0.0.0.2 0.0.0.4 +0.0.0.4 0.0.0.3 NULL +SELECT +a, +FIRST_VALUE(a) OVER (ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING), +LAST_VALUE(a) OVER (ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) +FROM t1 ORDER BY a; +a FIRST_VALUE(a) OVER (ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) LAST_VALUE(a) OVER (ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) +0.0.0.1 0.0.0.1 0.0.0.2 +0.0.0.2 0.0.0.1 0.0.0.3 +0.0.0.3 0.0.0.2 0.0.0.4 +0.0.0.4 0.0.0.3 0.0.0.4 +DROP TABLE t1; +# +# Prepared statements +# +EXECUTE IMMEDIATE 'CREATE TABLE t1 AS SELECT ? AS a' USING CAST('0.0.0.0' AS INET4); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` inet4 NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +EXECUTE IMMEDIATE 'INSERT INTO t1 VALUES (?)' USING '0.0.0.1'; +EXECUTE IMMEDIATE 'INSERT INTO t1 VALUES (?)' USING CAST('0.0.0.2' AS INET4); +EXECUTE IMMEDIATE 'INSERT INTO t1 VALUES (?)' USING 0x00000003; +EXECUTE IMMEDIATE 'INSERT INTO t1 VALUES (?)' USING CAST(0x00000004 AS INET4); +SELECT a FROM t1 ORDER BY a; +a +0.0.0.0 +0.0.0.1 +0.0.0.2 +0.0.0.3 +0.0.0.4 +EXECUTE IMMEDIATE 'SELECT * FROM t1 WHERE a=?' USING '0.0.0.1'; +a +0.0.0.1 +EXECUTE IMMEDIATE 'SELECT * FROM t1 WHERE a=?' USING CAST('0.0.0.2' AS INET4); +a +0.0.0.2 +EXECUTE IMMEDIATE 'SELECT * FROM t1 WHERE a=?' USING 0x00000003; +a +0.0.0.3 +EXECUTE IMMEDIATE 'SELECT * FROM t1 WHERE a=?' USING CAST(0x00000004 AS INET4); +a +0.0.0.4 +DROP TABLE t1; +# +# Character set and collation aggregation +# +CREATE TABLE t1 (a INET4); +CREATE TABLE t2 AS SELECT +CONCAT(a) AS c1, +CONCAT(CAST('0.0.0.0' AS INET4)) AS c2 +FROM t1; +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `c1` varchar(15) DEFAULT NULL, + `c2` varchar(15) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t2; +CREATE TABLE t2 AS SELECT +CONCAT(_utf8'1', a) AS c1, +CONCAT(_utf8'1', CAST('0.0.0.1' AS INET4)) AS c2, +CONCAT(_utf8'1', COALESCE(a)) AS c3 +FROM t1; +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `c1` varchar(16) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `c2` varchar(16) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `c3` varchar(16) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t2; +CREATE TABLE t2 AS SELECT +CONCAT(_latin1'1', a) AS c1, +CONCAT(_latin1'1', CAST('0.0.0.1' AS INET4)) AS c2, +CONCAT(_latin1'1', COALESCE(a)) AS c3 +FROM t1; +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `c1` varchar(16) DEFAULT NULL, + `c2` varchar(16) DEFAULT NULL, + `c3` varchar(16) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t2; +DROP TABLE t1; +# +# UNION +# +CREATE TABLE t1 AS SELECT CAST('0.0.0.0' AS INET4) AS c UNION SELECT CAST('0.0.0.1' AS INET4); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c` inet4 NOT NULL DEFAULT '0.0.0.0' +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t1; +CREATE TABLE t1 AS SELECT CAST('0.0.0.0' AS INET4) AS c UNION SELECT '0.0.0.1'; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c` inet4 NOT NULL DEFAULT '0.0.0.0' +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t1; +CREATE TABLE t1 AS SELECT '0.0.0.0' AS c UNION SELECT CAST('0.0.0.1' AS INET4); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c` inet4 NOT NULL DEFAULT '0.0.0.0' +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t1; +CREATE TABLE t1 AS SELECT CAST('0.0.0.0' AS INET4) AS c UNION SELECT 0x00000001; +SELECT * FROM t1; +c +0.0.0.0 +0.0.0.1 +DROP TABLE t1; +CREATE TABLE t1 AS SELECT CAST('0.0.0.0' AS INET4) AS c UNION SELECT 1; +ERROR HY000: Illegal parameter data types inet4 and int for operation 'UNION' +# +# Unary operators +# +SELECT -CAST('0.0.0.0' AS INET4); +ERROR HY000: Illegal parameter data type inet4 for operation '-' +SELECT ABS(CAST('0.0.0.0' AS INET4)); +ERROR HY000: Illegal parameter data type inet4 for operation 'abs' +SELECT ROUND(CAST('0.0.0.0' AS INET4)); +ERROR HY000: Illegal parameter data type inet4 for operation 'round' +SELECT CEILING(CAST('0.0.0.0' AS INET4)); +ERROR HY000: Illegal parameter data type inet4 for operation 'ceiling' +SELECT FLOOR(CAST('0.0.0.0' AS INET4)); +ERROR HY000: Illegal parameter data type inet4 for operation 'floor' +# +# Arithmetic operators +# +SELECT CAST('0.0.0.0' AS INET4) + 1; +ERROR HY000: Illegal parameter data types inet4 and int for operation '+' +SELECT CAST('0.0.0.0' AS INET4) - 1; +ERROR HY000: Illegal parameter data types inet4 and int for operation '-' +SELECT CAST('0.0.0.0' AS INET4) * 1; +ERROR HY000: Illegal parameter data types inet4 and int for operation '*' +SELECT CAST('0.0.0.0' AS INET4) / 1; +ERROR HY000: Illegal parameter data types inet4 and int for operation '/' +SELECT CAST('0.0.0.0' AS INET4) MOD 1; +ERROR HY000: Illegal parameter data types inet4 and int for operation 'MOD' +# +# Misc +# +SELECT RAND(CAST('0.0.0.0' AS INET4)); +ERROR HY000: Illegal parameter data type inet4 for operation 'rand' +SELECT FROM_UNIXTIME(CAST('0.0.0.0' AS INET4)); +ERROR HY000: Illegal parameter data type inet4 for operation 'from_unixtime' +SELECT HOUR(CAST('0.0.0.0' AS INET4)); +ERROR HY000: Illegal parameter data type inet4 for operation 'hour' +SELECT YEAR(CAST('0.0.0.0' AS INET4)); +ERROR HY000: Illegal parameter data type inet4 for operation 'year' +SELECT RELEASE_LOCK(CAST('0.0.0.0' AS INET4)); +ERROR HY000: Illegal parameter data type inet4 for operation 'release_lock' +# +# Virtual columns +# +CREATE TABLE t1 ( +a INT, +b INET4 GENERATED ALWAYS AS (CAST(CONCAT(RAND(),a) AS INET4)), INDEX(b) +); +ERROR HY000: Function or expression 'rand()' cannot be used in the GENERATED ALWAYS AS clause of `b` +CREATE TABLE t1 ( +a INT, +b INET4 GENERATED ALWAYS AS (CAST(CONCAT('0.0.0.',a) AS INET4)), INDEX(b) +); +INSERT INTO t1 (a) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15); +SELECT * FROM t1; +a b +0 0.0.0.0 +1 0.0.0.1 +2 0.0.0.2 +3 0.0.0.3 +4 0.0.0.4 +5 0.0.0.5 +6 0.0.0.6 +7 0.0.0.7 +8 0.0.0.8 +9 0.0.0.9 +10 0.0.0.10 +11 0.0.0.11 +12 0.0.0.12 +13 0.0.0.13 +14 0.0.0.14 +15 0.0.0.15 +DROP TABLE t1; +# +# VIEW +# +CREATE TABLE t1 (a INT DEFAULT 0); +INSERT INTO t1 (a) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15); +SELECT * FROM t1 ORDER BY a; +a +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +CREATE VIEW v1 AS SELECT (CAST(CONCAT('0.0.0.',a) AS INET4)) AS c FROM t1; +SELECT * FROM v1 ORDER BY c; +c +0.0.0.0 +0.0.0.1 +0.0.0.2 +0.0.0.3 +0.0.0.4 +0.0.0.5 +0.0.0.6 +0.0.0.7 +0.0.0.8 +0.0.0.9 +0.0.0.10 +0.0.0.11 +0.0.0.12 +0.0.0.13 +0.0.0.14 +0.0.0.15 +DROP VIEW v1; +DROP TABLE t1; +CREATE TABLE t1 (a INET4 DEFAULT '0.0.0.0'); +CREATE VIEW v1 AS SELECT * FROM t1; +SHOW CREATE VIEW v1; +View Create View character_set_client collation_connection +v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `t1`.`a` AS `a` from `t1` latin1 latin1_swedish_ci +DESCRIBE v1; +Field Type Null Key Default Extra +a inet4 YES 0.0.0.0 +INSERT INTO v1 VALUES ('0.0.0.0'),('0.0.0.1'),('0.0.0.2'); +SELECT * FROM t1; +a +0.0.0.0 +0.0.0.1 +0.0.0.2 +DROP VIEW v1; +DROP TABLE t1; +CREATE TABLE t1 (a INET4 DEFAULT CAST('0.0.0.0' AS INET4)); +CREATE VIEW v1 AS SELECT * FROM t1; +SHOW CREATE VIEW v1; +View Create View character_set_client collation_connection +v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `t1`.`a` AS `a` from `t1` latin1 latin1_swedish_ci +DESCRIBE v1; +Field Type Null Key Default Extra +a inet4 YES cast('0.0.0.0' as inet4) +INSERT INTO v1 VALUES ('0.0.0.0'),('0.0.0.1'),('0.0.0.2'); +SELECT * FROM t1; +a +0.0.0.0 +0.0.0.1 +0.0.0.2 +DROP VIEW v1; +DROP TABLE t1; +# +# Subqueries +# +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('0.0.0.0'),('0.0.0.1'),('0.0.0.2'); +SELECT * FROM t1 WHERE a=(SELECT MIN(a) FROM t1) ORDER BY a; +a +0.0.0.0 +SELECT * FROM t1 WHERE a=(SELECT MAX(a) FROM t1) ORDER BY a; +a +0.0.0.2 +SELECT * FROM t1 WHERE a IN (SELECT a FROM t1 WHERE a>'0.0.0.0') ORDER BY a; +a +0.0.0.1 +0.0.0.2 +DROP TABLE t1; +# +# Stored routines +# +CREATE PROCEDURE p1(a INET4) +BEGIN +DECLARE b INET4 DEFAULT CONCAT('1', a); +SELECT a, b; +END; +$$ +CALL p1('0.0.0.1'); +a b +0.0.0.1 10.0.0.1 +CALL p1(CAST('0.0.0.2' AS INET4)); +a b +0.0.0.2 10.0.0.2 +DROP PROCEDURE p1; +CREATE FUNCTION f1(a INET4) RETURNS INET4 +BEGIN +RETURN CONCAT('1',a); +END; +$$ +SELECT f1('0.0.0.1'); +f1('0.0.0.1') +10.0.0.1 +SELECT f1(CAST('0.0.0.1' AS INET4)); +f1(CAST('0.0.0.1' AS INET4)) +10.0.0.1 +DROP FUNCTION f1; +# +# Anchored data types in SP variables +# +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('0.0.0.1'); +CREATE PROCEDURE p1() +BEGIN +DECLARE va TYPE OF t1.a; +SELECT MAX(a) INTO va FROM t1; +SELECT va; +END; +$$ +CALL p1; +va +0.0.0.1 +DROP PROCEDURE p1; +DROP TABLE t1; +CREATE TABLE t1 (a INET4, b INET4); +INSERT INTO t1 VALUES ('0.0.0.12', '0.0.0.111'); +CREATE PROCEDURE p1() +BEGIN +DECLARE va ROW TYPE OF t1; +SELECT MAX(a), MAX(b) INTO va FROM t1; +SELECT va.a, va.b; +END; +$$ +CALL p1; +va.a va.b +0.0.0.12 0.0.0.111 +DROP PROCEDURE p1; +DROP TABLE t1; +# +# Optimizer: make_const_item_for_comparison +# +CREATE TABLE t1 (id INT, a INET4); +INSERT INTO t1 VALUES (1,'0.0.0.1'),(2,'0.0.0.2'); +EXPLAIN EXTENDED SELECT * FROM t1 WHERE a=COALESCE(CAST('0.0.0.1' AS INET4)) AND id>0; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 2 100.00 Using where +Warnings: +Note 1003 select `test`.`t1`.`id` AS `id`,`test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` = INET4'0.0.0.1' and `test`.`t1`.`id` > 0 +DROP TABLE t1; +# +# Optimizer: equal field propagation +# +CREATE TABLE t1 (id INT, a INET4); +INSERT INTO t1 VALUES (1,'0.0.0.1'),(2,'0.0.0.2'); +EXPLAIN EXTENDED SELECT * FROM t1 +WHERE a=COALESCE(CAST('0.0.0.1' AS INET4)) +AND LENGTH(CONCAT(a,RAND()))>1; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 2 100.00 Using where +Warnings: +Note 1003 select `test`.`t1`.`id` AS `id`,`test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` = INET4'0.0.0.1' and octet_length(concat(INET4'0.0.0.1',rand())) > 1 +EXPLAIN EXTENDED SELECT * FROM t1 +WHERE a=COALESCE(CAST('0.0.0.1' AS INET4)) +AND LENGTH(a)>1; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 2 100.00 Using where +Warnings: +Note 1003 select `test`.`t1`.`id` AS `id`,`test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` = INET4'0.0.0.1' +DROP TABLE t1; +# +# Optimizer: equal expression propagation +# +CREATE TABLE t1 (id INT, a INET4); +INSERT INTO t1 VALUES (1,'0.0.0.1'),(2,'0.0.0.2'); +EXPLAIN EXTENDED SELECT * FROM t1 +WHERE COALESCE(a)='0.0.0.1' AND COALESCE(a)=CONCAT(a); +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 2 100.00 Using where +Warnings: +Note 1003 select `test`.`t1`.`id` AS `id`,`test`.`t1`.`a` AS `a` from `test`.`t1` where coalesce(`test`.`t1`.`a`) = '0.0.0.1' and concat(`test`.`t1`.`a`) = '0.0.0.1' +DROP TABLE t1; +# +# Subquery materialization +# +CREATE TABLE t1 (a INET4, b VARCHAR(32), KEY (a), KEY(b)) ; +INSERT INTO t1 VALUES ('0.0.0.10','0.0.0.11'),('0.0.0.10','0.0.0.11'); +SET @@optimizer_switch='semijoin=off,materialization=on,in_to_exists=off,subquery_cache=off'; +EXPLAIN SELECT * FROM t1 WHERE a IN (SELECT a AS a_inner FROM t1 GROUP BY a_inner); +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 2 Using where +2 MATERIALIZED t1 index NULL a 5 NULL 2 Using index +EXPLAIN SELECT * FROM t1 WHERE b IN (SELECT a AS a_inner FROM t1 GROUP BY a_inner); +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 2 Using where +2 DEPENDENT SUBQUERY t1 index_subquery a a 5 func 2 Using index; Using where +SET @@optimizer_switch=DEFAULT; +DROP TABLE t1; +# +# ALTER from INET4 to INET4 +# +CREATE TABLE t1 (a INET4, b INT); +INSERT INTO t1 VALUES ('10.11.12.13', 1); +ALTER TABLE t1 MODIFY b DECIMAL(10,2); +SELECT * FROM t1; +a b +10.11.12.13 1.00 +DROP TABLE t1; +# +# ALTER to character string data types +# +CREATE OR REPLACE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('10.11.12.13'); +SELECT CAST(a AS CHAR(15)) FROM t1; +CAST(a AS CHAR(15)) +10.11.12.13 +ALTER TABLE t1 MODIFY a CHAR(15); +SELECT * FROM t1; +a +10.11.12.13 +DROP TABLE t1; +CREATE OR REPLACE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('10.11.12.13'); +ALTER TABLE t1 MODIFY a VARCHAR(15); +SELECT * FROM t1; +a +10.11.12.13 +DROP TABLE t1; +CREATE OR REPLACE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('10.11.12.13'); +ALTER TABLE t1 MODIFY a TINYTEXT; +SELECT * FROM t1; +a +10.11.12.13 +DROP TABLE t1; +CREATE OR REPLACE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('10.11.12.13'); +ALTER TABLE t1 MODIFY a TEXT; +SELECT * FROM t1; +a +10.11.12.13 +DROP TABLE t1; +CREATE OR REPLACE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('10.11.12.13'); +ALTER TABLE t1 MODIFY a MEDIUMTEXT; +SELECT * FROM t1; +a +10.11.12.13 +DROP TABLE t1; +CREATE OR REPLACE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('10.11.12.13'); +ALTER TABLE t1 MODIFY a LONGTEXT; +SELECT * FROM t1; +a +10.11.12.13 +DROP TABLE t1; +# +# ALTER from character string data types +# +CREATE OR REPLACE TABLE t1 (a CHAR(64)); +INSERT INTO t1 VALUES ('10.11.12.13'); +SELECT CAST(a AS INET4) FROM t1; +CAST(a AS INET4) +10.11.12.13 +ALTER TABLE t1 MODIFY a INET4; +SELECT * FROM t1; +a +10.11.12.13 +DROP TABLE t1; +CREATE OR REPLACE TABLE t1 (a VARCHAR(64)); +INSERT INTO t1 VALUES ('10.11.12.13'); +SELECT CAST(a AS INET4) FROM t1; +CAST(a AS INET4) +10.11.12.13 +ALTER TABLE t1 MODIFY a INET4; +SELECT * FROM t1; +a +10.11.12.13 +DROP TABLE t1; +CREATE OR REPLACE TABLE t1 (a TINYTEXT); +INSERT INTO t1 VALUES ('10.11.12.13'); +SELECT CAST(a AS INET4) FROM t1; +CAST(a AS INET4) +10.11.12.13 +ALTER TABLE t1 MODIFY a INET4; +SELECT * FROM t1; +a +10.11.12.13 +DROP TABLE t1; +CREATE OR REPLACE TABLE t1 (a TEXT); +INSERT INTO t1 VALUES ('10.11.12.13'); +SELECT CAST(a AS INET4) FROM t1; +CAST(a AS INET4) +10.11.12.13 +ALTER TABLE t1 MODIFY a INET4; +SELECT * FROM t1; +a +10.11.12.13 +DROP TABLE t1; +CREATE OR REPLACE TABLE t1 (a MEDIUMTEXT); +INSERT INTO t1 VALUES ('10.11.12.13'); +SELECT CAST(a AS INET4) FROM t1; +CAST(a AS INET4) +10.11.12.13 +ALTER TABLE t1 MODIFY a INET4; +SELECT * FROM t1; +a +10.11.12.13 +DROP TABLE t1; +CREATE OR REPLACE TABLE t1 (a LONGTEXT); +INSERT INTO t1 VALUES ('10.11.12.13'); +SELECT CAST(a AS INET4) FROM t1; +CAST(a AS INET4) +10.11.12.13 +ALTER TABLE t1 MODIFY a INET4; +SELECT * FROM t1; +a +10.11.12.13 +DROP TABLE t1; +# +# ALTER to binary string data types +# +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('10.11.12.13'); +ALTER TABLE t1 MODIFY a BINARY(4); +SELECT HEX(a) FROM t1; +HEX(a) +0A0B0C0D +DROP TABLE t1; +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('10.11.12.13'); +ALTER TABLE t1 MODIFY a BINARY(5); +SELECT HEX(a) FROM t1; +HEX(a) +0A0B0C0D00 +DROP TABLE t1; +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('10.11.12.13'); +ALTER TABLE t1 MODIFY a BINARY(3); +ERROR 22001: Data too long for column 'a' at row 1 +DROP TABLE t1; +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('10.11.12.13'); +ALTER TABLE t1 MODIFY a TINYBLOB; +SELECT HEX(a) FROM t1; +HEX(a) +0A0B0C0D +DROP TABLE t1; +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('10.11.12.13'); +ALTER TABLE t1 MODIFY a BLOB; +SELECT HEX(a) FROM t1; +HEX(a) +0A0B0C0D +DROP TABLE t1; +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('10.11.12.13'); +ALTER TABLE t1 MODIFY a MEDIUMBLOB; +SELECT HEX(a) FROM t1; +HEX(a) +0A0B0C0D +DROP TABLE t1; +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('10.11.12.13'); +ALTER TABLE t1 MODIFY a LONGBLOB; +SELECT HEX(a) FROM t1; +HEX(a) +0A0B0C0D +DROP TABLE t1; +# +# ALTER from binary string data types +# +CREATE TABLE t1 (a BINARY(4)); +INSERT INTO t1 VALUES (X'11121314'); +ALTER TABLE t1 MODIFY a INET4; +SELECT a FROM t1; +a +17.18.19.20 +DROP TABLE t1; +CREATE TABLE t1 (a BINARY(17)); +INSERT INTO t1 VALUES (X'1112131400'); +ALTER TABLE t1 MODIFY a INET4; +ERROR 22007: Incorrect inet4 value: '\x11\x12\x13\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' for column `test`.`t1`.`a` at row 1 +DROP TABLE t1; +CREATE TABLE t1 (a BINARY(3)); +INSERT INTO t1 VALUES (X'111213'); +ALTER TABLE t1 MODIFY a INET4; +ERROR 22007: Incorrect inet4 value: '\x11\x12\x13' for column `test`.`t1`.`a` at row 1 +DROP TABLE t1; +CREATE TABLE t1 (a TINYBLOB); +INSERT INTO t1 VALUES (X'11121314'); +ALTER TABLE t1 MODIFY a INET4; +SELECT a FROM t1; +a +17.18.19.20 +DROP TABLE t1; +CREATE TABLE t1 (a BLOB); +INSERT INTO t1 VALUES (X'11121314'); +ALTER TABLE t1 MODIFY a INET4; +SELECT a FROM t1; +a +17.18.19.20 +DROP TABLE t1; +CREATE TABLE t1 (a MEDIUMBLOB); +INSERT INTO t1 VALUES (X'11121314'); +ALTER TABLE t1 MODIFY a INET4; +SELECT a FROM t1; +a +17.18.19.20 +DROP TABLE t1; +CREATE TABLE t1 (a BLOB); +INSERT INTO t1 VALUES (X'11121314'); +ALTER TABLE t1 MODIFY a INET4; +SELECT a FROM t1; +a +17.18.19.20 +DROP TABLE t1; +# +# SET from INET4 to INET4 +# +CREATE TABLE t1 (a INET4, b INET4); +INSERT INTO t1 VALUES ('255.0.0.255', NULL); +UPDATE t1 SET b=a; +SELECT b FROM t1; +b +255.0.0.255 +DROP TABLE t1; +# +# SET from INET4 to character string +# +CREATE TABLE t1 (a INET4, b CHAR(15)); +INSERT INTO t1 VALUES ('255.0.0.255', NULL); +UPDATE t1 SET b=a; +SELECT b FROM t1; +b +255.0.0.255 +DROP TABLE t1; +CREATE TABLE t1 (a INET4, b VARCHAR(15)); +INSERT INTO t1 VALUES ('255.0.0.255', NULL); +UPDATE t1 SET b=a; +SELECT b FROM t1; +b +255.0.0.255 +DROP TABLE t1; +CREATE TABLE t1 (a INET4, b TEXT); +INSERT INTO t1 VALUES ('255.0.0.255', NULL); +UPDATE t1 SET b=a; +SELECT b FROM t1; +b +255.0.0.255 +DROP TABLE t1; +CREATE TABLE t1 (a INET4, b ENUM('255.0.0.255')); +INSERT INTO t1 VALUES ('255.0.0.255', NULL); +UPDATE t1 SET b=a; +SELECT b FROM t1; +b +255.0.0.255 +DROP TABLE t1; +CREATE TABLE t1 (a INET4, b SET('255.0.0.255')); +INSERT INTO t1 VALUES ('255.0.0.255', NULL); +UPDATE t1 SET b=a; +SELECT b FROM t1; +b +255.0.0.255 +DROP TABLE t1; +# +# SET from character string to INET4 +# +CREATE TABLE t1 (a CHAR(15), b INET4); +INSERT INTO t1 VALUES ('255.0.0.255', NULL); +UPDATE t1 SET b=a; +SELECT b FROM t1; +b +255.0.0.255 +DROP TABLE t1; +CREATE TABLE t1 (a VARCHAR(15), b INET4); +INSERT INTO t1 VALUES ('255.0.0.255', NULL); +UPDATE t1 SET b=a; +SELECT b FROM t1; +b +255.0.0.255 +DROP TABLE t1; +CREATE TABLE t1 (a TEXT, b INET4); +INSERT INTO t1 VALUES ('255.0.0.255', NULL); +UPDATE t1 SET b=a; +SELECT b FROM t1; +b +255.0.0.255 +DROP TABLE t1; +CREATE TABLE t1 (a ENUM('255.0.0.255'), b INET4); +INSERT INTO t1 VALUES ('255.0.0.255', NULL); +UPDATE t1 SET b=a; +SELECT b FROM t1; +b +255.0.0.255 +DROP TABLE t1; +CREATE TABLE t1 (a SET('255.0.0.255'), b INET4); +INSERT INTO t1 VALUES ('255.0.0.255', NULL); +UPDATE t1 SET b=a; +SELECT b FROM t1; +b +255.0.0.255 +DROP TABLE t1; +# +# SET from INET4 to binary +# +CREATE TABLE t1 (a INET4, b BINARY(4)); +INSERT INTO t1 VALUES ('255.0.0.255', NULL); +UPDATE t1 SET b=a; +SELECT HEX(b) FROM t1; +HEX(b) +FF0000FF +DROP TABLE t1; +CREATE TABLE t1 (a INET4, b VARBINARY(4)); +INSERT INTO t1 VALUES ('255.0.0.255', NULL); +UPDATE t1 SET b=a; +SELECT HEX(b) FROM t1; +HEX(b) +FF0000FF +DROP TABLE t1; +CREATE TABLE t1 (a INET4, b BLOB); +INSERT INTO t1 VALUES ('255.0.0.255', NULL); +UPDATE t1 SET b=a; +SELECT HEX(b) FROM t1; +HEX(b) +FF0000FF +DROP TABLE t1; +# +# SET from binary to INET4 +# +CREATE TABLE t1 (a BINARY(4), b INET4); +INSERT INTO t1 VALUES (CONCAT(0xFF,REPEAT(0x00,2),0xFF), NULL); +UPDATE t1 SET b=a; +SELECT b FROM t1; +b +255.0.0.255 +DROP TABLE t1; +CREATE TABLE t1 (a VARBINARY(4), b INET4); +INSERT INTO t1 VALUES (CONCAT(0xFF,REPEAT(0x00,2),0xFF), NULL); +UPDATE t1 SET b=a; +SELECT b FROM t1; +b +255.0.0.255 +DROP TABLE t1; +CREATE TABLE t1 (a BLOB, b INET4); +INSERT INTO t1 VALUES (CONCAT(0xFF,REPEAT(0x00,2),0xFF), NULL); +UPDATE t1 SET b=a; +SELECT b FROM t1; +b +255.0.0.255 +DROP TABLE t1; +# +# MDEV-20785 Converting INET6 to CHAR(39) produces garbage without a warning +# +CREATE OR REPLACE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('10.11.12.13'); +SELECT CAST(a AS CHAR(15)) FROM t1; +CAST(a AS CHAR(15)) +10.11.12.13 +ALTER TABLE t1 MODIFY a CHAR(15); +SELECT * FROM t1; +a +10.11.12.13 +DROP TABLE t1; +# +# MDEV-20783 INET6 cannot be converted to BINARY(16) (requires clarification in documentation) +# +CREATE OR REPLACE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('10.11.12.13'); +ALTER TABLE t1 MODIFY a BINARY(4); +SELECT HEX(a) FROM t1; +HEX(a) +0A0B0C0D +DROP TABLE t1; +# +# MDEV-20795 CAST(inet6 AS BINARY) returns wrong result +# +CREATE OR REPLACE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('10.11.12.13'); +SELECT HEX(CAST(a AS BINARY)) FROM t1; +HEX(CAST(a AS BINARY)) +0A0B0C0D +SELECT HEX(CAST(a AS BINARY(4))) FROM t1; +HEX(CAST(a AS BINARY(4))) +0A0B0C0D +DROP TABLE t1; +# +# MDEV-20808 CAST from INET6 to FLOAT does not produce an error +# +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('0.0.0.0'); +SELECT CAST(a AS FLOAT) FROM t1; +ERROR HY000: Illegal parameter data type inet4 for operation 'float_typecast' +DROP TABLE t1; +# +# MDEV-20798 Conversion from INET6 to other types performed without errors or warnings +# +CREATE TABLE t1 (a INET4, b INT); +INSERT INTO t1 (a) VALUES ('0.0.0.0'); +UPDATE t1 SET b=a; +ERROR HY000: Cannot cast 'inet4' as 'int' in assignment of `test`.`t1`.`b` +SELECT * FROM t1; +a b +0.0.0.0 NULL +DROP TABLE t1; +SET timestamp=UNIX_TIMESTAMP('2001-01-01 10:20:30'); +CREATE TABLE t1 (a INET4, b TIMESTAMP); +INSERT INTO t1 (a) VALUES ('0.0.0.0'); +UPDATE t1 SET b=a; +ERROR HY000: Cannot cast 'inet4' as 'timestamp' in assignment of `test`.`t1`.`b` +SELECT * FROM t1; +a b +0.0.0.0 NULL +DROP TABLE t1; +SET timestamp=DEFAULT; +CREATE OR REPLACE TABLE t1 (a INET4); +INSERT INTO t1 (a) VALUES ('0.0.0.0'); +ALTER TABLE t1 MODIFY a DATE; +ERROR HY000: Cannot cast 'inet4' as 'date' in assignment of `test`.`t1`.`a` +DROP TABLE t1; +# +# MDEV-20818 ER_CRASHED_ON_USAGE or Assertion `length <= column->length' failed in write_block_record on temporary table +# +CREATE TABLE t1 (a INET4); +SELECT +CAST(a AS BINARY(0)), +CAST(a AS BINARY(1)), +CAST(a AS BINARY(16)), +CAST(a AS BINARY(255)), +CAST(a AS BINARY(256)), +CAST(a AS BINARY(512)), +CAST(a AS BINARY(513)), +CAST(a AS BINARY(65532)), +CAST(a AS BINARY(65533)), +CAST(a AS BINARY(65534)), +CAST(a AS BINARY(65535)), +CAST(a AS BINARY(65536)), +CAST(a AS BINARY(16777215)), +CAST(a AS BINARY(16777216)) +FROM t1; +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def CAST(a AS BINARY(0)) 254 0 0 Y 128 0 63 +def CAST(a AS BINARY(1)) 254 1 0 Y 128 0 63 +def CAST(a AS BINARY(16)) 254 16 0 Y 128 0 63 +def CAST(a AS BINARY(255)) 254 255 0 Y 128 0 63 +def CAST(a AS BINARY(256)) 253 256 0 Y 128 0 63 +def CAST(a AS BINARY(512)) 253 512 0 Y 128 0 63 +def CAST(a AS BINARY(513)) 253 513 0 Y 128 0 63 +def CAST(a AS BINARY(65532)) 253 65532 0 Y 128 0 63 +def CAST(a AS BINARY(65533)) 252 65533 0 Y 128 0 63 +def CAST(a AS BINARY(65534)) 252 65534 0 Y 128 0 63 +def CAST(a AS BINARY(65535)) 252 65535 0 Y 128 0 63 +def CAST(a AS BINARY(65536)) 250 65536 0 Y 128 0 63 +def CAST(a AS BINARY(16777215)) 250 16777215 0 Y 128 0 63 +def CAST(a AS BINARY(16777216)) 251 16777216 0 Y 128 0 63 +CAST(a AS BINARY(0)) CAST(a AS BINARY(1)) CAST(a AS BINARY(16)) CAST(a AS BINARY(255)) CAST(a AS BINARY(256)) CAST(a AS BINARY(512)) CAST(a AS BINARY(513)) CAST(a AS BINARY(65532)) CAST(a AS BINARY(65533)) CAST(a AS BINARY(65534)) CAST(a AS BINARY(65535)) CAST(a AS BINARY(65536)) CAST(a AS BINARY(16777215)) CAST(a AS BINARY(16777216)) +DROP TABLE t1; +# +# MDEV-20826 Wrong result of MIN(inet6) with GROUP BY +# +CREATE TABLE t1 (id INT, a INET4) ENGINE=MyISAM; +INSERT INTO t1 VALUES (1, '255.0.0.0'),(1, '128.0.0.0'); +SELECT MIN(a), MAX(a) FROM t1 GROUP BY id; +MIN(a) MAX(a) +128.0.0.0 255.0.0.0 +DROP TABLE t1; +# +# MDEV-20809 EXTRACT from INET4 value does not produce any warnings +# +CREATE TABLE t1 (a INET4); +SELECT EXTRACT(DAY FROM a) FROM t1; +ERROR HY000: Illegal parameter data type inet4 for operation 'extract(day)' +DROP TABLE t1; +SELECT EXTRACT(DAY FROM CAST('0.0.0.0' AS INET4)); +ERROR HY000: Illegal parameter data type inet4 for operation 'extract(day)' +# +# MDEV-22764 Crash with a stored aggregate function returning INET4 +# +CREATE OR REPLACE AGGREGATE FUNCTION aggregate_min_inet4(x INET4) RETURNS INET4 +BEGIN +DECLARE res INET4 DEFAULT NULL; +DECLARE CONTINUE HANDLER FOR NOT FOUND +RETURN res; +LOOP +FETCH GROUP NEXT ROW; +IF (res IS NULL) OR (res > x) THEN +SET res= x; +END IF; +END LOOP; +END; +$$ +CREATE OR REPLACE TABLE t1 (name CHAR(30), val INET4); +INSERT INTO t1 VALUES ('a', '0.0.0.5'); +INSERT INTO t1 VALUES ('a', '0.0.0.3'); +INSERT INTO t1 VALUES ('b', '0.0.0.1'); +INSERT INTO t1 VALUES ('b', '0.0.0.2'); +INSERT INTO t1 VALUES ('b', '0.0.0.5'); +SELECT name, aggregate_min_inet4(val) pc FROM t1 GROUP BY name; +name pc +a 0.0.0.3 +b 0.0.0.1 +CREATE OR REPLACE TABLE t2 (name CHAR(30), val INET4); +INSERT INTO t2 SELECT name, aggregate_min_inet4(val) pc FROM t1 GROUP BY name; +SELECT * FROM t2; +name val +a 0.0.0.3 +b 0.0.0.1 +DROP TABLE t2; +DROP TABLE t1; +DROP FUNCTION aggregate_min_inet4; +# +# MDEV-20280 PERCENTILE_DISC() rejects temporal and string input +# +CREATE TABLE t1 (name CHAR(30), star_rating INET4); +INSERT INTO t1 VALUES ('Lord of the Ladybirds', '0.0.0.5'); +INSERT INTO t1 VALUES ('Lord of the Ladybirds', '0.0.0.3'); +INSERT INTO t1 VALUES ('Lady of the Flies', '0.0.0.1'); +INSERT INTO t1 VALUES ('Lady of the Flies', '0.0.0.2'); +INSERT INTO t1 VALUES ('Lady of the Flies', '0.0.0.5'); +SELECT name, PERCENTILE_DISC(0.5) +WITHIN GROUP (ORDER BY star_rating) +OVER (PARTITION BY name) AS pc FROM t1; +name pc +Lady of the Flies 0.0.0.2 +Lady of the Flies 0.0.0.2 +Lady of the Flies 0.0.0.2 +Lord of the Ladybirds 0.0.0.3 +Lord of the Ladybirds 0.0.0.3 +SELECT name, PERCENTILE_DISC(0) +WITHIN GROUP (ORDER BY star_rating) +OVER (PARTITION BY name) AS pc FROM t1; +name pc +Lady of the Flies 0.0.0.1 +Lady of the Flies 0.0.0.1 +Lady of the Flies 0.0.0.1 +Lord of the Ladybirds 0.0.0.3 +Lord of the Ladybirds 0.0.0.3 +SELECT name, PERCENTILE_DISC(1) +WITHIN GROUP (ORDER BY star_rating) +OVER (PARTITION BY name) AS pc FROM t1; +name pc +Lady of the Flies 0.0.0.5 +Lady of the Flies 0.0.0.5 +Lady of the Flies 0.0.0.5 +Lord of the Ladybirds 0.0.0.5 +Lord of the Ladybirds 0.0.0.5 +DROP TABLE t1; +# +# MDEV-22758 Assertion `!item->null_value' failed in Type_handler_inet6::make_sort_key_part +# +CREATE TABLE t1 (a VARCHAR(8) NOT NULL, b INET4 NOT NULL); +INSERT INTO t1 VALUES ('foo','0.0.0.0'),('bar','1.0.0.1'); +SELECT * FROM t1 ORDER BY CASE WHEN a THEN b ELSE a END; +a b +foo 0.0.0.0 +bar 1.0.0.1 +Warnings: +Warning 1292 Truncated incorrect DOUBLE value: 'foo' +Warning 1292 Incorrect inet4 value: 'foo' +Warning 1292 Truncated incorrect DOUBLE value: 'bar' +Warning 1292 Incorrect inet4 value: 'bar' +DROP TABLE t1; +CREATE OR REPLACE TABLE t1 (a VARCHAR(8) NOT NULL); +INSERT INTO t1 VALUES ('foo'),('bar'); +SELECT * FROM t1 ORDER BY CAST(a AS INET4); +a +foo +bar +Warnings: +Warning 1292 Incorrect inet4 value: 'foo' +Warning 1292 Incorrect inet4 value: 'bar' +DROP TABLE t1; +CREATE TABLE t1 (a INET4 NOT NULL, b VARCHAR(32) NOT NULL); +CREATE TABLE t2 AS SELECT CAST(a AS INET4) AS ca, CAST(b AS INET4) AS cb FROM t1; +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `ca` inet4 NOT NULL, + `cb` inet4 DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t2; +CREATE TABLE t2 AS SELECT COALESCE(a,a), COALESCE(a,b) FROM t1; +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `COALESCE(a,a)` inet4 NOT NULL, + `COALESCE(a,b)` inet4 DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t2; +CREATE TABLE t2 AS SELECT a AS ca,a AS cb FROM t1 UNION SELECT a,b FROM t1; +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `ca` inet4 NOT NULL DEFAULT '0.0.0.0', + `cb` inet4 DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t2; +DROP TABLE t1; +# +# MDEV-22758 Assertion `!item->null_value' failed in Type_handler_inet6::make_sort_key_part +# +CREATE TABLE t1 (c INET4); +INSERT INTO t1 VALUES ('0.0.0.0'),(NULL); +SELECT * FROM t1 ORDER BY IFNULL(c, 'foo'); +c +NULL +0.0.0.0 +Warnings: +Warning 1292 Incorrect inet4 value: 'foo' +DROP TABLE t1; +CREATE TABLE t1 (c INET4); +INSERT INTO t1 VALUES ('0.0.0.0'),(NULL); +CREATE TABLE t2 AS SELECT IFNULL(c, 'foo') FROM t1; +Warnings: +Warning 1292 Incorrect inet4 value: 'foo' +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `IFNULL(c, 'foo')` inet4 DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +SELECT * FROM t2; +IFNULL(c, 'foo') +0.0.0.0 +NULL +DROP TABLE t2; +CREATE TABLE t2 AS SELECT IFNULL(c, '0.0.0.1') FROM t1; +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `IFNULL(c, '0.0.0.1')` inet4 NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +SELECT * FROM t2; +IFNULL(c, '0.0.0.1') +0.0.0.0 +0.0.0.1 +DROP TABLE t2; +DROP TABLE t1; +# +# MDEV-26732 Assertion `0' failed in Item::val_native +# +SELECT CAST(CONCAT('0.0.0.0', REPEAT('',RAND())) AS INET4) AS f, var_pop('x') FROM dual HAVING f > ''; +f var_pop('x') +Warnings: +Warning 1292 Truncated incorrect DOUBLE value: 'x' +Warning 1292 Incorrect inet4 value: '' +SELECT CAST(CONCAT('0.0.0.0', REPEAT('',RAND())) AS INET4) AS f, var_pop(1) FROM dual HAVING f >= '0.0.0.0'; +f var_pop(1) +0.0.0.0 0.0000 +CREATE TABLE t1(id INET4 NOT NULL PRIMARY KEY, dsc INET4); +INSERT INTO t1 VALUES ('0.0.0.1', '1.0.0.1'),('0.0.0.3', '1.0.0.3'),('1.0.0.4', NULL); +CREATE TABLE t2 SELECT COALESCE(t1.dsc), COUNT(*) FROM t1 GROUP BY t1.id; +SELECT * FROM t2 ORDER BY 1,2; +COALESCE(t1.dsc) COUNT(*) +NULL 1 +1.0.0.1 1 +1.0.0.3 1 +DROP TABLE t1, t2; +# +# MDEV-24619 Wrong result or Assertion `0' in Item::val_native / Type_handler_inet6::Item_val_native_with_conversion +# +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('0.0.0.0'),('0.0.0.0'); +SELECT IF(1, '0.0.0.0', a) AS f FROM t1 GROUP BY 'foo' HAVING f != ''; +f +Warnings: +Warning 1292 Incorrect inet4 value: '' +SELECT IF(1, '0.0.0.0', a) AS f FROM t1 GROUP BY 'foo' HAVING f != '0.0.0.0'; +f +SELECT IF(1, '0.0.0.0', a) AS f FROM t1 GROUP BY 'foo' HAVING f != '0.0.0.1'; +f +0.0.0.0 +DROP TABLE t1; +# +# End of 10.10 tests +# diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet4.test b/plugin/type_inet/mysql-test/type_inet/type_inet4.test new file mode 100644 index 00000000000..b6b6300da47 --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet4.test @@ -0,0 +1,1477 @@ +--echo # +--echo # Start of 10.10 tests +--echo # + +--echo # +--echo # MDEV-23287 The INET4 data type +--echo # + +--echo # +--echo # Basic CREATE functionality, defaults, metadata +--echo # + +--error ER_WRONG_FIELD_SPEC +CREATE TABLE t1 (a INET4 AUTO_INCREMENT); + +CREATE TABLE t1 (a INET4); +SHOW CREATE TABLE t1; +DESCRIBE t1; +--vertical_results +--replace_column 19 # +SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='test' AND table_name='t1'; +--horizontal_results +DROP TABLE t1; + +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('0.0.0.1'); +--enable_metadata +SELECT * FROM t1; +SELECT CAST('0.0.0.1' AS INET4) AS a; +--disable_metadata +DROP TABLE t1; + + +CREATE TABLE t1 ( + c1 INET4 DEFAULT 0x00000000, + c2 INET4 DEFAULT 0xFFFFFFFF, + c3 INET4 DEFAULT '0.0.0.255', + c4 INET4 DEFAULT '255.0.0.255', + c5 INET4 DEFAULT CAST(X'FFFF00FF' AS INET4) +); +SHOW CREATE TABLE t1; +DESCRIBE t1; +--vertical_results +--replace_column 19 # +SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='test' AND table_name='t1'; +--horizontal_results +DROP TABLE t1; + +--error ER_INVALID_DEFAULT +CREATE TABLE t1 (c1 INET4 DEFAULT 0x00); +--error ER_INVALID_DEFAULT +CREATE TABLE t1 (c1 INET4 DEFAULT ''); + + +CREATE TABLE t1 (a INET4); +--error ER_TRUNCATED_WRONG_VALUE +INSERT INTO t1 VALUES ('x'); +--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION +INSERT INTO t1 VALUES (1); +--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION +INSERT INTO t1 VALUES (TIME'10:20:30'); +--error ER_TRUNCATED_WRONG_VALUE +INSERT INTO t1 VALUES (0x00); +DROP TABLE t1; + +--echo # +--echo # CAST +--echo # + +SELECT CAST('garbage' AS INET4); +SELECT CAST(0x01 AS INET4); +SELECT CAST(REPEAT(0x00,16) AS INET4); +SELECT CAST(REPEAT(0x11,16) AS INET4); + +CREATE TABLE t1 AS SELECT CAST('0.0.0.0' AS INET4); +SHOW CREATE TABLE t1; +DROP TABLE t1; + + +--echo # +--echo # Text and binary formats, comparison operators +--echo # + +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES (0x00000000); +INSERT INTO t1 VALUES (0x00000001); +INSERT INTO t1 VALUES (0xFF000001); +INSERT INTO t1 VALUES (0xFF000002); +SELECT * FROM t1 ORDER BY a; +SELECT * FROM t1 ORDER BY a DESC; +SELECT HEX(a),a FROM t1 ORDER BY a; +SELECT * FROM t1 WHERE a='0.0.0.0'; +SELECT * FROM t1 WHERE a='0.0.0.1'; +SELECT * FROM t1 WHERE a='255.0.0.1'; +SELECT * FROM t1 WHERE a='255.0.0.2'; +SELECT * FROM t1 WHERE a='255.000.000.002'; +SELECT * FROM t1 WHERE a=0x00000000; +SELECT * FROM t1 WHERE a=0x00000001; +SELECT * FROM t1 WHERE a=0xff000001; +SELECT * FROM t1 WHERE a=0xff000002; +SELECT * FROM t1 WHERE a<'0.0.0.0'; +SELECT * FROM t1 WHERE a<='0.0.0.0'; +SELECT * FROM t1 WHERE a>='255.0.0.2'; +SELECT * FROM t1 WHERE a>'255.0.0.2'; +SELECT * FROM t1 WHERE a IN ('0.0.0.0', '255.0.0.1') ORDER BY a; +SELECT * FROM t1 WHERE a IN ('0.0.0.0', 0xff000002) ORDER BY a; + +SELECT * FROM t1 WHERE a<'garbage'; +SELECT * FROM t1 WHERE a<='garbage'; +SELECT * FROM t1 WHERE a='garbage'; +SELECT * FROM t1 WHERE a>='garbage'; +SELECT * FROM t1 WHERE a>'garbage'; + +SELECT * FROM t1 WHERE a<0x01; +SELECT * FROM t1 WHERE a<=0x01; +SELECT * FROM t1 WHERE a=0x01; +SELECT * FROM t1 WHERE a>=0x01; +SELECT * FROM t1 WHERE a>0x01; + +SELECT * FROM t1 WHERE a='0.0.0.00'; +SELECT * FROM t1 WHERE a='0.0.0.000'; +SELECT * FROM t1 WHERE a='0.0.00.000'; + +SELECT * FROM t1 WHERE a='0.0.0.01'; +SELECT * FROM t1 WHERE a='0.0.0.001'; +SELECT * FROM t1 WHERE a='0.0.00.001'; + +SELECT * FROM t1 WHERE a='0.0.0.0000'; + +--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION +SELECT * FROM t1 WHERE a=0; +--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION +SELECT * FROM t1 WHERE a=0.0; +--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION +SELECT * FROM t1 WHERE a=0e0; +--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION +SELECT * FROM t1 WHERE a=TIME'10:20:30'; +--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION +SELECT * FROM t1 WHERE a IN ('0.0.0.0', 10); + +DROP TABLE t1; + +--echo # +--echo # cmp_item_fbt: IN for non-constants +--echo # + +CREATE TABLE t1 (a INET4, b INET4); +INSERT INTO t1 VALUES ('0.0.0.1', '0.0.0.2'); +SELECT * FROM t1 WHERE '0.0.0.0' IN (a, b); +SELECT * FROM t1 WHERE '0.0.0.1' IN (a, b); +SELECT * FROM t1 WHERE '0.0.0.1' IN (a, b); +SELECT * FROM t1 WHERE '0.0.0.01' IN (a, b); +SELECT * FROM t1 WHERE '0.0.0.001' IN (a, b); +SELECT * FROM t1 WHERE '0.0.0.0001' IN (a, b); +DROP TABLE t1; + + +--echo # +--echo # CASE abbreviations +--echo # + +CREATE TABLE t1 ( + c INET4, + c_char CHAR(32), + c_varchar VARCHAR(32), + c_tinytext TINYTEXT, + c_text TEXT, + c_mediumtext TEXT, + c_longtext LONGTEXT +); +CREATE TABLE t2 AS SELECT + COALESCE(c, c_char), + COALESCE(c, c_varchar), + COALESCE(c, c_tinytext), + COALESCE(c, c_text), + COALESCE(c, c_mediumtext), + COALESCE(c, c_longtext) +FROM t1; +SHOW CREATE TABLE t2; +DROP TABLE t2; +CREATE TABLE t2 AS SELECT + LEAST(c, c_char), + LEAST(c, c_varchar), + LEAST(c, c_tinytext), + LEAST(c, c_text), + LEAST(c, c_mediumtext), + LEAST(c, c_longtext) +FROM t1; +SHOW CREATE TABLE t2; +DROP TABLE t2; +DROP TABLE t1; + +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES (NULL),('0.0.0.1'),('0.0.0.2'); +SELECT COALESCE(a, '0.0.0.0') FROM t1 ORDER BY a; +SELECT a, LEAST(a,'0.0.0.0'), LEAST(a,'0.0.0.255') FROM t1 ORDER BY a; +SELECT a, GREATEST(a,'0.0.0.0'), GREATEST(a,'0.0.0.255') FROM t1 ORDER BY a; + +CREATE TABLE t2 AS SELECT + COALESCE(a, '0.0.0.0'), + LEAST(a,'0.0.0.0'), + GREATEST(a,'0.0.0.0') +FROM t1; +SHOW CREATE TABLE t2; +DROP TABLE t2; + +SELECT COALESCE(a, 0x00000000) FROM t1 ORDER BY a; + +SELECT a, + LEAST(a, 0x00000000), + LEAST(a, 0x0000000f) +FROM t1 ORDER BY a; +SELECT a, + GREATEST(a, 0x00000000), + GREATEST(a, 0x0000000f) +FROM t1 ORDER BY a; + +CREATE TABLE t2 AS SELECT + COALESCE(a, 0x00000000), + LEAST(a,0x00000000), + GREATEST(a,0x00000000) +FROM t1; +SHOW CREATE TABLE t2; +DROP TABLE t2; + +--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION +SELECT COALESCE(a, 10) FROM t1; +--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION +SELECT LEAST(a, 10) FROM t1; +--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION +SELECT GREATEST(a, 10) FROM t1; +DROP TABLE t1; + +SELECT COALESCE('garbage', CAST('0.0.0.1' AS INET4)); +SELECT COALESCE(0x01, CAST('0.0.0.1' AS INET4)); + + +--echo # +--echo # Uniqueness +--echo # + +CREATE TABLE t1 (a INET4 NOT NULL PRIMARY KEY); +INSERT INTO t1 VALUES ('65.0.0.1'),('97.0.0.1'); +--error ER_DUP_ENTRY +INSERT INTO t1 VALUES ('97.0.0.1'); +SELECT * FROM t1; +DROP TABLE t1; + + +--echo # +--echo # Indexes +--echo # + +--error ER_WRONG_SUB_KEY +CREATE TABLE t1 (a INET4, KEY(a(1))); + + +--echo # +--echo # Explicit CAST on INSERT +--echo # + +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES (CAST('1.0.0.1' AS INET4)); +INSERT INTO t1 VALUES (CAST('1.0.0.2' AS INET4)); +INSERT INTO t1 VALUES (CAST('1.0.0.3' AS INET4)); +INSERT INTO t1 VALUES (CAST(CONCAT('2','0.0.0.1') AS INET4)); +INSERT INTO t1 VALUES (CAST(CONCAT('2','0.0.0.2') AS INET4)); +INSERT INTO t1 VALUES (CAST(CONCAT('2','0.0.0.3') AS INET4)); +SELECT * FROM t1 ORDER BY a; +DROP TABLE t1; + + +--echo # +--echo # Explicit CAST and implicit CAST on ALTER +--echo # + +CREATE TABLE t1 (a VARCHAR(64)); +INSERT INTO t1 VALUES ('garbage'),('0.0.0.0'),('0.0.0.1'),('255.0.0.1'),('255.0.0.2'); +SELECT a, CAST(a AS INET4) FROM t1 ORDER BY a; +SELECT a, CAST(a AS INET4) FROM t1 ORDER BY CAST(a AS INET4); +--error ER_TRUNCATED_WRONG_VALUE +ALTER TABLE t1 MODIFY a INET4; +SET sql_mode=''; +ALTER TABLE t1 MODIFY a INET4; +SET sql_mode=DEFAULT; +SELECT * FROM t1 ORDER BY a; +DROP TABLE t1; + + +CREATE TABLE t1 (a BINARY(4)); +INSERT INTO t1 VALUES (0x00000000); +INSERT INTO t1 VALUES (0x00000001); +INSERT INTO t1 VALUES (0xff000001); +INSERT INTO t1 VALUES (0xff000002); +SELECT HEX(a), CAST(a AS INET4) FROM t1 ORDER BY a; +ALTER TABLE t1 MODIFY a INET4; +SELECT * FROM t1 ORDER BY a; +DROP TABLE t1; + + +--echo # +--echo # INSERT..SELECT, same data types +--echo # + +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('0.0.0.0'),('0.0.0.1'),('0.0.0.2'); +CREATE TABLE t2 (a INET4); +INSERT INTO t2 SELECT a FROM t1; +SELECT * FROM t2; +DROP TABLE t1,t2; + + +--echo # +--echo # Implicit CAST on INSERT..SELECT, text format +--echo # + +CREATE TABLE t1 (a VARCHAR(64)); +INSERT INTO t1 VALUES ('garbage'),('0.0.0.0'),('0.0.0.1'),('255.0.0.1'),('255.0.0.2'); + +CREATE TABLE t2 (a INET4); +--error ER_TRUNCATED_WRONG_VALUE +INSERT INTO t2 SELECT a FROM t1; +SET sql_mode=''; +INSERT INTO t2 SELECT a FROM t1; +SELECT * FROM t2 ORDER BY a; +SET sql_mode=DEFAULT; +DROP TABLE t2; + +CREATE TABLE t2 (a INET4 NOT NULL); +--error ER_TRUNCATED_WRONG_VALUE +INSERT INTO t2 SELECT a FROM t1; +SET sql_mode=''; +INSERT INTO t2 SELECT a FROM t1; +SELECT * FROM t2 ORDER BY a; +SET sql_mode=DEFAULT; +DROP TABLE t2; + +DROP TABLE t1; + + +--echo # +--echo # Implicit CAST on INSERT..SELECT, binary format +--echo # + +CREATE TABLE t1 (a BINARY(4)); +INSERT INTO t1 VALUES (0x00000000); +INSERT INTO t1 VALUES (0x00000001); +INSERT INTO t1 VALUES (0xff000001); +INSERT INTO t1 VALUES (0xff000002); +CREATE TABLE t2 (a INET4); +INSERT INTO t2 SELECT a FROM t1; +SELECT a FROM t2 ORDER BY a; +DROP TABLE t1,t2; + + +--echo # +--echo # CAST to other data types +--echo # + +--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION +SELECT CAST(CAST('0.0.0.0' AS INET4) AS DOUBLE); + +--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION +SELECT CAST(CAST('0.0.0.0' AS INET4) AS FLOAT); + +--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION +SELECT CAST(CAST('0.0.0.0' AS INET4) AS DECIMAL); + +--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION +SELECT CAST(CAST('0.0.0.0' AS INET4) AS SIGNED); + +--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION +SELECT CAST(CAST('0.0.0.0' AS INET4) AS UNSIGNED); + +--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION +SELECT CAST(CAST('0.0.0.0' AS INET4) AS TIME); + +--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION +SELECT CAST(CAST('0.0.0.0' AS INET4) AS DATE); + +--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION +SELECT CAST(CAST('0.0.0.0' AS INET4) AS DATETIME); + +SELECT CAST(CAST('0.0.0.0' AS INET4) AS CHAR); +CREATE TABLE t1 AS SELECT CAST(CAST('0.0.0.0' AS INET4) AS CHAR) AS a; +SHOW CREATE TABLE t1; +DROP TABLE t1; + +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('255.0.0.255'); +CREATE TABLE t2 AS SELECT + CAST(a AS CHAR), + CAST(a AS CHAR(15)), + CAST(a AS CHAR(530)), + CAST(a AS CHAR(65535)), + CAST(a AS CHAR(66000)), + CAST(a AS CHAR(16777215)), + CAST(a AS CHAR(16777216)) +FROM t1; +SHOW CREATE TABLE t2; +--vertical_results +SELECT * FROM t2; +--horizontal_results +DROP TABLE t2; +DROP TABLE t1; + +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('255.0.0.255'); +CREATE TABLE t2 AS SELECT + CAST(a AS BINARY(4)) AS cb4, + CAST(a AS BINARY) AS cb, + CAST(a AS BINARY(16)) AS cb16, + CAST(a AS BINARY(32)) AS cb32, + CAST(a AS BINARY(530)) AS cb530, + CAST(a AS BINARY(65535)) AS cb65535, + CAST(a AS BINARY(66000)) AS cb66000, + CAST(a AS BINARY(16777215)) AS cb16777215, + CAST(a AS BINARY(16777216)) AS cb16777216 +FROM t1 LIMIT 0; +SHOW CREATE TABLE t2; +DROP TABLE t2; + +CREATE TABLE t2 AS SELECT + CAST(a AS BINARY(4)) AS cb4, + CAST(a AS BINARY) AS cb, + CAST(a AS BINARY(16)) AS cb16, + CAST(a AS BINARY(32)) AS cb32, + CAST(a AS BINARY(530)) AS cb530, + CAST(a AS BINARY(65535)) AS cb65535 +FROM t1; +SHOW CREATE TABLE t2; +--vertical_results +SELECT + HEX(cb4), + HEX(cb), + HEX(cb16), + HEX(cb32), + LENGTH(cb530), + LENGTH(cb65535) +FROM t2; +--horizontal_results +DROP TABLE t2; +DROP TABLE t1; + +--echo # +--echo # Implicit conversion to other types in INSERT +--echo # + +CREATE TABLE t1 (a INT); +--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION +INSERT INTO t1 VALUES (CAST('0.0.0.0' AS INET4)); +DROP TABLE t1; + +CREATE TABLE t1 (a DOUBLE); +--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION +INSERT INTO t1 VALUES (CAST('0.0.0.0' AS INET4)); +DROP TABLE t1; + +CREATE TABLE t1 (a DECIMAL(32,0)); +--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION +INSERT INTO t1 VALUES (CAST('0.0.0.0' AS INET4)); +DROP TABLE t1; + +CREATE TABLE t1 (a VARCHAR(64)); +INSERT INTO t1 VALUES (CAST('0.0.0.0' AS INET4)); +SELECT * FROM t1; +DROP TABLE t1; + +CREATE TABLE t1 (a TEXT); +INSERT INTO t1 VALUES (CAST('0.0.0.0' AS INET4)); +SELECT * FROM t1; +DROP TABLE t1; + + + +--echo # +--echo # Boolean context +--echo # + +SELECT + CAST('0.0.0.0' AS INET4) IS TRUE, + CAST('0.0.0.0' AS INET4) IS FALSE, + CAST('0.0.0.1' AS INET4) IS TRUE, + CAST('0.0.0.1' AS INET4) IS FALSE; + +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('0.0.0.0'),('0.0.0.1'); +SELECT a, a IS TRUE, a IS FALSE FROM t1 ORDER BY a; +DROP TABLE t1; + +## +## TODO: Error looks like a bug. This should return rows where a<>'0.0.0.0'. +## The same problem is repeatable with GEOMETRY. +## +#CREATE TABLE t1 (a INET4); +#INSERT INTO t1 VALUES ('0.0.0.0'),('0.0.0.1'),('0.0.0.2'); +#--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION +#SELECT * FROM t1 WHERE a; +#DROP TABLE t1; + + +--echo # +--echo # GROUP BY +--echo # + +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('0.0.0.0'),('0.0.0.0'); +INSERT INTO t1 VALUES ('0.0.0.1'),('0.0.0.01'),('0.0.0.001'); +INSERT INTO t1 VALUES ('0.0.0.2'),('0.0.0.2'),('0.0.0.2'),('0.0.0.2'); +SELECT a, COUNT(*) FROM t1 GROUP BY a; +DROP TABLE t1; + +--echo # +--echo # Aggregate functions +--echo # + +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('0.0.0.0'),('0.0.0.0'); +INSERT INTO t1 VALUES ('0.0.0.1'),('0.0.0.01'),('0.0.0.001'); +INSERT INTO t1 VALUES ('0.0.0.2'),('0.0.0.2'),('0.0.0.2'),('0.0.0.2'); +SELECT MIN(a),MAX(a) FROM t1; + +CREATE TABLE t2 AS SELECT MIN(a), MAX(a) FROM t1; +SHOW CREATE TABLE t2; +DROP TABLE t2; + +--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION +SELECT AVG(a) FROM t1; +--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION +SELECT AVG(DISTINCT a) FROM t1; +--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION +SELECT SUM(a) FROM t1; +--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION +SELECT SUM(DISTINCT a) FROM t1; +--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION +SELECT STDDEV(a) FROM t1; +SELECT GROUP_CONCAT(a ORDER BY a) FROM t1; +SELECT a, GROUP_CONCAT(a ORDER BY a) FROM t1 GROUP BY a; +DROP TABLE t1; + +--echo # +--echo # MDEV-21765 Possibly inconsistent behavior of BIT_xx functions with INET4 field +--echo # + +CREATE TABLE t1 (a INET4); +--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION +SELECT BIT_AND(a) FROM t1; +--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION +SELECT BIT_OR(a) FROM t1; +--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION +SELECT BIT_XOR(a) FROM t1; +DROP TABLE t1; + + +--echo # +--echo # Window functions +--echo # + +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('0.0.0.1'),('0.0.0.2'),('0.0.0.3'),('0.0.0.004'); +SELECT + a, + LAG(a) OVER (ORDER BY a), + LEAD(a) OVER (ORDER BY a) +FROM t1 ORDER BY a; + +SELECT + a, + FIRST_VALUE(a) OVER (ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING), + LAST_VALUE(a) OVER (ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) +FROM t1 ORDER BY a; +DROP TABLE t1; + + +--echo # +--echo # Prepared statements +--echo # + +EXECUTE IMMEDIATE 'CREATE TABLE t1 AS SELECT ? AS a' USING CAST('0.0.0.0' AS INET4); +SHOW CREATE TABLE t1; +EXECUTE IMMEDIATE 'INSERT INTO t1 VALUES (?)' USING '0.0.0.1'; +EXECUTE IMMEDIATE 'INSERT INTO t1 VALUES (?)' USING CAST('0.0.0.2' AS INET4); +EXECUTE IMMEDIATE 'INSERT INTO t1 VALUES (?)' USING 0x00000003; +EXECUTE IMMEDIATE 'INSERT INTO t1 VALUES (?)' USING CAST(0x00000004 AS INET4); +SELECT a FROM t1 ORDER BY a; +EXECUTE IMMEDIATE 'SELECT * FROM t1 WHERE a=?' USING '0.0.0.1'; +EXECUTE IMMEDIATE 'SELECT * FROM t1 WHERE a=?' USING CAST('0.0.0.2' AS INET4); +EXECUTE IMMEDIATE 'SELECT * FROM t1 WHERE a=?' USING 0x00000003; +EXECUTE IMMEDIATE 'SELECT * FROM t1 WHERE a=?' USING CAST(0x00000004 AS INET4); +DROP TABLE t1; + + +--echo # +--echo # Character set and collation aggregation +--echo # + +CREATE TABLE t1 (a INET4); + +CREATE TABLE t2 AS SELECT + CONCAT(a) AS c1, + CONCAT(CAST('0.0.0.0' AS INET4)) AS c2 +FROM t1; +SHOW CREATE TABLE t2; +DROP TABLE t2; + +CREATE TABLE t2 AS SELECT + CONCAT(_utf8'1', a) AS c1, + CONCAT(_utf8'1', CAST('0.0.0.1' AS INET4)) AS c2, + CONCAT(_utf8'1', COALESCE(a)) AS c3 +FROM t1; +SHOW CREATE TABLE t2; +DROP TABLE t2; + +CREATE TABLE t2 AS SELECT + CONCAT(_latin1'1', a) AS c1, + CONCAT(_latin1'1', CAST('0.0.0.1' AS INET4)) AS c2, + CONCAT(_latin1'1', COALESCE(a)) AS c3 +FROM t1; +SHOW CREATE TABLE t2; +DROP TABLE t2; + +DROP TABLE t1; + + +--echo # +--echo # UNION +--echo # + +CREATE TABLE t1 AS SELECT CAST('0.0.0.0' AS INET4) AS c UNION SELECT CAST('0.0.0.1' AS INET4); +SHOW CREATE TABLE t1; +DROP TABLE t1; + +CREATE TABLE t1 AS SELECT CAST('0.0.0.0' AS INET4) AS c UNION SELECT '0.0.0.1'; +SHOW CREATE TABLE t1; +DROP TABLE t1; + +CREATE TABLE t1 AS SELECT '0.0.0.0' AS c UNION SELECT CAST('0.0.0.1' AS INET4); +SHOW CREATE TABLE t1; +DROP TABLE t1; + +CREATE TABLE t1 AS SELECT CAST('0.0.0.0' AS INET4) AS c UNION SELECT 0x00000001; +SELECT * FROM t1; +DROP TABLE t1; + +--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION +CREATE TABLE t1 AS SELECT CAST('0.0.0.0' AS INET4) AS c UNION SELECT 1; + + +--echo # +--echo # Unary operators +--echo # + +--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION +SELECT -CAST('0.0.0.0' AS INET4); + +--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION +SELECT ABS(CAST('0.0.0.0' AS INET4)); + +--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION +SELECT ROUND(CAST('0.0.0.0' AS INET4)); + +--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION +SELECT CEILING(CAST('0.0.0.0' AS INET4)); + +--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION +SELECT FLOOR(CAST('0.0.0.0' AS INET4)); + + +--echo # +--echo # Arithmetic operators +--echo # + +--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION +SELECT CAST('0.0.0.0' AS INET4) + 1; +--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION +SELECT CAST('0.0.0.0' AS INET4) - 1; + +--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION +SELECT CAST('0.0.0.0' AS INET4) * 1; +--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION +SELECT CAST('0.0.0.0' AS INET4) / 1; + +--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION +SELECT CAST('0.0.0.0' AS INET4) MOD 1; + + +--echo # +--echo # Misc +--echo # + +--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION +SELECT RAND(CAST('0.0.0.0' AS INET4)); + +--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION +SELECT FROM_UNIXTIME(CAST('0.0.0.0' AS INET4)); + +--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION +SELECT HOUR(CAST('0.0.0.0' AS INET4)); + +--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION +SELECT YEAR(CAST('0.0.0.0' AS INET4)); + +--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION +SELECT RELEASE_LOCK(CAST('0.0.0.0' AS INET4)); + +# QQ +#SELECT JSON_LENGTH(CAST('0.0.0.0' AS INET4)); + +--echo # +--echo # Virtual columns +--echo # + +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED +CREATE TABLE t1 ( + a INT, + b INET4 GENERATED ALWAYS AS (CAST(CONCAT(RAND(),a) AS INET4)), INDEX(b) +); + +CREATE TABLE t1 ( + a INT, + b INET4 GENERATED ALWAYS AS (CAST(CONCAT('0.0.0.',a) AS INET4)), INDEX(b) +); +INSERT INTO t1 (a) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15); +SELECT * FROM t1; +DROP TABLE t1; + +--echo # +--echo # VIEW +--echo # + +CREATE TABLE t1 (a INT DEFAULT 0); +INSERT INTO t1 (a) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15); +SELECT * FROM t1 ORDER BY a; +CREATE VIEW v1 AS SELECT (CAST(CONCAT('0.0.0.',a) AS INET4)) AS c FROM t1; +SELECT * FROM v1 ORDER BY c; +DROP VIEW v1; +DROP TABLE t1; + +CREATE TABLE t1 (a INET4 DEFAULT '0.0.0.0'); +CREATE VIEW v1 AS SELECT * FROM t1; +SHOW CREATE VIEW v1; +DESCRIBE v1; +INSERT INTO v1 VALUES ('0.0.0.0'),('0.0.0.1'),('0.0.0.2'); +SELECT * FROM t1; +DROP VIEW v1; +DROP TABLE t1; + +CREATE TABLE t1 (a INET4 DEFAULT CAST('0.0.0.0' AS INET4)); +CREATE VIEW v1 AS SELECT * FROM t1; +SHOW CREATE VIEW v1; +DESCRIBE v1; +INSERT INTO v1 VALUES ('0.0.0.0'),('0.0.0.1'),('0.0.0.2'); +SELECT * FROM t1; +DROP VIEW v1; +DROP TABLE t1; + + +--echo # +--echo # Subqueries +--echo # + +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('0.0.0.0'),('0.0.0.1'),('0.0.0.2'); +SELECT * FROM t1 WHERE a=(SELECT MIN(a) FROM t1) ORDER BY a; +SELECT * FROM t1 WHERE a=(SELECT MAX(a) FROM t1) ORDER BY a; +SELECT * FROM t1 WHERE a IN (SELECT a FROM t1 WHERE a>'0.0.0.0') ORDER BY a; +DROP TABLE t1; + +--echo # +--echo # Stored routines +--echo # + +DELIMITER $$; +CREATE PROCEDURE p1(a INET4) +BEGIN + DECLARE b INET4 DEFAULT CONCAT('1', a); + SELECT a, b; +END; +$$ +DELIMITER ;$$ +CALL p1('0.0.0.1'); +CALL p1(CAST('0.0.0.2' AS INET4)); +DROP PROCEDURE p1; + +DELIMITER $$; +CREATE FUNCTION f1(a INET4) RETURNS INET4 +BEGIN + RETURN CONCAT('1',a); +END; +$$ +DELIMITER ;$$ +SELECT f1('0.0.0.1'); +SELECT f1(CAST('0.0.0.1' AS INET4)); +DROP FUNCTION f1; + +--echo # +--echo # Anchored data types in SP variables +--echo # + +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('0.0.0.1'); +DELIMITER $$; +CREATE PROCEDURE p1() +BEGIN + DECLARE va TYPE OF t1.a; + SELECT MAX(a) INTO va FROM t1; + SELECT va; +END; +$$ +DELIMITER ;$$ +CALL p1; +DROP PROCEDURE p1; +DROP TABLE t1; + + +CREATE TABLE t1 (a INET4, b INET4); +INSERT INTO t1 VALUES ('0.0.0.12', '0.0.0.111'); +DELIMITER $$; +CREATE PROCEDURE p1() +BEGIN + DECLARE va ROW TYPE OF t1; + SELECT MAX(a), MAX(b) INTO va FROM t1; + SELECT va.a, va.b; +END; +$$ +DELIMITER ;$$ +CALL p1; +DROP PROCEDURE p1; +DROP TABLE t1; + + +--echo # +--echo # Optimizer: make_const_item_for_comparison +--echo # + +CREATE TABLE t1 (id INT, a INET4); +INSERT INTO t1 VALUES (1,'0.0.0.1'),(2,'0.0.0.2'); +EXPLAIN EXTENDED SELECT * FROM t1 WHERE a=COALESCE(CAST('0.0.0.1' AS INET4)) AND id>0; +DROP TABLE t1; + +--echo # +--echo # Optimizer: equal field propagation +--echo # + +CREATE TABLE t1 (id INT, a INET4); +INSERT INTO t1 VALUES (1,'0.0.0.1'),(2,'0.0.0.2'); +EXPLAIN EXTENDED SELECT * FROM t1 +WHERE a=COALESCE(CAST('0.0.0.1' AS INET4)) + AND LENGTH(CONCAT(a,RAND()))>1; +EXPLAIN EXTENDED SELECT * FROM t1 +WHERE a=COALESCE(CAST('0.0.0.1' AS INET4)) + AND LENGTH(a)>1; +DROP TABLE t1; + + +--echo # +--echo # Optimizer: equal expression propagation +--echo # + + +CREATE TABLE t1 (id INT, a INET4); +INSERT INTO t1 VALUES (1,'0.0.0.1'),(2,'0.0.0.2'); +EXPLAIN EXTENDED SELECT * FROM t1 +WHERE COALESCE(a)='0.0.0.1' AND COALESCE(a)=CONCAT(a); +DROP TABLE t1; + +--echo # +--echo # Subquery materialization +--echo # + +CREATE TABLE t1 (a INET4, b VARCHAR(32), KEY (a), KEY(b)) ; +INSERT INTO t1 VALUES ('0.0.0.10','0.0.0.11'),('0.0.0.10','0.0.0.11'); +SET @@optimizer_switch='semijoin=off,materialization=on,in_to_exists=off,subquery_cache=off'; +EXPLAIN SELECT * FROM t1 WHERE a IN (SELECT a AS a_inner FROM t1 GROUP BY a_inner); +EXPLAIN SELECT * FROM t1 WHERE b IN (SELECT a AS a_inner FROM t1 GROUP BY a_inner); +SET @@optimizer_switch=DEFAULT; +DROP TABLE t1; + +--echo # +--echo # ALTER from INET4 to INET4 +--echo # + +CREATE TABLE t1 (a INET4, b INT); +INSERT INTO t1 VALUES ('10.11.12.13', 1); +ALTER TABLE t1 MODIFY b DECIMAL(10,2); +SELECT * FROM t1; +DROP TABLE t1; + +--echo # +--echo # ALTER to character string data types +--echo # + +CREATE OR REPLACE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('10.11.12.13'); +SELECT CAST(a AS CHAR(15)) FROM t1; +ALTER TABLE t1 MODIFY a CHAR(15); +SELECT * FROM t1; +DROP TABLE t1; + +CREATE OR REPLACE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('10.11.12.13'); +ALTER TABLE t1 MODIFY a VARCHAR(15); +SELECT * FROM t1; +DROP TABLE t1; + +CREATE OR REPLACE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('10.11.12.13'); +ALTER TABLE t1 MODIFY a TINYTEXT; +SELECT * FROM t1; +DROP TABLE t1; + +CREATE OR REPLACE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('10.11.12.13'); +ALTER TABLE t1 MODIFY a TEXT; +SELECT * FROM t1; +DROP TABLE t1; + +CREATE OR REPLACE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('10.11.12.13'); +ALTER TABLE t1 MODIFY a MEDIUMTEXT; +SELECT * FROM t1; +DROP TABLE t1; + +CREATE OR REPLACE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('10.11.12.13'); +ALTER TABLE t1 MODIFY a LONGTEXT; +SELECT * FROM t1; +DROP TABLE t1; + + +--echo # +--echo # ALTER from character string data types +--echo # + +CREATE OR REPLACE TABLE t1 (a CHAR(64)); +INSERT INTO t1 VALUES ('10.11.12.13'); +SELECT CAST(a AS INET4) FROM t1; +ALTER TABLE t1 MODIFY a INET4; +SELECT * FROM t1; +DROP TABLE t1; + +CREATE OR REPLACE TABLE t1 (a VARCHAR(64)); +INSERT INTO t1 VALUES ('10.11.12.13'); +SELECT CAST(a AS INET4) FROM t1; +ALTER TABLE t1 MODIFY a INET4; +SELECT * FROM t1; +DROP TABLE t1; + +CREATE OR REPLACE TABLE t1 (a TINYTEXT); +INSERT INTO t1 VALUES ('10.11.12.13'); +SELECT CAST(a AS INET4) FROM t1; +ALTER TABLE t1 MODIFY a INET4; +SELECT * FROM t1; +DROP TABLE t1; + +CREATE OR REPLACE TABLE t1 (a TEXT); +INSERT INTO t1 VALUES ('10.11.12.13'); +SELECT CAST(a AS INET4) FROM t1; +ALTER TABLE t1 MODIFY a INET4; +SELECT * FROM t1; +DROP TABLE t1; + +CREATE OR REPLACE TABLE t1 (a MEDIUMTEXT); +INSERT INTO t1 VALUES ('10.11.12.13'); +SELECT CAST(a AS INET4) FROM t1; +ALTER TABLE t1 MODIFY a INET4; +SELECT * FROM t1; +DROP TABLE t1; + +CREATE OR REPLACE TABLE t1 (a LONGTEXT); +INSERT INTO t1 VALUES ('10.11.12.13'); +SELECT CAST(a AS INET4) FROM t1; +ALTER TABLE t1 MODIFY a INET4; +SELECT * FROM t1; +DROP TABLE t1; + + +--echo # +--echo # ALTER to binary string data types +--echo # + +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('10.11.12.13'); +ALTER TABLE t1 MODIFY a BINARY(4); +SELECT HEX(a) FROM t1; +DROP TABLE t1; + +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('10.11.12.13'); +ALTER TABLE t1 MODIFY a BINARY(5); +SELECT HEX(a) FROM t1; +DROP TABLE t1; + +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('10.11.12.13'); +--error ER_DATA_TOO_LONG +ALTER TABLE t1 MODIFY a BINARY(3); +DROP TABLE t1; + +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('10.11.12.13'); +ALTER TABLE t1 MODIFY a TINYBLOB; +SELECT HEX(a) FROM t1; +DROP TABLE t1; + +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('10.11.12.13'); +ALTER TABLE t1 MODIFY a BLOB; +SELECT HEX(a) FROM t1; +DROP TABLE t1; + +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('10.11.12.13'); +ALTER TABLE t1 MODIFY a MEDIUMBLOB; +SELECT HEX(a) FROM t1; +DROP TABLE t1; + +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('10.11.12.13'); +ALTER TABLE t1 MODIFY a LONGBLOB; +SELECT HEX(a) FROM t1; +DROP TABLE t1; + + +--echo # +--echo # ALTER from binary string data types +--echo # + +CREATE TABLE t1 (a BINARY(4)); +INSERT INTO t1 VALUES (X'11121314'); +ALTER TABLE t1 MODIFY a INET4; +SELECT a FROM t1; +DROP TABLE t1; + +CREATE TABLE t1 (a BINARY(17)); +INSERT INTO t1 VALUES (X'1112131400'); +--error ER_TRUNCATED_WRONG_VALUE +ALTER TABLE t1 MODIFY a INET4; +DROP TABLE t1; + +CREATE TABLE t1 (a BINARY(3)); +INSERT INTO t1 VALUES (X'111213'); +--error ER_TRUNCATED_WRONG_VALUE +ALTER TABLE t1 MODIFY a INET4; +DROP TABLE t1; + +CREATE TABLE t1 (a TINYBLOB); +INSERT INTO t1 VALUES (X'11121314'); +ALTER TABLE t1 MODIFY a INET4; +SELECT a FROM t1; +DROP TABLE t1; + +CREATE TABLE t1 (a BLOB); +INSERT INTO t1 VALUES (X'11121314'); +ALTER TABLE t1 MODIFY a INET4; +SELECT a FROM t1; +DROP TABLE t1; + +CREATE TABLE t1 (a MEDIUMBLOB); +INSERT INTO t1 VALUES (X'11121314'); +ALTER TABLE t1 MODIFY a INET4; +SELECT a FROM t1; +DROP TABLE t1; + +CREATE TABLE t1 (a BLOB); +INSERT INTO t1 VALUES (X'11121314'); +ALTER TABLE t1 MODIFY a INET4; +SELECT a FROM t1; +DROP TABLE t1; + + +--echo # +--echo # SET from INET4 to INET4 +--echo # + +CREATE TABLE t1 (a INET4, b INET4); +INSERT INTO t1 VALUES ('255.0.0.255', NULL); +UPDATE t1 SET b=a; +SELECT b FROM t1; +DROP TABLE t1; + +--echo # +--echo # SET from INET4 to character string +--echo # + +CREATE TABLE t1 (a INET4, b CHAR(15)); +INSERT INTO t1 VALUES ('255.0.0.255', NULL); +UPDATE t1 SET b=a; +SELECT b FROM t1; +DROP TABLE t1; + +CREATE TABLE t1 (a INET4, b VARCHAR(15)); +INSERT INTO t1 VALUES ('255.0.0.255', NULL); +UPDATE t1 SET b=a; +SELECT b FROM t1; +DROP TABLE t1; + +CREATE TABLE t1 (a INET4, b TEXT); +INSERT INTO t1 VALUES ('255.0.0.255', NULL); +UPDATE t1 SET b=a; +SELECT b FROM t1; +DROP TABLE t1; + +CREATE TABLE t1 (a INET4, b ENUM('255.0.0.255')); +INSERT INTO t1 VALUES ('255.0.0.255', NULL); +UPDATE t1 SET b=a; +SELECT b FROM t1; +DROP TABLE t1; + +CREATE TABLE t1 (a INET4, b SET('255.0.0.255')); +INSERT INTO t1 VALUES ('255.0.0.255', NULL); +UPDATE t1 SET b=a; +SELECT b FROM t1; +DROP TABLE t1; + + +--echo # +--echo # SET from character string to INET4 +--echo # + +CREATE TABLE t1 (a CHAR(15), b INET4); +INSERT INTO t1 VALUES ('255.0.0.255', NULL); +UPDATE t1 SET b=a; +SELECT b FROM t1; +DROP TABLE t1; + +CREATE TABLE t1 (a VARCHAR(15), b INET4); +INSERT INTO t1 VALUES ('255.0.0.255', NULL); +UPDATE t1 SET b=a; +SELECT b FROM t1; +DROP TABLE t1; + +CREATE TABLE t1 (a TEXT, b INET4); +INSERT INTO t1 VALUES ('255.0.0.255', NULL); +UPDATE t1 SET b=a; +SELECT b FROM t1; +DROP TABLE t1; + +CREATE TABLE t1 (a ENUM('255.0.0.255'), b INET4); +INSERT INTO t1 VALUES ('255.0.0.255', NULL); +UPDATE t1 SET b=a; +SELECT b FROM t1; +DROP TABLE t1; + +CREATE TABLE t1 (a SET('255.0.0.255'), b INET4); +INSERT INTO t1 VALUES ('255.0.0.255', NULL); +UPDATE t1 SET b=a; +SELECT b FROM t1; +DROP TABLE t1; + + +--echo # +--echo # SET from INET4 to binary +--echo # + +CREATE TABLE t1 (a INET4, b BINARY(4)); +INSERT INTO t1 VALUES ('255.0.0.255', NULL); +UPDATE t1 SET b=a; +SELECT HEX(b) FROM t1; +DROP TABLE t1; + +CREATE TABLE t1 (a INET4, b VARBINARY(4)); +INSERT INTO t1 VALUES ('255.0.0.255', NULL); +UPDATE t1 SET b=a; +SELECT HEX(b) FROM t1; +DROP TABLE t1; + +CREATE TABLE t1 (a INET4, b BLOB); +INSERT INTO t1 VALUES ('255.0.0.255', NULL); +UPDATE t1 SET b=a; +SELECT HEX(b) FROM t1; +DROP TABLE t1; + + +--echo # +--echo # SET from binary to INET4 +--echo # + +CREATE TABLE t1 (a BINARY(4), b INET4); +INSERT INTO t1 VALUES (CONCAT(0xFF,REPEAT(0x00,2),0xFF), NULL); +UPDATE t1 SET b=a; +SELECT b FROM t1; +DROP TABLE t1; + +CREATE TABLE t1 (a VARBINARY(4), b INET4); +INSERT INTO t1 VALUES (CONCAT(0xFF,REPEAT(0x00,2),0xFF), NULL); +UPDATE t1 SET b=a; +SELECT b FROM t1; +DROP TABLE t1; + +CREATE TABLE t1 (a BLOB, b INET4); +INSERT INTO t1 VALUES (CONCAT(0xFF,REPEAT(0x00,2),0xFF), NULL); +UPDATE t1 SET b=a; +SELECT b FROM t1; +DROP TABLE t1; + + +# QQ +#--echo # +#--echo # Limit clause parameter +#--echo # TODO: this should fail. +#--echo # The test for a valid data type should be moved +#--echo # from parse time to fix_fields() time, and performed +#--echo # for both Item_splocal and Item_param. +#--echo # +# +#EXECUTE IMMEDIATE 'SELECT 1 FROM DUAL LIMIT ?' USING CAST('0.0.0.0' AS INET4); + +# QQ +### TODO: +### - Add hooks to run mysql_client_test with pluggable data types +### +### - This should fail with the "illegal data type" error: +###SELECT CAST('0.0.0.0' AS INET4) DIV 1; +### +### - This should fail with the "illegal data type" error: +### EXTRACT(MINUTE...) +### + + +--echo # +--echo # MDEV-20785 Converting INET6 to CHAR(39) produces garbage without a warning +--echo # + +CREATE OR REPLACE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('10.11.12.13'); +SELECT CAST(a AS CHAR(15)) FROM t1; +ALTER TABLE t1 MODIFY a CHAR(15); +SELECT * FROM t1; +DROP TABLE t1; + +--echo # +--echo # MDEV-20783 INET6 cannot be converted to BINARY(16) (requires clarification in documentation) +--echo # + +CREATE OR REPLACE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('10.11.12.13'); +ALTER TABLE t1 MODIFY a BINARY(4); +SELECT HEX(a) FROM t1; +DROP TABLE t1; + +--echo # +--echo # MDEV-20795 CAST(inet6 AS BINARY) returns wrong result +--echo # + +CREATE OR REPLACE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('10.11.12.13'); +SELECT HEX(CAST(a AS BINARY)) FROM t1; +SELECT HEX(CAST(a AS BINARY(4))) FROM t1; +DROP TABLE t1; + +--echo # +--echo # MDEV-20808 CAST from INET6 to FLOAT does not produce an error +--echo # + +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('0.0.0.0'); +--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION +SELECT CAST(a AS FLOAT) FROM t1; +DROP TABLE t1; + +--echo # +--echo # MDEV-20798 Conversion from INET6 to other types performed without errors or warnings +--echo # + +CREATE TABLE t1 (a INET4, b INT); +INSERT INTO t1 (a) VALUES ('0.0.0.0'); +--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION +UPDATE t1 SET b=a; +SELECT * FROM t1; +DROP TABLE t1; + +SET timestamp=UNIX_TIMESTAMP('2001-01-01 10:20:30'); +CREATE TABLE t1 (a INET4, b TIMESTAMP); +INSERT INTO t1 (a) VALUES ('0.0.0.0'); +--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION +UPDATE t1 SET b=a; +SELECT * FROM t1; +DROP TABLE t1; +SET timestamp=DEFAULT; + +CREATE OR REPLACE TABLE t1 (a INET4); +INSERT INTO t1 (a) VALUES ('0.0.0.0'); +--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION +ALTER TABLE t1 MODIFY a DATE; +DROP TABLE t1; + +--echo # +--echo # MDEV-20818 ER_CRASHED_ON_USAGE or Assertion `length <= column->length' failed in write_block_record on temporary table +--echo # + +CREATE TABLE t1 (a INET4); +--enable_metadata +SELECT + CAST(a AS BINARY(0)), + CAST(a AS BINARY(1)), + CAST(a AS BINARY(16)), + CAST(a AS BINARY(255)), + CAST(a AS BINARY(256)), + CAST(a AS BINARY(512)), + CAST(a AS BINARY(513)), + CAST(a AS BINARY(65532)), + CAST(a AS BINARY(65533)), + CAST(a AS BINARY(65534)), + CAST(a AS BINARY(65535)), + CAST(a AS BINARY(65536)), + CAST(a AS BINARY(16777215)), + CAST(a AS BINARY(16777216)) +FROM t1; +--disable_metadata +DROP TABLE t1; + +--echo # +--echo # MDEV-20826 Wrong result of MIN(inet6) with GROUP BY +--echo # + +CREATE TABLE t1 (id INT, a INET4) ENGINE=MyISAM; +INSERT INTO t1 VALUES (1, '255.0.0.0'),(1, '128.0.0.0'); +SELECT MIN(a), MAX(a) FROM t1 GROUP BY id; +DROP TABLE t1; + + +--echo # +--echo # MDEV-20809 EXTRACT from INET4 value does not produce any warnings +--echo # + +CREATE TABLE t1 (a INET4); +--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION +SELECT EXTRACT(DAY FROM a) FROM t1; +DROP TABLE t1; +--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION +SELECT EXTRACT(DAY FROM CAST('0.0.0.0' AS INET4)); + + +--echo # +--echo # MDEV-22764 Crash with a stored aggregate function returning INET4 +--echo # + +DELIMITER $$; +CREATE OR REPLACE AGGREGATE FUNCTION aggregate_min_inet4(x INET4) RETURNS INET4 +BEGIN + DECLARE res INET4 DEFAULT NULL; + DECLARE CONTINUE HANDLER FOR NOT FOUND + RETURN res; + LOOP + FETCH GROUP NEXT ROW; + IF (res IS NULL) OR (res > x) THEN + SET res= x; + END IF; + END LOOP; +END; +$$ +DELIMITER ;$$ + +CREATE OR REPLACE TABLE t1 (name CHAR(30), val INET4); +INSERT INTO t1 VALUES ('a', '0.0.0.5'); +INSERT INTO t1 VALUES ('a', '0.0.0.3'); +INSERT INTO t1 VALUES ('b', '0.0.0.1'); +INSERT INTO t1 VALUES ('b', '0.0.0.2'); +INSERT INTO t1 VALUES ('b', '0.0.0.5'); +SELECT name, aggregate_min_inet4(val) pc FROM t1 GROUP BY name; + +CREATE OR REPLACE TABLE t2 (name CHAR(30), val INET4); +INSERT INTO t2 SELECT name, aggregate_min_inet4(val) pc FROM t1 GROUP BY name; +SELECT * FROM t2; +DROP TABLE t2; + +DROP TABLE t1; +DROP FUNCTION aggregate_min_inet4; + + +--echo # +--echo # MDEV-20280 PERCENTILE_DISC() rejects temporal and string input +--echo # + +CREATE TABLE t1 (name CHAR(30), star_rating INET4); +INSERT INTO t1 VALUES ('Lord of the Ladybirds', '0.0.0.5'); +INSERT INTO t1 VALUES ('Lord of the Ladybirds', '0.0.0.3'); +INSERT INTO t1 VALUES ('Lady of the Flies', '0.0.0.1'); +INSERT INTO t1 VALUES ('Lady of the Flies', '0.0.0.2'); +INSERT INTO t1 VALUES ('Lady of the Flies', '0.0.0.5'); +SELECT name, PERCENTILE_DISC(0.5) + WITHIN GROUP (ORDER BY star_rating) + OVER (PARTITION BY name) AS pc FROM t1; +SELECT name, PERCENTILE_DISC(0) + WITHIN GROUP (ORDER BY star_rating) + OVER (PARTITION BY name) AS pc FROM t1; +SELECT name, PERCENTILE_DISC(1) + WITHIN GROUP (ORDER BY star_rating) + OVER (PARTITION BY name) AS pc FROM t1; +DROP TABLE t1; + + +--echo # +--echo # MDEV-22758 Assertion `!item->null_value' failed in Type_handler_inet6::make_sort_key_part +--echo # + +CREATE TABLE t1 (a VARCHAR(8) NOT NULL, b INET4 NOT NULL); +INSERT INTO t1 VALUES ('foo','0.0.0.0'),('bar','1.0.0.1'); +SELECT * FROM t1 ORDER BY CASE WHEN a THEN b ELSE a END; +DROP TABLE t1; + +CREATE OR REPLACE TABLE t1 (a VARCHAR(8) NOT NULL); +INSERT INTO t1 VALUES ('foo'),('bar'); +SELECT * FROM t1 ORDER BY CAST(a AS INET4); +DROP TABLE t1; + +CREATE TABLE t1 (a INET4 NOT NULL, b VARCHAR(32) NOT NULL); +CREATE TABLE t2 AS SELECT CAST(a AS INET4) AS ca, CAST(b AS INET4) AS cb FROM t1; +SHOW CREATE TABLE t2; +DROP TABLE t2; + +CREATE TABLE t2 AS SELECT COALESCE(a,a), COALESCE(a,b) FROM t1; +SHOW CREATE TABLE t2; +DROP TABLE t2; + +CREATE TABLE t2 AS SELECT a AS ca,a AS cb FROM t1 UNION SELECT a,b FROM t1; +SHOW CREATE TABLE t2; +DROP TABLE t2; + +DROP TABLE t1; + +--echo # +--echo # MDEV-22758 Assertion `!item->null_value' failed in Type_handler_inet6::make_sort_key_part +--echo # + +CREATE TABLE t1 (c INET4); +INSERT INTO t1 VALUES ('0.0.0.0'),(NULL); +SELECT * FROM t1 ORDER BY IFNULL(c, 'foo'); +DROP TABLE t1; + +CREATE TABLE t1 (c INET4); +INSERT INTO t1 VALUES ('0.0.0.0'),(NULL); + +# Expect a NULL column +CREATE TABLE t2 AS SELECT IFNULL(c, 'foo') FROM t1; +SHOW CREATE TABLE t2; +SELECT * FROM t2; +DROP TABLE t2; + +# Expect a NOT NULL column +CREATE TABLE t2 AS SELECT IFNULL(c, '0.0.0.1') FROM t1; +SHOW CREATE TABLE t2; +SELECT * FROM t2; +DROP TABLE t2; + +DROP TABLE t1; + +--echo # +--echo # MDEV-26732 Assertion `0' failed in Item::val_native +--echo # +# +# This tests Item_copy_fbt::val_native() +SELECT CAST(CONCAT('0.0.0.0', REPEAT('',RAND())) AS INET4) AS f, var_pop('x') FROM dual HAVING f > ''; +SELECT CAST(CONCAT('0.0.0.0', REPEAT('',RAND())) AS INET4) AS f, var_pop(1) FROM dual HAVING f >= '0.0.0.0'; + +# This tests Item_copy_fbt::save_in_field() +CREATE TABLE t1(id INET4 NOT NULL PRIMARY KEY, dsc INET4); +INSERT INTO t1 VALUES ('0.0.0.1', '1.0.0.1'),('0.0.0.3', '1.0.0.3'),('1.0.0.4', NULL); +CREATE TABLE t2 SELECT COALESCE(t1.dsc), COUNT(*) FROM t1 GROUP BY t1.id; +SELECT * FROM t2 ORDER BY 1,2; +DROP TABLE t1, t2; + +--echo # +--echo # MDEV-24619 Wrong result or Assertion `0' in Item::val_native / Type_handler_inet6::Item_val_native_with_conversion +--echo # + +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('0.0.0.0'),('0.0.0.0'); +SELECT IF(1, '0.0.0.0', a) AS f FROM t1 GROUP BY 'foo' HAVING f != ''; +SELECT IF(1, '0.0.0.0', a) AS f FROM t1 GROUP BY 'foo' HAVING f != '0.0.0.0'; +SELECT IF(1, '0.0.0.0', a) AS f FROM t1 GROUP BY 'foo' HAVING f != '0.0.0.1'; +DROP TABLE t1; + +--echo # +--echo # End of 10.10 tests +--echo # diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet4_csv.result b/plugin/type_inet/mysql-test/type_inet/type_inet4_csv.result new file mode 100644 index 00000000000..bfade2b6207 --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet4_csv.result @@ -0,0 +1,54 @@ +# +# Start of 10.10 tests +# +# +# MDEV-23287 The INET4 data type +# +SET default_storage_engine=CSV; +CREATE TABLE t1 (a INET4 NOT NULL); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` inet4 NOT NULL +) ENGINE=CSV DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +FOR i IN 0..255 +DO +INSERT INTO t1 VALUES (CONCAT('0.0.0.', i)); +END FOR +$$ +SELECT * FROM t1 WHERE a='0.0.0.255'; +a +0.0.0.255 +SELECT * FROM t1 WHERE a>='0.0.0.254' ORDER BY a; +a +0.0.0.254 +0.0.0.255 +SELECT * FROM t1 WHERE a IN ('0.0.0.128','0.0.0.160','0.0.0.240') ORDER BY a; +a +0.0.0.128 +0.0.0.160 +0.0.0.240 +SELECT * FROM t1 WHERE a BETWEEN '0.0.0.128' AND '0.0.0.129' ORDER BY a; +a +0.0.0.128 +0.0.0.129 +SELECT * FROM t1 WHERE a=CAST('0.0.0.255' AS INET4); +a +0.0.0.255 +UPDATE t1 SET a=CONCAT('12', a) WHERE a LIKE '0.0.0.14_'; +SELECT * FROM t1 WHERE a LIKE '12%' ORDER BY a; +a +120.0.0.140 +120.0.0.141 +120.0.0.142 +120.0.0.143 +120.0.0.144 +120.0.0.145 +120.0.0.146 +120.0.0.147 +120.0.0.148 +120.0.0.149 +DROP TABLE t1; +# +# End of 10.10 tests +# diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet4_csv.test b/plugin/type_inet/mysql-test/type_inet/type_inet4_csv.test new file mode 100644 index 00000000000..2bccf1c1928 --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet4_csv.test @@ -0,0 +1,41 @@ +--source include/have_csv.inc + +--echo # +--echo # Start of 10.10 tests +--echo # + +--echo # +--echo # MDEV-23287 The INET4 data type +--echo # + +SET default_storage_engine=CSV; + +CREATE TABLE t1 (a INET4 NOT NULL); +SHOW CREATE TABLE t1; + +DELIMITER $$; +FOR i IN 0..255 +DO + INSERT INTO t1 VALUES (CONCAT('0.0.0.', i)); +END FOR +$$ +DELIMITER ;$$ + +SELECT * FROM t1 WHERE a='0.0.0.255'; + +SELECT * FROM t1 WHERE a>='0.0.0.254' ORDER BY a; + +SELECT * FROM t1 WHERE a IN ('0.0.0.128','0.0.0.160','0.0.0.240') ORDER BY a; + +SELECT * FROM t1 WHERE a BETWEEN '0.0.0.128' AND '0.0.0.129' ORDER BY a; + +SELECT * FROM t1 WHERE a=CAST('0.0.0.255' AS INET4); + +UPDATE t1 SET a=CONCAT('12', a) WHERE a LIKE '0.0.0.14_'; +SELECT * FROM t1 WHERE a LIKE '12%' ORDER BY a; + +DROP TABLE t1; + +--echo # +--echo # End of 10.10 tests +--echo # diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet4_engines.inc b/plugin/type_inet/mysql-test/type_inet/type_inet4_engines.inc new file mode 100644 index 00000000000..62a5c80a920 --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet4_engines.inc @@ -0,0 +1,38 @@ +--echo # +--echo # Range optimizer +--echo # + +CREATE TABLE t1 (a INET4, INDEX(a)); +SHOW CREATE TABLE t1; + +DELIMITER $$; +FOR i IN 0..255 +DO + INSERT INTO t1 VALUES (CONCAT('0.0.0.', i)); +END FOR +$$ +DELIMITER ;$$ +SELECT * FROM t1 WHERE a='0.0.0.255'; +EXPLAIN SELECT * FROM t1 WHERE a='0.0.0.255'; +SELECT * FROM t1 WHERE a='garbage'; +EXPLAIN SELECT * FROM t1 WHERE a='garbage'; + +SELECT * FROM t1 WHERE a>='0.0.0.254'; +EXPLAIN SELECT * FROM t1 WHERE a>='0.0.0.254'; +SELECT * FROM t1 WHERE a>='garbage'; +EXPLAIN SELECT * FROM t1 WHERE a>='garbage'; + +SELECT * FROM t1 WHERE a IN ('0.0.0.128','0.0.0.160','0.0.0.240'); +EXPLAIN SELECT * FROM t1 WHERE a IN ('0.0.0.128','0.0.0.160','0.0.0.240'); +SELECT * FROM t1 WHERE a IN ('0.0.0.128','0.0.0.160','garbage'); +EXPLAIN SELECT * FROM t1 WHERE a IN ('0.0.0.128','0.0.0.160','garbage'); + +SELECT * FROM t1 WHERE a BETWEEN '0.0.0.128' AND '0.0.0.129'; +EXPLAIN SELECT * FROM t1 WHERE a BETWEEN '0.0.0.128' AND '0.0.0.129'; +SELECT * FROM t1 WHERE a BETWEEN '0.0.0.128' AND 'garbage'; +EXPLAIN SELECT * FROM t1 WHERE a BETWEEN '0.0.0.128' AND 'garbage'; + +SELECT * FROM t1 WHERE a=CAST('0.0.0.255' AS INET4); +EXPLAIN EXTENDED SELECT * FROM t1 WHERE a=CAST('0.0.0.255' AS INET4); + +DROP TABLE t1; diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet4_innodb.result b/plugin/type_inet/mysql-test/type_inet/type_inet4_innodb.result new file mode 100644 index 00000000000..536ceda6d18 --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet4_innodb.result @@ -0,0 +1,119 @@ +# +# Start of 10.10 tests +# +# +# MDEV-23287 The INET4 data type +# +SET default_storage_engine=InnoDB; +# +# Range optimizer +# +CREATE TABLE t1 (a INET4, INDEX(a)); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` inet4 DEFAULT NULL, + KEY `a` (`a`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +FOR i IN 0..255 +DO +INSERT INTO t1 VALUES (CONCAT('0.0.0.', i)); +END FOR +$$ +SELECT * FROM t1 WHERE a='0.0.0.255'; +a +0.0.0.255 +EXPLAIN SELECT * FROM t1 WHERE a='0.0.0.255'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ref a a 5 const 1 Using where; Using index +SELECT * FROM t1 WHERE a='garbage'; +a +Warnings: +Warning 1292 Incorrect inet4 value: 'garbage' +EXPLAIN SELECT * FROM t1 WHERE a='garbage'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables +Warnings: +Warning 1292 Incorrect inet4 value: 'garbage' +SELECT * FROM t1 WHERE a>='0.0.0.254'; +a +0.0.0.254 +0.0.0.255 +EXPLAIN SELECT * FROM t1 WHERE a>='0.0.0.254'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range a a 5 NULL 2 Using where; Using index +SELECT * FROM t1 WHERE a>='garbage'; +a +EXPLAIN SELECT * FROM t1 WHERE a>='garbage'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables +SELECT * FROM t1 WHERE a IN ('0.0.0.128','0.0.0.160','0.0.0.240'); +a +0.0.0.128 +0.0.0.160 +0.0.0.240 +EXPLAIN SELECT * FROM t1 WHERE a IN ('0.0.0.128','0.0.0.160','0.0.0.240'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range a a 5 NULL 3 Using where; Using index +SELECT * FROM t1 WHERE a IN ('0.0.0.128','0.0.0.160','garbage'); +a +0.0.0.128 +0.0.0.160 +Warnings: +Warning 1292 Incorrect inet4 value: 'garbage' +EXPLAIN SELECT * FROM t1 WHERE a IN ('0.0.0.128','0.0.0.160','garbage'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range a a 5 NULL 2 Using where; Using index +Warnings: +Warning 1292 Incorrect inet4 value: 'garbage' +SELECT * FROM t1 WHERE a BETWEEN '0.0.0.128' AND '0.0.0.129'; +a +0.0.0.128 +0.0.0.129 +EXPLAIN SELECT * FROM t1 WHERE a BETWEEN '0.0.0.128' AND '0.0.0.129'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range a a 5 NULL 2 Using where; Using index +SELECT * FROM t1 WHERE a BETWEEN '0.0.0.128' AND 'garbage'; +a +EXPLAIN SELECT * FROM t1 WHERE a BETWEEN '0.0.0.128' AND 'garbage'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables +SELECT * FROM t1 WHERE a=CAST('0.0.0.255' AS INET4); +a +0.0.0.255 +EXPLAIN EXTENDED SELECT * FROM t1 WHERE a=CAST('0.0.0.255' AS INET4); +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ref a a 5 const 1 100.00 Using where; Using index +Warnings: +Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` = INET4'0.0.0.255' +DROP TABLE t1; +# +# MDEV-26742 Assertion `field->type_handler() == this' failed in FixedBinTypeBundle<NATIVE_LEN, MAX_CHAR_LEN>::Type_handler_fbt::stored_field_cmp_to_item +# +CREATE TABLE t1 (pk inet4, c text) engine=myisam; +INSERT INTO t1 VALUES ('0.0.0.0',1); +CREATE TABLE t2 (d text, KEY (d)) engine=innodb ; +Warnings: +Note 1071 Specified key was too long; max key length is 3072 bytes +INSERT INTO t2 VALUES (2); +SELECT * FROM t2 JOIN t1 ON ( t1.pk > t2.d); +d pk c +Warnings: +Warning 1292 Incorrect inet4 value: '2' +UPDATE t2 JOIN t1 ON ( t1.pk > t2.d) SET t1.c = 1; +ERROR 22007: Incorrect inet4 value: '2' +SET sql_mode=''; +UPDATE t2 JOIN t1 ON ( t1.pk > t2.d) SET t1.c = 1; +Warnings: +Warning 1292 Incorrect inet4 value: '2' +SET sql_mode=DEFAULT; +SELECT * FROM t1; +pk c +0.0.0.0 1 +SELECT * FROM t2; +d +2 +DROP TABLE t1, t2; +# +# End of 10.10 tests +# diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet4_innodb.test b/plugin/type_inet/mysql-test/type_inet/type_inet4_innodb.test new file mode 100644 index 00000000000..6e5a1640c83 --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet4_innodb.test @@ -0,0 +1,36 @@ +--source include/have_innodb.inc + +--echo # +--echo # Start of 10.10 tests +--echo # + +--echo # +--echo # MDEV-23287 The INET4 data type +--echo # + + +SET default_storage_engine=InnoDB; +--source type_inet4_engines.inc + +--echo # +--echo # MDEV-26742 Assertion `field->type_handler() == this' failed in FixedBinTypeBundle<NATIVE_LEN, MAX_CHAR_LEN>::Type_handler_fbt::stored_field_cmp_to_item +--echo # + +CREATE TABLE t1 (pk inet4, c text) engine=myisam; +INSERT INTO t1 VALUES ('0.0.0.0',1); +CREATE TABLE t2 (d text, KEY (d)) engine=innodb ; +INSERT INTO t2 VALUES (2); +SELECT * FROM t2 JOIN t1 ON ( t1.pk > t2.d); +--error ER_TRUNCATED_WRONG_VALUE +UPDATE t2 JOIN t1 ON ( t1.pk > t2.d) SET t1.c = 1; +SET sql_mode=''; +UPDATE t2 JOIN t1 ON ( t1.pk > t2.d) SET t1.c = 1; +SET sql_mode=DEFAULT; +SELECT * FROM t1; +SELECT * FROM t2; +DROP TABLE t1, t2; + + +--echo # +--echo # End of 10.10 tests +--echo # diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet4_memory.result b/plugin/type_inet/mysql-test/type_inet/type_inet4_memory.result new file mode 100644 index 00000000000..d48ab70cce8 --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet4_memory.result @@ -0,0 +1,159 @@ +# +# Start of 10.10 tests +# +# +# MDEV-23287 The INET4 data type +# +SET default_storage_engine=MEMORY; +# +# Range optimizer +# +CREATE TABLE t1 (a INET4, INDEX(a)); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` inet4 DEFAULT NULL, + KEY `a` (`a`) +) ENGINE=MEMORY DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +FOR i IN 0..255 +DO +INSERT INTO t1 VALUES (CONCAT('0.0.0.', i)); +END FOR +$$ +SELECT * FROM t1 WHERE a='0.0.0.255'; +a +0.0.0.255 +EXPLAIN SELECT * FROM t1 WHERE a='0.0.0.255'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ref a a 5 const 2 Using where +SELECT * FROM t1 WHERE a='garbage'; +a +Warnings: +Warning 1292 Incorrect inet4 value: 'garbage' +EXPLAIN SELECT * FROM t1 WHERE a='garbage'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables +Warnings: +Warning 1292 Incorrect inet4 value: 'garbage' +SELECT * FROM t1 WHERE a>='0.0.0.254'; +a +0.0.0.254 +0.0.0.255 +EXPLAIN SELECT * FROM t1 WHERE a>='0.0.0.254'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL a NULL NULL NULL 256 Using where +SELECT * FROM t1 WHERE a>='garbage'; +a +Warnings: +Warning 1292 Incorrect inet4 value: 'garbage' +EXPLAIN SELECT * FROM t1 WHERE a>='garbage'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL a NULL NULL NULL 256 Using where +SELECT * FROM t1 WHERE a IN ('0.0.0.128','0.0.0.160','0.0.0.240'); +a +0.0.0.128 +0.0.0.160 +0.0.0.240 +EXPLAIN SELECT * FROM t1 WHERE a IN ('0.0.0.128','0.0.0.160','0.0.0.240'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range a a 5 NULL 6 Using where +SELECT * FROM t1 WHERE a IN ('0.0.0.128','0.0.0.160','garbage'); +a +0.0.0.128 +0.0.0.160 +Warnings: +Warning 1292 Incorrect inet4 value: 'garbage' +EXPLAIN SELECT * FROM t1 WHERE a IN ('0.0.0.128','0.0.0.160','garbage'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range a a 5 NULL 4 Using where +Warnings: +Warning 1292 Incorrect inet4 value: 'garbage' +SELECT * FROM t1 WHERE a BETWEEN '0.0.0.128' AND '0.0.0.129'; +a +0.0.0.128 +0.0.0.129 +EXPLAIN SELECT * FROM t1 WHERE a BETWEEN '0.0.0.128' AND '0.0.0.129'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL a NULL NULL NULL 256 Using where +SELECT * FROM t1 WHERE a BETWEEN '0.0.0.128' AND 'garbage'; +a +Warnings: +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +Warning 1292 Incorrect inet4 value: 'garbage' +EXPLAIN SELECT * FROM t1 WHERE a BETWEEN '0.0.0.128' AND 'garbage'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL a NULL NULL NULL 256 Using where +SELECT * FROM t1 WHERE a=CAST('0.0.0.255' AS INET4); +a +0.0.0.255 +EXPLAIN EXTENDED SELECT * FROM t1 WHERE a=CAST('0.0.0.255' AS INET4); +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ref a a 5 const 2 100.00 Using where +Warnings: +Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` = INET4'0.0.0.255' +DROP TABLE t1; +# +# End of 10.10 tests +# diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet4_memory.test b/plugin/type_inet/mysql-test/type_inet/type_inet4_memory.test new file mode 100644 index 00000000000..8b11f5d9f63 --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet4_memory.test @@ -0,0 +1,16 @@ +--echo # +--echo # Start of 10.10 tests +--echo # + +--echo # +--echo # MDEV-23287 The INET4 data type +--echo # + + +SET default_storage_engine=MEMORY; +--source type_inet4_engines.inc + + +--echo # +--echo # End of 10.10 tests +--echo # diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_date.result b/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_date.result new file mode 100644 index 00000000000..13726b2d142 --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_date.result @@ -0,0 +1,353 @@ +# +# Start of 10.10 tests +# +# +# MDEV-23287 The INET4 data type +# +CREATE TABLE t1 (target INET4 DEFAULT '99.99.99.99', source DATE DEFAULT '2001-01-01'); +# Start of type_store_assignment_incompatible.inc +SET @sql_mode_save= @@sql_mode; +SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS +WHERE COLUMN_NAME='source' + AND TABLE_NAME='t1' + AND TABLE_SCHEMA='test'); +SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS +WHERE COLUMN_NAME='target' + AND TABLE_NAME='t1' + AND TABLE_SCHEMA='test'); +SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN '' + WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore) +ELSE @ignore +END; +CREATE TABLE t2 LIKE t1; +ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST; +INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT); +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `id` int(11) NOT NULL, + `target` inet4 DEFAULT '99.99.99.99', + `source` date DEFAULT '2001-01-01', + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +CREATE TABLE t3 LIKE t2; +INSERT INTO t3 VALUES +(1, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +ERROR HY000: Cannot cast 'date' as 'inet4' in assignment of `test`.`t3`.`target` +DROP TABLE t3; +SET sql_mode=''; +CREATE TABLE t3 LIKE t2; +ALTER TABLE t3 ENGINE=MyISAM; +EXECUTE IMMEDIATE +CONCAT('CREATE VIEW v3 AS SELECT id,', +IF(@target_type='geometry','AsText(target)','target'), ' AS target,', +IF(@source_type='geometry','AsText(source)','source'), ' AS source ', +' FROM t3'); +INSERT INTO t3 VALUES +(1, +(SELECT target FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)), +(2, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +Warnings: +Warning 1292 Incorrect inet4 value: '2001-01-01' for column `test`.`t3`.`target` at row 2 +SELECT * FROM v3; +id target source +1 99.99.99.99 2001-01-01 +2 0.0.0.0 2001-01-01 +TRUNCATE TABLE t3; +SET sql_mode=STRICT_ALL_TABLES; +INSERT INTO t3 VALUES +(1, +(SELECT target FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)), +(2, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +ERROR 22007: Incorrect inet4 value: '2001-01-01' for column `test`.`t3`.`target` at row 2 +SELECT * FROM v3; +id target source +1 99.99.99.99 2001-01-01 +TRUNCATE TABLE t3; +SET sql_mode=@sql_mode_save; +DROP TABLE t3; +DROP VIEW v3; +CREATE TABLE t3 LIKE t2; +INSERT INTO t3 SELECT id,source,source FROM t2; +ERROR HY000: Cannot cast 'date' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2; +ERROR HY000: Cannot cast 'date' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source; +ERROR HY000: Cannot cast 'date' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source; +ERROR HY000: Cannot cast 'date' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source; +ERROR HY000: Cannot cast 'date' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source; +ERROR HY000: Cannot cast 'date' as 'inet4' in assignment of `test`.`t3`.`target` +UPDATE t3 SET target=source; +ERROR HY000: Cannot cast 'date' as 'inet4' in assignment of `test`.`t3`.`target` +UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id; +ERROR HY000: Cannot cast 'date' as 'inet4' in assignment of `test`.`t3`.`target` +SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type); +SELECT @alter; +@alter +ALTER TABLE t3 MODIFY target date +EXECUTE IMMEDIATE @alter; +ERROR HY000: Cannot cast 'inet4' as 'date' in assignment of `test`.`t3`.`target` +DROP TABLE t3; +DROP TABLE t2; +CREATE PROCEDURE p1() +BEGIN +DECLARE src date DEFAULT NULL; +DECLARE dst inet4 DEFAULT NULL; +SET dst=src; +END; +$$ +CALL p1; +ERROR HY000: Cannot cast 'date' as 'inet4' in assignment of `dst` +DROP PROCEDURE p1; +CREATE FUNCTION f1(a inet4) RETURNS INT RETURN NULL;; +SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1)); +ERROR HY000: Cannot cast 'date' as 'inet4' in assignment of `a` +DROP FUNCTION f1; +CREATE PROCEDURE p1(a inet4) BEGIN END;; +CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1)); +ERROR HY000: Cannot cast 'date' as 'inet4' in assignment of `a` +DROP PROCEDURE p1; +CREATE PROCEDURE p1(OUT dst inet4) +BEGIN +DECLARE src date DEFAULT NULL; +SET dst=src; +END; +$$ +CREATE PROCEDURE p2() +BEGIN +DECLARE dst inet4 DEFAULT NULL; +CALL p1(dst); +END; +$$ +CALL p2(); +ERROR HY000: Cannot cast 'date' as 'inet4' in assignment of `dst` +SHOW WARNINGS; +Level Code Message +Error 4078 Cannot cast 'date' as 'inet4' in assignment of `dst` +Note 4094 At line 4 in test.p1 +Note 4094 At line 4 in test.p2 +DROP PROCEDURE p2; +DROP PROCEDURE p1; +CREATE FUNCTION f1() RETURNS inet4 +BEGIN +DECLARE rc date DEFAULT NULL; +RETURN rc; +END; +$$ +SELECT f1(); +ERROR HY000: Cannot cast 'date' as 'inet4' in assignment of `f1()` +DROP FUNCTION f1; +CREATE PROCEDURE p1() +BEGIN +DECLARE src date DEFAULT NULL; +DECLARE cur1 CURSOR(t inet4) FOR SELECT * FROM t1 WHERE target=t; +OPEN cur1(src); +CLOSE cur1; +END; +$$ +CALL p1(); +ERROR HY000: Cannot cast 'date' as 'inet4' in assignment of `t` +DROP PROCEDURE p1; +CREATE TABLE t2 LIKE t1; +INSERT INTO t2 VALUES (); +CREATE PROCEDURE p1() +BEGIN +DECLARE dst inet4 DEFAULT NULL; +DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1; +OPEN cur2; +FETCH cur2 INTO dst; +CLOSE cur2; +END; +$$ +CALL p1(); +ERROR HY000: Cannot cast 'date' as 'inet4' in assignment of `dst` +DROP PROCEDURE p1; +DROP TABLE t2; +# End of type_store_assignment_incompatible.inc +DROP TABLE t1; +CREATE TABLE t1 (target DATE DEFAULT '2001-01-01', source INET4 DEFAULT '99.99.99.99'); +# Start of type_store_assignment_incompatible.inc +SET @sql_mode_save= @@sql_mode; +SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS +WHERE COLUMN_NAME='source' + AND TABLE_NAME='t1' + AND TABLE_SCHEMA='test'); +SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS +WHERE COLUMN_NAME='target' + AND TABLE_NAME='t1' + AND TABLE_SCHEMA='test'); +SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN '' + WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore) +ELSE @ignore +END; +CREATE TABLE t2 LIKE t1; +ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST; +INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT); +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `id` int(11) NOT NULL, + `target` date DEFAULT '2001-01-01', + `source` inet4 DEFAULT '99.99.99.99', + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +CREATE TABLE t3 LIKE t2; +INSERT INTO t3 VALUES +(1, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +ERROR HY000: Cannot cast 'inet4' as 'date' in assignment of `test`.`t3`.`target` +DROP TABLE t3; +SET sql_mode=''; +CREATE TABLE t3 LIKE t2; +ALTER TABLE t3 ENGINE=MyISAM; +EXECUTE IMMEDIATE +CONCAT('CREATE VIEW v3 AS SELECT id,', +IF(@target_type='geometry','AsText(target)','target'), ' AS target,', +IF(@source_type='geometry','AsText(source)','source'), ' AS source ', +' FROM t3'); +INSERT INTO t3 VALUES +(1, +(SELECT target FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)), +(2, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +Warnings: +Warning 1265 Data truncated for column 'target' at row 2 +SELECT * FROM v3; +id target source +1 2001-01-01 99.99.99.99 +2 0000-00-00 99.99.99.99 +TRUNCATE TABLE t3; +SET sql_mode=STRICT_ALL_TABLES; +INSERT INTO t3 VALUES +(1, +(SELECT target FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)), +(2, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +ERROR 22007: Incorrect date value: '99.99.99.99' for column `test`.`t3`.`target` at row 2 +SELECT * FROM v3; +id target source +1 2001-01-01 99.99.99.99 +TRUNCATE TABLE t3; +SET sql_mode=@sql_mode_save; +DROP TABLE t3; +DROP VIEW v3; +CREATE TABLE t3 LIKE t2; +INSERT INTO t3 SELECT id,source,source FROM t2; +ERROR HY000: Cannot cast 'inet4' as 'date' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2; +ERROR HY000: Cannot cast 'inet4' as 'date' in assignment of `test`.`t3`.`target` +INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source; +ERROR HY000: Cannot cast 'inet4' as 'date' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source; +ERROR HY000: Cannot cast 'inet4' as 'date' in assignment of `test`.`t3`.`target` +INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source; +ERROR HY000: Cannot cast 'inet4' as 'date' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source; +ERROR HY000: Cannot cast 'inet4' as 'date' in assignment of `test`.`t3`.`target` +UPDATE t3 SET target=source; +ERROR HY000: Cannot cast 'inet4' as 'date' in assignment of `test`.`t3`.`target` +UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id; +ERROR HY000: Cannot cast 'inet4' as 'date' in assignment of `test`.`t3`.`target` +SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type); +SELECT @alter; +@alter +ALTER TABLE t3 MODIFY target inet4 +EXECUTE IMMEDIATE @alter; +ERROR HY000: Cannot cast 'date' as 'inet4' in assignment of `test`.`t3`.`target` +DROP TABLE t3; +DROP TABLE t2; +CREATE PROCEDURE p1() +BEGIN +DECLARE src inet4 DEFAULT NULL; +DECLARE dst date DEFAULT NULL; +SET dst=src; +END; +$$ +CALL p1; +ERROR HY000: Cannot cast 'inet4' as 'date' in assignment of `dst` +DROP PROCEDURE p1; +CREATE FUNCTION f1(a date) RETURNS INT RETURN NULL;; +SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1)); +ERROR HY000: Cannot cast 'inet4' as 'date' in assignment of `a` +DROP FUNCTION f1; +CREATE PROCEDURE p1(a date) BEGIN END;; +CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1)); +ERROR HY000: Cannot cast 'inet4' as 'date' in assignment of `a` +DROP PROCEDURE p1; +CREATE PROCEDURE p1(OUT dst date) +BEGIN +DECLARE src inet4 DEFAULT NULL; +SET dst=src; +END; +$$ +CREATE PROCEDURE p2() +BEGIN +DECLARE dst date DEFAULT NULL; +CALL p1(dst); +END; +$$ +CALL p2(); +ERROR HY000: Cannot cast 'inet4' as 'date' in assignment of `dst` +SHOW WARNINGS; +Level Code Message +Error 4078 Cannot cast 'inet4' as 'date' in assignment of `dst` +Note 4094 At line 4 in test.p1 +Note 4094 At line 4 in test.p2 +DROP PROCEDURE p2; +DROP PROCEDURE p1; +CREATE FUNCTION f1() RETURNS date +BEGIN +DECLARE rc inet4 DEFAULT NULL; +RETURN rc; +END; +$$ +SELECT f1(); +ERROR HY000: Cannot cast 'inet4' as 'date' in assignment of `f1()` +DROP FUNCTION f1; +CREATE PROCEDURE p1() +BEGIN +DECLARE src inet4 DEFAULT NULL; +DECLARE cur1 CURSOR(t date) FOR SELECT * FROM t1 WHERE target=t; +OPEN cur1(src); +CLOSE cur1; +END; +$$ +CALL p1(); +ERROR HY000: Cannot cast 'inet4' as 'date' in assignment of `t` +DROP PROCEDURE p1; +CREATE TABLE t2 LIKE t1; +INSERT INTO t2 VALUES (); +CREATE PROCEDURE p1() +BEGIN +DECLARE dst date DEFAULT NULL; +DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1; +OPEN cur2; +FETCH cur2 INTO dst; +CLOSE cur2; +END; +$$ +CALL p1(); +ERROR HY000: Cannot cast 'inet4' as 'date' in assignment of `dst` +DROP PROCEDURE p1; +DROP TABLE t2; +# End of type_store_assignment_incompatible.inc +DROP TABLE t1; +# +# End of 10.10 tests +# diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_date.test b/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_date.test new file mode 100644 index 00000000000..424c99f6c4d --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_date.test @@ -0,0 +1,26 @@ +--echo # +--echo # Start of 10.10 tests +--echo # + +--echo # +--echo # MDEV-23287 The INET4 data type +--echo # + +# +# The DATE data type has loose control on the incoming data, +# so values like '0.0.0.0' do not fail when get inserted to a DATE field +# even though there is an obvious redundant part - the fourth number. +# Using '99.99.99.99' to make sure the month part is out of the range +# to guarantee the failure. + +CREATE TABLE t1 (target INET4 DEFAULT '99.99.99.99', source DATE DEFAULT '2001-01-01'); +--source include/type_mix_incompatible.inc +DROP TABLE t1; + +CREATE TABLE t1 (target DATE DEFAULT '2001-01-01', source INET4 DEFAULT '99.99.99.99'); +--source include/type_mix_incompatible.inc +DROP TABLE t1; + +--echo # +--echo # End of 10.10 tests +--echo # diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_datetime.result b/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_datetime.result new file mode 100644 index 00000000000..7c7194f6be7 --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_datetime.result @@ -0,0 +1,353 @@ +# +# Start of 10.10 tests +# +# +# MDEV-23287 The INET4 data type +# +CREATE TABLE t1 (target INET4 DEFAULT '99.99.99.99', source DATETIME DEFAULT '2001-01-01 10:20:30'); +# Start of type_store_assignment_incompatible.inc +SET @sql_mode_save= @@sql_mode; +SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS +WHERE COLUMN_NAME='source' + AND TABLE_NAME='t1' + AND TABLE_SCHEMA='test'); +SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS +WHERE COLUMN_NAME='target' + AND TABLE_NAME='t1' + AND TABLE_SCHEMA='test'); +SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN '' + WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore) +ELSE @ignore +END; +CREATE TABLE t2 LIKE t1; +ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST; +INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT); +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `id` int(11) NOT NULL, + `target` inet4 DEFAULT '99.99.99.99', + `source` datetime DEFAULT '2001-01-01 10:20:30', + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +CREATE TABLE t3 LIKE t2; +INSERT INTO t3 VALUES +(1, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +ERROR HY000: Cannot cast 'datetime' as 'inet4' in assignment of `test`.`t3`.`target` +DROP TABLE t3; +SET sql_mode=''; +CREATE TABLE t3 LIKE t2; +ALTER TABLE t3 ENGINE=MyISAM; +EXECUTE IMMEDIATE +CONCAT('CREATE VIEW v3 AS SELECT id,', +IF(@target_type='geometry','AsText(target)','target'), ' AS target,', +IF(@source_type='geometry','AsText(source)','source'), ' AS source ', +' FROM t3'); +INSERT INTO t3 VALUES +(1, +(SELECT target FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)), +(2, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +Warnings: +Warning 1292 Incorrect inet4 value: '2001-01-01 10:20:30' for column `test`.`t3`.`target` at row 2 +SELECT * FROM v3; +id target source +1 99.99.99.99 2001-01-01 10:20:30 +2 0.0.0.0 2001-01-01 10:20:30 +TRUNCATE TABLE t3; +SET sql_mode=STRICT_ALL_TABLES; +INSERT INTO t3 VALUES +(1, +(SELECT target FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)), +(2, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +ERROR 22007: Incorrect inet4 value: '2001-01-01 10:20:30' for column `test`.`t3`.`target` at row 2 +SELECT * FROM v3; +id target source +1 99.99.99.99 2001-01-01 10:20:30 +TRUNCATE TABLE t3; +SET sql_mode=@sql_mode_save; +DROP TABLE t3; +DROP VIEW v3; +CREATE TABLE t3 LIKE t2; +INSERT INTO t3 SELECT id,source,source FROM t2; +ERROR HY000: Cannot cast 'datetime' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2; +ERROR HY000: Cannot cast 'datetime' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source; +ERROR HY000: Cannot cast 'datetime' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source; +ERROR HY000: Cannot cast 'datetime' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source; +ERROR HY000: Cannot cast 'datetime' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source; +ERROR HY000: Cannot cast 'datetime' as 'inet4' in assignment of `test`.`t3`.`target` +UPDATE t3 SET target=source; +ERROR HY000: Cannot cast 'datetime' as 'inet4' in assignment of `test`.`t3`.`target` +UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id; +ERROR HY000: Cannot cast 'datetime' as 'inet4' in assignment of `test`.`t3`.`target` +SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type); +SELECT @alter; +@alter +ALTER TABLE t3 MODIFY target datetime +EXECUTE IMMEDIATE @alter; +ERROR HY000: Cannot cast 'inet4' as 'datetime' in assignment of `test`.`t3`.`target` +DROP TABLE t3; +DROP TABLE t2; +CREATE PROCEDURE p1() +BEGIN +DECLARE src datetime DEFAULT NULL; +DECLARE dst inet4 DEFAULT NULL; +SET dst=src; +END; +$$ +CALL p1; +ERROR HY000: Cannot cast 'datetime' as 'inet4' in assignment of `dst` +DROP PROCEDURE p1; +CREATE FUNCTION f1(a inet4) RETURNS INT RETURN NULL;; +SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1)); +ERROR HY000: Cannot cast 'datetime' as 'inet4' in assignment of `a` +DROP FUNCTION f1; +CREATE PROCEDURE p1(a inet4) BEGIN END;; +CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1)); +ERROR HY000: Cannot cast 'datetime' as 'inet4' in assignment of `a` +DROP PROCEDURE p1; +CREATE PROCEDURE p1(OUT dst inet4) +BEGIN +DECLARE src datetime DEFAULT NULL; +SET dst=src; +END; +$$ +CREATE PROCEDURE p2() +BEGIN +DECLARE dst inet4 DEFAULT NULL; +CALL p1(dst); +END; +$$ +CALL p2(); +ERROR HY000: Cannot cast 'datetime' as 'inet4' in assignment of `dst` +SHOW WARNINGS; +Level Code Message +Error 4078 Cannot cast 'datetime' as 'inet4' in assignment of `dst` +Note 4094 At line 4 in test.p1 +Note 4094 At line 4 in test.p2 +DROP PROCEDURE p2; +DROP PROCEDURE p1; +CREATE FUNCTION f1() RETURNS inet4 +BEGIN +DECLARE rc datetime DEFAULT NULL; +RETURN rc; +END; +$$ +SELECT f1(); +ERROR HY000: Cannot cast 'datetime' as 'inet4' in assignment of `f1()` +DROP FUNCTION f1; +CREATE PROCEDURE p1() +BEGIN +DECLARE src datetime DEFAULT NULL; +DECLARE cur1 CURSOR(t inet4) FOR SELECT * FROM t1 WHERE target=t; +OPEN cur1(src); +CLOSE cur1; +END; +$$ +CALL p1(); +ERROR HY000: Cannot cast 'datetime' as 'inet4' in assignment of `t` +DROP PROCEDURE p1; +CREATE TABLE t2 LIKE t1; +INSERT INTO t2 VALUES (); +CREATE PROCEDURE p1() +BEGIN +DECLARE dst inet4 DEFAULT NULL; +DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1; +OPEN cur2; +FETCH cur2 INTO dst; +CLOSE cur2; +END; +$$ +CALL p1(); +ERROR HY000: Cannot cast 'datetime' as 'inet4' in assignment of `dst` +DROP PROCEDURE p1; +DROP TABLE t2; +# End of type_store_assignment_incompatible.inc +DROP TABLE t1; +CREATE TABLE t1 (target DATETIME DEFAULT '2001-01-01 10:20:30', source INET4 DEFAULT '99.99.99.99'); +# Start of type_store_assignment_incompatible.inc +SET @sql_mode_save= @@sql_mode; +SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS +WHERE COLUMN_NAME='source' + AND TABLE_NAME='t1' + AND TABLE_SCHEMA='test'); +SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS +WHERE COLUMN_NAME='target' + AND TABLE_NAME='t1' + AND TABLE_SCHEMA='test'); +SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN '' + WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore) +ELSE @ignore +END; +CREATE TABLE t2 LIKE t1; +ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST; +INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT); +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `id` int(11) NOT NULL, + `target` datetime DEFAULT '2001-01-01 10:20:30', + `source` inet4 DEFAULT '99.99.99.99', + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +CREATE TABLE t3 LIKE t2; +INSERT INTO t3 VALUES +(1, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +ERROR HY000: Cannot cast 'inet4' as 'datetime' in assignment of `test`.`t3`.`target` +DROP TABLE t3; +SET sql_mode=''; +CREATE TABLE t3 LIKE t2; +ALTER TABLE t3 ENGINE=MyISAM; +EXECUTE IMMEDIATE +CONCAT('CREATE VIEW v3 AS SELECT id,', +IF(@target_type='geometry','AsText(target)','target'), ' AS target,', +IF(@source_type='geometry','AsText(source)','source'), ' AS source ', +' FROM t3'); +INSERT INTO t3 VALUES +(1, +(SELECT target FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)), +(2, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +Warnings: +Warning 1265 Data truncated for column 'target' at row 2 +SELECT * FROM v3; +id target source +1 2001-01-01 10:20:30 99.99.99.99 +2 0000-00-00 00:00:00 99.99.99.99 +TRUNCATE TABLE t3; +SET sql_mode=STRICT_ALL_TABLES; +INSERT INTO t3 VALUES +(1, +(SELECT target FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)), +(2, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +ERROR 22007: Incorrect datetime value: '99.99.99.99' for column `test`.`t3`.`target` at row 2 +SELECT * FROM v3; +id target source +1 2001-01-01 10:20:30 99.99.99.99 +TRUNCATE TABLE t3; +SET sql_mode=@sql_mode_save; +DROP TABLE t3; +DROP VIEW v3; +CREATE TABLE t3 LIKE t2; +INSERT INTO t3 SELECT id,source,source FROM t2; +ERROR HY000: Cannot cast 'inet4' as 'datetime' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2; +ERROR HY000: Cannot cast 'inet4' as 'datetime' in assignment of `test`.`t3`.`target` +INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source; +ERROR HY000: Cannot cast 'inet4' as 'datetime' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source; +ERROR HY000: Cannot cast 'inet4' as 'datetime' in assignment of `test`.`t3`.`target` +INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source; +ERROR HY000: Cannot cast 'inet4' as 'datetime' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source; +ERROR HY000: Cannot cast 'inet4' as 'datetime' in assignment of `test`.`t3`.`target` +UPDATE t3 SET target=source; +ERROR HY000: Cannot cast 'inet4' as 'datetime' in assignment of `test`.`t3`.`target` +UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id; +ERROR HY000: Cannot cast 'inet4' as 'datetime' in assignment of `test`.`t3`.`target` +SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type); +SELECT @alter; +@alter +ALTER TABLE t3 MODIFY target inet4 +EXECUTE IMMEDIATE @alter; +ERROR HY000: Cannot cast 'datetime' as 'inet4' in assignment of `test`.`t3`.`target` +DROP TABLE t3; +DROP TABLE t2; +CREATE PROCEDURE p1() +BEGIN +DECLARE src inet4 DEFAULT NULL; +DECLARE dst datetime DEFAULT NULL; +SET dst=src; +END; +$$ +CALL p1; +ERROR HY000: Cannot cast 'inet4' as 'datetime' in assignment of `dst` +DROP PROCEDURE p1; +CREATE FUNCTION f1(a datetime) RETURNS INT RETURN NULL;; +SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1)); +ERROR HY000: Cannot cast 'inet4' as 'datetime' in assignment of `a` +DROP FUNCTION f1; +CREATE PROCEDURE p1(a datetime) BEGIN END;; +CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1)); +ERROR HY000: Cannot cast 'inet4' as 'datetime' in assignment of `a` +DROP PROCEDURE p1; +CREATE PROCEDURE p1(OUT dst datetime) +BEGIN +DECLARE src inet4 DEFAULT NULL; +SET dst=src; +END; +$$ +CREATE PROCEDURE p2() +BEGIN +DECLARE dst datetime DEFAULT NULL; +CALL p1(dst); +END; +$$ +CALL p2(); +ERROR HY000: Cannot cast 'inet4' as 'datetime' in assignment of `dst` +SHOW WARNINGS; +Level Code Message +Error 4078 Cannot cast 'inet4' as 'datetime' in assignment of `dst` +Note 4094 At line 4 in test.p1 +Note 4094 At line 4 in test.p2 +DROP PROCEDURE p2; +DROP PROCEDURE p1; +CREATE FUNCTION f1() RETURNS datetime +BEGIN +DECLARE rc inet4 DEFAULT NULL; +RETURN rc; +END; +$$ +SELECT f1(); +ERROR HY000: Cannot cast 'inet4' as 'datetime' in assignment of `f1()` +DROP FUNCTION f1; +CREATE PROCEDURE p1() +BEGIN +DECLARE src inet4 DEFAULT NULL; +DECLARE cur1 CURSOR(t datetime) FOR SELECT * FROM t1 WHERE target=t; +OPEN cur1(src); +CLOSE cur1; +END; +$$ +CALL p1(); +ERROR HY000: Cannot cast 'inet4' as 'datetime' in assignment of `t` +DROP PROCEDURE p1; +CREATE TABLE t2 LIKE t1; +INSERT INTO t2 VALUES (); +CREATE PROCEDURE p1() +BEGIN +DECLARE dst datetime DEFAULT NULL; +DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1; +OPEN cur2; +FETCH cur2 INTO dst; +CLOSE cur2; +END; +$$ +CALL p1(); +ERROR HY000: Cannot cast 'inet4' as 'datetime' in assignment of `dst` +DROP PROCEDURE p1; +DROP TABLE t2; +# End of type_store_assignment_incompatible.inc +DROP TABLE t1; +# +# End of 10.10 tests +# diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_datetime.test b/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_datetime.test new file mode 100644 index 00000000000..06495e70fef --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_datetime.test @@ -0,0 +1,25 @@ +--echo # +--echo # Start of 10.10 tests +--echo # + +--echo # +--echo # MDEV-23287 The INET4 data type +--echo # + +# +# The DATETIME data type has loose control on the incoming data, +# so values like '0.0.0.0' do not fail when get inserted to a DATETIME field. +# Using '99.99.99.99' to make sure the month part is out of the range +# to guarantee the failure. + +CREATE TABLE t1 (target INET4 DEFAULT '99.99.99.99', source DATETIME DEFAULT '2001-01-01 10:20:30'); +--source include/type_mix_incompatible.inc +DROP TABLE t1; + +CREATE TABLE t1 (target DATETIME DEFAULT '2001-01-01 10:20:30', source INET4 DEFAULT '99.99.99.99'); +--source include/type_mix_incompatible.inc +DROP TABLE t1; + +--echo # +--echo # End of 10.10 tests +--echo # diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_decimal.result b/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_decimal.result new file mode 100644 index 00000000000..3b93c2fd9da --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_decimal.result @@ -0,0 +1,353 @@ +# +# Start of 10.10 tests +# +# +# MDEV-23287 The INET4 data type +# +CREATE TABLE t1 (target INET4 DEFAULT '0.0.0.0', source DECIMAL(32,0) DEFAULT 0); +# Start of type_store_assignment_incompatible.inc +SET @sql_mode_save= @@sql_mode; +SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS +WHERE COLUMN_NAME='source' + AND TABLE_NAME='t1' + AND TABLE_SCHEMA='test'); +SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS +WHERE COLUMN_NAME='target' + AND TABLE_NAME='t1' + AND TABLE_SCHEMA='test'); +SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN '' + WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore) +ELSE @ignore +END; +CREATE TABLE t2 LIKE t1; +ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST; +INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT); +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `id` int(11) NOT NULL, + `target` inet4 DEFAULT '0.0.0.0', + `source` decimal(32,0) DEFAULT 0, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +CREATE TABLE t3 LIKE t2; +INSERT INTO t3 VALUES +(1, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +ERROR HY000: Cannot cast 'decimal' as 'inet4' in assignment of `test`.`t3`.`target` +DROP TABLE t3; +SET sql_mode=''; +CREATE TABLE t3 LIKE t2; +ALTER TABLE t3 ENGINE=MyISAM; +EXECUTE IMMEDIATE +CONCAT('CREATE VIEW v3 AS SELECT id,', +IF(@target_type='geometry','AsText(target)','target'), ' AS target,', +IF(@source_type='geometry','AsText(source)','source'), ' AS source ', +' FROM t3'); +INSERT INTO t3 VALUES +(1, +(SELECT target FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)), +(2, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +Warnings: +Warning 1292 Incorrect inet4 value: '0' for column `test`.`t3`.`target` at row 2 +SELECT * FROM v3; +id target source +1 0.0.0.0 0 +2 0.0.0.0 0 +TRUNCATE TABLE t3; +SET sql_mode=STRICT_ALL_TABLES; +INSERT INTO t3 VALUES +(1, +(SELECT target FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)), +(2, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +ERROR 22007: Incorrect inet4 value: '0' for column `test`.`t3`.`target` at row 2 +SELECT * FROM v3; +id target source +1 0.0.0.0 0 +TRUNCATE TABLE t3; +SET sql_mode=@sql_mode_save; +DROP TABLE t3; +DROP VIEW v3; +CREATE TABLE t3 LIKE t2; +INSERT INTO t3 SELECT id,source,source FROM t2; +ERROR HY000: Cannot cast 'decimal' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2; +ERROR HY000: Cannot cast 'decimal' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source; +ERROR HY000: Cannot cast 'decimal' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source; +ERROR HY000: Cannot cast 'decimal' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source; +ERROR HY000: Cannot cast 'decimal' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source; +ERROR HY000: Cannot cast 'decimal' as 'inet4' in assignment of `test`.`t3`.`target` +UPDATE t3 SET target=source; +ERROR HY000: Cannot cast 'decimal' as 'inet4' in assignment of `test`.`t3`.`target` +UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id; +ERROR HY000: Cannot cast 'decimal' as 'inet4' in assignment of `test`.`t3`.`target` +SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type); +SELECT @alter; +@alter +ALTER TABLE t3 MODIFY target decimal(32,0) +EXECUTE IMMEDIATE @alter; +ERROR HY000: Cannot cast 'inet4' as 'decimal' in assignment of `test`.`t3`.`target` +DROP TABLE t3; +DROP TABLE t2; +CREATE PROCEDURE p1() +BEGIN +DECLARE src decimal(32,0) DEFAULT NULL; +DECLARE dst inet4 DEFAULT NULL; +SET dst=src; +END; +$$ +CALL p1; +ERROR HY000: Cannot cast 'decimal' as 'inet4' in assignment of `dst` +DROP PROCEDURE p1; +CREATE FUNCTION f1(a inet4) RETURNS INT RETURN NULL;; +SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1)); +ERROR HY000: Cannot cast 'decimal' as 'inet4' in assignment of `a` +DROP FUNCTION f1; +CREATE PROCEDURE p1(a inet4) BEGIN END;; +CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1)); +ERROR HY000: Cannot cast 'decimal' as 'inet4' in assignment of `a` +DROP PROCEDURE p1; +CREATE PROCEDURE p1(OUT dst inet4) +BEGIN +DECLARE src decimal(32,0) DEFAULT NULL; +SET dst=src; +END; +$$ +CREATE PROCEDURE p2() +BEGIN +DECLARE dst inet4 DEFAULT NULL; +CALL p1(dst); +END; +$$ +CALL p2(); +ERROR HY000: Cannot cast 'decimal' as 'inet4' in assignment of `dst` +SHOW WARNINGS; +Level Code Message +Error 4078 Cannot cast 'decimal' as 'inet4' in assignment of `dst` +Note 4094 At line 4 in test.p1 +Note 4094 At line 4 in test.p2 +DROP PROCEDURE p2; +DROP PROCEDURE p1; +CREATE FUNCTION f1() RETURNS inet4 +BEGIN +DECLARE rc decimal(32,0) DEFAULT NULL; +RETURN rc; +END; +$$ +SELECT f1(); +ERROR HY000: Cannot cast 'decimal' as 'inet4' in assignment of `f1()` +DROP FUNCTION f1; +CREATE PROCEDURE p1() +BEGIN +DECLARE src decimal(32,0) DEFAULT NULL; +DECLARE cur1 CURSOR(t inet4) FOR SELECT * FROM t1 WHERE target=t; +OPEN cur1(src); +CLOSE cur1; +END; +$$ +CALL p1(); +ERROR HY000: Cannot cast 'decimal' as 'inet4' in assignment of `t` +DROP PROCEDURE p1; +CREATE TABLE t2 LIKE t1; +INSERT INTO t2 VALUES (); +CREATE PROCEDURE p1() +BEGIN +DECLARE dst inet4 DEFAULT NULL; +DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1; +OPEN cur2; +FETCH cur2 INTO dst; +CLOSE cur2; +END; +$$ +CALL p1(); +ERROR HY000: Cannot cast 'decimal' as 'inet4' in assignment of `dst` +DROP PROCEDURE p1; +DROP TABLE t2; +# End of type_store_assignment_incompatible.inc +DROP TABLE t1; +CREATE TABLE t1 (target DECIMAL(32,0) DEFAULT 0, source INET4 DEFAULT '0.0.0.0'); +# Start of type_store_assignment_incompatible.inc +SET @sql_mode_save= @@sql_mode; +SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS +WHERE COLUMN_NAME='source' + AND TABLE_NAME='t1' + AND TABLE_SCHEMA='test'); +SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS +WHERE COLUMN_NAME='target' + AND TABLE_NAME='t1' + AND TABLE_SCHEMA='test'); +SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN '' + WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore) +ELSE @ignore +END; +CREATE TABLE t2 LIKE t1; +ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST; +INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT); +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `id` int(11) NOT NULL, + `target` decimal(32,0) DEFAULT 0, + `source` inet4 DEFAULT '0.0.0.0', + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +CREATE TABLE t3 LIKE t2; +INSERT INTO t3 VALUES +(1, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +ERROR HY000: Cannot cast 'inet4' as 'decimal' in assignment of `test`.`t3`.`target` +DROP TABLE t3; +SET sql_mode=''; +CREATE TABLE t3 LIKE t2; +ALTER TABLE t3 ENGINE=MyISAM; +EXECUTE IMMEDIATE +CONCAT('CREATE VIEW v3 AS SELECT id,', +IF(@target_type='geometry','AsText(target)','target'), ' AS target,', +IF(@source_type='geometry','AsText(source)','source'), ' AS source ', +' FROM t3'); +INSERT INTO t3 VALUES +(1, +(SELECT target FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)), +(2, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +Warnings: +Warning 1265 Data truncated for column 'target' at row 2 +SELECT * FROM v3; +id target source +1 0 0.0.0.0 +2 0 0.0.0.0 +TRUNCATE TABLE t3; +SET sql_mode=STRICT_ALL_TABLES; +INSERT INTO t3 VALUES +(1, +(SELECT target FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)), +(2, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +ERROR 01000: Data truncated for column 'target' at row 2 +SELECT * FROM v3; +id target source +1 0 0.0.0.0 +TRUNCATE TABLE t3; +SET sql_mode=@sql_mode_save; +DROP TABLE t3; +DROP VIEW v3; +CREATE TABLE t3 LIKE t2; +INSERT INTO t3 SELECT id,source,source FROM t2; +ERROR HY000: Cannot cast 'inet4' as 'decimal' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2; +ERROR HY000: Cannot cast 'inet4' as 'decimal' in assignment of `test`.`t3`.`target` +INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source; +ERROR HY000: Cannot cast 'inet4' as 'decimal' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source; +ERROR HY000: Cannot cast 'inet4' as 'decimal' in assignment of `test`.`t3`.`target` +INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source; +ERROR HY000: Cannot cast 'inet4' as 'decimal' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source; +ERROR HY000: Cannot cast 'inet4' as 'decimal' in assignment of `test`.`t3`.`target` +UPDATE t3 SET target=source; +ERROR HY000: Cannot cast 'inet4' as 'decimal' in assignment of `test`.`t3`.`target` +UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id; +ERROR HY000: Cannot cast 'inet4' as 'decimal' in assignment of `test`.`t3`.`target` +SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type); +SELECT @alter; +@alter +ALTER TABLE t3 MODIFY target inet4 +EXECUTE IMMEDIATE @alter; +ERROR HY000: Cannot cast 'decimal' as 'inet4' in assignment of `test`.`t3`.`target` +DROP TABLE t3; +DROP TABLE t2; +CREATE PROCEDURE p1() +BEGIN +DECLARE src inet4 DEFAULT NULL; +DECLARE dst decimal(32,0) DEFAULT NULL; +SET dst=src; +END; +$$ +CALL p1; +ERROR HY000: Cannot cast 'inet4' as 'decimal' in assignment of `dst` +DROP PROCEDURE p1; +CREATE FUNCTION f1(a decimal(32,0)) RETURNS INT RETURN NULL;; +SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1)); +ERROR HY000: Cannot cast 'inet4' as 'decimal' in assignment of `a` +DROP FUNCTION f1; +CREATE PROCEDURE p1(a decimal(32,0)) BEGIN END;; +CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1)); +ERROR HY000: Cannot cast 'inet4' as 'decimal' in assignment of `a` +DROP PROCEDURE p1; +CREATE PROCEDURE p1(OUT dst decimal(32,0)) +BEGIN +DECLARE src inet4 DEFAULT NULL; +SET dst=src; +END; +$$ +CREATE PROCEDURE p2() +BEGIN +DECLARE dst decimal(32,0) DEFAULT NULL; +CALL p1(dst); +END; +$$ +CALL p2(); +ERROR HY000: Cannot cast 'inet4' as 'decimal' in assignment of `dst` +SHOW WARNINGS; +Level Code Message +Error 4078 Cannot cast 'inet4' as 'decimal' in assignment of `dst` +Note 4094 At line 4 in test.p1 +Note 4094 At line 4 in test.p2 +DROP PROCEDURE p2; +DROP PROCEDURE p1; +CREATE FUNCTION f1() RETURNS decimal(32,0) +BEGIN +DECLARE rc inet4 DEFAULT NULL; +RETURN rc; +END; +$$ +SELECT f1(); +ERROR HY000: Cannot cast 'inet4' as 'decimal' in assignment of `f1()` +DROP FUNCTION f1; +CREATE PROCEDURE p1() +BEGIN +DECLARE src inet4 DEFAULT NULL; +DECLARE cur1 CURSOR(t decimal(32,0)) FOR SELECT * FROM t1 WHERE target=t; +OPEN cur1(src); +CLOSE cur1; +END; +$$ +CALL p1(); +ERROR HY000: Cannot cast 'inet4' as 'decimal' in assignment of `t` +DROP PROCEDURE p1; +CREATE TABLE t2 LIKE t1; +INSERT INTO t2 VALUES (); +CREATE PROCEDURE p1() +BEGIN +DECLARE dst decimal(32,0) DEFAULT NULL; +DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1; +OPEN cur2; +FETCH cur2 INTO dst; +CLOSE cur2; +END; +$$ +CALL p1(); +ERROR HY000: Cannot cast 'inet4' as 'decimal' in assignment of `dst` +DROP PROCEDURE p1; +DROP TABLE t2; +# End of type_store_assignment_incompatible.inc +DROP TABLE t1; +# +# End of 10.10 tests +# diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_decimal.test b/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_decimal.test new file mode 100644 index 00000000000..bf158b8fff7 --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_decimal.test @@ -0,0 +1,19 @@ +--echo # +--echo # Start of 10.10 tests +--echo # + +--echo # +--echo # MDEV-23287 The INET4 data type +--echo # + +CREATE TABLE t1 (target INET4 DEFAULT '0.0.0.0', source DECIMAL(32,0) DEFAULT 0); +--source include/type_mix_incompatible.inc +DROP TABLE t1; + +CREATE TABLE t1 (target DECIMAL(32,0) DEFAULT 0, source INET4 DEFAULT '0.0.0.0'); +--source include/type_mix_incompatible.inc +DROP TABLE t1; + +--echo # +--echo # End of 10.10 tests +--echo # diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_double.result b/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_double.result new file mode 100644 index 00000000000..0987bae1e12 --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_double.result @@ -0,0 +1,353 @@ +# +# Start of 10.10 tests +# +# +# MDEV-23287 The INET4 data type +# +CREATE TABLE t1 (target INET4 DEFAULT '0.0.0.0', source DOUBLE DEFAULT 0); +# Start of type_store_assignment_incompatible.inc +SET @sql_mode_save= @@sql_mode; +SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS +WHERE COLUMN_NAME='source' + AND TABLE_NAME='t1' + AND TABLE_SCHEMA='test'); +SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS +WHERE COLUMN_NAME='target' + AND TABLE_NAME='t1' + AND TABLE_SCHEMA='test'); +SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN '' + WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore) +ELSE @ignore +END; +CREATE TABLE t2 LIKE t1; +ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST; +INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT); +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `id` int(11) NOT NULL, + `target` inet4 DEFAULT '0.0.0.0', + `source` double DEFAULT 0, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +CREATE TABLE t3 LIKE t2; +INSERT INTO t3 VALUES +(1, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +ERROR HY000: Cannot cast 'double' as 'inet4' in assignment of `test`.`t3`.`target` +DROP TABLE t3; +SET sql_mode=''; +CREATE TABLE t3 LIKE t2; +ALTER TABLE t3 ENGINE=MyISAM; +EXECUTE IMMEDIATE +CONCAT('CREATE VIEW v3 AS SELECT id,', +IF(@target_type='geometry','AsText(target)','target'), ' AS target,', +IF(@source_type='geometry','AsText(source)','source'), ' AS source ', +' FROM t3'); +INSERT INTO t3 VALUES +(1, +(SELECT target FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)), +(2, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +Warnings: +Warning 1292 Incorrect inet4 value: '0' for column `test`.`t3`.`target` at row 2 +SELECT * FROM v3; +id target source +1 0.0.0.0 0 +2 0.0.0.0 0 +TRUNCATE TABLE t3; +SET sql_mode=STRICT_ALL_TABLES; +INSERT INTO t3 VALUES +(1, +(SELECT target FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)), +(2, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +ERROR 22007: Incorrect inet4 value: '0' for column `test`.`t3`.`target` at row 2 +SELECT * FROM v3; +id target source +1 0.0.0.0 0 +TRUNCATE TABLE t3; +SET sql_mode=@sql_mode_save; +DROP TABLE t3; +DROP VIEW v3; +CREATE TABLE t3 LIKE t2; +INSERT INTO t3 SELECT id,source,source FROM t2; +ERROR HY000: Cannot cast 'double' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2; +ERROR HY000: Cannot cast 'double' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source; +ERROR HY000: Cannot cast 'double' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source; +ERROR HY000: Cannot cast 'double' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source; +ERROR HY000: Cannot cast 'double' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source; +ERROR HY000: Cannot cast 'double' as 'inet4' in assignment of `test`.`t3`.`target` +UPDATE t3 SET target=source; +ERROR HY000: Cannot cast 'double' as 'inet4' in assignment of `test`.`t3`.`target` +UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id; +ERROR HY000: Cannot cast 'double' as 'inet4' in assignment of `test`.`t3`.`target` +SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type); +SELECT @alter; +@alter +ALTER TABLE t3 MODIFY target double +EXECUTE IMMEDIATE @alter; +ERROR HY000: Cannot cast 'inet4' as 'double' in assignment of `test`.`t3`.`target` +DROP TABLE t3; +DROP TABLE t2; +CREATE PROCEDURE p1() +BEGIN +DECLARE src double DEFAULT NULL; +DECLARE dst inet4 DEFAULT NULL; +SET dst=src; +END; +$$ +CALL p1; +ERROR HY000: Cannot cast 'double' as 'inet4' in assignment of `dst` +DROP PROCEDURE p1; +CREATE FUNCTION f1(a inet4) RETURNS INT RETURN NULL;; +SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1)); +ERROR HY000: Cannot cast 'double' as 'inet4' in assignment of `a` +DROP FUNCTION f1; +CREATE PROCEDURE p1(a inet4) BEGIN END;; +CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1)); +ERROR HY000: Cannot cast 'double' as 'inet4' in assignment of `a` +DROP PROCEDURE p1; +CREATE PROCEDURE p1(OUT dst inet4) +BEGIN +DECLARE src double DEFAULT NULL; +SET dst=src; +END; +$$ +CREATE PROCEDURE p2() +BEGIN +DECLARE dst inet4 DEFAULT NULL; +CALL p1(dst); +END; +$$ +CALL p2(); +ERROR HY000: Cannot cast 'double' as 'inet4' in assignment of `dst` +SHOW WARNINGS; +Level Code Message +Error 4078 Cannot cast 'double' as 'inet4' in assignment of `dst` +Note 4094 At line 4 in test.p1 +Note 4094 At line 4 in test.p2 +DROP PROCEDURE p2; +DROP PROCEDURE p1; +CREATE FUNCTION f1() RETURNS inet4 +BEGIN +DECLARE rc double DEFAULT NULL; +RETURN rc; +END; +$$ +SELECT f1(); +ERROR HY000: Cannot cast 'double' as 'inet4' in assignment of `f1()` +DROP FUNCTION f1; +CREATE PROCEDURE p1() +BEGIN +DECLARE src double DEFAULT NULL; +DECLARE cur1 CURSOR(t inet4) FOR SELECT * FROM t1 WHERE target=t; +OPEN cur1(src); +CLOSE cur1; +END; +$$ +CALL p1(); +ERROR HY000: Cannot cast 'double' as 'inet4' in assignment of `t` +DROP PROCEDURE p1; +CREATE TABLE t2 LIKE t1; +INSERT INTO t2 VALUES (); +CREATE PROCEDURE p1() +BEGIN +DECLARE dst inet4 DEFAULT NULL; +DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1; +OPEN cur2; +FETCH cur2 INTO dst; +CLOSE cur2; +END; +$$ +CALL p1(); +ERROR HY000: Cannot cast 'double' as 'inet4' in assignment of `dst` +DROP PROCEDURE p1; +DROP TABLE t2; +# End of type_store_assignment_incompatible.inc +DROP TABLE t1; +CREATE TABLE t1 (target DOUBLE DEFAULT 0, source INET4 DEFAULT '0.0.0.0'); +# Start of type_store_assignment_incompatible.inc +SET @sql_mode_save= @@sql_mode; +SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS +WHERE COLUMN_NAME='source' + AND TABLE_NAME='t1' + AND TABLE_SCHEMA='test'); +SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS +WHERE COLUMN_NAME='target' + AND TABLE_NAME='t1' + AND TABLE_SCHEMA='test'); +SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN '' + WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore) +ELSE @ignore +END; +CREATE TABLE t2 LIKE t1; +ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST; +INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT); +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `id` int(11) NOT NULL, + `target` double DEFAULT 0, + `source` inet4 DEFAULT '0.0.0.0', + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +CREATE TABLE t3 LIKE t2; +INSERT INTO t3 VALUES +(1, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +ERROR HY000: Cannot cast 'inet4' as 'double' in assignment of `test`.`t3`.`target` +DROP TABLE t3; +SET sql_mode=''; +CREATE TABLE t3 LIKE t2; +ALTER TABLE t3 ENGINE=MyISAM; +EXECUTE IMMEDIATE +CONCAT('CREATE VIEW v3 AS SELECT id,', +IF(@target_type='geometry','AsText(target)','target'), ' AS target,', +IF(@source_type='geometry','AsText(source)','source'), ' AS source ', +' FROM t3'); +INSERT INTO t3 VALUES +(1, +(SELECT target FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)), +(2, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +Warnings: +Warning 1265 Data truncated for column 'target' at row 2 +SELECT * FROM v3; +id target source +1 0 0.0.0.0 +2 0 0.0.0.0 +TRUNCATE TABLE t3; +SET sql_mode=STRICT_ALL_TABLES; +INSERT INTO t3 VALUES +(1, +(SELECT target FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)), +(2, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +ERROR 01000: Data truncated for column 'target' at row 2 +SELECT * FROM v3; +id target source +1 0 0.0.0.0 +TRUNCATE TABLE t3; +SET sql_mode=@sql_mode_save; +DROP TABLE t3; +DROP VIEW v3; +CREATE TABLE t3 LIKE t2; +INSERT INTO t3 SELECT id,source,source FROM t2; +ERROR HY000: Cannot cast 'inet4' as 'double' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2; +ERROR HY000: Cannot cast 'inet4' as 'double' in assignment of `test`.`t3`.`target` +INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source; +ERROR HY000: Cannot cast 'inet4' as 'double' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source; +ERROR HY000: Cannot cast 'inet4' as 'double' in assignment of `test`.`t3`.`target` +INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source; +ERROR HY000: Cannot cast 'inet4' as 'double' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source; +ERROR HY000: Cannot cast 'inet4' as 'double' in assignment of `test`.`t3`.`target` +UPDATE t3 SET target=source; +ERROR HY000: Cannot cast 'inet4' as 'double' in assignment of `test`.`t3`.`target` +UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id; +ERROR HY000: Cannot cast 'inet4' as 'double' in assignment of `test`.`t3`.`target` +SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type); +SELECT @alter; +@alter +ALTER TABLE t3 MODIFY target inet4 +EXECUTE IMMEDIATE @alter; +ERROR HY000: Cannot cast 'double' as 'inet4' in assignment of `test`.`t3`.`target` +DROP TABLE t3; +DROP TABLE t2; +CREATE PROCEDURE p1() +BEGIN +DECLARE src inet4 DEFAULT NULL; +DECLARE dst double DEFAULT NULL; +SET dst=src; +END; +$$ +CALL p1; +ERROR HY000: Cannot cast 'inet4' as 'double' in assignment of `dst` +DROP PROCEDURE p1; +CREATE FUNCTION f1(a double) RETURNS INT RETURN NULL;; +SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1)); +ERROR HY000: Cannot cast 'inet4' as 'double' in assignment of `a` +DROP FUNCTION f1; +CREATE PROCEDURE p1(a double) BEGIN END;; +CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1)); +ERROR HY000: Cannot cast 'inet4' as 'double' in assignment of `a` +DROP PROCEDURE p1; +CREATE PROCEDURE p1(OUT dst double) +BEGIN +DECLARE src inet4 DEFAULT NULL; +SET dst=src; +END; +$$ +CREATE PROCEDURE p2() +BEGIN +DECLARE dst double DEFAULT NULL; +CALL p1(dst); +END; +$$ +CALL p2(); +ERROR HY000: Cannot cast 'inet4' as 'double' in assignment of `dst` +SHOW WARNINGS; +Level Code Message +Error 4078 Cannot cast 'inet4' as 'double' in assignment of `dst` +Note 4094 At line 4 in test.p1 +Note 4094 At line 4 in test.p2 +DROP PROCEDURE p2; +DROP PROCEDURE p1; +CREATE FUNCTION f1() RETURNS double +BEGIN +DECLARE rc inet4 DEFAULT NULL; +RETURN rc; +END; +$$ +SELECT f1(); +ERROR HY000: Cannot cast 'inet4' as 'double' in assignment of `f1()` +DROP FUNCTION f1; +CREATE PROCEDURE p1() +BEGIN +DECLARE src inet4 DEFAULT NULL; +DECLARE cur1 CURSOR(t double) FOR SELECT * FROM t1 WHERE target=t; +OPEN cur1(src); +CLOSE cur1; +END; +$$ +CALL p1(); +ERROR HY000: Cannot cast 'inet4' as 'double' in assignment of `t` +DROP PROCEDURE p1; +CREATE TABLE t2 LIKE t1; +INSERT INTO t2 VALUES (); +CREATE PROCEDURE p1() +BEGIN +DECLARE dst double DEFAULT NULL; +DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1; +OPEN cur2; +FETCH cur2 INTO dst; +CLOSE cur2; +END; +$$ +CALL p1(); +ERROR HY000: Cannot cast 'inet4' as 'double' in assignment of `dst` +DROP PROCEDURE p1; +DROP TABLE t2; +# End of type_store_assignment_incompatible.inc +DROP TABLE t1; +# +# End of 10.10 tests +# diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_double.test b/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_double.test new file mode 100644 index 00000000000..087d09bfa7e --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_double.test @@ -0,0 +1,19 @@ +--echo # +--echo # Start of 10.10 tests +--echo # + +--echo # +--echo # MDEV-23287 The INET4 data type +--echo # + +CREATE TABLE t1 (target INET4 DEFAULT '0.0.0.0', source DOUBLE DEFAULT 0); +--source include/type_mix_incompatible.inc +DROP TABLE t1; + +CREATE TABLE t1 (target DOUBLE DEFAULT 0, source INET4 DEFAULT '0.0.0.0'); +--source include/type_mix_incompatible.inc +DROP TABLE t1; + +--echo # +--echo # End of 10.10 tests +--echo # diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_int.result b/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_int.result new file mode 100644 index 00000000000..0a4fe99bdc6 --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_int.result @@ -0,0 +1,353 @@ +# +# Start of 10.10 tests +# +# +# MDEV-23287 The INET4 data type +# +CREATE TABLE t1 (target INET4 DEFAULT '0.0.0.0', source INT DEFAULT 0); +# Start of type_store_assignment_incompatible.inc +SET @sql_mode_save= @@sql_mode; +SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS +WHERE COLUMN_NAME='source' + AND TABLE_NAME='t1' + AND TABLE_SCHEMA='test'); +SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS +WHERE COLUMN_NAME='target' + AND TABLE_NAME='t1' + AND TABLE_SCHEMA='test'); +SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN '' + WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore) +ELSE @ignore +END; +CREATE TABLE t2 LIKE t1; +ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST; +INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT); +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `id` int(11) NOT NULL, + `target` inet4 DEFAULT '0.0.0.0', + `source` int(11) DEFAULT 0, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +CREATE TABLE t3 LIKE t2; +INSERT INTO t3 VALUES +(1, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +ERROR HY000: Cannot cast 'int' as 'inet4' in assignment of `test`.`t3`.`target` +DROP TABLE t3; +SET sql_mode=''; +CREATE TABLE t3 LIKE t2; +ALTER TABLE t3 ENGINE=MyISAM; +EXECUTE IMMEDIATE +CONCAT('CREATE VIEW v3 AS SELECT id,', +IF(@target_type='geometry','AsText(target)','target'), ' AS target,', +IF(@source_type='geometry','AsText(source)','source'), ' AS source ', +' FROM t3'); +INSERT INTO t3 VALUES +(1, +(SELECT target FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)), +(2, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +Warnings: +Warning 1292 Incorrect inet4 value: '0' for column `test`.`t3`.`target` at row 2 +SELECT * FROM v3; +id target source +1 0.0.0.0 0 +2 0.0.0.0 0 +TRUNCATE TABLE t3; +SET sql_mode=STRICT_ALL_TABLES; +INSERT INTO t3 VALUES +(1, +(SELECT target FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)), +(2, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +ERROR 22007: Incorrect inet4 value: '0' for column `test`.`t3`.`target` at row 2 +SELECT * FROM v3; +id target source +1 0.0.0.0 0 +TRUNCATE TABLE t3; +SET sql_mode=@sql_mode_save; +DROP TABLE t3; +DROP VIEW v3; +CREATE TABLE t3 LIKE t2; +INSERT INTO t3 SELECT id,source,source FROM t2; +ERROR HY000: Cannot cast 'int' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2; +ERROR HY000: Cannot cast 'int' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source; +ERROR HY000: Cannot cast 'int' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source; +ERROR HY000: Cannot cast 'int' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source; +ERROR HY000: Cannot cast 'int' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source; +ERROR HY000: Cannot cast 'int' as 'inet4' in assignment of `test`.`t3`.`target` +UPDATE t3 SET target=source; +ERROR HY000: Cannot cast 'int' as 'inet4' in assignment of `test`.`t3`.`target` +UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id; +ERROR HY000: Cannot cast 'int' as 'inet4' in assignment of `test`.`t3`.`target` +SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type); +SELECT @alter; +@alter +ALTER TABLE t3 MODIFY target int(11) +EXECUTE IMMEDIATE @alter; +ERROR HY000: Cannot cast 'inet4' as 'int' in assignment of `test`.`t3`.`target` +DROP TABLE t3; +DROP TABLE t2; +CREATE PROCEDURE p1() +BEGIN +DECLARE src int(11) DEFAULT NULL; +DECLARE dst inet4 DEFAULT NULL; +SET dst=src; +END; +$$ +CALL p1; +ERROR HY000: Cannot cast 'int' as 'inet4' in assignment of `dst` +DROP PROCEDURE p1; +CREATE FUNCTION f1(a inet4) RETURNS INT RETURN NULL;; +SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1)); +ERROR HY000: Cannot cast 'int' as 'inet4' in assignment of `a` +DROP FUNCTION f1; +CREATE PROCEDURE p1(a inet4) BEGIN END;; +CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1)); +ERROR HY000: Cannot cast 'int' as 'inet4' in assignment of `a` +DROP PROCEDURE p1; +CREATE PROCEDURE p1(OUT dst inet4) +BEGIN +DECLARE src int(11) DEFAULT NULL; +SET dst=src; +END; +$$ +CREATE PROCEDURE p2() +BEGIN +DECLARE dst inet4 DEFAULT NULL; +CALL p1(dst); +END; +$$ +CALL p2(); +ERROR HY000: Cannot cast 'int' as 'inet4' in assignment of `dst` +SHOW WARNINGS; +Level Code Message +Error 4078 Cannot cast 'int' as 'inet4' in assignment of `dst` +Note 4094 At line 4 in test.p1 +Note 4094 At line 4 in test.p2 +DROP PROCEDURE p2; +DROP PROCEDURE p1; +CREATE FUNCTION f1() RETURNS inet4 +BEGIN +DECLARE rc int(11) DEFAULT NULL; +RETURN rc; +END; +$$ +SELECT f1(); +ERROR HY000: Cannot cast 'int' as 'inet4' in assignment of `f1()` +DROP FUNCTION f1; +CREATE PROCEDURE p1() +BEGIN +DECLARE src int(11) DEFAULT NULL; +DECLARE cur1 CURSOR(t inet4) FOR SELECT * FROM t1 WHERE target=t; +OPEN cur1(src); +CLOSE cur1; +END; +$$ +CALL p1(); +ERROR HY000: Cannot cast 'int' as 'inet4' in assignment of `t` +DROP PROCEDURE p1; +CREATE TABLE t2 LIKE t1; +INSERT INTO t2 VALUES (); +CREATE PROCEDURE p1() +BEGIN +DECLARE dst inet4 DEFAULT NULL; +DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1; +OPEN cur2; +FETCH cur2 INTO dst; +CLOSE cur2; +END; +$$ +CALL p1(); +ERROR HY000: Cannot cast 'int' as 'inet4' in assignment of `dst` +DROP PROCEDURE p1; +DROP TABLE t2; +# End of type_store_assignment_incompatible.inc +DROP TABLE t1; +CREATE TABLE t1 (target INT DEFAULT 0, source INET4 DEFAULT '0.0.0.0'); +# Start of type_store_assignment_incompatible.inc +SET @sql_mode_save= @@sql_mode; +SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS +WHERE COLUMN_NAME='source' + AND TABLE_NAME='t1' + AND TABLE_SCHEMA='test'); +SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS +WHERE COLUMN_NAME='target' + AND TABLE_NAME='t1' + AND TABLE_SCHEMA='test'); +SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN '' + WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore) +ELSE @ignore +END; +CREATE TABLE t2 LIKE t1; +ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST; +INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT); +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `id` int(11) NOT NULL, + `target` int(11) DEFAULT 0, + `source` inet4 DEFAULT '0.0.0.0', + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +CREATE TABLE t3 LIKE t2; +INSERT INTO t3 VALUES +(1, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +ERROR HY000: Cannot cast 'inet4' as 'int' in assignment of `test`.`t3`.`target` +DROP TABLE t3; +SET sql_mode=''; +CREATE TABLE t3 LIKE t2; +ALTER TABLE t3 ENGINE=MyISAM; +EXECUTE IMMEDIATE +CONCAT('CREATE VIEW v3 AS SELECT id,', +IF(@target_type='geometry','AsText(target)','target'), ' AS target,', +IF(@source_type='geometry','AsText(source)','source'), ' AS source ', +' FROM t3'); +INSERT INTO t3 VALUES +(1, +(SELECT target FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)), +(2, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +Warnings: +Warning 1265 Data truncated for column 'target' at row 2 +SELECT * FROM v3; +id target source +1 0 0.0.0.0 +2 0 0.0.0.0 +TRUNCATE TABLE t3; +SET sql_mode=STRICT_ALL_TABLES; +INSERT INTO t3 VALUES +(1, +(SELECT target FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)), +(2, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +ERROR 01000: Data truncated for column 'target' at row 2 +SELECT * FROM v3; +id target source +1 0 0.0.0.0 +TRUNCATE TABLE t3; +SET sql_mode=@sql_mode_save; +DROP TABLE t3; +DROP VIEW v3; +CREATE TABLE t3 LIKE t2; +INSERT INTO t3 SELECT id,source,source FROM t2; +ERROR HY000: Cannot cast 'inet4' as 'int' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2; +ERROR HY000: Cannot cast 'inet4' as 'int' in assignment of `test`.`t3`.`target` +INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source; +ERROR HY000: Cannot cast 'inet4' as 'int' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source; +ERROR HY000: Cannot cast 'inet4' as 'int' in assignment of `test`.`t3`.`target` +INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source; +ERROR HY000: Cannot cast 'inet4' as 'int' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source; +ERROR HY000: Cannot cast 'inet4' as 'int' in assignment of `test`.`t3`.`target` +UPDATE t3 SET target=source; +ERROR HY000: Cannot cast 'inet4' as 'int' in assignment of `test`.`t3`.`target` +UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id; +ERROR HY000: Cannot cast 'inet4' as 'int' in assignment of `test`.`t3`.`target` +SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type); +SELECT @alter; +@alter +ALTER TABLE t3 MODIFY target inet4 +EXECUTE IMMEDIATE @alter; +ERROR HY000: Cannot cast 'int' as 'inet4' in assignment of `test`.`t3`.`target` +DROP TABLE t3; +DROP TABLE t2; +CREATE PROCEDURE p1() +BEGIN +DECLARE src inet4 DEFAULT NULL; +DECLARE dst int(11) DEFAULT NULL; +SET dst=src; +END; +$$ +CALL p1; +ERROR HY000: Cannot cast 'inet4' as 'int' in assignment of `dst` +DROP PROCEDURE p1; +CREATE FUNCTION f1(a int(11)) RETURNS INT RETURN NULL;; +SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1)); +ERROR HY000: Cannot cast 'inet4' as 'int' in assignment of `a` +DROP FUNCTION f1; +CREATE PROCEDURE p1(a int(11)) BEGIN END;; +CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1)); +ERROR HY000: Cannot cast 'inet4' as 'int' in assignment of `a` +DROP PROCEDURE p1; +CREATE PROCEDURE p1(OUT dst int(11)) +BEGIN +DECLARE src inet4 DEFAULT NULL; +SET dst=src; +END; +$$ +CREATE PROCEDURE p2() +BEGIN +DECLARE dst int(11) DEFAULT NULL; +CALL p1(dst); +END; +$$ +CALL p2(); +ERROR HY000: Cannot cast 'inet4' as 'int' in assignment of `dst` +SHOW WARNINGS; +Level Code Message +Error 4078 Cannot cast 'inet4' as 'int' in assignment of `dst` +Note 4094 At line 4 in test.p1 +Note 4094 At line 4 in test.p2 +DROP PROCEDURE p2; +DROP PROCEDURE p1; +CREATE FUNCTION f1() RETURNS int(11) +BEGIN +DECLARE rc inet4 DEFAULT NULL; +RETURN rc; +END; +$$ +SELECT f1(); +ERROR HY000: Cannot cast 'inet4' as 'int' in assignment of `f1()` +DROP FUNCTION f1; +CREATE PROCEDURE p1() +BEGIN +DECLARE src inet4 DEFAULT NULL; +DECLARE cur1 CURSOR(t int(11)) FOR SELECT * FROM t1 WHERE target=t; +OPEN cur1(src); +CLOSE cur1; +END; +$$ +CALL p1(); +ERROR HY000: Cannot cast 'inet4' as 'int' in assignment of `t` +DROP PROCEDURE p1; +CREATE TABLE t2 LIKE t1; +INSERT INTO t2 VALUES (); +CREATE PROCEDURE p1() +BEGIN +DECLARE dst int(11) DEFAULT NULL; +DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1; +OPEN cur2; +FETCH cur2 INTO dst; +CLOSE cur2; +END; +$$ +CALL p1(); +ERROR HY000: Cannot cast 'inet4' as 'int' in assignment of `dst` +DROP PROCEDURE p1; +DROP TABLE t2; +# End of type_store_assignment_incompatible.inc +DROP TABLE t1; +# +# End of 10.10 tests +# diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_int.test b/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_int.test new file mode 100644 index 00000000000..fb65eb70b31 --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_int.test @@ -0,0 +1,19 @@ +--echo # +--echo # Start of 10.10 tests +--echo # + +--echo # +--echo # MDEV-23287 The INET4 data type +--echo # + +CREATE TABLE t1 (target INET4 DEFAULT '0.0.0.0', source INT DEFAULT 0); +--source include/type_mix_incompatible.inc +DROP TABLE t1; + +CREATE TABLE t1 (target INT DEFAULT 0, source INET4 DEFAULT '0.0.0.0'); +--source include/type_mix_incompatible.inc +DROP TABLE t1; + +--echo # +--echo # End of 10.10 tests +--echo # diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_time.result b/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_time.result new file mode 100644 index 00000000000..09aae4f0bd2 --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_time.result @@ -0,0 +1,353 @@ +# +# Start of 10.10 tests +# +# +# MDEV-23287 The INET4 data type +# +CREATE TABLE t1 (target INET4 DEFAULT '99.99.99.99', source TIME DEFAULT '10:20:30'); +# Start of type_store_assignment_incompatible.inc +SET @sql_mode_save= @@sql_mode; +SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS +WHERE COLUMN_NAME='source' + AND TABLE_NAME='t1' + AND TABLE_SCHEMA='test'); +SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS +WHERE COLUMN_NAME='target' + AND TABLE_NAME='t1' + AND TABLE_SCHEMA='test'); +SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN '' + WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore) +ELSE @ignore +END; +CREATE TABLE t2 LIKE t1; +ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST; +INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT); +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `id` int(11) NOT NULL, + `target` inet4 DEFAULT '99.99.99.99', + `source` time DEFAULT '10:20:30', + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +CREATE TABLE t3 LIKE t2; +INSERT INTO t3 VALUES +(1, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +ERROR HY000: Cannot cast 'time' as 'inet4' in assignment of `test`.`t3`.`target` +DROP TABLE t3; +SET sql_mode=''; +CREATE TABLE t3 LIKE t2; +ALTER TABLE t3 ENGINE=MyISAM; +EXECUTE IMMEDIATE +CONCAT('CREATE VIEW v3 AS SELECT id,', +IF(@target_type='geometry','AsText(target)','target'), ' AS target,', +IF(@source_type='geometry','AsText(source)','source'), ' AS source ', +' FROM t3'); +INSERT INTO t3 VALUES +(1, +(SELECT target FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)), +(2, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +Warnings: +Warning 1292 Incorrect inet4 value: '10:20:30' for column `test`.`t3`.`target` at row 2 +SELECT * FROM v3; +id target source +1 99.99.99.99 10:20:30 +2 0.0.0.0 10:20:30 +TRUNCATE TABLE t3; +SET sql_mode=STRICT_ALL_TABLES; +INSERT INTO t3 VALUES +(1, +(SELECT target FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)), +(2, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +ERROR 22007: Incorrect inet4 value: '10:20:30' for column `test`.`t3`.`target` at row 2 +SELECT * FROM v3; +id target source +1 99.99.99.99 10:20:30 +TRUNCATE TABLE t3; +SET sql_mode=@sql_mode_save; +DROP TABLE t3; +DROP VIEW v3; +CREATE TABLE t3 LIKE t2; +INSERT INTO t3 SELECT id,source,source FROM t2; +ERROR HY000: Cannot cast 'time' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2; +ERROR HY000: Cannot cast 'time' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source; +ERROR HY000: Cannot cast 'time' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source; +ERROR HY000: Cannot cast 'time' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source; +ERROR HY000: Cannot cast 'time' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source; +ERROR HY000: Cannot cast 'time' as 'inet4' in assignment of `test`.`t3`.`target` +UPDATE t3 SET target=source; +ERROR HY000: Cannot cast 'time' as 'inet4' in assignment of `test`.`t3`.`target` +UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id; +ERROR HY000: Cannot cast 'time' as 'inet4' in assignment of `test`.`t3`.`target` +SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type); +SELECT @alter; +@alter +ALTER TABLE t3 MODIFY target time +EXECUTE IMMEDIATE @alter; +ERROR HY000: Cannot cast 'inet4' as 'time' in assignment of `test`.`t3`.`target` +DROP TABLE t3; +DROP TABLE t2; +CREATE PROCEDURE p1() +BEGIN +DECLARE src time DEFAULT NULL; +DECLARE dst inet4 DEFAULT NULL; +SET dst=src; +END; +$$ +CALL p1; +ERROR HY000: Cannot cast 'time' as 'inet4' in assignment of `dst` +DROP PROCEDURE p1; +CREATE FUNCTION f1(a inet4) RETURNS INT RETURN NULL;; +SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1)); +ERROR HY000: Cannot cast 'time' as 'inet4' in assignment of `a` +DROP FUNCTION f1; +CREATE PROCEDURE p1(a inet4) BEGIN END;; +CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1)); +ERROR HY000: Cannot cast 'time' as 'inet4' in assignment of `a` +DROP PROCEDURE p1; +CREATE PROCEDURE p1(OUT dst inet4) +BEGIN +DECLARE src time DEFAULT NULL; +SET dst=src; +END; +$$ +CREATE PROCEDURE p2() +BEGIN +DECLARE dst inet4 DEFAULT NULL; +CALL p1(dst); +END; +$$ +CALL p2(); +ERROR HY000: Cannot cast 'time' as 'inet4' in assignment of `dst` +SHOW WARNINGS; +Level Code Message +Error 4078 Cannot cast 'time' as 'inet4' in assignment of `dst` +Note 4094 At line 4 in test.p1 +Note 4094 At line 4 in test.p2 +DROP PROCEDURE p2; +DROP PROCEDURE p1; +CREATE FUNCTION f1() RETURNS inet4 +BEGIN +DECLARE rc time DEFAULT NULL; +RETURN rc; +END; +$$ +SELECT f1(); +ERROR HY000: Cannot cast 'time' as 'inet4' in assignment of `f1()` +DROP FUNCTION f1; +CREATE PROCEDURE p1() +BEGIN +DECLARE src time DEFAULT NULL; +DECLARE cur1 CURSOR(t inet4) FOR SELECT * FROM t1 WHERE target=t; +OPEN cur1(src); +CLOSE cur1; +END; +$$ +CALL p1(); +ERROR HY000: Cannot cast 'time' as 'inet4' in assignment of `t` +DROP PROCEDURE p1; +CREATE TABLE t2 LIKE t1; +INSERT INTO t2 VALUES (); +CREATE PROCEDURE p1() +BEGIN +DECLARE dst inet4 DEFAULT NULL; +DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1; +OPEN cur2; +FETCH cur2 INTO dst; +CLOSE cur2; +END; +$$ +CALL p1(); +ERROR HY000: Cannot cast 'time' as 'inet4' in assignment of `dst` +DROP PROCEDURE p1; +DROP TABLE t2; +# End of type_store_assignment_incompatible.inc +DROP TABLE t1; +CREATE TABLE t1 (target TIME DEFAULT '10:20:30', source INET4 DEFAULT '99.99.99.99'); +# Start of type_store_assignment_incompatible.inc +SET @sql_mode_save= @@sql_mode; +SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS +WHERE COLUMN_NAME='source' + AND TABLE_NAME='t1' + AND TABLE_SCHEMA='test'); +SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS +WHERE COLUMN_NAME='target' + AND TABLE_NAME='t1' + AND TABLE_SCHEMA='test'); +SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN '' + WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore) +ELSE @ignore +END; +CREATE TABLE t2 LIKE t1; +ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST; +INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT); +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `id` int(11) NOT NULL, + `target` time DEFAULT '10:20:30', + `source` inet4 DEFAULT '99.99.99.99', + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +CREATE TABLE t3 LIKE t2; +INSERT INTO t3 VALUES +(1, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +ERROR HY000: Cannot cast 'inet4' as 'time' in assignment of `test`.`t3`.`target` +DROP TABLE t3; +SET sql_mode=''; +CREATE TABLE t3 LIKE t2; +ALTER TABLE t3 ENGINE=MyISAM; +EXECUTE IMMEDIATE +CONCAT('CREATE VIEW v3 AS SELECT id,', +IF(@target_type='geometry','AsText(target)','target'), ' AS target,', +IF(@source_type='geometry','AsText(source)','source'), ' AS source ', +' FROM t3'); +INSERT INTO t3 VALUES +(1, +(SELECT target FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)), +(2, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +Warnings: +Warning 1265 Data truncated for column 'target' at row 2 +SELECT * FROM v3; +id target source +1 10:20:30 99.99.99.99 +2 00:00:00 99.99.99.99 +TRUNCATE TABLE t3; +SET sql_mode=STRICT_ALL_TABLES; +INSERT INTO t3 VALUES +(1, +(SELECT target FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)), +(2, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +ERROR 22007: Incorrect time value: '99.99.99.99' for column `test`.`t3`.`target` at row 2 +SELECT * FROM v3; +id target source +1 10:20:30 99.99.99.99 +TRUNCATE TABLE t3; +SET sql_mode=@sql_mode_save; +DROP TABLE t3; +DROP VIEW v3; +CREATE TABLE t3 LIKE t2; +INSERT INTO t3 SELECT id,source,source FROM t2; +ERROR HY000: Cannot cast 'inet4' as 'time' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2; +ERROR HY000: Cannot cast 'inet4' as 'time' in assignment of `test`.`t3`.`target` +INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source; +ERROR HY000: Cannot cast 'inet4' as 'time' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source; +ERROR HY000: Cannot cast 'inet4' as 'time' in assignment of `test`.`t3`.`target` +INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source; +ERROR HY000: Cannot cast 'inet4' as 'time' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source; +ERROR HY000: Cannot cast 'inet4' as 'time' in assignment of `test`.`t3`.`target` +UPDATE t3 SET target=source; +ERROR HY000: Cannot cast 'inet4' as 'time' in assignment of `test`.`t3`.`target` +UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id; +ERROR HY000: Cannot cast 'inet4' as 'time' in assignment of `test`.`t3`.`target` +SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type); +SELECT @alter; +@alter +ALTER TABLE t3 MODIFY target inet4 +EXECUTE IMMEDIATE @alter; +ERROR HY000: Cannot cast 'time' as 'inet4' in assignment of `test`.`t3`.`target` +DROP TABLE t3; +DROP TABLE t2; +CREATE PROCEDURE p1() +BEGIN +DECLARE src inet4 DEFAULT NULL; +DECLARE dst time DEFAULT NULL; +SET dst=src; +END; +$$ +CALL p1; +ERROR HY000: Cannot cast 'inet4' as 'time' in assignment of `dst` +DROP PROCEDURE p1; +CREATE FUNCTION f1(a time) RETURNS INT RETURN NULL;; +SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1)); +ERROR HY000: Cannot cast 'inet4' as 'time' in assignment of `a` +DROP FUNCTION f1; +CREATE PROCEDURE p1(a time) BEGIN END;; +CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1)); +ERROR HY000: Cannot cast 'inet4' as 'time' in assignment of `a` +DROP PROCEDURE p1; +CREATE PROCEDURE p1(OUT dst time) +BEGIN +DECLARE src inet4 DEFAULT NULL; +SET dst=src; +END; +$$ +CREATE PROCEDURE p2() +BEGIN +DECLARE dst time DEFAULT NULL; +CALL p1(dst); +END; +$$ +CALL p2(); +ERROR HY000: Cannot cast 'inet4' as 'time' in assignment of `dst` +SHOW WARNINGS; +Level Code Message +Error 4078 Cannot cast 'inet4' as 'time' in assignment of `dst` +Note 4094 At line 4 in test.p1 +Note 4094 At line 4 in test.p2 +DROP PROCEDURE p2; +DROP PROCEDURE p1; +CREATE FUNCTION f1() RETURNS time +BEGIN +DECLARE rc inet4 DEFAULT NULL; +RETURN rc; +END; +$$ +SELECT f1(); +ERROR HY000: Cannot cast 'inet4' as 'time' in assignment of `f1()` +DROP FUNCTION f1; +CREATE PROCEDURE p1() +BEGIN +DECLARE src inet4 DEFAULT NULL; +DECLARE cur1 CURSOR(t time) FOR SELECT * FROM t1 WHERE target=t; +OPEN cur1(src); +CLOSE cur1; +END; +$$ +CALL p1(); +ERROR HY000: Cannot cast 'inet4' as 'time' in assignment of `t` +DROP PROCEDURE p1; +CREATE TABLE t2 LIKE t1; +INSERT INTO t2 VALUES (); +CREATE PROCEDURE p1() +BEGIN +DECLARE dst time DEFAULT NULL; +DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1; +OPEN cur2; +FETCH cur2 INTO dst; +CLOSE cur2; +END; +$$ +CALL p1(); +ERROR HY000: Cannot cast 'inet4' as 'time' in assignment of `dst` +DROP PROCEDURE p1; +DROP TABLE t2; +# End of type_store_assignment_incompatible.inc +DROP TABLE t1; +# +# End of 10.10 tests +# diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_time.test b/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_time.test new file mode 100644 index 00000000000..ae617550ec4 --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_time.test @@ -0,0 +1,26 @@ +--echo # +--echo # Start of 10.10 tests +--echo # + +--echo # +--echo # MDEV-23287 The INET4 data type +--echo # + +# +# The DATE data type has loose control on the incoming data, +# so values like '0.0.0.0' do not fail when get inserted to a DATE field +# even though there is an obvious redundant part - the fourth number. +# Using '99.99.99.99' to make sure the month part is out of the range +# to guarantee the failure. + +CREATE TABLE t1 (target INET4 DEFAULT '99.99.99.99', source TIME DEFAULT '10:20:30'); +--source include/type_mix_incompatible.inc +DROP TABLE t1; + +CREATE TABLE t1 (target TIME DEFAULT '10:20:30', source INET4 DEFAULT '99.99.99.99'); +--source include/type_mix_incompatible.inc +DROP TABLE t1; + +--echo # +--echo # End of 10.10 tests +--echo # diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_timestamp.result b/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_timestamp.result new file mode 100644 index 00000000000..56d2ced2c3f --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_timestamp.result @@ -0,0 +1,353 @@ +# +# Start of 10.10 tests +# +# +# MDEV-23287 The INET4 data type +# +CREATE TABLE t1 (target INET4 DEFAULT '99.99.99.99', source TIMESTAMP DEFAULT '2001-01-01 10:20:30'); +# Start of type_store_assignment_incompatible.inc +SET @sql_mode_save= @@sql_mode; +SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS +WHERE COLUMN_NAME='source' + AND TABLE_NAME='t1' + AND TABLE_SCHEMA='test'); +SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS +WHERE COLUMN_NAME='target' + AND TABLE_NAME='t1' + AND TABLE_SCHEMA='test'); +SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN '' + WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore) +ELSE @ignore +END; +CREATE TABLE t2 LIKE t1; +ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST; +INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT); +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `id` int(11) NOT NULL, + `target` inet4 DEFAULT '99.99.99.99', + `source` timestamp NULL DEFAULT '2001-01-01 10:20:30', + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +CREATE TABLE t3 LIKE t2; +INSERT INTO t3 VALUES +(1, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +ERROR HY000: Cannot cast 'timestamp' as 'inet4' in assignment of `test`.`t3`.`target` +DROP TABLE t3; +SET sql_mode=''; +CREATE TABLE t3 LIKE t2; +ALTER TABLE t3 ENGINE=MyISAM; +EXECUTE IMMEDIATE +CONCAT('CREATE VIEW v3 AS SELECT id,', +IF(@target_type='geometry','AsText(target)','target'), ' AS target,', +IF(@source_type='geometry','AsText(source)','source'), ' AS source ', +' FROM t3'); +INSERT INTO t3 VALUES +(1, +(SELECT target FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)), +(2, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +Warnings: +Warning 1292 Incorrect inet4 value: '2001-01-01 10:20:30' for column `test`.`t3`.`target` at row 2 +SELECT * FROM v3; +id target source +1 99.99.99.99 2001-01-01 10:20:30 +2 0.0.0.0 2001-01-01 10:20:30 +TRUNCATE TABLE t3; +SET sql_mode=STRICT_ALL_TABLES; +INSERT INTO t3 VALUES +(1, +(SELECT target FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)), +(2, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +ERROR 22007: Incorrect inet4 value: '2001-01-01 10:20:30' for column `test`.`t3`.`target` at row 2 +SELECT * FROM v3; +id target source +1 99.99.99.99 2001-01-01 10:20:30 +TRUNCATE TABLE t3; +SET sql_mode=@sql_mode_save; +DROP TABLE t3; +DROP VIEW v3; +CREATE TABLE t3 LIKE t2; +INSERT INTO t3 SELECT id,source,source FROM t2; +ERROR HY000: Cannot cast 'timestamp' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2; +ERROR HY000: Cannot cast 'timestamp' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source; +ERROR HY000: Cannot cast 'timestamp' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source; +ERROR HY000: Cannot cast 'timestamp' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source; +ERROR HY000: Cannot cast 'timestamp' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source; +ERROR HY000: Cannot cast 'timestamp' as 'inet4' in assignment of `test`.`t3`.`target` +UPDATE t3 SET target=source; +ERROR HY000: Cannot cast 'timestamp' as 'inet4' in assignment of `test`.`t3`.`target` +UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id; +ERROR HY000: Cannot cast 'timestamp' as 'inet4' in assignment of `test`.`t3`.`target` +SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type); +SELECT @alter; +@alter +ALTER TABLE t3 MODIFY target timestamp +EXECUTE IMMEDIATE @alter; +ERROR HY000: Cannot cast 'inet4' as 'timestamp' in assignment of `test`.`t3`.`target` +DROP TABLE t3; +DROP TABLE t2; +CREATE PROCEDURE p1() +BEGIN +DECLARE src timestamp DEFAULT NULL; +DECLARE dst inet4 DEFAULT NULL; +SET dst=src; +END; +$$ +CALL p1; +ERROR HY000: Cannot cast 'timestamp' as 'inet4' in assignment of `dst` +DROP PROCEDURE p1; +CREATE FUNCTION f1(a inet4) RETURNS INT RETURN NULL;; +SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1)); +ERROR HY000: Cannot cast 'timestamp' as 'inet4' in assignment of `a` +DROP FUNCTION f1; +CREATE PROCEDURE p1(a inet4) BEGIN END;; +CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1)); +ERROR HY000: Cannot cast 'timestamp' as 'inet4' in assignment of `a` +DROP PROCEDURE p1; +CREATE PROCEDURE p1(OUT dst inet4) +BEGIN +DECLARE src timestamp DEFAULT NULL; +SET dst=src; +END; +$$ +CREATE PROCEDURE p2() +BEGIN +DECLARE dst inet4 DEFAULT NULL; +CALL p1(dst); +END; +$$ +CALL p2(); +ERROR HY000: Cannot cast 'timestamp' as 'inet4' in assignment of `dst` +SHOW WARNINGS; +Level Code Message +Error 4078 Cannot cast 'timestamp' as 'inet4' in assignment of `dst` +Note 4094 At line 4 in test.p1 +Note 4094 At line 4 in test.p2 +DROP PROCEDURE p2; +DROP PROCEDURE p1; +CREATE FUNCTION f1() RETURNS inet4 +BEGIN +DECLARE rc timestamp DEFAULT NULL; +RETURN rc; +END; +$$ +SELECT f1(); +ERROR HY000: Cannot cast 'timestamp' as 'inet4' in assignment of `f1()` +DROP FUNCTION f1; +CREATE PROCEDURE p1() +BEGIN +DECLARE src timestamp DEFAULT NULL; +DECLARE cur1 CURSOR(t inet4) FOR SELECT * FROM t1 WHERE target=t; +OPEN cur1(src); +CLOSE cur1; +END; +$$ +CALL p1(); +ERROR HY000: Cannot cast 'timestamp' as 'inet4' in assignment of `t` +DROP PROCEDURE p1; +CREATE TABLE t2 LIKE t1; +INSERT INTO t2 VALUES (); +CREATE PROCEDURE p1() +BEGIN +DECLARE dst inet4 DEFAULT NULL; +DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1; +OPEN cur2; +FETCH cur2 INTO dst; +CLOSE cur2; +END; +$$ +CALL p1(); +ERROR HY000: Cannot cast 'timestamp' as 'inet4' in assignment of `dst` +DROP PROCEDURE p1; +DROP TABLE t2; +# End of type_store_assignment_incompatible.inc +DROP TABLE t1; +CREATE TABLE t1 (target TIMESTAMP DEFAULT '2001-01-01 10:20:30', source INET4 DEFAULT '99.99.99.99'); +# Start of type_store_assignment_incompatible.inc +SET @sql_mode_save= @@sql_mode; +SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS +WHERE COLUMN_NAME='source' + AND TABLE_NAME='t1' + AND TABLE_SCHEMA='test'); +SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS +WHERE COLUMN_NAME='target' + AND TABLE_NAME='t1' + AND TABLE_SCHEMA='test'); +SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN '' + WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore) +ELSE @ignore +END; +CREATE TABLE t2 LIKE t1; +ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST; +INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT); +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `id` int(11) NOT NULL, + `target` timestamp NULL DEFAULT '2001-01-01 10:20:30', + `source` inet4 DEFAULT '99.99.99.99', + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +CREATE TABLE t3 LIKE t2; +INSERT INTO t3 VALUES +(1, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +ERROR HY000: Cannot cast 'inet4' as 'timestamp' in assignment of `test`.`t3`.`target` +DROP TABLE t3; +SET sql_mode=''; +CREATE TABLE t3 LIKE t2; +ALTER TABLE t3 ENGINE=MyISAM; +EXECUTE IMMEDIATE +CONCAT('CREATE VIEW v3 AS SELECT id,', +IF(@target_type='geometry','AsText(target)','target'), ' AS target,', +IF(@source_type='geometry','AsText(source)','source'), ' AS source ', +' FROM t3'); +INSERT INTO t3 VALUES +(1, +(SELECT target FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)), +(2, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +Warnings: +Warning 1265 Data truncated for column 'target' at row 2 +SELECT * FROM v3; +id target source +1 2001-01-01 10:20:30 99.99.99.99 +2 0000-00-00 00:00:00 99.99.99.99 +TRUNCATE TABLE t3; +SET sql_mode=STRICT_ALL_TABLES; +INSERT INTO t3 VALUES +(1, +(SELECT target FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)), +(2, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +ERROR 22007: Incorrect datetime value: '99.99.99.99' for column `test`.`t3`.`target` at row 2 +SELECT * FROM v3; +id target source +1 2001-01-01 10:20:30 99.99.99.99 +TRUNCATE TABLE t3; +SET sql_mode=@sql_mode_save; +DROP TABLE t3; +DROP VIEW v3; +CREATE TABLE t3 LIKE t2; +INSERT INTO t3 SELECT id,source,source FROM t2; +ERROR HY000: Cannot cast 'inet4' as 'timestamp' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2; +ERROR HY000: Cannot cast 'inet4' as 'timestamp' in assignment of `test`.`t3`.`target` +INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source; +ERROR HY000: Cannot cast 'inet4' as 'timestamp' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source; +ERROR HY000: Cannot cast 'inet4' as 'timestamp' in assignment of `test`.`t3`.`target` +INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source; +ERROR HY000: Cannot cast 'inet4' as 'timestamp' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source; +ERROR HY000: Cannot cast 'inet4' as 'timestamp' in assignment of `test`.`t3`.`target` +UPDATE t3 SET target=source; +ERROR HY000: Cannot cast 'inet4' as 'timestamp' in assignment of `test`.`t3`.`target` +UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id; +ERROR HY000: Cannot cast 'inet4' as 'timestamp' in assignment of `test`.`t3`.`target` +SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type); +SELECT @alter; +@alter +ALTER TABLE t3 MODIFY target inet4 +EXECUTE IMMEDIATE @alter; +ERROR HY000: Cannot cast 'timestamp' as 'inet4' in assignment of `test`.`t3`.`target` +DROP TABLE t3; +DROP TABLE t2; +CREATE PROCEDURE p1() +BEGIN +DECLARE src inet4 DEFAULT NULL; +DECLARE dst timestamp DEFAULT NULL; +SET dst=src; +END; +$$ +CALL p1; +ERROR HY000: Cannot cast 'inet4' as 'timestamp' in assignment of `dst` +DROP PROCEDURE p1; +CREATE FUNCTION f1(a timestamp) RETURNS INT RETURN NULL;; +SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1)); +ERROR HY000: Cannot cast 'inet4' as 'timestamp' in assignment of `a` +DROP FUNCTION f1; +CREATE PROCEDURE p1(a timestamp) BEGIN END;; +CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1)); +ERROR HY000: Cannot cast 'inet4' as 'timestamp' in assignment of `a` +DROP PROCEDURE p1; +CREATE PROCEDURE p1(OUT dst timestamp) +BEGIN +DECLARE src inet4 DEFAULT NULL; +SET dst=src; +END; +$$ +CREATE PROCEDURE p2() +BEGIN +DECLARE dst timestamp DEFAULT NULL; +CALL p1(dst); +END; +$$ +CALL p2(); +ERROR HY000: Cannot cast 'inet4' as 'timestamp' in assignment of `dst` +SHOW WARNINGS; +Level Code Message +Error 4078 Cannot cast 'inet4' as 'timestamp' in assignment of `dst` +Note 4094 At line 4 in test.p1 +Note 4094 At line 4 in test.p2 +DROP PROCEDURE p2; +DROP PROCEDURE p1; +CREATE FUNCTION f1() RETURNS timestamp +BEGIN +DECLARE rc inet4 DEFAULT NULL; +RETURN rc; +END; +$$ +SELECT f1(); +ERROR HY000: Cannot cast 'inet4' as 'timestamp' in assignment of `f1()` +DROP FUNCTION f1; +CREATE PROCEDURE p1() +BEGIN +DECLARE src inet4 DEFAULT NULL; +DECLARE cur1 CURSOR(t timestamp) FOR SELECT * FROM t1 WHERE target=t; +OPEN cur1(src); +CLOSE cur1; +END; +$$ +CALL p1(); +ERROR HY000: Cannot cast 'inet4' as 'timestamp' in assignment of `t` +DROP PROCEDURE p1; +CREATE TABLE t2 LIKE t1; +INSERT INTO t2 VALUES (); +CREATE PROCEDURE p1() +BEGIN +DECLARE dst timestamp DEFAULT NULL; +DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1; +OPEN cur2; +FETCH cur2 INTO dst; +CLOSE cur2; +END; +$$ +CALL p1(); +ERROR HY000: Cannot cast 'inet4' as 'timestamp' in assignment of `dst` +DROP PROCEDURE p1; +DROP TABLE t2; +# End of type_store_assignment_incompatible.inc +DROP TABLE t1; +# +# End of 10.10 tests +# diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_timestamp.test b/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_timestamp.test new file mode 100644 index 00000000000..a689d2facc5 --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_timestamp.test @@ -0,0 +1,25 @@ +--echo # +--echo # Start of 10.10 tests +--echo # + +--echo # +--echo # MDEV-23287 The INET4 data type +--echo # + +# +# The DATETIME data type has loose control on the incoming data, +# so values like '0.0.0.0' do not fail when get inserted to a DATETIME field. +# Using '99.99.99.99' to make sure the month part is out of the range +# to guarantee the failure. + +CREATE TABLE t1 (target INET4 DEFAULT '99.99.99.99', source TIMESTAMP DEFAULT '2001-01-01 10:20:30'); +--source include/type_mix_incompatible.inc +DROP TABLE t1; + +CREATE TABLE t1 (target TIMESTAMP DEFAULT '2001-01-01 10:20:30', source INET4 DEFAULT '99.99.99.99'); +--source include/type_mix_incompatible.inc +DROP TABLE t1; + +--echo # +--echo # End of 10.10 tests +--echo # diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_year.result b/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_year.result new file mode 100644 index 00000000000..b47e7e2383a --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_year.result @@ -0,0 +1,353 @@ +# +# Start of 10.10 tests +# +# +# MDEV-23287 The INET4 data type +# +CREATE TABLE t1 (target INET4 DEFAULT '0.0.0.0', source YEAR DEFAULT 0); +# Start of type_store_assignment_incompatible.inc +SET @sql_mode_save= @@sql_mode; +SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS +WHERE COLUMN_NAME='source' + AND TABLE_NAME='t1' + AND TABLE_SCHEMA='test'); +SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS +WHERE COLUMN_NAME='target' + AND TABLE_NAME='t1' + AND TABLE_SCHEMA='test'); +SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN '' + WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore) +ELSE @ignore +END; +CREATE TABLE t2 LIKE t1; +ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST; +INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT); +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `id` int(11) NOT NULL, + `target` inet4 DEFAULT '0.0.0.0', + `source` year(4) DEFAULT 0000, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +CREATE TABLE t3 LIKE t2; +INSERT INTO t3 VALUES +(1, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +ERROR HY000: Cannot cast 'year' as 'inet4' in assignment of `test`.`t3`.`target` +DROP TABLE t3; +SET sql_mode=''; +CREATE TABLE t3 LIKE t2; +ALTER TABLE t3 ENGINE=MyISAM; +EXECUTE IMMEDIATE +CONCAT('CREATE VIEW v3 AS SELECT id,', +IF(@target_type='geometry','AsText(target)','target'), ' AS target,', +IF(@source_type='geometry','AsText(source)','source'), ' AS source ', +' FROM t3'); +INSERT INTO t3 VALUES +(1, +(SELECT target FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)), +(2, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +Warnings: +Warning 1292 Incorrect inet4 value: '0' for column `test`.`t3`.`target` at row 2 +SELECT * FROM v3; +id target source +1 0.0.0.0 0000 +2 0.0.0.0 0000 +TRUNCATE TABLE t3; +SET sql_mode=STRICT_ALL_TABLES; +INSERT INTO t3 VALUES +(1, +(SELECT target FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)), +(2, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +ERROR 22007: Incorrect inet4 value: '0' for column `test`.`t3`.`target` at row 2 +SELECT * FROM v3; +id target source +1 0.0.0.0 0000 +TRUNCATE TABLE t3; +SET sql_mode=@sql_mode_save; +DROP TABLE t3; +DROP VIEW v3; +CREATE TABLE t3 LIKE t2; +INSERT INTO t3 SELECT id,source,source FROM t2; +ERROR HY000: Cannot cast 'year' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2; +ERROR HY000: Cannot cast 'year' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source; +ERROR HY000: Cannot cast 'year' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source; +ERROR HY000: Cannot cast 'year' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source; +ERROR HY000: Cannot cast 'year' as 'inet4' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source; +ERROR HY000: Cannot cast 'year' as 'inet4' in assignment of `test`.`t3`.`target` +UPDATE t3 SET target=source; +ERROR HY000: Cannot cast 'year' as 'inet4' in assignment of `test`.`t3`.`target` +UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id; +ERROR HY000: Cannot cast 'year' as 'inet4' in assignment of `test`.`t3`.`target` +SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type); +SELECT @alter; +@alter +ALTER TABLE t3 MODIFY target year(4) +EXECUTE IMMEDIATE @alter; +ERROR HY000: Cannot cast 'inet4' as 'year' in assignment of `test`.`t3`.`target` +DROP TABLE t3; +DROP TABLE t2; +CREATE PROCEDURE p1() +BEGIN +DECLARE src year(4) DEFAULT NULL; +DECLARE dst inet4 DEFAULT NULL; +SET dst=src; +END; +$$ +CALL p1; +ERROR HY000: Cannot cast 'year' as 'inet4' in assignment of `dst` +DROP PROCEDURE p1; +CREATE FUNCTION f1(a inet4) RETURNS INT RETURN NULL;; +SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1)); +ERROR HY000: Cannot cast 'year' as 'inet4' in assignment of `a` +DROP FUNCTION f1; +CREATE PROCEDURE p1(a inet4) BEGIN END;; +CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1)); +ERROR HY000: Cannot cast 'year' as 'inet4' in assignment of `a` +DROP PROCEDURE p1; +CREATE PROCEDURE p1(OUT dst inet4) +BEGIN +DECLARE src year(4) DEFAULT NULL; +SET dst=src; +END; +$$ +CREATE PROCEDURE p2() +BEGIN +DECLARE dst inet4 DEFAULT NULL; +CALL p1(dst); +END; +$$ +CALL p2(); +ERROR HY000: Cannot cast 'year' as 'inet4' in assignment of `dst` +SHOW WARNINGS; +Level Code Message +Error 4078 Cannot cast 'year' as 'inet4' in assignment of `dst` +Note 4094 At line 4 in test.p1 +Note 4094 At line 4 in test.p2 +DROP PROCEDURE p2; +DROP PROCEDURE p1; +CREATE FUNCTION f1() RETURNS inet4 +BEGIN +DECLARE rc year(4) DEFAULT NULL; +RETURN rc; +END; +$$ +SELECT f1(); +ERROR HY000: Cannot cast 'year' as 'inet4' in assignment of `f1()` +DROP FUNCTION f1; +CREATE PROCEDURE p1() +BEGIN +DECLARE src year(4) DEFAULT NULL; +DECLARE cur1 CURSOR(t inet4) FOR SELECT * FROM t1 WHERE target=t; +OPEN cur1(src); +CLOSE cur1; +END; +$$ +CALL p1(); +ERROR HY000: Cannot cast 'year' as 'inet4' in assignment of `t` +DROP PROCEDURE p1; +CREATE TABLE t2 LIKE t1; +INSERT INTO t2 VALUES (); +CREATE PROCEDURE p1() +BEGIN +DECLARE dst inet4 DEFAULT NULL; +DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1; +OPEN cur2; +FETCH cur2 INTO dst; +CLOSE cur2; +END; +$$ +CALL p1(); +ERROR HY000: Cannot cast 'year' as 'inet4' in assignment of `dst` +DROP PROCEDURE p1; +DROP TABLE t2; +# End of type_store_assignment_incompatible.inc +DROP TABLE t1; +CREATE TABLE t1 (target YEAR DEFAULT 0, source INET4 DEFAULT '0.0.0.0'); +# Start of type_store_assignment_incompatible.inc +SET @sql_mode_save= @@sql_mode; +SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS +WHERE COLUMN_NAME='source' + AND TABLE_NAME='t1' + AND TABLE_SCHEMA='test'); +SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS +WHERE COLUMN_NAME='target' + AND TABLE_NAME='t1' + AND TABLE_SCHEMA='test'); +SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN '' + WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore) +ELSE @ignore +END; +CREATE TABLE t2 LIKE t1; +ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST; +INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT); +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `id` int(11) NOT NULL, + `target` year(4) DEFAULT 0000, + `source` inet4 DEFAULT '0.0.0.0', + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +CREATE TABLE t3 LIKE t2; +INSERT INTO t3 VALUES +(1, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +ERROR HY000: Cannot cast 'inet4' as 'year' in assignment of `test`.`t3`.`target` +DROP TABLE t3; +SET sql_mode=''; +CREATE TABLE t3 LIKE t2; +ALTER TABLE t3 ENGINE=MyISAM; +EXECUTE IMMEDIATE +CONCAT('CREATE VIEW v3 AS SELECT id,', +IF(@target_type='geometry','AsText(target)','target'), ' AS target,', +IF(@source_type='geometry','AsText(source)','source'), ' AS source ', +' FROM t3'); +INSERT INTO t3 VALUES +(1, +(SELECT target FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)), +(2, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +Warnings: +Warning 1265 Data truncated for column 'target' at row 2 +SELECT * FROM v3; +id target source +1 0000 0.0.0.0 +2 2000 0.0.0.0 +TRUNCATE TABLE t3; +SET sql_mode=STRICT_ALL_TABLES; +INSERT INTO t3 VALUES +(1, +(SELECT target FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)), +(2, +(SELECT source FROM t2 ORDER BY id LIMIT 1), +(SELECT source FROM t2 ORDER BY id LIMIT 1)); +ERROR 01000: Data truncated for column 'target' at row 2 +SELECT * FROM v3; +id target source +1 0000 0.0.0.0 +TRUNCATE TABLE t3; +SET sql_mode=@sql_mode_save; +DROP TABLE t3; +DROP VIEW v3; +CREATE TABLE t3 LIKE t2; +INSERT INTO t3 SELECT id,source,source FROM t2; +ERROR HY000: Cannot cast 'inet4' as 'year' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2; +ERROR HY000: Cannot cast 'inet4' as 'year' in assignment of `test`.`t3`.`target` +INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source; +ERROR HY000: Cannot cast 'inet4' as 'year' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source; +ERROR HY000: Cannot cast 'inet4' as 'year' in assignment of `test`.`t3`.`target` +INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source; +ERROR HY000: Cannot cast 'inet4' as 'year' in assignment of `test`.`t3`.`target` +INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source; +ERROR HY000: Cannot cast 'inet4' as 'year' in assignment of `test`.`t3`.`target` +UPDATE t3 SET target=source; +ERROR HY000: Cannot cast 'inet4' as 'year' in assignment of `test`.`t3`.`target` +UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id; +ERROR HY000: Cannot cast 'inet4' as 'year' in assignment of `test`.`t3`.`target` +SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type); +SELECT @alter; +@alter +ALTER TABLE t3 MODIFY target inet4 +EXECUTE IMMEDIATE @alter; +ERROR HY000: Cannot cast 'year' as 'inet4' in assignment of `test`.`t3`.`target` +DROP TABLE t3; +DROP TABLE t2; +CREATE PROCEDURE p1() +BEGIN +DECLARE src inet4 DEFAULT NULL; +DECLARE dst year(4) DEFAULT NULL; +SET dst=src; +END; +$$ +CALL p1; +ERROR HY000: Cannot cast 'inet4' as 'year' in assignment of `dst` +DROP PROCEDURE p1; +CREATE FUNCTION f1(a year(4)) RETURNS INT RETURN NULL;; +SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1)); +ERROR HY000: Cannot cast 'inet4' as 'year' in assignment of `a` +DROP FUNCTION f1; +CREATE PROCEDURE p1(a year(4)) BEGIN END;; +CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1)); +ERROR HY000: Cannot cast 'inet4' as 'year' in assignment of `a` +DROP PROCEDURE p1; +CREATE PROCEDURE p1(OUT dst year(4)) +BEGIN +DECLARE src inet4 DEFAULT NULL; +SET dst=src; +END; +$$ +CREATE PROCEDURE p2() +BEGIN +DECLARE dst year(4) DEFAULT NULL; +CALL p1(dst); +END; +$$ +CALL p2(); +ERROR HY000: Cannot cast 'inet4' as 'year' in assignment of `dst` +SHOW WARNINGS; +Level Code Message +Error 4078 Cannot cast 'inet4' as 'year' in assignment of `dst` +Note 4094 At line 4 in test.p1 +Note 4094 At line 4 in test.p2 +DROP PROCEDURE p2; +DROP PROCEDURE p1; +CREATE FUNCTION f1() RETURNS year(4) +BEGIN +DECLARE rc inet4 DEFAULT NULL; +RETURN rc; +END; +$$ +SELECT f1(); +ERROR HY000: Cannot cast 'inet4' as 'year' in assignment of `f1()` +DROP FUNCTION f1; +CREATE PROCEDURE p1() +BEGIN +DECLARE src inet4 DEFAULT NULL; +DECLARE cur1 CURSOR(t year(4)) FOR SELECT * FROM t1 WHERE target=t; +OPEN cur1(src); +CLOSE cur1; +END; +$$ +CALL p1(); +ERROR HY000: Cannot cast 'inet4' as 'year' in assignment of `t` +DROP PROCEDURE p1; +CREATE TABLE t2 LIKE t1; +INSERT INTO t2 VALUES (); +CREATE PROCEDURE p1() +BEGIN +DECLARE dst year(4) DEFAULT NULL; +DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1; +OPEN cur2; +FETCH cur2 INTO dst; +CLOSE cur2; +END; +$$ +CALL p1(); +ERROR HY000: Cannot cast 'inet4' as 'year' in assignment of `dst` +DROP PROCEDURE p1; +DROP TABLE t2; +# End of type_store_assignment_incompatible.inc +DROP TABLE t1; +# +# End of 10.10 tests +# diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_year.test b/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_year.test new file mode 100644 index 00000000000..34d6c1362ed --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet4_mix_year.test @@ -0,0 +1,19 @@ +--echo # +--echo # Start of 10.10 tests +--echo # + +--echo # +--echo # MDEV-23287 The INET4 data type +--echo # + +CREATE TABLE t1 (target INET4 DEFAULT '0.0.0.0', source YEAR DEFAULT 0); +--source include/type_mix_incompatible.inc +DROP TABLE t1; + +CREATE TABLE t1 (target YEAR DEFAULT 0, source INET4 DEFAULT '0.0.0.0'); +--source include/type_mix_incompatible.inc +DROP TABLE t1; + +--echo # +--echo # End of 10.10 tests +--echo # diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet4_myisam.result b/plugin/type_inet/mysql-test/type_inet/type_inet4_myisam.result new file mode 100644 index 00000000000..d4291e6f8f8 --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet4_myisam.result @@ -0,0 +1,111 @@ +# +# Start of 10.10 tests +# +# +# MDEV-23287 The INET4 data type +# +SET default_storage_engine=MyISAM; +# +# Range optimizer +# +CREATE TABLE t1 (a INET4, INDEX(a)); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` inet4 DEFAULT NULL, + KEY `a` (`a`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +FOR i IN 0..255 +DO +INSERT INTO t1 VALUES (CONCAT('0.0.0.', i)); +END FOR +$$ +SELECT * FROM t1 WHERE a='0.0.0.255'; +a +0.0.0.255 +EXPLAIN SELECT * FROM t1 WHERE a='0.0.0.255'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ref a a 5 const 1 Using where; Using index +SELECT * FROM t1 WHERE a='garbage'; +a +Warnings: +Warning 1292 Incorrect inet4 value: 'garbage' +EXPLAIN SELECT * FROM t1 WHERE a='garbage'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables +Warnings: +Warning 1292 Incorrect inet4 value: 'garbage' +SELECT * FROM t1 WHERE a>='0.0.0.254'; +a +0.0.0.254 +0.0.0.255 +EXPLAIN SELECT * FROM t1 WHERE a>='0.0.0.254'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range a a 5 NULL 2 Using where; Using index +SELECT * FROM t1 WHERE a>='garbage'; +a +EXPLAIN SELECT * FROM t1 WHERE a>='garbage'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables +SELECT * FROM t1 WHERE a IN ('0.0.0.128','0.0.0.160','0.0.0.240'); +a +0.0.0.128 +0.0.0.160 +0.0.0.240 +EXPLAIN SELECT * FROM t1 WHERE a IN ('0.0.0.128','0.0.0.160','0.0.0.240'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range a a 5 NULL 3 Using where; Using index +SELECT * FROM t1 WHERE a IN ('0.0.0.128','0.0.0.160','garbage'); +a +0.0.0.128 +0.0.0.160 +Warnings: +Warning 1292 Incorrect inet4 value: 'garbage' +EXPLAIN SELECT * FROM t1 WHERE a IN ('0.0.0.128','0.0.0.160','garbage'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range a a 5 NULL 2 Using where; Using index +Warnings: +Warning 1292 Incorrect inet4 value: 'garbage' +SELECT * FROM t1 WHERE a BETWEEN '0.0.0.128' AND '0.0.0.129'; +a +0.0.0.128 +0.0.0.129 +EXPLAIN SELECT * FROM t1 WHERE a BETWEEN '0.0.0.128' AND '0.0.0.129'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range a a 5 NULL 2 Using where; Using index +SELECT * FROM t1 WHERE a BETWEEN '0.0.0.128' AND 'garbage'; +a +EXPLAIN SELECT * FROM t1 WHERE a BETWEEN '0.0.0.128' AND 'garbage'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables +SELECT * FROM t1 WHERE a=CAST('0.0.0.255' AS INET4); +a +0.0.0.255 +EXPLAIN EXTENDED SELECT * FROM t1 WHERE a=CAST('0.0.0.255' AS INET4); +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ref a a 5 const 1 100.00 Using where; Using index +Warnings: +Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` = INET4'0.0.0.255' +DROP TABLE t1; +# +# MDEV-26742 Assertion `field->type_handler() == this' failed in FixedBinTypeBundle<NATIVE_LEN, MAX_CHAR_LEN>::Type_handler_fbt::stored_field_cmp_to_item +# +CREATE TABLE t1 (c varchar(64), key(c)) engine=myisam; +INSERT INTO t1 VALUES ('0.0.0.1'),('0.0.0.1'),('0.0.0.2'); +SELECT * FROM t1 WHERE c>CAST('0.0.0.1' AS INET4); +c +0.0.0.2 +EXPLAIN SELECT * FROM t1 WHERE c>CAST('0.0.0.1' AS INET4); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 index c c 67 NULL 3 Using where; Using index +SELECT * FROM t1 WHERE c=CAST('0.0.0.1' AS INET4); +c +0.0.0.1 +0.0.0.1 +EXPLAIN SELECT * FROM t1 WHERE c=CAST('0.0.0.1' AS INET4); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 index c c 67 NULL 3 Using where; Using index +DROP TABLE t1; +# +# End of 10.10 tests +# diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet4_myisam.test b/plugin/type_inet/mysql-test/type_inet/type_inet4_myisam.test new file mode 100644 index 00000000000..a877d992646 --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet4_myisam.test @@ -0,0 +1,28 @@ +--echo # +--echo # Start of 10.10 tests +--echo # + +--echo # +--echo # MDEV-23287 The INET4 data type +--echo # + + +SET default_storage_engine=MyISAM; +--source type_inet4_engines.inc + +--echo # +--echo # MDEV-26742 Assertion `field->type_handler() == this' failed in FixedBinTypeBundle<NATIVE_LEN, MAX_CHAR_LEN>::Type_handler_fbt::stored_field_cmp_to_item +--echo # + +CREATE TABLE t1 (c varchar(64), key(c)) engine=myisam; +INSERT INTO t1 VALUES ('0.0.0.1'),('0.0.0.1'),('0.0.0.2'); +SELECT * FROM t1 WHERE c>CAST('0.0.0.1' AS INET4); +EXPLAIN SELECT * FROM t1 WHERE c>CAST('0.0.0.1' AS INET4); +SELECT * FROM t1 WHERE c=CAST('0.0.0.1' AS INET4); +EXPLAIN SELECT * FROM t1 WHERE c=CAST('0.0.0.1' AS INET4); +DROP TABLE t1; + + +--echo # +--echo # End of 10.10 tests +--echo # diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet4_mysql.result b/plugin/type_inet/mysql-test/type_inet/type_inet4_mysql.result new file mode 100644 index 00000000000..c7f586fef96 --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet4_mysql.result @@ -0,0 +1,51 @@ +# +# Start of 10.10 tests +# +# +# MDEV-23287 The INET4 data type +# +CREATE TABLE t1 (a INET4); +Field 1: `a` +Org_field: `a` +Catalog: `def` +Database: `test` +Table: `t1` +Org_table: `t1` +Type: STRING (type=inet4) +Collation: latin1_swedish_ci (8) +Length: 15 +Max_length: 0 +Decimals: 0 +Flags: UNSIGNED BINARY + +Field 2: `b` +Org_field: `` +Catalog: `def` +Database: `` +Table: `` +Org_table: `` +Type: STRING (type=inet4) +Collation: latin1_swedish_ci (8) +Length: 15 +Max_length: 0 +Decimals: 0 +Flags: NOT_NULL UNSIGNED + +Field 3: `c` +Org_field: `` +Catalog: `def` +Database: `` +Table: `` +Org_table: `` +Type: STRING (type=inet4) +Collation: latin1_swedish_ci (8) +Length: 15 +Max_length: 0 +Decimals: 0 +Flags: UNSIGNED + + +DROP TABLE t1; +# +# End of 10.10 tests +# diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet4_mysql.test b/plugin/type_inet/mysql-test/type_inet/type_inet4_mysql.test new file mode 100644 index 00000000000..0e0d6f7dac9 --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet4_mysql.test @@ -0,0 +1,18 @@ +-- source include/have_working_dns.inc +-- source include/not_embedded.inc + +--echo # +--echo # Start of 10.10 tests +--echo # + +--echo # +--echo # MDEV-23287 The INET4 data type +--echo # + +CREATE TABLE t1 (a INET4); +--exec $MYSQL -t test --column-type-info -e "SELECT a, CAST('0.0.0.0' AS INET4) AS b, COALESCE(a) AS c FROM t1" 2>&1 +DROP TABLE t1; + +--echo # +--echo # End of 10.10 tests +--echo # diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet4_oracle.result b/plugin/type_inet/mysql-test/type_inet/type_inet4_oracle.result new file mode 100644 index 00000000000..7495a26755b --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet4_oracle.result @@ -0,0 +1,29 @@ +# +# Start of 10.10 tests +# +# +# MDEV-20913 sql_mode=ORACLE: INET6 does not work as a routine parameter type and return type +# +SET sql_mode=ORACLE; +CREATE OR REPLACE FUNCTION f1() RETURN INET4 AS +BEGIN +RETURN '255.255.255.255'; +END; +$$ +SELECT f1(); +f1() +255.255.255.255 +DROP FUNCTION f1; +SET sql_mode=ORACLE; +CREATE OR REPLACE FUNCTION f1(a INET4) RETURN INT AS +BEGIN +RETURN LENGTH(a); +END; +$$ +SELECT f1('000.000.000.000'); +f1('000.000.000.000') +7 +DROP FUNCTION f1; +# +# End of 10.10 tests +# diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet4_oracle.test b/plugin/type_inet/mysql-test/type_inet/type_inet4_oracle.test new file mode 100644 index 00000000000..3ff2fe0fcc6 --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet4_oracle.test @@ -0,0 +1,35 @@ +--echo # +--echo # Start of 10.10 tests +--echo # + +--echo # +--echo # MDEV-20913 sql_mode=ORACLE: INET6 does not work as a routine parameter type and return type +--echo # + +SET sql_mode=ORACLE; +DELIMITER $$; +CREATE OR REPLACE FUNCTION f1() RETURN INET4 AS +BEGIN + RETURN '255.255.255.255'; +END; +$$ +DELIMITER ;$$ +SELECT f1(); +DROP FUNCTION f1; + + +SET sql_mode=ORACLE; +DELIMITER $$; +CREATE OR REPLACE FUNCTION f1(a INET4) RETURN INT AS +BEGIN + RETURN LENGTH(a); +END; +$$ +DELIMITER ;$$ +SELECT f1('000.000.000.000'); +DROP FUNCTION f1; + + +--echo # +--echo # End of 10.10 tests +--echo # diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet4_partition.result b/plugin/type_inet/mysql-test/type_inet/type_inet4_partition.result new file mode 100644 index 00000000000..5cb6c011c13 --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet4_partition.result @@ -0,0 +1,36 @@ +# +# Start of 10.10 tests +# +# +# MDEV-23287 The INET4 data type +# MDEV-20831 Table partitioned by LIST/RANGE COLUMNS(inet6) can be created, but not inserted into +# +SET NAMES utf8; +CREATE TABLE t1 (a INET4) +PARTITION BY LIST COLUMNS(a) +(PARTITION p00 VALUES IN (10)); +ERROR HY000: Partition column values of incorrect type +CREATE TABLE t1 (a INET4) +PARTITION BY LIST COLUMNS(a) +(PARTITION p00 VALUES IN (TIME'10:20:30')); +ERROR HY000: Partition column values of incorrect type +CREATE TABLE t1 (a INET4) +PARTITION BY LIST COLUMNS(a) +(PARTITION p00 VALUES IN ('€')); +ERROR 22007: Incorrect inet4 value: '€' +CREATE TABLE t1 (a INET4) +PARTITION BY LIST COLUMNS(a) +(PARTITION p00 VALUES IN ('0.0.0.0'), +PARTITION pFF VALUES IN (0xFFFFFFFF)); +INSERT INTO t1 VALUES ('0.0.0.0'); +INSERT INTO t1 VALUES ('255.255.255.255'); +SELECT * FROM t1 PARTITION (p00); +a +0.0.0.0 +SELECT * FROM t1 PARTITION (pFF); +a +255.255.255.255 +DROP TABLE t1; +# +# End of 10.10 tests +# diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet4_partition.test b/plugin/type_inet/mysql-test/type_inet/type_inet4_partition.test new file mode 100644 index 00000000000..6ca97c4740f --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet4_partition.test @@ -0,0 +1,41 @@ +--source include/have_partition.inc + +--echo # +--echo # Start of 10.10 tests +--echo # + +--echo # +--echo # MDEV-23287 The INET4 data type +--echo # MDEV-20831 Table partitioned by LIST/RANGE COLUMNS(inet6) can be created, but not inserted into +--echo # + +SET NAMES utf8; + +--error ER_WRONG_TYPE_COLUMN_VALUE_ERROR +CREATE TABLE t1 (a INET4) + PARTITION BY LIST COLUMNS(a) + (PARTITION p00 VALUES IN (10)); + +--error ER_WRONG_TYPE_COLUMN_VALUE_ERROR +CREATE TABLE t1 (a INET4) + PARTITION BY LIST COLUMNS(a) + (PARTITION p00 VALUES IN (TIME'10:20:30')); + +--error ER_TRUNCATED_WRONG_VALUE +CREATE TABLE t1 (a INET4) + PARTITION BY LIST COLUMNS(a) + (PARTITION p00 VALUES IN ('€')); + +CREATE TABLE t1 (a INET4) + PARTITION BY LIST COLUMNS(a) + (PARTITION p00 VALUES IN ('0.0.0.0'), + PARTITION pFF VALUES IN (0xFFFFFFFF)); +INSERT INTO t1 VALUES ('0.0.0.0'); +INSERT INTO t1 VALUES ('255.255.255.255'); +SELECT * FROM t1 PARTITION (p00); +SELECT * FROM t1 PARTITION (pFF); +DROP TABLE t1; + +--echo # +--echo # End of 10.10 tests +--echo # diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet4_plugin.result b/plugin/type_inet/mysql-test/type_inet/type_inet4_plugin.result new file mode 100644 index 00000000000..7d36d8355ce --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet4_plugin.result @@ -0,0 +1,31 @@ +# +# Start of 10.10 tests +# +# +# MDEV-23287 The INET4 data type +# +SELECT +PLUGIN_NAME, +PLUGIN_VERSION, +PLUGIN_STATUS, +PLUGIN_TYPE, +PLUGIN_AUTHOR, +PLUGIN_DESCRIPTION, +PLUGIN_LICENSE, +PLUGIN_MATURITY, +PLUGIN_AUTH_VERSION +FROM INFORMATION_SCHEMA.PLUGINS +WHERE PLUGIN_TYPE='DATA TYPE' + AND PLUGIN_NAME='inet4'; +PLUGIN_NAME inet4 +PLUGIN_VERSION 1.0 +PLUGIN_STATUS ACTIVE +PLUGIN_TYPE DATA TYPE +PLUGIN_AUTHOR MariaDB Corporation +PLUGIN_DESCRIPTION Data type INET4 +PLUGIN_LICENSE GPL +PLUGIN_MATURITY Alpha +PLUGIN_AUTH_VERSION 1.0 +# +# End of 10.10 tests +# diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet4_plugin.test b/plugin/type_inet/mysql-test/type_inet/type_inet4_plugin.test new file mode 100644 index 00000000000..20875fc916e --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet4_plugin.test @@ -0,0 +1,27 @@ +--echo # +--echo # Start of 10.10 tests +--echo # + +--echo # +--echo # MDEV-23287 The INET4 data type +--echo # + +--vertical_results +SELECT + PLUGIN_NAME, + PLUGIN_VERSION, + PLUGIN_STATUS, + PLUGIN_TYPE, + PLUGIN_AUTHOR, + PLUGIN_DESCRIPTION, + PLUGIN_LICENSE, + PLUGIN_MATURITY, + PLUGIN_AUTH_VERSION +FROM INFORMATION_SCHEMA.PLUGINS + WHERE PLUGIN_TYPE='DATA TYPE' + AND PLUGIN_NAME='inet4'; +--horizontal_results + +--echo # +--echo # End of 10.10 tests +--echo # diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet4_stat_tables.result b/plugin/type_inet/mysql-test/type_inet/type_inet4_stat_tables.result new file mode 100644 index 00000000000..5a0afb686c1 --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet4_stat_tables.result @@ -0,0 +1,66 @@ +# +# Start of 10.10 tests +# +# +# MDEV-23287 The INET4 data type +# MDEV-20800 Server crashes in Field_inet6::store_warning upon updating table statistics +# +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('1.0.0.1'),('2.0.0.2'); +ANALYZE TABLE t1 PERSISTENT FOR ALL; +Table Op Msg_type Msg_text +test.t1 analyze status Engine-independent statistics collected +test.t1 analyze status OK +SELECT db_name, table_name, column_name, +min_value, max_value, +nulls_ratio, avg_frequency, +hist_size, hist_type, decode_histogram(hist_type,histogram) +FROM mysql.column_stats +WHERE db_name='test' AND table_name='t1'; +db_name test +table_name t1 +column_name a +min_value 1.0.0.1 +max_value 2.0.0.2 +nulls_ratio 0.0000 +avg_frequency 1.0000 +hist_size 2 +hist_type JSON_HB +decode_histogram(hist_type,histogram) { + "target_histogram_size": 254, + "collected_at": "REPLACED", + "collected_by": "REPLACED", + "histogram_hb": [ + { + "start": "1.0.0.1", + "size": 0.5, + "ndv": 1 + }, + { + "start": "2.0.0.2", + "end": "2.0.0.2", + "size": 0.5, + "ndv": 1 + } + ] +} +INSERT INTO t1 VALUES ('3.0.0.3'); +DROP TABLE t1; +# +# MDEV-23287 The INET4 data type +# MDEV-22509: Server crashes in Field_inet6::store_inet6_null_with_warn / Field::maybe_null +# +CREATE TABLE t1 (a INT, b INET4 NOT NULL); +INSERT INTO t1 VALUES (1,'0.0.0.0'),(2,'0.0.0.0'); +ANALYZE TABLE t1 PERSISTENT FOR ALL; +Table Op Msg_type Msg_text +test.t1 analyze status Engine-independent statistics collected +test.t1 analyze status OK +SELECT t1.a from t1; +a +1 +2 +DROP TABLE t1; +# +# End of 10.10 tests +# diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet4_stat_tables.test b/plugin/type_inet/mysql-test/type_inet/type_inet4_stat_tables.test new file mode 100644 index 00000000000..ea01a6f0735 --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet4_stat_tables.test @@ -0,0 +1,40 @@ +--source include/have_stat_tables.inc + +--echo # +--echo # Start of 10.10 tests +--echo # + +--echo # +--echo # MDEV-23287 The INET4 data type +--echo # MDEV-20800 Server crashes in Field_inet6::store_warning upon updating table statistics +--echo # + +CREATE TABLE t1 (a INET4); +INSERT INTO t1 VALUES ('1.0.0.1'),('2.0.0.2'); +ANALYZE TABLE t1 PERSISTENT FOR ALL; +--vertical_results +--source include/histogram_replaces.inc +SELECT db_name, table_name, column_name, + min_value, max_value, + nulls_ratio, avg_frequency, + hist_size, hist_type, decode_histogram(hist_type,histogram) +FROM mysql.column_stats +WHERE db_name='test' AND table_name='t1'; +--horizontal_results +INSERT INTO t1 VALUES ('3.0.0.3'); +DROP TABLE t1; + +--echo # +--echo # MDEV-23287 The INET4 data type +--echo # MDEV-22509: Server crashes in Field_inet6::store_inet6_null_with_warn / Field::maybe_null +--echo # + +CREATE TABLE t1 (a INT, b INET4 NOT NULL); +INSERT INTO t1 VALUES (1,'0.0.0.0'),(2,'0.0.0.0'); +ANALYZE TABLE t1 PERSISTENT FOR ALL; +SELECT t1.a from t1; +DROP TABLE t1; + +--echo # +--echo # End of 10.10 tests +--echo # diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet6.result b/plugin/type_inet/mysql-test/type_inet/type_inet6.result index 838a7ee49d3..8d52e85cb91 100644 --- a/plugin/type_inet/mysql-test/type_inet/type_inet6.result +++ b/plugin/type_inet/mysql-test/type_inet/type_inet6.result @@ -1928,7 +1928,7 @@ a b :: NULL DROP TABLE t1; SET timestamp=UNIX_TIMESTAMP('2001-01-01 10:20:30'); -CREATE TABLE t1 (a INET6, b TIMESTAMP); +CREATE TABLE t1 (a INET6, b TIMESTAMP NOT NULL DEFAULT NOW() ON UPDATE NOW()); INSERT INTO t1 (a) VALUES ('::'); UPDATE t1 SET b=a; ERROR HY000: Cannot cast 'inet6' as 'timestamp' in assignment of `test`.`t1`.`b` diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet6.test b/plugin/type_inet/mysql-test/type_inet/type_inet6.test index 857a08e7cd1..97370c37ea0 100644 --- a/plugin/type_inet/mysql-test/type_inet/type_inet6.test +++ b/plugin/type_inet/mysql-test/type_inet/type_inet6.test @@ -1411,7 +1411,7 @@ SELECT * FROM t1; DROP TABLE t1; SET timestamp=UNIX_TIMESTAMP('2001-01-01 10:20:30'); -CREATE TABLE t1 (a INET6, b TIMESTAMP); +CREATE TABLE t1 (a INET6, b TIMESTAMP NOT NULL DEFAULT NOW() ON UPDATE NOW()); INSERT INTO t1 (a) VALUES ('::'); --error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION UPDATE t1 SET b=a; diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_inet4.result b/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_inet4.result new file mode 100644 index 00000000000..0910f2d85e6 --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_inet4.result @@ -0,0 +1,19 @@ +# +# Start of 10.10 tests +# +# +# MDEV-23287 The INET4 data type +# +CREATE TABLE t1 (i4 INET4, i6 INET6); +SELECT * FROM t1 WHERE i4=i6; +ERROR HY000: Illegal parameter data types inet4 and inet6 for operation '=' +SELECT COALESCE(i4,i6) FROM t1 WHERE i4=i6; +ERROR HY000: Illegal parameter data types inet4 and inet6 for operation 'coalesce' +SELECT LEAST(i4,i6) FROM t1 WHERE i4=i6; +ERROR HY000: Illegal parameter data types inet4 and inet6 for operation 'least' +SELECT i4 FROM t1 UNION ALL SELECT i6 FROM t1; +ERROR HY000: Illegal parameter data types inet4 and inet6 for operation 'UNION' +DROP TABLE t1; +# +# End of 10.10 tests +# diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_inet4.test b/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_inet4.test new file mode 100644 index 00000000000..ac35b95befd --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_inet4.test @@ -0,0 +1,26 @@ +--echo # +--echo # Start of 10.10 tests +--echo # + +--echo # +--echo # MDEV-23287 The INET4 data type +--echo # + +# Mixing INET6 and INET4 is not implemented yet + +CREATE TABLE t1 (i4 INET4, i6 INET6); +--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION +SELECT * FROM t1 WHERE i4=i6; +--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION +SELECT COALESCE(i4,i6) FROM t1 WHERE i4=i6; +--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION +SELECT LEAST(i4,i6) FROM t1 WHERE i4=i6; +--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION +SELECT i4 FROM t1 UNION ALL SELECT i6 FROM t1; + +DROP TABLE t1; + + +--echo # +--echo # End of 10.10 tests +--echo # diff --git a/plugin/type_inet/plugin.cc b/plugin/type_inet/plugin.cc index 0b57e2bec1f..9eb8de1050a 100644 --- a/plugin/type_inet/plugin.cc +++ b/plugin/type_inet/plugin.cc @@ -21,6 +21,13 @@ #include <mysql/plugin_data_type.h> #include <mysql/plugin_function.h> +static struct st_mariadb_data_type plugin_descriptor_type_inet4= +{ + MariaDB_DATA_TYPE_INTERFACE_VERSION, + Inet4Bundle::type_handler_fbt() +}; + + static struct st_mariadb_data_type plugin_descriptor_type_inet6= { MariaDB_DATA_TYPE_INTERFACE_VERSION, @@ -171,6 +178,21 @@ static Plugin_function maria_declare_plugin(type_inet) { MariaDB_DATA_TYPE_PLUGIN, // the plugin type (see include/mysql/plugin.h) + &plugin_descriptor_type_inet4,// pointer to type-specific plugin descriptor + "inet4", // plugin name + "MariaDB Corporation", // plugin author + "Data type INET4", // the plugin description + PLUGIN_LICENSE_GPL, // the plugin license (see include/mysql/plugin.h) + 0, // Pointer to plugin initialization function + 0, // Pointer to plugin deinitialization function + 0x0100, // Numeric version 0xAABB means AA.BB version + NULL, // Status variables + NULL, // System variables + "1.0", // String version representation + MariaDB_PLUGIN_MATURITY_ALPHA // Maturity(see include/mysql/plugin.h)*/ +}, +{ + MariaDB_DATA_TYPE_PLUGIN, // the plugin type (see include/mysql/plugin.h) &plugin_descriptor_type_inet6,// pointer to type-specific plugin descriptor "inet6", // plugin name "MariaDB Corporation", // plugin author diff --git a/plugin/type_inet/sql_type_inet.cc b/plugin/type_inet/sql_type_inet.cc index b8d2ef706a9..3d499620780 100644 --- a/plugin/type_inet/sql_type_inet.cc +++ b/plugin/type_inet/sql_type_inet.cc @@ -44,7 +44,7 @@ static const char HEX_DIGITS[]= "0123456789abcdef"; IPv4-part differently on different platforms. */ -bool Inet4::ascii_to_ipv4(const char *str, size_t str_length) +bool Inet4::ascii_to_fbt(const char *str, size_t str_length) { if (str_length < 7) { @@ -259,8 +259,9 @@ bool Inet6::ascii_to_fbt(const char *str, size_t str_length) return true; } - Inet4_null tmp(group_start_ptr, (size_t) (str_end - group_start_ptr), - &my_charset_latin1); + Inet4Bundle::Fbt_null tmp(group_start_ptr, + (size_t) (str_end - group_start_ptr), + &my_charset_latin1); if (tmp.is_null()) { DBUG_PRINT("error", ("ascii_to_ipv6(%.*s): invalid IPv6 address: " @@ -268,7 +269,7 @@ bool Inet6::ascii_to_fbt(const char *str, size_t str_length) return true; } - tmp.to_binary(dst, IN_ADDR_SIZE); + tmp.to_record(dst, IN_ADDR_SIZE); dst += IN_ADDR_SIZE; chars_in_group= 0; @@ -483,7 +484,7 @@ size_t Inet6::to_string(char *dst, size_t dstsize) const // the string (dst). Now it's time to dump IPv4-part. return (size_t) (p - dst) + - Inet4_null((const char *) (ipv6_bytes + 12), 4). + Inet4((const char *) (ipv6_bytes + 12), 4). to_string(p, dstsize_available); } else @@ -512,3 +513,9 @@ const Name &Inet6::default_value() static Name def(STRING_WITH_LEN("::")); return def; } + +const Name &Inet4::default_value() +{ + static Name def(STRING_WITH_LEN("0.0.0.0")); + return def; +} diff --git a/plugin/type_inet/sql_type_inet.h b/plugin/type_inet/sql_type_inet.h index b0560f1ffe0..3ea06f6600c 100644 --- a/plugin/type_inet/sql_type_inet.h +++ b/plugin/type_inet/sql_type_inet.h @@ -48,94 +48,16 @@ typedef FixedBinTypeBundle<Inet6> Inet6Bundle; /***********************************************************************/ -class Inet4 +class Inet4: public FixedBinTypeStorage<IN_ADDR_SIZE, IN_ADDR_MAX_CHAR_LENGTH> { - char m_buffer[IN_ADDR_SIZE]; -protected: - bool ascii_to_ipv4(const char *str, size_t length); - bool character_string_to_ipv4(const char *str, size_t str_length, - CHARSET_INFO *cs) - { - if (cs->state & MY_CS_NONASCII) - { - char tmp[IN_ADDR_MAX_CHAR_LENGTH]; - String_copier copier; - uint length= copier.well_formed_copy(&my_charset_latin1, tmp, sizeof(tmp), - cs, str, str_length); - return ascii_to_ipv4(tmp, length); - } - return ascii_to_ipv4(str, str_length); - } - bool binary_to_ipv4(const char *str, size_t length) - { - if (length != sizeof(m_buffer)) - return true; - memcpy(m_buffer, str, length); - return false; - } - // Non-initializing constructor - Inet4() { } public: - void to_binary(char *dst, size_t dstsize) const - { - DBUG_ASSERT(dstsize >= sizeof(m_buffer)); - memcpy(dst, m_buffer, sizeof(m_buffer)); - } - bool to_binary(String *to) const - { - return to->copy(m_buffer, sizeof(m_buffer), &my_charset_bin); - } + using FixedBinTypeStorage::FixedBinTypeStorage; + bool ascii_to_fbt(const char *str, size_t str_length); size_t to_string(char *dst, size_t dstsize) const; - bool to_string(String *to) const - { - to->set_charset(&my_charset_latin1); - if (to->alloc(INET_ADDRSTRLEN)) - return true; - to->length((uint32) to_string((char*) to->ptr(), INET_ADDRSTRLEN)); - return false; - } + static const Name &default_value(); }; +typedef FixedBinTypeBundle<Inet4> Inet4Bundle; -class Inet4_null: public Inet4, public Null_flag -{ -public: - // Initialize from a text representation - Inet4_null(const char *str, size_t length, CHARSET_INFO *cs) - :Null_flag(character_string_to_ipv4(str, length, cs)) - { } - Inet4_null(const String &str) - :Inet4_null(str.ptr(), str.length(), str.charset()) - { } - // Initialize from a binary representation - Inet4_null(const char *str, size_t length) - :Null_flag(binary_to_ipv4(str, length)) - { } - Inet4_null(const Binary_string &str) - :Inet4_null(str.ptr(), str.length()) - { } -public: - const Inet4& to_inet4() const - { - DBUG_ASSERT(!is_null()); - return *this; - } - void to_binary(char *dst, size_t dstsize) const - { - to_inet4().to_binary(dst, dstsize); - } - bool to_binary(String *to) const - { - return to_inet4().to_binary(to); - } - size_t to_string(char *dst, size_t dstsize) const - { - return to_inet4().to_string(dst, dstsize); - } - bool to_string(String *to) const - { - return to_inet4().to_string(to); - } -}; #endif /* SQL_TYPE_INET_H */ |