mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-31 19:06:14 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			83 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include "tap.h"
 | |
| #include "ut0rbt.h"
 | |
| #include "ut0new.h"
 | |
| 
 | |
| const size_t alloc_max_retries= 0;
 | |
| void os_thread_sleep(ulint) { abort(); }
 | |
| void ut_dbg_assertion_failed(const char *, const char *, unsigned)
 | |
| { abort(); }
 | |
| namespace ib { fatal_or_error::~fatal_or_error() { abort(); } }
 | |
| #ifdef UNIV_PFS_MEMORY
 | |
| PSI_memory_key mem_key_other, mem_key_std;
 | |
| PSI_memory_key ut_new_get_key_by_file(uint32_t) { return mem_key_std; }
 | |
| #endif
 | |
| 
 | |
| static const uint64_t doc_ids[]=
 | |
| {
 | |
|   103571,     104018,     106821,     108647,     109352,     109379,
 | |
|   110325,     122868,     210682130,  231275441,  234172769,  366236849,
 | |
|   526467159,  1675241735, 1675243405, 1947751899, 1949940363, 2033691953,
 | |
|   2148227299, 2256289791, 2294223591, 2367501260, 2792700091, 2792701220,
 | |
|   2817121627, 2820680352, 2821165664, 3253312130, 3404918378, 3532599429,
 | |
|   3538712078, 3539373037, 3546479309, 3566641838, 3580209634, 3580871267,
 | |
|   3693930556, 3693932734, 3693932983, 3781949558, 3839877411, 3930968983
 | |
| };
 | |
| 
 | |
| static int fts_doc_id_cmp(const void *p1, const void *p2)
 | |
| {
 | |
|   uint64_t a= *static_cast<const uint64_t*>(p1),
 | |
|     b= *static_cast<const uint64_t*>(p2);
 | |
|   return b > a ? -1 : a > b;
 | |
| }
 | |
| 
 | |
| 
 | |
| static int fts_doc_id_buggy_cmp(const void *p1, const void *p2)
 | |
| {
 | |
|   return int(*static_cast<const uint64_t*>(p1) -
 | |
|              *static_cast<const uint64_t*>(p2));
 | |
| }
 | |
| 
 | |
| typedef int (*comparator) (const void*, const void*);
 | |
| 
 | |
| static void rbt_populate(ib_rbt_t *rbt)
 | |
| {
 | |
|   ib_rbt_bound_t parent;
 | |
|   for (const uint64_t &doc_id : doc_ids)
 | |
|   {
 | |
|     if (rbt_search(rbt, &parent, &doc_id))
 | |
|       rbt_add_node(rbt, &parent, &doc_id);
 | |
|   }
 | |
| }
 | |
| 
 | |
| static void rbt_populate2(ib_rbt_t *rbt)
 | |
| {
 | |
|   for (const uint64_t &doc_id : doc_ids)
 | |
|     rbt_insert(rbt, &doc_id, &doc_id);
 | |
| }
 | |
| 
 | |
| static bool rbt_search_all(ib_rbt_t *rbt)
 | |
| {
 | |
|   ib_rbt_bound_t parent;
 | |
|   for (const uint64_t &doc_id : doc_ids)
 | |
|     if (rbt_search(rbt, &parent, &doc_id))
 | |
|       return false;
 | |
|   return true;
 | |
| }
 | |
| 
 | |
| static void rbt_test(comparator cmp, bool buggy)
 | |
| {
 | |
|   ib_rbt_t *rbt= rbt_create(sizeof(uint64_t), cmp);
 | |
|   rbt_populate(rbt);
 | |
|   ok(rbt_search_all(rbt) != buggy, "search after populate");
 | |
|   rbt_free(rbt);
 | |
|   rbt= rbt_create(sizeof(uint64_t), cmp);
 | |
|   rbt_populate2(rbt);
 | |
|   ok(rbt_search_all(rbt) != buggy, "search after populate2");
 | |
|   rbt_free(rbt);
 | |
| }
 | |
| 
 | |
| int main ()
 | |
| {
 | |
|   rbt_test(fts_doc_id_buggy_cmp, true);
 | |
|   rbt_test(fts_doc_id_cmp, false);
 | |
| }
 | 
