null+****@clear*****
null+****@clear*****
2010年 11月 18日 (木) 17:55:54 JST
Tetsuro IKEDA 2010-11-18 08:55:54 +0000 (Thu, 18 Nov 2010) New Revision: d002fdcef001f30fae4973e33c57d53112a65d50 Log: hash index can be defined for _id virtual column. Modified files: ha_mroonga.cc test/sql/r/create_table.result test/sql/t/create_table.test Modified: ha_mroonga.cc (+20 -4) =================================================================== --- ha_mroonga.cc 2010-11-18 08:16:56 +0000 (e2e48db) +++ ha_mroonga.cc 2010-11-18 08:55:54 +0000 (bd699d7) @@ -784,8 +784,11 @@ int ha_mroonga::create(const char *name, TABLE *table, HA_CREATE_INFO *info) const char *col_name = field->field_name; int col_name_size = strlen(col_name); if (strncmp(MRN_ID_COL_NAME, col_name, col_name_size) == 0) { - GRN_LOG(ctx, GRN_LOG_ERROR, "_id cannot be used for index"); - my_message(ER_CANT_CREATE_TABLE, "_id cannot be used for index", MYF(0)); + if (key_info.algorithm == HA_KEY_ALG_HASH) { + continue; // hash index is ok + } + GRN_LOG(ctx, GRN_LOG_ERROR, "only hash index can be defined for _id"); + my_message(ER_CANT_CREATE_TABLE, "only hash index can be defined for _id", MYF(0)); DBUG_RETURN(ER_CANT_CREATE_TABLE); } if (strncmp(MRN_SCORE_COL_NAME, col_name, col_name_size) == 0) { @@ -844,16 +847,23 @@ int ha_mroonga::create(const char *name, TABLE *table, HA_CREATE_INFO *info) DBUG_RETURN(ER_NOT_SUPPORTED_YET); } Field *pkey_field = key_info.key_part[0].field; + const char *col_name = pkey_field->field_name; + int col_name_size = strlen(col_name); + bool is_id = (strncmp(MRN_ID_COL_NAME, col_name, col_name_size) == 0); int mysql_field_type = pkey_field->type(); grn_builtin_type gtype = mrn_get_type(ctx, mysql_field_type); pkey_type = grn_ctx_at(ctx, gtype); // default algorithm is BTREE ==> PAT - if (key_info.algorithm == HA_KEY_ALG_HASH) { + if (!is_id && key_info.algorithm == HA_KEY_ALG_HASH) { tbl_flags |= GRN_OBJ_TABLE_HASH_KEY; - } else { + } else if (!is_id) { tbl_flags |= GRN_OBJ_TABLE_PAT_KEY; + } else { + // for _id + tbl_flags |= GRN_OBJ_TABLE_NO_KEY; + pkey_type = NULL; } } else { @@ -927,6 +937,12 @@ int ha_mroonga::create(const char *name, TABLE *table, HA_CREATE_INFO *info) Field *field = key_info.key_part[0].field; const char *col_name = field->field_name; int col_name_size = strlen(col_name); + + if (strncmp(MRN_ID_COL_NAME, col_name, col_name_size) == 0) { + // skipping _id virtual column + continue; + } + col_obj = grn_obj_column(ctx, tbl_obj, col_name, col_name_size); int mysql_field_type = field->type(); grn_builtin_type gtype = mrn_get_type(ctx, mysql_field_type); Modified: test/sql/r/create_table.result (+13 -1) =================================================================== --- test/sql/r/create_table.result 2010-11-18 08:16:56 +0000 (3a377cb) +++ test/sql/r/create_table.result 2010-11-18 08:55:54 +0000 (23a6bec) @@ -167,7 +167,19 @@ ERROR HY000: _id must be numeric data type create table t1 (c1 int, `_score` int) engine = groonga; ERROR HY000: _score must be float or double create table t1 (c1 int, `_id` int, index(`_id`)) engine = groonga; -ERROR HY000: _id cannot be used for index +ERROR HY000: only hash index can be defined for _id create table t1 (c1 int, `_score` double, index(`_score`)) engine = groonga; ERROR HY000: _score cannot be used for index +create table t1 (_id int, c1 int, primary key (_id)); +ERROR HY000: only hash index can be defined for _id +create table t1 (_id int, c1 int, primary key (_id) using hash); +drop table t1; +create table t1 (_id int, c1 int, unique key (_id)); +ERROR HY000: only hash index can be defined for _id +create table t1 (_id int, c1 int, unique key (_id) using hash); +drop table t1; +create table t1 (_id int, c1 int, key (_id)); +ERROR HY000: only hash index can be defined for _id +create table t1 (_id int, c1 int, key (_id) using hash); +drop table t1; uninstall plugin groonga; Modified: test/sql/t/create_table.test (+14 -0) =================================================================== --- test/sql/t/create_table.test 2010-11-18 08:16:56 +0000 (422dac5) +++ test/sql/t/create_table.test 2010-11-18 08:55:54 +0000 (bc8c388) @@ -137,6 +137,20 @@ create table t1 (c1 int, `_id` int, index(`_id`)) engine = groonga; --error 1005 create table t1 (c1 int, `_score` double, index(`_score`)) engine = groonga; +# index for _id +--error 1005 +create table t1 (_id int, c1 int, primary key (_id)); +create table t1 (_id int, c1 int, primary key (_id) using hash); +drop table t1; +--error 1005 +create table t1 (_id int, c1 int, unique key (_id)); +create table t1 (_id int, c1 int, unique key (_id) using hash); +drop table t1; +--error 1005 +create table t1 (_id int, c1 int, key (_id)); +create table t1 (_id int, c1 int, key (_id) using hash); +drop table t1; + --disable_warnings uninstall plugin groonga; --enable_warnings