OSDN Git Service

Initial commit of senna-1.1.2-fast.
[ludiafuncs/senna-1.1.2-fast.git] / bindings / mysql / mysql-5.1.15-beta.senna.diff
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
4 @@ -45,6 +45,9 @@
5  /* Define to 1 if you have the <aio.h> header file. */
6  #undef HAVE_AIO_H
7  
8 +/* Define to 1 if Senna is enabled */
9 +#undef ENABLE_SENNA
10 +
11  /* Define to 1 if you have the `alarm' function. */
12  #undef HAVE_ALARM
13  
14 @@ -472,6 +475,9 @@
15  /* Define if mysql_cv_have_mbstate_t=yes */
16  #undef HAVE_MBSTATE_T
17  
18 +/* Define to 1 if libmecab is available */
19 +#undef HAVE_MECAB
20 +
21  /* Define to 1 if you have the `memcpy' function. */
22  #undef HAVE_MEMCPY
23  
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
27 @@ -698,6 +698,110 @@
28  # Types that must be checked AFTER large file support is checked
29  AC_TYPE_SIZE_T
30  
31 +# For senna
32 +AC_ARG_WITH(mecab,
33 +[  --with-mecab[=DIR]        Specify install prefix of mecab], [
34 +  if test "$withval" = "yes"; then
35 +    MECAB_PREFIX=""
36 +  else
37 +    MECAB_PREFIX="$withval"
38 +  fi
39 +], [
40 +  MECAB_PREFIX=""
41 +])
42 +
43 +MECAB_INCLUDES=
44 +MECAB_LIBS=
45 +
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`"
52 +  fi
53 +else
54 +  MECAB_CONFIG="$MECAB_PREFIX/bin/mecab-config"
55 +
56 +  if test -x "$MECAB_CONFIG"; then
57 +    MECAB_INCLUDES="`\"$MECAB_CONFIG\" --cflags`"
58 +    MECAB_LIBS="`\"$MECAB_CONFIG\" --libs`"
59 +  else
60 +    MECAB_INCLUDES="-I$MECAB_PREFIX/include"
61 +    MECAB_LIBS="-L$MECAB_PREFIX/lib"
62 +  fi
63 +fi
64
65 +_CPPFLAGS="${CPPFLAGS}"
66 +_LIBS="${LIBS}"
67 +CPPFLAGS="${CPPFLAGS} ${MECAB_INCLUDES}"
68 +LIBS="${LIBS} ${MECAB_LIBS}"
69
70 +AC_CHECK_FUNC(mecab_new, [
71 +  AC_DEFINE([HAVE_MECAB], [1], [Define to 1 if libmecab is available])
72 +  HAVE_MECAB=1
73 +], [
74 +  HAVE_MECAB=
75 +  MECAB_INCLUDES=
76 +  MECAB_LIBS=
77 +])
78 +
79 +CPPFLAGS="${_CPPFLAGS}"
80 +LIBS="${_LIBS}"
81 +
82 +AC_SUBST(MECAB_INCLUDES)
83 +AC_SUBST(MECAB_LIBS)
84 +
85 +SENNA_INCLUDES=
86 +SENNA_LIBS=
87 +
88 +AC_ARG_WITH(senna,
89 +[  --with-senna[=DIR]        Enable Senna fulltext search support], [
90 +  case "$withval" in
91 +  no) : ;;
92 +  yes|*)
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"
99 +      else 
100 +        SENNA_INCLUDES="$MECAB_INCLUDES"
101 +        SENNA_LIBS="-lsenna $MECAB_LIBS"
102 +      fi
103 +    else
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"
109 +      else
110 +        SENNA_INCLUDES="-I$SENNA_PREFIX/include $MECAB_INCLUDES"
111 +        SENNA_LIBS="-L$SENNA_PREFIX/lib -lsenna $MECAB_LIBS"
112 +      fi
113 +    fi
114 +
115 +    _CPPFLAGS="${CPPFLAGS}"
116 +    _LIBS="${LIBS}"
117 +    CPPFLAGS="${CPPFLAGS} ${SENNA_INCLUDES}"
118 +    LIBS="${LIBS} ${SENNA_LIBS}"
119
120 +    AC_CHECK_FUNC(sen_init, [
121 +      AC_DEFINE([ENABLE_SENNA], [1], [Define to 1 if Senna is enabled])
122 +    ], [
123 +      AC_MSG_ERROR([Could not find libsenna. Check your Senna installation.])
124 +    ])
125 +
126 +    CPPFLAGS="${_CPPFLAGS}"
127 +    LIBS="${_LIBS}"
128 +    ;;
129 +  esac
130 +])
131 +
132 +AC_SUBST([SENNA_INCLUDES])
133 +AC_SUBST([SENNA_LIBS])
134 +
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
141 @@ -33,6 +33,11 @@
142  #include "my_handler.h"
143  #include <mysql/plugin.h>
144  
145 +#ifdef ENABLE_SENNA
146 +#include <senna.h>
147 +#define SEN_DISABLE_SENNA      0x80000000 /* Don't use Senna fulltext search engine */
148 +#endif /* ENABLE_SENNA */
149 +
150  /*
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.
153 @@ -158,6 +163,14 @@
154    uint  reflength;
155    ulong record_offset;
156    ulong *rec_per_key;                  /* for sql optimizing */
157 +#ifdef ENABLE_SENNA
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 */
165  } MI_ISAMINFO;
166  
167  
168 @@ -197,6 +210,11 @@
169  
170    HA_KEYSEG *seg,*end;
171    struct st_mysql_ftparser *parser;     /* Fulltext [pre]parser */
172 +#ifdef ENABLE_SENNA
173 +  int senna_flags;
174 +  int senna_initial_n_segments;
175 +  sen_index *senna;
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])))
185        continue;
186  
187 +#ifdef ENABLE_SENNA
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
198 @@ -876,6 +876,9 @@
199      table->file->info(HA_STATUS_AUTO | HA_STATUS_NO_LOCK);
200      
201      close_temporary_table(thd, table, 0, 0);    // Don't free share
202 +#ifdef ENABLE_SENNA
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
211 @@ -57,6 +57,12 @@
212  };
213  
214  
215 +#ifdef ENABLE_SENNA
216 +#ifdef HAVE_ISAM
217 +#include "ha_myisam.h"                 // For isam
218 +#endif
219 +#endif /* ENABLE_SENNA */
220 +
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}
236  };
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
243  
244 +#ifdef ENABLE_SENNA
245 +  create_info->key_info=*key_info_buffer;
246 +#endif /* ENABLE_SENNA */
247    key_iterator.rewind();
248    key_number=0;
249    for (; (key=key_iterator++) ; key_number++)
250 @@ -2668,6 +2671,10 @@
251      if (key->generated)
252        key_info->flags|= HA_GENERATED_KEY;
253  
254 +#ifdef ENABLE_SENNA
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;
264  
265 +#ifdef ENABLE_SENNA
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)),
273 +                                key_name,
274 +                                 &key_create_info,
275 +                                 test(key_info->flags & HA_GENERATED_KEY),
276 +                                key_parts,
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 @@
284                                   &key_create_info,
285                                   test(key_info->flags & HA_GENERATED_KEY),
286                                  key_parts));
287 +#endif /* ENABLE_SENNA */
288      }
289    }
290    {
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
294 @@ -22,7 +22,7 @@
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@
300  WRAPLIBS=              @WRAPLIBS@
301  SUBDIRS =              share
302  libexec_PROGRAMS =     mysqld
303 @@ -40,7 +40,8 @@
304                         @pstack_libs@ \
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 \
312                         item_xmlfunc.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
316 @@ -764,6 +764,9 @@
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
321 +    KEY *key_info;
322 +  #endif /* ENABLE_SENNA */
323  } HA_CREATE_INFO;
324  
325  
326 @@ -950,12 +953,26 @@
327    */
328    Discrete_interval auto_inc_interval_for_cur_row;
329  
330 +#ifdef ENABLE_SENNA
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 */
338 +
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 */
350      {}
351    virtual ~handler(void)
352    {
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
356 @@ -454,6 +454,10 @@
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 @@
371  
372    (void) thr_setconcurrency(concurrency);      // 10 by default
373  
374 +#ifdef ENABLE_SENNA
375 +  sen_init();
376 +#endif /* ENABLE_SENNA */
377    select_thread=pthread_self();
378    select_thread_in_use=1;
379    init_ssl();
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;
385    const char *name;
386    bool generated;
387 +#ifdef ENABLE_SENNA
388 +  int senna_flags;
389 +  int senna_initial_n_segments;
390 +#endif /* ENABLE_SENNA */
391  
392 +#ifdef 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 */
406    {}
407    ~Key() {}
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])))
414        continue;
415  
416 +#ifdef ENABLE_SENNA
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
427 @@ -876,6 +876,9 @@
428      table->file->info(HA_STATUS_AUTO | HA_STATUS_NO_LOCK);
429      
430      close_temporary_table(thd, table, 0, 0);    // Don't free share
431 +#ifdef ENABLE_SENNA
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 @@
441    
442    bool escape_used;
443  
444 +#ifdef ENABLE_SENNA
445 +  int senna_flags;
446 +  int senna_initial_n_segments;
447 +  inline void senna_clear() { senna_flags=1; senna_initial_n_segments=0; }
448 +#endif /* ENABLE_SENNA */
449 +
450    st_lex();
451  
452    virtual ~st_lex()
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
456 @@ -57,6 +57,12 @@
457  };
458  
459  
460 +#ifdef ENABLE_SENNA
461 +#ifdef HAVE_ISAM
462 +#include "ha_myisam.h"                 // For isam
463 +#endif
464 +#endif /* ENABLE_SENNA */
465 +
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}
481  };
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
488  
489 +#ifdef ENABLE_SENNA
490 +  create_info->key_info=*key_info_buffer;
491 +#endif /* ENABLE_SENNA */
492    key_iterator.rewind();
493    key_number=0;
494    for (; (key=key_iterator++) ; key_number++)
495 @@ -2668,6 +2671,10 @@
496      if (key->generated)
497        key_info->flags|= HA_GENERATED_KEY;
498  
499 +#ifdef ENABLE_SENNA
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;
509  
510 +#ifdef ENABLE_SENNA
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)),
518 +                                key_name,
519 +                                 &key_create_info,
520 +                                 test(key_info->flags & HA_GENERATED_KEY),
521 +                                key_parts,
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 @@
529                                   &key_create_info,
530                                   test(key_info->flags & HA_GENERATED_KEY),
531                                  key_parts));
532 +#endif /* ENABLE_SENNA */
533      }
534    }
535    {
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
539 @@ -774,6 +774,10 @@
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
546 +%token  SENNA_SYM
547  %token  SENSITIVE_SYM                 /* FUTURE-USE */
548  %token  SEPARATOR_SYM
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
556  END_OF_INPUT
557  
558 @@ -1421,6 +1426,9 @@
559             YYABORT;
560           lex->create_list.empty();
561           lex->key_list.empty();
562 +#ifdef ENABLE_SENNA
563 +         lex->senna_clear();
564 +#endif /* ENABLE_SENNA */
565           lex->col_list.empty();
566           lex->change=NullS;
567           bzero((char*) &lex->create_info,sizeof(lex->create_info));
568 @@ -1455,8 +1463,15 @@
569               yyerror(ER(ER_SYNTAX_ERROR));
570               YYABORT;
571             }
572 +#ifdef ENABLE_SENNA
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,
579                                            lex->col_list));
580 +#endif /* ENABLE_SENNA */
581             lex->col_list.empty();
582           }
583         | CREATE DATABASE opt_if_not_exists ident
584 @@ -4287,6 +4302,9 @@
585           field_spec opt_check_constraint
586         | field_spec references
587           {
588 +#ifdef ENABLE_SENNA
589 +           Lex->senna_clear();
590 +#endif /* ENABLE_SENNA */
591             Lex->col_list.empty();              /* Alloced by sql_alloc */
592           }
593         ;
594 @@ -4300,8 +4318,15 @@
595               yyerror(ER(ER_SYNTAX_ERROR));
596               YYABORT;
597             }
598 +#ifdef ENABLE_SENNA
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,
605                                            lex->col_list));
606 +#endif /* ENABLE_SENNA */
607             lex->col_list.empty();              /* Alloced by sql_alloc */
608           }
609         | opt_constraint constraint_key_type opt_ident key_alg
610 @@ -4309,8 +4334,15 @@
611           {
612             LEX *lex=Lex;
613             const char *key_name= $3 ? $3 : $1;
614 +#ifdef ENABLE_SENNA
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,
621                                             lex->col_list));
622 +#endif /* ENABLE_SENNA */
623             lex->col_list.empty();              /* Alloced by sql_alloc */
624           }
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,
629                                             lex->col_list));
630 +#ifdef ENABLE_SENNA
631 +           lex->senna_clear();
632 +#endif /* ENABLE_SENNA */
633             lex->col_list.empty();              /* Alloced by sql_alloc */
634  
635              /* Only used for ALTER TABLE. Ignored otherwise. */
636 @@ -4332,10 +4367,16 @@
637           }
638         | constraint opt_check_constraint
639           {
640 +#ifdef ENABLE_SENNA
641 +           Lex->senna_clear();
642 +#endif /* ENABLE_SENNA */
643             Lex->col_list.empty();              /* Alloced by sql_alloc */
644           }
645         | opt_constraint check_constraint
646           {
647 +#ifdef ENABLE_SENNA
648 +           Lex->senna_clear();
649 +#endif /* ENABLE_SENNA */
650             Lex->col_list.empty();              /* Alloced by sql_alloc */
651           }
652         ;
653 @@ -4868,7 +4909,53 @@
654           {
655             $$= HA_KEY_ALG_RTREE;
656           }
657 -       | HASH_SYM      { $$= HA_KEY_ALG_HASH; };
658 +       | HASH_SYM      { $$= HA_KEY_ALG_HASH; }
659 +       | opt_senna_list { $$= HA_KEY_ALG_UNDEF; };
660 +
661 +opt_senna_list:
662 +       opt_senna_item
663 +       | opt_senna_item ',' opt_senna_list ;
664 +
665 +opt_senna_item:
666 +       SENNA_SYM {
667 +#ifdef ENABLE_SENNA
668 +         Lex->senna_flags &= ~SEN_DISABLE_SENNA;
669 +#endif /* ENABLE_SENNA */
670 +       }
671 +       | NO_SYM SENNA_SYM {
672 +#ifdef ENABLE_SENNA
673 +           Lex->senna_flags |= SEN_DISABLE_SENNA;
674 +#endif /* ENABLE_SENNA */
675 +          }
676 +       | SENNA_NORMALIZE_SYM {
677 +#ifdef ENABLE_SENNA
678 +           Lex->senna_flags |= SEN_INDEX_NORMALIZE;
679 +#endif /* ENABLE_SENNA */
680 +         }
681 +       | NO_SYM SENNA_NORMALIZE_SYM {
682 +#ifdef ENABLE_SENNA
683 +           Lex->senna_flags &= ~SEN_INDEX_NORMALIZE;
684 +#endif /* ENABLE_SENNA */
685 +          }
686 +       | SENNA_DELIMITED_SYM {
687 +#ifdef ENABLE_SENNA
688 +           Lex->senna_flags |= SEN_INDEX_DELIMITED;
689 +#endif /* ENABLE_SENNA */
690 +         }
691 +       | SENNA_NGRAM_SYM {
692 +#ifdef ENABLE_SENNA
693 +           Lex->senna_flags |= SEN_INDEX_NGRAM;
694 +#endif /* ENABLE_SENNA */
695 +         }
696 +       | ulong_num {
697 +#ifdef ENABLE_SENNA
698 +            if ($1 < 65536) {
699 +              Lex->senna_initial_n_segments=$1;
700 +           } else {
701 +             Lex->senna_flags |= $1;
702 +           }
703 +#endif /* ENABLE_SENNA */
704 +         };
705  
706  key_list:
707         key_list ',' key_part order_dir { Lex->col_list.push_back($3); }
708 @@ -4916,6 +5003,9 @@
709             YYABORT;
710           lex->create_list.empty();
711           lex->key_list.empty();
712 +#ifdef ENABLE_SENNA
713 +         lex->senna_clear();
714 +#endif /* ENABLE_SENNA */
715           lex->col_list.empty();
716            lex->select_lex.init_order();
717           lex->like_name= 0;
718 @@ -9783,6 +9873,10 @@
719         | RTREE_SYM             {}
720         | SCHEDULE_SYM          {}      
721         | SECOND_SYM            {}
722 +       | SENNA_DELIMITED_SYM   {}
723 +       | SENNA_NGRAM_SYM       {}
724 +       | SENNA_NORMALIZE_SYM   {}
725 +       | SENNA_SYM             {}
726         | SERIAL_SYM            {}
727         | SERIALIZABLE_SYM      {}
728         | SESSION_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
732 @@ -98,6 +98,10 @@
733      int  bdb_return_if_eq;
734    } handler;
735    struct st_table *table;
736 +#ifdef ENABLE_SENNA
737 +  int senna_flags;
738 +  int senna_initial_n_segments;
739 +#endif /* ENABLE_SENNA */
740  } KEY;
741  
742  
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
746 @@ -20,10 +20,11 @@
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@ \
751                          -I$(srcdir)
752  WRAPLIBS=
753  
754 -LDADD =
755 +LDADD =        @SENNA_LIBS@ @MECAB_LIBS@
756  
757  DEFS =                  @DEFS@
758  
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
762 @@ -41,6 +41,11 @@
763  #define FT_CORE
764  #include "ftdefs.h"
765  
766 +#ifdef ENABLE_SENNA
767 +#include <senna.h>
768 +#define SENNA_MAX_N_EXPR 32
769 +#endif /* ENABLE_SENNA */
770 +
771  /* search with boolean queries */
772  
773  static double _wghts[11]=
774 @@ -129,6 +134,9 @@
775    uint       keynr;
776    uchar      with_scan;
777    enum { UNINITIALIZED, READY, INDEX_SEARCH, INDEX_DONE } state;
778 +#ifdef ENABLE_SENNA
779 +  sen_records *sir;
780 +#endif /* ENABLE_SENNA */
781  } FTB;
782  
783  static int FTB_WORD_cmp(my_off_t *v, FTB_WORD *a, FTB_WORD *b)
784 @@ -522,6 +530,33 @@
785    DBUG_ASSERT(keynr==NO_SUCH_KEY || cs == info->s->keyinfo[keynr].seg->charset);
786    ftb->with_scan=0;
787    ftb->lastpos=HA_OFFSET_ERROR;
788 +#ifdef ENABLE_SENNA
789 +  if (ftb->info->s->keyinfo[ftb->keynr].senna)
790 +  {
791 +    sen_index *i;
792 +    sen_query *q;
793 +    sen_encoding e;
794 +    const char *rest;
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));
799 +      return 0;
800 +    }
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));
804 +      return 0;
805 +    }
806 +    if (rest_len = sen_query_rest(q, &rest)) {
807 +      sen_log("too long query. rest(%.*s) are ignored", rest_len, rest);
808 +    }
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);
812 +    return ftb;
813 +  }
814 +#endif /* ENABLE_SENNA */ 
815    bzero(& ftb->no_dupes, sizeof(TREE));
816    ftb->last_word= 0;
817  
818 @@ -751,6 +786,27 @@
819  
820  int ft_boolean_read_next(FT_INFO *ftb, char *record)
821  {
822 +#ifdef ENABLE_SENNA
823 +  if (ftb->info->s->keyinfo[ftb->keynr].senna)
824 +  {
825 +    my_off_t pos;
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);
829 +      info->lastpos=pos;
830 +      if (!(*info->read_record)(info,info->lastpos,record)) {
831 +        info->update|= HA_STATE_AKTIV;          /* Record is read */
832 +        return 0;
833 +      }
834 +      sen_log("my_errno=%d pos=%lld in ft_boolean_read_next()", my_errno, pos);
835 +      if (my_errno == 127) { continue; }
836 +      return my_errno;
837 +    }
838 +    return HA_ERR_END_OF_FILE;
839 +  }
840 +  else
841 +#endif /* ENABLE_SENNA */
842 + {
843    FTB_EXPR  *ftbe;
844    FTB_WORD  *ftbw;
845    MI_INFO   *info=ftb->info;
846 @@ -816,6 +872,7 @@
847  err:
848    ftb->queue.first_cmp_arg=(void *)0;
849    return my_errno;
850 + }
851  }
852  
853  
854 @@ -875,6 +932,18 @@
855  
856  float ft_boolean_find_relevance(FT_INFO *ftb, byte *record, uint length)
857  {
858 +#ifdef ENABLE_SENNA
859 +  if (ftb->info->s->keyinfo[ftb->keynr].senna)
860 +  {
861 +    my_off_t  docid=ftb->info->lastpos;
862 +    if (!ftb->sir) { return 0.0; }
863 +    if (docid == HA_OFFSET_ERROR)
864 +      return -2.0;
865 +    return 1.0 * sen_records_find(ftb->sir, &docid);
866 +  }
867 +  else
868 +#endif /* ENABLE_SENNA */
869 + {
870    FTB_EXPR *ftbe;
871    FT_SEG_ITERATOR ftsi, ftsi2;
872    my_off_t  docid=ftb->info->lastpos;
873 @@ -938,11 +1007,20 @@
874    { /* match failed ! */
875      return 0.0;
876    }
877 + }
878  }
879  
880  
881  void ft_boolean_close_search(FT_INFO *ftb)
882  {
883 +#ifdef ENABLE_SENNA
884 +  if (ftb->info->s->keyinfo[ftb->keynr].senna)
885 +  {
886 +    sen_records_close(ftb->sir);
887 +    my_free((gptr)ftb,MYF(0));
888 +    return;
889 +  }
890 +#endif /* ENABLE_SENNA */
891    if (is_tree_inited(& ftb->no_dupes))
892    {
893      delete_tree(& ftb->no_dupes);
894 @@ -954,12 +1032,26 @@
895  
896  float ft_boolean_get_relevance(FT_INFO *ftb)
897  {
898 +#ifdef ENABLE_SENNA
899 +  if (ftb->info->s->keyinfo[ftb->keynr].senna)
900 +  {
901 +    if (!ftb->sir) { return 0.0; }
902 +    return 1.0 * sen_records_curr_score(ftb->sir);
903 +  }
904 +#endif /* ENABLE_SENNA */
905    return ftb->root->cur_weight;
906  }
907  
908  
909  void ft_boolean_reinit_search(FT_INFO *ftb)
910  {
911 +#ifdef ENABLE_SENNA
912 +  if (ftb->info->s->keyinfo[ftb->keynr].senna)
913 +  {
914 +    sen_records_rewind(ftb->sir);
915 +    return;
916 +  }
917 +#endif /* ENABLE_SENNA */
918    _ftb_init_index_search(ftb);
919  }
920  
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
924 @@ -32,6 +32,9 @@
925    MI_INFO  *info;
926    int       ndocs;
927    int       curdoc;
928 +#ifdef ENABLE_SENNA
929 +  sen_records *sir;
930 +#endif /* ENABLE_SENNA */
931    FT_DOC    doc[1];
932  };
933  
934 @@ -211,8 +214,24 @@
935    my_off_t    saved_lastpos=info->lastpos;
936    struct st_mysql_ftparser *parser;
937    MYSQL_FTPARSER_PARAM *ftparser_param;
938 +#ifdef ENABLE_SENNA
939 +  sen_records *sir;
940 +#endif /* ENABLE_SENNA */
941    DBUG_ENTER("ft_init_nlq_search");
942  
943 +#ifdef ENABLE_SENNA
944 +  if (info->s->keyinfo[keynr].senna)
945 +  {
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);
948 +
949 +    // sen_log("sen_index_search done");
950 +  }
951 +  else
952 +  {
953 +    sir = NULL;
954 +  }
955 +#endif /* ENABLE_SENNA */
956  /* black magic ON */
957    if ((int) (keynr = _mi_check_index(info,keynr)) < 0)
958      DBUG_RETURN(NULL);
959 @@ -286,6 +305,9 @@
960    dlist->info=aio.info;
961    dptr=dlist->doc;
962  
963 +#ifdef ENABLE_SENNA
964 +  dlist->sir = sir;
965 +#endif /* ENABLE_SENNA */
966    tree_walk(&aio.dtree, (tree_walk_action) &walk_and_copy,
967             &dptr, left_root_right);
968  
969 @@ -303,6 +325,27 @@
970  int ft_nlq_read_next(FT_INFO *handler, char *record)
971  {
972    MI_INFO *info= (MI_INFO *) handler->info;
973 +#ifdef ENABLE_SENNA
974 +  // sen_log("ft_nlq_read_next(%p,%p)", handler, record);
975 +  if (handler->sir)
976 +  {
977 +    my_off_t pos;
978 +    info->update&= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED);
979 +    while (sen_records_next(handler->sir, &pos, sizeof(my_off_t), NULL))
980 +    {
981 +      info->lastpos=pos;
982 +      if (!(*info->read_record)(info,info->lastpos,record))
983 +      {
984 +       info->update|= HA_STATE_AKTIV;          /* Record is read */
985 +       return 0;
986 +      }
987 +      sen_log("my_errno=%d pos=%lld in ft_nlq_read_next()", my_errno, pos);
988 +      if (my_errno == 127) { continue; }
989 +      return my_errno;
990 +    }
991 +    return HA_ERR_END_OF_FILE;
992 +  }
993 +#endif /* ENABLE_SENNA */
994  
995    if (++handler->curdoc >= handler->ndocs)
996    {
997 @@ -330,9 +373,19 @@
998    FT_DOC  *docs=handler->doc;
999    my_off_t docid=handler->info->lastpos;
1000  
1001 +#ifdef ENABLE_SENNA
1002 +  // sen_log("ft_nlq_find_relevance(docid=%d)", docid);
1003 +#endif /* ENABLE_SENNA */
1004    if (docid == HA_POS_ERROR)
1005      return -5.0;
1006  
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);
1011 +  }
1012 +#endif /* ENABLE_SENNA */
1013 +
1014    /* Assuming docs[] is sorted by dpos... */
1015  
1016    for (a=0, b=handler->ndocs, c=(a+b)/2; b-a>1; c=(a+b)/2)
1017 @@ -352,18 +405,45 @@
1018  
1019  void ft_nlq_close_search(FT_INFO *handler)
1020  {
1021 +#ifdef ENABLE_SENNA
1022 +  if (handler->sir)
1023 +  {
1024 +    sen_log("ft_nlq_close_search(%p)", handler);
1025 +    sen_records_close(handler->sir);
1026 +  }
1027 +#endif /* ENABLE_SENNA */
1028    my_free((gptr)handler,MYF(0));
1029  }
1030  
1031  
1032  float ft_nlq_get_relevance(FT_INFO *handler)
1033  {
1034 +#ifdef ENABLE_SENNA
1035 +  // sen_log("ft_nlq_get_relevance(%p)", handler);
1036 +
1037 +  if (!handler->sir) {
1038 +    if (handler->doc) {
1039 +      return (float) handler->doc[handler->curdoc].weight;
1040 +    }
1041 +    return 0.0; 
1042 +  }
1043 +
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 */
1048  }
1049  
1050  
1051  void ft_nlq_reinit_search(FT_INFO *handler)
1052  {
1053 +#ifdef ENABLE_SENNA
1054 +  if (handler->sir)
1055 +  {
1056 +    sen_log("ft_nlq_reinit_search(%p)", handler);
1057 +    sen_records_rewind(handler->sir);
1058 +  }
1059 +#endif /* ENABLE_SENNA */
1060    handler->curdoc=-1;
1061  }
1062  
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,
1068                               MEM_ROOT *mem_root)
1069  {
1070 +#ifdef ENABLE_SENNA
1071 +  if (info->s->keyinfo[keynr].senna)
1072 +  {
1073 +    FT_WORD *wlist;
1074 +    if (!(wlist = (FT_WORD *) my_malloc(sizeof(FT_WORD), MYF(0)))) {
1075 +      return NULL;
1076 +    }
1077 +    wlist->pos = 0;
1078 +    return wlist;
1079 +  }
1080 +  else
1081 +#endif /* ENABLE_SENNA */
1082 + {
1083    TREE ptree;
1084    MYSQL_FTPARSER_PARAM *param;
1085    DBUG_ENTER("_mi_ft_parserecord");
1086 @@ -128,6 +141,7 @@
1087      DBUG_RETURN(NULL);
1088  
1089    DBUG_RETURN(ft_linearize(&ptree, mem_root));
1090 + }
1091  }
1092  
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);
1096  }
1097  
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)
1101 +{
1102 +  if (info->s->keyinfo[keynr].senna_flags & SECTIONALIZE) {
1103 +    FT_SEG_ITERATOR ftsi;
1104 +    uint len = 0;
1105 +    unsigned int section;
1106 +    sen_values *values;
1107 +    _mi_ft_segiterator_init(info, keynr, record, &ftsi);
1108 +    while (_mi_ft_segiterator(&ftsi)) {
1109 +      if (ftsi.pos) {
1110 +       if (ftsi.len > 1048576) { sen_log("ft_sen_index_add: ftsi.len=%d", ftsi.len); }
1111 +       if (ftsi.len > len) { len = ftsi.len; }
1112 +      }
1113 +    }
1114 +    if (!len) { return -1; }
1115 +    _mi_ft_segiterator_init(info, keynr, record, &ftsi);
1116 +    section = 1;
1117 +    while (_mi_ft_segiterator(&ftsi)) {
1118 +      if (ftsi.pos) {
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);
1123 +      }
1124 +      section++;
1125 +    }
1126 +    return 0;
1127 +  } else {
1128 +    FT_SEG_ITERATOR ftsi;
1129 +    char *buf, *p;
1130 +    uint len = 0;
1131 +    _mi_ft_segiterator_init(info, keynr, record, &ftsi);
1132 +    while (_mi_ft_segiterator(&ftsi)) {
1133 +      if (ftsi.pos) {
1134 +       if (ftsi.len > 1048576) { sen_log("ft_sen_index_add: ftsi.len=%d", ftsi.len); }
1135 +       len += ftsi.len + 1;
1136 +      }
1137 +    }
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)) {
1142 +      if (ftsi.pos) {
1143 +       if (p != buf) { *p++ = ' '; }
1144 +       memcpy(p, ftsi.pos, ftsi.len);
1145 +       p += ftsi.len;
1146 +      }
1147 +    }
1148 +    sen_index_upd(info->s->keyinfo[keynr].senna, &pos, NULL, 0, buf, (p - buf));
1149 +    free(buf);
1150 +    return 0;
1151 +  }
1152 +}
1153 +
1154 +int ft_sen_index_del(MI_INFO *info, uint keynr, const byte *record, my_off_t pos)
1155 +{
1156 +  if (info->s->keyinfo[keynr].senna_flags & SECTIONALIZE) {
1157 +    FT_SEG_ITERATOR ftsi;
1158 +    uint len = 0;
1159 +    unsigned int section;
1160 +    sen_values *values;
1161 +    _mi_ft_segiterator_init(info, keynr, record, &ftsi);
1162 +    while (_mi_ft_segiterator(&ftsi)) {
1163 +      if (ftsi.pos) {
1164 +       if (ftsi.len > 1048576) { sen_log("ft_sen_index_del: ftsi.len=%d", ftsi.len); }
1165 +       if (ftsi.len > len) { len = ftsi.len; }
1166 +      }
1167 +    }
1168 +    if (!len) { return -1; }
1169 +    _mi_ft_segiterator_init(info, keynr, record, &ftsi);
1170 +    section = 1;
1171 +    while (_mi_ft_segiterator(&ftsi)) {
1172 +      if (ftsi.pos) {
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);
1177 +      }
1178 +      section++;
1179 +    }
1180 +    return 0;
1181 +  } else {
1182 +    FT_SEG_ITERATOR ftsi;
1183 +    char *buf, *p;
1184 +    uint len = 0;
1185 +    _mi_ft_segiterator_init(info, keynr, record, &ftsi);
1186 +    while (_mi_ft_segiterator(&ftsi)) {
1187 +      if (ftsi.pos) {
1188 +       if (ftsi.len > 1048576) { sen_log("ft_sen_index_del: ftsi.len=%d", ftsi.len); }
1189 +       len += ftsi.len + 1;
1190 +      }
1191 +    }
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)) {
1196 +      if (ftsi.pos) {
1197 +       if (p != buf) { *p++ = ' '; }
1198 +       memcpy(p, ftsi.pos, ftsi.len);
1199 +       p += ftsi.len;
1200 +      }
1201 +    }
1202 +    sen_index_upd(info->s->keyinfo[keynr].senna, &pos, buf, (p - buf), NULL, 0);
1203 +    free(buf);
1204 +    return 0;
1205 +  }
1206 +}
1207 +#endif /* ENABLE_SENNA */
1208  
1209  /* update a document entry */
1210  
1211 @@ -200,6 +324,15 @@
1212    int cmp, cmp2;
1213    DBUG_ENTER("_mi_ft_update");
1214  
1215 +  #ifdef ENABLE_SENNA
1216 +    if (info->s->keyinfo[keynr].senna)
1217 +    {
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);
1221 +    }
1222 +  #endif /* ENABLE_SENNA */
1223 +
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));
1230  
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 */
1236 +
1237    if ((wlist=_mi_ft_parserecord(info, keynr, record, &info->ft_memroot)))
1238      error=_mi_ft_store(info,keynr,keybuf,wlist,pos);
1239  
1240 @@ -268,6 +407,12 @@
1241    DBUG_ENTER("_mi_ft_del");
1242    DBUG_PRINT("enter",("keynr: %d",keynr));
1243  
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 */
1249 +
1250    if ((wlist=_mi_ft_parserecord(info, keynr, record, &info->ft_memroot)))
1251      error=_mi_ft_erase(info,keynr,keybuf,wlist,pos);
1252  
1253 @@ -350,3 +495,31 @@
1254                                       SEARCH_SAME));
1255  }
1256  
1257 +#ifdef ENABLE_SENNA
1258 +void ft_index_truncate(MI_INFO *info)
1259 +{
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++)
1264 +  {
1265 +    if (share->keyinfo[i].flag & HA_FULLTEXT)
1266 +    {
1267 +      if (share->keyinfo[i].senna)
1268 +      {
1269 +       sen_index_close(share->keyinfo[i].senna);
1270 +      }
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)
1276 +       ? NULL
1277 +       : sen_index_create(buf, sizeof(my_off_t), 
1278 +                          share->keyinfo[i].senna_flags,
1279 +                          share->keyinfo[i].senna_initial_n_segments,
1280 +                          sen_enc_default);
1281 +    }
1282 +  }
1283 +}
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
1288 @@ -34,4 +34,5 @@
1289  int  _mi_ft_del(MI_INFO *, uint, byte *, const byte *, my_off_t);
1290  
1291  uint _mi_ft_convert_to_ft2(MI_INFO *, uint, uchar *);
1292 -
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");
1301  
1302 +#ifdef ENABLE_SENNA
1303 +  sen_log("mi_repair_by_sort");
1304 +#endif /* ENABLE_SENNA */
1305    start_records=info->state->records;
1306    got_error=1;
1307    new_file= -1;
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)))
1311          DBUG_RETURN(error);
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)))
1318          DBUG_RETURN(1);
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
1322 @@ -31,6 +31,9 @@
1323                       (long) info, (uint) share->reopen,
1324                        (uint) share->tot_locks));
1325  
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 */
1332 @@ -99,6 +102,29 @@
1333        VOID(rwlock_destroy(&share->mmap_lock));
1334        for(i=0; i<keys; i++) {
1335         VOID(rwlock_destroy(&share->key_root_lock[i]));
1336 +
1337 +#ifdef ENABLE_SENNA
1338 +       if (share->keyinfo[i].flag & HA_FULLTEXT)
1339 +       {
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);
1344 +
1345 +         {
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);
1353 +           }
1354 +         }
1355 +       }
1356 +#endif /* ENABLE_SENNA */
1357 +
1358 +
1359        }
1360      }
1361  #endif
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 @@
1366      }
1367      else if (keydef->flag & HA_FULLTEXT)
1368      {
1369 +#ifdef ENABLE_SENNA
1370 +      sen_index *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))
1377 +      {
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,
1385 +                                sen_enc_default);
1386 +       sen_index_close(senna);
1387 +      } else {
1388 +       senna = sen_index_open(buf);
1389 +       if (senna) {
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),
1398 +                                  senna_flags,
1399 +                                  senna_initial_n_segments,
1400 +                                  sen_enc_default);
1401 +         sen_index_close(senna);
1402 +       }
1403 +      }
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 */
1407  
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
1411 @@ -34,6 +34,24 @@
1412    if (_mi_mark_file_changed(info))
1413      goto err;
1414  
1415 +#ifdef ENABLE_SENNA
1416 +  for (i = 0; i < share->base.keys; i++) {
1417 +    sen_index *senna = share->keyinfo[i].senna;
1418 +    if (senna)
1419 +    {
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,
1427 +                              sen_enc_default);
1428 +      share->keyinfo[i].senna = senna;
1429 +    }
1430 +  }
1431 +#endif /* ENABLE_SENNA */
1432 +
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
1439 @@ -27,6 +27,9 @@
1440  #endif
1441    DBUG_ENTER("mi_delete_table");
1442  
1443 +#ifdef ENABLE_SENNA
1444 +  sen_log("mi_delete_table(%s)", name);
1445 +#endif /* ENABLE_SENNA */
1446  #ifdef EXTRA_DEBUG
1447    check_table_is_closed(name,"delete");
1448  #endif
1449 @@ -57,6 +60,15 @@
1450  #endif
1451  #endif /* USE_RAID */
1452  
1453 +#ifdef ENABLE_SENNA
1454 +  {
1455 +    int i;
1456 +    for (i = 0; i < 100; i++) {
1457 +      my_snprintf(from, FN_REFLEN, "%s.%03d", name, i);
1458 +      sen_index_remove(from);
1459 +    }
1460 +  }
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
1468 @@ -60,6 +60,51 @@
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)
1474 +    {
1475 +      int i;
1476 +
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;
1483 +
1484 +      for (i = 0; i < share->base.keys; i++)
1485 +      {
1486 +       sen_index *senna = share->keyinfo[i].senna;
1487 +
1488 +       if (senna)
1489 +       {
1490 +         unsigned nrecords_keys, file_size_keys;
1491 +         unsigned nrecords_lexicon, file_size_lexicon;
1492 +         unsigned inv_seg_size, inv_chunk_size;
1493 +
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;
1504 +       }
1505 +      }
1506 +    }
1507 +    else
1508 +    {
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;
1515 +    }
1516 +#endif /* ENABLE_SENNA */
1517    }
1518    if (flag & HA_STATUS_ERRKEY)
1519    {
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;
1526         }
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)
1533         {
1534  #ifdef HAVE_SPATIAL
1535 @@ -369,6 +374,28 @@
1536         }
1537          else if (share->keyinfo[i].flag & HA_FULLTEXT)
1538         {
1539 +#ifdef ENABLE_SENNA
1540 +         if (!(share->keyinfo[i].senna_flags & SEN_DISABLE_SENNA))
1541 +         {
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);
1547 +           {
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);
1558 +           }
1559 +         }
1560 +#endif /* ENABLE_SENNA */
1561            if (!fulltext_keys)
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
1567 @@ -45,6 +45,17 @@
1568  #endif
1569  #endif /* USE_RAID */
1570  
1571 +#ifdef ENABLE_SENNA
1572 +  sen_log("mi_rename(%s,%s)", old_name, new_name);
1573 +  {
1574 +    int i;
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);
1579 +    }
1580 +  }
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
1588 @@ -63,6 +63,9 @@
1589    struct { MI_INFO *info; } aio0, *aio=&aio0; /* for GWS_IN_USE */
1590  
1591    MY_INIT(argv[0]);
1592 +#ifdef ENABLE_SENNA
1593 +  sen_init();
1594 +#endif /* ENABLE_SENNA */
1595    if ((error= handle_options(&argc, &argv, my_long_options, get_one_option)))
1596      exit(error);
1597    if (count || dump)
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
1601 @@ -93,6 +93,9 @@
1602    get_options(&argc,(char***) &argv);
1603    myisam_quick_table_bits=decode_bits;
1604    error=0;
1605 +#ifdef ENABLE_SENNA
1606 +  sen_init();
1607 +#endif /* ENABLE_SENNA */
1608    while (--argc >= 0)
1609    {
1610      int new_error=myisamchk(&check_param, *(argv++));
1611 @@ -1002,6 +1005,9 @@
1612        }
1613        if (!error)
1614        {
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 @@
1622           {
1623             if (param->verbose)
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);
1629           }
1630         }
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
1634 @@ -84,6 +84,9 @@
1635    int error,i,first;
1636    ulong total_count,total_error,total_recover;
1637    MY_INIT(argv[0]);
1638 +#ifdef ENABLE_SENNA
1639 +  sen_init();
1640 +#endif /* ENABLE_SENNA */
1641  
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
1647 @@ -207,6 +207,9 @@
1648    PACK_MRG_INFO merge;
1649    char **default_argv;
1650    MY_INIT(argv[0]);
1651 +#ifdef ENABLE_SENNA
1652 +  sen_init();
1653 +#endif /* ENABLE_SENNA */
1654  
1655    load_defaults("my",load_default_groups,&argc,&argv);
1656    default_argv= 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
1660 @@ -20,6 +20,7 @@
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@ \
1665                          -I$(srcdir)
1666  WRAPLIBS=
1667