Index: include/my_base.h =================================================================== --- include/my_base.h (revision 12647) +++ include/my_base.h (working copy) @@ -249,11 +249,12 @@ #define HA_SPATIAL 1024 /* For spatial search */ #define HA_NULL_ARE_EQUAL 2048 /* NULL in key are cmp as equal */ #define HA_GENERATED_KEY 8192 /* Automaticly generated key */ +#define HA_CLUSTERING 131072 /* for TOKUDB: Clustering key */ /* The combination of the above can be used for key type comparison. */ #define HA_KEYFLAG_MASK (HA_NOSAME | HA_PACK_KEY | HA_AUTO_KEY | \ HA_BINARY_PACK_KEY | HA_FULLTEXT | HA_UNIQUE_CHECK | \ - HA_SPATIAL | HA_NULL_ARE_EQUAL | HA_GENERATED_KEY) + HA_SPATIAL | HA_NULL_ARE_EQUAL | HA_GENERATED_KEY | HA_CLUSTERING) #define HA_KEY_HAS_PART_KEY_SEG 65536 /* Key contains partial segments */ Index: sql/sql_yacc.yy =================================================================== --- sql/sql_yacc.yy (revision 12647) +++ sql/sql_yacc.yy (working copy) @@ -593,6 +593,7 @@ %token CIPHER_SYM %token CLIENT_SYM %token CLOSE_SYM /* SQL-2003-R */ +%token CLUSTERING_SYM %token COALESCE /* SQL-2003-N */ %token CODE_SYM %token COLLATE_SYM /* SQL-2003-R */ @@ -5265,6 +5266,7 @@ key_type: key_or_index { $$= Key::MULTIPLE; } | FULLTEXT_SYM opt_key_or_index { $$= Key::FULLTEXT; } + | CLUSTERING_SYM opt_key_or_index { $$= Key::CLUSTERING; } | SPATIAL_SYM opt_key_or_index { #ifdef HAVE_SPATIAL @@ -5301,6 +5303,7 @@ opt_unique_or_fulltext: /* empty */ { $$= Key::MULTIPLE; } | UNIQUE_SYM { $$= Key::UNIQUE; } + | CLUSTERING_SYM { $$= Key::CLUSTERING; } | FULLTEXT_SYM { $$= Key::FULLTEXT;} | SPATIAL_SYM { Index: sql/sql_class.h =================================================================== --- sql/sql_class.h (revision 12647) +++ sql/sql_class.h (working copy) @@ -195,7 +195,7 @@ class Key :public Sql_alloc { public: - enum Keytype { PRIMARY, UNIQUE, MULTIPLE, FULLTEXT, SPATIAL, FOREIGN_KEY}; + enum Keytype { PRIMARY, UNIQUE, MULTIPLE, FULLTEXT, SPATIAL, FOREIGN_KEY, CLUSTERING}; enum Keytype type; KEY_CREATE_INFO key_create_info; List columns; Index: sql/table.cc =================================================================== --- sql/table.cc (revision 12647) +++ sql/table.cc (working copy) @@ -776,6 +776,14 @@ if (new_frm_ver >= 3) { keyinfo->flags= (uint) uint2korr(strpos) ^ HA_NOSAME; + // + // Tokutek change, HA_CLUSTERING in frm means HA_SPATIAL and HA_FULLTEXT set + // + if (keyinfo->flags & HA_SPATIAL && keyinfo->flags & HA_FULLTEXT) { + keyinfo->flags |= HA_CLUSTERING; + keyinfo->flags &= ~(HA_SPATIAL); + keyinfo->flags &= ~(HA_FULLTEXT); + } keyinfo->key_length= (uint) uint2korr(strpos+2); keyinfo->key_parts= (uint) strpos[4]; keyinfo->algorithm= (enum ha_key_alg) strpos[5]; Index: sql/lex.h =================================================================== --- sql/lex.h (revision 12647) +++ sql/lex.h (working copy) @@ -107,6 +107,7 @@ { "CIPHER", SYM(CIPHER_SYM)}, { "CLIENT", SYM(CLIENT_SYM)}, { "CLOSE", SYM(CLOSE_SYM)}, + { "CLUSTERING", SYM(CLUSTERING_SYM)}, { "COALESCE", SYM(COALESCE)}, { "CODE", SYM(CODE_SYM)}, { "COLLATE", SYM(COLLATE_SYM)}, Index: sql/sql_show.cc =================================================================== --- sql/sql_show.cc (revision 12647) +++ sql/sql_show.cc (working copy) @@ -1238,6 +1238,8 @@ packet->append(STRING_WITH_LEN("FULLTEXT KEY ")); else if (key_info->flags & HA_SPATIAL) packet->append(STRING_WITH_LEN("SPATIAL KEY ")); + else if (key_info->flags & HA_CLUSTERING) + packet->append(STRING_WITH_LEN("CLUSTERING KEY ")); else packet->append(STRING_WITH_LEN("KEY ")); Index: sql/unireg.cc =================================================================== --- sql/unireg.cc (revision 12647) +++ sql/unireg.cc (working copy) @@ -508,7 +508,15 @@ key_parts=0; for (key=keyinfo,end=keyinfo+key_count ; key != end ; key++) { - int2store(pos, (key->flags ^ HA_NOSAME)); + uint16 key_flags = (uint16)key->flags; + // + // Tokutek change, HA_CLUSTERING in frm means HA_SPATIAL and HA_FULLTEXT set + // + if (key->flags & HA_CLUSTERING) { + key_flags |= HA_SPATIAL; + key_flags |= HA_FULLTEXT; + } + int2store(pos, (key_flags ^ HA_NOSAME)); int2store(pos+2,key->key_length); pos[4]= (uchar) key->key_parts; pos[5]= (uchar) key->algorithm; Index: sql/sql_table.cc =================================================================== --- sql/sql_table.cc (revision 12647) +++ sql/sql_table.cc (working copy) @@ -2657,6 +2657,9 @@ sym_group_geom.name, sym_group_geom.needed_define); DBUG_RETURN(TRUE); #endif + case Key::CLUSTERING: + key_info->flags = HA_CLUSTERING; + break; case Key::FOREIGN_KEY: key_number--; // Skip this key continue; @@ -5868,6 +5871,9 @@ } else if (key_info->flags & HA_FULLTEXT) key_type= Key::FULLTEXT; + else if (key_info->flags & HA_CLUSTERING) { + key_type = Key::CLUSTERING; + } else key_type= Key::MULTIPLE;