1 diff -Ndur ../mysql-5.1.15-beta/config.h.in ./config.h.in
2 --- ../mysql-5.1.15-beta/config.h.in 2007-01-30 17:35:14.000000000 +0900
3 +++ ./config.h.in 2007-02-26 21:04:53.000000000 +0900
5 /* Define to 1 if you have the <aio.h> header file. */
8 +/* Define to 1 if Senna is enabled */
11 /* Define to 1 if you have the `alarm' function. */
15 /* Define if mysql_cv_have_mbstate_t=yes */
18 +/* Define to 1 if libmecab is available */
21 /* Define to 1 if you have the `memcpy' function. */
24 diff -Ndur ../mysql-5.1.15-beta/configure.in ./configure.in
25 --- ../mysql-5.1.15-beta/configure.in 2007-01-30 17:34:03.000000000 +0900
26 +++ ./configure.in 2007-02-26 21:04:53.000000000 +0900
28 # Types that must be checked AFTER large file support is checked
33 +[ --with-mecab[=DIR] Specify install prefix of mecab], [
34 + if test "$withval" = "yes"; then
37 + MECAB_PREFIX="$withval"
46 +if test -z "$MECAB_PREFIX"; then
47 + if eval 'mecab-config --prefix 2>&1 >/dev/null'; then
48 + MECAB_CONFIG='mecab-config'
49 + MECAB_PREFIX='mecab-config --prefix'
50 + MECAB_INCLUDES="`\"$MECAB_CONFIG\" --cflags`"
51 + MECAB_LIBS="${LDFLAGS} `\"$MECAB_CONFIG\" --libs`"
54 + MECAB_CONFIG="$MECAB_PREFIX/bin/mecab-config"
56 + if test -x "$MECAB_CONFIG"; then
57 + MECAB_INCLUDES="`\"$MECAB_CONFIG\" --cflags`"
58 + MECAB_LIBS="`\"$MECAB_CONFIG\" --libs`"
60 + MECAB_INCLUDES="-I$MECAB_PREFIX/include"
61 + MECAB_LIBS="-L$MECAB_PREFIX/lib"
65 +_CPPFLAGS="${CPPFLAGS}"
67 +CPPFLAGS="${CPPFLAGS} ${MECAB_INCLUDES}"
68 +LIBS="${LIBS} ${MECAB_LIBS}"
70 +AC_CHECK_FUNC(mecab_new, [
71 + AC_DEFINE([HAVE_MECAB], [1], [Define to 1 if libmecab is available])
79 +CPPFLAGS="${_CPPFLAGS}"
82 +AC_SUBST(MECAB_INCLUDES)
89 +[ --with-senna[=DIR] Enable Senna fulltext search support], [
93 + if test "$withval" = "yes"; then
94 + if eval 'senna-cfg --cflags 2>&1 >/dev/null'; then
95 + SENNA_CFG="senna-cfg"
96 + SENNA_PREFIX="senna-cfg --prefix"
97 + SENNA_INCLUDES="`\"$SENNA_CFG\" --cflags` $MECAB_INCLUDES"
98 + SENNA_LIBS="`\"$SENNA_CFG\" --libs` -lsenna $MECAB_LIBS"
100 + SENNA_INCLUDES="$MECAB_INCLUDES"
101 + SENNA_LIBS="-lsenna $MECAB_LIBS"
104 + SENNA_PREFIX="$withval"
105 + SENNA_CFG="$SENNA_PREFIX/bin/senna-cfg"
106 + if test -x "$SENNA_CFG"; then
107 + SENNA_INCLUDES="`\"$SENNA_CFG\" --cflags` $MECAB_INCLUDES"
108 + SENNA_LIBS="`\"$SENNA_CFG\" --libs` -lsenna $MECAB_LIBS"
110 + SENNA_INCLUDES="-I$SENNA_PREFIX/include $MECAB_INCLUDES"
111 + SENNA_LIBS="-L$SENNA_PREFIX/lib -lsenna $MECAB_LIBS"
115 + _CPPFLAGS="${CPPFLAGS}"
117 + CPPFLAGS="${CPPFLAGS} ${SENNA_INCLUDES}"
118 + LIBS="${LIBS} ${SENNA_LIBS}"
120 + AC_CHECK_FUNC(sen_init, [
121 + AC_DEFINE([ENABLE_SENNA], [1], [Define to 1 if Senna is enabled])
123 + AC_MSG_ERROR([Could not find libsenna. Check your Senna installation.])
126 + CPPFLAGS="${_CPPFLAGS}"
132 +AC_SUBST([SENNA_INCLUDES])
133 +AC_SUBST([SENNA_LIBS])
135 #--------------------------------------------------------------------
136 # Check for system header files
137 #--------------------------------------------------------------------
138 diff -Ndur ../mysql-5.1.15-beta/include/myisam.h ./include/myisam.h
139 --- ../mysql-5.1.15-beta/include/myisam.h 2007-01-30 17:34:02.000000000 +0900
140 +++ ./include/myisam.h 2007-02-26 21:04:53.000000000 +0900
142 #include "my_handler.h"
143 #include <mysql/plugin.h>
147 +#define SEN_DISABLE_SENNA 0x80000000 /* Don't use Senna fulltext search engine */
148 +#endif /* ENABLE_SENNA */
151 There is a hard limit for the maximum number of keys as there are only
152 8 bits in the index file header for the number of keys in a table.
156 ulong *rec_per_key; /* for sql optimizing */
158 + unsigned int senna_keys_file_size;
159 + unsigned int senna_keys_size;
160 + unsigned int senna_lexicon_file_size;
161 + unsigned int senna_lexicon_size;
162 + unsigned int senna_inv_seg_size;
163 + unsigned int senna_inv_chunk_size;
164 +#endif /* ENABLE_SENNA */
171 struct st_mysql_ftparser *parser; /* Fulltext [pre]parser */
174 + int senna_initial_n_segments;
176 +#endif /* ENABLE_SENNA */
177 int (*bin_search)(struct st_myisam_info *info,struct st_mi_keydef *keyinfo,
178 uchar *page,uchar *key,
179 uint key_len,uint comp_flag,uchar * *ret_pos,
180 diff -Ndur ../mysql-5.1.15-beta/libmysqld/sql_db.cc ./libmysqld/sql_db.cc
181 --- ../mysql-5.1.15-beta/libmysqld/sql_db.cc 2007-01-30 17:34:12.000000000 +0900
182 +++ ./libmysqld/sql_db.cc 2007-02-26 21:06:50.000000000 +0900
183 @@ -1001,6 +1001,11 @@
184 (file->name[1] == '.' && !file->name[2])))
188 + /* senna files is skip */
189 + /* ".SEN",".SEN.i",".SEN.i.c",".SEN.l", ".SEN.i.c.001",.. and so on */
190 + if (strstr(file->name, ".SEN")) { continue; }
191 +#endif /* ENABLE_SENNA */
192 /* Check if file is a raid directory */
193 if ((my_isdigit(system_charset_info, file->name[0]) ||
194 (file->name[0] >= 'a' && file->name[0] <= 'f')) &&
195 diff -Ndur ../mysql-5.1.15-beta/libmysqld/sql_delete.cc ./libmysqld/sql_delete.cc
196 --- ../mysql-5.1.15-beta/libmysqld/sql_delete.cc 2007-01-30 17:34:38.000000000 +0900
197 +++ ./libmysqld/sql_delete.cc 2007-02-26 21:06:50.000000000 +0900
199 table->file->info(HA_STATUS_AUTO | HA_STATUS_NO_LOCK);
201 close_temporary_table(thd, table, 0, 0); // Don't free share
203 + create_info.key_info=table->key_info;
204 +#endif /* ENABLE_SENNA */
205 ha_create_table(thd, share->normalized_path.str,
206 share->db.str, share->table_name.str, &create_info, 1);
207 // We don't need to call invalidate() because this table is not in cache
208 diff -Ndur ../mysql-5.1.15-beta/libmysqld/sql_show.cc ./libmysqld/sql_show.cc
209 --- ../mysql-5.1.15-beta/libmysqld/sql_show.cc 2007-01-30 17:34:11.000000000 +0900
210 +++ ./libmysqld/sql_show.cc 2007-02-26 21:06:50.000000000 +0900
217 +#include "ha_myisam.h" // For isam
219 +#endif /* ENABLE_SENNA */
221 static const char *grant_names[]={
222 "select","insert","update","delete","create","drop","reload","shutdown",
223 "process","file","grant","references","index","alter"};
224 @@ -5239,6 +5245,12 @@
225 {"TABLE_COLLATION", 64, MYSQL_TYPE_STRING, 0, 1, "Collation"},
226 {"CHECKSUM", 21 , MYSQL_TYPE_LONG, 0, 1, "Checksum"},
227 {"CREATE_OPTIONS", 255, MYSQL_TYPE_STRING, 0, 1, "Create_options"},
228 + {"SENNA_KEY_SIZE", 21 , MYSQL_TYPE_LONG, 0, 1, "Senna_key_size"},
229 + {"SENNA_KEY_FILE_SIZE", 21 , MYSQL_TYPE_LONG, 0, 1, "Senna_key_file_size"},
230 + {"SENNA_LEXICON_SIZE", 21 , MYSQL_TYPE_LONG, 0, 1, "Senna_lexicon_size"},
231 + {"SENNA_LEXICON_FILE_SIZE", 21 , MYSQL_TYPE_LONG, 0, 1, "Senna_lexicon_file_size"},
232 + {"SENNA_INV_SEG_SIZE", 21 , MYSQL_TYPE_LONG, 0, 1, "Senna_inv_seg_size"},
233 + {"SENNA_INV_CHUNK_SIZE", 21 , MYSQL_TYPE_LONG, 0, 1, "Senna_inv_chunk_size"},
234 {"TABLE_COMMENT", 80, MYSQL_TYPE_STRING, 0, 0, "Comment"},
235 {0, 0, MYSQL_TYPE_STRING, 0, 0, 0}
237 diff -Ndur ../mysql-5.1.15-beta/libmysqld/sql_table.cc ./libmysqld/sql_table.cc
238 --- ../mysql-5.1.15-beta/libmysqld/sql_table.cc 2007-01-30 17:34:12.000000000 +0900
239 +++ ./libmysqld/sql_table.cc 2007-02-26 21:06:50.000000000 +0900
240 @@ -2621,6 +2621,9 @@
241 if (!*key_info_buffer || ! key_part_info)
242 DBUG_RETURN(-1); // Out of memory
245 + create_info->key_info=*key_info_buffer;
246 +#endif /* ENABLE_SENNA */
247 key_iterator.rewind();
249 for (; (key=key_iterator++) ; key_number++)
250 @@ -2668,6 +2671,10 @@
252 key_info->flags|= HA_GENERATED_KEY;
255 + key_info->senna_flags=key->senna_flags;
256 + key_info->senna_initial_n_segments=key->senna_initial_n_segments;
257 +#endif /* ENABLE_SENNA */
258 key_info->key_parts=(uint8) key->columns.elements;
259 key_info->key_part=key_part_info;
260 key_info->usable_key_parts= key_number;
261 @@ -5862,6 +5869,21 @@
262 if (key_info->flags & HA_USES_PARSER)
263 key_create_info.parser_name= *key_info->parser_name;
266 + key_list.push_back(new Key(key_info->flags & HA_SPATIAL ? Key::SPATIAL :
267 + (key_info->flags & HA_NOSAME ?
268 + (!my_strcasecmp(system_charset_info,
269 + key_name, primary_key_name) ?
270 + Key::PRIMARY : Key::UNIQUE) :
271 + (key_info->flags & HA_FULLTEXT ?
272 + Key::FULLTEXT : Key::MULTIPLE)),
275 + test(key_info->flags & HA_GENERATED_KEY),
277 + key_info->senna_flags,
278 + key_info->senna_initial_n_segments));
279 +#else /* ENABLE_SENNA */
280 key_list.push_back(new Key(key_info->flags & HA_SPATIAL ? Key::SPATIAL :
281 (key_info->flags & HA_NOSAME ?
282 (!my_strcasecmp(system_charset_info,
283 @@ -5873,6 +5895,7 @@
285 test(key_info->flags & HA_GENERATED_KEY),
287 +#endif /* ENABLE_SENNA */
291 diff -Ndur ../mysql-5.1.15-beta/sql/Makefile.am ./sql/Makefile.am
292 --- ../mysql-5.1.15-beta/sql/Makefile.am 2007-01-30 17:34:25.000000000 +0900
293 +++ ./sql/Makefile.am 2007-02-26 23:08:30.000000000 +0900
295 INCLUDES = @ZLIB_INCLUDES@ \
296 -I$(top_builddir)/include -I$(top_srcdir)/include \
297 -I$(top_srcdir)/regex -I$(srcdir) \
298 - $(openssl_includes)
299 + $(openssl_includes) @SENNA_INCLUDES@ @MECAB_INCLUDES@
302 libexec_PROGRAMS = mysqld
305 @mysql_plugin_libs@ \
306 $(LDADD) $(CXXLDFLAGS) $(WRAPLIBS) @LIBDL@ \
307 - @yassl_libs@ @openssl_libs@
308 + @yassl_libs@ @openssl_libs@ \
309 + @SENNA_LIBS@ @MECAB_LIBS@
310 noinst_HEADERS = item.h item_func.h item_sum.h item_cmpfunc.h \
311 item_strfunc.h item_timefunc.h \
313 diff -Ndur ../mysql-5.1.15-beta/sql/handler.h ./sql/handler.h
314 --- ../mysql-5.1.15-beta/sql/handler.h 2007-01-30 17:34:12.000000000 +0900
315 +++ ./sql/handler.h 2007-02-26 23:05:23.000000000 +0900
317 bool frm_only; /* 1 if no ha_create_table() */
318 bool varchar; /* 1 if table has a VARCHAR */
319 enum ha_storage_media storage_media; /* DEFAULT, DISK or MEMORY */
320 + #ifdef ENABLE_SENNA
322 + #endif /* ENABLE_SENNA */
326 @@ -950,12 +953,26 @@
328 Discrete_interval auto_inc_interval_for_cur_row;
331 + longlong senna_keys_size;
332 + longlong senna_keys_file_size;
333 + longlong senna_lexicon_size;
334 + longlong senna_lexicon_file_size;
335 + longlong senna_inv_seg_size;
336 + longlong senna_inv_chunk_size;
337 +#endif /* ENABLE_SENNA */
339 handler(handlerton *ht_arg, TABLE_SHARE *share_arg)
340 :table_share(share_arg), estimation_rows_to_insert(0), ht(ht_arg),
341 ref(0), key_used_on_scan(MAX_KEY), active_index(MAX_KEY),
342 ref_length(sizeof(my_off_t)),
343 ft_handler(0), inited(NONE), implicit_emptied(0),
344 pushed_cond(NULL), next_insert_id(0), insert_id_for_cur_row(0)
345 + #ifdef ENABLE_SENNA
346 + , senna_keys_size((longlong)-1), senna_keys_file_size((longlong)-1)
347 + , senna_lexicon_size((longlong)-1), senna_lexicon_file_size((longlong)-1)
348 + , senna_inv_seg_size((longlong)-1), senna_inv_chunk_size((longlong)-1)
349 + #endif /* ENABLE_SENNA */
351 virtual ~handler(void)
353 diff -Ndur ../mysql-5.1.15-beta/sql/lex.h ./sql/lex.h
354 --- ../mysql-5.1.15-beta/sql/lex.h 2007-01-30 17:34:29.000000000 +0900
355 +++ ./sql/lex.h 2007-02-26 21:07:21.000000000 +0900
357 { "SECOND_MICROSECOND", SYM(SECOND_MICROSECOND_SYM)},
358 { "SECURITY", SYM(SECURITY_SYM)},
359 { "SELECT", SYM(SELECT_SYM)},
360 + { "SENNA", SYM(SENNA_SYM)},
361 + { "NORMALIZE", SYM(SENNA_NORMALIZE_SYM)},
362 + { "NGRAM", SYM(SENNA_NGRAM_SYM)},
363 + { "DELIMITED", SYM(SENNA_DELIMITED_SYM)},
364 { "SENSITIVE", SYM(SENSITIVE_SYM)},
365 { "SEPARATOR", SYM(SEPARATOR_SYM)},
366 { "SERIAL", SYM(SERIAL_SYM)},
367 diff -Ndur ../mysql-5.1.15-beta/sql/mysqld.cc ./sql/mysqld.cc
368 --- ../mysql-5.1.15-beta/sql/mysqld.cc 2007-01-30 17:34:02.000000000 +0900
369 +++ ./sql/mysqld.cc 2007-02-26 21:07:21.000000000 +0900
370 @@ -3553,6 +3553,9 @@
372 (void) thr_setconcurrency(concurrency); // 10 by default
376 +#endif /* ENABLE_SENNA */
377 select_thread=pthread_self();
378 select_thread_in_use=1;
380 diff -Ndur ../mysql-5.1.15-beta/sql/sql_class.h ./sql/sql_class.h
381 --- ../mysql-5.1.15-beta/sql/sql_class.h 2007-01-30 17:34:29.000000000 +0900
382 +++ ./sql/sql_class.h 2007-02-26 21:07:21.000000000 +0900
383 @@ -117,12 +117,25 @@
384 List<key_part_spec> columns;
389 + int senna_initial_n_segments;
390 +#endif /* ENABLE_SENNA */
393 + Key(enum Keytype type_par, const char *name_arg,
394 + KEY_CREATE_INFO *key_info_arg,
395 + bool generated_arg, List<key_part_spec> &cols, int sen_flags=1, int sen_nsegs=0)
396 + :type(type_par), key_create_info(*key_info_arg), columns(cols),
397 + name(name_arg), generated(generated_arg),
398 + senna_flags(sen_flags), senna_initial_n_segments(sen_nsegs)
399 +#else /* ENABLE_SENNA */
400 Key(enum Keytype type_par, const char *name_arg,
401 KEY_CREATE_INFO *key_info_arg,
402 bool generated_arg, List<key_part_spec> &cols)
403 :type(type_par), key_create_info(*key_info_arg), columns(cols),
404 name(name_arg), generated(generated_arg)
405 +#endif /* ENABLE_SENNA */
408 /* Equality comparison of keys (ignoring name) */
409 diff -Ndur ../mysql-5.1.15-beta/sql/sql_db.cc ./sql/sql_db.cc
410 --- ../mysql-5.1.15-beta/sql/sql_db.cc 2007-01-30 17:34:12.000000000 +0900
411 +++ ./sql/sql_db.cc 2007-02-26 21:07:21.000000000 +0900
412 @@ -1001,6 +1001,11 @@
413 (file->name[1] == '.' && !file->name[2])))
417 + /* senna files is skip */
418 + /* ".SEN",".SEN.i",".SEN.i.c",".SEN.l", ".SEN.i.c.001",.. and so on */
419 + if (strstr(file->name, ".SEN")) { continue; }
420 +#endif /* ENABLE_SENNA */
421 /* Check if file is a raid directory */
422 if ((my_isdigit(system_charset_info, file->name[0]) ||
423 (file->name[0] >= 'a' && file->name[0] <= 'f')) &&
424 diff -Ndur ../mysql-5.1.15-beta/sql/sql_delete.cc ./sql/sql_delete.cc
425 --- ../mysql-5.1.15-beta/sql/sql_delete.cc 2007-01-30 17:34:38.000000000 +0900
426 +++ ./sql/sql_delete.cc 2007-02-26 21:07:21.000000000 +0900
428 table->file->info(HA_STATUS_AUTO | HA_STATUS_NO_LOCK);
430 close_temporary_table(thd, table, 0, 0); // Don't free share
432 + create_info.key_info=table->key_info;
433 +#endif /* ENABLE_SENNA */
434 ha_create_table(thd, share->normalized_path.str,
435 share->db.str, share->table_name.str, &create_info, 1);
436 // We don't need to call invalidate() because this table is not in cache
437 diff -Ndur ../mysql-5.1.15-beta/sql/sql_lex.h ./sql/sql_lex.h
438 --- ../mysql-5.1.15-beta/sql/sql_lex.h 2007-01-30 17:34:02.000000000 +0900
439 +++ ./sql/sql_lex.h 2007-02-26 21:07:21.000000000 +0900
440 @@ -1130,6 +1130,12 @@
446 + int senna_initial_n_segments;
447 + inline void senna_clear() { senna_flags=1; senna_initial_n_segments=0; }
448 +#endif /* ENABLE_SENNA */
453 diff -Ndur ../mysql-5.1.15-beta/sql/sql_show.cc ./sql/sql_show.cc
454 --- ../mysql-5.1.15-beta/sql/sql_show.cc 2007-01-30 17:34:11.000000000 +0900
455 +++ ./sql/sql_show.cc 2007-02-26 21:07:21.000000000 +0900
462 +#include "ha_myisam.h" // For isam
464 +#endif /* ENABLE_SENNA */
466 static const char *grant_names[]={
467 "select","insert","update","delete","create","drop","reload","shutdown",
468 "process","file","grant","references","index","alter"};
469 @@ -5239,6 +5245,12 @@
470 {"TABLE_COLLATION", 64, MYSQL_TYPE_STRING, 0, 1, "Collation"},
471 {"CHECKSUM", 21 , MYSQL_TYPE_LONG, 0, 1, "Checksum"},
472 {"CREATE_OPTIONS", 255, MYSQL_TYPE_STRING, 0, 1, "Create_options"},
473 + {"SENNA_KEY_SIZE", 21 , MYSQL_TYPE_LONG, 0, 1, "Senna_key_size"},
474 + {"SENNA_KEY_FILE_SIZE", 21 , MYSQL_TYPE_LONG, 0, 1, "Senna_key_file_size"},
475 + {"SENNA_LEXICON_SIZE", 21 , MYSQL_TYPE_LONG, 0, 1, "Senna_lexicon_size"},
476 + {"SENNA_LEXICON_FILE_SIZE", 21 , MYSQL_TYPE_LONG, 0, 1, "Senna_lexicon_file_size"},
477 + {"SENNA_INV_SEG_SIZE", 21 , MYSQL_TYPE_LONG, 0, 1, "Senna_inv_seg_size"},
478 + {"SENNA_INV_CHUNK_SIZE", 21 , MYSQL_TYPE_LONG, 0, 1, "Senna_inv_chunk_size"},
479 {"TABLE_COMMENT", 80, MYSQL_TYPE_STRING, 0, 0, "Comment"},
480 {0, 0, MYSQL_TYPE_STRING, 0, 0, 0}
482 diff -Ndur ../mysql-5.1.15-beta/sql/sql_table.cc ./sql/sql_table.cc
483 --- ../mysql-5.1.15-beta/sql/sql_table.cc 2007-01-30 17:34:12.000000000 +0900
484 +++ ./sql/sql_table.cc 2007-02-26 21:07:21.000000000 +0900
485 @@ -2621,6 +2621,9 @@
486 if (!*key_info_buffer || ! key_part_info)
487 DBUG_RETURN(-1); // Out of memory
490 + create_info->key_info=*key_info_buffer;
491 +#endif /* ENABLE_SENNA */
492 key_iterator.rewind();
494 for (; (key=key_iterator++) ; key_number++)
495 @@ -2668,6 +2671,10 @@
497 key_info->flags|= HA_GENERATED_KEY;
500 + key_info->senna_flags=key->senna_flags;
501 + key_info->senna_initial_n_segments=key->senna_initial_n_segments;
502 +#endif /* ENABLE_SENNA */
503 key_info->key_parts=(uint8) key->columns.elements;
504 key_info->key_part=key_part_info;
505 key_info->usable_key_parts= key_number;
506 @@ -5862,6 +5869,21 @@
507 if (key_info->flags & HA_USES_PARSER)
508 key_create_info.parser_name= *key_info->parser_name;
511 + key_list.push_back(new Key(key_info->flags & HA_SPATIAL ? Key::SPATIAL :
512 + (key_info->flags & HA_NOSAME ?
513 + (!my_strcasecmp(system_charset_info,
514 + key_name, primary_key_name) ?
515 + Key::PRIMARY : Key::UNIQUE) :
516 + (key_info->flags & HA_FULLTEXT ?
517 + Key::FULLTEXT : Key::MULTIPLE)),
520 + test(key_info->flags & HA_GENERATED_KEY),
522 + key_info->senna_flags,
523 + key_info->senna_initial_n_segments));
524 +#else /* ENABLE_SENNA */
525 key_list.push_back(new Key(key_info->flags & HA_SPATIAL ? Key::SPATIAL :
526 (key_info->flags & HA_NOSAME ?
527 (!my_strcasecmp(system_charset_info,
528 @@ -5873,6 +5895,7 @@
530 test(key_info->flags & HA_GENERATED_KEY),
532 +#endif /* ENABLE_SENNA */
536 diff -Ndur ../mysql-5.1.15-beta/sql/sql_yacc.yy ./sql/sql_yacc.yy
537 --- ../mysql-5.1.15-beta/sql/sql_yacc.yy 2007-01-30 17:34:13.000000000 +0900
538 +++ ./sql/sql_yacc.yy 2007-02-26 23:07:50.000000000 +0900
540 %token SECOND_SYM /* SQL-2003-R */
541 %token SECURITY_SYM /* SQL-2003-N */
542 %token SELECT_SYM /* SQL-2003-R */
543 +%token SENNA_DELIMITED_SYM
544 +%token SENNA_NGRAM_SYM
545 +%token SENNA_NORMALIZE_SYM
547 %token SENSITIVE_SYM /* FUTURE-USE */
549 %token SERIALIZABLE_SYM /* SQL-2003-N */
550 @@ -1096,6 +1100,7 @@
551 view_check_option trigger_tail sp_tail
552 install uninstall partition_entry binlog_base64_event
553 init_key_options key_options key_opts key_opt key_using_alg
554 + opt_senna_list opt_senna_item
555 server_def server_options_list server_option
558 @@ -1421,6 +1426,9 @@
560 lex->create_list.empty();
561 lex->key_list.empty();
563 + lex->senna_clear();
564 +#endif /* ENABLE_SENNA */
565 lex->col_list.empty();
567 bzero((char*) &lex->create_info,sizeof(lex->create_info));
568 @@ -1455,8 +1463,15 @@
569 yyerror(ER(ER_SYNTAX_ERROR));
573 + lex->key_list.push_back(new Key($2, $4.str, &lex->key_create_info, 0,
574 + lex->col_list, lex->senna_flags,
575 + lex->senna_initial_n_segments));
576 + lex->senna_clear();
577 +#else /* ENABLE_SENNA */
578 lex->key_list.push_back(new Key($2, $4.str, &lex->key_create_info, 0,
580 +#endif /* ENABLE_SENNA */
581 lex->col_list.empty();
583 | CREATE DATABASE opt_if_not_exists ident
584 @@ -4287,6 +4302,9 @@
585 field_spec opt_check_constraint
586 | field_spec references
589 + Lex->senna_clear();
590 +#endif /* ENABLE_SENNA */
591 Lex->col_list.empty(); /* Alloced by sql_alloc */
594 @@ -4300,8 +4318,15 @@
595 yyerror(ER(ER_SYNTAX_ERROR));
599 + lex->key_list.push_back(new Key($1,$2, &lex->key_create_info, 0,
600 + lex->col_list, lex->senna_flags,
601 + lex->senna_initial_n_segments));
602 + lex->senna_clear();
603 +#else /* ENABLE_SENNA */
604 lex->key_list.push_back(new Key($1,$2, &lex->key_create_info, 0,
606 +#endif /* ENABLE_SENNA */
607 lex->col_list.empty(); /* Alloced by sql_alloc */
609 | opt_constraint constraint_key_type opt_ident key_alg
610 @@ -4309,8 +4334,15 @@
613 const char *key_name= $3 ? $3 : $1;
615 + lex->key_list.push_back(new Key($2, key_name, &lex->key_create_info, 0,
616 + lex->col_list, lex->senna_flags,
617 + lex->senna_initial_n_segments));
618 + lex->senna_clear();
619 +#else /* ENABLE_SENNA */
620 lex->key_list.push_back(new Key($2, key_name, &lex->key_create_info, 0,
622 +#endif /* ENABLE_SENNA */
623 lex->col_list.empty(); /* Alloced by sql_alloc */
625 | opt_constraint FOREIGN KEY_SYM opt_ident '(' key_list ')' references
626 @@ -4325,6 +4357,9 @@
627 lex->key_list.push_back(new Key(Key::MULTIPLE, $4 ? $4 : $1,
628 &default_key_create_info, 1,
631 + lex->senna_clear();
632 +#endif /* ENABLE_SENNA */
633 lex->col_list.empty(); /* Alloced by sql_alloc */
635 /* Only used for ALTER TABLE. Ignored otherwise. */
636 @@ -4332,10 +4367,16 @@
638 | constraint opt_check_constraint
641 + Lex->senna_clear();
642 +#endif /* ENABLE_SENNA */
643 Lex->col_list.empty(); /* Alloced by sql_alloc */
645 | opt_constraint check_constraint
648 + Lex->senna_clear();
649 +#endif /* ENABLE_SENNA */
650 Lex->col_list.empty(); /* Alloced by sql_alloc */
653 @@ -4868,7 +4909,53 @@
655 $$= HA_KEY_ALG_RTREE;
657 - | HASH_SYM { $$= HA_KEY_ALG_HASH; };
658 + | HASH_SYM { $$= HA_KEY_ALG_HASH; }
659 + | opt_senna_list { $$= HA_KEY_ALG_UNDEF; };
663 + | opt_senna_item ',' opt_senna_list ;
668 + Lex->senna_flags &= ~SEN_DISABLE_SENNA;
669 +#endif /* ENABLE_SENNA */
671 + | NO_SYM SENNA_SYM {
673 + Lex->senna_flags |= SEN_DISABLE_SENNA;
674 +#endif /* ENABLE_SENNA */
676 + | SENNA_NORMALIZE_SYM {
678 + Lex->senna_flags |= SEN_INDEX_NORMALIZE;
679 +#endif /* ENABLE_SENNA */
681 + | NO_SYM SENNA_NORMALIZE_SYM {
683 + Lex->senna_flags &= ~SEN_INDEX_NORMALIZE;
684 +#endif /* ENABLE_SENNA */
686 + | SENNA_DELIMITED_SYM {
688 + Lex->senna_flags |= SEN_INDEX_DELIMITED;
689 +#endif /* ENABLE_SENNA */
691 + | SENNA_NGRAM_SYM {
693 + Lex->senna_flags |= SEN_INDEX_NGRAM;
694 +#endif /* ENABLE_SENNA */
699 + Lex->senna_initial_n_segments=$1;
701 + Lex->senna_flags |= $1;
703 +#endif /* ENABLE_SENNA */
707 key_list ',' key_part order_dir { Lex->col_list.push_back($3); }
708 @@ -4916,6 +5003,9 @@
710 lex->create_list.empty();
711 lex->key_list.empty();
713 + lex->senna_clear();
714 +#endif /* ENABLE_SENNA */
715 lex->col_list.empty();
716 lex->select_lex.init_order();
718 @@ -9783,6 +9873,10 @@
722 + | SENNA_DELIMITED_SYM {}
723 + | SENNA_NGRAM_SYM {}
724 + | SENNA_NORMALIZE_SYM {}
727 | SERIALIZABLE_SYM {}
729 diff -Ndur ../mysql-5.1.15-beta/sql/structs.h ./sql/structs.h
730 --- ../mysql-5.1.15-beta/sql/structs.h 2007-01-30 17:34:12.000000000 +0900
731 +++ ./sql/structs.h 2007-02-26 21:07:21.000000000 +0900
733 int bdb_return_if_eq;
735 struct st_table *table;
738 + int senna_initial_n_segments;
739 +#endif /* ENABLE_SENNA */
743 diff -Ndur ../mysql-5.1.15-beta/storage/myisam/Makefile.am ./storage/myisam/Makefile.am
744 --- ../mysql-5.1.15-beta/storage/myisam/Makefile.am 2007-01-30 17:34:12.000000000 +0900
745 +++ ./storage/myisam/Makefile.am 2007-02-26 22:59:30.000000000 +0900
747 INCLUDES = -I$(top_srcdir)/include -I$(top_builddir)/include \
748 -I$(top_srcdir)/regex \
749 -I$(top_srcdir)/sql \
750 + @SENNA_INCLUDES@ @MECAB_INCLUDES@ \
755 +LDADD = @SENNA_LIBS@ @MECAB_LIBS@
759 diff -Ndur ../mysql-5.1.15-beta/storage/myisam/ft_boolean_search.c ./storage/myisam/ft_boolean_search.c
760 --- ../mysql-5.1.15-beta/storage/myisam/ft_boolean_search.c 2007-01-30 17:33:57.000000000 +0900
761 +++ ./storage/myisam/ft_boolean_search.c 2007-02-26 21:07:21.000000000 +0900
768 +#define SENNA_MAX_N_EXPR 32
769 +#endif /* ENABLE_SENNA */
771 /* search with boolean queries */
773 static double _wghts[11]=
777 enum { UNINITIALIZED, READY, INDEX_SEARCH, INDEX_DONE } state;
780 +#endif /* ENABLE_SENNA */
783 static int FTB_WORD_cmp(my_off_t *v, FTB_WORD *a, FTB_WORD *b)
785 DBUG_ASSERT(keynr==NO_SUCH_KEY || cs == info->s->keyinfo[keynr].seg->charset);
787 ftb->lastpos=HA_OFFSET_ERROR;
789 + if (ftb->info->s->keyinfo[ftb->keynr].senna)
795 + unsigned int rest_len;
796 + if (keynr==NO_SUCH_KEY ||
797 + !(i = info->s->keyinfo[keynr].senna)) {
798 + my_free((gptr)ftb,MYF(0));
801 + sen_index_info(i, NULL, NULL, NULL, &e, NULL, NULL, NULL, NULL, NULL, NULL);
802 + if (!(q = sen_query_open(query, query_len, sen_sel_or, SENNA_MAX_N_EXPR, e))) {
803 + my_free((gptr)ftb,MYF(0));
806 + if (rest_len = sen_query_rest(q, &rest)) {
807 + sen_log("too long query. rest(%.*s) are ignored", rest_len, rest);
809 + ftb->sir = sen_records_open(sen_rec_document, sen_rec_none, 0);
810 + sen_query_exec(i, q, ftb->sir, sen_sel_or);
811 + sen_query_close(q);
814 +#endif /* ENABLE_SENNA */
815 bzero(& ftb->no_dupes, sizeof(TREE));
820 int ft_boolean_read_next(FT_INFO *ftb, char *record)
823 + if (ftb->info->s->keyinfo[ftb->keynr].senna)
826 + MI_INFO *info=ftb->info;
827 + while (ftb->sir && sen_records_next(ftb->sir, &pos, sizeof(my_off_t), NULL)) {
828 + info->update&= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED);
830 + if (!(*info->read_record)(info,info->lastpos,record)) {
831 + info->update|= HA_STATE_AKTIV; /* Record is read */
834 + sen_log("my_errno=%d pos=%lld in ft_boolean_read_next()", my_errno, pos);
835 + if (my_errno == 127) { continue; }
838 + return HA_ERR_END_OF_FILE;
841 +#endif /* ENABLE_SENNA */
845 MI_INFO *info=ftb->info;
848 ftb->queue.first_cmp_arg=(void *)0;
856 float ft_boolean_find_relevance(FT_INFO *ftb, byte *record, uint length)
859 + if (ftb->info->s->keyinfo[ftb->keynr].senna)
861 + my_off_t docid=ftb->info->lastpos;
862 + if (!ftb->sir) { return 0.0; }
863 + if (docid == HA_OFFSET_ERROR)
865 + return 1.0 * sen_records_find(ftb->sir, &docid);
868 +#endif /* ENABLE_SENNA */
871 FT_SEG_ITERATOR ftsi, ftsi2;
872 my_off_t docid=ftb->info->lastpos;
873 @@ -938,11 +1007,20 @@
874 { /* match failed ! */
881 void ft_boolean_close_search(FT_INFO *ftb)
884 + if (ftb->info->s->keyinfo[ftb->keynr].senna)
886 + sen_records_close(ftb->sir);
887 + my_free((gptr)ftb,MYF(0));
890 +#endif /* ENABLE_SENNA */
891 if (is_tree_inited(& ftb->no_dupes))
893 delete_tree(& ftb->no_dupes);
894 @@ -954,12 +1032,26 @@
896 float ft_boolean_get_relevance(FT_INFO *ftb)
899 + if (ftb->info->s->keyinfo[ftb->keynr].senna)
901 + if (!ftb->sir) { return 0.0; }
902 + return 1.0 * sen_records_curr_score(ftb->sir);
904 +#endif /* ENABLE_SENNA */
905 return ftb->root->cur_weight;
909 void ft_boolean_reinit_search(FT_INFO *ftb)
912 + if (ftb->info->s->keyinfo[ftb->keynr].senna)
914 + sen_records_rewind(ftb->sir);
917 +#endif /* ENABLE_SENNA */
918 _ftb_init_index_search(ftb);
921 diff -Ndur ../mysql-5.1.15-beta/storage/myisam/ft_nlq_search.c ./storage/myisam/ft_nlq_search.c
922 --- ../mysql-5.1.15-beta/storage/myisam/ft_nlq_search.c 2007-01-30 17:34:12.000000000 +0900
923 +++ ./storage/myisam/ft_nlq_search.c 2007-02-26 21:07:21.000000000 +0900
930 +#endif /* ENABLE_SENNA */
935 my_off_t saved_lastpos=info->lastpos;
936 struct st_mysql_ftparser *parser;
937 MYSQL_FTPARSER_PARAM *ftparser_param;
940 +#endif /* ENABLE_SENNA */
941 DBUG_ENTER("ft_init_nlq_search");
944 + if (info->s->keyinfo[keynr].senna)
946 + // sen_log("ft_init_nlq_search(%p,%d,%p,%d,%d)", info, keynr, query, query_len, presort);
947 + sir = sen_index_sel(info->s->keyinfo[keynr].senna, query, query_len);
949 + // sen_log("sen_index_search done");
955 +#endif /* ENABLE_SENNA */
957 if ((int) (keynr = _mi_check_index(info,keynr)) < 0)
960 dlist->info=aio.info;
965 +#endif /* ENABLE_SENNA */
966 tree_walk(&aio.dtree, (tree_walk_action) &walk_and_copy,
967 &dptr, left_root_right);
970 int ft_nlq_read_next(FT_INFO *handler, char *record)
972 MI_INFO *info= (MI_INFO *) handler->info;
974 + // sen_log("ft_nlq_read_next(%p,%p)", handler, record);
978 + info->update&= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED);
979 + while (sen_records_next(handler->sir, &pos, sizeof(my_off_t), NULL))
982 + if (!(*info->read_record)(info,info->lastpos,record))
984 + info->update|= HA_STATE_AKTIV; /* Record is read */
987 + sen_log("my_errno=%d pos=%lld in ft_nlq_read_next()", my_errno, pos);
988 + if (my_errno == 127) { continue; }
991 + return HA_ERR_END_OF_FILE;
993 +#endif /* ENABLE_SENNA */
995 if (++handler->curdoc >= handler->ndocs)
998 FT_DOC *docs=handler->doc;
999 my_off_t docid=handler->info->lastpos;
1001 +#ifdef ENABLE_SENNA
1002 + // sen_log("ft_nlq_find_relevance(docid=%d)", docid);
1003 +#endif /* ENABLE_SENNA */
1004 if (docid == HA_POS_ERROR)
1007 +#ifdef ENABLE_SENNA
1008 + if (handler->sir) {
1009 + // sen_log("score = %d", sen_records_find(handler->sir, &docid));
1010 + return 1.0 * sen_records_find(handler->sir, &docid);
1012 +#endif /* ENABLE_SENNA */
1014 /* Assuming docs[] is sorted by dpos... */
1016 for (a=0, b=handler->ndocs, c=(a+b)/2; b-a>1; c=(a+b)/2)
1017 @@ -352,18 +405,45 @@
1019 void ft_nlq_close_search(FT_INFO *handler)
1021 +#ifdef ENABLE_SENNA
1024 + sen_log("ft_nlq_close_search(%p)", handler);
1025 + sen_records_close(handler->sir);
1027 +#endif /* ENABLE_SENNA */
1028 my_free((gptr)handler,MYF(0));
1032 float ft_nlq_get_relevance(FT_INFO *handler)
1034 +#ifdef ENABLE_SENNA
1035 + // sen_log("ft_nlq_get_relevance(%p)", handler);
1037 + if (!handler->sir) {
1038 + if (handler->doc) {
1039 + return (float) handler->doc[handler->curdoc].weight;
1044 + return 1.0 * sen_records_curr_score(handler->sir);
1045 +#else /* ENABLE_SENNA */
1046 return (float) handler->doc[handler->curdoc].weight;
1047 +#endif /* ENABLE_SENNA */
1051 void ft_nlq_reinit_search(FT_INFO *handler)
1053 +#ifdef ENABLE_SENNA
1056 + sen_log("ft_nlq_reinit_search(%p)", handler);
1057 + sen_records_rewind(handler->sir);
1059 +#endif /* ENABLE_SENNA */
1063 diff -Ndur ../mysql-5.1.15-beta/storage/myisam/ft_update.c ./storage/myisam/ft_update.c
1064 --- ../mysql-5.1.15-beta/storage/myisam/ft_update.c 2007-01-30 17:34:37.000000000 +0900
1065 +++ ./storage/myisam/ft_update.c 2007-02-26 21:11:17.000000000 +0900
1066 @@ -117,6 +117,19 @@
1067 FT_WORD *_mi_ft_parserecord(MI_INFO *info, uint keynr, const byte *record,
1070 +#ifdef ENABLE_SENNA
1071 + if (info->s->keyinfo[keynr].senna)
1074 + if (!(wlist = (FT_WORD *) my_malloc(sizeof(FT_WORD), MYF(0)))) {
1081 +#endif /* ENABLE_SENNA */
1084 MYSQL_FTPARSER_PARAM *param;
1085 DBUG_ENTER("_mi_ft_parserecord");
1089 DBUG_RETURN(ft_linearize(&ptree, mem_root));
1093 static int _mi_ft_store(MI_INFO *info, uint keynr, byte *keybuf,
1094 @@ -187,6 +201,116 @@
1095 DBUG_RETURN(GEE_THEY_ARE_ABSOLUTELY_IDENTICAL);
1098 +#ifdef ENABLE_SENNA
1099 +#define SECTIONALIZE 0x00080000
1100 +int ft_sen_index_add(MI_INFO *info, uint keynr, const byte *record, my_off_t pos)
1102 + if (info->s->keyinfo[keynr].senna_flags & SECTIONALIZE) {
1103 + FT_SEG_ITERATOR ftsi;
1105 + unsigned int section;
1106 + sen_values *values;
1107 + _mi_ft_segiterator_init(info, keynr, record, &ftsi);
1108 + while (_mi_ft_segiterator(&ftsi)) {
1110 + if (ftsi.len > 1048576) { sen_log("ft_sen_index_add: ftsi.len=%d", ftsi.len); }
1111 + if (ftsi.len > len) { len = ftsi.len; }
1114 + if (!len) { return -1; }
1115 + _mi_ft_segiterator_init(info, keynr, record, &ftsi);
1117 + while (_mi_ft_segiterator(&ftsi)) {
1119 + values = sen_values_open();
1120 + sen_values_add(values, ftsi.pos, ftsi.len, 0);
1121 + sen_index_update(info->s->keyinfo[keynr].senna, &pos, section, NULL, values);
1122 + sen_values_close(values);
1128 + FT_SEG_ITERATOR ftsi;
1131 + _mi_ft_segiterator_init(info, keynr, record, &ftsi);
1132 + while (_mi_ft_segiterator(&ftsi)) {
1134 + if (ftsi.len > 1048576) { sen_log("ft_sen_index_add: ftsi.len=%d", ftsi.len); }
1135 + len += ftsi.len + 1;
1138 + if (!len) { return -1; }
1139 + if (!(p = buf = malloc(len))) { return -1; }
1140 + _mi_ft_segiterator_init(info, keynr, record, &ftsi);
1141 + while (_mi_ft_segiterator(&ftsi)) {
1143 + if (p != buf) { *p++ = ' '; }
1144 + memcpy(p, ftsi.pos, ftsi.len);
1148 + sen_index_upd(info->s->keyinfo[keynr].senna, &pos, NULL, 0, buf, (p - buf));
1154 +int ft_sen_index_del(MI_INFO *info, uint keynr, const byte *record, my_off_t pos)
1156 + if (info->s->keyinfo[keynr].senna_flags & SECTIONALIZE) {
1157 + FT_SEG_ITERATOR ftsi;
1159 + unsigned int section;
1160 + sen_values *values;
1161 + _mi_ft_segiterator_init(info, keynr, record, &ftsi);
1162 + while (_mi_ft_segiterator(&ftsi)) {
1164 + if (ftsi.len > 1048576) { sen_log("ft_sen_index_del: ftsi.len=%d", ftsi.len); }
1165 + if (ftsi.len > len) { len = ftsi.len; }
1168 + if (!len) { return -1; }
1169 + _mi_ft_segiterator_init(info, keynr, record, &ftsi);
1171 + while (_mi_ft_segiterator(&ftsi)) {
1173 + values = sen_values_open();
1174 + sen_values_add(values, ftsi.pos, ftsi.len, 0);
1175 + sen_index_update(info->s->keyinfo[keynr].senna, &pos, section, values, NULL);
1176 + sen_values_close(values);
1182 + FT_SEG_ITERATOR ftsi;
1185 + _mi_ft_segiterator_init(info, keynr, record, &ftsi);
1186 + while (_mi_ft_segiterator(&ftsi)) {
1188 + if (ftsi.len > 1048576) { sen_log("ft_sen_index_del: ftsi.len=%d", ftsi.len); }
1189 + len += ftsi.len + 1;
1192 + if (!len) { return -1; }
1193 + if (!(p = buf = malloc(len))) { return -1; }
1194 + _mi_ft_segiterator_init(info, keynr, record, &ftsi);
1195 + while (_mi_ft_segiterator(&ftsi)) {
1197 + if (p != buf) { *p++ = ' '; }
1198 + memcpy(p, ftsi.pos, ftsi.len);
1202 + sen_index_upd(info->s->keyinfo[keynr].senna, &pos, buf, (p - buf), NULL, 0);
1207 +#endif /* ENABLE_SENNA */
1209 /* update a document entry */
1211 @@ -200,6 +324,15 @@
1213 DBUG_ENTER("_mi_ft_update");
1215 + #ifdef ENABLE_SENNA
1216 + if (info->s->keyinfo[keynr].senna)
1218 + // sen_log("_mi_ft_update(%p,%d,%p,%p,%p,%d)", info, keynr, keybuf, oldrec, newrec, pos);
1219 + ft_sen_index_del(info, keynr, oldrec, pos);
1220 + ft_sen_index_add(info, keynr, newrec, pos);
1222 + #endif /* ENABLE_SENNA */
1224 if (!(old_word=oldlist=_mi_ft_parserecord(info, keynr, oldrec,
1225 &info->ft_memroot)) ||
1226 !(new_word=newlist=_mi_ft_parserecord(info, keynr, newrec,
1227 @@ -249,6 +382,12 @@
1228 DBUG_ENTER("_mi_ft_add");
1229 DBUG_PRINT("enter",("keynr: %d",keynr));
1231 + #ifdef ENABLE_SENNA
1232 + // sen_log("_mi_ft_add(%p,%d,%p,%p,%d)", info, keynr, keybuf, record, pos);
1233 + if (info->s->keyinfo[keynr].senna)
1234 + ft_sen_index_add(info, keynr, record, pos);
1235 + #endif /* ENABLE_SENNA */
1237 if ((wlist=_mi_ft_parserecord(info, keynr, record, &info->ft_memroot)))
1238 error=_mi_ft_store(info,keynr,keybuf,wlist,pos);
1240 @@ -268,6 +407,12 @@
1241 DBUG_ENTER("_mi_ft_del");
1242 DBUG_PRINT("enter",("keynr: %d",keynr));
1244 + #ifdef ENABLE_SENNA
1245 + // sen_log("_mi_ft_del(%p,%d,%p,%p,%d)", info, keynr, keybuf, record, pos);
1246 + if (info->s->keyinfo[keynr].senna)
1247 + ft_sen_index_del(info, keynr, record, pos);
1248 + #endif /* ENABLE_SENNA */
1250 if ((wlist=_mi_ft_parserecord(info, keynr, record, &info->ft_memroot)))
1251 error=_mi_ft_erase(info,keynr,keybuf,wlist,pos);
1253 @@ -350,3 +495,31 @@
1257 +#ifdef ENABLE_SENNA
1258 +void ft_index_truncate(MI_INFO *info)
1260 + char buf[FN_REFLEN];
1261 + MYISAM_SHARE *share= info->s;
1262 + uint i, keys= (uint) share->state.header.keys;
1263 + for (i=0 ; i < keys ; i++)
1265 + if (share->keyinfo[i].flag & HA_FULLTEXT)
1267 + if (share->keyinfo[i].senna)
1269 + sen_index_close(share->keyinfo[i].senna);
1271 + strcpy(buf, share->unique_file_name);
1272 + sprintf(buf + strlen(buf) - 3, "%03d", i);
1273 + sen_log("create index (%s)", buf);
1274 + share->keyinfo[i].senna =
1275 + (share->keyinfo[i].senna_flags & SEN_DISABLE_SENNA)
1277 + : sen_index_create(buf, sizeof(my_off_t),
1278 + share->keyinfo[i].senna_flags,
1279 + share->keyinfo[i].senna_initial_n_segments,
1284 +#endif /* ENABLE_SENNA */
1285 diff -Ndur ../mysql-5.1.15-beta/storage/myisam/fulltext.h ./storage/myisam/fulltext.h
1286 --- ../mysql-5.1.15-beta/storage/myisam/fulltext.h 2007-01-30 17:34:12.000000000 +0900
1287 +++ ./storage/myisam/fulltext.h 2007-02-26 21:07:21.000000000 +0900
1289 int _mi_ft_del(MI_INFO *, uint, byte *, const byte *, my_off_t);
1291 uint _mi_ft_convert_to_ft2(MI_INFO *, uint, uchar *);
1293 +int ft_sen_index_add(MI_INFO *info, uint keynr, const byte *record, my_off_t pos);
1294 +void ft_index_truncate(MI_INFO *info);
1295 diff -Ndur ../mysql-5.1.15-beta/storage/myisam/mi_check.c ./storage/myisam/mi_check.c
1296 --- ../mysql-5.1.15-beta/storage/myisam/mi_check.c 2007-01-30 17:34:29.000000000 +0900
1297 +++ ./storage/myisam/mi_check.c 2007-02-26 23:00:36.000000000 +0900
1298 @@ -2107,6 +2107,9 @@
1299 ulonglong key_map=share->state.key_map;
1300 DBUG_ENTER("mi_repair_by_sort");
1302 +#ifdef ENABLE_SENNA
1303 + sen_log("mi_repair_by_sort");
1304 +#endif /* ENABLE_SENNA */
1305 start_records=info->state->records;
1308 @@ -3046,6 +3049,10 @@
1309 free_root(&sort_param->wordroot, MYF(MY_MARK_BLOCKS_FREE));
1310 if ((error=sort_get_next_record(sort_param)))
1312 + #ifdef ENABLE_SENNA
1313 + if (info->s->keyinfo[sort_param->key].senna)
1314 + ft_sen_index_add(info, sort_param->key, sort_param->record, sort_param->filepos);
1315 + #endif /* ENABLE_SENNA */
1316 if (!(wptr=_mi_ft_parserecord(info,sort_param->key,sort_param->record,
1317 &sort_param->wordroot)))
1319 diff -Ndur ../mysql-5.1.15-beta/storage/myisam/mi_close.c ./storage/myisam/mi_close.c
1320 --- ../mysql-5.1.15-beta/storage/myisam/mi_close.c 2007-01-30 17:34:13.000000000 +0900
1321 +++ ./storage/myisam/mi_close.c 2007-02-26 21:07:21.000000000 +0900
1323 (long) info, (uint) share->reopen,
1324 (uint) share->tot_locks));
1326 +#ifdef ENABLE_SENNA
1327 + sen_log("closing index_file_name %s", share->index_file_name);
1328 +#endif /* ENABLE_SENNA */
1329 pthread_mutex_lock(&THR_LOCK_myisam);
1330 if (info->lock_type == F_EXTRA_LCK)
1331 info->lock_type=F_UNLCK; /* HA_EXTRA_NO_USER_CHANGE */
1333 VOID(rwlock_destroy(&share->mmap_lock));
1334 for(i=0; i<keys; i++) {
1335 VOID(rwlock_destroy(&share->key_root_lock[i]));
1337 +#ifdef ENABLE_SENNA
1338 + if (share->keyinfo[i].flag & HA_FULLTEXT)
1340 + sen_log("share->delay_key_write=%d", share->delay_key_write);
1341 + sen_log("unique_file_name %s", share->unique_file_name);
1342 + sen_log("data_file_name %s", share->data_file_name);
1343 + sen_log("index_file_name %s", share->index_file_name);
1346 + char buf[FN_REFLEN];
1347 + strncpy(buf, share->unique_file_name, FN_REFLEN - 1);
1348 + buf[FN_REFLEN - 1] = '\0';
1349 + sprintf(buf + strlen(buf) - 3, "%03d", i);
1350 + sen_log("closing (%s)", buf);
1351 + if (share->keyinfo[i].senna) {
1352 + sen_index_close(share->keyinfo[i].senna);
1356 +#endif /* ENABLE_SENNA */
1362 diff -Ndur ../mysql-5.1.15-beta/storage/myisam/mi_create.c ./storage/myisam/mi_create.c
1363 --- ../mysql-5.1.15-beta/storage/myisam/mi_create.c 2007-01-30 17:34:02.000000000 +0900
1364 +++ ./storage/myisam/mi_create.c 2007-02-26 21:07:21.000000000 +0900
1365 @@ -283,6 +283,42 @@
1367 else if (keydef->flag & HA_FULLTEXT)
1369 +#ifdef ENABLE_SENNA
1371 + char buf[FN_REFLEN];
1372 + strncpy(buf, name, FN_REFLEN - 1);
1373 + buf[FN_REFLEN - 1] = '\0';
1374 + sprintf(buf + strlen(buf), ".%03d", i);
1375 + sen_log("keydef->senna_flags=%x", keydef->senna_flags);
1376 + if (!(keydef->senna_flags & SEN_DISABLE_SENNA))
1378 + /* make index files */
1379 + sen_log("create index (%s, flags=%x initial_n_segments=%d)", buf,
1380 + keydef->senna_flags,
1381 + keydef->senna_initial_n_segments);
1382 + senna = sen_index_create(buf, sizeof(my_off_t),
1383 + keydef->senna_flags,
1384 + keydef->senna_initial_n_segments,
1386 + sen_index_close(senna);
1388 + senna = sen_index_open(buf);
1390 + int senna_flags, senna_initial_n_segments;
1391 + sen_index_info(senna, NULL, &senna_flags, &senna_initial_n_segments,
1392 + NULL, NULL, NULL, NULL, NULL, NULL, NULL);
1393 + sen_index_close(senna);
1394 + sen_index_remove(buf);
1395 + sen_log("create index (%s, flags=%x initial_n_segments=%d)", buf,
1396 + senna_flags, senna_initial_n_segments);
1397 + senna = sen_index_create(buf, sizeof(my_off_t),
1399 + senna_initial_n_segments,
1401 + sen_index_close(senna);
1404 +#endif /* ENABLE_SENNA */
1405 keydef->flag=HA_FULLTEXT | HA_PACK_KEY | HA_VAR_LENGTH_KEY;
1406 options|=HA_OPTION_PACK_KEYS; /* Using packed keys */
1408 diff -Ndur ../mysql-5.1.15-beta/storage/myisam/mi_delete_all.c ./storage/myisam/mi_delete_all.c
1409 --- ../mysql-5.1.15-beta/storage/myisam/mi_delete_all.c 2007-01-30 17:34:02.000000000 +0900
1410 +++ ./storage/myisam/mi_delete_all.c 2007-02-26 21:07:21.000000000 +0900
1412 if (_mi_mark_file_changed(info))
1415 +#ifdef ENABLE_SENNA
1416 + for (i = 0; i < share->base.keys; i++) {
1417 + sen_index *senna = share->keyinfo[i].senna;
1420 + char buf[FN_REFLEN];
1421 + sen_index_path(senna, buf, FN_REFLEN);
1422 + sen_index_close(senna);
1423 + sen_index_remove(buf);
1424 + senna = sen_index_create(buf, sizeof(my_off_t),
1425 + share->keyinfo[i].senna_flags,
1426 + share->keyinfo[i].senna_initial_n_segments,
1428 + share->keyinfo[i].senna = senna;
1431 +#endif /* ENABLE_SENNA */
1433 info->state->records=info->state->del=state->split=0;
1434 state->dellink = HA_OFFSET_ERROR;
1435 state->sortkey= (ushort) ~0;
1436 diff -Ndur ../mysql-5.1.15-beta/storage/myisam/mi_delete_table.c ./storage/myisam/mi_delete_table.c
1437 --- ../mysql-5.1.15-beta/storage/myisam/mi_delete_table.c 2007-01-30 17:33:58.000000000 +0900
1438 +++ ./storage/myisam/mi_delete_table.c 2007-02-26 21:07:21.000000000 +0900
1441 DBUG_ENTER("mi_delete_table");
1443 +#ifdef ENABLE_SENNA
1444 + sen_log("mi_delete_table(%s)", name);
1445 +#endif /* ENABLE_SENNA */
1447 check_table_is_closed(name,"delete");
1451 #endif /* USE_RAID */
1453 +#ifdef ENABLE_SENNA
1456 + for (i = 0; i < 100; i++) {
1457 + my_snprintf(from, FN_REFLEN, "%s.%03d", name, i);
1458 + sen_index_remove(from);
1461 +#endif /* ENABLE_SENNA */
1462 fn_format(from,name,"",MI_NAME_IEXT,MY_UNPACK_FILENAME|MY_APPEND_EXT);
1463 if (my_delete_with_symlink(from, MYF(MY_WME)))
1464 DBUG_RETURN(my_errno);
1465 diff -Ndur ../mysql-5.1.15-beta/storage/myisam/mi_info.c ./storage/myisam/mi_info.c
1466 --- ../mysql-5.1.15-beta/storage/myisam/mi_info.c 2007-01-30 17:34:12.000000000 +0900
1467 +++ ./storage/myisam/mi_info.c 2007-02-26 21:07:21.000000000 +0900
1469 x->mean_reclength = info->state->records ?
1470 (ulong) ((info->state->data_file_length-info->state->empty)/
1471 info->state->records) : (ulong) share->min_pack_length;
1472 +#ifdef ENABLE_SENNA
1473 + if (share->keyinfo)
1477 + x->senna_keys_size = 0;
1478 + x->senna_keys_file_size = 0;
1479 + x->senna_lexicon_size = 0;
1480 + x->senna_lexicon_file_size = 0;
1481 + x->senna_inv_seg_size = 0;
1482 + x->senna_inv_chunk_size = 0;
1484 + for (i = 0; i < share->base.keys; i++)
1486 + sen_index *senna = share->keyinfo[i].senna;
1490 + unsigned nrecords_keys, file_size_keys;
1491 + unsigned nrecords_lexicon, file_size_lexicon;
1492 + unsigned inv_seg_size, inv_chunk_size;
1494 + sen_index_info(senna, NULL, &share->keyinfo[i].senna_flags,
1495 + &share->keyinfo[i].senna_initial_n_segments, NULL,
1496 + &nrecords_keys, &file_size_keys, &nrecords_lexicon,
1497 + &file_size_lexicon, &inv_seg_size, &inv_chunk_size);
1498 + x->senna_keys_size += nrecords_keys;
1499 + x->senna_keys_file_size += file_size_keys;
1500 + x->senna_lexicon_size += nrecords_lexicon;
1501 + x->senna_lexicon_file_size += file_size_lexicon;
1502 + x->senna_inv_seg_size += inv_seg_size;
1503 + x->senna_inv_chunk_size += inv_chunk_size;
1509 + x->senna_keys_file_size = -1;
1510 + x->senna_keys_size = -1;
1511 + x->senna_lexicon_file_size = -1;
1512 + x->senna_lexicon_size = -1;
1513 + x->senna_inv_seg_size = -1;
1514 + x->senna_inv_chunk_size = -1;
1516 +#endif /* ENABLE_SENNA */
1518 if (flag & HA_STATUS_ERRKEY)
1520 diff -Ndur ../mysql-5.1.15-beta/storage/myisam/mi_open.c ./storage/myisam/mi_open.c
1521 --- ../mysql-5.1.15-beta/storage/myisam/mi_open.c 2007-01-30 17:34:03.000000000 +0900
1522 +++ ./storage/myisam/mi_open.c 2007-02-26 21:07:21.000000000 +0900
1523 @@ -356,6 +356,11 @@
1524 else if (pos->type == HA_KEYTYPE_BINARY)
1525 pos->charset= &my_charset_bin;
1527 +#ifdef ENABLE_SENNA
1528 + share->keyinfo[i].senna = NULL;
1529 + share->keyinfo[i].senna_flags = 0;
1530 + share->keyinfo[i].senna_initial_n_segments = 0;
1531 +#endif /* ENABLE_SENNA */
1532 if (share->keyinfo[i].flag & HA_SPATIAL)
1535 @@ -369,6 +374,28 @@
1537 else if (share->keyinfo[i].flag & HA_FULLTEXT)
1539 +#ifdef ENABLE_SENNA
1540 + if (!(share->keyinfo[i].senna_flags & SEN_DISABLE_SENNA))
1542 + sen_log("share->delay_key_write=%d", share->delay_key_write);
1543 + sen_log("unique_file_name %s", share->unique_file_name);
1544 + sen_log("data_file_name %s", share->data_file_name);
1545 + sen_log("index_file_name %s", share->index_file_name);
1546 + sen_log("share->keyinfo[%d].seg=%d", i, pos-FT_SEGS);
1548 + char buf[FN_REFLEN];
1549 + strncpy(buf, share->unique_file_name, FN_REFLEN - 1);
1550 + buf[FN_REFLEN - 1] = '\0';
1551 + sprintf(buf + strlen(buf) - 3, "%03d", i);
1552 + sen_log("open (%s)", buf);
1553 + share->keyinfo[i].senna = sen_index_open(buf);
1554 + sen_index_info(share->keyinfo[i].senna, NULL,
1555 + &share->keyinfo[i].senna_flags,
1556 + &share->keyinfo[i].senna_initial_n_segments,
1557 + NULL, NULL, NULL, NULL, NULL, NULL, NULL);
1560 +#endif /* ENABLE_SENNA */
1562 { /* 4.0 compatibility code, to be removed in 5.0 */
1563 share->keyinfo[i].seg=pos-FT_SEGS;
1564 diff -Ndur ../mysql-5.1.15-beta/storage/myisam/mi_rename.c ./storage/myisam/mi_rename.c
1565 --- ../mysql-5.1.15-beta/storage/myisam/mi_rename.c 2007-01-30 17:34:31.000000000 +0900
1566 +++ ./storage/myisam/mi_rename.c 2007-02-26 21:07:21.000000000 +0900
1569 #endif /* USE_RAID */
1571 +#ifdef ENABLE_SENNA
1572 + sen_log("mi_rename(%s,%s)", old_name, new_name);
1575 + for (i = 0; i < 100; i++) {
1576 + my_snprintf(from, FN_REFLEN, "%s.%03d", old_name, i);
1577 + my_snprintf(to, FN_REFLEN, "%s.%03d", new_name, i);
1578 + sen_index_rename(from, to);
1581 +#endif /* ENABLE_SENNA */
1582 fn_format(from,old_name,"",MI_NAME_IEXT,MY_UNPACK_FILENAME|MY_APPEND_EXT);
1583 fn_format(to,new_name,"",MI_NAME_IEXT,MY_UNPACK_FILENAME|MY_APPEND_EXT);
1584 if (my_rename_with_symlink(from, to, MYF(MY_WME)))
1585 diff -Ndur ../mysql-5.1.15-beta/storage/myisam/myisam_ftdump.c ./storage/myisam/myisam_ftdump.c
1586 --- ../mysql-5.1.15-beta/storage/myisam/myisam_ftdump.c 2007-01-30 17:34:03.000000000 +0900
1587 +++ ./storage/myisam/myisam_ftdump.c 2007-02-26 21:07:21.000000000 +0900
1589 struct { MI_INFO *info; } aio0, *aio=&aio0; /* for GWS_IN_USE */
1592 +#ifdef ENABLE_SENNA
1594 +#endif /* ENABLE_SENNA */
1595 if ((error= handle_options(&argc, &argv, my_long_options, get_one_option)))
1598 diff -Ndur ../mysql-5.1.15-beta/storage/myisam/myisamchk.c ./storage/myisam/myisamchk.c
1599 --- ../mysql-5.1.15-beta/storage/myisam/myisamchk.c 2007-01-30 17:34:13.000000000 +0900
1600 +++ ./storage/myisam/myisamchk.c 2007-02-26 21:07:21.000000000 +0900
1602 get_options(&argc,(char***) &argv);
1603 myisam_quick_table_bits=decode_bits;
1605 +#ifdef ENABLE_SENNA
1607 +#endif /* ENABLE_SENNA */
1610 int new_error=myisamchk(&check_param, *(argv++));
1611 @@ -1002,6 +1005,9 @@
1615 +#ifdef ENABLE_SENNA
1616 + ft_index_truncate(info);
1617 +#endif /* ENABLE_SENNA */
1618 if ((param->testflag & (T_REP_BY_SORT | T_REP_PARALLEL)) &&
1619 (mi_is_any_key_active(share->state.key_map) ||
1620 (rep_quick && !param->keys_in_use && !recreate)) &&
1621 @@ -1058,6 +1064,9 @@
1624 puts("Table had a compressed index; We must now recreate the index");
1625 +#ifdef ENABLE_SENNA
1626 + ft_index_truncate(info);
1627 +#endif /* ENABLE_SENNA */
1628 error=mi_repair_by_sort(param,info,filename,1);
1631 diff -Ndur ../mysql-5.1.15-beta/storage/myisam/myisamlog.c ./storage/myisam/myisamlog.c
1632 --- ../mysql-5.1.15-beta/storage/myisam/myisamlog.c 2007-01-30 17:34:03.000000000 +0900
1633 +++ ./storage/myisam/myisamlog.c 2007-02-26 21:07:21.000000000 +0900
1636 ulong total_count,total_error,total_recover;
1638 +#ifdef ENABLE_SENNA
1640 +#endif /* ENABLE_SENNA */
1642 log_filename=myisam_log_filename;
1643 get_options(&argc,&argv);
1644 diff -Ndur ../mysql-5.1.15-beta/storage/myisam/myisampack.c ./storage/myisam/myisampack.c
1645 --- ../mysql-5.1.15-beta/storage/myisam/myisampack.c 2007-01-30 17:34:02.000000000 +0900
1646 +++ ./storage/myisam/myisampack.c 2007-02-26 21:07:21.000000000 +0900
1648 PACK_MRG_INFO merge;
1649 char **default_argv;
1651 +#ifdef ENABLE_SENNA
1653 +#endif /* ENABLE_SENNA */
1655 load_defaults("my",load_default_groups,&argc,&argv);
1657 diff -Ndur ../mysql-5.1.15-beta/storage/myisammrg/Makefile.am ./storage/myisammrg/Makefile.am
1658 --- ../mysql-5.1.15-beta/storage/myisammrg/Makefile.am 2007-01-30 17:34:03.000000000 +0900
1659 +++ ./storage/myisammrg/Makefile.am 2007-02-26 23:01:17.000000000 +0900
1661 INCLUDES = -I$(top_srcdir)/include -I$(top_builddir)/include \
1662 -I$(top_srcdir)/regex \
1663 -I$(top_srcdir)/sql \
1664 + @SENNA_INCLUDES@ @MECAB_INCLUDES@ \