From: Date: July 16 2007 8:04am Subject: IPV6 data type patch List-Archive: http://lists.mysql.com/internals/34830 Message-Id: <42fa82300707152304r35ab0272ybb059f5153ecb14f@mail.gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Hi, Down below you can find IPV6 data type patch, as result of Google Summer of Code midterm milestone. Regards Milos ------------------------------------------------------------------------------ diff -urN mysql-5.1.19-beta/client/mysql.cc mysql-5.1.19-beta_new/client/mysql.cc --- mysql-5.1.19-beta/client/mysql.cc 2007-05-26 10:19:00.000000000 +0000 +++ mysql-5.1.19-beta_new/client/mysql.cc 2007-05-26 10:18:59.000000000 +0000 @@ -2247,6 +2247,10 @@ static const char *fieldtype2str(enum enum_field_types type) { switch (type) { + case MYSQL_TYPE_IPV6: return "IPV6"; + case MYSQL_TYPE_IPV4: return "IPV4"; + case MYSQL_TYPE_MAC48: return "MAC48"; + case MYSQL_TYPE_EUI64: return "EUI64"; case MYSQL_TYPE_BIT: return "BIT"; case MYSQL_TYPE_BLOB: return "BLOB"; case MYSQL_TYPE_DATE: return "DATE"; diff -urN mysql-5.1.19-beta/client/mysqldump.c mysql-5.1.19-beta_new/client/mysqldump.c --- mysql-5.1.19-beta/client/mysqldump.c 2007-05-26 10:19:14.000000000 +0000 +++ mysql-5.1.19-beta_new/client/mysqldump.c 2007-05-26 10:18:59.000000000 +0000 @@ -2668,6 +2668,7 @@ is_blob= (opt_hex_blob && field->charsetnr == 63 && (field->type == MYSQL_TYPE_BIT || field->type == MYSQL_TYPE_STRING || + field->type == MYSQL_TYPE_IPV6 || field->type == MYSQL_TYPE_VAR_STRING || field->type == MYSQL_TYPE_VARCHAR || field->type == MYSQL_TYPE_BLOB || diff -urN mysql-5.1.19-beta/include/my_net.h mysql-5.1.19-beta_new/include/my_net.h --- mysql-5.1.19-beta/include/my_net.h 2007-05-26 10:19:05.000000000 +0000 +++ mysql-5.1.19-beta_new/include/my_net.h 2007-05-26 10:18:59.000000000 +0000 @@ -124,5 +124,13 @@ #define h_errno errno #endif + +unsigned char char2nibble(char *one); +int parse_ipv4(char *result,const char *sample); +int parse_ipv6(char *result,const char *sample); +int parse_nibblenibblecolumn(char *result,const char *sample,int nr_sect); +int pack_result(char *packed,char *unpack,int len); + C_MODE_END #endif + diff -urN mysql-5.1.19-beta/include/mysql_com.h mysql-5.1.19-beta_new/include/mysql_com.h --- mysql-5.1.19-beta/include/mysql_com.h 2007-05-26 10:18:51.000000000 +0000 +++ mysql-5.1.19-beta_new/include/mysql_com.h 2007-05-26 10:18:59.000000000 +0000 @@ -240,6 +240,10 @@ MYSQL_TYPE_DATETIME, MYSQL_TYPE_YEAR, MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR, MYSQL_TYPE_BIT, + MYSQL_TYPE_EUI64=242, + MYSQL_TYPE_MAC48=243, + MYSQL_TYPE_IPV4=244, + MYSQL_TYPE_IPV6=245, MYSQL_TYPE_NEWDECIMAL=246, MYSQL_TYPE_ENUM=247, MYSQL_TYPE_SET=248, diff -urN mysql-5.1.19-beta/libmysql/libmysql.c mysql-5.1.19-beta_new/libmysql/libmysql.c --- mysql-5.1.19-beta/libmysql/libmysql.c 2007-05-26 10:18:57.000000000 +0000 +++ mysql-5.1.19-beta_new/libmysql/libmysql.c 2007-05-26 10:18:59.000000000 +0000 @@ -3257,6 +3257,10 @@ case MYSQL_TYPE_VARCHAR: case MYSQL_TYPE_VAR_STRING: case MYSQL_TYPE_STRING: + case MYSQL_TYPE_IPV6: + case MYSQL_TYPE_IPV4: + case MYSQL_TYPE_MAC48: + case MYSQL_TYPE_EUI64: case MYSQL_TYPE_DECIMAL: case MYSQL_TYPE_NEWDECIMAL: param->store_param_func= store_param_str; @@ -4324,6 +4328,10 @@ case MYSQL_TYPE_LONG_BLOB: case MYSQL_TYPE_BLOB: case MYSQL_TYPE_BIT: + case MYSQL_TYPE_IPV6: + case MYSQL_TYPE_IPV4: + case MYSQL_TYPE_MAC48: + case MYSQL_TYPE_EUI64: DBUG_ASSERT(param->buffer_length != 0); param->fetch_result= fetch_result_bin; break; @@ -4402,6 +4410,10 @@ case MYSQL_TYPE_BLOB: case MYSQL_TYPE_VAR_STRING: case MYSQL_TYPE_STRING: + case MYSQL_TYPE_IPV6: + case MYSQL_TYPE_IPV4: + case MYSQL_TYPE_MAC48: + case MYSQL_TYPE_EUI64: case MYSQL_TYPE_BIT: param->skip_result= skip_result_string; break; diff -urN mysql-5.1.19-beta/libmysql_r/libmysql.c mysql-5.1.19-beta_new/libmysql_r/libmysql.c --- mysql-5.1.19-beta/libmysql_r/libmysql.c 2007-05-26 10:18:57.000000000 +0000 +++ mysql-5.1.19-beta_new/libmysql_r/libmysql.c 2007-05-26 10:18:59.000000000 +0000 @@ -3257,6 +3257,10 @@ case MYSQL_TYPE_VARCHAR: case MYSQL_TYPE_VAR_STRING: case MYSQL_TYPE_STRING: + case MYSQL_TYPE_IPV6: + case MYSQL_TYPE_IPV4: + case MYSQL_TYPE_MAC48: + case MYSQL_TYPE_EUI64: case MYSQL_TYPE_DECIMAL: case MYSQL_TYPE_NEWDECIMAL: param->store_param_func= store_param_str; @@ -4324,6 +4328,10 @@ case MYSQL_TYPE_LONG_BLOB: case MYSQL_TYPE_BLOB: case MYSQL_TYPE_BIT: + case MYSQL_TYPE_IPV6: + case MYSQL_TYPE_IPV4: + case MYSQL_TYPE_MAC48: + case MYSQL_TYPE_EUI64: DBUG_ASSERT(param->buffer_length != 0); param->fetch_result= fetch_result_bin; break; @@ -4402,6 +4410,10 @@ case MYSQL_TYPE_BLOB: case MYSQL_TYPE_VAR_STRING: case MYSQL_TYPE_STRING: + case MYSQL_TYPE_IPV6: + case MYSQL_TYPE_IPV4: + case MYSQL_TYPE_MAC48: + case MYSQL_TYPE_EUI64: case MYSQL_TYPE_BIT: param->skip_result= skip_result_string; break; diff -urN mysql-5.1.19-beta/libmysqld/field.cc mysql-5.1.19-beta_new/libmysqld/field.cc --- mysql-5.1.19-beta/libmysqld/field.cc 2007-05-26 10:18:32.000000000 +0000 +++ mysql-5.1.19-beta_new/libmysqld/field.cc 2007-05-26 10:18:59.000000000 +0000 @@ -62,7 +62,7 @@ and index of field in thia array. */ #define FIELDTYPE_TEAR_FROM (MYSQL_TYPE_BIT + 1) -#define FIELDTYPE_TEAR_TO (MYSQL_TYPE_NEWDECIMAL - 1) +#define FIELDTYPE_TEAR_TO (MYSQL_TYPE_EUI64 - 1) #define FIELDTYPE_NUM (FIELDTYPE_TEAR_FROM + (255 - FIELDTYPE_TEAR_TO)) inline int field_type2index (enum_field_types field_type) { @@ -92,8 +92,12 @@ MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -123,8 +127,12 @@ MYSQL_TYPE_VARCHAR, MYSQL_TYPE_TINY, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -154,8 +162,12 @@ MYSQL_TYPE_VARCHAR, MYSQL_TYPE_SHORT, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -185,8 +197,12 @@ MYSQL_TYPE_VARCHAR, MYSQL_TYPE_LONG, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -216,8 +232,12 @@ MYSQL_TYPE_VARCHAR, MYSQL_TYPE_FLOAT, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_DOUBLE, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -247,8 +267,12 @@ MYSQL_TYPE_VARCHAR, MYSQL_TYPE_DOUBLE, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_DOUBLE, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -278,8 +302,12 @@ MYSQL_TYPE_DATETIME, MYSQL_TYPE_YEAR, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_BIT, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_ENUM, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -309,8 +337,12 @@ MYSQL_TYPE_DATETIME, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -340,8 +372,12 @@ MYSQL_TYPE_VARCHAR, MYSQL_TYPE_LONGLONG, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -371,8 +407,12 @@ MYSQL_TYPE_VARCHAR, MYSQL_TYPE_INT24, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -402,12 +442,16 @@ MYSQL_TYPE_DATETIME, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB - MYSQL_TYPE_VARCHAR, MYSQL_TYPE_TINY_BLOB, + MYSQL_TYPE_VARCHAR, MYSQL_TYPE_TINY_BLOB, //MYSQL_TYPE_MEDIUM_BLOB MYSQL_TYPE_LONG_BLOB MYSQL_TYPE_MEDIUM_BLOB, MYSQL_TYPE_LONG_BLOB, //MYSQL_TYPE_BLOB MYSQL_TYPE_VAR_STRING @@ -433,8 +477,12 @@ MYSQL_TYPE_DATETIME, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -464,8 +512,12 @@ MYSQL_TYPE_DATETIME, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -495,8 +547,12 @@ MYSQL_TYPE_VARCHAR, MYSQL_TYPE_YEAR, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -526,8 +582,12 @@ MYSQL_TYPE_DATETIME, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -557,8 +617,12 @@ MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -588,8 +652,12 @@ MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_BIT, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -601,6 +669,146 @@ //MYSQL_TYPE_STRING MYSQL_TYPE_GEOMETRY MYSQL_TYPE_STRING, MYSQL_TYPE_VARCHAR }, + /* MYSQL_TYPE_EUI64 -> */ + { + //MYSQL_TYPE_DECIMAL MYSQL_TYPE_TINY + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_SHORT MYSQL_TYPE_LONG + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_FLOAT MYSQL_TYPE_DOUBLE + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_NULL MYSQL_TYPE_TIMESTAMP + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_LONGLONG MYSQL_TYPE_INT24 + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_DATE MYSQL_TYPE_TIME + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_DATETIME MYSQL_TYPE_YEAR + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR + MYSQL_TYPE_STRING, MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_BIT <16>-<241> + MYSQL_TYPE_STRING, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_STRING, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB + MYSQL_TYPE_STRING, MYSQL_TYPE_TINY_BLOB, + //MYSQL_TYPE_MEDIUM_BLOB MYSQL_TYPE_LONG_BLOB + MYSQL_TYPE_MEDIUM_BLOB, MYSQL_TYPE_LONG_BLOB, + //MYSQL_TYPE_BLOB MYSQL_TYPE_VAR_STRING + MYSQL_TYPE_BLOB, MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_STRING MYSQL_TYPE_GEOMETRY + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING + }, + /* MYSQL_TYPE_MAC48 -> */ + { + //MYSQL_TYPE_DECIMAL MYSQL_TYPE_TINY + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_SHORT MYSQL_TYPE_LONG + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_FLOAT MYSQL_TYPE_DOUBLE + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_NULL MYSQL_TYPE_TIMESTAMP + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_LONGLONG MYSQL_TYPE_INT24 + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_DATE MYSQL_TYPE_TIME + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_DATETIME MYSQL_TYPE_YEAR + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR + MYSQL_TYPE_STRING, MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_BIT <16>-<241> + MYSQL_TYPE_STRING, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_STRING, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB + MYSQL_TYPE_STRING, MYSQL_TYPE_TINY_BLOB, + //MYSQL_TYPE_MEDIUM_BLOB MYSQL_TYPE_LONG_BLOB + MYSQL_TYPE_MEDIUM_BLOB, MYSQL_TYPE_LONG_BLOB, + //MYSQL_TYPE_BLOB MYSQL_TYPE_VAR_STRING + MYSQL_TYPE_BLOB, MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_STRING MYSQL_TYPE_GEOMETRY + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING + }, + /* MYSQL_TYPE_IPV4 -> */ + { + //MYSQL_TYPE_DECIMAL MYSQL_TYPE_TINY + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_SHORT MYSQL_TYPE_LONG + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_FLOAT MYSQL_TYPE_DOUBLE + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_NULL MYSQL_TYPE_TIMESTAMP + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_LONGLONG MYSQL_TYPE_INT24 + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_DATE MYSQL_TYPE_TIME + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_DATETIME MYSQL_TYPE_YEAR + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR + MYSQL_TYPE_STRING, MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_BIT <16>-<241> + MYSQL_TYPE_STRING, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_STRING, + //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB + MYSQL_TYPE_STRING, MYSQL_TYPE_TINY_BLOB, + //MYSQL_TYPE_MEDIUM_BLOB MYSQL_TYPE_LONG_BLOB + MYSQL_TYPE_MEDIUM_BLOB, MYSQL_TYPE_LONG_BLOB, + //MYSQL_TYPE_BLOB MYSQL_TYPE_VAR_STRING + MYSQL_TYPE_BLOB, MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_STRING MYSQL_TYPE_GEOMETRY + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING + }, + /* MYSQL_TYPE_IPV6 -> */ + { + //MYSQL_TYPE_DECIMAL MYSQL_TYPE_TINY + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_SHORT MYSQL_TYPE_LONG + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_FLOAT MYSQL_TYPE_DOUBLE + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_NULL MYSQL_TYPE_TIMESTAMP + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_LONGLONG MYSQL_TYPE_INT24 + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_DATE MYSQL_TYPE_TIME + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_DATETIME MYSQL_TYPE_YEAR + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR + MYSQL_TYPE_STRING, MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_BIT <16>-<241> + MYSQL_TYPE_STRING, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_STRING, MYSQL_TYPE_IPV6, + //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB + MYSQL_TYPE_STRING, MYSQL_TYPE_TINY_BLOB, + //MYSQL_TYPE_MEDIUM_BLOB MYSQL_TYPE_LONG_BLOB + MYSQL_TYPE_MEDIUM_BLOB, MYSQL_TYPE_LONG_BLOB, + //MYSQL_TYPE_BLOB MYSQL_TYPE_VAR_STRING + MYSQL_TYPE_BLOB, MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_STRING MYSQL_TYPE_GEOMETRY + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING + }, /* MYSQL_TYPE_NEWDECIMAL -> */ { //MYSQL_TYPE_DECIMAL MYSQL_TYPE_TINY @@ -619,8 +827,12 @@ MYSQL_TYPE_VARCHAR, MYSQL_TYPE_NEWDECIMAL, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -650,8 +862,12 @@ MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -681,8 +897,12 @@ MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -712,8 +932,12 @@ MYSQL_TYPE_TINY_BLOB, MYSQL_TYPE_TINY_BLOB, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_TINY_BLOB, MYSQL_TYPE_TINY_BLOB, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_TINY_BLOB, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_BLOB, MYSQL_TYPE_BLOB, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_BLOB, MYSQL_TYPE_BLOB, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_TINY_BLOB, MYSQL_TYPE_TINY_BLOB, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -743,8 +967,12 @@ MYSQL_TYPE_MEDIUM_BLOB, MYSQL_TYPE_MEDIUM_BLOB, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_MEDIUM_BLOB, MYSQL_TYPE_MEDIUM_BLOB, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_MEDIUM_BLOB, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_MEDIUM_BLOB, MYSQL_TYPE_MEDIUM_BLOB, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_MEDIUM_BLOB, MYSQL_TYPE_MEDIUM_BLOB, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_MEDIUM_BLOB, MYSQL_TYPE_MEDIUM_BLOB, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -774,8 +1002,12 @@ MYSQL_TYPE_LONG_BLOB, MYSQL_TYPE_LONG_BLOB, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_LONG_BLOB, MYSQL_TYPE_LONG_BLOB, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_LONG_BLOB, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_LONG_BLOB, MYSQL_TYPE_LONG_BLOB, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_LONG_BLOB, MYSQL_TYPE_LONG_BLOB, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_LONG_BLOB, MYSQL_TYPE_LONG_BLOB, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -805,8 +1037,12 @@ MYSQL_TYPE_BLOB, MYSQL_TYPE_BLOB, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_BLOB, MYSQL_TYPE_BLOB, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_BLOB, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_BLOB, MYSQL_TYPE_BLOB, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_BLOB, MYSQL_TYPE_BLOB, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_BLOB, MYSQL_TYPE_BLOB, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -836,8 +1072,12 @@ MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -867,8 +1107,12 @@ MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_STRING, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_STRING, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -898,8 +1142,12 @@ MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -952,8 +1200,12 @@ STRING_RESULT, INT_RESULT, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR STRING_RESULT, STRING_RESULT, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> STRING_RESULT, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + STRING_RESULT, STRING_RESULT, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + STRING_RESULT, STRING_RESULT, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM DECIMAL_RESULT, STRING_RESULT, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -1040,6 +1292,10 @@ case MYSQL_TYPE_BLOB: case MYSQL_TYPE_VAR_STRING: case MYSQL_TYPE_STRING: + case MYSQL_TYPE_EUI64: + case MYSQL_TYPE_MAC48: + case MYSQL_TYPE_IPV4: + case MYSQL_TYPE_IPV6: case MYSQL_TYPE_GEOMETRY: return TRUE; default: @@ -6046,6 +6302,80 @@ } +int Field_ipv6::store(const char *from,uint length,CHARSET_INFO *cs) +{ +char halfbyte_result[40]; +int rc; + +rc=parse_ipv6(halfbyte_result,from); +if ( rc < 0 ) { + memset(ptr,0,field_length); + return 1; + } + +pack_result(ptr,halfbyte_result,16); +return 1; +} + + +int Field_ipv4::store(const char *from,uint length,CHARSET_INFO *cs) +{ +char halfbyte_result[8]; +int rc; + +rc=parse_ipv4(halfbyte_result,from); +if ( rc < 0 ) { + memset(ptr,0,field_length); + return 1; + } + +pack_result(ptr,halfbyte_result,4); +return 0; +} + + +int Field_ipv4::store(longlong nr, bool unsigned_val) +{ + ASSERT_COLUMN_MARKED_FOR_WRITE; + unsigned char *cp; + + cp= (unsigned char *)ptr; + cp[0]= (char) (0xff & (nr >> 24)); + cp[1]= (char) (0xff & (nr >> 16)); + cp[2]= (char) (0xff & (nr >> 8)); + cp[3]= (char) (0xff & nr); + + return 0; +} + + +int Field_mac48::store(const char *from,uint length,CHARSET_INFO *cs) +{ + +if ( parse_nibblenibblecolumn(ptr,from,6) < 0 ) { + memset(ptr,0,field_length); + return 1; + } +return 0; +} + + +int Field_eui64::store(const char *from,uint length,CHARSET_INFO *cs) +{ +if ( parse_nibblenibblecolumn(ptr,from,8) < 0 ) { + memset(ptr,0,field_length); + return 1; + } +return 0; +} + + +int Field_binary::store(const char *from,uint length,CHARSET_INFO *cs) { +memset(ptr,0,field_length); +return 1; +} + + /* Store double value in Field_string or Field_varstring. @@ -6132,6 +6462,39 @@ } +int Field_binary::store(longlong nr, bool unsigned_val) +{ + memset(ptr,0,field_length); + return 1; +} + + + +int Field_binary::store(double nr, bool unsigned_val) +{ + memset(ptr,0,field_length); + return 1; +} + + + +int Field_binary::store(double nr) +{ + memset(ptr,0,field_length); + return 1; +} + + + +int Field_binary::store_decimal(const my_decimal *d) +{ + memset(ptr,0,field_length); + return 1; +} + + + + int Field_longstr::store_decimal(const my_decimal *d) { char buff[DECIMAL_MAX_STR_LENGTH+1]; @@ -6203,6 +6566,141 @@ } +String *Field_binary::val_str(String *val_buffer, String *val_ptr) +{ +int position,i; +char nibble; +char *to; + ASSERT_COLUMN_MARKED_FOR_READ; + + val_buffer->alloc(2*field_length+1); + to= (char*)val_buffer->ptr(); + val_buffer->length(2*field_length); + + position= 0; + + for ( i= 0; i < field_length*2; i++ ) { + nibble= i%2 ? ptr[i/2] & 0x0f : (ptr[i/2] & 0xf0) >>4; + if ( nibble < 10 ) to[position]= '0'+nibble; + else to[position]= 'a'+nibble-10; + position++; + } + to[position]= '\0'; + val_ptr->set((const char*) to, position, &my_charset_bin); + return val_ptr; +} + + +String *Field_ipv6::val_str(String *val_buffer, String *val_ptr) +{ +int position,i; +char nibble,*to; + ASSERT_COLUMN_MARKED_FOR_READ; + + val_buffer->alloc(2*field_length+field_length/2); + to= (char*) val_buffer->ptr(); + val_buffer->length(2*field_length); + + position= 0; + + for ( i= 0; i < field_length*2; i++ ) { + nibble= i%2 ? ptr[i/2] & 0x0f : (ptr[i/2] & 0xf0) >>4; + if ( nibble < 10 ) to[position]= '0'+nibble; + else to[position]= 'a'+nibble-10; + position++; + if ( i && !((i+1)%4) ) + to[position++]= ':'; + } + if ( to[position-1] == ':' ) position--; + to[position]= '\0'; + val_ptr->set((const char*) to, position, &my_charset_bin); + return val_ptr; +} + + +String *Field_ipv4::val_str(String *val_buffer, String *val_ptr) +{ +char *to; +unsigned char *cp; +int count; + + ASSERT_COLUMN_MARKED_FOR_READ; + + val_buffer->alloc(16); // decimal output + to= (char*) val_buffer->ptr(); + val_buffer->length(16); + + cp= (unsigned char *)ptr; + + count= snprintf(to, 16, "%u.%u.%u.%u",cp[0],cp[1],cp[2],cp[3]); + val_ptr->set((const char*) to, count, &my_charset_bin); + + return val_ptr; +} + +longlong Field_ipv4::val_int(void) +{ + ASSERT_COLUMN_MARKED_FOR_READ; + unsigned char *cp; + cp= (unsigned char *)ptr; + return (cp[0]<<24) + (cp[1]<<16) + (cp[2]<<8) + cp[3]; +} + + +String *Field_mac48::val_str(String *val_buffer, String *val_ptr) +{ +int position,i; +char nibble,*to; + ASSERT_COLUMN_MARKED_FOR_READ; + + val_buffer->alloc(3*field_length); + to= (char*) val_buffer->ptr(); + val_buffer->length(3*field_length); + + position=0; + + for ( i= 0; i < field_length*2; i++ ) { + nibble= i%2 ? ptr[i/2] & 0x0f : (ptr[i/2] & 0xf0) >>4; + if ( nibble < 10 ) to[position]= '0'+nibble; + else to[position]= 'a'+nibble-10; + position++; + if ( i && !((i+1)%2) ) + to[position++]=':'; + } + if ( to[position-1]==':' ) position--; + to[position]= '\0'; + val_ptr->set((const char*) to, position, &my_charset_bin); + return val_ptr; +} + + +String *Field_eui64::val_str(String *val_buffer, String *val_ptr) +{ +int position,i; +char nibble,*to; + ASSERT_COLUMN_MARKED_FOR_READ; + + val_buffer->alloc(3*field_length); + to= (char*) val_buffer->ptr(); + val_buffer->length(3*field_length); + + position=0; + + for ( i=0; i>4; + if ( nibble < 10 ) to[position]= '0'+nibble; + else to[position]= 'a'+nibble-10; + position++; + if ( i && !((i+1)%2) ) + to[position++]= ':'; + } + if ( to[position-1] == ':' ) position--; + to[position]= '\0'; + val_ptr->set((const char*) to, position, &my_charset_bin); + return val_ptr; +} + + my_decimal *Field_string::val_decimal(my_decimal *decimal_value) { ASSERT_COLUMN_MARKED_FOR_READ; @@ -6247,6 +6745,13 @@ } +int Field_binary::cmp(const char *a_ptr, const char *b_ptr) +{ + return memcmp(a_ptr,b_ptr,field_length); +} + + + void Field_string::sort_string(char *to,uint length) { IF_DBUG(uint tmp=) my_strnxfrm(field_charset, @@ -6256,6 +6761,13 @@ } +void Field_binary::sort_string(char *to,uint length) +{ + memcpy(to,ptr,field_length); +} + + + void Field_string::sql_type(String &res) const { THD *thd= table->in_use; @@ -8610,6 +9122,12 @@ void create_field::create_length_to_internal_length(void) { switch (sql_type) { + case MYSQL_TYPE_EUI64: + case MYSQL_TYPE_MAC48: + case MYSQL_TYPE_IPV4: + case MYSQL_TYPE_IPV6: + pack_length=key_length=length; // =4 calc_pack_len + break; case MYSQL_TYPE_TINY_BLOB: case MYSQL_TYPE_MEDIUM_BLOB: case MYSQL_TYPE_LONG_BLOB: @@ -8797,6 +9315,18 @@ */ max_field_charlength= MAX_FIELD_VARCHARLENGTH; break; + case MYSQL_TYPE_EUI64: + length= 8; + break; + case MYSQL_TYPE_MAC48: + length= 6; + break; + case MYSQL_TYPE_IPV4: + length= 4; + break; + case MYSQL_TYPE_IPV6: + length= 16; + break; case MYSQL_TYPE_STRING: break; case MYSQL_TYPE_BLOB: @@ -9051,6 +9581,10 @@ uint32 calc_pack_length(enum_field_types type,uint32 length) { switch (type) { + case MYSQL_TYPE_EUI64: return 8; + case MYSQL_TYPE_MAC48: return 6; + case MYSQL_TYPE_IPV4: return 4; + case MYSQL_TYPE_IPV6: return 16; case MYSQL_TYPE_VAR_STRING: case MYSQL_TYPE_STRING: case MYSQL_TYPE_DECIMAL: return (length); @@ -9160,6 +9694,18 @@ unireg_check, field_name, share, field_charset); + if (field_type == MYSQL_TYPE_IPV6) + return new Field_ipv6(ptr,field_length,null_pos,null_bit, + unireg_check, field_name); + if (field_type == MYSQL_TYPE_IPV4) + return new Field_ipv4(ptr,field_length,null_pos,null_bit, + unireg_check, field_name); + if (field_type == MYSQL_TYPE_MAC48) + return new Field_mac48(ptr,field_length,null_pos,null_bit, + unireg_check, field_name); + if (field_type == MYSQL_TYPE_EUI64) + return new Field_eui64(ptr,field_length,null_pos,null_bit, + unireg_check, field_name); return 0; // Error } @@ -9268,7 +9814,6 @@ unireg_check, field_name) : new Field_bit(ptr, field_length, null_pos, null_bit, bit_ptr, bit_offset, unireg_check, field_name); - default: // Impossible (Wrong version) break; } @@ -9308,6 +9853,18 @@ length/= charset->mbmaxlen; key_length/= charset->mbmaxlen; break; + case MYSQL_TYPE_EUI64: + length=8; + break; + case MYSQL_TYPE_MAC48: + length=6; + break; + case MYSQL_TYPE_IPV4: + length=4; + break; + case MYSQL_TYPE_IPV6: + length=16; + break; case MYSQL_TYPE_STRING: /* Change CHAR -> VARCHAR if dynamic record length */ if (old_field->type() == MYSQL_TYPE_VAR_STRING) diff -urN mysql-5.1.19-beta/libmysqld/field_conv.cc mysql-5.1.19-beta_new/libmysqld/field_conv.cc --- mysql-5.1.19-beta/libmysqld/field_conv.cc 2007-05-26 10:19:46.000000000 +0000 +++ mysql-5.1.19-beta_new/libmysqld/field_conv.cc 2007-05-26 10:18:59.000000000 +0000 @@ -757,6 +757,10 @@ if (to->table->copy_blobs || (!blob->value.is_alloced() && from->real_type() != MYSQL_TYPE_STRING && + from->real_type() != MYSQL_TYPE_EUI64 && + from->real_type() != MYSQL_TYPE_MAC48 && + from->real_type() != MYSQL_TYPE_IPV4 && + from->real_type() != MYSQL_TYPE_IPV6 && from->real_type() != MYSQL_TYPE_VARCHAR)) blob->value.copy(); return blob->store(blob->value.ptr(),blob->value.length(),from->charset()); diff -urN mysql-5.1.19-beta/libmysqld/ha_ndbcluster.cc mysql-5.1.19-beta_new/libmysqld/ha_ndbcluster.cc --- mysql-5.1.19-beta/libmysqld/ha_ndbcluster.cc 2007-05-26 10:19:02.000000000 +0000 +++ mysql-5.1.19-beta_new/libmysqld/ha_ndbcluster.cc 2007-05-26 10:18:59.000000000 +0000 @@ -630,6 +630,10 @@ case MYSQL_TYPE_TIME: case MYSQL_TYPE_YEAR: case MYSQL_TYPE_STRING: + case MYSQL_TYPE_EUI64: + case MYSQL_TYPE_MAC48: + case MYSQL_TYPE_IPV4: + case MYSQL_TYPE_IPV6: case MYSQL_TYPE_VAR_STRING: case MYSQL_TYPE_VARCHAR: case MYSQL_TYPE_TINY_BLOB: @@ -4797,6 +4801,13 @@ col.setType(NDBCOL::Timestamp); col.setLength(1); break; + case MYSQL_TYPE_EUI64: + case MYSQL_TYPE_MAC48: + case MYSQL_TYPE_IPV4: + case MYSQL_TYPE_IPV6: + col.setType(NDBCOL::Binary); + col.setLength(field->pack_length()); + break; // Char types case MYSQL_TYPE_STRING: if (field->pack_length() == 0) diff -urN mysql-5.1.19-beta/libmysqld/ha_ndbcluster_cond.cc mysql-5.1.19-beta_new/libmysqld/ha_ndbcluster_cond.cc --- mysql-5.1.19-beta/libmysqld/ha_ndbcluster_cond.cc 2007-05-26 10:19:02.000000000 +0000 +++ mysql-5.1.19-beta_new/libmysqld/ha_ndbcluster_cond.cc 2007-05-26 10:18:59.000000000 +0000 @@ -482,6 +482,10 @@ context->expect(Item::STRING_ITEM); context->expect(Item::FIELD_ITEM); context->expect_only_field_type(MYSQL_TYPE_STRING); + context->expect_only_field_type(MYSQL_TYPE_EUI64); + context->expect_only_field_type(MYSQL_TYPE_MAC48); + context->expect_only_field_type(MYSQL_TYPE_IPV4); + context->expect_only_field_type(MYSQL_TYPE_IPV6); context->expect_field_type(MYSQL_TYPE_VAR_STRING); context->expect_field_type(MYSQL_TYPE_VARCHAR); context->expect_field_result(STRING_RESULT); diff -urN mysql-5.1.19-beta/libmysqld/item.cc mysql-5.1.19-beta_new/libmysqld/item.cc --- mysql-5.1.19-beta/libmysqld/item.cc 2007-05-26 10:18:36.000000000 +0000 +++ mysql-5.1.19-beta_new/libmysqld/item.cc 2007-05-26 10:18:59.000000000 +0000 @@ -4401,6 +4401,22 @@ else field= new Field_blob(max_length, maybe_null, name, collation.collation); break; // Blob handled outside of case + case MYSQL_TYPE_EUI64: + field = new Field_eui64((char *) NULL, max_length, null_ptr,0, + Field::NONE,name); + break; + case MYSQL_TYPE_MAC48: + field = new Field_mac48((char *) NULL, max_length, null_ptr,0, + Field::NONE,name); + break; + case MYSQL_TYPE_IPV4: + field = new Field_ipv4((char *) NULL, max_length, null_ptr,0, + Field::NONE,name); + break; + case MYSQL_TYPE_IPV6: + field = new Field_ipv6((char *) NULL, max_length, null_ptr,0, + Field::NONE,name); + break; case MYSQL_TYPE_GEOMETRY: return new Field_geom(max_length, maybe_null, name, table->s, (Field::geometry_type) @@ -4898,6 +4914,10 @@ case MYSQL_TYPE_BLOB: case MYSQL_TYPE_GEOMETRY: case MYSQL_TYPE_STRING: + case MYSQL_TYPE_EUI64: + case MYSQL_TYPE_MAC48: + case MYSQL_TYPE_IPV4: + case MYSQL_TYPE_IPV6: case MYSQL_TYPE_VAR_STRING: case MYSQL_TYPE_VARCHAR: case MYSQL_TYPE_BIT: @@ -6555,7 +6575,7 @@ Field *field= ((Item_field *) item)->field; enum_field_types type= field->real_type(); /* work around about varchar type field detection */ - if (type == MYSQL_TYPE_STRING && field->type() == MYSQL_TYPE_VAR_STRING) + if ( type == MYSQL_TYPE_STRING && field->type() == MYSQL_TYPE_VAR_STRING) return MYSQL_TYPE_VAR_STRING; return type; } @@ -6742,6 +6762,10 @@ case MYSQL_TYPE_BLOB: case MYSQL_TYPE_VAR_STRING: case MYSQL_TYPE_STRING: + case MYSQL_TYPE_EUI64: + case MYSQL_TYPE_MAC48: + case MYSQL_TYPE_IPV4: + case MYSQL_TYPE_IPV6: case MYSQL_TYPE_GEOMETRY: return item->max_length; case MYSQL_TYPE_TINY: diff -urN mysql-5.1.19-beta/libmysqld/libmysql.c mysql-5.1.19-beta_new/libmysqld/libmysql.c --- mysql-5.1.19-beta/libmysqld/libmysql.c 2007-05-26 10:18:57.000000000 +0000 +++ mysql-5.1.19-beta_new/libmysqld/libmysql.c 2007-05-26 10:18:59.000000000 +0000 @@ -3257,6 +3257,10 @@ case MYSQL_TYPE_VARCHAR: case MYSQL_TYPE_VAR_STRING: case MYSQL_TYPE_STRING: + case MYSQL_TYPE_EUI64: + case MYSQL_TYPE_MAC48: + case MYSQL_TYPE_IPV4: + case MYSQL_TYPE_IPV6: case MYSQL_TYPE_DECIMAL: case MYSQL_TYPE_NEWDECIMAL: param->store_param_func= store_param_str; @@ -4218,7 +4222,8 @@ range4[]= { MYSQL_TYPE_ENUM, MYSQL_TYPE_SET, MYSQL_TYPE_TINY_BLOB, MYSQL_TYPE_MEDIUM_BLOB, MYSQL_TYPE_LONG_BLOB, MYSQL_TYPE_BLOB, MYSQL_TYPE_VAR_STRING, MYSQL_TYPE_STRING, MYSQL_TYPE_GEOMETRY, - MYSQL_TYPE_DECIMAL, MYSQL_TYPE_NULL }; + MYSQL_TYPE_DECIMAL, MYSQL_TYPE_NULL, MYSQL_TYPE_EUI64, + MYSQL_TYPE_MAC48, MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6 }; static const enum enum_field_types *range_list[]= { range1, range2, range3, range4 }, **range_list_end= range_list + sizeof(range_list)/sizeof(*range_list); @@ -4329,6 +4334,10 @@ break; case MYSQL_TYPE_VAR_STRING: case MYSQL_TYPE_STRING: + case MYSQL_TYPE_EUI64: + case MYSQL_TYPE_MAC48: + case MYSQL_TYPE_IPV4: + case MYSQL_TYPE_IPV6: case MYSQL_TYPE_DECIMAL: case MYSQL_TYPE_NEWDECIMAL: DBUG_ASSERT(param->buffer_length != 0); @@ -4402,6 +4411,10 @@ case MYSQL_TYPE_BLOB: case MYSQL_TYPE_VAR_STRING: case MYSQL_TYPE_STRING: + case MYSQL_TYPE_EUI64: + case MYSQL_TYPE_MAC48: + case MYSQL_TYPE_IPV4: + case MYSQL_TYPE_IPV6: case MYSQL_TYPE_BIT: param->skip_result= skip_result_string; break; diff -urN mysql-5.1.19-beta/libmysqld/sql_class.cc mysql-5.1.19-beta_new/libmysqld/sql_class.cc --- mysql-5.1.19-beta/libmysqld/sql_class.cc 2007-05-26 10:19:53.000000000 +0000 +++ mysql-5.1.19-beta_new/libmysqld/sql_class.cc 2007-05-26 10:18:59.000000000 +0000 @@ -2728,6 +2728,14 @@ return "MYSQL_TYPE_VAR_STRING"; case MYSQL_TYPE_STRING: return "MYSQL_TYPE_STRING"; + case MYSQL_TYPE_EUI64: + return "MYSQL_TYPE_EUI64"; + case MYSQL_TYPE_MAC48: + return "MYSQL_TYPE_MAC48"; + case MYSQL_TYPE_IPV4: + return "MYSQL_TYPE_IPV4"; + case MYSQL_TYPE_IPV6: + return "MYSQL_TYPE_IPV6"; case MYSQL_TYPE_GEOMETRY: return "MYSQL_TYPE_GEOMETRY"; } diff -urN mysql-5.1.19-beta/libmysqld/sql_table.cc mysql-5.1.19-beta_new/libmysqld/sql_table.cc --- mysql-5.1.19-beta/libmysqld/sql_table.cc 2007-05-26 10:19:15.000000000 +0000 +++ mysql-5.1.19-beta_new/libmysqld/sql_table.cc 2007-05-26 10:18:59.000000000 +0000 @@ -2088,6 +2088,14 @@ } #endif /* fall through */ + case MYSQL_TYPE_EUI64: + case MYSQL_TYPE_MAC48: + case MYSQL_TYPE_IPV4: + case MYSQL_TYPE_IPV6: + sql_field->pack_flag=0; + if (sql_field->charset->state & MY_CS_BINSORT) + sql_field->pack_flag|=FIELDFLAG_BINARY; + break; case MYSQL_TYPE_STRING: sql_field->pack_flag=0; if (sql_field->charset->state & MY_CS_BINSORT) diff -urN mysql-5.1.19-beta/mysys/my_net.c mysql-5.1.19-beta_new/mysys/my_net.c --- mysql-5.1.19-beta/mysys/my_net.c 2007-05-26 10:19:47.000000000 +0000 +++ mysql-5.1.19-beta_new/mysys/my_net.c 2007-05-26 10:18:59.000000000 +0000 @@ -40,3 +40,183 @@ strmov(buf,ptr); pthread_mutex_unlock(&THR_LOCK_net); } + + +unsigned char char2nibble(char *one) { +if ( *one >= 'A' && *one <= 'F' ) return *one - 'A' + 10; +if ( *one >= 'a' && *one <= 'f' ) return *one - 'a' + 10; +else if ( *one >= '0' && *one <= '9' ) return *one - '0'; +else if ( *one == ':' ) return 0x10; +else if ( *one == '.' ) return 0x11; +else if ( !*one ) return 0x20; +else return 0x40; +} + + +int parse_ipv4(char *result,const char *sample) { +char *cp, sect= 0,buf[8]; +unsigned char t,pt= 0x80; +int buff_pos= 0,fpos,tval; + +cp= (char *)sample; +memset(buf,0,8); +tval= 0; +fpos= 0; +if ( !cp ) return -200; // null pointer is not allowed +if ( !*cp ) return -201; // null value is not allowed on start +if ( *cp == '.' ) return -202; // dot at start is not allowed + +do { + t= char2nibble(cp); + if ( pt == 0x11 && t == 0x11 ) return -203; // case of two dots '..' + + if (t < 10) { // t is a nibble + if ( fpos > 3 ) return -204; // no more then 3 digits + tval= 10*tval+t; + fpos++; + } else + if ( t == 0x11 ) { // t is dot + if ( buff_pos > 7 ) return -205; // buff_pos > 8 x nibble + if ( tval > 255 ) return -206; // temporary value out of range + buf[buff_pos++]= (tval & 0xf0)>>4; // add first nibble + buf[buff_pos++]= tval & 0x0f; // add second nibble + tval= fpos= 0; // reset temp value, and field position + } else + if ( t == 0x20 ) { // t is null, the end of string + if ( tval > 255 ) return -207; + buf[buff_pos++]= (tval & 0xf0)>>4; // remember + buf[buff_pos++]= tval & 0x0f; + break; + } else + return -208; // t is not nibble hex nor r . +pt= t; // remember previos t +} while ( *cp++ ); + +if ( pt == 0x11 && t == 0x20 ) return -209; // 1.2.3. case +if ( buff_pos != 8 ) return -210; // 1.2.3.4.5 case +memcpy(result,buf,8); +return 0; +} + + +int parse_ipv6(char *result,const char *sample) { +unsigned char t,pt= 0x80; +char *cp,sect= 0,buf[4],*after_column; +int buff_pos= 0,double_col= 0,dc_sect= 0; + +after_column= (char *)NULL; +cp= (char *)sample; +if ( !cp ) return -100; +if ( !*cp ) return -101; +// sample should be null terminated +if ( *cp == ':' && *(cp+1) && *(cp+1) != ':') return -102; // : at start, and not :: +if ( *cp == '.' ) return -103; // . at start + +do { + t= char2nibble(cp); + + if ( t == 0x40 ) return -104; // unknown char + else + if ( t < 0x10 ) { + if ( buff_pos > 3 ) return -105; // too many hex fields in section + else buf[buff_pos++]= t; + if ( pt == 0x10 ) after_column= cp; // last occurance of hex + // if we jump on . for ipv4 + } + else if ( t == 0x11 ) { // t is . + long int rc; + if ( !after_column ) return -107; // 1:2:.3 case + if ( sect > 6 ) return -108; // 1:2:3:4:5:6:7::1.2.3.4 case + rc= parse_ipv4(result+4*sect,after_column); + if ( rc < 0 ) return rc; + sect+= 2; + break; // shift part after :: + } + else if ( t == 0x20 ) { // t is null + if ( pt < 0x10 ) { // if there was unsaved nibble + memset(result+4*sect,0,4); + memcpy(result+4*sect+4-buff_pos,buf,buff_pos); + buff_pos= 0; + memset(buf,0,4); + sect++; + } + break; //terminate the loop + } + else if ( t == 0x10 ) { // we've got :, write last buffer + if ( sect > 7 ) return -109; // too many sections + if ( pt != t ) { + memset(result+4*sect,0,4); + memcpy(result+4*sect+4-buff_pos,buf,buff_pos); + buff_pos= 0; + memset(buf,0,4); + sect++; + } + after_column= (char *)NULL; // preventing :. case + if ( pt == t ) { // :: case + if( double_col ) return -5; // already seen double colon + double_col= 1; + dc_sect= sect; // remember where we've seen double colon + memset(result+4*sect,0,4); + sect++; + } + } + else return -110; // t is invalid character + pt= t; + } while ( *cp++ ); + +// check do we have : on the end of string without :: +if ( t == 0x20 && pt == 0x10 && sect != dc_sect+1 ) return -111; + +// we wrote a::b as a:b:0:0:0:0:0:0, now move to a:0:0:0:0:0:0:b +if ( double_col && sect <= 7 ) { // make gap, shift bytes to right + int i; + char part[40]; + + for ( i=0; i<4*(sect-dc_sect); i++ ) // memmove, backward + *(result+31-i)= *(result+4*(sect)-1-i); + + for ( i=0; i<4*(8-sect); i++ ) // zero fill + *(result+4*(dc_sect)+i)= 0; + + return 0; + } +else +if ( sect != 8 ) return -112; // number of sectors is not correct +else return 0; +} + +int parse_nibblenibblecolumn(char *result,const char *sample,int nr_sect) { +unsigned char t,tt; +char *cp; +int sect; + +sect= 0; +cp= (char *) sample; +while ( sect < nr_sect+1 && *cp) { + t= tt= 0xf0; + if ( *cp && (t= char2nibble(cp++)) < 0x10 && + *cp && (tt= char2nibble(cp++)) < 0x10 && + *cp && 0x10 == char2nibble(cp) ) { + result[sect++]= 0xff & ( (t<<4) + tt); + cp++; + } + else if ( !*cp && t < 0x10 && tt < 0x10 ) { // null termination + result[sect++]= 0xff & ((t<<4) + tt); + break; + } // other error + else return -1; + } +if(sect==nr_sect) return 0; +else return -2; +} + + +int pack_result(char *packed,char *unpack,int len){ +int i; + +for ( i=0; i-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -123,8 +127,12 @@ MYSQL_TYPE_VARCHAR, MYSQL_TYPE_TINY, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -154,8 +162,12 @@ MYSQL_TYPE_VARCHAR, MYSQL_TYPE_SHORT, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -185,8 +197,12 @@ MYSQL_TYPE_VARCHAR, MYSQL_TYPE_LONG, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -216,8 +232,12 @@ MYSQL_TYPE_VARCHAR, MYSQL_TYPE_FLOAT, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_DOUBLE, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -247,8 +267,12 @@ MYSQL_TYPE_VARCHAR, MYSQL_TYPE_DOUBLE, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_DOUBLE, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -278,8 +302,12 @@ MYSQL_TYPE_DATETIME, MYSQL_TYPE_YEAR, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_BIT, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_ENUM, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -309,8 +337,12 @@ MYSQL_TYPE_DATETIME, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -340,8 +372,12 @@ MYSQL_TYPE_VARCHAR, MYSQL_TYPE_LONGLONG, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -371,8 +407,12 @@ MYSQL_TYPE_VARCHAR, MYSQL_TYPE_INT24, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -402,12 +442,16 @@ MYSQL_TYPE_DATETIME, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB - MYSQL_TYPE_VARCHAR, MYSQL_TYPE_TINY_BLOB, + MYSQL_TYPE_VARCHAR, MYSQL_TYPE_TINY_BLOB, //MYSQL_TYPE_MEDIUM_BLOB MYSQL_TYPE_LONG_BLOB MYSQL_TYPE_MEDIUM_BLOB, MYSQL_TYPE_LONG_BLOB, //MYSQL_TYPE_BLOB MYSQL_TYPE_VAR_STRING @@ -433,8 +477,12 @@ MYSQL_TYPE_DATETIME, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -464,8 +512,12 @@ MYSQL_TYPE_DATETIME, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -495,8 +547,12 @@ MYSQL_TYPE_VARCHAR, MYSQL_TYPE_YEAR, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -526,8 +582,12 @@ MYSQL_TYPE_DATETIME, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -557,8 +617,12 @@ MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -588,8 +652,12 @@ MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_BIT, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -601,6 +669,146 @@ //MYSQL_TYPE_STRING MYSQL_TYPE_GEOMETRY MYSQL_TYPE_STRING, MYSQL_TYPE_VARCHAR }, + /* MYSQL_TYPE_EUI64 -> */ + { + //MYSQL_TYPE_DECIMAL MYSQL_TYPE_TINY + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_SHORT MYSQL_TYPE_LONG + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_FLOAT MYSQL_TYPE_DOUBLE + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_NULL MYSQL_TYPE_TIMESTAMP + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_LONGLONG MYSQL_TYPE_INT24 + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_DATE MYSQL_TYPE_TIME + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_DATETIME MYSQL_TYPE_YEAR + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR + MYSQL_TYPE_STRING, MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_BIT <16>-<241> + MYSQL_TYPE_STRING, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_STRING, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB + MYSQL_TYPE_STRING, MYSQL_TYPE_TINY_BLOB, + //MYSQL_TYPE_MEDIUM_BLOB MYSQL_TYPE_LONG_BLOB + MYSQL_TYPE_MEDIUM_BLOB, MYSQL_TYPE_LONG_BLOB, + //MYSQL_TYPE_BLOB MYSQL_TYPE_VAR_STRING + MYSQL_TYPE_BLOB, MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_STRING MYSQL_TYPE_GEOMETRY + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING + }, + /* MYSQL_TYPE_MAC48 -> */ + { + //MYSQL_TYPE_DECIMAL MYSQL_TYPE_TINY + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_SHORT MYSQL_TYPE_LONG + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_FLOAT MYSQL_TYPE_DOUBLE + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_NULL MYSQL_TYPE_TIMESTAMP + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_LONGLONG MYSQL_TYPE_INT24 + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_DATE MYSQL_TYPE_TIME + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_DATETIME MYSQL_TYPE_YEAR + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR + MYSQL_TYPE_STRING, MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_BIT <16>-<241> + MYSQL_TYPE_STRING, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_STRING, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB + MYSQL_TYPE_STRING, MYSQL_TYPE_TINY_BLOB, + //MYSQL_TYPE_MEDIUM_BLOB MYSQL_TYPE_LONG_BLOB + MYSQL_TYPE_MEDIUM_BLOB, MYSQL_TYPE_LONG_BLOB, + //MYSQL_TYPE_BLOB MYSQL_TYPE_VAR_STRING + MYSQL_TYPE_BLOB, MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_STRING MYSQL_TYPE_GEOMETRY + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING + }, + /* MYSQL_TYPE_IPV4 -> */ + { + //MYSQL_TYPE_DECIMAL MYSQL_TYPE_TINY + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_SHORT MYSQL_TYPE_LONG + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_FLOAT MYSQL_TYPE_DOUBLE + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_NULL MYSQL_TYPE_TIMESTAMP + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_LONGLONG MYSQL_TYPE_INT24 + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_DATE MYSQL_TYPE_TIME + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_DATETIME MYSQL_TYPE_YEAR + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR + MYSQL_TYPE_STRING, MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_BIT <16>-<241> + MYSQL_TYPE_STRING, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_STRING, + //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB + MYSQL_TYPE_STRING, MYSQL_TYPE_TINY_BLOB, + //MYSQL_TYPE_MEDIUM_BLOB MYSQL_TYPE_LONG_BLOB + MYSQL_TYPE_MEDIUM_BLOB, MYSQL_TYPE_LONG_BLOB, + //MYSQL_TYPE_BLOB MYSQL_TYPE_VAR_STRING + MYSQL_TYPE_BLOB, MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_STRING MYSQL_TYPE_GEOMETRY + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING + }, + /* MYSQL_TYPE_IPV6 -> */ + { + //MYSQL_TYPE_DECIMAL MYSQL_TYPE_TINY + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_SHORT MYSQL_TYPE_LONG + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_FLOAT MYSQL_TYPE_DOUBLE + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_NULL MYSQL_TYPE_TIMESTAMP + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_LONGLONG MYSQL_TYPE_INT24 + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_DATE MYSQL_TYPE_TIME + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_DATETIME MYSQL_TYPE_YEAR + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR + MYSQL_TYPE_STRING, MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_BIT <16>-<241> + MYSQL_TYPE_STRING, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_STRING, MYSQL_TYPE_IPV6, + //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB + MYSQL_TYPE_STRING, MYSQL_TYPE_TINY_BLOB, + //MYSQL_TYPE_MEDIUM_BLOB MYSQL_TYPE_LONG_BLOB + MYSQL_TYPE_MEDIUM_BLOB, MYSQL_TYPE_LONG_BLOB, + //MYSQL_TYPE_BLOB MYSQL_TYPE_VAR_STRING + MYSQL_TYPE_BLOB, MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_STRING MYSQL_TYPE_GEOMETRY + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING + }, /* MYSQL_TYPE_NEWDECIMAL -> */ { //MYSQL_TYPE_DECIMAL MYSQL_TYPE_TINY @@ -619,8 +827,12 @@ MYSQL_TYPE_VARCHAR, MYSQL_TYPE_NEWDECIMAL, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -650,8 +862,12 @@ MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -681,8 +897,12 @@ MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -712,8 +932,12 @@ MYSQL_TYPE_TINY_BLOB, MYSQL_TYPE_TINY_BLOB, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_TINY_BLOB, MYSQL_TYPE_TINY_BLOB, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_TINY_BLOB, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_BLOB, MYSQL_TYPE_BLOB, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_BLOB, MYSQL_TYPE_BLOB, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_TINY_BLOB, MYSQL_TYPE_TINY_BLOB, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -743,8 +967,12 @@ MYSQL_TYPE_MEDIUM_BLOB, MYSQL_TYPE_MEDIUM_BLOB, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_MEDIUM_BLOB, MYSQL_TYPE_MEDIUM_BLOB, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_MEDIUM_BLOB, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_MEDIUM_BLOB, MYSQL_TYPE_MEDIUM_BLOB, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_MEDIUM_BLOB, MYSQL_TYPE_MEDIUM_BLOB, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_MEDIUM_BLOB, MYSQL_TYPE_MEDIUM_BLOB, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -774,8 +1002,12 @@ MYSQL_TYPE_LONG_BLOB, MYSQL_TYPE_LONG_BLOB, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_LONG_BLOB, MYSQL_TYPE_LONG_BLOB, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_LONG_BLOB, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_LONG_BLOB, MYSQL_TYPE_LONG_BLOB, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_LONG_BLOB, MYSQL_TYPE_LONG_BLOB, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_LONG_BLOB, MYSQL_TYPE_LONG_BLOB, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -805,8 +1037,12 @@ MYSQL_TYPE_BLOB, MYSQL_TYPE_BLOB, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_BLOB, MYSQL_TYPE_BLOB, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_BLOB, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_BLOB, MYSQL_TYPE_BLOB, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_BLOB, MYSQL_TYPE_BLOB, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_BLOB, MYSQL_TYPE_BLOB, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -836,8 +1072,12 @@ MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -867,8 +1107,12 @@ MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_STRING, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_STRING, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -898,8 +1142,12 @@ MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> MYSQL_TYPE_VARCHAR, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + MYSQL_TYPE_EUI64, MYSQL_TYPE_MAC48, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + MYSQL_TYPE_IPV4, MYSQL_TYPE_IPV6, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -952,8 +1200,12 @@ STRING_RESULT, INT_RESULT, //MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR STRING_RESULT, STRING_RESULT, - //MYSQL_TYPE_BIT <16>-<245> + //MYSQL_TYPE_BIT <16>-<241> STRING_RESULT, + //MYSQL_TYPE_EUI64 MYSQL_TYPE_MAC48 + STRING_RESULT, STRING_RESULT, + //MYSQL_TYPE_IPV4 MYSQL_TYPE_IPV6 + STRING_RESULT, STRING_RESULT, //MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM DECIMAL_RESULT, STRING_RESULT, //MYSQL_TYPE_SET MYSQL_TYPE_TINY_BLOB @@ -1040,6 +1292,10 @@ case MYSQL_TYPE_BLOB: case MYSQL_TYPE_VAR_STRING: case MYSQL_TYPE_STRING: + case MYSQL_TYPE_EUI64: + case MYSQL_TYPE_MAC48: + case MYSQL_TYPE_IPV4: + case MYSQL_TYPE_IPV6: case MYSQL_TYPE_GEOMETRY: return TRUE; default: @@ -6046,6 +6302,80 @@ } +int Field_ipv6::store(const char *from,uint length,CHARSET_INFO *cs) +{ +char halfbyte_result[40]; +int rc; + +rc=parse_ipv6(halfbyte_result,from); +if ( rc < 0 ) { + memset(ptr,0,field_length); + return 1; + } + +pack_result(ptr,halfbyte_result,16); +return 1; +} + + +int Field_ipv4::store(const char *from,uint length,CHARSET_INFO *cs) +{ +char halfbyte_result[8]; +int rc; + +rc=parse_ipv4(halfbyte_result,from); +if ( rc < 0 ) { + memset(ptr,0,field_length); + return 1; + } + +pack_result(ptr,halfbyte_result,4); +return 0; +} + + +int Field_ipv4::store(longlong nr, bool unsigned_val) +{ + ASSERT_COLUMN_MARKED_FOR_WRITE; + unsigned char *cp; + + cp= (unsigned char *)ptr; + cp[0]= (char) (0xff & (nr >> 24)); + cp[1]= (char) (0xff & (nr >> 16)); + cp[2]= (char) (0xff & (nr >> 8)); + cp[3]= (char) (0xff & nr); + + return 0; +} + + +int Field_mac48::store(const char *from,uint length,CHARSET_INFO *cs) +{ + +if ( parse_nibblenibblecolumn(ptr,from,6) < 0 ) { + memset(ptr,0,field_length); + return 1; + } +return 0; +} + + +int Field_eui64::store(const char *from,uint length,CHARSET_INFO *cs) +{ +if ( parse_nibblenibblecolumn(ptr,from,8) < 0 ) { + memset(ptr,0,field_length); + return 1; + } +return 0; +} + + +int Field_binary::store(const char *from,uint length,CHARSET_INFO *cs) { +memset(ptr,0,field_length); +return 1; +} + + /* Store double value in Field_string or Field_varstring. @@ -6132,6 +6462,39 @@ } +int Field_binary::store(longlong nr, bool unsigned_val) +{ + memset(ptr,0,field_length); + return 1; +} + + + +int Field_binary::store(double nr, bool unsigned_val) +{ + memset(ptr,0,field_length); + return 1; +} + + + +int Field_binary::store(double nr) +{ + memset(ptr,0,field_length); + return 1; +} + + + +int Field_binary::store_decimal(const my_decimal *d) +{ + memset(ptr,0,field_length); + return 1; +} + + + + int Field_longstr::store_decimal(const my_decimal *d) { char buff[DECIMAL_MAX_STR_LENGTH+1]; @@ -6203,6 +6566,141 @@ } +String *Field_binary::val_str(String *val_buffer, String *val_ptr) +{ +int position,i; +char nibble; +char *to; + ASSERT_COLUMN_MARKED_FOR_READ; + + val_buffer->alloc(2*field_length+1); + to= (char*)val_buffer->ptr(); + val_buffer->length(2*field_length); + + position= 0; + + for ( i= 0; i < field_length*2; i++ ) { + nibble= i%2 ? ptr[i/2] & 0x0f : (ptr[i/2] & 0xf0) >>4; + if ( nibble < 10 ) to[position]= '0'+nibble; + else to[position]= 'a'+nibble-10; + position++; + } + to[position]= '\0'; + val_ptr->set((const char*) to, position, &my_charset_bin); + return val_ptr; +} + + +String *Field_ipv6::val_str(String *val_buffer, String *val_ptr) +{ +int position,i; +char nibble,*to; + ASSERT_COLUMN_MARKED_FOR_READ; + + val_buffer->alloc(2*field_length+field_length/2); + to= (char*) val_buffer->ptr(); + val_buffer->length(2*field_length); + + position= 0; + + for ( i= 0; i < field_length*2; i++ ) { + nibble= i%2 ? ptr[i/2] & 0x0f : (ptr[i/2] & 0xf0) >>4; + if ( nibble < 10 ) to[position]= '0'+nibble; + else to[position]= 'a'+nibble-10; + position++; + if ( i && !((i+1)%4) ) + to[position++]= ':'; + } + if ( to[position-1] == ':' ) position--; + to[position]= '\0'; + val_ptr->set((const char*) to, position, &my_charset_bin); + return val_ptr; +} + + +String *Field_ipv4::val_str(String *val_buffer, String *val_ptr) +{ +char *to; +unsigned char *cp; +int count; + + ASSERT_COLUMN_MARKED_FOR_READ; + + val_buffer->alloc(16); // decimal output + to= (char*) val_buffer->ptr(); + val_buffer->length(16); + + cp= (unsigned char *)ptr; + + count= snprintf(to, 16, "%u.%u.%u.%u",cp[0],cp[1],cp[2],cp[3]); + val_ptr->set((const char*) to, count, &my_charset_bin); + + return val_ptr; +} + +longlong Field_ipv4::val_int(void) +{ + ASSERT_COLUMN_MARKED_FOR_READ; + unsigned char *cp; + cp= (unsigned char *)ptr; + return (cp[0]<<24) + (cp[1]<<16) + (cp[2]<<8) + cp[3]; +} + + +String *Field_mac48::val_str(String *val_buffer, String *val_ptr) +{ +int position,i; +char nibble,*to; + ASSERT_COLUMN_MARKED_FOR_READ; + + val_buffer->alloc(3*field_length); + to= (char*) val_buffer->ptr(); + val_buffer->length(3*field_length); + + position=0; + + for ( i= 0; i < field_length*2; i++ ) { + nibble= i%2 ? ptr[i/2] & 0x0f : (ptr[i/2] & 0xf0) >>4; + if ( nibble < 10 ) to[position]= '0'+nibble; + else to[position]= 'a'+nibble-10; + position++; + if ( i && !((i+1)%2) ) + to[position++]=':'; + } + if ( to[position-1]==':' ) position--; + to[position]= '\0'; + val_ptr->set((const char*) to, position, &my_charset_bin); + return val_ptr; +} + + +String *Field_eui64::val_str(String *val_buffer, String *val_ptr) +{ +int position,i; +char nibble,*to; + ASSERT_COLUMN_MARKED_FOR_READ; + + val_buffer->alloc(3*field_length); + to= (char*) val_buffer->ptr(); + val_buffer->length(3*field_length); + + position=0; + + for ( i=0; i>4; + if ( nibble < 10 ) to[position]= '0'+nibble; + else to[position]= 'a'+nibble-10; + position++; + if ( i && !((i+1)%2) ) + to[position++]= ':'; + } + if ( to[position-1] == ':' ) position--; + to[position]= '\0'; + val_ptr->set((const char*) to, position, &my_charset_bin); + return val_ptr; +} + + my_decimal *Field_string::val_decimal(my_decimal *decimal_value) { ASSERT_COLUMN_MARKED_FOR_READ; @@ -6247,6 +6745,13 @@ } +int Field_binary::cmp(const char *a_ptr, const char *b_ptr) +{ + return memcmp(a_ptr,b_ptr,field_length); +} + + + void Field_string::sort_string(char *to,uint length) { IF_DBUG(uint tmp=) my_strnxfrm(field_charset, @@ -6256,6 +6761,13 @@ } +void Field_binary::sort_string(char *to,uint length) +{ + memcpy(to,ptr,field_length); +} + + + void Field_string::sql_type(String &res) const { THD *thd= table->in_use; @@ -8610,6 +9122,12 @@ void create_field::create_length_to_internal_length(void) { switch (sql_type) { + case MYSQL_TYPE_EUI64: + case MYSQL_TYPE_MAC48: + case MYSQL_TYPE_IPV4: + case MYSQL_TYPE_IPV6: + pack_length=key_length=length; // =4 calc_pack_len + break; case MYSQL_TYPE_TINY_BLOB: case MYSQL_TYPE_MEDIUM_BLOB: case MYSQL_TYPE_LONG_BLOB: @@ -8797,6 +9315,18 @@ */ max_field_charlength= MAX_FIELD_VARCHARLENGTH; break; + case MYSQL_TYPE_EUI64: + length= 8; + break; + case MYSQL_TYPE_MAC48: + length= 6; + break; + case MYSQL_TYPE_IPV4: + length= 4; + break; + case MYSQL_TYPE_IPV6: + length= 16; + break; case MYSQL_TYPE_STRING: break; case MYSQL_TYPE_BLOB: @@ -9051,6 +9581,10 @@ uint32 calc_pack_length(enum_field_types type,uint32 length) { switch (type) { + case MYSQL_TYPE_EUI64: return 8; + case MYSQL_TYPE_MAC48: return 6; + case MYSQL_TYPE_IPV4: return 4; + case MYSQL_TYPE_IPV6: return 16; case MYSQL_TYPE_VAR_STRING: case MYSQL_TYPE_STRING: case MYSQL_TYPE_DECIMAL: return (length); @@ -9160,6 +9694,18 @@ unireg_check, field_name, share, field_charset); + if (field_type == MYSQL_TYPE_IPV6) + return new Field_ipv6(ptr,field_length,null_pos,null_bit, + unireg_check, field_name); + if (field_type == MYSQL_TYPE_IPV4) + return new Field_ipv4(ptr,field_length,null_pos,null_bit, + unireg_check, field_name); + if (field_type == MYSQL_TYPE_MAC48) + return new Field_mac48(ptr,field_length,null_pos,null_bit, + unireg_check, field_name); + if (field_type == MYSQL_TYPE_EUI64) + return new Field_eui64(ptr,field_length,null_pos,null_bit, + unireg_check, field_name); return 0; // Error } @@ -9268,7 +9814,6 @@ unireg_check, field_name) : new Field_bit(ptr, field_length, null_pos, null_bit, bit_ptr, bit_offset, unireg_check, field_name); - default: // Impossible (Wrong version) break; } @@ -9308,6 +9853,18 @@ length/= charset->mbmaxlen; key_length/= charset->mbmaxlen; break; + case MYSQL_TYPE_EUI64: + length=8; + break; + case MYSQL_TYPE_MAC48: + length=6; + break; + case MYSQL_TYPE_IPV4: + length=4; + break; + case MYSQL_TYPE_IPV6: + length=16; + break; case MYSQL_TYPE_STRING: /* Change CHAR -> VARCHAR if dynamic record length */ if (old_field->type() == MYSQL_TYPE_VAR_STRING) diff -urN mysql-5.1.19-beta/sql/field.h mysql-5.1.19-beta_new/sql/field.h --- mysql-5.1.19-beta/sql/field.h 2007-05-26 10:19:47.000000000 +0000 +++ mysql-5.1.19-beta_new/sql/field.h 2007-05-26 10:18:59.000000000 +0000 @@ -1169,6 +1169,105 @@ }; +class Field_binary :public Field { +public: + Field_binary(char *ptr_arg, uint32 len_arg,uchar *null_ptr_arg, + uchar null_bit_arg, + enum utype unireg_check_arg, const char *field_name_arg) + :Field(ptr_arg,len_arg,null_ptr_arg,null_bit_arg, + unireg_check_arg, field_name_arg) {} ; + + bool zero_pack() const { return 0; } + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(longlong nr, bool unsigned_val); + int store(double nr); + int store_decimal(const my_decimal *d); + int store(double nr,bool unsigned_val); + double val_real(void) { return 0; } + longlong val_int(void) { return 0; } + String *val_str(String*,String *); + my_decimal *val_decimal(my_decimal *) { return 0; } + virtual Item_result result_type () const { return STRING_RESULT; } + int cmp(const char *,const char*); + void sort_string(char *buff,uint length); + bool has_charset(void) const { return FALSE ; } +}; + + +class Field_ipv6 :public Field_binary { +public: + Field_ipv6(char *ptr_arg, uint32 len_arg,uchar *null_ptr_arg, + uchar null_bit_arg, + enum utype unireg_check_arg, const char *field_name_arg ) + :Field_binary(ptr_arg,len_arg,null_ptr_arg,null_bit_arg, + unireg_check_arg, field_name_arg) {} ; + + enum_field_types type() const { return MYSQL_TYPE_IPV6; } + int store(const char *to,uint length,CHARSET_INFO *charset); + String *val_str(String*,String *); + void sql_type(String &str) const { str.set_ascii(STRING_WITH_LEN("ipv6")); } + uint size_of() const { return sizeof(*this); } + enum_field_types real_type() const { return MYSQL_TYPE_IPV6; } + uint32 max_display_length() { return 40; } +}; + + +class Field_ipv4 :public Field_binary { +public: + Field_ipv4(char *ptr_arg, uint32 len_arg,uchar *null_ptr_arg, + uchar null_bit_arg, + enum utype unireg_check_arg, const char *field_name_arg ) + :Field_binary(ptr_arg,len_arg,null_ptr_arg,null_bit_arg, + unireg_check_arg, field_name_arg) {} ; + + enum_field_types type() const { return MYSQL_TYPE_IPV4; } + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(longlong nr, bool unsigned_val); + longlong val_int(void); + String *val_str(String*,String *); + void sql_type(String &str) const { str.set_ascii(STRING_WITH_LEN("ipv4")); } + uint size_of() const { return sizeof(*this); } + enum_field_types real_type() const { return MYSQL_TYPE_IPV4; } + uint32 max_display_length() { return 16; } +}; + + +class Field_mac48 :public Field_binary { +public: + Field_mac48(char *ptr_arg, uint32 len_arg,uchar *null_ptr_arg, + uchar null_bit_arg, + enum utype unireg_check_arg, const char *field_name_arg ) + :Field_binary(ptr_arg,len_arg,null_ptr_arg,null_bit_arg, + unireg_check_arg, field_name_arg) {} ; + + enum_field_types type() const { return MYSQL_TYPE_MAC48; } + int store(const char *to,uint length,CHARSET_INFO *charset); + String *val_str(String*,String *); + void sql_type(String &str) const { str.set_ascii(STRING_WITH_LEN("mac48")); } + uint size_of() const { return sizeof(*this); } + enum_field_types real_type() const { return MYSQL_TYPE_MAC48; } + uint32 max_display_length() { return 18; } +}; + + +class Field_eui64 :public Field_binary { +public: + Field_eui64(char *ptr_arg, uint32 len_arg,uchar *null_ptr_arg, + uchar null_bit_arg, + enum utype unireg_check_arg, const char *field_name_arg ) + :Field_binary(ptr_arg,len_arg,null_ptr_arg,null_bit_arg, + unireg_check_arg, field_name_arg) {} ; + + enum_field_types type() const { return MYSQL_TYPE_EUI64; } + int store(const char *to,uint length,CHARSET_INFO *charset); + String *val_str(String*,String *); + void sql_type(String &str) const { str.set_ascii(STRING_WITH_LEN("eui64")); } + uint size_of() const { return sizeof(*this); } + enum_field_types real_type() const { return MYSQL_TYPE_EUI64; } + uint32 max_display_length() { return 24; } +}; + + class Field_varstring :public Field_longstr { public: /* Store number of bytes used to store length (1 or 2) */ diff -urN mysql-5.1.19-beta/sql/field_conv.cc mysql-5.1.19-beta_new/sql/field_conv.cc --- mysql-5.1.19-beta/sql/field_conv.cc 2007-05-26 10:19:46.000000000 +0000 +++ mysql-5.1.19-beta_new/sql/field_conv.cc 2007-05-26 10:18:59.000000000 +0000 @@ -757,6 +757,10 @@ if (to->table->copy_blobs || (!blob->value.is_alloced() && from->real_type() != MYSQL_TYPE_STRING && + from->real_type() != MYSQL_TYPE_EUI64 && + from->real_type() != MYSQL_TYPE_MAC48 && + from->real_type() != MYSQL_TYPE_IPV4 && + from->real_type() != MYSQL_TYPE_IPV6 && from->real_type() != MYSQL_TYPE_VARCHAR)) blob->value.copy(); return blob->store(blob->value.ptr(),blob->value.length(),from->charset()); diff -urN mysql-5.1.19-beta/sql/ha_ndbcluster.cc mysql-5.1.19-beta_new/sql/ha_ndbcluster.cc --- mysql-5.1.19-beta/sql/ha_ndbcluster.cc 2007-05-26 10:19:02.000000000 +0000 +++ mysql-5.1.19-beta_new/sql/ha_ndbcluster.cc 2007-05-26 10:18:59.000000000 +0000 @@ -630,6 +630,10 @@ case MYSQL_TYPE_TIME: case MYSQL_TYPE_YEAR: case MYSQL_TYPE_STRING: + case MYSQL_TYPE_EUI64: + case MYSQL_TYPE_MAC48: + case MYSQL_TYPE_IPV4: + case MYSQL_TYPE_IPV6: case MYSQL_TYPE_VAR_STRING: case MYSQL_TYPE_VARCHAR: case MYSQL_TYPE_TINY_BLOB: @@ -4797,6 +4801,13 @@ col.setType(NDBCOL::Timestamp); col.setLength(1); break; + case MYSQL_TYPE_EUI64: + case MYSQL_TYPE_MAC48: + case MYSQL_TYPE_IPV4: + case MYSQL_TYPE_IPV6: + col.setType(NDBCOL::Binary); + col.setLength(field->pack_length()); + break; // Char types case MYSQL_TYPE_STRING: if (field->pack_length() == 0) diff -urN mysql-5.1.19-beta/sql/ha_ndbcluster_cond.cc mysql-5.1.19-beta_new/sql/ha_ndbcluster_cond.cc --- mysql-5.1.19-beta/sql/ha_ndbcluster_cond.cc 2007-05-26 10:19:02.000000000 +0000 +++ mysql-5.1.19-beta_new/sql/ha_ndbcluster_cond.cc 2007-05-26 10:18:59.000000000 +0000 @@ -482,6 +482,10 @@ context->expect(Item::STRING_ITEM); context->expect(Item::FIELD_ITEM); context->expect_only_field_type(MYSQL_TYPE_STRING); + context->expect_only_field_type(MYSQL_TYPE_EUI64); + context->expect_only_field_type(MYSQL_TYPE_MAC48); + context->expect_only_field_type(MYSQL_TYPE_IPV4); + context->expect_only_field_type(MYSQL_TYPE_IPV6); context->expect_field_type(MYSQL_TYPE_VAR_STRING); context->expect_field_type(MYSQL_TYPE_VARCHAR); context->expect_field_result(STRING_RESULT); diff -urN mysql-5.1.19-beta/sql/item.cc mysql-5.1.19-beta_new/sql/item.cc --- mysql-5.1.19-beta/sql/item.cc 2007-05-26 10:18:36.000000000 +0000 +++ mysql-5.1.19-beta_new/sql/item.cc 2007-05-26 10:18:59.000000000 +0000 @@ -4401,6 +4401,22 @@ else field= new Field_blob(max_length, maybe_null, name, collation.collation); break; // Blob handled outside of case + case MYSQL_TYPE_EUI64: + field = new Field_eui64((char *) NULL, max_length, null_ptr,0, + Field::NONE,name); + break; + case MYSQL_TYPE_MAC48: + field = new Field_mac48((char *) NULL, max_length, null_ptr,0, + Field::NONE,name); + break; + case MYSQL_TYPE_IPV4: + field = new Field_ipv4((char *) NULL, max_length, null_ptr,0, + Field::NONE,name); + break; + case MYSQL_TYPE_IPV6: + field = new Field_ipv6((char *) NULL, max_length, null_ptr,0, + Field::NONE,name); + break; case MYSQL_TYPE_GEOMETRY: return new Field_geom(max_length, maybe_null, name, table->s, (Field::geometry_type) @@ -4898,6 +4914,10 @@ case MYSQL_TYPE_BLOB: case MYSQL_TYPE_GEOMETRY: case MYSQL_TYPE_STRING: + case MYSQL_TYPE_EUI64: + case MYSQL_TYPE_MAC48: + case MYSQL_TYPE_IPV4: + case MYSQL_TYPE_IPV6: case MYSQL_TYPE_VAR_STRING: case MYSQL_TYPE_VARCHAR: case MYSQL_TYPE_BIT: @@ -6555,7 +6575,7 @@ Field *field= ((Item_field *) item)->field; enum_field_types type= field->real_type(); /* work around about varchar type field detection */ - if (type == MYSQL_TYPE_STRING && field->type() == MYSQL_TYPE_VAR_STRING) + if ( type == MYSQL_TYPE_STRING && field->type() == MYSQL_TYPE_VAR_STRING) return MYSQL_TYPE_VAR_STRING; return type; } @@ -6742,6 +6762,10 @@ case MYSQL_TYPE_BLOB: case MYSQL_TYPE_VAR_STRING: case MYSQL_TYPE_STRING: + case MYSQL_TYPE_EUI64: + case MYSQL_TYPE_MAC48: + case MYSQL_TYPE_IPV4: + case MYSQL_TYPE_IPV6: case MYSQL_TYPE_GEOMETRY: return item->max_length; case MYSQL_TYPE_TINY: diff -urN mysql-5.1.19-beta/sql/item_strfunc.cc mysql-5.1.19-beta_new/sql/item_strfunc.cc --- mysql-5.1.19-beta/sql/item_strfunc.cc 2007-05-26 10:19:27.000000000 +0000 +++ mysql-5.1.19-beta_new/sql/item_strfunc.cc 2007-05-26 10:18:59.000000000 +0000 @@ -751,6 +751,1143 @@ } +String *Item_func_address_type::val_str(String *str) +{ + String *addr= args[0]->val_str(str); + char meta_result[40]; + + if ( null_value= (args[0]->null_value) ) + return 0; /* purecov: inspected */ + + + if ( args[0]->field_type() == MYSQL_TYPE_IPV6 ) { + tmp_value.set("ipv6",4,&my_charset_bin); + return &tmp_value; + } + if ( args[0]->field_type() == MYSQL_TYPE_IPV4 ) { + tmp_value.set("ipv4",4,&my_charset_bin); + return &tmp_value; + } + if ( args[0]->field_type() == MYSQL_TYPE_MAC48 ) { + tmp_value.set("mac48",5,&my_charset_bin); + return &tmp_value; + } + if ( args[0]->field_type() == MYSQL_TYPE_EUI64 ) { + tmp_value.set("eui64",5,&my_charset_bin); + return &tmp_value; + } + + if ( !parse_nibblenibblecolumn(meta_result,(const char *)addr->ptr(),8) ) { + tmp_value.set("eui64",5,&my_charset_bin); + return &tmp_value; + } + if ( !parse_ipv4(meta_result,(const char *)addr->ptr()) ) { + tmp_value.set("ipv4",4,&my_charset_bin); + return &tmp_value; + } + if ( !parse_ipv6(meta_result,(const char *)addr->ptr()) ) { + tmp_value.set("ipv6",4,&my_charset_bin); + return &tmp_value; + } + if ( !parse_nibblenibblecolumn(meta_result,(const char *)addr->ptr(),6)) { + tmp_value.set("mac48",5,&my_charset_bin); + return &tmp_value; + } + + tmp_value.set("other",5,&my_charset_bin); + return &tmp_value; +} + + +void Item_func_address_type::fix_length_and_dec() +{ + collation.set(args[0]->collation); + max_length= args[0]->max_length; + return; +} + + +String *Item_func_ipv4_abbrev::val_str(String *str) +{ + String *addr= args[0]->val_str(str); + longlong prefixlen= args[1]->val_int(); + char meta_result[40]; + unsigned char result[5]; + int cnt1,i; + int offset,sub_offset; + char mask; + + if ( !addr || !addr->length() ) + return 0; + if ( arg_count > 2 ) + return &my_empty_string; + + + if ( null_value= ( args[0]->null_value || args[1]->null_value ) ) + return 0; /* purecov: inspected */ + + if ( prefixlen > 32 || prefixlen <0 ) + return &my_empty_string; + + if ( parse_ipv4(meta_result,(const char *)addr->ptr()) ) + return &my_empty_string; + + + pack_result((char *)result,meta_result,4); + + offset= prefixlen/8; + sub_offset= prefixlen%8; + mask= 0xff >> (sub_offset); + mask^= 0xff; + result[offset]&= mask; + for ( i= offset+1; i < 4; i++ ) + result[i]&= 0x00; + + + if ( prefixlen <=8 ) { + cnt1= snprintf(meta_result,16,"%d", + result[0]); + } else + if ( prefixlen <= 16 ) { + cnt1= snprintf(meta_result,16,"%d.%d", + result[0],result[1]); + } else + if( prefixlen <= 24 ) { + cnt1= snprintf(meta_result,16,"%d.%d.%d", + result[0],result[1],result[2]); + } else + { + cnt1= snprintf(meta_result,16,"%d.%d.%d.%d", + result[0],result[1],result[2],result[3]); + } + + if ( addr->alloced_length() < strlen(meta_result) && + addr->realloc(strlen(meta_result)) ) { + null_value= 1; + return 0; + } + + addr->copy(meta_result,strlen(meta_result),&my_charset_bin); + tmp_value.set(*addr, (uint32)0, (uint32) strlen(meta_result)); + return &tmp_value; +} + + +void Item_func_ipv4_abbrev::fix_length_and_dec() +{ + collation.set(args[0]->collation); + max_length= args[0]->max_length; + return; +} + + +String *Item_func_ipv4_and::val_str(String *str) +{ + char key_buff[80]; + String tmp_addr_value(key_buff, sizeof(key_buff), &my_charset_bin); + String *addr1= args[0]->val_str(str); + String *addr2= args[1]->val_str(&tmp_addr_value); + char meta_result[40]; + char meta_result1[40]; + char meta_result2[40]; + unsigned char result[17]; + unsigned char result1[17]; + unsigned char result2[17]; + int i; + int position; + char *to,nibble; + + if ( !addr1 || !addr1->length() || !addr2 || !addr2->length() ) + return 0; + + if ( null_value= ( args[0]->null_value || args[1]->null_value ) ) + return 0; /* purecov: inspected */ + + if ( parse_ipv4(meta_result1,(const char *)addr1->ptr()) ) + return &my_empty_string; + + if ( parse_ipv4(meta_result2,(const char *)addr2->ptr()) ) + return &my_empty_string; + + + pack_result((char *)result1,meta_result1,4); + pack_result((char *)result2,meta_result2,4); + + for ( i= 0; i < 4; i++ ) + result[i]= result1[i] & result2[i]; + + position= 0; + to= meta_result; + + i= snprintf(to,16,"%d.%d.%d.%d", + result[0],result[1],result[2],result[3]); + + + if ( addr1->alloced_length() < strlen(to) && addr1->realloc(strlen(to)) ) { + null_value= 1; + return 0; + } + addr1->copy(to,strlen(to),&my_charset_bin); + tmp_value.set(*addr1, (uint32)0, (uint32) strlen(to)); + return &tmp_value; +} + + +void Item_func_ipv4_and::fix_length_and_dec() +{ + collation.set(args[0]->collation); + max_length= args[0]->max_length; + return; +} + + +String *Item_func_ipv4_or::val_str(String *str) +{ + char key_buff[80]; + String tmp_addr_value(key_buff, sizeof(key_buff), &my_charset_bin); + String *addr1= args[0]->val_str(str); + String *addr2= args[1]->val_str(&tmp_addr_value); + char meta_result[40]; + char meta_result1[40]; + char meta_result2[40]; + unsigned char result[17]; + unsigned char result1[17]; + unsigned char result2[17]; + int i; + int position; + char *to,nibble; + + if ( !addr1 || !addr1->length() || !addr2 || !addr2->length() ) + return 0; + + if ( null_value= ( args[0]->null_value || args[1]->null_value ) ) + return 0; /* purecov: inspected */ + + if ( parse_ipv4(meta_result1,(const char *)addr1->ptr()) ) + return &my_empty_string; + + if ( parse_ipv4(meta_result2,(const char *)addr2->ptr()) ) + return &my_empty_string; + + + pack_result((char *)result1,meta_result1,4); + pack_result((char *)result2,meta_result2,4); + + for ( i= 0; i < 4; i++ ) + result[i]= result1[i] | result2[i]; + + position= 0; + to= meta_result; + + i= snprintf(to,16,"%d.%d.%d.%d", + result[0],result[1],result[2],result[3]); + + + if (addr1->alloced_length() < strlen(to) && addr1->realloc(strlen(to)) ) { + null_value= 1; + return 0; + } + addr1->copy(to,strlen(to),&my_charset_bin); + tmp_value.set(*addr1, (uint32)0, (uint32) strlen(to)); + return &tmp_value; +} + + +void Item_func_ipv4_or::fix_length_and_dec() +{ + collation.set(args[0]->collation); + max_length= args[0]->max_length; + return; +} + + +String *Item_func_ipv4_xor::val_str(String *str) +{ + char key_buff[80]; + String tmp_addr_value(key_buff, sizeof(key_buff), &my_charset_bin); + String *addr1= args[0]->val_str(str); + String *addr2= args[1]->val_str(&tmp_addr_value); + char meta_result[40]; + char meta_result1[40]; + char meta_result2[40]; + unsigned char result[17]; + unsigned char result1[17]; + unsigned char result2[17]; + int i; + int position; + char *to,nibble; + + if ( !addr1 || !addr1->length() || !addr2 || !addr2->length() ) + return 0; + + if ( null_value= ( args[0]->null_value || args[1]->null_value ) ) + return 0; /* purecov: inspected */ + + if ( parse_ipv4(meta_result1,(const char *)addr1->ptr()) ) + return &my_empty_string; + + if ( parse_ipv4(meta_result2,(const char *)addr2->ptr()) ) + return &my_empty_string; + + + pack_result((char *)result1,meta_result1,4); + pack_result((char *)result2,meta_result2,4); + + for ( i= 0; i < 4; i++ ) + result[i]= result1[i] ^ result2[i]; + + position= 0; + to= meta_result; + + i= snprintf(to,16,"%d.%d.%d.%d", + result[0],result[1],result[2],result[3]); + + if ( addr1->alloced_length() < strlen(to) && addr1->realloc(strlen(to)) ) { + null_value= 1; + return 0; + } + addr1->copy(to,strlen(to),&my_charset_bin); + tmp_value.set(*addr1, (uint32)0, (uint32) strlen(to)); + return &tmp_value; +} + + +void Item_func_ipv4_xor::fix_length_and_dec() +{ + collation.set(args[0]->collation); + max_length= args[0]->max_length; + return; +} + + +String *Item_func_ipv4_broadcast::val_str(String *str) +{ + String *addr= args[0]->val_str(str); + longlong prefixlen= args[1]->val_int(); + char meta_result[40]; + unsigned char result[5]; + int cnt1,i; + int offset,sub_offset; + char mask; + + if ( !addr || !addr->length() ) + return 0; + + if ( null_value= ( args[0]->null_value || args[1]->null_value ) ) + return 0; /* purecov: inspected */ + + if ( prefixlen > 32 || prefixlen <0 ) + return &my_empty_string; + + if ( parse_ipv4(meta_result,(const char *)addr->ptr()) ) + return &my_empty_string; + + + pack_result((char *)result,meta_result,4); + + offset= prefixlen/8; + sub_offset= prefixlen%8; + mask= 0xff >> (sub_offset); + result[offset]|= mask; + for ( i= offset+1; i < 4; i++ ) + result[i]|= 0xff; + + cnt1= snprintf(meta_result,16,"%d.%d.%d.%d", + result[0],result[1],result[2],result[3]); + + if (addr->alloced_length() < strlen(meta_result) + && addr->realloc(strlen(meta_result))) { + null_value= 1; + return 0; + } + + addr->copy(meta_result,strlen(meta_result),&my_charset_bin); + tmp_value.set(*addr, (uint32)0, (uint32) strlen(meta_result)); + return &tmp_value; +} + + +void Item_func_ipv4_broadcast::fix_length_and_dec() +{ + collation.set(args[0]->collation); + max_length= args[0]->max_length; + return; +} + + +String *Item_func_ipv4_netmask::val_str(String *str) +{ + String *addr= args[0]->val_str(str); + longlong prefixlen= args[1]->val_int(); + char meta_result[40]; + unsigned char result[5]; + int cnt1,i; + int offset,sub_offset; + char mask; + + if ( !addr || !addr->length() ) + return 0; + + if ( null_value= ( args[0]->null_value || args[1]->null_value ) ) + return 0; /* purecov: inspected */ + + if ( prefixlen > 32 || prefixlen <0 ) + return &my_empty_string; + + if ( parse_ipv4(meta_result,(const char *)addr->ptr()) ) + return &my_empty_string; + + memset(result,255,4); + + offset= prefixlen/8; + sub_offset= prefixlen%8; + mask= 0xff >> (sub_offset); + mask^=0xff; + result[offset]&= mask; + for ( i= offset+1; i < 16; i++ ) + result[i]&= 0x00; + + cnt1= snprintf(meta_result,16,"%d.%d.%d.%d", + result[0],result[1],result[2],result[3]); + + if ( addr->alloced_length() < strlen(meta_result) + && addr->realloc(strlen(meta_result))) { + null_value= 1; + return 0; + } + + addr->copy(meta_result,strlen(meta_result),&my_charset_bin); + tmp_value.set(*addr, (uint32)0, (uint32) strlen(meta_result)); + return &tmp_value; +} + + +void Item_func_ipv4_netmask::fix_length_and_dec() +{ + collation.set(args[0]->collation); + max_length= args[0]->max_length; + return; +} + + +String *Item_func_ipv4_network::val_str(String *str) +{ + String *addr= args[0]->val_str(str); + longlong prefixlen= args[1]->val_int(); + char meta_result[40]; + unsigned char result[5]; + int cnt1,i; + int offset,sub_offset; + char mask; + + if ( !addr || !addr->length() ) + return 0; + + if ( null_value= ( args[0]->null_value || args[1]->null_value ) ) + return 0; /* purecov: inspected */ + + if ( prefixlen > 32 || prefixlen <0 ) + return &my_empty_string; + + if ( parse_ipv4(meta_result,(const char *)addr->ptr()) ) + return &my_empty_string; + + + pack_result((char *)result,meta_result,4); + + offset= prefixlen/8; + sub_offset= prefixlen%8; + mask= 0xff >> (sub_offset); + mask^= 0xff; + result[offset]&= mask; + for ( i= offset+1; i < 16; i++ ) + result[i]&= 0x00; + + memset(meta_result,0,40); + cnt1= snprintf(meta_result,16,"%d.%d.%d.%d", + result[0],result[1],result[2],result[3]); + + if (addr->alloced_length() < strlen(meta_result) + && addr->realloc(strlen(meta_result))) { + null_value= 1; + return 0; + } + + addr->copy(meta_result,strlen(meta_result),&my_charset_bin); + tmp_value.set(*addr, (uint32)0, (uint32) strlen(meta_result)); + return &tmp_value; +} + + +void Item_func_ipv4_network::fix_length_and_dec() +{ + collation.set(args[0]->collation); + max_length= args[0]->max_length; + return; +} + + +String *Item_func_ipv6_abbrev::val_str(String *str) +{ + String *addr= args[0]->val_str(str); + longlong prefixlen= args[1]->val_int(); + char meta_result[40]; + char meta_result2[40]; + unsigned char result[17]; + int cnt1,i; + int offset,sub_offset; + char mask; + int position; + char *to,nibble; + + if ( !addr || !addr->length() ) + return 0; + + if ( null_value= ( args[0]->null_value || args[1]->null_value ) ) + return 0; /* purecov: inspected */ + + if ( prefixlen > 128 || prefixlen <0 ) + return &my_empty_string; + + if ( parse_ipv6(meta_result,(const char *)addr->ptr()) ) + return &my_empty_string; + + + pack_result((char *)result,meta_result,16); + + offset= prefixlen/8; + sub_offset= prefixlen%8; + mask= 0xff >> (sub_offset); + mask^= 0xff; + result[offset]&= mask; + for ( i= offset+1; i < 16; i++ ) + result[i]&= 0x00; + + + position= 0; + to=meta_result2; + + for ( i= 0; i < 32; i++ ) { + if ( prefixlen - 1 < i*4 ) break; + nibble= i%2 ? result[i/2] & 0x0f : (result[i/2] & 0xf0) >>4; + if ( nibble < 10 ) to[position]= '0'+nibble; + else to[position]= 'a'+nibble-10; + position++; + if ( i && !((i+1)%4) ) + to[position++]= ':'; + } + + if ( to[position-1] == ':' ) { + position--; + to[position]= '\0'; + } + else + to[position]= '\0'; + + if (addr->alloced_length() < strlen(to) && addr->realloc(strlen(to))) { + null_value= 1; + return 0; + } + + addr->copy(to,strlen(to),&my_charset_bin); + tmp_value.set(*addr, (uint32)0, (uint32) strlen(to)); + return &tmp_value; +} + + +void Item_func_ipv6_abbrev::fix_length_and_dec() +{ + collation.set(args[0]->collation); + max_length= args[0]->max_length; + return; +} + + +String *Item_func_ipv6_and::val_str(String *str) +{ + char key_buff[80]; + String tmp_addr_value(key_buff, sizeof(key_buff), &my_charset_bin); + String *addr1= args[0]->val_str(str); + String *addr2= args[1]->val_str(&tmp_addr_value); + char meta_result[40]; + char meta_result1[40]; + char meta_result2[40]; + unsigned char result[17]; + unsigned char result1[17]; + unsigned char result2[17]; + int i; + int position; + char *to,nibble; + + if ( !addr1 || !addr1->length() || !addr2 || !addr2->length() ) + return 0; + + if ( null_value=( args[0]->null_value || args[1]->null_value ) ) + return 0; /* purecov: inspected */ + + if ( parse_ipv6(meta_result1,(const char *)addr1->ptr()) ) + return &my_empty_string; + + if ( parse_ipv6(meta_result2,(const char *)addr2->ptr()) ) + return &my_empty_string; + + + pack_result((char *)result1,meta_result1,16); + pack_result((char *)result2,meta_result2,16); + + for ( i= 0; i < 16; i++ ) + result[i]= result1[i] & result2[i]; + + position= 0; + to= meta_result; + + for ( i= 0; i < 32; i++ ) { + nibble= i%2 ? result[i/2] & 0x0f : (result[i/2] & 0xf0) >>4; + if ( nibble < 10 ) to[position]= '0'+nibble; + else to[position]= 'a'+nibble-10; + position++; + if ( i && !((i+1)%4) ) + to[position++]= ':'; + } + + if ( to[position-1] == ':' ) position--; + to[position]= '\0'; + + if (addr1->alloced_length() < strlen(to) && addr1->realloc(strlen(to))) { + null_value= 1; + return 0; + } + + addr1->copy(to,strlen(to),&my_charset_bin); + tmp_value.set(*addr1, (uint32)0, (uint32) strlen(to)); + return &tmp_value; +} + + +void Item_func_ipv6_and::fix_length_and_dec() +{ + collation.set(args[0]->collation); + max_length= args[0]->max_length; + return; +} + + +String *Item_func_ipv6_or::val_str(String *str) +{ + char key_buff[80]; + String tmp_addr_value(key_buff, sizeof(key_buff), &my_charset_bin); + String *addr1= args[0]->val_str(str); + String *addr2= args[1]->val_str(&tmp_addr_value); + char meta_result[40]; + char meta_result1[40]; + char meta_result2[40]; + unsigned char result[17]; + unsigned char result1[17]; + unsigned char result2[17]; + int i; + int position; + char *to,nibble; + + if ( !addr1 || !addr1->length() || !addr2 || !addr2->length() ) + return 0; + + if ( null_value= ( args[0]->null_value || args[1]->null_value ) ) + return 0; /* purecov: inspected */ + + if(parse_ipv6(meta_result1,(const char *)addr1->ptr())) + return &my_empty_string; + + if(parse_ipv6(meta_result2,(const char *)addr2->ptr())) + return &my_empty_string; + + + pack_result((char *)result1,meta_result1,16); + pack_result((char *)result2,meta_result2,16); + + for ( i= 0; i < 16; i++ ) + result[i]= result1[i] | result2[i]; + + position= 0; + to= meta_result; + + for ( i= 0; i < 32; i++ ) { + nibble= i%2 ? result[i/2] & 0x0f : (result[i/2] & 0xf0) >>4; + if ( nibble < 10 ) to[position]= '0'+nibble; + else to[position]= 'a'+nibble-10; + position++; + if ( i && !((i+1)%4) ) + to[position++]= ':'; + } + if ( to[position-1] == ':' ) position--; + to[position]= '\0'; + + if (addr1->alloced_length() < strlen(to) && addr1->realloc(strlen(to))) { + null_value= 1; + return 0; + } + + addr1->copy(to,strlen(to),&my_charset_bin); + tmp_value.set(*addr1, (uint32)0, (uint32) strlen(to)); + return &tmp_value; +} + + +void Item_func_ipv6_or::fix_length_and_dec() +{ + collation.set(args[0]->collation); + max_length= args[0]->max_length; + return; +} + + +String *Item_func_ipv6_xor::val_str(String *str) +{ + char key_buff[80]; + String tmp_addr_value(key_buff, sizeof(key_buff), &my_charset_bin); + String *addr1= args[0]->val_str(str); + String *addr2= args[1]->val_str(&tmp_addr_value); + char meta_result[40]; + char meta_result1[40]; + char meta_result2[40]; + unsigned char result[17]; + unsigned char result1[17]; + unsigned char result2[17]; + int i; + int position; + char *to,nibble; + + if ( !addr1 || !addr1->length() || !addr2 || !addr2->length() ) + return 0; + + if ( null_value=( args[0]->null_value || args[1]->null_value ) ) + return 0; /* purecov: inspected */ + + if ( parse_ipv6(meta_result1,(const char *)addr1->ptr()) ) + return &my_empty_string; + + if ( parse_ipv6(meta_result2,(const char *)addr2->ptr()) ) + return &my_empty_string; + + + pack_result((char *)result1,meta_result1,16); + pack_result((char *)result2,meta_result2,16); + + for ( i= 0; i < 16; i++ ) + result[i]= result1[i] ^ result2[i]; + + position= 0; + to= meta_result; + + for ( i= 0; i < 32; i++ ) { + nibble= i%2 ? result[i/2] & 0x0f : (result[i/2] & 0xf0) >>4; + if ( nibble < 10 ) to[position]= '0'+nibble; + else to[position]= 'a'+nibble-10; + position++; + if ( i && !((i+1)%4) ) + to[position++]= ':'; + } + + if ( to[position-1] == ':' ) position--; + to[position]= '\0'; + + if (addr1->alloced_length() < strlen(to) && addr1->realloc(strlen(to))) { + null_value= 1; + return 0; + } + + addr1->copy(to,strlen(to),&my_charset_bin); + tmp_value.set(*addr1, (uint32)0, (uint32) strlen(to)); + return &tmp_value; +} + + +void Item_func_ipv6_xor::fix_length_and_dec() +{ + collation.set(args[0]->collation); + max_length= args[0]->max_length; + return; +} + + +String *Item_func_ipv6_compress::val_str(String *str) +{ + String *addr= args[0]->val_str(str); + char meta_result[40]; + char meta_result2[40]; + unsigned char result[17]; + int cnt1,i,j; + int offset,sub_offset; + char mask; + int position; + char *to,nibble,*pr; + int column_seen; + char *max_column,*cur_column; + int max_len,cur_len; + + if ( !addr || !addr->length() ) + return 0; + + if ( null_value= args[0]->null_value ) + return 0; /* purecov: inspected */ + + if ( parse_ipv6(meta_result,(const char *)addr->ptr()) ) + return &my_empty_string; + + pack_result((char *)result,meta_result,16); + + position= 0; + to= meta_result2; + + for ( i= 0; i < 32; i++ ) { + nibble= i%2 ? result[i/2] & 0x0f : (result[i/2] & 0xf0) >>4; + if ( nibble < 10 ) to[position]= '0'+nibble; + else to[position]= 'a'+nibble-10; + position++; + if ( i && !((i+1)%4) ) + to[position++]= ':'; + } + + if ( to[position-1] == ':' ) position--; + to[position]= '\0'; + + column_seen= 1; + j= 0; + for ( i= 0; i < position; i++) { + if ( to[i] == ':' ) { + column_seen=1; + to[j++]=to[i]; + } else + if( to[i] != '0' || !column_seen) { + column_seen=0; + to[j++]= to[i]; + } + } + + to[j]= '\0'; + +// identify longest array of :: + max_len=0; + cur_len=0; + cur_column= max_column= to; + for ( i= 0; i < j; i++ ) { + if( to[i] == ':' ) { + cur_column= to+i; + while ( to[i] == ':' ) cur_len++,i++; + if ( cur_len > max_len ) { + max_column= cur_column; + max_len= cur_len; + } + cur_len=0; + } + } + + pr=meta_result; + memset(pr,0,40); + memcpy(pr,to,j); + memset(to,0,40); + position=0; + for( i = 0; i < j; i++ ) { + to[position++]= pr[i]; + // all :: after first :: should get expanded + if( to + i == max_column) { + to[position++]= pr[i]; + while ( pr[i] == ':' ) i++; + to[position++]= pr[i]; + } else + if( pr[i] == ':' && pr[i+1] == ':' ) + to[position++]= '0'; + + } + to[position]='\0'; + + if (addr->alloced_length() < strlen(to) && addr->realloc(strlen(to))) { + null_value= 1; + return 0; + } + + addr->copy(to,strlen(to),&my_charset_bin); + tmp_value.set(*addr, (uint32)0, (uint32) strlen(to)); + return &tmp_value; +} + + +void Item_func_ipv6_compress::fix_length_and_dec() +{ + collation.set(args[0]->collation); + max_length= args[0]->max_length; + return; +} + + +String *Item_func_ipv6_expand::val_str(String *str) +{ + String *addr= args[0]->val_str(str); + char meta_result[40]; + char meta_result2[40]; + unsigned char result[17]; + int cnt1,i,j; + int offset,sub_offset; + char mask; + int position; + char *to,nibble,*pr; + int column_seen; + char *max_column,*cur_column; + int max_len,cur_len; + + if (!addr || !addr->length()) + return 0; + + if ( null_value= args[0]->null_value ) + return 0; /* purecov: inspected */ + + if ( parse_ipv6(meta_result,(const char *)addr->ptr()) ) + return &my_empty_string; + + pack_result((char *)result,meta_result,16); + + position= 0; + to= meta_result2; + + for ( i= 0; i < 32; i++ ) { + nibble= i%2 ? result[i/2] & 0x0f : (result[i/2] & 0xf0) >>4; + if ( nibble < 10 ) to[position]= '0'+nibble; + else to[position]= 'a'+nibble-10; + position++; + if ( i && !((i+1)%4) ) + to[position++]= ':'; + } + + if ( to[position-1] == ':' ) position--; + to[position]= '\0'; + + if (addr->alloced_length() < strlen(to) && addr->realloc(strlen(to))) { + null_value= 1; + return 0; + } + + addr->copy(to,strlen(to),&my_charset_bin); + tmp_value.set(*addr, (uint32)0, (uint32) strlen(to)); + return &tmp_value; +} + + +void Item_func_ipv6_expand::fix_length_and_dec() +{ + collation.set(args[0]->collation); + max_length= args[0]->max_length; + return; +} + + +String *Item_func_ipv6_toprange::val_str(String *str) +{ + String *addr= args[0]->val_str(str); + longlong prefixlen= args[1]->val_int(); + char meta_result[40]; + char meta_result2[40]; + unsigned char result[17]; + int cnt1,i; + int offset,sub_offset; + char mask; + int position; + char *to,nibble; + + if ( !addr || !addr->length() ) + return 0; + + if ( null_value=( args[0]->null_value || args[1]->null_value ) ) + return 0; /* purecov: inspected */ + + if ( prefixlen > 128 || prefixlen <0 ) + return &my_empty_string; + + if ( parse_ipv6(meta_result,(const char *)addr->ptr()) ) + return &my_empty_string; + + + pack_result((char *)result,meta_result,16); + + offset= prefixlen/8; + sub_offset= prefixlen%8; + mask= 0xff >> (sub_offset); + result[offset]|= mask; + for ( i= offset+1; i < 16; i++ ) + result[i]|= 0xff; + + position= 0; + to= meta_result2; + + for ( i= 0; i < 32; i++ ) { + nibble= i%2 ? result[i/2] & 0x0f : (result[i/2] & 0xf0) >>4; + if ( nibble < 10 ) to[position]= '0'+nibble; + else to[position]= 'a'+nibble-10; + position++; + if ( i && !((i+1)%4) ) + to[position++]= ':'; + } + + if ( to[position-1] == ':' ) position--; + to[position]= '\0'; + + if (addr->alloced_length() < strlen(to) && addr->realloc(strlen(to))) { + null_value= 1; + return 0; + } + + addr->copy(to,strlen(to),&my_charset_bin); + tmp_value.set(*addr, (uint32)0, (uint32) strlen(to)); + return &tmp_value; +} + + +void Item_func_ipv6_toprange::fix_length_and_dec() +{ + collation.set(args[0]->collation); + max_length= args[0]->max_length; + return; +} + + +String *Item_func_ipv6_netmask::val_str(String *str) +{ + String *addr= args[0]->val_str(str); + longlong prefixlen= args[1]->val_int(); + char meta_result[40]; + char meta_result2[40]; + unsigned char result[17]; + int cnt1,i; + int offset,sub_offset; + char mask; + int position; + char *to,nibble; + + if ( !addr || !addr->length() ) + return 0; + + if ( null_value=( args[0]->null_value || args[1]->null_value ) ) + return 0; /* purecov: inspected */ + + if ( prefixlen > 128 || prefixlen <0 ) + return &my_empty_string; + + if ( parse_ipv6(meta_result,(const char *)addr->ptr()) ) + return &my_empty_string; + + memset(result,255,16); + + offset= prefixlen/8; + sub_offset= prefixlen%8; + mask= 0xff >> (sub_offset); + mask^= 0xff; + result[offset]&= mask; + for ( i= offset+1; i < 16; i++ ) + result[i]&= 0x00; + + + position= 0; + to= meta_result2; + + for ( i= 0; i < 32; i++ ) { + nibble= i%2 ? result[i/2] & 0x0f : (result[i/2] & 0xf0) >>4; + if ( nibble < 10 ) to[position]= '0'+nibble; + else to[position]= 'a'+nibble-10; + position++; + if ( i && !((i+1)%4) ) + to[position++]= ':'; + } + + if ( to[position-1] == ':' ) position--; + to[position]= '\0'; + + if (addr->alloced_length() < strlen(to) && addr->realloc(strlen(to))) { + null_value= 1; + return 0; + } + + addr->copy(to,strlen(to),&my_charset_bin); + tmp_value.set(*addr, (uint32)0, (uint32) strlen(to)); + return &tmp_value; +} + + +void Item_func_ipv6_netmask::fix_length_and_dec() +{ + collation.set(args[0]->collation); + max_length= args[0]->max_length; + return; +} + + +String *Item_func_ipv6_network::val_str(String *str) +{ + String *addr= args[0]->val_str(str); + longlong prefixlen= args[1]->val_int(); + char meta_result[40]; + char meta_result2[40]; + unsigned char result[17]; + int cnt1,i; + int offset,sub_offset; + char mask; + int position; + char *to,nibble; + + if ( !addr || !addr->length() ) + return 0; + + if ( null_value= ( args[0]->null_value || args[1]->null_value ) ) + return 0; /* purecov: inspected */ + + if ( prefixlen > 128 || prefixlen <0 ) + return &my_empty_string; + + if ( parse_ipv6(meta_result,(const char *)addr->ptr()) ) + return &my_empty_string; + + + pack_result((char *)result,meta_result,16); + + offset= prefixlen/8; + sub_offset= prefixlen%8; + mask= 0xff >> (sub_offset); + mask^= 0xff; + result[offset]&= mask; + for ( i= offset+1; i < 16; i++ ) + result[i]&= 0x00; + + position= 0; + to= meta_result2; + + for ( i= 0; i < 32; i++ ) { + nibble= i%2 ? result[i/2] & 0x0f : (result[i/2] & 0xf0) >>4; + if ( nibble < 10 ) to[position]= '0'+nibble; + else to[position]= 'a'+nibble-10; + position++; + if ( i && !((i+1)%4) ) + to[position++]= ':'; + } + + if ( to[position-1] == ':' ) position--; + to[position]= '\0'; + + if (addr->alloced_length() < strlen(to) && addr->realloc(strlen(to))) { + null_value= 1; + return 0; + } + + addr->copy(to,strlen(to),&my_charset_bin); + tmp_value.set(*addr, (uint32)0, (uint32) strlen(to)); + return &tmp_value; +} + + +void Item_func_ipv6_network::fix_length_and_dec() +{ + collation.set(args[0]->collation); + max_length= args[0]->max_length; + return; +} + + String *Item_func_reverse::val_str(String *str) { DBUG_ASSERT(fixed == 1); diff -urN mysql-5.1.19-beta/sql/item_strfunc.h mysql-5.1.19-beta_new/sql/item_strfunc.h --- mysql-5.1.19-beta/sql/item_strfunc.h 2007-05-26 10:19:03.000000000 +0000 +++ mysql-5.1.19-beta_new/sql/item_strfunc.h 2007-05-26 10:18:59.000000000 +0000 @@ -187,6 +187,194 @@ }; +class Item_func_address_type :public Item_str_func +{ + String tmp_value; +public: + Item_func_address_type(Item *a) :Item_str_func(a) {} + String *val_str(String *); + void fix_length_and_dec(); + const char *func_name() const { return "addrtype"; } +}; + + +class Item_func_ipv4_abbrev :public Item_str_func +{ + String tmp_value; +public: + Item_func_ipv4_abbrev(Item *a,Item *b) :Item_str_func(a,b) {} + String *val_str(String *); + void fix_length_and_dec(); + const char *func_name() const { return "ipv4_abbrev"; } +}; + + +class Item_func_ipv4_and :public Item_str_func +{ + String tmp_value; +public: + Item_func_ipv4_and(Item *a,Item *b) :Item_str_func(a,b) {} + String *val_str(String *); + void fix_length_and_dec(); + const char *func_name() const { return "ipv4_and"; } +}; + + +class Item_func_ipv4_or :public Item_str_func +{ + String tmp_value; +public: + Item_func_ipv4_or(Item *a,Item *b) :Item_str_func(a,b) {} + String *val_str(String *); + void fix_length_and_dec(); + const char *func_name() const { return "ipv4_or"; } +}; + + +class Item_func_ipv4_xor :public Item_str_func +{ + String tmp_value; +public: + Item_func_ipv4_xor(Item *a,Item *b) :Item_str_func(a,b) {} + String *val_str(String *); + void fix_length_and_dec(); + const char *func_name() const { return "ipv4_xor"; } +}; + + +class Item_func_ipv4_broadcast :public Item_str_func +{ + String tmp_value; +public: + Item_func_ipv4_broadcast(Item *a,Item *b) :Item_str_func(a,b) {} + String *val_str(String *); + void fix_length_and_dec(); + const char *func_name() const { return "ipv4_broadcast"; } +}; + + +class Item_func_ipv4_netmask :public Item_str_func +{ + String tmp_value; +public: + Item_func_ipv4_netmask(Item *a,Item *b) :Item_str_func(a,b) {} + String *val_str(String *); + void fix_length_and_dec(); + const char *func_name() const { return "ipv4_netmask"; } +}; + + +class Item_func_ipv4_network :public Item_str_func +{ + String tmp_value; +public: + Item_func_ipv4_network(Item *a,Item *b) :Item_str_func(a,b) {} + String *val_str(String *); + void fix_length_and_dec(); + const char *func_name() const { return "ipv4_network"; } +}; + + +class Item_func_ipv6_abbrev :public Item_str_func +{ + String tmp_value; +public: + Item_func_ipv6_abbrev(Item *a,Item *b) :Item_str_func(a,b) {} + String *val_str(String *); + void fix_length_and_dec(); + const char *func_name() const { return "ipv6_abbrev"; } +}; + + +class Item_func_ipv6_and :public Item_str_func +{ + String tmp_value; +public: + Item_func_ipv6_and(Item *a,Item *b) :Item_str_func(a,b) {} + String *val_str(String *); + void fix_length_and_dec(); + const char *func_name() const { return "ipv6_and"; } +}; + + +class Item_func_ipv6_or :public Item_str_func +{ + String tmp_value; +public: + Item_func_ipv6_or(Item *a,Item *b) :Item_str_func(a,b) {} + String *val_str(String *); + void fix_length_and_dec(); + const char *func_name() const { return "ipv6_or"; } +}; + + +class Item_func_ipv6_xor :public Item_str_func +{ + String tmp_value; +public: + Item_func_ipv6_xor(Item *a,Item *b) :Item_str_func(a,b) {} + String *val_str(String *); + void fix_length_and_dec(); + const char *func_name() const { return "ipv6_xor"; } +}; + + + +class Item_func_ipv6_expand :public Item_str_func +{ + String tmp_value; +public: + Item_func_ipv6_expand(Item *a) :Item_str_func(a) {} + String *val_str(String *); + void fix_length_and_dec(); + const char *func_name() const { return "ipv6_expand"; } +}; + + +class Item_func_ipv6_compress :public Item_str_func +{ + String tmp_value; +public: + Item_func_ipv6_compress(Item *a) :Item_str_func(a) {} + String *val_str(String *); + void fix_length_and_dec(); + const char *func_name() const { return "ipv6_compress"; } +}; + + +class Item_func_ipv6_toprange :public Item_str_func +{ + String tmp_value; +public: + Item_func_ipv6_toprange(Item *a,Item *b) :Item_str_func(a,b) {} + String *val_str(String *); + void fix_length_and_dec(); + const char *func_name() const { return "ipv6_toprange"; } +}; + + +class Item_func_ipv6_netmask :public Item_str_func +{ + String tmp_value; +public: + Item_func_ipv6_netmask(Item *a,Item *b) :Item_str_func(a,b) {} + String *val_str(String *); + void fix_length_and_dec(); + const char *func_name() const { return "ipv6_netmask"; } +}; + + +class Item_func_ipv6_network :public Item_str_func +{ + String tmp_value; +public: + Item_func_ipv6_network(Item *a,Item *b) :Item_str_func(a,b) {} + String *val_str(String *); + void fix_length_and_dec(); + const char *func_name() const { return "ipv6_network"; } +}; + + class Item_func_left :public Item_str_func { String tmp_value; diff -urN mysql-5.1.19-beta/sql/lex.h mysql-5.1.19-beta_new/sql/lex.h --- mysql-5.1.19-beta/sql/lex.h 2007-05-26 10:19:53.000000000 +0000 +++ mysql-5.1.19-beta_new/sql/lex.h 2007-05-26 10:18:59.000000000 +0000 @@ -56,6 +56,7 @@ { "ACCESSIBLE", SYM(ACCESSIBLE_SYM)}, { "ACTION", SYM(ACTION)}, { "ADD", SYM(ADD)}, + { "ADDRTYPE", SYM(ADDRTYPE)}, { "AFTER", SYM(AFTER_SYM)}, { "AGAINST", SYM(AGAINST)}, { "AGGREGATE", SYM(AGGREGATE_SYM)}, @@ -186,6 +187,7 @@ { "ERRORS", SYM(ERRORS)}, { "ESCAPE", SYM(ESCAPE_SYM)}, { "ESCAPED", SYM(ESCAPED)}, + { "EUI64", SYM(EUI64_SYM)}, { "EVENT", SYM(EVENT_SYM)}, { "EVENTS", SYM(EVENTS_SYM)}, { "EVERY", SYM(EVERY_SYM)}, @@ -261,6 +263,24 @@ { "INTERVAL", SYM(INTERVAL_SYM)}, { "INTO", SYM(INTO)}, { "IO_THREAD", SYM(RELAY_THREAD)}, + { "IPV4", SYM(IPV4_SYM)}, + { "IPV4_ABBREV", SYM(IPV4_ABBREV_SYM)}, + { "IPV4_BITWISE_AND", SYM(IPV4_BITWISE_AND_SYM)}, + { "IPV4_BITWISE_OR", SYM(IPV4_BITWISE_OR_SYM)}, + { "IPV4_BITWISE_XOR", SYM(IPV4_BITWISE_XOR_SYM)}, + { "IPV4_BROADCAST", SYM(IPV4_BROADCAST_SYM)}, + { "IPV4_NETMASK", SYM(IPV4_NETMASK_SYM)}, + { "IPV4_NETWORK", SYM(IPV4_NETWORK_SYM)}, + { "IPV6", SYM(IPV6_SYM)}, + { "IPV6_ABBREV", SYM(IPV6_ABBREV_SYM)}, + { "IPV6_COMPRESS", SYM(IPV6_COMPRESS_SYM)}, + { "IPV6_BITWISE_AND", SYM(IPV6_BITWISE_AND_SYM)}, + { "IPV6_BITWISE_OR", SYM(IPV6_BITWISE_OR_SYM)}, + { "IPV6_BITWISE_XOR", SYM(IPV6_BITWISE_XOR_SYM)}, + { "IPV6_EXPAND", SYM(IPV6_EXPAND_SYM)}, + { "IPV6_NETMASK", SYM(IPV6_NETMASK_SYM)}, + { "IPV6_NETWORK", SYM(IPV6_NETWORK_SYM)}, + { "IPV6_TOPRANGE", SYM(IPV6_TOPRANGE_SYM)}, { "IS", SYM(IS)}, { "ISOLATION", SYM(ISOLATION)}, { "ISSUER", SYM(ISSUER_SYM)}, @@ -298,6 +318,7 @@ { "LONGTEXT", SYM(LONGTEXT)}, { "LOOP", SYM(LOOP_SYM)}, { "LOW_PRIORITY", SYM(LOW_PRIORITY)}, + { "MAC48", SYM(MAC48_SYM)}, { "MASTER", SYM(MASTER_SYM)}, { "MASTER_CONNECT_RETRY", SYM(MASTER_CONNECT_RETRY_SYM)}, { "MASTER_HOST", SYM(MASTER_HOST_SYM)}, diff -urN mysql-5.1.19-beta/sql/rpl_utility.cc mysql-5.1.19-beta_new/sql/rpl_utility.cc --- mysql-5.1.19-beta/sql/rpl_utility.cc 2007-05-26 10:19:56.000000000 +0000 +++ mysql-5.1.19-beta_new/sql/rpl_utility.cc 2007-05-26 10:18:59.000000000 +0000 @@ -68,7 +68,6 @@ case MYSQL_TYPE_DATETIME: length= 8; break; - break; case MYSQL_TYPE_BIT: length= ~(uint32) 0; break; @@ -94,6 +93,12 @@ case MYSQL_TYPE_GEOMETRY: length= ~(uint32) 0; // NYI break; + case MYSQL_TYPE_EUI64: + case MYSQL_TYPE_MAC48: + case MYSQL_TYPE_IPV4: + case MYSQL_TYPE_IPV6: + length= ~(uint32) 0; + break; } return length; diff -urN mysql-5.1.19-beta/sql/sql_class.cc mysql-5.1.19-beta_new/sql/sql_class.cc --- mysql-5.1.19-beta/sql/sql_class.cc 2007-05-26 10:19:53.000000000 +0000 +++ mysql-5.1.19-beta_new/sql/sql_class.cc 2007-05-26 10:18:59.000000000 +0000 @@ -2728,6 +2728,14 @@ return "MYSQL_TYPE_VAR_STRING"; case MYSQL_TYPE_STRING: return "MYSQL_TYPE_STRING"; + case MYSQL_TYPE_EUI64: + return "MYSQL_TYPE_EUI64"; + case MYSQL_TYPE_MAC48: + return "MYSQL_TYPE_MAC48"; + case MYSQL_TYPE_IPV4: + return "MYSQL_TYPE_IPV4"; + case MYSQL_TYPE_IPV6: + return "MYSQL_TYPE_IPV6"; case MYSQL_TYPE_GEOMETRY: return "MYSQL_TYPE_GEOMETRY"; } diff -urN mysql-5.1.19-beta/sql/sql_table.cc mysql-5.1.19-beta_new/sql/sql_table.cc --- mysql-5.1.19-beta/sql/sql_table.cc 2007-05-26 10:19:15.000000000 +0000 +++ mysql-5.1.19-beta_new/sql/sql_table.cc 2007-05-26 10:18:59.000000000 +0000 @@ -2088,6 +2088,14 @@ } #endif /* fall through */ + case MYSQL_TYPE_EUI64: + case MYSQL_TYPE_MAC48: + case MYSQL_TYPE_IPV4: + case MYSQL_TYPE_IPV6: + sql_field->pack_flag=0; + if (sql_field->charset->state & MY_CS_BINSORT) + sql_field->pack_flag|=FIELDFLAG_BINARY; + break; case MYSQL_TYPE_STRING: sql_field->pack_flag=0; if (sql_field->charset->state & MY_CS_BINSORT) diff -urN mysql-5.1.19-beta/sql/sql_yacc.yy mysql-5.1.19-beta_new/sql/sql_yacc.yy --- mysql-5.1.19-beta/sql/sql_yacc.yy 2007-05-26 10:19:27.000000000 +0000 +++ mysql-5.1.19-beta_new/sql/sql_yacc.yy 2007-05-26 10:18:59.000000000 +0000 @@ -517,6 +517,7 @@ %token ACCESSIBLE_SYM %token ACTION /* SQL-2003-N */ %token ADD /* SQL-2003-R */ +%token ADDRTYPE %token ADDDATE_SYM /* MYSQL-FUNC */ %token AFTER_SYM /* SQL-2003-N */ %token AGAINST @@ -657,6 +658,7 @@ %token ERRORS %token ESCAPED %token ESCAPE_SYM /* SQL-2003-R */ +%token EUI64_SYM %token EVENTS_SYM %token EVENT_SYM %token EVERY_SYM /* SQL-2003-N */ @@ -729,6 +731,24 @@ %token INT_SYM /* SQL-2003-R */ %token INVOKER_SYM %token IN_SYM /* SQL-2003-R */ +%token IPV4_SYM +%token IPV4_ABBREV_SYM +%token IPV4_BITWISE_AND_SYM +%token IPV4_BITWISE_OR_SYM +%token IPV4_BITWISE_XOR_SYM +%token IPV4_BROADCAST_SYM +%token IPV4_NETMASK_SYM +%token IPV4_NETWORK_SYM +%token IPV6_SYM +%token IPV6_ABBREV_SYM +%token IPV6_COMPRESS_SYM +%token IPV6_BITWISE_AND_SYM +%token IPV6_BITWISE_OR_SYM +%token IPV6_BITWISE_XOR_SYM +%token IPV6_EXPAND_SYM +%token IPV6_NETMASK_SYM +%token IPV6_NETWORK_SYM +%token IPV6_TOPRANGE_SYM %token IS /* SQL-2003-R */ %token ISOLATION /* SQL-2003-R */ %token ISSUER_SYM @@ -768,6 +788,7 @@ %token LOOP_SYM %token LOW_PRIORITY %token LT /* OPERATOR */ +%token MAC48_SYM %token MASTER_CONNECT_RETRY_SYM %token MASTER_HOST_SYM %token MASTER_LOG_FILE_SYM @@ -4598,6 +4619,18 @@ | BINARY { Lex->length= (char*) "1"; Lex->charset=&my_charset_bin; $$=MYSQL_TYPE_STRING; } + | EUI64_SYM { Lex->length= (char *) "8"; + Lex->charset=&my_charset_bin; + $$=MYSQL_TYPE_EUI64; } + | MAC48_SYM { Lex->length= (char *) "6"; + Lex->charset=&my_charset_bin; + $$=MYSQL_TYPE_MAC48; } + | IPV4_SYM { Lex->length= (char *) "4"; + Lex->charset=&my_charset_bin; + $$=MYSQL_TYPE_IPV4; } + | IPV6_SYM { Lex->length= (char *) "16"; + Lex->charset=&my_charset_bin; + $$=MYSQL_TYPE_IPV6; } | varchar '(' NUM ')' opt_binary { Lex->length=$3.str; $$= MYSQL_TYPE_VARCHAR; } | nvarchar '(' NUM ')' opt_bin_mod { Lex->length=$3.str; @@ -6739,7 +6772,9 @@ a dedicated rule is needed here. */ function_call_conflict: - ASCII_SYM '(' expr ')' + ADDRTYPE '(' expr ')' + { $$= new (YYTHD->mem_root) Item_func_address_type($3); } + | ASCII_SYM '(' expr ')' { $$= new (YYTHD->mem_root) Item_func_ascii($3); } | CHARSET '(' expr ')' { $$= new (YYTHD->mem_root) Item_func_charset($3); } @@ -6754,6 +6789,38 @@ } | IF '(' expr ',' expr ',' expr ')' { $$= new (YYTHD->mem_root) Item_func_if($3,$5,$7); } + | IPV4_ABBREV_SYM '(' expr ',' expr ')' + { $$= new (YYTHD->mem_root) Item_func_ipv4_abbrev($3,$5); } + | IPV4_BITWISE_AND_SYM '(' expr ',' expr ')' + { $$= new (YYTHD->mem_root) Item_func_ipv4_and($3,$5); } + | IPV4_BITWISE_OR_SYM '(' expr ',' expr ')' + { $$= new (YYTHD->mem_root) Item_func_ipv4_or($3,$5); } + | IPV4_BITWISE_XOR_SYM '(' expr ',' expr ')' + { $$= new (YYTHD->mem_root) Item_func_ipv4_xor($3,$5); } + | IPV4_BROADCAST_SYM '(' expr ',' expr ')' + { $$= new (YYTHD->mem_root) Item_func_ipv4_broadcast($3,$5); } + | IPV4_NETMASK_SYM '(' expr ',' expr ')' + { $$= new (YYTHD->mem_root) Item_func_ipv4_netmask($3,$5); } + | IPV4_NETWORK_SYM '(' expr ',' expr ')' + { $$= new (YYTHD->mem_root) Item_func_ipv4_network($3,$5); } + | IPV6_ABBREV_SYM '(' expr ',' expr ')' + { $$= new (YYTHD->mem_root) Item_func_ipv6_abbrev($3,$5); } + | IPV6_BITWISE_AND_SYM '(' expr ',' expr ')' + { $$= new (YYTHD->mem_root) Item_func_ipv6_and($3,$5); } + | IPV6_BITWISE_OR_SYM '(' expr ',' expr ')' + { $$= new (YYTHD->mem_root) Item_func_ipv6_or($3,$5); } + | IPV6_BITWISE_XOR_SYM '(' expr ',' expr ')' + { $$= new (YYTHD->mem_root) Item_func_ipv6_xor($3,$5); } + | IPV6_COMPRESS_SYM '(' expr ')' + { $$= new (YYTHD->mem_root) Item_func_ipv6_compress($3); } + | IPV6_EXPAND_SYM '(' expr ')' + { $$= new (YYTHD->mem_root) Item_func_ipv6_expand($3); } + | IPV6_TOPRANGE_SYM '(' expr ',' expr ')' + { $$= new (YYTHD->mem_root) Item_func_ipv6_toprange($3,$5); } + | IPV6_NETMASK_SYM '(' expr ',' expr ')' + { $$= new (YYTHD->mem_root) Item_func_ipv6_netmask($3,$5); } + | IPV6_NETWORK_SYM '(' expr ',' expr ')' + { $$= new (YYTHD->mem_root) Item_func_ipv6_network($3,$5); } | MICROSECOND_SYM '(' expr ')' { $$= new (YYTHD->mem_root) Item_func_microsecond($3); } | MOD_SYM '(' expr ',' expr ')' diff -urN mysql-5.1.19-beta/storage/innobase/handler/ha_innodb.cc mysql-5.1.19-beta_new/storage/innobase/handler/ha_innodb.cc --- mysql-5.1.19-beta/storage/innobase/handler/ha_innodb.cc 2007-05-26 10:19:55.000000000 +0000 +++ mysql-5.1.19-beta_new/storage/innobase/handler/ha_innodb.cc 2007-05-26 10:18:59.000000000 +0000 @@ -2620,6 +2620,10 @@ case MYSQL_TYPE_BIT: case MYSQL_TYPE_STRING: + case MYSQL_TYPE_EUI64: + case MYSQL_TYPE_MAC48: + case MYSQL_TYPE_IPV4: + case MYSQL_TYPE_IPV6: case MYSQL_TYPE_VAR_STRING: case MYSQL_TYPE_TINY_BLOB: case MYSQL_TYPE_MEDIUM_BLOB: @@ -2689,6 +2693,10 @@ the type */ DBUG_ASSERT((ulint)MYSQL_TYPE_STRING < 256); + DBUG_ASSERT((ulint)MYSQL_TYPE_EUI64 < 256); + DBUG_ASSERT((ulint)MYSQL_TYPE_MAC48 < 256); + DBUG_ASSERT((ulint)MYSQL_TYPE_IPV4 < 256); + DBUG_ASSERT((ulint)MYSQL_TYPE_IPV6 < 256); DBUG_ASSERT((ulint)MYSQL_TYPE_VAR_STRING < 256); DBUG_ASSERT((ulint)MYSQL_TYPE_DOUBLE < 256); DBUG_ASSERT((ulint)MYSQL_TYPE_FLOAT < 256); @@ -2730,8 +2738,12 @@ return(DATA_VARMYSQL); } case MYSQL_TYPE_BIT: - case MYSQL_TYPE_STRING: if (field->binary()) { - + case MYSQL_TYPE_EUI64: + case MYSQL_TYPE_MAC48: + case MYSQL_TYPE_IPV4: + case MYSQL_TYPE_IPV6: + case MYSQL_TYPE_STRING: + if (field->binary()) { return(DATA_FIXBINARY); } else if (strcmp( field->charset()->name, @@ -3034,6 +3046,10 @@ if (real_type != MYSQL_TYPE_ENUM && real_type != MYSQL_TYPE_SET && ( mysql_type == MYSQL_TYPE_VAR_STRING + || mysql_type == MYSQL_TYPE_EUI64 + || mysql_type == MYSQL_TYPE_MAC48 + || mysql_type == MYSQL_TYPE_IPV4 + || mysql_type == MYSQL_TYPE_IPV6 || mysql_type == MYSQL_TYPE_STRING)) { cs = field->charset(); diff -urN mysql-5.1.19-beta/storage/myisam/ha_myisam.cc mysql-5.1.19-beta_new/storage/myisam/ha_myisam.cc --- mysql-5.1.19-beta/storage/myisam/ha_myisam.cc 2007-05-26 10:19:00.000000000 +0000 +++ mysql-5.1.19-beta_new/storage/myisam/ha_myisam.cc 2007-05-26 10:18:59.000000000 +0000 @@ -168,6 +168,10 @@ keydef[i].flag|= HA_PACK_KEY; if (!(field->flags & ZEROFILL_FLAG) && (field->type() == MYSQL_TYPE_STRING || + field->type() == MYSQL_TYPE_EUI64 || + field->type() == MYSQL_TYPE_MAC48 || + field->type() == MYSQL_TYPE_IPV4 || + field->type() == MYSQL_TYPE_IPV6 || field->type() == MYSQL_TYPE_VAR_STRING || ((int) (pos->key_part[j].length - field->decimals())) >= 4)) keydef[i].seg[j].flag|= HA_SPACE_PACK; @@ -264,6 +268,10 @@ (found->flags & ZEROFILL_FLAG)) ? FIELD_NORMAL : found->type() == MYSQL_TYPE_STRING || + found->type() == MYSQL_TYPE_EUI64 || + found->type() == MYSQL_TYPE_MAC48 || + found->type() == MYSQL_TYPE_IPV4 || + found->type() == MYSQL_TYPE_IPV6 || found->type() == MYSQL_TYPE_VAR_STRING ? FIELD_SKIP_ENDSPACE : FIELD_SKIP_PRESPACE);