25#define EXPECT_TRUE(expr) \
29 "%s was unexpectedly false in file \"%s\" line %u", \
30 #expr, __FILE__, __LINE__); \
33#define EXPECT_FALSE(expr) \
37 "%s was unexpectedly true in file \"%s\" line %u", \
38 #expr, __FILE__, __LINE__); \
41#define EXPECT_EQ_U64(result_expr, expected_expr) \
43 uint64 _result = (result_expr); \
44 uint64 _expected = (expected_expr); \
45 if (_result != _expected) \
47 "%s yielded " UINT64_HEX_FORMAT ", expected " UINT64_HEX_FORMAT " (%s) in file \"%s\" line %u", \
48 #result_expr, _result, _expected, #expected_expr, __FILE__, __LINE__); \
75 .class_name =
"node-16-lo",
79 .class_name =
"node-16-hi",
83 .class_name =
"node-48",
87 .class_name =
"node-256",
99#define RT_VALUE_TYPE TestValueType
113 return tree->ctl->num_keys;
123 rt_radix_tree *radixtree;
132 radixtree = rt_create(dsa, tranche_id);
139 radixtree = rt_create(radixtree_ctx);
150 iter = rt_begin_iterate(radixtree);
152 rt_end_iterate(iter);
165 rt_radix_tree *radixtree;
168 int children = test_info->
nkeys;
175 radixtree = rt_create(dsa, tranche_id);
182 radixtree = rt_create(radixtree_ctx);
185 elog(
NOTICE,
"testing node %s with shift %d and %s keys",
186 test_info->
class_name, shift, asc ?
"ascending" :
"descending");
189 for (
int i = 0;
i < children;
i++)
194 keys[
i] = (
uint64) (children - 1 -
i) << shift;
201 for (
int i = 0;
i < children;
i++)
207 for (
int i = 0;
i < children;
i++)
211 value = rt_find(radixtree, keys[
i]);
219 for (
int i = 0;
i < children;
i++)
228 for (
int i = 0;
i < children;
i++)
235 for (
int i = 0;
i < children;
i++)
239 value = rt_find(radixtree, keys[
i]);
247 iter = rt_begin_iterate(radixtree);
249 for (
int i = 0;
i < children;
i++)
259 expected = keys[children - 1 -
i];
261 iterval = rt_iterate_next(iter, &iterkey);
268 rt_end_iterate(iter);
271 for (
int i = 0;
i < children;
i++)
275 for (
int i = 0;
i < children;
i++)
297 rt_radix_tree *radixtree;
302 uint64 filter = ((
uint64) (0x07 << 24) | (0xFF << 16) | 0xFF);
304 int num_keys = 100000;
312 radixtree = rt_create(dsa, tranche_id);
320 radixtree = rt_create(radixtree_ctx);
334 rt_set(radixtree,
key, &
val);
343 value = rt_find(radixtree, keys[
i]);
354 for (
uint64 i = 0;
i < num_keys - 1;
i++)
359 if (keys[
i + 1] == keys[
i] || keys[
i + 1] == keys[
i] + 1)
363 value = rt_find(radixtree, keys[
i] + 1);
385 value = rt_find(radixtree, keys[num_keys - 1] +
i);
390 iter = rt_begin_iterate(radixtree);
392 for (
int i = 0;
i < num_keys;
i++)
399 if (
i < num_keys - 1 && keys[
i + 1] == keys[
i])
403 iterval = rt_iterate_next(iter, &iterkey);
410 rt_end_iterate(iter);
420 rt_delete(radixtree,
key);
TimestampTz GetCurrentTimestamp(void)
void dsa_detach(dsa_area *area)
#define dsa_create(tranch_id)
static int pg_cmp_u64(uint64 a, uint64 b)
void LWLockRegisterTranche(int tranche_id, const char *tranche_name)
int LWLockNewTrancheId(void)
void pfree(void *pointer)
MemoryContext CurrentMemoryContext
#define AllocSetContextCreate
#define SLAB_DEFAULT_BLOCK_SIZE
#define ALLOCSET_SMALL_SIZES
uint64 pg_prng_uint64(pg_prng_state *state)
void pg_prng_seed(pg_prng_state *state, uint64 seed)
#define qsort(a, b, c, d)
MemoryContext SlabContextCreate(MemoryContext parent, const char *name, Size blockSize, Size chunkSize)
#define EXPECT_TRUE(expr)
PG_FUNCTION_INFO_V1(test_radixtree)
static uint64 rt_num_entries(rt_radix_tree *tree)
#define EXPECT_FALSE(expr)
#define EXPECT_EQ_U64(result_expr, expected_expr)
static void test_random(void)
Datum test_radixtree(PG_FUNCTION_ARGS)
static void test_empty(void)
static void test_basic(rt_node_class_test_elem *test_info, int shift, bool asc)
static int key_cmp(const void *a, const void *b)
struct rt_node_class_test_elem rt_node_class_test_elem
static rt_node_class_test_elem rt_node_class_tests[]