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
Public Types
Public Attributes
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
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