Skip to content

File query_graph.c

FileList > cubrid > src > optimizer > query_graph.c

Go to the source code of this file

  • #include "config.h"
  • #include <ctype.h>
  • #include <stdio.h>
  • #include <stdlib.h>
  • #include <stdarg.h>
  • #include <math.h>
  • #include <assert.h>
  • #include <values.h>
  • #include "parser.h"
  • #include "error_code.h"
  • #include "error_manager.h"
  • #include "object_primitive.h"
  • #include "object_representation.h"
  • #include "optimizer.h"
  • #include "query_graph.h"
  • #include "query_planner.h"
  • #include "schema_manager.h"
  • #include "statistics.h"
  • #include "system_parameter.h"
  • #include "environment_variable.h"
  • #include "xasl_generation.h"
  • #include "query_list.h"
  • #include "db.h"
  • #include "memory_alloc.h"
  • #include "util_func.h"
  • #include "locator_cl.h"
  • #include "object_domain.h"
  • #include "network_interface_cl.h"
  • #include "dbtype.h"
  • #include "xasl.h"

Classes

Type Name
struct walk_info

Public Types

Type Name
enum QO_BUILD_STATUS
typedef struct walk_info WALK_INFO

Public Attributes

Type Name
double QO_INFINITY = 0.0

Public Functions

Type Name
QO_NODE * lookup_node (PT_NODE * attr, QO_ENV * env, PT_NODE ** entity)
QO_SEGMENT * lookup_seg (QO_NODE * head, PT_NODE * name, QO_ENV * env)
bool pt_is_pseudo_const (PT_NODE * expr)
void qo_abort (QO_ENV * env, const char * file, int line)
void qo_check_coll_optimization (QO_INDEX_ENTRY * ent, COLL_OPT * collation_opt)
bool qo_check_type_index_covering (QO_INDEX_ENTRY * ent)
void qo_env_free (QO_ENV * env)
void qo_eqclass_fprint_wrt (QO_EQCLASS * eqclass, BITSET * nodeset, FILE * f)
void qo_expr_segs (QO_ENV * env, PT_NODE * pt_expr, BITSET * result)
void qo_get_optimization_param (void * retval, QO_PARAM param, ...)
bool qo_is_filter_index (QO_INDEX_ENTRY * ent)
bool qo_is_prefix_index (QO_INDEX_ENTRY * ent)
bool qo_need_skip_execution (void)
void qo_node_fprint (QO_NODE * node, FILE * f)
QO_PLAN * qo_optimize_query (PARSER_CONTEXT * parser, PT_NODE * tree)
void qo_print_stats (FILE * f)
void qo_seg_fprint (QO_SEGMENT * seg, FILE * f)
int qo_seg_width (QO_SEGMENT * seg)
void qo_set_optimization_param (void * retval, QO_PARAM param, ...)
void qo_term_fprint (QO_TERM * term, FILE * f)
void qo_termset_fprint (QO_ENV * env, BITSET * terms, FILE * f)

Public Static Functions

Type Name
void add_hint (QO_ENV * env, PT_NODE * tree)
void add_hint_args (QO_ENV * env, PT_NODE * arg_list, PT_HINT_ENUM hint)
void add_local_subquery (QO_ENV * env, PT_NODE * node)
void add_using_index (QO_ENV * env, PT_NODE * using_index)
QO_NODE * build_graph_for_entity (QO_ENV * env, PT_NODE * entity, QO_BUILD_STATUS status)
PT_NODE * build_query_graph (PARSER_CONTEXT * parser, PT_NODE * tree, void * arg, int * continue_walk)
PT_NODE * build_query_graph_function_index (PARSER_CONTEXT * parser, PT_NODE * tree, void * arg, int * continue_walk)
PT_NODE * build_query_graph_post (PARSER_CONTEXT * parser, PT_NODE * tree, void * arg, int * continue_walk)
PT_NODE * check_subquery_pre (PARSER_CONTEXT * parser, PT_NODE * node, void * arg, int * continue_walk)
int count_classes (PT_NODE * p)
bool expr_is_mergable (PT_NODE * pt_expr)
int get_expr_fcode_rank (FUNC_CODE fcode)
void get_local_subqueries (QO_ENV * env, PT_NODE * tree)
PT_NODE * get_local_subqueries_post (PARSER_CONTEXT * parser, PT_NODE * node, void * arg, int * continue_walk)
PT_NODE * get_local_subqueries_pre (PARSER_CONTEXT * parser, PT_NODE * node, void * arg, int * continue_walk)
int get_opcode_rank (PT_OP_TYPE opcode)
int get_operand_rank (PT_NODE * node)
void get_rank (QO_ENV * env)
PT_NODE * get_referenced_attrs (PT_NODE * entity)
void get_term_rank (QO_ENV * env, QO_TERM * term)
void get_term_subqueries (QO_ENV * env, QO_TERM * term)
void graph_size_for_entity (QO_ENV * env, PT_NODE * entity)
PT_NODE * graph_size_select (PARSER_CONTEXT * parser, PT_NODE * tree, void * arg, int * continue_walk)
QO_CLASS_INFO_ENTRY * grok_classes (QO_ENV * env, PT_NODE * dom_set, QO_CLASS_INFO_ENTRY * info)
bool is_dependent_table (PT_NODE * entity)
int is_equivalent_indexes (QO_INDEX_ENTRY * index1, QO_INDEX_ENTRY * index2)
QO_INDEX_ENTRY * is_index_compatible (QO_CLASS_INFO * class_info, int n, QO_INDEX_ENTRY * index_entry)
bool is_local_name (QO_ENV * env, PT_NODE * expr)
void qo_add_dep_term (QO_NODE * derived_node, BITSET * depend_nodes, BITSET * depend_segs, QO_ENV * env)
QO_TERM * qo_add_dummy_join_term (QO_ENV * env, QO_NODE * p_node, QO_NODE * on_node)
PT_NODE * qo_add_final_segment (PARSER_CONTEXT * parser, PT_NODE * tree, void * arg, int * continue_walk)
QO_NODE * qo_add_node (PT_NODE * entity, QO_ENV * env)
QO_TERM * qo_add_term (PT_NODE * conjunct, int term_type, QO_ENV * env)
QO_INDEX * qo_alloc_index (QO_ENV * env, int n)
void qo_analyze_term (QO_TERM * term, int term_type)
void qo_assign_eq_classes (QO_ENV * env)
void qo_classify_outerjoin_terms (QO_ENV * env)
int qo_data_compare (DB_DATA * data1, DB_DATA * data2, DB_TYPE type)
void qo_discover_edges (QO_ENV * env)
void qo_discover_indexes (QO_ENV * env)
void qo_discover_partitions (QO_ENV * env)
void qo_discover_sort_limit_join_nodes (QO_ENV * env, QO_NODE * nodep, BITSET * order_nodes, BITSET * dep_nodes)
void qo_discover_sort_limit_nodes (QO_ENV * env)
void qo_env_dump (QO_ENV * env, FILE * f)
QO_ENV * qo_env_init (PARSER_CONTEXT * parser, PT_NODE * query)
QO_ENV * qo_env_new (PARSER_CONTEXT * parser, PT_NODE * query)
void qo_eqclass_add (QO_EQCLASS * eqclass, QO_SEGMENT * seg)
void qo_eqclass_dump (QO_EQCLASS * eqclass, FILE * f)
void qo_eqclass_free (QO_EQCLASS * eqclass)
QO_EQCLASS * qo_eqclass_new (QO_ENV * env)
QO_SEGMENT * qo_eqclass_wrt (QO_EQCLASS * eqclass, BITSET * nodeset)
void qo_equivalence (QO_SEGMENT * sega, QO_SEGMENT * segb)
void qo_estimate_statistics (MOP class_mop, CLASS_STATS * statblock)
void qo_exchange (QO_TERM * t0, QO_TERM * t1)
void qo_find_index_seg_terms (QO_ENV * env, QO_INDEX_ENTRY * index_entry, int idx, BITSET * index_segsp)
bool qo_find_index_segs (QO_ENV * env, SM_CLASS_CONSTRAINT * consp, QO_NODE * nodep, int * seg_idx, int seg_idx_num, int * nseg_idxp, BITSET * segs)
void qo_find_index_terms (QO_ENV * env, BITSET * segsp, QO_INDEX_ENTRY * index_entry)
int qo_find_matching_index (QO_INDEX_ENTRY * index_entry, QO_INDEX * class_indexes)
void qo_find_node_indexes (QO_ENV * env, QO_NODE * nodep)
void qo_free_attr_info (QO_ENV * env, QO_ATTR_INFO * info)
void qo_free_class_info (QO_ENV * env, QO_CLASS_INFO * info)
void qo_free_index (QO_ENV * env, QO_INDEX * indexp)
void qo_free_node_index_info (QO_ENV * env, QO_NODE_INDEX * node_indexp)
QO_ATTR_INFO * qo_get_attr_info (QO_ENV * env, QO_SEGMENT * seg)
QO_ATTR_INFO * qo_get_attr_info_func_index (QO_ENV * env, QO_SEGMENT * seg, const char * expr_str)
QO_CLASS_INFO * qo_get_class_info (QO_ENV * env, QO_NODE * node)
int qo_get_ils_prefix_length (QO_ENV * env, QO_NODE * nodep, QO_INDEX_ENTRY * index_entry)
void qo_get_index_info (QO_ENV * env, QO_NODE * node)
QO_SEGMENT * qo_insert_segment (QO_NODE * head, QO_NODE * tail, PT_NODE * node, QO_ENV * env, const char * expr_str)
bool qo_is_coverage_index (QO_ENV * env, QO_NODE * nodep, QO_INDEX_ENTRY * index_entry)
bool qo_is_equi_join_term (QO_TERM * term)
bool qo_is_iss_index (QO_ENV * env, QO_NODE * nodep, QO_INDEX_ENTRY * index_entry)
bool qo_is_non_mvcc_class_with_index (QO_CLASS_INFO_ENTRY * class_entry_p)
bool qo_is_pk_fk_full_join (QO_ENV * env, QO_NODE * fk_node, QO_NODE * pk_node)
bool qo_is_usable_index (SM_CLASS_CONSTRAINT * constraint, QO_NODE * nodep)
QO_SEGMENT * qo_join_segment (QO_NODE * head, QO_NODE * tail, PT_NODE * name, QO_ENV * env)
void qo_node_add_sarg (QO_NODE * node, QO_TERM * sarg)
void qo_node_clear (QO_ENV * env, int idx)
void qo_node_dump (QO_NODE * node, FILE * f)
void qo_node_free (QO_NODE * node)
QO_PLAN * qo_optimize_helper (QO_ENV * env)
void qo_partition_dump (QO_PARTITION * part, FILE * f)
void qo_partition_free (QO_PARTITION * part)
void qo_partition_init (QO_ENV * env, QO_PARTITION * part, int n)
void qo_seg_clear (QO_ENV * env, int idx)
void qo_seg_free (QO_SEGMENT * seg)
void qo_seg_nodes (QO_ENV * env, BITSET * segset, BITSET * result)
void qo_subquery_dump (QO_ENV * env, QO_SUBQUERY * subq, FILE * f)
void qo_subquery_free (QO_SUBQUERY * subq)
void qo_term_clear (QO_ENV * env, int idx)
void qo_term_dump (QO_TERM * term, FILE * f)
void qo_term_free (QO_TERM * term)
bool qo_validate (QO_ENV * env)
PT_NODE * set_seg_expr (PARSER_CONTEXT * parser, PT_NODE * tree, void * arg, int * continue_walk)
void set_seg_node (PT_NODE * attr, QO_ENV * env, BITSET * bitset)

Macros

Type Name
define BITSET_EXCHANGE (s0, s1) [**bitset\_exchange**](query__bitset_8c.md#function-bitset_exchange)(&([**s0**](broker__monitor_8c.md#function-timeout)), &([**s1**](broker__monitor_8c.md#function-timeout)))
define BOOL_EXCHANGE (e0, e1) [**EXCHANGE\_BUILDER**](query__graph_8c.md#define-exchange_builder)([**bool**](broker__monitor_8c.md#function-timeout),[**e0**](broker__monitor_8c.md#function-timeout),[**e1**](broker__monitor_8c.md#function-timeout))
define DOUBLE_EXCHANGE (e0, e1) [**EXCHANGE\_BUILDER**](query__graph_8c.md#define-exchange_builder)([**double**](broker__monitor_8c.md#function-timeout),[**e0**](broker__monitor_8c.md#function-timeout),[**e1**](broker__monitor_8c.md#function-timeout))
define EQCLASSPTR_EXCHANGE (e0, e1) [**EXCHANGE\_BUILDER**](query__graph_8c.md#define-exchange_builder)([**QO\_EQCLASS**](optimizer_8h.md#typedef-qo_eqclass) \*,[**e0**](broker__monitor_8c.md#function-timeout),[**e1**](broker__monitor_8c.md#function-timeout))
define EXCHANGE_BUILDER (type, e0, e1) [**do**](dynamic__load_8c.md#variable-do) { type [**\_tmp**](broker__monitor_8c.md#function-timeout) = [**e0**](broker__monitor_8c.md#function-timeout); [**e0**](broker__monitor_8c.md#function-timeout) = [**e1**](broker__monitor_8c.md#function-timeout); [**e1**](broker__monitor_8c.md#function-timeout) = [**\_tmp**](broker__monitor_8c.md#function-timeout); } [**while**](dynamic__load_8c.md#function-while) (0)
define FLAG_EXCHANGE (e0, e1) [**EXCHANGE\_BUILDER**](query__graph_8c.md#define-exchange_builder)([**int**](broker__monitor_8c.md#function-timeout),[**e0**](broker__monitor_8c.md#function-timeout),[**e1**](broker__monitor_8c.md#function-timeout))
define INT_EXCHANGE (e0, e1) [**EXCHANGE\_BUILDER**](query__graph_8c.md#define-exchange_builder)([**int**](broker__monitor_8c.md#function-timeout),[**e0**](broker__monitor_8c.md#function-timeout),[**e1**](broker__monitor_8c.md#function-timeout))
define INT_PTR_EXCHANGE (e0, e1) [**EXCHANGE\_BUILDER**](query__graph_8c.md#define-exchange_builder)([**int**](broker__monitor_8c.md#function-timeout) \*,[**e0**](broker__monitor_8c.md#function-timeout),[**e1**](broker__monitor_8c.md#function-timeout))
define JOIN_TYPE_EXCHANGE (e0, e1) [**EXCHANGE\_BUILDER**](query__graph_8c.md#define-exchange_builder)([**JOIN\_TYPE**](query__list_8h.md#enum-join_type),[**e0**](broker__monitor_8c.md#function-timeout),[**e1**](broker__monitor_8c.md#function-timeout))
define LOG2_SIZEOF_POINTER 2
define NODEPTR_EXCHANGE (e0, e1) [**EXCHANGE\_BUILDER**](query__graph_8c.md#define-exchange_builder)([**QO\_NODE**](optimizer_8h.md#typedef-qo_node) \*,[**e0**](broker__monitor_8c.md#function-timeout),[**e1**](broker__monitor_8c.md#function-timeout))
define NOMINAL_HEAP_SIZE (class) 200 /\* pages \*/
define NOMINAL_OBJECT_SIZE (class) 64 /\* bytes \*/
define OPTIMIZATION_LIMIT 64
define PREDICATE_TERM -2
define PT_NODE_EXCHANGE (e0, e1) [**EXCHANGE\_BUILDER**](query__graph_8c.md#define-exchange_builder)([**PT\_NODE**](parse__tree_8h.md#typedef-pt_node) \*,[**e0**](broker__monitor_8c.md#function-timeout),[**e1**](broker__monitor_8c.md#function-timeout))
define PUT_FLAG (cond, flag) /* multi line expression */
define RANK_DEFAULT 0 /\* [**default**](broker__monitor_8c.md#function-timeout) \*/
define RANK_EXPR_FUNCTION 4 /\* [**agg**](broker__monitor_8c.md#function-timeout) function, set \*/
define RANK_EXPR_HEAVY 3 /\* [**Group**](broker__monitor_8c.md#function-timeout) 3 \*/
define RANK_EXPR_LIGHT 1 /\* [**Group**](broker__monitor_8c.md#function-timeout) 1 \*/
define RANK_EXPR_MEDIUM 2 /\* [**Group**](broker__monitor_8c.md#function-timeout) 2 \*/
define RANK_NAME [**RANK\_DEFAULT**](query__graph_8c.md#define-rank_default) /\* name -- use [**default**](broker__monitor_8c.md#function-timeout) \*/
define RANK_QUERY 8 /\* subquery \*/
define RANK_VALUE [**RANK\_DEFAULT**](query__graph_8c.md#define-rank_default) /\* value -- use [**default**](broker__monitor_8c.md#function-timeout) \*/
define SEGMENTPTR_EXCHANGE (e0, e1) [**EXCHANGE\_BUILDER**](query__graph_8c.md#define-exchange_builder)([**QO\_SEGMENT**](optimizer_8h.md#typedef-qo_segment) \*,[**e0**](broker__monitor_8c.md#function-timeout),[**e1**](broker__monitor_8c.md#function-timeout))
define SIZEOF_ATTR_CUM_STATS_PKEYS (n) ((n) \* [**sizeof**](broker__monitor_8c.md#function-timeout)([**int**](broker__monitor_8c.md#function-timeout)))
define SIZEOF_CLASS_INFO (n) ([**sizeof**](broker__monitor_8c.md#function-timeout)([**QO\_CLASS\_INFO**](optimizer_8h.md#typedef-qo_class_info)) + (((n)-1) \* [**sizeof**](broker__monitor_8c.md#function-timeout)([**QO\_CLASS\_INFO\_ENTRY**](query__graph_8h.md#typedef-qo_class_info_entry))))
define SIZEOF_INDEX (n) ([**sizeof**](broker__monitor_8c.md#function-timeout)([**QO\_INDEX**](optimizer_8h.md#typedef-qo_index)) + (((n)-1)\* [**sizeof**](broker__monitor_8c.md#function-timeout)([**QO\_INDEX\_ENTRY**](optimizer_8h.md#typedef-qo_index_entry))))
define SIZEOF_NODE_INDEX (n) ([**sizeof**](broker__monitor_8c.md#function-timeout)([**QO\_NODE\_INDEX**](optimizer_8h.md#typedef-qo_node_index)) + (((n)-1)\* [**sizeof**](broker__monitor_8c.md#function-timeout)([**QO\_NODE\_INDEX\_ENTRY**](optimizer_8h.md#typedef-qo_node_index_entry))))
define SIZEOF_USING_INDEX (n) ([**sizeof**](broker__monitor_8c.md#function-timeout)([**QO\_USING\_INDEX**](optimizer_8h.md#typedef-qo_using_index)) + (((n)-1) \* [**sizeof**](broker__monitor_8c.md#function-timeout)([**QO\_USING\_INDEX\_ENTRY**](optimizer_8h.md#typedef-qo_using_index_entry))))
define TERMCLASS_EXCHANGE (e0, e1) [**EXCHANGE\_BUILDER**](query__graph_8c.md#define-exchange_builder)([**QO\_TERMCLASS**](query__graph_8h.md#enum-qo_termclass),[**e0**](broker__monitor_8c.md#function-timeout),[**e1**](broker__monitor_8c.md#function-timeout))

Public Types Documentation

enum QO_BUILD_STATUS

enum QO_BUILD_STATUS {
    QO_BUILD_ENTITY = 0x01,
    QO_BUILD_PATH = 0x02
};

typedef WALK_INFO

typedef struct walk_info WALK_INFO;

Public Attributes Documentation

variable QO_INFINITY

double QO_INFINITY;

Public Functions Documentation

function lookup_node

QO_NODE * lookup_node (
    PT_NODE * attr,
    QO_ENV * env,
    PT_NODE ** entity
) 

function lookup_seg

QO_SEGMENT * lookup_seg (
    QO_NODE * head,
    PT_NODE * name,
    QO_ENV * env
) 

function pt_is_pseudo_const

bool pt_is_pseudo_const (
    PT_NODE * expr
) 

function qo_abort

void qo_abort (
    QO_ENV * env,
    const  char * file,
    int line
) 

function qo_check_coll_optimization

void qo_check_coll_optimization (
    QO_INDEX_ENTRY * ent,
    COLL_OPT * collation_opt
) 

function qo_check_type_index_covering

bool qo_check_type_index_covering (
    QO_INDEX_ENTRY * ent
) 

function qo_env_free

void qo_env_free (
    QO_ENV * env
) 

function qo_eqclass_fprint_wrt

void qo_eqclass_fprint_wrt (
    QO_EQCLASS * eqclass,
    BITSET * nodeset,
    FILE * f
) 

function qo_expr_segs

void qo_expr_segs (
    QO_ENV * env,
    PT_NODE * pt_expr,
    BITSET * result
) 

function qo_get_optimization_param

void qo_get_optimization_param (
    void * retval,
    QO_PARAM param,
    ...
) 

function qo_is_filter_index

bool qo_is_filter_index (
    QO_INDEX_ENTRY * ent
) 

function qo_is_prefix_index

bool qo_is_prefix_index (
    QO_INDEX_ENTRY * ent
) 

function qo_need_skip_execution

bool qo_need_skip_execution (
    void
) 

function qo_node_fprint

void qo_node_fprint (
    QO_NODE * node,
    FILE * f
) 

function qo_optimize_query

QO_PLAN * qo_optimize_query (
    PARSER_CONTEXT * parser,
    PT_NODE * tree
) 

function qo_print_stats

void qo_print_stats (
    FILE * f
) 

function qo_seg_fprint

void qo_seg_fprint (
    QO_SEGMENT * seg,
    FILE * f
) 

function qo_seg_width

int qo_seg_width (
    QO_SEGMENT * seg
) 

function qo_set_optimization_param

void qo_set_optimization_param (
    void * retval,
    QO_PARAM param,
    ...
) 

function qo_term_fprint

void qo_term_fprint (
    QO_TERM * term,
    FILE * f
) 

function qo_termset_fprint

void qo_termset_fprint (
    QO_ENV * env,
    BITSET * terms,
    FILE * f
) 

Public Static Functions Documentation

function add_hint

static void add_hint (
    QO_ENV * env,
    PT_NODE * tree
) 

function add_hint_args

static void add_hint_args (
    QO_ENV * env,
    PT_NODE * arg_list,
    PT_HINT_ENUM hint
) 

function add_local_subquery

static void add_local_subquery (
    QO_ENV * env,
    PT_NODE * node
) 

function add_using_index

static void add_using_index (
    QO_ENV * env,
    PT_NODE * using_index
) 

function build_graph_for_entity

static QO_NODE * build_graph_for_entity (
    QO_ENV * env,
    PT_NODE * entity,
    QO_BUILD_STATUS status
) 

function build_query_graph

static PT_NODE * build_query_graph (
    PARSER_CONTEXT * parser,
    PT_NODE * tree,
    void * arg,
    int * continue_walk
) 

function build_query_graph_function_index

static PT_NODE * build_query_graph_function_index (
    PARSER_CONTEXT * parser,
    PT_NODE * tree,
    void * arg,
    int * continue_walk
) 

function build_query_graph_post

static PT_NODE * build_query_graph_post (
    PARSER_CONTEXT * parser,
    PT_NODE * tree,
    void * arg,
    int * continue_walk
) 

function check_subquery_pre

static PT_NODE * check_subquery_pre (
    PARSER_CONTEXT * parser,
    PT_NODE * node,
    void * arg,
    int * continue_walk
) 

function count_classes

static int count_classes (
    PT_NODE * p
) 

function expr_is_mergable

static bool expr_is_mergable (
    PT_NODE * pt_expr
) 

function get_expr_fcode_rank

static int get_expr_fcode_rank (
    FUNC_CODE fcode
) 

function get_local_subqueries

static void get_local_subqueries (
    QO_ENV * env,
    PT_NODE * tree
) 

function get_local_subqueries_post

static PT_NODE * get_local_subqueries_post (
    PARSER_CONTEXT * parser,
    PT_NODE * node,
    void * arg,
    int * continue_walk
) 

function get_local_subqueries_pre

static PT_NODE * get_local_subqueries_pre (
    PARSER_CONTEXT * parser,
    PT_NODE * node,
    void * arg,
    int * continue_walk
) 

function get_opcode_rank

static int get_opcode_rank (
    PT_OP_TYPE opcode
) 

function get_operand_rank

static int get_operand_rank (
    PT_NODE * node
) 

function get_rank

static void get_rank (
    QO_ENV * env
) 

function get_referenced_attrs

static PT_NODE * get_referenced_attrs (
    PT_NODE * entity
) 

function get_term_rank

static void get_term_rank (
    QO_ENV * env,
    QO_TERM * term
) 

function get_term_subqueries

static void get_term_subqueries (
    QO_ENV * env,
    QO_TERM * term
) 

function graph_size_for_entity

static void graph_size_for_entity (
    QO_ENV * env,
    PT_NODE * entity
) 

function graph_size_select

static PT_NODE * graph_size_select (
    PARSER_CONTEXT * parser,
    PT_NODE * tree,
    void * arg,
    int * continue_walk
) 

function grok_classes

static QO_CLASS_INFO_ENTRY * grok_classes (
    QO_ENV * env,
    PT_NODE * dom_set,
    QO_CLASS_INFO_ENTRY * info
) 

function is_dependent_table

static bool is_dependent_table (
    PT_NODE * entity
) 

function is_equivalent_indexes

static int is_equivalent_indexes (
    QO_INDEX_ENTRY * index1,
    QO_INDEX_ENTRY * index2
) 

function is_index_compatible

static QO_INDEX_ENTRY * is_index_compatible (
    QO_CLASS_INFO * class_info,
    int n,
    QO_INDEX_ENTRY * index_entry
) 

function is_local_name

static bool is_local_name (
    QO_ENV * env,
    PT_NODE * expr
) 

function qo_add_dep_term

static void qo_add_dep_term (
    QO_NODE * derived_node,
    BITSET * depend_nodes,
    BITSET * depend_segs,
    QO_ENV * env
) 

function qo_add_dummy_join_term

static QO_TERM * qo_add_dummy_join_term (
    QO_ENV * env,
    QO_NODE * p_node,
    QO_NODE * on_node
) 

function qo_add_final_segment

static PT_NODE * qo_add_final_segment (
    PARSER_CONTEXT * parser,
    PT_NODE * tree,
    void * arg,
    int * continue_walk
) 

function qo_add_node

static QO_NODE * qo_add_node (
    PT_NODE * entity,
    QO_ENV * env
) 

function qo_add_term

static QO_TERM * qo_add_term (
    PT_NODE * conjunct,
    int term_type,
    QO_ENV * env
) 

function qo_alloc_index

static QO_INDEX * qo_alloc_index (
    QO_ENV * env,
    int n
) 

function qo_analyze_term

static void qo_analyze_term (
    QO_TERM * term,
    int term_type
) 

function qo_assign_eq_classes

static void qo_assign_eq_classes (
    QO_ENV * env
) 

function qo_classify_outerjoin_terms

static void qo_classify_outerjoin_terms (
    QO_ENV * env
) 

function qo_data_compare

static int qo_data_compare (
    DB_DATA * data1,
    DB_DATA * data2,
    DB_TYPE type
) 

function qo_discover_edges

static void qo_discover_edges (
    QO_ENV * env
) 

function qo_discover_indexes

static void qo_discover_indexes (
    QO_ENV * env
) 

function qo_discover_partitions

static void qo_discover_partitions (
    QO_ENV * env
) 

function qo_discover_sort_limit_join_nodes

static void qo_discover_sort_limit_join_nodes (
    QO_ENV * env,
    QO_NODE * nodep,
    BITSET * order_nodes,
    BITSET * dep_nodes
) 

function qo_discover_sort_limit_nodes

static void qo_discover_sort_limit_nodes (
    QO_ENV * env
) 

function qo_env_dump

static void qo_env_dump (
    QO_ENV * env,
    FILE * f
) 

function qo_env_init

static QO_ENV * qo_env_init (
    PARSER_CONTEXT * parser,
    PT_NODE * query
) 

function qo_env_new

static QO_ENV * qo_env_new (
    PARSER_CONTEXT * parser,
    PT_NODE * query
) 

function qo_eqclass_add

static void qo_eqclass_add (
    QO_EQCLASS * eqclass,
    QO_SEGMENT * seg
) 

function qo_eqclass_dump

static void qo_eqclass_dump (
    QO_EQCLASS * eqclass,
    FILE * f
) 

function qo_eqclass_free

static void qo_eqclass_free (
    QO_EQCLASS * eqclass
) 

function qo_eqclass_new

static QO_EQCLASS * qo_eqclass_new (
    QO_ENV * env
) 

function qo_eqclass_wrt

static QO_SEGMENT * qo_eqclass_wrt (
    QO_EQCLASS * eqclass,
    BITSET * nodeset
) 

function qo_equivalence

static void qo_equivalence (
    QO_SEGMENT * sega,
    QO_SEGMENT * segb
) 

function qo_estimate_statistics

static void qo_estimate_statistics (
    MOP class_mop,
    CLASS_STATS * statblock
) 

function qo_exchange

static void qo_exchange (
    QO_TERM * t0,
    QO_TERM * t1
) 

function qo_find_index_seg_terms

static void qo_find_index_seg_terms (
    QO_ENV * env,
    QO_INDEX_ENTRY * index_entry,
    int idx,
    BITSET * index_segsp
) 

function qo_find_index_segs

static bool qo_find_index_segs (
    QO_ENV * env,
    SM_CLASS_CONSTRAINT * consp,
    QO_NODE * nodep,
    int * seg_idx,
    int seg_idx_num,
    int * nseg_idxp,
    BITSET * segs
) 

function qo_find_index_terms

static void qo_find_index_terms (
    QO_ENV * env,
    BITSET * segsp,
    QO_INDEX_ENTRY * index_entry
) 

function qo_find_matching_index

static int qo_find_matching_index (
    QO_INDEX_ENTRY * index_entry,
    QO_INDEX * class_indexes
) 

function qo_find_node_indexes

static void qo_find_node_indexes (
    QO_ENV * env,
    QO_NODE * nodep
) 

function qo_free_attr_info

static void qo_free_attr_info (
    QO_ENV * env,
    QO_ATTR_INFO * info
) 

function qo_free_class_info

static void qo_free_class_info (
    QO_ENV * env,
    QO_CLASS_INFO * info
) 

function qo_free_index

static void qo_free_index (
    QO_ENV * env,
    QO_INDEX * indexp
) 

function qo_free_node_index_info

static void qo_free_node_index_info (
    QO_ENV * env,
    QO_NODE_INDEX * node_indexp
) 

function qo_get_attr_info

static QO_ATTR_INFO * qo_get_attr_info (
    QO_ENV * env,
    QO_SEGMENT * seg
) 

function qo_get_attr_info_func_index

static QO_ATTR_INFO * qo_get_attr_info_func_index (
    QO_ENV * env,
    QO_SEGMENT * seg,
    const  char * expr_str
) 

function qo_get_class_info

static QO_CLASS_INFO * qo_get_class_info (
    QO_ENV * env,
    QO_NODE * node
) 

function qo_get_ils_prefix_length

static int qo_get_ils_prefix_length (
    QO_ENV * env,
    QO_NODE * nodep,
    QO_INDEX_ENTRY * index_entry
) 

function qo_get_index_info

static void qo_get_index_info (
    QO_ENV * env,
    QO_NODE * node
) 

function qo_insert_segment

static QO_SEGMENT * qo_insert_segment (
    QO_NODE * head,
    QO_NODE * tail,
    PT_NODE * node,
    QO_ENV * env,
    const  char * expr_str
) 

function qo_is_coverage_index

static bool qo_is_coverage_index (
    QO_ENV * env,
    QO_NODE * nodep,
    QO_INDEX_ENTRY * index_entry
) 

function qo_is_equi_join_term

static bool qo_is_equi_join_term (
    QO_TERM * term
) 

function qo_is_iss_index

static bool qo_is_iss_index (
    QO_ENV * env,
    QO_NODE * nodep,
    QO_INDEX_ENTRY * index_entry
) 

function qo_is_non_mvcc_class_with_index

static bool qo_is_non_mvcc_class_with_index (
    QO_CLASS_INFO_ENTRY * class_entry_p
) 

function qo_is_pk_fk_full_join

static bool qo_is_pk_fk_full_join (
    QO_ENV * env,
    QO_NODE * fk_node,
    QO_NODE * pk_node
) 

function qo_is_usable_index

static bool qo_is_usable_index (
    SM_CLASS_CONSTRAINT * constraint,
    QO_NODE * nodep
) 

function qo_join_segment

static QO_SEGMENT * qo_join_segment (
    QO_NODE * head,
    QO_NODE * tail,
    PT_NODE * name,
    QO_ENV * env
) 

function qo_node_add_sarg

static void qo_node_add_sarg (
    QO_NODE * node,
    QO_TERM * sarg
) 

function qo_node_clear

static void qo_node_clear (
    QO_ENV * env,
    int idx
) 

function qo_node_dump

static void qo_node_dump (
    QO_NODE * node,
    FILE * f
) 

function qo_node_free

static void qo_node_free (
    QO_NODE * node
) 

function qo_optimize_helper

static QO_PLAN * qo_optimize_helper (
    QO_ENV * env
) 

function qo_partition_dump

static void qo_partition_dump (
    QO_PARTITION * part,
    FILE * f
) 

function qo_partition_free

static void qo_partition_free (
    QO_PARTITION * part
) 

function qo_partition_init

static void qo_partition_init (
    QO_ENV * env,
    QO_PARTITION * part,
    int n
) 

function qo_seg_clear

static void qo_seg_clear (
    QO_ENV * env,
    int idx
) 

function qo_seg_free

static void qo_seg_free (
    QO_SEGMENT * seg
) 

function qo_seg_nodes

static void qo_seg_nodes (
    QO_ENV * env,
    BITSET * segset,
    BITSET * result
) 

function qo_subquery_dump

static void qo_subquery_dump (
    QO_ENV * env,
    QO_SUBQUERY * subq,
    FILE * f
) 

function qo_subquery_free

static void qo_subquery_free (
    QO_SUBQUERY * subq
) 

function qo_term_clear

static void qo_term_clear (
    QO_ENV * env,
    int idx
) 

function qo_term_dump

static void qo_term_dump (
    QO_TERM * term,
    FILE * f
) 

function qo_term_free

static void qo_term_free (
    QO_TERM * term
) 

function qo_validate

static bool qo_validate (
    QO_ENV * env
) 

function set_seg_expr

static PT_NODE * set_seg_expr (
    PARSER_CONTEXT * parser,
    PT_NODE * tree,
    void * arg,
    int * continue_walk
) 

function set_seg_node

static void set_seg_node (
    PT_NODE * attr,
    QO_ENV * env,
    BITSET * bitset
) 

Macro Definition Documentation

define BITSET_EXCHANGE

#define BITSET_EXCHANGE (
    s0,
    s1
) `bitset_exchange (&( s0 ), &( s1 ))`

define BOOL_EXCHANGE

#define BOOL_EXCHANGE (
    e0,
    e1
) `EXCHANGE_BUILDER ( bool , e0 , e1 )`

define DOUBLE_EXCHANGE

#define DOUBLE_EXCHANGE (
    e0,
    e1
) `EXCHANGE_BUILDER ( double , e0 , e1 )`

define EQCLASSPTR_EXCHANGE

#define EQCLASSPTR_EXCHANGE (
    e0,
    e1
) `EXCHANGE_BUILDER ( QO_EQCLASS *, e0 , e1 )`

define EXCHANGE_BUILDER

#define EXCHANGE_BUILDER (
    type,
    e0,
    e1
) `do { type _tmp = e0 ; e0 = e1 ; e1 = _tmp ; } while (0)`

define FLAG_EXCHANGE

#define FLAG_EXCHANGE (
    e0,
    e1
) `EXCHANGE_BUILDER ( int , e0 , e1 )`

define INT_EXCHANGE

#define INT_EXCHANGE (
    e0,
    e1
) `EXCHANGE_BUILDER ( int , e0 , e1 )`

define INT_PTR_EXCHANGE

#define INT_PTR_EXCHANGE (
    e0,
    e1
) `EXCHANGE_BUILDER ( int *, e0 , e1 )`

define JOIN_TYPE_EXCHANGE

#define JOIN_TYPE_EXCHANGE (
    e0,
    e1
) `EXCHANGE_BUILDER ( JOIN_TYPE , e0 , e1 )`

define LOG2_SIZEOF_POINTER

#define LOG2_SIZEOF_POINTER `2`

define NODEPTR_EXCHANGE

#define NODEPTR_EXCHANGE (
    e0,
    e1
) `EXCHANGE_BUILDER ( QO_NODE *, e0 , e1 )`

define NOMINAL_HEAP_SIZE

#define NOMINAL_HEAP_SIZE (
    class
) `200  /* pages */`

define NOMINAL_OBJECT_SIZE

#define NOMINAL_OBJECT_SIZE (
    class
) `64   /* bytes */`

define OPTIMIZATION_LIMIT

#define OPTIMIZATION_LIMIT `64`

define PREDICATE_TERM

#define PREDICATE_TERM `-2`

define PT_NODE_EXCHANGE

#define PT_NODE_EXCHANGE (
    e0,
    e1
) `EXCHANGE_BUILDER ( PT_NODE *, e0 , e1 )`

define PUT_FLAG

#define PUT_FLAG (
    cond,
    flag
) `/* multi line expression */`

define RANK_DEFAULT

#define RANK_DEFAULT `0 /* default */`

define RANK_EXPR_FUNCTION

#define RANK_EXPR_FUNCTION `4   /* agg function, set */`

define RANK_EXPR_HEAVY

#define RANK_EXPR_HEAVY `3  /* Group 3 */`

define RANK_EXPR_LIGHT

#define RANK_EXPR_LIGHT `1  /* Group 1 */`

define RANK_EXPR_MEDIUM

#define RANK_EXPR_MEDIUM `2 /* Group 2 */`

define RANK_NAME

#define RANK_NAME `RANK_DEFAULT /* name -- use default */`

define RANK_QUERY

#define RANK_QUERY `8   /* subquery */`

define RANK_VALUE

#define RANK_VALUE `RANK_DEFAULT /* value -- use default */`

define SEGMENTPTR_EXCHANGE

#define SEGMENTPTR_EXCHANGE (
    e0,
    e1
) `EXCHANGE_BUILDER ( QO_SEGMENT *, e0 , e1 )`

define SIZEOF_ATTR_CUM_STATS_PKEYS

#define SIZEOF_ATTR_CUM_STATS_PKEYS (
    n
) `((n) * sizeof ( int ))`

define SIZEOF_CLASS_INFO

#define SIZEOF_CLASS_INFO (
    n
) `( sizeof ( QO_CLASS_INFO ) + (((n)-1) * sizeof ( QO_CLASS_INFO_ENTRY )))`

define SIZEOF_INDEX

#define SIZEOF_INDEX (
    n
) `( sizeof ( QO_INDEX ) + (((n)-1)* sizeof ( QO_INDEX_ENTRY )))`

define SIZEOF_NODE_INDEX

#define SIZEOF_NODE_INDEX (
    n
) `( sizeof ( QO_NODE_INDEX ) + (((n)-1)* sizeof ( QO_NODE_INDEX_ENTRY )))`

define SIZEOF_USING_INDEX

#define SIZEOF_USING_INDEX (
    n
) `( sizeof ( QO_USING_INDEX ) + (((n)-1) * sizeof ( QO_USING_INDEX_ENTRY )))`

define TERMCLASS_EXCHANGE

#define TERMCLASS_EXCHANGE (
    e0,
    e1
) `EXCHANGE_BUILDER ( QO_TERMCLASS , e0 , e1 )`


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