Naoya Murakami
null+****@clear*****
Mon May 22 05:26:03 JST 2017
Naoya Murakami 2017-05-22 05:26:03 +0900 (Mon, 22 May 2017) New Revision: de52d661c35c71a50e495d2d12a294bbd6fef989 https://github.com/groonga/groonga/commit/de52d661c35c71a50e495d2d12a294bbd6fef989 Merged caa6132: Merge pull request #696 from naoa/fix-expr-get-member-uvector Message: expr: fix a bug that non 4 bytes fixed vector column can't sequential match by specifying index of vector GitHub: #694 Added files: test/command/suite/select/filter/equal/vector_element_float.expected test/command/suite/select/filter/equal/vector_element_float.test test/command/suite/select/filter/equal/vector_element_int64.expected test/command/suite/select/filter/equal/vector_element_int64.test test/command/suite/select/filter/equal/vector_element_int8.expected test/command/suite/select/filter/equal/vector_element_int8.test test/command/suite/select/filter/equal/vector_element_reference.expected test/command/suite/select/filter/equal/vector_element_reference.test Modified files: lib/expr.c Modified: lib/expr.c (+59 -6) =================================================================== --- lib/expr.c 2017-05-19 14:02:25 +0900 (9dc1fff) +++ lib/expr.c 2017-05-22 05:26:03 +0900 (ae2dc7d) @@ -2442,13 +2442,66 @@ grn_expr_exec_get_member_vector(grn_ctx *ctx, i = GRN_UINT32_VALUE(index); if (values.header.type == GRN_UVECTOR) { - int n_elements; - grn_obj_reinit(ctx, result, DB_OBJ(column)->range, 0); - n_elements = GRN_BULK_VSIZE(&values) / sizeof(grn_id); + int n_elements = 0; + grn_obj *range; + grn_id range_id = DB_OBJ(column)->range; + grn_obj_reinit(ctx, result, range_id, 0); + if ((range = grn_ctx_at(ctx, range_id))) { + switch (range->header.type) { + case GRN_TYPE : + n_elements = GRN_BULK_VSIZE(&values) / GRN_TYPE_SIZE(DB_OBJ(range)); + break; + case GRN_TABLE_HASH_KEY : + case GRN_TABLE_PAT_KEY : + case GRN_TABLE_DAT_KEY : + case GRN_TABLE_NO_KEY : + n_elements = GRN_BULK_VSIZE(&values) / sizeof(grn_id); + break; + } + } if (n_elements > i) { - grn_id value; - value = GRN_RECORD_VALUE_AT(&values, i); - GRN_RECORD_SET(ctx, result, value); +#define GET_UVECTOR_ELEMENT_AS(type) do { \ + GRN_ ## type ## _SET(ctx, result, GRN_ ## type ## _VALUE_AT(&values, i)); \ + } while (GRN_FALSE) + switch (values.header.domain) { + case GRN_DB_BOOL : + GET_UVECTOR_ELEMENT_AS(BOOL); + break; + case GRN_DB_INT8 : + GET_UVECTOR_ELEMENT_AS(INT8); + break; + case GRN_DB_UINT8 : + GET_UVECTOR_ELEMENT_AS(UINT8); + break; + case GRN_DB_INT16 : + GET_UVECTOR_ELEMENT_AS(INT16); + break; + case GRN_DB_UINT16 : + GET_UVECTOR_ELEMENT_AS(UINT16); + break; + case GRN_DB_INT32 : + GET_UVECTOR_ELEMENT_AS(INT32); + break; + case GRN_DB_UINT32 : + GET_UVECTOR_ELEMENT_AS(UINT32); + break; + case GRN_DB_INT64 : + GET_UVECTOR_ELEMENT_AS(INT64); + break; + case GRN_DB_UINT64 : + GET_UVECTOR_ELEMENT_AS(UINT64); + break; + case GRN_DB_FLOAT : + GET_UVECTOR_ELEMENT_AS(FLOAT); + break; + case GRN_DB_TIME : + GET_UVECTOR_ELEMENT_AS(TIME); + break; + default : + GET_UVECTOR_ELEMENT_AS(RECORD); + break; + } +#undef GET_UVECTOR_ELEMENT_AS } } else { if (values.u.v.n_sections > i) { Added: test/command/suite/select/filter/equal/vector_element_float.expected (+13 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/filter/equal/vector_element_float.expected 2017-05-22 05:26:03 +0900 (1165979) @@ -0,0 +1,13 @@ +table_create Values TABLE_NO_KEY +[[0,0.0,0.0],true] +column_create Values numbers COLUMN_VECTOR Float +[[0,0.0,0.0],true] +load --table Values +[ +{"numbers": [2.1, 1.2, 3.1]}, +{"numbers": [2.2, 3.1, 4.2]}, +{"numbers": [3.1, 9.3, -1.1]} +] +[[0,0.0,0.0],3] +select Values --filter 'numbers[1] == 3.1' --output_columns 'numbers' +[[0,0.0,0.0],[[[1],[["numbers","Float"]],[[2.2,3.1,4.2]]]]] Added: test/command/suite/select/filter/equal/vector_element_float.test (+13 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/filter/equal/vector_element_float.test 2017-05-22 05:26:03 +0900 (9e17302) @@ -0,0 +1,13 @@ +table_create Values TABLE_NO_KEY +column_create Values numbers COLUMN_VECTOR Float + +load --table Values +[ +{"numbers": [2.1, 1.2, 3.1]}, +{"numbers": [2.2, 3.1, 4.2]}, +{"numbers": [3.1, 9.3, -1.1]} +] + +select Values \ + --filter 'numbers[1] == 3.1' \ + --output_columns 'numbers' Added: test/command/suite/select/filter/equal/vector_element_int64.expected (+13 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/filter/equal/vector_element_int64.expected 2017-05-22 05:26:03 +0900 (db9fbbd) @@ -0,0 +1,13 @@ +table_create Values TABLE_NO_KEY +[[0,0.0,0.0],true] +column_create Values numbers COLUMN_VECTOR Int64 +[[0,0.0,0.0],true] +load --table Values +[ +{"numbers": [2, 1, 3]}, +{"numbers": [2, 3, 4]}, +{"numbers": [3, 9, -1]} +] +[[0,0.0,0.0],3] +select Values --filter 'numbers[1] == 3' --output_columns 'numbers' +[[0,0.0,0.0],[[[1],[["numbers","Int64"]],[[2,3,4]]]]] Added: test/command/suite/select/filter/equal/vector_element_int64.test (+13 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/filter/equal/vector_element_int64.test 2017-05-22 05:26:03 +0900 (ce858b5) @@ -0,0 +1,13 @@ +table_create Values TABLE_NO_KEY +column_create Values numbers COLUMN_VECTOR Int64 + +load --table Values +[ +{"numbers": [2, 1, 3]}, +{"numbers": [2, 3, 4]}, +{"numbers": [3, 9, -1]} +] + +select Values \ + --filter 'numbers[1] == 3' \ + --output_columns 'numbers' Added: test/command/suite/select/filter/equal/vector_element_int8.expected (+13 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/filter/equal/vector_element_int8.expected 2017-05-22 05:26:03 +0900 (6da93e8) @@ -0,0 +1,13 @@ +table_create Values TABLE_NO_KEY +[[0,0.0,0.0],true] +column_create Values numbers COLUMN_VECTOR Int8 +[[0,0.0,0.0],true] +load --table Values +[ +{"numbers": [2, 1, 3]}, +{"numbers": [2, 3, 4]}, +{"numbers": [3, 9, -1]} +] +[[0,0.0,0.0],3] +select Values --filter 'numbers[1] == 3' --output_columns 'numbers' +[[0,0.0,0.0],[[[1],[["numbers","Int8"]],[[2,3,4]]]]] Added: test/command/suite/select/filter/equal/vector_element_int8.test (+13 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/filter/equal/vector_element_int8.test 2017-05-22 05:26:03 +0900 (35618cf) @@ -0,0 +1,13 @@ +table_create Values TABLE_NO_KEY +column_create Values numbers COLUMN_VECTOR Int8 + +load --table Values +[ +{"numbers": [2, 1, 3]}, +{"numbers": [2, 3, 4]}, +{"numbers": [3, 9, -1]} +] + +select Values \ + --filter 'numbers[1] == 3' \ + --output_columns 'numbers' Added: test/command/suite/select/filter/equal/vector_element_reference.expected (+15 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/filter/equal/vector_element_reference.expected 2017-05-22 05:26:03 +0900 (24b76a3) @@ -0,0 +1,15 @@ +table_create Tags TABLE_HASH_KEY ShortText +[[0,0.0,0.0],true] +table_create Values TABLE_NO_KEY +[[0,0.0,0.0],true] +column_create Values tags COLUMN_VECTOR Tags +[[0,0.0,0.0],true] +load --table Values +[ +{"tags": ["Groonga", "Mroonga", "Rroonga"]}, +{"tags": ["Mroonga", "Rroonga"]}, +{"tags": ["Rroonga", "Groonga", "Mroonga"]} +] +[[0,0.0,0.0],3] +select Values --filter 'tags[1] == "Rroonga"' --output_columns 'tags' +[[0,0.0,0.0],[[[1],[["tags","Tags"]],[["Mroonga","Rroonga"]]]]] Added: test/command/suite/select/filter/equal/vector_element_reference.test (+15 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/filter/equal/vector_element_reference.test 2017-05-22 05:26:03 +0900 (c5a6457) @@ -0,0 +1,15 @@ +table_create Tags TABLE_HASH_KEY ShortText + +table_create Values TABLE_NO_KEY +column_create Values tags COLUMN_VECTOR Tags + +load --table Values +[ +{"tags": ["Groonga", "Mroonga", "Rroonga"]}, +{"tags": ["Mroonga", "Rroonga"]}, +{"tags": ["Rroonga", "Groonga", "Mroonga"]} +] + +select Values \ + --filter 'tags[1] == "Rroonga"' \ + --output_columns 'tags' -------------- next part -------------- HTML����������������������������... Download