52 BITSET * predset,
int *poslist);
96 QO_PLAN * plan,
bool * is_valid,
int *first_col_idx_pos,
180 PT_NODE *outer_attr, *inner_attr;
181 int i, left_epos, rght_epos, cnt, seg_idx, ncols;
182 int left_nlen, left_elen, rght_nlen, rght_elen, nlen;
240 left_epos = rght_epos = 0;
257 outer_attr = left_elist;
258 left_elist = left_elist->
next;
282 inner_attr = rght_elist;
283 rght_elist = rght_elist->
next;
327 if (prev_order ==
NULL)
333 prev_order->
next = order;
362 if (prev_order ==
NULL)
368 prev_order->
next = order;
381 nlen = ls_merge->
ls_pos_cnt = left_nlen + rght_nlen;
398 for (i = 0; i < left_nlen; i++)
404 for (i = 0; i < nlen - left_nlen; i++)
421 for (i = 0; i < left_elen; i++)
423 left_list = left_list->
next;
426 poslist = (
int *) malloc (left_nlen *
sizeof (
int));
433 for (i = 0; i < left_nlen; i++)
435 poslist[
i] = i + left_elen;
460 for (i = 0; i < rght_elen; i++)
462 rght_list = rght_list->
next;
465 poslist = (
int *) malloc (rght_nlen *
sizeof (
int));
472 for (i = 0; i < rght_nlen; i++)
474 poslist[
i] = i + rght_elen;
578 for (access = xasl->
spec_list; access; access = access->
next)
602 PT_NODE *access_pred, *hash_pred;
613 xasl =
ptqo_to_scan_proc (parser, plan, xasl, spec, key_pred, access_pred, info, hash_pred);
659 PT_NODE *access_pred, *if_pred, *after_join_pred, *instnum_pred;
943 bool free_upper_bound =
false;
954 if (upper_bound ==
NULL)
959 save_next = upper_bound->
next;
963 upper_bound->
next = save_next;
964 if (free_upper_bound)
1200 if (pt_expr ==
NULL)
1205 pointer =
pt_point (parser, pt_expr);
1206 if (pointer ==
NULL)
1219 for (curr = pred_list; curr; curr = curr->
next)
1230 pointer->
next = curr;
1233 pred_list = pointer;
1237 prev->
next = pointer;
1251 pointer->
next = pred_list;
1252 pred_list = pointer;
1256 prev->
next = pointer;
1293 if (key_predp !=
NULL)
1301 if (hash_predp !=
NULL)
1329 if (hash_predp !=
NULL)
1334 if (predp !=
NULL && (key_predp ==
NULL || qo_index_infop ==
NULL))
1342 if (key_predp !=
NULL)
1442 namelistp = &namelist;
1454 namelistp = &name->
next;
1513 for (i = 0; i < ncols; i++)
1570 XASL_NODE *scan, *listfile, *merge, *fetch;
1671 xasl =
gen_outer (env, plan->
plan_un.
sort.subplan, &new_subqueries, inner_scans, fetches, xasl);
1713 xasl =
gen_outer (env, plan->
plan_un.
sort.subplan, &new_subqueries, inner_scans, fetches, xasl);
1766 BITSET term_segs, index_segs;
1773 for (j = 0; j < idx_entryp->
nsegs; j++)
1810 scan =
gen_inner (env, inner, &predset, &new_subqueries, inner_scans, fetches);
1820 xasl =
gen_outer (env, outer, &new_subqueries, scan,
NULL, xasl);
1848 PT_NODE *left_elist, *left_nlist, *left_list, *left;
1849 PT_NODE *rght_elist, *rght_nlist, *rght_list, *rght;
1851 int left_nlen, rght_nlen, seg_nlen;
1853 BITSET plan_segs, temp_segs, left_exprs, rght_exprs;
1861 left_nlist = rght_nlist = left_list =
NULL;
1862 left_elist = rght_elist = rght_list =
NULL;
1865 seg_pos_list =
NULL;
1957 make_mergelist_proc (env, plan, left_xasl, left_list, &left_exprs, left_elist, rght_xasl, rght_list,
1958 &rght_exprs, rght_elist);
2017 if (seg_nlen > 0 && seg_nlen < left_nlen + rght_nlen)
2020 int outer_inner, pos = 0,
p;
2023 seg_pos_list = (
int *) malloc (seg_nlen *
sizeof (
int));
2024 if (seg_pos_list ==
NULL)
2058 for (attr = seg_nlist; attr; attr = attr->
next)
2080 seg_pos_list[
p] =
i;
2332 summary->
xasl = xasl;
2373 if (plan && xasl && (env = (plan->
info)->env))
2416 fprintf (stderr,
"*** XASL generation failed ***\n");
2418 #if defined(CUBRID_DEBUG) 2421 fprintf (stderr,
"*** XASL generation failed ***\n");
2422 fprintf (stderr,
"*** %s ***\n",
er_msg ());
2463 && plan->
plan_un.
scan.index->head->groupby_skip) ?
true :
false;
2602 #if !defined(NDEBUG) 2639 int nterms, nsegs, nkfterms, multi_term_num;;
2646 BITSET multi_col_segs, multi_col_range_segs, index_segs;
2666 index_entryp = (ni_entryp)->head;
2668 nsegs = index_entryp->
nsegs;
2690 if (index_infop ==
NULL)
2707 if (multi_term_num != -1)
2717 else if (!
bitset_subset (&multi_col_range_segs, &multi_col_segs)
2748 index_infop->
nterms = nterms;
2750 index_infop->
multi_col_pos = (
int *) malloc (nterms *
sizeof (
int));
2782 for (j = 0; j < nsegs; j++)
2799 assert (pos >= 0 && pos < nterms);
2800 if (pos < 0 || pos >= nterms)
2819 for (j = 0; j < nsegs; j++)
2833 assert (pos >= 0 && pos < nterms);
2834 if (pos < 0 || pos >= nterms)
2954 class_spec = plan->
plan_un.
scan.node->entity_spec;
3053 node->
var_p = var_p;
3074 else if (var_p->type ==
TYPE_INARITH && var_p->value.arithptr)
3173 regu_low->domain = dom_bigint;
3197 regu_low->domain = dom_bigint;
3216 regu_low->domain = dom_bigint;
3324 if (limit_infop ==
NULL)
3335 limit_infop->
upper = upper->var_p;
3340 if (!limit_infop->
upper)
3360 if (!limit_infop->
lower)
3404 if (upper ==
NULL || (lower !=
NULL && !ignore_lower))
3422 limit_infop->
upper = upper->var_p;
3427 if (!limit_infop->
upper)
3481 bool can_optimize = 0;
3484 bool multi_range_optimize =
false;
3485 int first_col_idx_pos = -1,
i = 0;
3488 bool reverse =
false;
3538 all_distinct = query->info.query.all_distinct;
3546 if (query->info.query.orderby_for ==
NULL)
3555 for (col = order_by; col !=
NULL; col = col->
next)
3584 if (error !=
NO_ERROR || !can_optimize)
3591 if (error !=
NO_ERROR || !can_optimize)
3610 multi_range_optimize =
true;
3612 plan->
plan_un.
scan.index->head->use_descending = reverse;
3613 plan->
plan_un.
scan.index->head->first_sort_column = first_col_idx_pos;
3617 if (orderby_nodes !=
NULL)
3621 return multi_range_optimize;
3648 bool * is_valid,
int *first_col_idx_pos,
bool * reverse)
3650 int i = 0, seg_idx = -1;
3662 *first_col_idx_pos = -1;
3688 orderby_node = orderby_nodes;
3692 orderby_sort_column = orderby_sort_list;
3695 for (i = 0; i < index_entryp->
nsegs; i++, key_type = key_type->
next)
3723 if (i == index_entryp->
nsegs)
3734 *first_col_idx_pos =
i;
3736 for (orderby_node = orderby_nodes->
next, i = i + 1, key_type = key_type->
next, orderby_sort_column =
3737 orderby_sort_list->
next; orderby_node !=
NULL && orderby_sort_column !=
NULL && i < index_entryp->nsegs;
3738 i++, orderby_sort_column = orderby_sort_column->
next, key_type = key_type->
next)
3740 if (key_type ==
NULL)
3750 save_next = orderby_node->
next;
3759 if ((*reverse ? !key_type->is_desc : key_type->is_desc) !=
3766 orderby_node = save_next;
3768 if (orderby_node !=
NULL)
3801 int t,
i, j, pos, s, seg_idx;
3807 int *used_cols =
NULL;
3812 *can_optimize =
false;
3826 if (index_entryp ==
NULL)
3832 if (node_of_plan ==
NULL)
3838 used_cols = (
int *) malloc (first_sort_col_idx *
sizeof (
int));
3843 for (i = 0; i < first_sort_col_idx; i++)
3855 for (i = 0; i < termp->
can_use_index && i < 2 && pos == -1; i++)
3857 for (j = 0; j < index_entryp->
nsegs; j++)
3872 if (pos < first_sort_col_idx)
3921 for (i = 0; i < termp->
can_use_index && i < 2 && pos == -1; i++)
3923 for (j = 0; j < index_entryp->
nsegs; j++)
3942 if (pos < first_sort_col_idx)
3953 for (i = 0; i < first_sort_col_idx; i++)
3955 if (used_cols[i] == 0)
3964 for (t = 0; t < env->
nterms; t++)
3981 for (i = 0; i < index_entryp->
nsegs; i++)
3983 if (seg_idx == index_entryp->
seg_idxs[i])
3997 *can_optimize =
true;
4021 int i, s, t, seg_idx, i_seg_idx, ts;
4051 for (i = 0; i < sort_col_idx_pos; i++)
4053 i_seg_idx = plan->
plan_un.
scan.index->head->seg_idxs[
i];
4054 if (i_seg_idx == seg_idx)
4219 bool can_optimize =
true;
4249 if (error !=
NO_ERROR || !can_optimize)
4306 if (*is_valid ==
true)
4312 if (plan == sortplan)
4338 if (error !=
NO_ERROR || !*is_valid)
4345 if (error !=
NO_ERROR || !*is_valid)
4388 int t, n, seg_idx, k, k_seg_idx;
4390 bool is_jterm_relevant;
4401 node_of_sort_table = sort_plan->
plan_un.
scan.node;
4417 is_jterm_relevant =
false;
4424 if (jn == node_of_subplan)
4426 is_jterm_relevant =
true;
4431 if (!is_jterm_relevant)
4442 if (jn != node_of_sort_table)
4453 if (seg_node != node_of_sort_table)
4458 for (k = 0; k < sort_plan->
plan_un.
scan.index->head->first_sort_column; k++)
4460 k_seg_idx = sort_plan->
plan_un.
scan.index->head->seg_idxs[k];
4461 if (k_seg_idx == seg_idx)
4503 int eq_idx, t, k, seg_idx, k_seg_idx;
4505 bool is_eqclass_relevant =
false;
4518 node_of_sort_table = sort_plan->
plan_un.
scan.node;
4521 for (eq_idx = 0; eq_idx < env->
neqclasses; eq_idx++)
4524 is_eqclass_relevant =
false;
4529 if (node == node_of_crt_table)
4531 is_eqclass_relevant =
true;
4536 if (!is_eqclass_relevant)
4547 if (node != node_of_sort_table)
4556 for (k = 0; k < sort_plan->
plan_un.
scan.index->head->first_sort_column; k++)
4558 k_seg_idx = sort_plan->
plan_un.
scan.index->head->seg_idxs[k];
4559 if (k_seg_idx == seg_idx)
4611 if (join_idx !=
NULL)
4620 if (join_idx !=
NULL)
4654 PT_NODE *order_by, *statement;
4684 if (node_list ==
NULL)
4692 if (new_order_by ==
NULL)
4705 if (node_list !=
NULL)
4709 if (new_order_by !=
NULL)
4739 bool free_left =
false, free_right =
false;
4740 *is_new_node =
false;
4753 save_next = orderby_for->
next;
4762 orderby_for->
next = save_next;
4779 *is_new_node = free_left;
4786 *is_new_node = free_right;
4844 if (new_node ==
NULL)
4864 *is_new_node =
true;
4890 int multi_term = -1;
bool qo_check_join_for_multi_range_opt(QO_PLAN *plan)
QPROC_SINGLE_FETCH single_fetch
PT_NODE * pt_get_numbering_node_etc(PARSER_CONTEXT *parser, PT_NODE *node, void *arg, int *continue_walk)
PT_NODE ** qo_xasl_get_terms(QO_XASL_INDEX_INFO *info)
#define pt_is_expr_node(n)
bool qo_is_iscan(QO_PLAN *plan)
static XASL_NODE * add_scan_proc(QO_ENV *env, XASL_NODE *xasl, XASL_NODE *scan)
OUTPTR_LIST * outptr_list
bool qo_is_index_loose_scan(QO_PLAN *plan)
ACCESS_SPEC_TYPE * pt_to_spec_list(PARSER_CONTEXT *parser, PT_NODE *spec, PT_NODE *where_key_part, PT_NODE *where_part, QO_PLAN *plan, QO_XASL_INDEX_INFO *index_part, PT_NODE *src_derived_tbl, PT_NODE *where_hash_part)
#define QO_TERM_SUBQUERIES(t)
QFILE_TUPLE_VALUE_POSITION pos_descr
#define ER_FAILED_ASSERTION
static XASL_NODE * make_fetch_proc(QO_ENV *env, QO_PLAN *plan)
#define QO_TERM_MULTI_COLL_PRED
struct qo_plan::@100::@103 sort
PT_NODE * pt_set_orderby_for_sort_limit_plan(PARSER_CONTEXT *parser, PT_NODE *statement, PT_NODE *nodes_list)
struct qo_summary * qo_summary
#define XASL_CLEAR_FLAG(x, f)
XASL_NODE * ptqo_to_list_scan_proc(PARSER_CONTEXT *parser, XASL_NODE *xasl, PROC_TYPE proc_type, XASL_NODE *listfile, PT_NODE *namelist, PT_NODE *pred, int *poslist)
SORT_LIST * ptqo_single_orderby(PARSER_CONTEXT *parser)
static void regu_ptr_list_free(REGU_PTR_LIST list)
static PT_NODE * qo_get_orderby_num_upper_bound_node(PARSER_CONTEXT *parser, PT_NODE *orderby_for, bool *is_new_node)
void qo_get_optimization_param(void *, QO_PARAM,...)
#define QO_ASSERT(env, cond)
void * parser_alloc(const PARSER_CONTEXT *parser, const int length)
bool qo_check_iscan_for_multi_range_opt(QO_PLAN *plan)
#define QO_TERM_IS_FLAGED(t, f)
bool qo_is_iscan_from_orderby(QO_PLAN *plan)
static XASL_NODE * add_uncorrelated(QO_ENV *env, XASL_NODE *xasl, XASL_NODE *sub)
int bitset_intersects(const BITSET *r, const BITSET *s)
void qo_expr_segs(QO_ENV *env, PT_NODE *pt_expr, BITSET *result)
PRED_EXPR * pt_to_pred_expr_with_arg(PARSER_CONTEXT *parser, PT_NODE *node_list, int *argp)
int bitset_iterate(const BITSET *s, BITSET_ITERATOR *si)
#define QO_ENV_PARSER(env)
#define IS_OUTER_JOIN_TYPE(t)
bool multi_range_opt_candidate
struct tp_domain * setdomain
union xasl_node::@155 proc
PT_NODE * pt_get_select_list(PARSER_CONTEXT *parser, PT_NODE *query)
bool qo_is_interesting_order_scan(QO_PLAN *plan)
SORT_LIST * pt_to_orderby(PARSER_CONTEXT *parser, PT_NODE *order_list, PT_NODE *root)
static void make_outer_instnum(QO_ENV *env, QO_PLAN *outer, QO_PLAN *plan)
static bool qo_check_seg_belongs_to_range_term(QO_PLAN *subplan, QO_ENV *env, int seg_idx)
QFILE_LIST_MERGE_INFO ls_merge
int bitset_is_empty(const BITSET *s)
#define assert_release(e)
XASL_NODE * pt_skeleton_buildlist_proc(PARSER_CONTEXT *parser, PT_NODE *namelist)
static PT_NODE * make_if_pred_from_plan(QO_ENV *env, QO_PLAN *plan)
void pt_set_isleaf_node_etc(PARSER_CONTEXT *parser, PT_NODE *node_list, DB_VALUE **isleaf_valp)
void bitset_difference(BITSET *dst, const BITSET *src)
#define QO_TERM_PT_EXPR(t)
REGU_VARIABLE * orderby_limit
#define QO_ENV_SUBQUERY(env, n)
static int is_normal_access_term(QO_TERM *)
union pt_query_info::@124 q
char * pt_alloc_packing_buf(int size)
PT_NODE * pt_right_part(const PT_NODE *expr)
static int is_totally_after_join_term(QO_TERM *)
static REGU_PTR_LIST regu_ptr_list_create()
SM_FUNCTION_INFO * func_index_info
void pt_set_level_node_etc(PARSER_CONTEXT *parser, PT_NODE *node_list, DB_VALUE **level_valp)
MERGELIST_PROC_NODE mergelist
XASL_NODE * ptqo_to_scan_proc(PARSER_CONTEXT *parser, QO_PLAN *plan, XASL_NODE *xasl, PT_NODE *spec, PT_NODE *where_key_part, PT_NODE *where_part, QO_XASL_INDEX_INFO *info, PT_NODE *where_hash_part)
SM_CLASS_CONSTRAINT * constraints
bool qo_is_seq_scan(QO_PLAN *plan)
static XASL_NODE * add_after_join_predicate(QO_ENV *, XASL_NODE *, PT_NODE *)
#define QO_TERM_MULTI_COLL_CONST
struct qo_plan::@100::@104 join
static void qo_free_xasl_index_info(QO_ENV *env, QO_XASL_INDEX_INFO *info)
ACCESS_SPEC_TYPE * inner_spec_list
PT_NODE * qo_plan_iscan_sort_list(QO_PLAN *plan)
static XASL_NODE * init_class_scan_proc(QO_ENV *env, XASL_NODE *xasl, QO_PLAN *plan)
static bool qo_get_limit_from_eval_term(PARSER_CONTEXT *parser, PRED_EXPR *pred, REGU_PTR_LIST *lower, REGU_PTR_LIST *upper)
static int qo_check_subplans_for_multi_range_opt(QO_PLAN *parent, QO_PLAN *plan, QO_PLAN *sortplan, bool *is_valid, bool *seen)
static XASL_NODE * add_access_spec(QO_ENV *, XASL_NODE *, QO_PLAN *)
static bool qo_check_parent_eq_class_for_multi_range_opt(QO_PLAN *parent, QO_PLAN *subplan, QO_PLAN *sort_plan)
void pt_set_connect_by_operator_node_etc(PARSER_CONTEXT *parser, PT_NODE *node_list, XASL_NODE *xasl)
#define PT_PRED_ARG_ORDBYNUM_CONTINUE
PRED_EXPR * ordbynum_pred
TP_DOMAIN * pt_xasl_node_to_domain(PARSER_CONTEXT *parser, const PT_NODE *node)
static XASL_NODE * check_merge_xasl(QO_ENV *env, XASL_NODE *xasl)
int(* ELIGIBILITY_FN)(QO_TERM *)
int qo_find_subplan_using_multi_range_opt(QO_PLAN *plan, QO_PLAN **result, int *join_idx)
static XASL_NODE * add_if_predicate(QO_ENV *, XASL_NODE *, PT_NODE *)
static int qo_check_terms_for_multiple_range_opt(QO_PLAN *plan, int first_sort_col_idx, bool *can_optimize)
bool qo_is_iscan_from_groupby(QO_PLAN *plan)
XASL_NODE * pt_remove_xasl(XASL_NODE *xasl_list, XASL_NODE *remove)
static void mark_access_as_outer_join(PARSER_CONTEXT *parser, XASL_NODE *xasl)
static XASL_NODE * make_buildlist_proc(QO_ENV *env, PT_NODE *namelist)
regu_variable_node * lower
bool qo_plan_skip_groupby(QO_PLAN *plan)
TP_DOMAIN * tp_domain_resolve_default(DB_TYPE type)
void er_set(int severity, const char *file_name, const int line_no, int err_id, int num_args,...)
static int is_follow_if_term(QO_TERM *)
int bitset_subset(const BITSET *r, const BITSET *s)
cubxasl::pred_expr * pred
static XASL_NODE * preserve_info(QO_ENV *env, QO_PLAN *plan, XASL_NODE *xasl)
#define CAST_POINTER_TO_NODE(p)
static bool qo_validate_regu_var_for_limit(REGU_VARIABLE *var_p)
static bool qo_check_subqueries_for_multi_range_opt(QO_PLAN *plan, int sort_col_idx_pos)
void bitset_delset(BITSET *s)
static int path_access_term(QO_TERM *term)
void bitset_assign(BITSET *dst, const BITSET *src)
static XASL_NODE * make_sort_limit_proc(QO_ENV *env, QO_PLAN *plan, PT_NODE *namelist, XASL_NODE *xasl)
#define QO_IS_PATH_TERM(t)
void bitset_union(BITSET *dst, const BITSET *src)
#define ER_OUT_OF_VIRTUAL_MEMORY
QO_SEGMENT * index_seg[2]
static void make_pred_from_plan(QO_ENV *env, QO_PLAN *plan, PT_NODE **key_access_pred, PT_NODE **access_pred, QO_XASL_INDEX_INFO *qo_index_infop, PT_NODE **hash_pred)
union cubxasl::pred_expr::@185 pe
struct qo_plan::@100::@105 follow
#define QO_NODE_IS_CLASS_HIERARCHY(node)
PT_NODE * parser_copy_tree(PARSER_CONTEXT *parser, const PT_NODE *tree)
#define PT_IS_VALUE_QUERY(n)
bool qo_plan_multi_range_opt(QO_PLAN *plan)
QO_LIMIT_INFO * qo_get_key_limit_from_instnum(PARSER_CONTEXT *parser, QO_PLAN *plan, xasl_node *xasl)
static bool qo_get_limit_from_instnum_pred(PARSER_CONTEXT *parser, PRED_EXPR *pred, REGU_PTR_LIST *lower, REGU_PTR_LIST *upper)
union qo_plan::@100 plan_un
static bool qo_check_subplan_join_cond_for_multi_range_opt(QO_PLAN *parent, QO_PLAN *subplan, QO_PLAN *sort_plan)
#define TP_DOMAIN_TYPE(dom)
XASL_NODE * pt_to_fetch_proc(PARSER_CONTEXT *parser, PT_NODE *spec, PT_NODE *pred)
static PT_NODE * make_namelist_from_projected_segs(QO_ENV *env, QO_PLAN *plan)
static void cleanup(int signo)
#define PT_SET_VALUE_QUERY(n)
xasl_node * qo_add_hq_iterations_access_spec(QO_PLAN *plan, xasl_node *xasl)
XASL_NODE * pt_append_xasl(XASL_NODE *to, XASL_NODE *from_list)
const char * er_msg(void)
bool use_iscan_descending
bool pt_check_ordby_num_for_multi_range_opt(PARSER_CONTEXT *parser, PT_NODE *query, bool *mro_candidate, bool *cannot_eval)
QFILE_TUPLE_VALUE_POSITION pos_descr
static XASL_NODE * add_sort_spec(QO_ENV *, XASL_NODE *, QO_PLAN *, DB_VALUE *, bool)
XASL_NODE * pt_gen_simple_merge_plan(PARSER_CONTEXT *parser, PT_NODE *select_node, QO_PLAN *plan, XASL_NODE *xasl)
int * ls_outer_inner_list
void bitset_intersect(BITSET *dst, const BITSET *src)
#define QO_SEG_PT_NODE(seg)
QO_PLAN_ULTI_RANGE_OPT_USE multi_range_opt_use
XASL_NODE * pt_to_instnum_pred(PARSER_CONTEXT *parser, XASL_NODE *xasl, PT_NODE *pred)
#define db_private_free(thrd, ptr)
static int is_after_join_term(QO_TERM *)
int pt_find_attribute(PARSER_CONTEXT *parser, const PT_NODE *name, const PT_NODE *attributes)
#define db_private_alloc(thrd, size)
bool qo_is_index_iss_scan(QO_PLAN *plan)
static PT_NODE * make_pred_from_bitset(QO_ENV *env, BITSET *predset, ELIGIBILITY_FN safe)
bool qo_is_index_covering_scan(QO_PLAN *plan)
QO_LIMIT_INFO * qo_get_key_limit_from_ordbynum(PARSER_CONTEXT *parser, QO_PLAN *plan, xasl_node *xasl, bool ignore_lower)
static PT_NODE * make_instnum_pred_from_plan(QO_ENV *env, QO_PLAN *plan)
bool pt_has_aggregate(PARSER_CONTEXT *parser, PT_NODE *node)
bool qo_plan_skip_orderby(QO_PLAN *plan)
static int is_normal_if_term(QO_TERM *)
int bitset_next_member(BITSET_ITERATOR *si)
PT_NODE * pt_make_integer_value(PARSER_CONTEXT *parser, const int value_int)
static REGU_PTR_LIST regu_ptr_list_add_regu(REGU_VARIABLE *var_p, REGU_PTR_LIST list)
PRED_EXPR * after_join_pred
PT_NODE * parser_append_node(PT_NODE *node, PT_NODE *list)
static XASL_NODE * gen_outer(QO_ENV *, QO_PLAN *, BITSET *, XASL_NODE *, XASL_NODE *, XASL_NODE *)
PT_NODE * parser_new_node(PARSER_CONTEXT *parser, PT_NODE_TYPE node_type)
static void error(const char *msg)
#define QO_ENTRY_MULTI_COL(entry)
void parser_free_node(const PARSER_CONTEXT *parser, PT_NODE *node)
#define XASL_SKIP_ORDERBY_LIST
VAL_LIST * pt_to_val_list(PARSER_CONTEXT *parser, UINTPTR id)
bool need_copy_to_sarg_term
struct regu_ptr_list_node * REGU_PTR_LIST
PT_SORT_SPEC_INFO sort_spec
bool qo_is_prefix_index(QO_INDEX_ENTRY *ent)
regu_variable_node * upper
struct qo_plan::@100::@102 scan
#define QO_TERM_SELECTIVITY(t)
bool pt_name_equal(PARSER_CONTEXT *parser, const PT_NODE *name1, const PT_NODE *name2)
VAL_LIST * outer_val_list
void parser_free_tree(PARSER_CONTEXT *parser, PT_NODE *tree)
PT_NODE * iscan_sort_list
#define QO_TERM_NON_IDX_SARG_COLL
void pt_set_dptr(PARSER_CONTEXT *parser, PT_NODE *node, XASL_NODE *xasl, UINTPTR id)
static int qo_check_plan_index_for_multi_range_opt(PT_NODE *orderby_nodes, PT_NODE *orderby_sort_list, QO_PLAN *plan, bool *is_valid, int *first_col_idx_pos, bool *reverse)
#define QO_IS_FAKE_TERM(t)
#define free_and_init(ptr)
ACCESS_SPEC_TYPE * spec_list
#define PT_IS_EXPR_NODE(n)
#define BITSET_MEMBER(s, x)
REGU_VARIABLE * pt_make_regu_arith(const REGU_VARIABLE *arg1, const REGU_VARIABLE *arg2, const REGU_VARIABLE *arg3, const OPERATOR_TYPE op, const TP_DOMAIN *domain)
PT_NODE * pt_point(PARSER_CONTEXT *parser, const PT_NODE *in_tree)
PRED_EXPR * pt_to_pred_expr(PARSER_CONTEXT *parser, PT_NODE *node)
class regu_variable_node REGU_VARIABLE
static XASL_NODE * add_subqueries(QO_ENV *env, XASL_NODE *xasl, BITSET *)
#define QO_ENV_NODE(env, n)
#define QO_ENV_EQCLASS(env, n)
#define QO_ENV_TERM(env, n)
#define QO_ENV_SEG(env, n)
struct qo_node_index_entry * ni_entry
static int bitset_has_path(QO_ENV *env, BITSET *predset)
void pt_set_iscycle_node_etc(PARSER_CONTEXT *parser, PT_NODE *node_list, DB_VALUE **iscycle_valp)
static QO_XASL_INDEX_INFO * qo_get_xasl_index_info(QO_ENV *env, QO_PLAN *plan)
void bitset_init(BITSET *s, QO_ENV *env)
#define PT_SPEC_SPECIAL_INDEX_SCAN(spec_)
static XASL_NODE * gen_inner(QO_ENV *, QO_PLAN *, BITSET *, BITSET *, XASL_NODE *, XASL_NODE *)
#define pt_is_function(n)
int bitset_cardinality(const BITSET *s)
static XASL_NODE * add_fetch_proc(QO_ENV *env, XASL_NODE *xasl, XASL_NODE *proc)
bool qo_is_index_mro_scan(QO_PLAN *plan)
void pt_set_qprior_node_etc(PARSER_CONTEXT *parser, PT_NODE *node_list, XASL_NODE *xasl)
#define XASL_ORDBYNUM_FLAG_SCAN_CONTINUE
int need_copy_multi_range_term
static XASL_NODE * init_list_scan_proc(QO_ENV *env, XASL_NODE *xasl, XASL_NODE *list, PT_NODE *namelist, BITSET *predset, int *poslist)
bool qo_is_filter_index(QO_INDEX_ENTRY *ent)
#define QO_ENV_PT_TREE(env)
static int is_always_true(QO_TERM *)
#define QO_NODE_ENTITY_SPEC(node)
union cubxasl::eval_term::@184 et
int bitset_first_member(const BITSET *s)
PT_NODE * pt_left_part(const PT_NODE *expr)
#define QO_NODE_SEGS(node)
QPROC_SINGLE_FETCH single_fetch
void bitset_add(BITSET *dst, int x)
ACCESS_SPEC_TYPE * outer_spec_list
int pt_length_of_list(const PT_NODE *list)
static int qo_get_multi_col_range_segs(QO_ENV *env, QO_PLAN *plan, QO_INDEX_ENTRY *index_entryp, BITSET *multi_col_segs, BITSET *multi_col_range_segs, BITSET *index_segs)
VAL_LIST * inner_val_list
#define PLAN_DUMP_ENABLED(level)
static XASL_NODE * make_scan_proc(QO_ENV *env)
PT_NODE * parser_walk_tree(PARSER_CONTEXT *parser, PT_NODE *node, PT_NODE_WALK_FUNCTION pre_function, void *pre_argument, PT_NODE_WALK_FUNCTION post_function, void *post_argument)
#define PT_IS_NAME_NODE(n)
PT_NODE * parser_copy_tree_list(PARSER_CONTEXT *parser, PT_NODE *tree)
xasl_node * qo_to_xasl(QO_PLAN *plan, xasl_node *xasl)
REGU_VARIABLE * pt_to_regu_variable(PARSER_CONTEXT *parser, PT_NODE *node, UNBOX unbox)
XASL_NODE * ptqo_to_merge_list_proc(PARSER_CONTEXT *parser, XASL_NODE *left, XASL_NODE *right, JOIN_TYPE join_type)
#define QO_EQCLASS_SEGS(e)
static XASL_NODE * make_mergelist_proc(QO_ENV *env, QO_PLAN *plan, XASL_NODE *left, PT_NODE *left_list, BITSET *left_exprs, PT_NODE *left_elist, XASL_NODE *rght, PT_NODE *rght_list, BITSET *rght_exprs, PT_NODE *rght_elist)
int qo_xasl_get_num_terms(QO_XASL_INDEX_INFO *info)
static int path_if_term(QO_TERM *term)