Skip to content

File plan_generation.c

FileList > cubrid > src > optimizer > plan_generation.c

Go to the source code of this file

  • #include <assert.h>
  • #include "optimizer.h"
  • #include "config.h"
  • #include "object_primitive.h"
  • #include "query_bitset.h"
  • #include "query_graph.h"
  • #include "query_planner.h"
  • #include "parser.h"
  • #include "parser_support.h"
  • #include "system_parameter.h"
  • #include "xasl.h"
  • #include "xasl_generation.h"
  • #include "xasl_predicate.hpp"

Public Types

Type Name
typedef int(* ELIGIBILITY_FN

Public Functions

Type Name
xasl_node * qo_add_hq_iterations_access_spec (QO_PLAN * plan, xasl_node * xasl)
bool qo_check_iscan_for_multi_range_opt (QO_PLAN * plan)
bool qo_check_join_for_multi_range_opt (QO_PLAN * plan)
int qo_find_subplan_using_multi_range_opt (QO_PLAN * plan, QO_PLAN ** result, int * join_idx)
QO_LIMIT_INFO * qo_get_key_limit_from_instnum (PARSER_CONTEXT * parser, QO_PLAN * plan, xasl_node * xasl)
QO_LIMIT_INFO * qo_get_key_limit_from_ordbynum (PARSER_CONTEXT * parser, QO_PLAN * plan, xasl_node * xasl, bool ignore_lower)
bool qo_is_index_covering_scan (QO_PLAN * plan)
bool qo_is_index_iss_scan (QO_PLAN * plan)
bool qo_is_index_loose_scan (QO_PLAN * plan)
bool qo_is_index_mro_scan (QO_PLAN * plan)
PT_NODE * qo_plan_iscan_sort_list (QO_PLAN * plan)
bool qo_plan_multi_range_opt (QO_PLAN * plan)
bool qo_plan_skip_groupby (QO_PLAN * plan)
bool qo_plan_skip_orderby (QO_PLAN * plan)
xasl_node * qo_to_xasl (QO_PLAN * plan, xasl_node * xasl)
int qo_xasl_get_num_terms (QO_XASL_INDEX_INFO * info)
PT_NODE ** qo_xasl_get_terms (QO_XASL_INDEX_INFO * info)

Public Static Functions

Type Name
XASL_NODE * add_access_spec (QO_ENV * env, XASL_NODE * xasl, QO_PLAN * plan)
XASL_NODE * add_after_join_predicate (QO_ENV * env, XASL_NODE * xasl, PT_NODE * pred)
XASL_NODE * add_during_join_predicate (QO_ENV * env, XASL_NODE * xasl, PT_NODE * pred)
XASL_NODE * add_fetch_proc (QO_ENV * env, XASL_NODE * xasl, XASL_NODE * proc)
XASL_NODE * add_if_predicate (QO_ENV * env, XASL_NODE * xasl, PT_NODE * pred)
XASL_NODE * add_scan_proc (QO_ENV * env, XASL_NODE * xasl, XASL_NODE * scan)
XASL_NODE * add_sort_spec (QO_ENV * env, XASL_NODE * xasl, QO_PLAN * plan, DB_VALUE * ordby_val, bool instnum_flag)
XASL_NODE * add_subqueries (QO_ENV * env, XASL_NODE * xasl, BITSET * subqueries)
XASL_NODE * add_uncorrelated (QO_ENV * env, XASL_NODE * xasl, XASL_NODE * sub)
int bitset_has_path (QO_ENV * env, BITSET * predset)
XASL_NODE * check_hashjoin_xasl (QO_ENV * env, XASL_NODE * xasl)
XASL_NODE * check_merge_xasl (QO_ENV * env, XASL_NODE * xasl)
XASL_NODE * gen_hashjoin (QO_ENV * env, QO_PLAN * plan, BITSET * pred_set, BITSET * subqueries, XASL_NODE * inner_scans, XASL_NODE * fetches, XASL_NODE * xasl)
XASL_NODE * gen_inner (QO_ENV * env, QO_PLAN * plan, BITSET * predset, BITSET * subqueries, XASL_NODE * inner_scans, XASL_NODE * fetches)
XASL_NODE * gen_outer (QO_ENV * env, QO_PLAN * plan, BITSET * subqueries, XASL_NODE * inner_scans, XASL_NODE * fetches, XASL_NODE * xasl)
XASL_NODE * init_class_scan_proc (QO_ENV * env, XASL_NODE * xasl, QO_PLAN * plan)
XASL_NODE * init_list_scan_proc (QO_ENV * env, XASL_NODE * xasl, XASL_NODE * list, PT_NODE * namelist, BITSET * predset, int * poslist)
int is_after_join_term (QO_TERM * term)
int is_always_true (QO_TERM * term)
int is_follow_if_term (QO_TERM * term)
int is_normal_access_term (QO_TERM * term)
int is_normal_if_term (QO_TERM * term)
int is_totally_after_join_term (QO_TERM * term)
XASL_NODE * make_buildlist_proc (QO_ENV * env, PT_NODE * namelist)
XASL_NODE * make_fetch_proc (QO_ENV * env, QO_PLAN * plan)
XASL_NODE * make_hashjoin_proc (QO_ENV * env, QO_PLAN * plan, XASL_NODE * outer_xasl, XASL_NODE * inner_xasl, PROJECTION_INFO * projection_info)
PT_NODE * make_if_pred_from_plan (QO_ENV * env, QO_PLAN * plan)
PT_NODE * make_instnum_pred_from_plan (QO_ENV * env, QO_PLAN * plan)
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)
PT_NODE * make_namelist_from_bitset (QO_ENV * env, BITSET * bitset)
PT_NODE * make_namelist_from_projected_segs (QO_ENV * env, QO_PLAN * plan)
void make_outer_instnum (QO_ENV * env, QO_PLAN * outer, QO_PLAN * plan)
PT_NODE * make_pred_from_bitset (QO_ENV * env, BITSET * predset, ELIGIBILITY_FN safe)
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)
XASL_NODE * make_scan_proc (QO_ENV * env)
XASL_NODE * make_sort_limit_proc (QO_ENV * env, QO_PLAN * plan, PT_NODE * namelist, XASL_NODE * xasl)
void mark_access_as_outer_join (PARSER_CONTEXT * parser, XASL_NODE * xasl)
int path_access_term (QO_TERM * term)
int path_if_term (QO_TERM * term)
XASL_NODE * preserve_info (QO_ENV * env, QO_PLAN * plan, XASL_NODE * xasl)
bool qo_check_parent_eq_class_for_multi_range_opt (QO_PLAN * parent, QO_PLAN * subplan, QO_PLAN * sort_plan)
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)
bool qo_check_seg_belongs_to_range_term (QO_PLAN * subplan, QO_ENV * env, int seg_idx)
bool qo_check_subplan_join_cond_for_multi_range_opt (QO_PLAN * parent, QO_PLAN * subplan, QO_PLAN * sort_plan)
int qo_check_subplans_for_multi_range_opt (QO_PLAN * parent, QO_PLAN * plan, QO_PLAN * sortplan, bool * is_valid, bool * seen)
bool qo_check_subqueries_for_multi_range_opt (QO_PLAN * plan, int sort_col_idx_pos)
int qo_check_terms_for_multiple_range_opt (QO_PLAN * plan, int first_sort_col_idx, bool * can_optimize)
void qo_clear_projection_final_info (PARSER_CONTEXT * parser, PROJECTION_FINAL_INFO * final_info)
void qo_clear_projection_info (QO_ENV * env, PROJECTION_INFO * info)
void qo_clear_projection_part_info (PARSER_CONTEXT * parser, PROJECTION_PART_INFO * part_info)
void qo_free_xasl_index_info (QO_ENV * env, QO_XASL_INDEX_INFO * info)
bool qo_get_limit_from_eval_term (PARSER_CONTEXT * parser, PRED_EXPR * pred, REGU_PTR_LIST * lower, REGU_PTR_LIST * upper)
bool qo_get_limit_from_instnum_pred (PARSER_CONTEXT * parser, PRED_EXPR * pred, REGU_PTR_LIST * lower, REGU_PTR_LIST * upper)
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)
PT_NODE * qo_get_orderby_num_upper_bound_node (PARSER_CONTEXT * parser, PT_NODE * orderby_for, bool * is_new_node)
QO_XASL_INDEX_INFO * qo_get_xasl_index_info (QO_ENV * env, QO_PLAN * plan)
int qo_init_merge_info (QO_ENV * env, QO_PLAN * plan, PROJECTION_INFO * projection_info, QFILE_LIST_MERGE_INFO * merge_info)
int qo_init_projection_info (QO_ENV * env, QO_PLAN * plan, BITSET * pred_set, PROJECTION_INFO * info)
bool qo_validate_regu_var_for_limit (REGU_VARIABLE * var_p)
REGU_PTR_LIST regu_ptr_list_add_regu (REGU_VARIABLE * var_p, REGU_PTR_LIST list)
REGU_PTR_LIST regu_ptr_list_create ()
void regu_ptr_list_free (REGU_PTR_LIST list)

Public Types Documentation

typedef ELIGIBILITY_FN

typedef int(* ELIGIBILITY_FN) (QO_TERM *);

Public Functions Documentation

function qo_add_hq_iterations_access_spec

xasl_node * qo_add_hq_iterations_access_spec (
    QO_PLAN * plan,
    xasl_node * xasl
) 

function qo_check_iscan_for_multi_range_opt

bool qo_check_iscan_for_multi_range_opt (
    QO_PLAN * plan
) 

function qo_check_join_for_multi_range_opt

bool qo_check_join_for_multi_range_opt (
    QO_PLAN * plan
) 

function qo_find_subplan_using_multi_range_opt

int qo_find_subplan_using_multi_range_opt (
    QO_PLAN * plan,
    QO_PLAN ** result,
    int * join_idx
) 

function qo_get_key_limit_from_instnum

QO_LIMIT_INFO * qo_get_key_limit_from_instnum (
    PARSER_CONTEXT * parser,
    QO_PLAN * plan,
    xasl_node * xasl
) 

function qo_get_key_limit_from_ordbynum

QO_LIMIT_INFO * qo_get_key_limit_from_ordbynum (
    PARSER_CONTEXT * parser,
    QO_PLAN * plan,
    xasl_node * xasl,
    bool ignore_lower
) 

function qo_is_index_covering_scan

bool qo_is_index_covering_scan (
    QO_PLAN * plan
) 

function qo_is_index_iss_scan

bool qo_is_index_iss_scan (
    QO_PLAN * plan
) 

function qo_is_index_loose_scan

bool qo_is_index_loose_scan (
    QO_PLAN * plan
) 

function qo_is_index_mro_scan

bool qo_is_index_mro_scan (
    QO_PLAN * plan
) 

function qo_plan_iscan_sort_list

PT_NODE * qo_plan_iscan_sort_list (
    QO_PLAN * plan
) 

function qo_plan_multi_range_opt

bool qo_plan_multi_range_opt (
    QO_PLAN * plan
) 

function qo_plan_skip_groupby

bool qo_plan_skip_groupby (
    QO_PLAN * plan
) 

function qo_plan_skip_orderby

bool qo_plan_skip_orderby (
    QO_PLAN * plan
) 

function qo_to_xasl

xasl_node * qo_to_xasl (
    QO_PLAN * plan,
    xasl_node * xasl
) 

function qo_xasl_get_num_terms

int qo_xasl_get_num_terms (
    QO_XASL_INDEX_INFO * info
) 

function qo_xasl_get_terms

PT_NODE ** qo_xasl_get_terms (
    QO_XASL_INDEX_INFO * info
) 

Public Static Functions Documentation

function add_access_spec

static XASL_NODE * add_access_spec (
    QO_ENV * env,
    XASL_NODE * xasl,
    QO_PLAN * plan
) 

function add_after_join_predicate

static XASL_NODE * add_after_join_predicate (
    QO_ENV * env,
    XASL_NODE * xasl,
    PT_NODE * pred
) 

function add_during_join_predicate

static XASL_NODE * add_during_join_predicate (
    QO_ENV * env,
    XASL_NODE * xasl,
    PT_NODE * pred
) 

function add_fetch_proc

static XASL_NODE * add_fetch_proc (
    QO_ENV * env,
    XASL_NODE * xasl,
    XASL_NODE * proc
) 

function add_if_predicate

static XASL_NODE * add_if_predicate (
    QO_ENV * env,
    XASL_NODE * xasl,
    PT_NODE * pred
) 

function add_scan_proc

static XASL_NODE * add_scan_proc (
    QO_ENV * env,
    XASL_NODE * xasl,
    XASL_NODE * scan
) 

function add_sort_spec

static XASL_NODE * add_sort_spec (
    QO_ENV * env,
    XASL_NODE * xasl,
    QO_PLAN * plan,
    DB_VALUE * ordby_val,
    bool instnum_flag
) 

function add_subqueries

static XASL_NODE * add_subqueries (
    QO_ENV * env,
    XASL_NODE * xasl,
    BITSET * subqueries
) 

function add_uncorrelated

static XASL_NODE * add_uncorrelated (
    QO_ENV * env,
    XASL_NODE * xasl,
    XASL_NODE * sub
) 

function bitset_has_path

static int bitset_has_path (
    QO_ENV * env,
    BITSET * predset
) 

function check_hashjoin_xasl

static XASL_NODE * check_hashjoin_xasl (
    QO_ENV * env,
    XASL_NODE * xasl
) 

function check_merge_xasl

static XASL_NODE * check_merge_xasl (
    QO_ENV * env,
    XASL_NODE * xasl
) 

function gen_hashjoin

static XASL_NODE * gen_hashjoin (
    QO_ENV * env,
    QO_PLAN * plan,
    BITSET * pred_set,
    BITSET * subqueries,
    XASL_NODE * inner_scans,
    XASL_NODE * fetches,
    XASL_NODE * xasl
) 

function gen_inner

static XASL_NODE * gen_inner (
    QO_ENV * env,
    QO_PLAN * plan,
    BITSET * predset,
    BITSET * subqueries,
    XASL_NODE * inner_scans,
    XASL_NODE * fetches
) 

function gen_outer

static XASL_NODE * gen_outer (
    QO_ENV * env,
    QO_PLAN * plan,
    BITSET * subqueries,
    XASL_NODE * inner_scans,
    XASL_NODE * fetches,
    XASL_NODE * xasl
) 

function init_class_scan_proc

static XASL_NODE * init_class_scan_proc (
    QO_ENV * env,
    XASL_NODE * xasl,
    QO_PLAN * plan
) 

function init_list_scan_proc

static XASL_NODE * init_list_scan_proc (
    QO_ENV * env,
    XASL_NODE * xasl,
    XASL_NODE * list,
    PT_NODE * namelist,
    BITSET * predset,
    int * poslist
) 

function is_after_join_term

static int is_after_join_term (
    QO_TERM * term
) 

function is_always_true

static int is_always_true (
    QO_TERM * term
) 

function is_follow_if_term

static int is_follow_if_term (
    QO_TERM * term
) 

function is_normal_access_term

static int is_normal_access_term (
    QO_TERM * term
) 

function is_normal_if_term

static int is_normal_if_term (
    QO_TERM * term
) 

function is_totally_after_join_term

static int is_totally_after_join_term (
    QO_TERM * term
) 

function make_buildlist_proc

static XASL_NODE * make_buildlist_proc (
    QO_ENV * env,
    PT_NODE * namelist
) 

function make_fetch_proc

static XASL_NODE * make_fetch_proc (
    QO_ENV * env,
    QO_PLAN * plan
) 

function make_hashjoin_proc

static XASL_NODE * make_hashjoin_proc (
    QO_ENV * env,
    QO_PLAN * plan,
    XASL_NODE * outer_xasl,
    XASL_NODE * inner_xasl,
    PROJECTION_INFO * projection_info
) 

function make_if_pred_from_plan

static PT_NODE * make_if_pred_from_plan (
    QO_ENV * env,
    QO_PLAN * plan
) 

function make_instnum_pred_from_plan

static PT_NODE * make_instnum_pred_from_plan (
    QO_ENV * env,
    QO_PLAN * plan
) 

function make_mergelist_proc

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
) 

function make_namelist_from_bitset

static PT_NODE * make_namelist_from_bitset (
    QO_ENV * env,
    BITSET * bitset
) 

function make_namelist_from_projected_segs

static PT_NODE * make_namelist_from_projected_segs (
    QO_ENV * env,
    QO_PLAN * plan
) 

function make_outer_instnum

static void make_outer_instnum (
    QO_ENV * env,
    QO_PLAN * outer,
    QO_PLAN * plan
) 

function make_pred_from_bitset

static PT_NODE * make_pred_from_bitset (
    QO_ENV * env,
    BITSET * predset,
    ELIGIBILITY_FN safe
) 

function make_pred_from_plan

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
) 

function make_scan_proc

static XASL_NODE * make_scan_proc (
    QO_ENV * env
) 

function make_sort_limit_proc

static XASL_NODE * make_sort_limit_proc (
    QO_ENV * env,
    QO_PLAN * plan,
    PT_NODE * namelist,
    XASL_NODE * xasl
) 

function mark_access_as_outer_join

static void mark_access_as_outer_join (
    PARSER_CONTEXT * parser,
    XASL_NODE * xasl
) 

function path_access_term

static int path_access_term (
    QO_TERM * term
) 

function path_if_term

static int path_if_term (
    QO_TERM * term
) 

function preserve_info

static XASL_NODE * preserve_info (
    QO_ENV * env,
    QO_PLAN * plan,
    XASL_NODE * xasl
) 

function qo_check_parent_eq_class_for_multi_range_opt

static bool qo_check_parent_eq_class_for_multi_range_opt (
    QO_PLAN * parent,
    QO_PLAN * subplan,
    QO_PLAN * sort_plan
) 

function qo_check_plan_index_for_multi_range_opt

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
) 

function qo_check_seg_belongs_to_range_term

static bool qo_check_seg_belongs_to_range_term (
    QO_PLAN * subplan,
    QO_ENV * env,
    int seg_idx
) 

function qo_check_subplan_join_cond_for_multi_range_opt

static bool qo_check_subplan_join_cond_for_multi_range_opt (
    QO_PLAN * parent,
    QO_PLAN * subplan,
    QO_PLAN * sort_plan
) 

function qo_check_subplans_for_multi_range_opt

static int qo_check_subplans_for_multi_range_opt (
    QO_PLAN * parent,
    QO_PLAN * plan,
    QO_PLAN * sortplan,
    bool * is_valid,
    bool * seen
) 

function qo_check_subqueries_for_multi_range_opt

static bool qo_check_subqueries_for_multi_range_opt (
    QO_PLAN * plan,
    int sort_col_idx_pos
) 

function qo_check_terms_for_multiple_range_opt

static int qo_check_terms_for_multiple_range_opt (
    QO_PLAN * plan,
    int first_sort_col_idx,
    bool * can_optimize
) 

function qo_clear_projection_final_info

static void qo_clear_projection_final_info (
    PARSER_CONTEXT * parser,
    PROJECTION_FINAL_INFO * final_info
) 

function qo_clear_projection_info

static void qo_clear_projection_info (
    QO_ENV * env,
    PROJECTION_INFO * info
) 

function qo_clear_projection_part_info

static void qo_clear_projection_part_info (
    PARSER_CONTEXT * parser,
    PROJECTION_PART_INFO * part_info
) 

function qo_free_xasl_index_info

static void qo_free_xasl_index_info (
    QO_ENV * env,
    QO_XASL_INDEX_INFO * info
) 

function qo_get_limit_from_eval_term

static bool qo_get_limit_from_eval_term (
    PARSER_CONTEXT * parser,
    PRED_EXPR * pred,
    REGU_PTR_LIST * lower,
    REGU_PTR_LIST * upper
) 

function qo_get_limit_from_instnum_pred

static bool qo_get_limit_from_instnum_pred (
    PARSER_CONTEXT * parser,
    PRED_EXPR * pred,
    REGU_PTR_LIST * lower,
    REGU_PTR_LIST * upper
) 

function qo_get_multi_col_range_segs

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
) 

function qo_get_orderby_num_upper_bound_node

static PT_NODE * qo_get_orderby_num_upper_bound_node (
    PARSER_CONTEXT * parser,
    PT_NODE * orderby_for,
    bool * is_new_node
) 

function qo_get_xasl_index_info

static QO_XASL_INDEX_INFO * qo_get_xasl_index_info (
    QO_ENV * env,
    QO_PLAN * plan
) 

function qo_init_merge_info

static int qo_init_merge_info (
    QO_ENV * env,
    QO_PLAN * plan,
    PROJECTION_INFO * projection_info,
    QFILE_LIST_MERGE_INFO * merge_info
) 

function qo_init_projection_info

static int qo_init_projection_info (
    QO_ENV * env,
    QO_PLAN * plan,
    BITSET * pred_set,
    PROJECTION_INFO * info
) 

function qo_validate_regu_var_for_limit

static bool qo_validate_regu_var_for_limit (
    REGU_VARIABLE * var_p
) 

function regu_ptr_list_add_regu

static REGU_PTR_LIST regu_ptr_list_add_regu (
    REGU_VARIABLE * var_p,
    REGU_PTR_LIST list
) 

function regu_ptr_list_create

static REGU_PTR_LIST regu_ptr_list_create () 

function regu_ptr_list_free

static void regu_ptr_list_free (
    REGU_PTR_LIST list
) 


The documentation for this class was generated from the following file cubrid/src/optimizer/plan_generation.c