From ikdttr @ gmail.com Thu Aug 30 13:37:57 2007 From: ikdttr @ gmail.com (Tetsuro IKEDA) Date: Thu, 30 Aug 2007 13:37:57 +0900 Subject: [tritonn-commit] test Message-ID: test From svnnotify @ sourceforge.jp Fri Aug 31 22:55:07 2007 From: svnnotify @ sourceforge.jp (svnnotify @ sourceforge.jp) Date: Fri, 31 Aug 2007 22:55:07 +0900 Subject: [tritonn-commit] [svn] [12] added full implementation for snippet native sql function. Message-ID: <1188568507.598339.30988.nullmailer@users.sourceforge.jp> Revision: 12 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=tritonn&view=rev&rev=12 Author: mir Date: 2007-08-31 22:55:07 +0900 (Fri, 31 Aug 2007) Log Message: ----------- added full implementation for snippet native sql function. added test codes for snippet native sql function. Modified Paths: -------------- mysql-5.0.45-tritonn-1.0.5/mysql-test/suite/senna/r/senna_snippet.result mysql-5.0.45-tritonn-1.0.5/mysql-test/suite/senna/t/senna_snippet.test mysql-5.0.45-tritonn-1.0.5/sql/item_strfunc.cc Modified: mysql-5.0.45-tritonn-1.0.5/mysql-test/suite/senna/r/senna_snippet.result =================================================================== --- mysql-5.0.45-tritonn-1.0.5/mysql-test/suite/senna/r/senna_snippet.result 2007-08-30 04:15:06 UTC (rev 11) +++ mysql-5.0.45-tritonn-1.0.5/mysql-test/suite/senna/r/senna_snippet.result 2007-08-31 13:55:07 UTC (rev 12) @@ -11,7 +11,7 @@ 今日は東京 >>> 明日は SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 45, 1, 0, "... "," ...", "東京", "", ""); SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 45, 1, 0, "... "," ...", "東京", "", "") -... 今日は東京 >>> 明日は埼玉 ... +... 今日は東京 >>> 明日は埼玉に行き ... CREATE TABLE t1 (c1 CHAR(100)) DEFAULT CHARSET utf8; INSERT INTO t1 VALUES("今日は東京 >>> 明日は埼玉に行きます。"); SELECT SNIPPET(c1, 30, 1, 0, "","", "東京", "", "") FROM t1; @@ -25,7 +25,7 @@ 今日は東京 >>> 明日は SELECT SNIPPET(c1, 45, 1, 0, "... "," ...", "東京", "", "") FROM t1; SNIPPET(c1, 45, 1, 0, "... "," ...", "東京", "", "") -... 今日は東京 >>> 明日は埼玉 ... +... 今日は東京 >>> 明日は埼玉に行き ... DROP TABLE t1; CREATE TABLE t1 (c1 VARCHAR(100)) DEFAULT CHARSET utf8; INSERT INTO t1 VALUES("今日は東京 >>> 明日は埼玉に行きます。"); @@ -40,7 +40,7 @@ 今日は東京 >>> 明日は SELECT SNIPPET(c1, 45, 1, 0, "... "," ...", "東京", "", "") FROM t1; SNIPPET(c1, 45, 1, 0, "... "," ...", "東京", "", "") -... 今日は東京 >>> 明日は埼玉 ... +... 今日は東京 >>> 明日は埼玉に行き ... DROP TABLE t1; CREATE TABLE t1 (c1 TEXT) DEFAULT CHARSET utf8; INSERT INTO t1 VALUES("今日は東京 >>> 明日は埼玉に行きます。"); @@ -55,7 +55,7 @@ 今日は東京 >>> 明日は SELECT SNIPPET(c1, 45, 1, 0, "... "," ...", "東京", "", "") FROM t1; SNIPPET(c1, 45, 1, 0, "... "," ...", "東京", "", "") -... 今日は東京 >>> 明日は埼玉 ... +... 今日は東京 >>> 明日は埼玉に行き ... DROP TABLE t1; CREATE TABLE t1 (c1 TEXT) DEFAULT CHARSET utf8; INSERT INTO t1 VALUES("今日は東京 >>> 明日は埼玉に行きます。"); @@ -65,3 +65,48 @@ SNIPPET(c1, 30, 1, 0, "","", ?, "", "") 今日は東京 >>> 明日は DROP TABLE t1; +SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", ""), +SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", ""); +SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", "") SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", "") +今日は東京 >>> 明日は 今日は東京 >>> 明日は +SELECT SNIPPET(SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", ""), +30, 1, 0, "","", "東京", "", ""); +SNIPPET(SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", ""), +30, 1, 0, "","", "東京", "", "") +lass='word'>東京 >>> +SELECT SNIPPET(null, 30, 1, 0, "","", "東京", "", ""); +SNIPPET(null, 30, 1, 0, "","", "東京", "", "") +NULL +SELECT SNIPPET(null, null, null, null, null, null, null, null, null); +SNIPPET(null, null, null, null, null, null, null, null, null) +NULL +SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", ""); +SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "") + +SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", "", ""); +SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", "", "") + +SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", "", "埼玉", ""); +SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", "", "埼玉", "") + +SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", "", "埼玉", "", "", ""); +SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", "", "埼玉", "", "", "") + +SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 0, 1, 0, "","", "東京", "", "", ""); +SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 0, 1, 0, "","", "東京", "", "", "") + +SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", -10, 1, 0, "","", "東京", "", "", ""); +SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", -10, 1, 0, "","", "東京", "", "", "") + +SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 0, 0, "","", "東京", "", "", ""); +SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 0, 0, "","", "東京", "", "", "") + +SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, -10, 0, "","", "東京", "", "", ""); +SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, -10, 0, "","", "東京", "", "", "") + +SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 10, "","", "東京", "", "", ""); +SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 10, "","", "東京", "", "", "") + +SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, -30, "","", "東京", "", "", ""); +SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, -30, "","", "東京", "", "", "") + Modified: mysql-5.0.45-tritonn-1.0.5/mysql-test/suite/senna/t/senna_snippet.test =================================================================== --- mysql-5.0.45-tritonn-1.0.5/mysql-test/suite/senna/t/senna_snippet.test 2007-08-30 04:15:06 UTC (rev 11) +++ mysql-5.0.45-tritonn-1.0.5/mysql-test/suite/senna/t/senna_snippet.test 2007-08-31 13:55:07 UTC (rev 12) @@ -45,3 +45,31 @@ SET @a = "東京"; EXECUTE pstmt USING @a; DROP TABLE t1; + +# twice in one query +SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", ""), +SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", ""); + +# nested +SELECT SNIPPET(SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", ""), +30, 1, 0, "","", "東京", "", ""); + +# null +SELECT SNIPPET(null, 30, 1, 0, "","", "東京", "", ""); +SELECT SNIPPET(null, null, null, null, null, null, null, null, null); + +# invalid number of arguments +SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", ""); +SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", "", ""); +SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", "", "埼玉", ""); +SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", "", "埼玉", "", "", ""); + +# invalid value of arguments +SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 0, 1, 0, "","", "東京", "", "", ""); +SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", -10, 1, 0, "","", "東京", "", "", ""); +SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 0, 0, "","", "東京", "", "", ""); +SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, -10, 0, "","", "東京", "", "", ""); + +# this is acceptable +SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 10, "","", "東京", "", "", ""); +SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, -30, "","", "東京", "", "", ""); Modified: mysql-5.0.45-tritonn-1.0.5/sql/item_strfunc.cc =================================================================== --- mysql-5.0.45-tritonn-1.0.5/sql/item_strfunc.cc 2007-08-30 04:15:06 UTC (rev 11) +++ mysql-5.0.45-tritonn-1.0.5/sql/item_strfunc.cc 2007-08-31 13:55:07 UTC (rev 12) @@ -3402,11 +3402,10 @@ String *Item_func_senna_snippet::val_str(String *str) { - /* for arguments */ String *target, target_tmp; - uint max_snip_len; - uint max_snips; - bool html_encoding; + int max_snip_len; + int max_snips; + int html_encoding; String *start, start_tmp; String *end, end_tmp; String *keyword, keyword_tmp; @@ -3418,60 +3417,141 @@ sen_rc rc; uint nresults; uint max_tagged_len; - uint real_snip_len; - sen_snip_mapping *map; + sen_snip_mapping *mapping; char *result; uint result_len; int i; - /* checking arguments */ - if (arg_count < 9) goto err; - if (arg_count % 3 != 0) goto err; + if (str == NULL) { + SEN_LOG(sen_log_warning, "Item_func_senna_snipet::val_str(null) is called"); + goto err_null; + } + if (arg_count < 9 || arg_count % 3 != 0) { + SEN_LOG(sen_log_warning, "Incorrect number of arguments for snippet: %d", arg_count); + return &my_empty_string; + } + + for (i = 0; i < arg_count; i++) { + SEN_LOG(sen_log_warning, "snippet argument #%d is null", i+1); + if (args[i]->null_value) goto err_null; + } + target = args[0]->str_result(&target_tmp); - max_snip_len = args[1]->val_uint(); - max_snips = args[2]->val_uint(); - html_encoding = args[3]->val_bool(); + max_snip_len = args[1]->val_int(); + max_snips = args[2]->val_int(); + html_encoding = args[3]->val_int(); start = args[4]->str_result(&start_tmp); end = args[5]->str_result(&end_tmp); + if (max_snip_len <= 0) { + SEN_LOG(sen_log_warning, "snippet argument #2 must be positive value, passed %d", max_snip_len); + return &my_empty_string; + } + if (max_snips <= 0) { + SEN_LOG(sen_log_warning, "snippet argument #3 must be positive value, passed %d", max_snips); + return &my_empty_string; + } + encoding = senna_enc_type(target->charset()->csname); - real_snip_len = max_snip_len - start->length() - end->length(); - if (real_snip_len <= 0) goto err; if (html_encoding == 1) { - map = (sen_snip_mapping *) -1; + mapping = (sen_snip_mapping *) -1; } else { - map = NULL; + mapping = NULL; } - if (!(snip = sen_snip_open(encoding, SEN_SNIP_NORMALIZE, real_snip_len, - max_snips, "", 0, "", 0, map))) goto err; + SEN_LOG(sen_log_debug, "Item_func_senna_snippet::val_str => sen_snip_open: " \ + "%d, SEN_SNIP_NORMALIZE, %d, %d, \"\", 0, \"\", 0, %p", + encoding, max_snip_len, max_snips, mapping); + if (!(snip = sen_snip_open(encoding, SEN_SNIP_NORMALIZE, + max_snip_len, max_snips, "", 0, + "", 0, mapping))) { + SEN_LOG(sen_log_error, "sen_snip_open failed: snip = %p", snip); + return &my_empty_string; + } for (i = 6; i < arg_count; i+=3) { keyword = args[i]->str_result(&keyword_tmp); open_tag = args[i+1]->str_result(&open_tmp); close_tag = args[i+2]->str_result(&close_tmp); + + SEN_LOG(sen_log_debug, "Item_func_senna_snippet::val_str => sen_snip_add_cond: " \ + "%p, %p, %d, %p, %d, %p, %d", snip, keyword->ptr(), keyword->length(), + open_tag->ptr(), open_tag->length(), close_tag->ptr(), close_tag->length()); if ((rc = sen_snip_add_cond(snip, keyword->ptr(), keyword->length(), open_tag->ptr(), open_tag->length(), - close_tag->ptr(), close_tag->length()))) goto err; + close_tag->ptr(), close_tag->length()))) { + SEN_LOG(sen_log_error, "sen_snip_add_cond failed: sen_rc= %d", rc); + SEN_LOG(sen_log_debug, "Item_func_senna_snippet::val_str => sen_snip_close: " \ + "snip = %p", snip); + if ((rc = sen_snip_close(snip))) { + SEN_LOG(sen_log_error, "sen_snip_close failed: sen_rc = %d", rc); + } + return &my_empty_string; + } } + SEN_LOG(sen_log_debug, "Item_func_senna_snippet::val_str => sen_snip_exec: " \ + "%p, %p, %d, %p, %p", snip, target->ptr(), target->length(), + &nresults, &max_tagged_len); if ((rc = sen_snip_exec(snip, target->ptr(), target->length(), - &nresults, &max_tagged_len))) goto err; - - result = sql_alloc(max_tagged_len); - sen_snip_get_result(snip, 0, result, &result_len); + &nresults, &max_tagged_len))) { + SEN_LOG(sen_log_error, "sen_snip_exec failed: sen_rc= %d", rc); + SEN_LOG(sen_log_debug, "Item_func_senna_snippet::val_str => sen_snip_close: " \ + "snip = %p", snip); + if ((rc = sen_snip_close(snip))) { + SEN_LOG(sen_log_error, "sen_snip_close failed: sen_rc = %d", rc); + } + return &my_empty_string; + } + if (!(result = sql_alloc(max_tagged_len))) { + SEN_LOG(sen_log_error, "sql_alloc failed", rc); + SEN_LOG(sen_log_debug, "Item_func_senna_snippet::val_str => sen_snip_close: " \ + "snip = %p\n", snip); + if ((rc = sen_snip_close(snip))) { + SEN_LOG(sen_log_error, "sen_snip_close failed: sen_rc = %d\n", rc); + } + return &my_empty_string; + } + + SEN_LOG(sen_log_debug, "Item_func_senna_snippet::val_str => sen_snip_get_result: " \ + "%p, 0, %p, %p", snip, result, &result_len); + if ((rc = sen_snip_get_result(snip, 0, result, &result_len))) { + SEN_LOG(sen_log_error, "sen_snip_get_result failed: sen_rc= %d", rc); + SEN_LOG(sen_log_debug, "Item_func_senna_snippet::val_str => sen_snip_close: " \ + "snip = %p", snip); + if ((rc = sen_snip_close(snip))) { + SEN_LOG(sen_log_error, "sen_snip_close failed: sen_rc = %d", rc); + } + return &my_empty_string; + } + + if (result_len <= 0) { + SEN_LOG(sen_log_error, "result_len is not positive value: %d", result_len); + SEN_LOG(sen_log_debug, "Item_func_senna_snippet::val_str => sen_snip_close: " \ + "snip = %p", snip); + if ((rc = sen_snip_close(snip))) { + SEN_LOG(sen_log_error, "sen_snip_close failed: sen_rc = %d", rc); + } + return &my_empty_string; + } + str->copy(start->ptr(), start->length(), target->charset()); str->append(result, result_len, target->charset()); str->append(end->ptr(), end->length(), target->charset()); + SEN_LOG(sen_log_debug, "Item_func_senna_snippet::val_str => sen_snip_close: " \ + "snip = %p", snip); + if ((rc = sen_snip_close(snip))) { + SEN_LOG(sen_log_error, "sen_snip_close failed: sen_rc = %d", rc); + } + return str; -err: - push_warning(current_thd,MYSQL_ERROR::WARN_LEVEL_ERROR,ER_WRONG_ARGUMENTS,ER(ER_WRONG_ARGUMENTS)); +err_null: null_value= 1; return 0; }