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<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;
+}
+
+
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<len; i++)
+ packed[i]= (char ) ( ( (0x0f & unpack[2*i])<<4) + (0x0f & unpack[2*i+1] )
);
+return 0;
+}
+
+
diff -urN mysql-5.1.19-beta/sql/field.cc mysql-5.1.19-beta_new/sql/field.cc
--- mysql-5.1.19-beta/sql/field.cc 2007-05-26 10:18:32.000000000 +0000
+++ mysql-5.1.19-beta_new/sql/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<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;
+}
+
+
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);