/* Calculates key page total MBR = MBR(key1) + MBR(key2) + ... */ int rtree_page_mbr(MI_INFO *info, HA_KEYSEG *keyseg, uchar *page_buf, uchar *c, uint key_length) { uint inc = 0; uint k_len = key_length; uint nod_flag = mi_test_if_nod(page_buf); uchar *k; uchar *last = rt_PAGE_END(page_buf); for (; (int)key_length > 0; keyseg += 2) { key_length -= keyseg->length * 2; /* Handle NULL part */ if (keyseg->null_bit) { return 1; } k = rt_PAGE_FIRST_KEY(page_buf, nod_flag); switch ((enum ha_base_keytype) keyseg->type) { case HA_KEYTYPE_INT8: RT_PAGE_MBR_KORR(int8, mi_sint1korr, mi_int1store, 1); break; case HA_KEYTYPE_BINARY: RT_PAGE_MBR_KORR(uint8, mi_uint1korr, mi_int1store, 1); break; case HA_KEYTYPE_SHORT_INT: RT_PAGE_MBR_KORR(int16, mi_sint2korr, mi_int2store, 2); break; case HA_KEYTYPE_USHORT_INT: RT_PAGE_MBR_KORR(uint16, mi_uint2korr, mi_int2store, 2); break; case HA_KEYTYPE_INT24: RT_PAGE_MBR_KORR(int32, mi_sint3korr, mi_int3store, 3); break; case HA_KEYTYPE_UINT24: RT_PAGE_MBR_KORR(uint32, mi_uint3korr, mi_int3store, 3); break; case HA_KEYTYPE_LONG_INT: RT_PAGE_MBR_KORR(int32, mi_sint4korr, mi_int4store, 4); break; case HA_KEYTYPE_ULONG_INT: RT_PAGE_MBR_KORR(uint32, mi_uint4korr, mi_int4store, 4); break; #ifdef HAVE_LONG_LONG case HA_KEYTYPE_LONGLONG: RT_PAGE_MBR_KORR(longlong, mi_sint8korr, mi_int8store, 8); break; case HA_KEYTYPE_ULONGLONG: RT_PAGE_MBR_KORR(ulonglong, mi_uint8korr, mi_int8store, 8); break; #endif case HA_KEYTYPE_FLOAT: RT_PAGE_MBR_GET(float, mi_float4get, mi_float4store, 4); break; case HA_KEYTYPE_DOUBLE: RT_PAGE_MBR_GET(double, mi_float8get, mi_float8store, 8); break; case HA_KEYTYPE_END: return 0; default: return 1; } } return 0; }
/* Calculates key page total MBR= MBR(key1) + MBR(key2) + ... Stores into *to. */ int maria_rtree_page_mbr(const HA_KEYSEG *keyseg, MARIA_PAGE *page, uchar *to, uint key_length) { MARIA_HA *info= page->info; MARIA_SHARE *share= info->s; uint inc= 0; uint k_len= key_length; uint nod_flag= page->node; const uchar *k; const uchar *last= rt_PAGE_END(page); for (; (int)key_length > 0; keyseg += 2) { key_length -= keyseg->length * 2; /* Handle NULL part */ if (keyseg->null_bit) { return 1; } k= rt_PAGE_FIRST_KEY(share, page->buff, nod_flag); switch ((enum ha_base_keytype) keyseg->type) { case HA_KEYTYPE_INT8: RT_PAGE_MBR_KORR(share, int8, mi_sint1korr, mi_int1store, 1, to); break; case HA_KEYTYPE_BINARY: RT_PAGE_MBR_KORR(share, uint8, mi_uint1korr, mi_int1store, 1, to); break; case HA_KEYTYPE_SHORT_INT: RT_PAGE_MBR_KORR(share, int16, mi_sint2korr, mi_int2store, 2, to); break; case HA_KEYTYPE_USHORT_INT: RT_PAGE_MBR_KORR(share, uint16, mi_uint2korr, mi_int2store, 2, to); break; case HA_KEYTYPE_INT24: RT_PAGE_MBR_KORR(share, int32, mi_sint3korr, mi_int3store, 3, to); break; case HA_KEYTYPE_UINT24: RT_PAGE_MBR_KORR(share, uint32, mi_uint3korr, mi_int3store, 3, to); break; case HA_KEYTYPE_LONG_INT: RT_PAGE_MBR_KORR(share, int32, mi_sint4korr, mi_int4store, 4, to); break; case HA_KEYTYPE_ULONG_INT: RT_PAGE_MBR_KORR(share, uint32, mi_uint4korr, mi_int4store, 4, to); break; #ifdef HAVE_LONG_LONG case HA_KEYTYPE_LONGLONG: RT_PAGE_MBR_KORR(share, longlong, mi_sint8korr, mi_int8store, 8, to); break; case HA_KEYTYPE_ULONGLONG: RT_PAGE_MBR_KORR(share, ulonglong, mi_uint8korr, mi_int8store, 8, to); break; #endif case HA_KEYTYPE_FLOAT: RT_PAGE_MBR_GET(share, float, mi_float4get, mi_float4store, 4, to); break; case HA_KEYTYPE_DOUBLE: RT_PAGE_MBR_GET(share, double, mi_float8get, mi_float8store, 8, to); break; case HA_KEYTYPE_END: return 0; default: return 1; } } return 0; }