List:Internals« Previous MessageNext Message »
From:Milos Prodanovic Date:July 16 2007 6:04am
Subject:IPV6 data type patch
View as plain text  
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);
Thread
IPV6 data type patchMilos Prodanovic16 Jul
  • Re: IPV6 data type patchStewart Smith16 Jul
    • Re: IPV6 data type patchDavid Li16 Jul
      • Re: IPV6 data type patchMilos Prodanovic17 Jul
        • Re: IPV6 data type patchStewart Smith18 Jul
        • Re: IPV6 data type patchChad MILLER27 Jul
          • Re: IPV6 data type patchMilos Prodanovic27 Jul