52 #if !defined (SERVER_MODE) 53 #define pthread_mutex_init(a, b) 54 #define pthread_mutex_destroy(a) 55 #define pthread_mutex_lock(a) 0 56 #define pthread_mutex_unlock(a) 59 #define thread_sleep(a) 62 #define QFILE_CHECK_LIST_FILE_IS_CLOSED(list_id) 64 #define QFILE_DEFAULT_PAGES 4 66 #if defined (SERVER_MODE) 67 #define LS_PUT_NEXT_VPID(ptr) \ 70 OR_PUT_INT ((ptr) + QFILE_NEXT_PAGE_ID_OFFSET, NULL_PAGEID_IN_PROGRESS); \ 71 OR_PUT_SHORT ((ptr) + QFILE_NEXT_VOL_ID_OFFSET, NULL_VOLID); \ 75 #define LS_PUT_NEXT_VPID(ptr) \ 78 OR_PUT_INT ((ptr) + QFILE_NEXT_PAGE_ID_OFFSET, NULL_PAGEID); \ 79 OR_PUT_SHORT ((ptr) + QFILE_NEXT_VOL_ID_OFFSET, NULL_VOLID); \ 124 #define FIXED_SIZE_OF_POOLED_LIST_CACHE_ENTRY 4096 125 #define ADDITION_FOR_POOLED_LIST_CACHE_ENTRY offsetof(QFILE_POOLED_LIST_CACHE_ENTRY, s.entry) 127 #define POOLED_LIST_CACHE_ENTRY_FROM_LIST_CACHE_ENTRY(p) \ 128 ((QFILE_POOLED_LIST_CACHE_ENTRY *) ((char*) p - ADDITION_FOR_POOLED_LIST_CACHE_ENTRY)) 199 #if defined (CUBRID_DEBUG) 211 PAGE_PTR prev_page_p,
int tuple_length,
int offset,
212 int *tuple_page_size_p);
214 int tuple_length,
bool is_ovf_page);
216 int written_tuple_length);
224 int *tuple_length_p);
261 #if defined(SERVER_MODE) 262 static int qfile_compare_tran_id (
const void *t1,
const void *t2);
279 #if defined(SERVER_MODE) 287 #if defined(SERVER_MODE) 289 qfile_compare_cleanup_candidates (
const void *left,
const void *right,
BH_CMP_ARG ignore_arg)
294 if (left_weight < right_weight)
298 else if (left_weight == right_weight)
316 struct timeval current_time;
320 if (cleanup_count < 1)
325 if (cleanup_pages < 1)
338 gettimeofday (¤t_time,
NULL);
341 for (n = 0; n < qfile_List_cache.
n_hts; n++)
351 for (hvector = ht->
table, i = 0; i < ht->size; hvector++, i++)
353 if (*hvector !=
NULL)
356 for (hentry = *hvector; hentry !=
NULL; hentry = hentry->
next)
361 if (candidate.
qcache->last_ta_idx > 0)
369 candidate.
weight = page_ref * lru_sec * clr_cnt;
376 for (candidate_index = 0; candidate_index < bh->
element_count; candidate_index++)
380 if (qfile_List_cache.
n_entries <= cleanup_count)
382 if (qfile_List_cache.
n_pages <= cleanup_pages)
403 size_t type_list_size;
435 size_t type_list_size;
456 if (is_include_sort_list && src_list_id_p->
sort_list)
588 while (sort_list_p !=
NULL)
591 sort_list_p = sort_list_p->
next;
687 for (s = sort_list_p; s; s = s->
next)
709 if (covered_list_p ==
NULL)
714 for (s1 = covering_list_p, s2 = covered_list_p; s1 && s2; s1 = s1->
next, s2 = s2->
next)
722 if (s1 ==
NULL && s2)
748 int length1, length2;
754 pr_type_p = domain_p->
type;
767 rc = pr_type_p->
data_readval (&buf, &dbval1, domain_p, -1, is_copy,
NULL, 0);
784 rc = pr_type_p->
data_readval (&buf, &dbval2, domain_p, -1, is_copy,
NULL, 0);
792 if (length1 == 0 && length2 == 0)
794 *compare_result =
DB_EQ;
796 else if (length1 == 0)
798 *compare_result =
DB_LT;
800 else if (length2 == 0)
802 *compare_result =
DB_GT;
841 for (i = 0; i < max_count; i++)
926 for (i = 0; i <
index; i++)
964 #if defined (CUBRID_DEBUG) 990 fprintf (stdout,
"\n{ ");
993 for (i = 0; i < type_list_p->
type_cnt; i++)
999 (*(pr_type_p->readval)) (&buf, &dbval, type_list_p->
domp[
i], -1,
true,
NULL, 0);
1009 fprintf (stdout,
"VALUE_UNBOUND");
1012 if (i != type_list_p->
type_cnt - 1)
1014 fprintf (stdout,
" , ");
1020 fprintf (stdout,
" }\n");
1035 #if !defined(NDEBUG) 1047 addr.
pgptr = page_p;
1065 if (xasl_header_p ==
NULL)
1073 if (xasl_stream ==
NULL)
1143 QUERY_ID query_id,
int flag)
1147 SORT_LIST *src_sort_list_p, *dest_sort_list_p;
1148 size_t type_list_size;
1151 if (list_id_p ==
NULL)
1204 if (dest_sort_list_p ==
NULL)
1211 for (i = 0, list_id_p->
sort_list = dest_sort_list_p; i < len; i++, dest_sort_list_p = dest_sort_list_p->next)
1220 else if (sort_list_p !=
NULL)
1226 if (dest_sort_list_p ==
NULL)
1233 for (src_sort_list_p = sort_list_p, list_id_p->
sort_list = dest_sort_list_p; src_sort_list_p;
1234 src_sort_list_p = src_sort_list_p->
next, dest_sort_list_p = dest_sort_list_p->
next)
1324 if (last_page_ptr ==
NULL)
1367 addr.
pgptr = page_p;
1379 #if defined (SERVER_MODE) 1380 if (qmgr_is_query_interrupted (thread_p, list_id_p->
query_id) ==
true)
1388 if (new_page_p ==
NULL)
1436 int tuple_length,
int offset,
int *tuple_page_size_p)
1444 if (new_page_p ==
NULL)
1461 if (prev_page_p != page_p)
1471 int tuple_length,
bool is_ovf_page)
1478 if (new_page_p ==
NULL)
1483 *page_p = new_page_p;
1513 PAGE_PTR cur_page_p, new_page_p, prev_page_p;
1515 char *page_p, *tuple_p;
1516 int offset, tuple_page_size;
1518 if (list_id_p ==
NULL)
1533 page_p = (
char *) cur_page_p + list_id_p->
last_offset;
1536 memcpy (page_p, tuple, tuple_page_size);
1540 prev_page_p = cur_page_p;
1541 for (offset = tuple_page_size, tuple_p = (
char *) tuple + offset; offset < tuple_length;
1542 offset += tuple_page_size, tuple_p += tuple_page_size)
1547 if (new_page_p ==
NULL)
1549 if (prev_page_p != cur_page_p)
1558 prev_page_p = new_page_p;
1561 if (prev_page_p != cur_page_p)
1584 memcpy (tuple_p, tuple_descr_p->
item, tuple_descr_p->
item_size);
1585 #if !defined(NDEBUG) 1598 int i, tuple_value_size;
1600 for (i = 0; i < tuple_descr_p->
f_cnt; i++)
1604 tuple_p, &tuple_value_size) !=
NO_ERROR)
1608 tuple_p += tuple_value_size;
1620 int i, c, nkeys, len;
1624 nkeys = key_info_p->
nkeys;
1627 for (i = 0; i < nkeys; i++)
1631 if (sort_rec_p->
s.
offset[c] == 0)
1657 int i, tuple_value_size;
1658 INT32 ls_unbound[2] = { 0, 0 };
1663 tuple_rec1_p = tuple_descr_p->
tplrec1;
1664 tuple_rec2_p = tuple_descr_p->
tplrec2;
1669 for (i = 0; i < merge_info_p->
ls_pos_cnt; i++)
1679 src_p = (
char *) ls_unbound;
1690 src_p = (
char *) ls_unbound;
1695 memcpy (tuple_p, src_p, tuple_value_size);
1696 tuple_p += tuple_value_size;
1697 *tuple_length_p += tuple_value_size;
1706 int *tuple_length_p)
1756 if (list_id_p ==
NULL)
1764 tuple_descr_p = &(list_id_p->
tpl_descr);
1765 tuple_length = tuple_descr_p->
tpl_size;
1774 page_p = (
char *) cur_page_p + list_id_p->
last_offset;
1805 int tuple_length, tuple_value_length, tuple_value_size;
1806 char *page_p, *tuple_p;
1808 if (list_id_p ==
NULL)
1826 page_p = (
char *) cur_page_p + list_id_p->
last_offset;
1835 tuple_p += tuple_value_length;
1865 int tuple_length, tuple_int_value_size, tuple_int_value_length;
1866 int tuple_value_size, tuple_value_length;
1867 char *page_p, *tuple_p;
1869 if (list_id_p ==
NULL)
1888 return tuple_length;
1897 page_p = (
char *) cur_page_p + list_id_p->
last_offset;
1906 tuple_p += tuple_int_value_length;
1953 int tuple_value_size, tuple_value_length;
1954 char *page_p, *tuple_p;
1956 if (list_id_p ==
NULL)
1972 return tuple_length;
1981 page_p = (
char *) cur_page_p + list_id_p->
last_offset;
2035 PAGE_PTR cur_page_p, new_page_p =
NULL, prev_page_p, ovf_page_p;
2038 int offset, tuple_page_size;
2053 page_p = (
char *) cur_page_p + list_id_p->
last_offset;
2055 memcpy (page_p, tuple, tuple_page_size);
2059 prev_page_p = cur_page_p;
2062 for (offset = tuple_page_size; offset < tuple_length; offset += tuple_page_size)
2065 if (ovf_page_p ==
NULL)
2079 if (new_page_p ==
NULL)
2081 if (prev_page_p != cur_page_p)
2093 prev_page_p = new_page_p;
2096 if (prev_page_p != cur_page_p)
2127 if (new_page_p ==
NULL)
2216 if (query_id == NULL_QUERY_ID)
2221 else if (query_id >= SHRT_MAX)
2231 if (query_entry_p ==
NULL)
2246 assert (NULL_PAGEID < query_entry_p->list_id->first_vpid.pageid);
2256 list_id_p = query_entry_p->
list_id;
2300 memcpy ((page_buf_p + *page_size_p), page_p, one_page_size);
2333 int tuple_length,
align;
2339 tuple_length +=
align;
2369 memcpy (tuple_p, item_p, item_size);
2370 #if !defined(NDEBUG) 2372 memset (tuple_p + item_size, 0, align);
2397 char *lhs_tuple_p, *rhs_tuple_p;
2403 for (i = 0; i < types->
type_cnt; i++)
2438 if (next_scan_p ==
NULL)
2461 int error_code,
cmp;
2463 if (next_scan_p ==
NULL)
2487 while (error_code ==
NO_ERROR && cmp == 0);
2548 scan_result = (*advance_func) (thread_p, scan_p, side_p, last_scan_p, last_side_p, &side_file_p->
type_list);
2549 switch (scan_result)
2582 int have_lhs = 0, have_rhs = 0,
cmp;
2594 advance_func =
NULL;
2595 act_left_func =
NULL;
2596 act_right_func =
NULL;
2597 act_both_func =
NULL;
2610 distinct_or_all =
Q_ALL;
2616 if (lhs_file_p ==
NULL)
2626 lhs_scan_p = &lhs_scan_id;
2633 if (rhs_file_p ==
NULL)
2644 rhs_scan_p = &rhs_scan_id;
2648 if (dest_list_id_p ==
NULL)
2660 act_left_func =
NULL;
2661 act_right_func =
NULL;
2667 act_right_func =
NULL;
2668 act_both_func =
NULL;
2686 last_lhs_scan_p = &last_lhs_scan_id;
2693 last_rhs_scan_p = &last_rhs_scan_id;
2710 if (
qfile_advance (thread_p, advance_func, &lhs, &last_lhs, lhs_scan_p, last_lhs_scan_p, lhs_file_p,
2719 if (
qfile_advance (thread_p, advance_func, &rhs, &last_rhs, rhs_scan_p, last_rhs_scan_p, rhs_file_p,
2726 if (!have_lhs || !have_rhs)
2738 if (act_left_func && act_left_func (thread_p, dest_list_id_p, lhs.
tpl) !=
NO_ERROR)
2747 if (act_both_func && act_both_func (thread_p, dest_list_id_p, lhs.
tpl, rhs.
tpl) !=
NO_ERROR)
2757 if (act_right_func && act_right_func (thread_p, dest_list_id_p, rhs.
tpl) !=
NO_ERROR)
2767 if (act_left_func && act_left_func (thread_p, dest_list_id_p, lhs.
tpl) !=
NO_ERROR)
2772 if (
qfile_advance (thread_p, advance_func, &lhs, &last_lhs, lhs_scan_p, last_lhs_scan_p, lhs_file_p, &have_lhs) !=
2781 if (act_right_func && act_right_func (thread_p, dest_list_id_p, rhs.
tpl) !=
NO_ERROR)
2786 if (
qfile_advance (thread_p, advance_func, &rhs, &last_rhs, rhs_scan_p, last_rhs_scan_p, rhs_file_p, &have_rhs) !=
2802 if (last_lhs_scan_p)
2806 if (last_rhs_scan_p)
2823 return dest_list_id_p;
2867 for (i = 0; i < tpl_descr->
f_cnt; i++)
2878 assert (tuple_p <= tplrec->tpl + tplrec->
size);
2915 if (qp_scan !=
S_END)
2963 if (result_list_id_p ==
NULL)
2991 return result_list_id_p;
3014 if (tuple_record_p->
size == 0)
3028 tuple_record_p->
tpl = tuple;
3031 if (tuple_record_p->
tpl ==
NULL)
3036 tuple_record_p->
size = tuple_size;
3041 #if defined (CUBRID_DEBUG) 3055 fprintf (stdout,
"\n <invalid tuple list> ");
3060 fprintf (stdout,
"\n <empty tuple list> ");
3071 qfile_print_tuple (&list_id_p->
type_list, tuple_record.
tpl);
3093 int i, nkeys, length;
3098 int field_length, offset;
3107 nkeys = key_info_p->
nkeys;
3116 data = &(sort_record_p->
s.
original.body[0]);
3122 if (length <= key_record_p->area_size)
3130 for (i = 0; i < nkeys; i++)
3139 if (length <= key_record_p->area_size)
3157 data = (
char *) &sort_record_p->
s.
offset[nkeys];
3166 for (i = 0; i < nkeys; i++)
3178 length = offset + field_length;
3180 if (length <= key_record_p->area_size)
3182 sort_record_p->
s.
offset[
i] = offset;
3196 if (length <= key_record_p->area_size)
3229 char *tuple_p, *field_p;
3235 nkeys = key_info_p->
nkeys;
3238 for (i = 0; i < nkeys; i++)
3241 if (sort_record_p->
s.
offset[i] != 0)
3259 if (tuple_p ==
NULL)
3264 output_recdes_p->
data = tuple_p;
3268 tuple_p = output_recdes_p->
data;
3271 for (i = 0; i < nkeys; i++)
3275 if (sort_record_p->
s.
offset[c] == 0)
3318 scan_id_p = sort_info_p->
s_id;
3377 if (
VPID_EQ (&(sort_info_p->fixed_vpid), &vpid))
3380 page_p = sort_info_p->fixed_page;
3385 if (sort_info_p->fixed_page !=
NULL)
3399 sort_info_p->fixed_vpid = vpid;
3400 sort_info_p->fixed_page = page_p;
3419 data = page_p + key_p->
s.
original.offset;
3447 for (i = 0; i < nkeys; i++)
3467 tuple_descr_p->
sort_rec = (
void *) key_p;
3519 n = key_info_p->
nkeys;
3532 for (i = 0; i < n; i++)
3566 order = key_info_p->
key[
i].
is_desc ? -order : order;
3596 n = key_info_p->
nkeys;
3602 for (i = 0; i < n; i++)
3609 d0 = (
char *) k0 + o0;
3610 d1 = (
char *) k1 + o1;
3613 order = key_info_p->
key[
i].
is_desc ? -order : order;
3643 assert (o0 == 0 || o1 == 0);
3645 if (o0 == 0 && o1 == 0)
3691 int prorated_pages, sort_key_size, sort_key_overhead;
3693 prorated_pages = (int) list_id_p->
page_cnt;
3703 sort_key_overhead = (int) ceil (((
double) (list_id_p->
tuple_cnt * sort_key_size)) /
DB_PAGESIZE);
3715 sort_key_overhead = (
int) ceil (((
double) (list_id_p->
tuple_cnt * sort_key_size)) /
DB_PAGESIZE);
3718 return prorated_pages + sort_key_overhead;
3748 key_info_p->
nkeys = n;
3768 for (i = 0, p = list_p;
p; i++, p = p->
next)
3773 subkey = &key_info_p->
key[
i];
3774 subkey->
col = p->pos_descr.pos_no;
3775 subkey->
col_dom = p->pos_descr.dom;
3785 subkey->
sort_f = p->pos_descr.dom->type->get_data_cmpdisk_function ();
3803 for (i = 0; i < n; i++)
3806 subkey = &key_info_p->
key[
i];
3839 key_info_p->
nkeys = 0;
3854 sort_info_p->fixed_page =
NULL;
3880 if (sort_info_p->fixed_page !=
NULL)
3914 SORT_CMP_FUNC * cmp_func,
void *extra_arg,
int limit,
bool do_close)
3920 int sort_result, estimated_pages;
3924 if (srlist_id ==
NULL)
3943 info.
s_id = &s_scan_id;
3947 if (get_func ==
NULL)
3952 if (put_func ==
NULL)
3957 if (cmp_func ==
NULL)
3969 s_scan_id.
s_id = &t_scan_id;
3981 if (sort_result < 0)
4060 PAGE_PTR old_page_p, old_ovfl_page_p, prev_page_p, new_page_p, new_ovfl_page_p;
4061 VPID old_next_vpid, old_ovfl_vpid, prev_vpid, new_ovfl_vpid;
4064 if (old_page_p ==
NULL)
4070 if (new_page_p ==
NULL)
4076 *new_last_vpid_p = *new_first_vpid_p;
4080 (void) memcpy (new_page_p, old_page_p,
DB_PAGESIZE);
4083 prev_page_p = new_page_p;
4084 new_ovfl_page_p =
NULL;
4088 old_ovfl_page_p =
qmgr_get_old_page (thread_p, &old_ovfl_vpid, old_tfile_vfid_p);
4089 if (old_ovfl_page_p ==
NULL)
4096 new_ovfl_page_p =
qmgr_get_new_page (thread_p, &new_ovfl_vpid, new_tfile_vfid_p);
4098 if (new_ovfl_page_p ==
NULL)
4106 (void) memcpy (new_ovfl_page_p, old_ovfl_page_p,
DB_PAGESIZE);
4114 prev_page_p = new_ovfl_page_p;
4117 if (new_ovfl_page_p)
4133 prev_page_p = new_page_p;
4134 prev_vpid = *new_last_vpid_p;
4136 if (old_page_p ==
NULL)
4143 if (new_page_p ==
NULL)
4179 if (dup_list_id_p ==
NULL)
4195 return dup_list_id_p;
4217 int tuple_length, tuple_page_size;
4218 int max_tuple_page_size;
4221 page_p = first_page_p;
4224 if (tuple_record_p->
size < tuple_length)
4232 tuple_p = (
char *) tuple_record_p->
tpl;
4237 memcpy (tuple_p, tuple, tuple_length);
4249 tuple_page_size = MIN (tuple_length - offset, max_tuple_page_size);
4253 tuple_p += tuple_page_size;
4254 offset += tuple_page_size;
4256 if (page_p != first_page_p)
4351 if (next_page_p ==
NULL)
4420 if (prev_page_p ==
NULL)
4504 if (tuple_record_p->
size < tuple_size)
4511 memcpy (tuple_record_p->
tpl, scan_id_p->
curr_tpl, tuple_size);
4707 qp_scan = (*scan_func) (thread_p, scan_id_p);
4798 #if defined(SERVER_MODE) 4806 qfile_compare_tran_id (
const void *t1,
const void *t2)
4808 return *((
int *) t1) - *((
int *) t2);
4821 unsigned int hash = 0;
4826 if (key !=
NULL && array->
size > 0)
4828 for (i = 0, val = array->
vals; i < array->size; i++, val++)
4833 hash |= array->
size;
4836 return (hash % htsize);
4853 if (key1 == key2 || (array1->
size == 0 && array2->size == 0))
4858 if (key1 ==
NULL || key2 ==
NULL || array1->
size != array2->size)
4863 for (i = 0, val1 = array1->
vals, val2 = array2->vals; i < array1->size; i += 3, val1 += 3, val2 += 3)
4871 for (i = 1, val1 = array1->
vals + 1, val2 = array2->vals + 1; i < array1->size; i += 3, val1 += 3, val2 += 3)
4879 for (i = 2, val1 = array1->
vals + 2, val2 = array2->vals + 2; i < array1->size; i += 3, val1 += 3, val2 += 3)
4915 for (i = 0; i < qfile_List_cache.
n_hts; i++)
4932 for (i = 0; i < qfile_List_cache.
n_hts; i++)
4952 if (qfile_List_cache_entry_pool.
pool)
4958 qfile_List_cache_entry_pool.
pool =
4961 if (qfile_List_cache_entry_pool.
pool ==
NULL)
4966 qfile_List_cache_entry_pool.
free_list = 0;
4967 for (pent = qfile_List_cache_entry_pool.
pool, n = 0; pent && n < qfile_List_cache_entry_pool.
n_entries - 1;
4970 pent->
s.
next = n + 1;
4983 if (qfile_List_cache_entry_pool.
pool)
4987 qfile_List_cache_entry_pool.
n_entries = 0;
4988 qfile_List_cache_entry_pool.
free_list = -1;
4992 for (i = 0; i < qfile_List_cache.
n_hts && qfile_List_cache.
list_hts[
i]; i++)
4998 qfile_List_cache.
n_hts = 0;
5027 for (i = 0; i < qfile_List_cache.
n_hts; i++)
5037 if (qfile_List_cache_entry_pool.
pool)
5064 if (qfile_List_cache.
n_hts == 0)
5089 while (rc !=
NO_ERROR && cnt++ < 10);
5136 && (qfile_List_cache_entry_pool.
free_list >= 0));
5137 pent = &qfile_List_cache_entry_pool.
pool[qfile_List_cache_entry_pool.
free_list];
5172 HL_HEAPID old_pri_heap_id;
5174 #if !defined (NDEBUG) 5196 if (pent->
s.
next == -2)
5206 #if !defined (NDEBUG) 5207 idx = (int) (pent - qfile_List_cache_entry_pool.
pool);
5208 assert (idx <= qfile_List_cache_entry_pool.n_entries && idx >= 0);
5234 struct tm *c_time_struct, tm_val;
5245 fprintf (fp,
"LIST_CACHE_ENTRY (%p) {\n", data);
5246 fprintf (fp,
" param_values = [");
5254 fprintf (fp,
" ]\n");
5257 for (i = 0, d = ent->
list_id.
type_list.
domp; i < ent->list_id.type_list.type_cnt && d && *d; i++, d++)
5263 " } tuple_cnt %d page_cnt %d first_vpid { %d %d } last_vpid { %d %d } lasttpl_len %d query_id %lld " 5269 #if defined(SERVER_MODE) 5270 fprintf (fp,
" tran_isolation = %d\n", ent->tran_isolation);
5271 fprintf (fp,
" tran_index_array = [");
5273 for (i = 0; (
unsigned int) i < ent->last_ta_idx; i++)
5275 fprintf (fp,
" %d", ent->tran_index_array[i]);
5278 fprintf (fp,
" ]\n");
5279 fprintf (fp,
" last_ta_idx = %lld\n", (
long long) ent->last_ta_idx);
5282 fprintf (fp,
" query_string = %s\n", ent->
query_string);
5285 c_time_struct = localtime_r (&tmp_time, &tm_val);
5286 if (c_time_struct ==
NULL)
5288 fprintf (fp,
" ent->time_created.tv_sec is invalid (%ld)\n", ent->
time_last_used.tv_sec);
5292 (void) strftime (str,
sizeof (str),
"%x %X", c_time_struct);
5293 fprintf (fp,
" time_created = %s.%d\n", str, (
int) ent->
time_created.tv_usec);
5297 c_time_struct = localtime_r (&tmp_time, &tm_val);
5298 if (c_time_struct ==
NULL)
5300 fprintf (fp,
" ent->time_last_used.tv_sec is invalid (%ld)\n", ent->
time_last_used.tv_sec);
5304 (void) strftime (str,
sizeof (str),
"%x %X", c_time_struct);
5305 fprintf (fp,
" time_last_used = %s.%d\n", str, (
int) ent->
time_last_used.tv_usec);
5307 fprintf (fp,
" ref_count = %d\n", ent->
ref_count);
5308 fprintf (fp,
" deletion_marker = %s\n", (ent->
deletion_marker) ?
"true" :
"false");
5309 fprintf (fp,
"}\n");
5336 "LIST_CACHE {\n n_hts %d\n n_entries %d n_pages %d\n" 5337 " lookup_counter %d\n hit_counter %d\n miss_counter %d\n full_counter %d\n}\n",
5342 for (i = 0; i < qfile_List_cache.
n_hts; i++)
5346 fprintf (fp,
"\nlist_hts[%d] %p\n", i, (
void *) qfile_List_cache.
list_hts[i]);
5356 #if defined (CUBRID_DEBUG) 5363 qfile_dump_list_cache (
THREAD_ENTRY * thread_p,
const char *fname)
5373 if (qfile_List_cache.
n_hts == 0 || !qfile_List_cache.
list_hts)
5378 fp = (fname) ? fopen (fname,
"a") : stdout;
5431 "ls_delete_list_cache_ent: mht_rem failed for param_values { %d %s ...}\n",
5481 bool * result_cached)
5485 #if defined(SERVER_MODE) 5487 #if defined(WINDOWS) 5488 unsigned int num_elements;
5490 size_t num_elements;
5493 #if defined (SERVER_MODE) && !defined (NDEBUG) 5494 size_t i_idx, num_active_users;
5497 bool new_tran =
true;
5499 *result_cached =
false;
5505 if (qfile_List_cache.
n_hts == 0 || list_ht_no < 0)
5528 #if defined(SERVER_MODE) 5529 if (lent->last_ta_idx == 0)
5537 *result_cached =
true;
5539 #if defined(SERVER_MODE) 5541 for (i = 0; i < lent->last_ta_idx; i++)
5543 if (lent->tran_index_array[i] == tran_index)
5554 lent->uncommitted_marker =
true;
5557 num_elements = (int) lent->last_ta_idx;
5558 (
void) lsearch (&tran_index, lent->tran_index_array, &num_elements, sizeof (
int), qfile_compare_tran_id);
5559 lent->last_ta_idx = num_elements;
5561 #if !defined (NDEBUG) 5562 for (i_idx = 0, num_active_users = 0; i_idx < lent->last_ta_idx; i_idx++)
5564 if (lent->tran_index_array[i_idx] > 0)
5569 assert (lent->last_ta_idx == num_active_users);
5602 if (a->tv_sec == b->tv_sec)
5604 return a->tv_usec < b->tv_usec;
5608 return a->tv_sec < b->tv_sec;
5633 #if defined(SERVER_MODE) 5635 #if defined(WINDOWS) 5636 unsigned int num_elements;
5638 size_t num_elements;
5640 #if !defined (NDEBUG) 5641 size_t i_idx, num_active_users;
5645 HL_HEAPID old_pri_heap_id;
5653 if (qfile_List_cache.
n_hts == 0)
5664 #if defined(SERVER_MODE) 5678 ht = qfile_List_cache.
list_hts[list_ht_no];
5688 #if defined(SERVER_MODE) 5690 if (lent->last_ta_idx > 0)
5700 num_elements = (int) lent->last_ta_idx;
5701 (
void) lsearch (&tran_index, lent->tran_index_array, &num_elements, sizeof (
int), qfile_compare_tran_id);
5702 lent->last_ta_idx = num_elements;
5705 #if !defined (NDEBUG) 5706 for (i_idx = 0, num_active_users = 0; i_idx < lent->last_ta_idx; i_idx++)
5708 if (lent->tran_index_array[i_idx] > 0)
5714 assert (lent->last_ta_idx == num_active_users);
5730 #if defined(SERVER_MODE) 5735 if (qfile_list_cache_cleanup (thread_p) !=
NO_ERROR)
5753 #if defined(SERVER_MODE) 5754 lent->uncommitted_marker =
true;
5755 lent->tran_isolation = tran_isolation;
5756 lent->last_ta_idx = 0;
5757 lent->tran_index_array =
5758 (
int *) memset (qfile_get_list_cache_entry_tran_index_array (lent), 0,
MAX_NTRANS *
sizeof (int));
5793 #if defined(SERVER_MODE) 5796 num_elements = (int) lent->last_ta_idx;
5797 (
void) lsearch (&tran_index, lent->tran_index_array, &num_elements, sizeof (
int), qfile_compare_tran_id);
5798 lent->last_ta_idx = num_elements;
5801 #if !defined (NDEBUG) 5802 for (i_idx = 0, num_active_users = 0; i_idx < lent->last_ta_idx; i_idx++)
5804 if (lent->tran_index_array[i_idx] > 0)
5810 assert (lent->last_ta_idx == num_active_users);
5852 #if defined(SERVER_MODE) 5854 #if defined(WINDOWS) 5855 unsigned int num_elements;
5857 size_t num_elements;
5860 #if defined (SERVER_MODE) && !defined (NDEBUG) 5861 size_t i_idx, num_active_users;
5868 if (lent ==
NULL || qfile_List_cache.
n_hts == 0)
5878 #if defined(SERVER_MODE) 5881 r = &lent->tran_index_array[lent->last_ta_idx];
5885 num_elements = (int) lent->last_ta_idx;
5886 p = (
int *) lfind (&tran_index, lent->tran_index_array, &num_elements, sizeof (
int), qfile_compare_tran_id);
5887 lent->last_ta_idx = num_elements;
5894 (void) memcpy (p, p + 1,
sizeof (
int) * (r - p - 1));
5896 lent->last_ta_idx--;
5902 if (lent->last_ta_idx == 0)
5904 lent->uncommitted_marker =
false;
5907 #if !defined (NDEBUG) 5908 for (i_idx = 0, num_active_users = 0; i_idx < lent->last_ta_idx; i_idx++)
5910 if (lent->tran_index_array[i_idx] > 0)
5916 assert (lent->last_ta_idx == num_active_users);
5922 #if defined(SERVER_MODE) 5923 if (lent->last_ta_idx == 0)
5932 #if defined(SERVER_MODE) 5952 #if defined(SERVER_MODE) 5962 #if defined(SERVER_MODE) 5973 #if defined(SERVER_MODE) 5992 PAGE_PTR cur_page_p, new_page_p, prev_page_p;
5994 char *page_p, *tuple_p;
5995 int offset, tuple_page_size;
5997 if (list_id_p ==
NULL)
6012 page_p = (
char *) cur_page_p + list_id_p->
last_offset;
6014 memcpy (page_p, tuple, tuple_page_size);
6020 tuple_pos->
tpl = page_p;
6027 prev_page_p = cur_page_p;
6028 for (offset = tuple_page_size, tuple_p = (
char *) tuple + offset; offset < tuple_length;
6029 offset += tuple_page_size, tuple_p += tuple_page_size)
6034 if (new_page_p ==
NULL)
6036 if (prev_page_p != cur_page_p)
6045 prev_page_p = new_page_p;
6048 if (prev_page_p != cur_page_p)
6087 reg_var_p = valptr_list_p->
valptrp;
6089 for (i = 0; i < valptr_list_p->
valptr_cnt; i++, reg_var_p = reg_var_p->
next)
6182 pr_type = domain_p->
type;
6183 if (pr_type ==
NULL)
6189 if (curr_page_p !=
NULL)
6191 page_p = curr_page_p;
6232 tuple_rec.
tpl = tuple_p;
6273 if (tuple_rec.
tpl !=
NULL && tuple_rec.
tpl != tuple_p)
6278 if (page_p != curr_page_p)
6304 int tuple_length, tuple_page_size;
6305 int max_tuple_page_size;
6308 page_p = first_page_p;
6312 if (tuple_length != tuple_record_p->
size)
6318 tuple_p = (
char *) tuple_record_p->
tpl;
6323 memcpy (tuple, tuple_p, tuple_length);
6335 tuple_page_size = MIN (tuple_length - offset, max_tuple_page_size);
6339 tuple_p += tuple_page_size;
6340 offset += tuple_page_size;
6342 if (page_p != first_page_p)
6412 subkey->
cmp_dom = cast_domain;
6438 cast_domain = subkey->
cmp_dom;
6473 #if defined (SERVER_MODE) 6476 thread_p->m_qlist_count += inc;
6482 #endif // SERVER_MODE 6496 return (qfile_List_cache.
n_entries == 0);
#define QFILE_TUPLE_VALUE_HEADER_SIZE
int qfile_reallocate_tuple(QFILE_TUPLE_RECORD *tuple_record_p, int tuple_size)
static int qfile_compare_equal_db_value_array(const void *key1, const void *key2)
#define QFILE_LAST_TUPLE_OFFSET
#define QFILE_CLEAR_LIST_ID(list_id)
int stx_map_stream_to_xasl_node_header(THREAD_ENTRY *thread_p, xasl_node_header *xasl_header_p, char *xasl_stream)
int qfile_generate_tuple_into_list(THREAD_ENTRY *thread_p, QFILE_LIST_ID *list_id_p, QFILE_TUPLE_TYPE tuple_type)
int data_readval(struct or_buf *buf, DB_VALUE *value, const tp_domain *domain, int size, bool copy, char *copy_buf, int copy_buf_len) const
SORTKEY_INFO * qfile_initialize_sort_key_info(SORTKEY_INFO *key_info_p, SORT_LIST *list_p, QFILE_TUPLE_VALUE_TYPE_LIST *types)
int qfile_Is_list_cache_disabled
QFILE_TUPLE_RECORD tplrec
#define QFILE_GET_TUPLE_VALUE_HEADER_POSITION(tpl, ind, valp)
int file_temp_retire(THREAD_ENTRY *thread_p, const VFID *vfid)
static int qfile_save_sort_key_tuple(QFILE_TUPLE_DESCRIPTOR *tuple_descr_p, char *tuple_p, char *page_p, int tuple_length)
static SORT_STATUS qfile_get_next_sort_item(THREAD_ENTRY *thread_p, RECDES *recdes, void *arg)
cubthread::entry * thread_get_thread_entry_info(void)
int mht_map_no_key(THREAD_ENTRY *thread_p, const MHT_TABLE *ht, int(*map_func)(THREAD_ENTRY *thread_p, void *data, void *args), void *func_args)
static SCAN_CODE qfile_advance_single(THREAD_ENTRY *thread_p, QFILE_LIST_SCAN_ID *next_scan, QFILE_TUPLE_RECORD *next_tpl, QFILE_LIST_SCAN_ID *last_scan, QFILE_TUPLE_RECORD *last_tpl, QFILE_TUPLE_VALUE_TYPE_LIST *types)
int qfile_save_tuple(QFILE_TUPLE_DESCRIPTOR *tuple_descr_p, QFILE_TUPLE_TYPE tuple_type, char *page_p, int *tuple_length_p)
int pr_data_writeval_disk_size(DB_VALUE *value)
int mht_clear(MHT_TABLE *ht, int(*rem_func)(const void *key, void *data, void *args), void *func_args)
#define LF_EM_NOT_USING_MUTEX
#define QFILE_OVERFLOW_PAGE_ID_OFFSET
static int qfile_save_merge_tuple(QFILE_TUPLE_DESCRIPTOR *tuple_descr_p, char *tuple_p, char *page_p, int *tuple_length_p)
int qfile_end_use_of_list_cache_entry(THREAD_ENTRY *thread_p, QFILE_LIST_CACHE_ENTRY *lent, bool marker)
struct qmgr_temp_file * tfile_vfid
unsigned int miss_counter
bool qfile_has_next_page(PAGE_PTR page_p)
#define QFILE_PREV_PAGE_ID_OFFSET
QFILE_TUPLE_VALUE_TYPE_LIST type_list
int data_writeval(struct or_buf *buf, const DB_VALUE *value) const
#define ADDITION_FOR_POOLED_LIST_CACHE_ENTRY
#define QFILE_PUT_TUPLE_VALUE_FLAG(ptr, val)
#define QFILE_FREE_AND_INIT_LIST_ID(list_id)
int qfile_get_tuple(THREAD_ENTRY *thread_p, PAGE_PTR first_page_p, QFILE_TUPLE tuple, QFILE_TUPLE_RECORD *tuple_record_p, QFILE_LIST_ID *list_id_p)
QFILE_LIST_CACHE_ENTRY * qfile_lookup_list_cache_entry(THREAD_ENTRY *thread_p, int list_ht_no, const DB_VALUE_ARRAY *params, bool *result_cached)
data_cmpdisk_function_type get_data_cmpdisk_function() const
unsigned int full_counter
static void qfile_clear_sort_info(SORT_INFO *info)
QFILE_TUPLE_VALUE_FLAG qfile_locate_tuple_value_r(QFILE_TUPLE tuple, int index, char **tuple_value_p, int *value_size_p)
PAGE_PTR qmgr_get_old_page(THREAD_ENTRY *thread_p, VPID *vpid_p, QMGR_TEMP_FILE *tfile_vfid_p)
static SCAN_CODE qfile_scan_next(THREAD_ENTRY *thread_p, QFILE_LIST_SCAN_ID *s_id)
void qfile_load_xasl_node_header(THREAD_ENTRY *thread_p, char *xasl_stream, xasl_node_header *xasl_header_p)
const int REGU_VARIABLE_HIDDEN_COLUMN
static SCAN_CODE qfile_scan_prev(THREAD_ENTRY *thread_p, QFILE_LIST_SCAN_ID *s_id)
SORT_STATUS qfile_make_sort_key(THREAD_ENTRY *thread_p, SORTKEY_INFO *key_info_p, RECDES *key_record_p, QFILE_LIST_SCAN_ID *input_scan_p, QFILE_TUPLE_RECORD *tuple_record_p)
#define csect_enter(a, b, c)
static LF_ENTRY_DESCRIPTOR qfile_sort_list_entry_desc
QFILE_SORT_SCAN_ID * s_id
void bh_element_at(BINARY_HEAP *heap, int index, void *elem)
int SORT_PUT_FUNC(THREAD_ENTRY *thread_p, const RECDES *, void *)
#define QFILE_GET_NEXT_PAGE_ID(ptr)
SCAN_CODE qfile_scan_list_next(THREAD_ENTRY *thread_p, QFILE_LIST_SCAN_ID *scan_id_p, QFILE_TUPLE_RECORD *tuple_record_p, int peek)
int qfile_overwrite_tuple(THREAD_ENTRY *thread_p, PAGE_PTR first_page_p, QFILE_TUPLE tuple, QFILE_TUPLE_RECORD *tuple_record_p, QFILE_LIST_ID *list_id_p)
QFILE_LIST_ID * qfile_sort_list_with_func(THREAD_ENTRY *thread_p, QFILE_LIST_ID *list_id_p, SORT_LIST *sort_list_p, QUERY_OPTIONS option, int flag, SORT_GET_FUNC *get_func, SORT_PUT_FUNC *put_func, SORT_CMP_FUNC *cmp_func, void *extra_arg, int limit, bool do_close)
QFILE_LIST_ID * output_file
#define QFILE_PUT_TUPLE_COUNT(ptr, val)
static int qfile_Max_tuple_page_size
#define OR_BUF_INIT(buf, data, size)
#define ER_QPROC_INCOMPATIBLE_TYPES
static int qfile_save_normal_tuple(QFILE_TUPLE_DESCRIPTOR *tuple_descr_p, char *tuple_p, char *page_p, int tuple_length)
#define QFILE_GET_PREV_TUPLE_LENGTH(tpl)
static bool qfile_is_last_page_full(QFILE_LIST_ID *list_id_p, int tuple_length, const bool is_ovf_page)
static SCAN_CODE qfile_retrieve_tuple(THREAD_ENTRY *thread_p, QFILE_LIST_SCAN_ID *scan_id_p, QFILE_TUPLE_RECORD *tuple_record_p, int peek)
int pr_is_variable_type(DB_TYPE id)
#define QFILE_PUT_OVERFLOW_VPID_NULL(ptr)
#define assert_release(e)
static int qfile_advance(THREAD_ENTRY *thread_p, ADVANCE_FUCTION advance_func, QFILE_TUPLE_RECORD *side_p, QFILE_TUPLE_RECORD *last_side_p, QFILE_LIST_SCAN_ID *scan_p, QFILE_LIST_SCAN_ID *last_scan_p, QFILE_LIST_ID *side_file_p, int *have_side_p)
void pgbuf_set_dirty(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, bool free_page)
int qfile_locate_tuple_next_value(OR_BUF *iterator, OR_BUF *buf, QFILE_TUPLE_VALUE_FLAG *flag)
int qfile_get_estimated_pages_for_sorting(QFILE_LIST_ID *list_id_p, SORTKEY_INFO *key_info_p)
QFILE_LIST_CACHE_ENTRY ** victims
DB_VALUE_COMPARE_RESULT cmpval(const DB_VALUE *value, const DB_VALUE *value2, int do_coercion, int total_order, int *start_colp, int collation) const
static PAGE_PTR qfile_allocate_new_ovf_page(THREAD_ENTRY *thread_p, QFILE_LIST_ID *list_id_p, PAGE_PTR page_p, PAGE_PTR prev_page_p, int tuple_length, int offset, int *tuple_page_size_p)
SCAN_CODE(* ADVANCE_FUCTION)(THREAD_ENTRY *thread_p, QFILE_LIST_SCAN_ID *, QFILE_TUPLE_RECORD *, QFILE_LIST_SCAN_ID *, QFILE_TUPLE_RECORD *, QFILE_TUPLE_VALUE_TYPE_LIST *)
#define QFILE_PREV_VOL_ID_OFFSET
bool REGU_VARIABLE_IS_FLAGED(const regu_variable_node *regu, int flag)
static void qfile_set_dirty_page(THREAD_ENTRY *thread_p, PAGE_PTR page_p, int free_page, QMGR_TEMP_FILE *vfid_p)
int qdata_update_interpolation_func_value_and_domain(DB_VALUE *src_val, DB_VALUE *dest_val, TP_DOMAIN **domain)
void * lf_freelist_claim(LF_TRAN_ENTRY *tran_entry, LF_FREELIST *freelist)
void qfile_clear_list_id(QFILE_LIST_ID *list_id_p)
static LF_FREELIST qfile_sort_list_Freelist
#define PTR_ALIGN(addr, boundary)
#define QFILE_PUT_NEXT_VPID(ptr, vpid)
static void qfile_delete_uncommitted_list_cache_entry(int tran_index, QFILE_LIST_CACHE_ENTRY *lent)
int qfile_update_domains_on_type_list(THREAD_ENTRY *thread_p, QFILE_LIST_ID *list_id_p, valptr_list_node *valptr_list_p)
bool * clear_f_val_at_clone_decache
DB_VALUE_ARRAY param_values
TRAN_ISOLATION logtb_find_isolation(int tran_index)
QFILE_TUPLE_DESCRIPTOR tpl_descr
enum tp_domain_status TP_DOMAIN_STATUS
#define er_log_debug(...)
HL_HEAPID db_change_private_heap(THREAD_ENTRY *thread_p, HL_HEAPID heap_id)
static void qfile_set_dirty_page_and_skip_logging(THREAD_ENTRY *thread_p, PAGE_PTR page_p, VFID *vfid_p, int free_page)
void qfile_clear_sort_key_info(SORTKEY_INFO *key_info_p)
static QFILE_LIST_ID * qfile_union_list(THREAD_ENTRY *thread_p, QFILE_LIST_ID *list_id1, QFILE_LIST_ID *list_id2, int flag)
QFILE_TUPLE_VALUE_FLAG qfile_locate_tuple_value(QFILE_TUPLE tuple, int index, char **tuple_value_p, int *value_size_p)
SUBKEY_INFO default_keys[8]
#define VFID_ISNULL(vfid_ptr)
QMGR_TEMP_FILE * qmgr_create_result_file(THREAD_ENTRY *thread_p, QUERY_ID query_id)
XASL_CACHE_ENTRY * xcache_entry
struct qfile_pooled_list_cache_entry::@144 s
static int qfile_end_use_of_list_cache_entry_local(THREAD_ENTRY *thread_p, void *data, void *args)
QFILE_POOLED_LIST_CACHE_ENTRY * pool
int qfile_get_first_page(THREAD_ENTRY *thread_p, QFILE_LIST_ID *list_id_p)
int sort_listfile(THREAD_ENTRY *thread_p, INT16 volid, int est_inp_pg_cnt, SORT_GET_FUNC *get_fn, void *get_arg, SORT_PUT_FUNC *put_fn, void *put_arg, SORT_CMP_FUNC *cmp_fn, void *cmp_arg, SORT_DUP_OPTION option, int limit, bool includes_tde_class)
void mht_destroy(MHT_TABLE *ht)
SORT_LIST * qfile_allocate_sort_list(THREAD_ENTRY *thread_p, int count)
#define QFILE_GET_TUPLE_VALUE_FLAG(ptr)
bool pr_is_set_type(DB_TYPE type)
#define QFILE_MAX_TUPLE_SIZE_IN_PAGE
static SORT_INFO * qfile_initialize_sort_info(SORT_INFO *info, QFILE_LIST_ID *listid, SORT_LIST *sort_list)
static void qfile_initialize_page_header(PAGE_PTR page_p)
static int qfile_put_next_sort_item(THREAD_ENTRY *thread_p, const RECDES *recdes, void *arg)
void qfile_end_scan_fix(THREAD_ENTRY *thread_p, QFILE_LIST_SCAN_ID *scan_id_p)
PR_TYPE * pr_type_from_id(DB_TYPE id)
#define QFILE_OVERFLOW_VOL_ID_OFFSET
#define VPID_SET(vpid_ptr, volid_value, pageid_value)
void er_set(int severity, const char *file_name, const int line_no, int err_id, int num_args,...)
void bh_destroy(THREAD_ENTRY *thread_p, BINARY_HEAP *heap)
#define QFILE_NEXT_PAGE_ID_OFFSET
SCAN_CODE qfile_scan_list_prev(THREAD_ENTRY *thread_p, QFILE_LIST_SCAN_ID *scan_id_p, QFILE_TUPLE_RECORD *tuple_record_p, int peek)
QFILE_LIST_ID * qfile_combine_two_list(THREAD_ENTRY *thread_p, QFILE_LIST_ID *lhs_file_p, QFILE_LIST_ID *rhs_file_p, int flag)
void log_skip_logging(THREAD_ENTRY *thread_p, LOG_DATA_ADDR *addr)
QFILE_TUPLE_RECORD * tplrec1
const char * query_string
QFILE_LIST_CACHE_ENTRY ** ref_candidates
static int qfile_delete_list_cache_entry(THREAD_ENTRY *thread_p, void *data)
bool pgbuf_check_page_ptype(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, PAGE_TYPE ptype)
static QFILE_LIST_CACHE_ENTRY_POOL qfile_List_cache_entry_pool
int qfile_add_overflow_tuple_to_list(THREAD_ENTRY *thread_p, QFILE_LIST_ID *list_id_p, PAGE_PTR ovf_tuple_page_p, QFILE_LIST_ID *input_list_id_p)
int prm_get_integer_value(PARAM_ID prm_id)
QMGR_QUERY_STATUS query_status
void qfile_destroy_list(THREAD_ENTRY *thread_p, QFILE_LIST_ID *list_id_p)
int qfile_set_tuple_column_value(THREAD_ENTRY *thread_p, QFILE_LIST_ID *list_id_p, PAGE_PTR curr_page_p, VPID *vpid_p, QFILE_TUPLE tuple_p, int col_num, DB_VALUE *value_p, TP_DOMAIN *domain_p)
static int qfile_print_list_cache_entry(THREAD_ENTRY *thread_p, FILE *fp, const void *key, void *data, void *args)
int qfile_compare_all_sort_record(const void *pk0, const void *pk1, void *arg)
#define QFILE_PAGE_HEADER_SIZE
#define QFILE_CHECK_LIST_FILE_IS_CLOSED(list_id)
static PAGE_PTR qfile_allocate_new_page(THREAD_ENTRY *thread_p, QFILE_LIST_ID *list_id_p, PAGE_PTR page_p, bool is_ovf_page)
static int qfile_dealloc_sort_list(void *sort_list)
lf_tran_entry * thread_get_tran_entry(cubthread::entry *thread_p, int entry_idx)
#define QFILE_GET_PREV_PAGE_ID(ptr)
#define ER_QPROC_UNKNOWN_QUERYID
QFILE_LIST_ID * qfile_duplicate_list(THREAD_ENTRY *thread_p, QFILE_LIST_ID *list_id_p, int flag)
#define DB_VALUE_DOMAIN_TYPE(value)
QFILE_LIST_CACHE_ENTRY * qfile_update_list_cache_entry(THREAD_ENTRY *thread_p, int list_ht_no, const DB_VALUE_ARRAY *params, const QFILE_LIST_ID *list_id, XASL_CACHE_ENTRY *xasl)
#define QFILE_PUT_OVERFLOW_VPID(ptr, vpid)
int lf_freelist_retire(LF_TRAN_ENTRY *tran_entry, LF_FREELIST *freelist, void *entry)
static int qfile_add_one_tuple(THREAD_ENTRY *thread_p, QFILE_LIST_ID *dst, QFILE_TUPLE lhs, QFILE_TUPLE rhs)
#define QFILE_GET_PREV_VPID(des, ptr)
void qfile_save_current_scan_tuple_position(QFILE_LIST_SCAN_ID *scan_id_p, QFILE_TUPLE_POSITION *tuple_position_p)
QMGR_TEMP_FILE * qmgr_create_new_temp_file(THREAD_ENTRY *thread_p, QUERY_ID query_id, QMGR_TEMP_FILE_MEMBUF_TYPE membuf_type)
#define QFILE_RESERVED_OFFSET
static const int RESERVED_SIZE_FOR_LIST_CACHE_ENTRY
#define VPID_EQ(vpid_ptr1, vpid_ptr2)
int qmgr_free_list_temp_file(THREAD_ENTRY *thread_p, QUERY_ID query_id, QMGR_TEMP_FILE *tfile_vfid_p)
QFILE_TUPLE qfile_generate_sort_tuple(SORTKEY_INFO *key_info_p, SORT_REC *sort_record_p, RECDES *output_recdes_p)
unsigned int mht_valhash(const void *key, const unsigned int ht_size)
TP_DOMAIN_STATUS tp_value_cast(const DB_VALUE *src, DB_VALUE *dest, const TP_DOMAIN *desired_domain, bool implicit_coercion)
#define QFILE_NEXT_VOL_ID_OFFSET
#define TP_DOMAIN_TYPE(dom)
static unsigned int qfile_hash_db_value_array(const void *key, unsigned int htsize)
QFILE_TUPLE_RECORD tplrec
SCAN_CODE qfile_jump_scan_tuple_position(THREAD_ENTRY *thread_p, QFILE_LIST_SCAN_ID *scan_id_p, QFILE_TUPLE_POSITION *tuple_position_p, QFILE_TUPLE_RECORD *tuple_record_p, int peek)
static void cleanup(int signo)
static void qfile_add_uncommitted_list_cache_entry(int tran_index, QFILE_LIST_CACHE_ENTRY *lent)
#define QFILE_GET_TUPLE_VALUE_LENGTH(ptr)
void * mht_get(MHT_TABLE *ht, const void *key)
int qfile_reopen_list_as_append_mode(THREAD_ENTRY *thread_p, QFILE_LIST_ID *list_id_p)
void qfile_free_sort_list(THREAD_ENTRY *thread_p, SORT_LIST *sort_list_p)
#define QFILE_TUPLE_LENGTH_SIZE
#define ER_QPROC_UNKNOWN_CRSPOS
#define QFILE_COPY_VPID(ptr1, ptr2)
static int qfile_allocate_new_page_if_need(THREAD_ENTRY *thread_p, QFILE_LIST_ID *list_id_p, PAGE_PTR *page_p, int tuple_length, bool is_ovf_page)
#define QFILE_GET_TUPLE_LENGTH(tpl)
#define QFILE_IS_FLAG_SET_BOTH(var, flag1, flag2)
static SCAN_CODE qfile_scan_list(THREAD_ENTRY *thread_p, QFILE_LIST_SCAN_ID *scan_id_p, SCAN_CODE(*scan_func)(THREAD_ENTRY *thread_p, QFILE_LIST_SCAN_ID *), QFILE_TUPLE_RECORD *tuple_record_p, int peek)
QFILE_TUPLE_VALUE_POSITION pos_descr
int qfile_dump_list_cache_internal(THREAD_ENTRY *thread_p, FILE *fp)
int qfile_fast_intval_tuple_to_list(THREAD_ENTRY *thread_p, QFILE_LIST_ID *list_id_p, int v1, DB_VALUE *v2)
void qfile_update_qlist_count(THREAD_ENTRY *thread_p, const QFILE_LIST_ID *list_p, int inc)
#define QFILE_TUPLE_VALUE_HEADER_LENGTH
int * ls_outer_inner_list
static void * qfile_alloc_sort_list(void)
#define db_private_free_and_init(thrd, ptr)
int lf_freelist_init(LF_FREELIST *freelist, int initial_blocks, int block_size, LF_ENTRY_DESCRIPTOR *edesc, LF_TRAN_SYSTEM *tran_system)
#define pgbuf_fix(thread_p, vpid, fetch_mode, requestmode, condition)
MHT_TABLE * mht_create(const char *name, int est_size, unsigned int(*hash_func)(const void *key, unsigned int ht_size), int(*cmp_func)(const void *key1, const void *key2))
#define QFILE_PUT_PREV_VPID(ptr, vpid)
#define db_private_free(thrd, ptr)
void or_init(OR_BUF *buf, char *data, int length)
#define db_private_alloc(thrd, size)
static int qfile_get_list_cache_entry_size_for_allocate(int nparam)
int xqfile_get_list_file_page(THREAD_ENTRY *thread_p, QUERY_ID query_id, VOLID vol_id, PAGEID page_id, char *page_buf_p, int *page_size_p)
int file_temp_retire_preserved(THREAD_ENTRY *thread_p, const VFID *vfid)
static bool qfile_is_early_time(struct timeval *a, struct timeval *b)
#define OR_PUT_SHORT(ptr, val)
static int qfile_free_list_cache_entry(THREAD_ENTRY *thread_p, void *data, void *args)
#define QFILE_PUT_TUPLE_VALUE_LENGTH(ptr, val)
int count(int &result, const cub_regex_object ®, const std::string &src, const int position, const INTL_CODESET codeset)
int pr_clear_value(DB_VALUE *value)
int qfile_open_list_scan(QFILE_LIST_ID *list_id_p, QFILE_LIST_SCAN_ID *scan_id_p)
#define VFID_COPY(vfid_ptr1, vfid_ptr2)
struct SORT_REC::@159::@160 original
void qmgr_set_dirty_page(THREAD_ENTRY *thread_p, PAGE_PTR page_p, int free_page, LOG_DATA_ADDR *addr_p, QMGR_TEMP_FILE *tfile_vfid_p)
static int qfile_copy_list_pages(THREAD_ENTRY *thread_p, VPID *old_first_vpidp, QMGR_TEMP_FILE *old_tfile_vfidp, VPID *new_first_vpidp, VPID *new_last_vpidp, QMGR_TEMP_FILE *new_tfile_vfidp)
QFILE_LIST_CACHE_ENTRY entry
struct timeval time_created
#define QFILE_PUT_OVERFLOW_TUPLE_PAGE_SIZE(ptr, val)
TP_DOMAIN_COLL_ACTION collation_flag
static void error(const char *msg)
#define VPID_ISNULL(vpid_ptr)
void qfile_close_scan(THREAD_ENTRY *thread_p, QFILE_LIST_SCAN_ID *scan_id_p)
int mht_dump(THREAD_ENTRY *thread_p, FILE *out_fp, const MHT_TABLE *ht, const int print_id_opt, int(*print_func)(THREAD_ENTRY *thread_p, FILE *fp, const void *key, void *data, void *args), void *func_args)
void qfile_free_list_id(QFILE_LIST_ID *list_id_p)
static int qfile_get_tuple_from_current_list(THREAD_ENTRY *thread_p, QFILE_LIST_SCAN_ID *scan_id_p, QFILE_TUPLE_RECORD *tuple_record_p)
#define LOG_FIND_THREAD_TRAN_INDEX(thrd)
static void qfile_close_and_free_list_file(THREAD_ENTRY *thread_p, QFILE_LIST_ID *list_id)
#define QFILE_OVERFLOW_TUPLE_COUNT_FLAG
bool qfile_has_no_cache_entries()
bool qfile_is_sort_list_covered(SORT_LIST *covering_list_p, SORT_LIST *covered_list_p)
void er_print_callstack(const char *file_name, const int line_no, const char *fmt,...)
int pr_clone_value(const DB_VALUE *src, DB_VALUE *dest)
int qfile_start_scan_fix(THREAD_ENTRY *thread_p, QFILE_LIST_SCAN_ID *scan_id_p)
int qfile_add_item_to_list(THREAD_ENTRY *thread_p, char *item_p, int item_size, QFILE_LIST_ID *list_id_p)
QFILE_TUPLE_RECORD * tplrec2
const void * mht_put_new(MHT_TABLE *ht, const void *key, void *data)
int pr_is_string_type(DB_TYPE type)
unsigned int mht_count(const MHT_TABLE *ht)
static int qfile_save_single_bound_item_tuple(QFILE_TUPLE_DESCRIPTOR *tuple_descr_p, char *tuple_p, char *page_p, int tuple_length)
QFILE_LIST_ID * qfile_clone_list_id(const QFILE_LIST_ID *list_id_p, bool is_include_sort_list)
void db_fprint_value(FILE *fp, const db_value *value)
int qfile_fast_val_tuple_to_list(THREAD_ENTRY *thread_p, QFILE_LIST_ID *list_id_p, DB_VALUE *val)
#define free_and_init(ptr)
static int qfile_compare_with_null_value(int o0, int o1, SUBKEY_INFO key_info)
#define DB_ALIGN(offset, align)
PAGE_PTR qmgr_get_new_page(THREAD_ENTRY *thread_p, VPID *vpid_p, QMGR_TEMP_FILE *tfile_vfid_p)
static QFILE_LIST_CACHE_CANDIDATE qfile_List_cache_candidate
static DB_VALUE * qfile_get_list_cache_entry_param_values(QFILE_LIST_CACHE_ENTRY *ent)
BH_TRY_INSERT_RESULT bh_try_insert(BINARY_HEAP *heap, void *elem, void *replaced)
#define LS_PUT_NEXT_VPID(ptr)
int qfile_get_list_cache_number_of_entries(int ht_no)
static int qfile_compare_with_interpolation_domain(char *fp0, char *fp1, SUBKEY_INFO *subkey, SORTKEY_INFO *key_info)
static QFILE_LIST_CACHE qfile_List_cache
#define QFILE_GET_OVERFLOW_VPID(des, ptr)
#define QFILE_IS_LIST_CACHE_DISABLED
QFILE_LIST_CACHE_ENTRY ** time_candidates
int qfile_copy_tuple_descr_to_tuple(THREAD_ENTRY *thread_p, QFILE_TUPLE_DESCRIPTOR *tpl_descr, QFILE_TUPLE_RECORD *tplrec)
#define FIXED_SIZE_OF_POOLED_LIST_CACHE_ENTRY
void lf_freelist_destroy(LF_FREELIST *freelist)
static int qfile_get_sort_list_size(SORT_LIST *sort_list)
int mht_rem2(MHT_TABLE *ht, const void *key, const void *data, int(*rem_func)(const void *key, void *data, void *args), void *func_args)
int qfile_initialize_list_cache(THREAD_ENTRY *thread_p)
bool prm_get_bool_value(PARAM_ID prm_id)
BINARY_HEAP * bh_create(THREAD_ENTRY *thread_p, int max_capacity, int elem_size, bh_key_comparator cmp_func, BH_CMP_ARG cmp_arg)
#define OR_PUT_INT(ptr, val)
int qfile_copy_list_id(QFILE_LIST_ID *dest_list_id_p, const QFILE_LIST_ID *src_list_id_p, bool is_include_sort_list)
#define QFILE_PUT_PREV_TUPLE_LENGTH(tpl, val)
static void qfile_add_tuple_to_list_id(QFILE_LIST_ID *list_id_p, PAGE_PTR page_p, int tuple_length, int written_tuple_length)
#define QFILE_IS_FLAG_SET(var, flag)
struct timeval time_last_used
#define QFILE_PUT_NEXT_VPID_NULL(ptr)
static int qfile_compare_tuple_helper(QFILE_TUPLE lhs, QFILE_TUPLE rhs, QFILE_TUPLE_VALUE_TYPE_LIST *types, int *cmp)
struct qfile_list_cache_entry QFILE_LIST_CACHE_ENTRY
#define ER_QSTR_INCOMPATIBLE_COLLATIONS
#define QFILE_PUT_LAST_TUPLE_OFFSET(ptr, val)
QFILE_LIST_ID * qfile_open_list(THREAD_ENTRY *thread_p, QFILE_TUPLE_VALUE_TYPE_LIST *type_list_p, SORT_LIST *sort_list_p, QUERY_ID query_id, int flag)
QFILE_LIST_SCAN_ID * s_id
int db_make_null(DB_VALUE *value)
QFILE_LIST_ID * qfile_sort_list(THREAD_ENTRY *thread_p, QFILE_LIST_ID *list_id_p, SORT_LIST *sort_list_p, QUERY_OPTIONS option, bool do_close)
int qfile_modify_type_list(QFILE_TUPLE_VALUE_TYPE_LIST *type_list_p, QFILE_LIST_ID *list_id_p)
char * pr_valstring(const DB_VALUE *val)
void qfile_close_list(THREAD_ENTRY *thread_p, QFILE_LIST_ID *list_id_p)
static SCAN_CODE qfile_advance_group(THREAD_ENTRY *thread_p, QFILE_LIST_SCAN_ID *next_scan, QFILE_TUPLE_RECORD *next_tpl, QFILE_LIST_SCAN_ID *last_scan, QFILE_TUPLE_RECORD *last_tpl, QFILE_TUPLE_VALUE_TYPE_LIST *types)
#define QFILE_TUPLE_COUNT_OFFSET
#define DB_IS_NULL(value)
static int qfile_compare_tuple_values(QFILE_TUPLE tplp1, QFILE_TUPLE tplp2, TP_DOMAIN *domain, int *cmp)
int qfile_unify_types(QFILE_LIST_ID *list_id1_p, const QFILE_LIST_ID *list_id2_p)
void qfile_finalize(void)
#define ER_ARG_CAN_NOT_BE_CASTED_TO_DESIRED_DOMAIN
#define QFILE_GET_LAST_TUPLE_OFFSET(ptr)
int qfile_initialize(void)
static QFILE_LIST_CACHE_ENTRY * qfile_allocate_list_cache_entry(int req_size)
#define POOLED_LIST_CACHE_ENTRY_FROM_LIST_CACHE_ENTRY(p)
#define INIT_XASL_NODE_HEADER(X)
int qdata_copy_db_value_to_tuple_value(DB_VALUE *dbval_p, bool clear_compressed_string, char *tuple_val_p, int *tuple_val_size)
static bool qfile_is_first_tuple(QFILE_LIST_ID *list_id_p)
static int qfile_copy_tuple(THREAD_ENTRY *thread_p, QFILE_LIST_ID *to_list_id_p, QFILE_LIST_ID *from_list_id_p)
#define QFILE_GET_TUPLE_COUNT(ptr)
#define QFILE_GET_NEXT_VPID(des, ptr)
int qfile_finalize_list_cache(THREAD_ENTRY *thread_p)
#define NULL_PAGEID_IN_PROGRESS
QFILE_LIST_CACHE_ENTRY * qcache
#define db_private_realloc(thrd, ptr, size)
int SORT_CMP_FUNC(const void *, const void *, void *)
#define QFILE_PUT_TUPLE_LENGTH(tpl, val)
#define VPID_SET_NULL(vpid_ptr)
int qfile_fast_intint_tuple_to_list(THREAD_ENTRY *thread_p, QFILE_LIST_ID *list_id_p, int v1, int v2)
REGU_VARIABLE_LIST valptrp
static int qfile_assign_list_cache(void)
DB_VALUE_COMPARE_RESULT(* sort_f)(void *tplp1, void *tplp2, TP_DOMAIN *dom, int do_coercion, int total_order, int *start_col)
unsigned int lookup_counter
SORT_STATUS SORT_GET_FUNC(THREAD_ENTRY *thread_p, RECDES *, void *)
#define qmgr_free_old_page_and_init(thread_p, page_p, tfile_vfidp)
QFILE_LIST_MERGE_INFO * merge_info
int or_advance(OR_BUF *buf, int offset)
int qfile_clear_list_cache(THREAD_ENTRY *thread_p, int list_ht_no)
int qfile_compare_partial_sort_record(const void *pk0, const void *pk1, void *arg)
static int qfile_add_two_tuple(THREAD_ENTRY *thread_p, QFILE_LIST_ID *dst, QFILE_TUPLE lhs, QFILE_TUPLE rhs)
LF_TRAN_SYSTEM free_sort_list_Ts
#define QFILE_GET_OVERFLOW_PAGE_ID(ptr)
QMGR_QUERY_ENTRY * qmgr_get_query_entry(THREAD_ENTRY *thread_p, QUERY_ID query_id, int tran_index)
int mht_compare_dbvalues_are_equal(const void *key1, const void *key2)
#define TP_DOMAIN_COLLATION_FLAG(dom)
int qfile_add_tuple_to_list(THREAD_ENTRY *thread_p, QFILE_LIST_ID *list_id_p, QFILE_TUPLE tuple)
int qfile_add_tuple_get_pos_in_list(THREAD_ENTRY *thread_p, QFILE_LIST_ID *list_id_p, QFILE_TUPLE tuple, QFILE_TUPLE_POSITION *tuple_pos)