24 #ifndef _QUERY_GRAPH_H_ 25 #define _QUERY_GRAPH_H_ 29 #if defined (SERVER_MODE) 30 #error Does not belong to server module 187 #define QO_ENTRY_MULTI_COL(entry) ((entry)->col_num > 1 ? true : false) 196 #define QO_INDEX_INDEX(ind, n) (&(ind)->index[(n)]) 201 #define QO_GET_CLASS_STATS(entryp) \ 202 ((entryp)->self_allocated ? (entryp)->stats : (entryp)->smclass->stats) 237 #define QO_NI_N(ni) ((ni)->n) 238 #define QO_NI_ENTRY(ni, n) (&(ni)->index[(n)]) 259 #define QO_UI_N(ui) ((ui)->n) 260 #define QO_UI_INDEX(ui, n) ((ui)->index[(n)].name) 261 #define QO_UI_FORCE(ui, n) ((ui)->index[(n)].force) 262 #define QO_UI_KEYLIMIT(ui, n) ((ui)->index[(n)].key_limit) 380 #define QO_NODE_ENV(node) (node)->env 381 #define QO_NODE_ENTITY_SPEC(node) (node)->entity_spec 382 #define QO_NODE_PT_JOIN_TYPE(node) (node)->entity_spec->info.spec.join_type 383 #define QO_NODE_LOCATION(node) (node)->entity_spec->info.spec.location 384 #define QO_NODE_OID_SEG(node) (node)->oid_seg 385 #define QO_NODE_EQCLASSES(node) (node)->eqclasses 386 #define QO_NODE_PARTITION(node) (node)->partition 387 #define QO_NODE_DEP_SET(node) (node)->dep_set 388 #define QO_NODE_SARGS(node) (node)->sargs 389 #define QO_NODE_SELECTIVITY(node) (node)->selectivity 390 #define QO_NODE_SUBQUERIES(node) (node)->subqueries 391 #define QO_NODE_SEGS(node) (node)->segs 392 #define QO_NODE_IDX(node) (node)->idx 393 #define QO_NODE_REL_IDX(node) (node)->rel_idx 394 #define QO_NODE_INDEXES(node) (node)->indexes 395 #define QO_NODE_USING_INDEX(node) (node)->using_index 397 #define QO_NODE_OUTER_DEP_SET(node) (node)->outer_dep_set 398 #define QO_NODE_RIGHT_DEP_SET(node) (node)->right_dep_set 399 #define QO_NODE_SARGABLE(node) (node)->sargable 401 #define QO_NODE_NAME(node) (node)->class_name 402 #define QO_NODE_OIDP(node) (&(node)->info->info[0].oid) 403 #define QO_NODE_INFO(node) (node)->info 404 #define QO_NODE_INFO_N(node) (node)->info->n 405 #define QO_NODE_NCARD(node) (node)->ncard 406 #define QO_NODE_TCARD(node) (node)->tcard 407 #define QO_NODE_HINT(node) (node)->hint 408 #define QO_NODE_INFO_SMCLASS(node) (node)->info[0].info->smclass 409 #define QO_NODE_SORT_LIMIT_CANDIDATE(node) (node)->sort_limit_candidate 411 #define QO_NODE_IS_CLASS_HIERARCHY(node) \ 412 (QO_NODE_INFO(node) != NULL \ 413 && (QO_NODE_INFO_N(node) > 1 \ 414 || (QO_NODE_INFO_SMCLASS(node)->partition != NULL \ 415 && QO_NODE_INFO_SMCLASS(node)->users != NULL))) 417 #define QO_NODE_IS_CLASS_PARTITIONED(node) \ 418 (QO_NODE_INFO(node) != NULL \ 419 && QO_NODE_INFO_SMCLASS(node)->partition != NULL \ 420 && QO_NODE_INFO_SMCLASS(node)->users != NULL) 422 #define QO_NODE_IS_OUTER_JOIN(node) \ 423 (QO_NODE_PT_JOIN_TYPE(node) == PT_JOIN_LEFT_OUTER || \ 424 QO_NODE_PT_JOIN_TYPE(node) == PT_JOIN_RIGHT_OUTER || \ 425 QO_NODE_PT_JOIN_TYPE(node) == PT_JOIN_FULL_OUTER) 427 #define QO_ADD_OUTER_DEP_SET(tail,head) \ 428 bitset_union (&(QO_NODE_OUTER_DEP_SET (tail)), &(QO_NODE_OUTER_DEP_SET (head))); \ 429 bitset_add (&(QO_NODE_OUTER_DEP_SET (tail)), QO_NODE_IDX (head)); 431 #define QO_ADD_RIGHT_DEP_SET(tail,head) \ 432 bitset_union (&(QO_NODE_RIGHT_DEP_SET (tail)), &(QO_NODE_RIGHT_DEP_SET (head))); \ 433 bitset_add (&(QO_NODE_RIGHT_DEP_SET (tail)), QO_NODE_IDX (head)); 435 #define QO_ADD_RIGHT_TO_OUTER(tail,head) \ 436 bitset_union (&(QO_NODE_OUTER_DEP_SET (tail)), &(QO_NODE_RIGHT_DEP_SET (head))); 508 #define QO_SEG_ENV(seg) (seg)->env 509 #define QO_SEG_PT_NODE(seg) (seg)->pt_node 510 #define QO_SEG_HEAD(seg) (seg)->head 511 #define QO_SEG_TAIL(seg) (seg)->tail 512 #define QO_SEG_EQ_ROOT(seg) (seg)->eq_root 513 #define QO_SEG_EQCLASS(seg) (seg)->eqclass 514 #define QO_SEG_NAME(seg) (seg)->name 515 #define QO_SEG_SET_VALUED(seg) (seg)->set_valued 516 #define QO_SEG_CLASS_ATTR(seg) (seg)->class_attr 517 #define QO_SEG_SHARED_ATTR(seg) (seg)->shared_attr 518 #define QO_SEG_INFO(seg) (seg)->info 519 #define QO_SEG_IDX(seg) (seg)->idx 520 #define QO_SEG_IS_SET_VALUED(seg) (seg)->set_valued 521 #define QO_SEG_ATTR_ID(seg) QO_SEG_ATTR_STATS(seg)->id 522 #define QO_SEG_IS_OID_SEG(seg) (QO_NODE_OID_SEG(QO_SEG_HEAD(seg)) == seg) 523 #define QO_SEG_INDEX_TERMS(seg) (seg)->index_terms 524 #define QO_SEG_FUNC_INDEX(seg) (seg)->is_function_index 525 #define OID_SEG_NAME "OID$" 553 #define QO_UNORDERED ((QO_EQCLASS*)NULL) 555 #define QO_EQCLASS_ENV(e) (e)->env 556 #define QO_EQCLASS_SEGS(e) (e)->segs 557 #define QO_EQCLASS_TERM(e) (e)->term 558 #define QO_EQCLASS_IDX(e) (e)->idx 583 #define QO_IS_PATH_TERM(t) (QO_TERM_CLASS(t) & 0x20) 584 #define QO_IS_EDGE_TERM(t) (QO_TERM_CLASS(t) & 0x10) 585 #define QO_IS_FAKE_TERM(t) (QO_TERM_CLASS(t) & 0x08) 586 #define QO_IS_DEP_TERM(t) (QO_TERM_CLASS(t) == QO_TC_DEP_LINK || QO_TERM_CLASS(t) == QO_TC_DEP_JOIN) 715 #define QO_TERM_ENV(t) (t)->env 716 #define QO_TERM_CLASS(t) (t)->term_class 717 #define QO_TERM_NODES(t) (t)->nodes 718 #define QO_TERM_SEGS(t) (t)->segments 719 #define QO_TERM_SELECTIVITY(t) (t)->selectivity 720 #define QO_TERM_RANK(t) (t)->rank 721 #define QO_TERM_HEAD(t) (t)->head 722 #define QO_TERM_TAIL(t) (t)->tail 723 #define QO_TERM_IDX(t) (t)->idx 724 #define QO_TERM_PT_EXPR(t) (t)->pt_expr 725 #define QO_TERM_LOCATION(t) (t)->location 726 #define QO_TERM_SUBQUERIES(t) (t)->subqueries 727 #define QO_TERM_SEG(t) (t)->seg 728 #define QO_TERM_OID_SEG(t) (t)->oid_seg 729 #define QO_TERM_EQCLASS(t) (t)->eqclass 730 #define QO_TERM_NOMINAL_SEG(t) (t)->nominal_seg 731 #define QO_TERM_CAN_USE_INDEX(t) (t)->can_use_index 732 #define QO_TERM_INDEX_SEG(t, i) (t)->index_seg[(i)] 733 #define QO_TERM_JOIN_TYPE(t) (t)->join_type 734 #define QO_TERM_FLAG(t) (t)->flag 735 #define QO_TERM_MULTI_COL_SEGS(t) (t)->multi_col_segs 736 #define QO_TERM_MULTI_COL_CNT(t) (t)->multi_col_cnt 739 #define QO_TERM_EQUAL_OP 1 740 #define QO_TERM_RANGELIST 2 741 #define QO_TERM_SINGLE_PRED 4 742 #define QO_TERM_COPY_PT_EXPR 8 743 #define QO_TERM_MERGEABLE_EDGE 16 744 #define QO_TERM_NON_IDX_SARG_COLL 32 745 #define QO_TERM_MULTI_COLL_PRED 64 746 #define QO_TERM_MULTI_COLL_CONST 128 747 #define QO_TERM_OR_PRED 256 749 #define QO_TERM_IS_FLAGED(t, f) (QO_TERM_FLAG(t) & (int) (f)) 750 #define QO_TERM_SET_FLAG(t, f) QO_TERM_FLAG(t) |= (int) (f) 751 #define QO_TERM_CLEAR_FLAG(t, f) QO_TERM_FLAG(t) &= (int) ~(f) 828 #define QO_PARTITION_NODES(p) (p)->nodes 829 #define QO_PARTITION_EDGES(p) (p)->edges 830 #define QO_PARTITION_DEPENDENCIES(p) (p)->dependencies 831 #define QO_PARTITION_M_OFFSET(p) (p)->M_offset 832 #define QO_PARTITION_PLAN(p) (p)->plan 833 #define QO_PARTITION_IDX(p) (p)->idx 957 #define QO_ENV_SEG(env, n) (&(env)->segs[(n)]) 958 #define QO_ENV_NODE(env, n) (&(env)->nodes[(n)]) 959 #define QO_ENV_EQCLASS(env, n) (&(env)->eqclasses[(n)]) 960 #define QO_ENV_TERM(env, n) (&(env)->terms[(n)]) 961 #define QO_ENV_PARTITION(env, n) (&(env)->partitions[(n)]) 962 #define QO_ENV_SUBQUERY(env, n) (&(env)->subqueries[(n)]) 963 #define QO_ENV_PREV_SEG(env) (env)->prev_seg 964 #define QO_ENV_PARSER(env) (env)->parser 965 #define QO_ENV_PT_TREE(env) (env)->pt_tree 966 #define QO_ENV_TMP_BITSET(env) (env)->tmp_bitset 967 #define QO_ENV_LIMIT_VALUE(env) (env)->limit_value 968 #define QO_ENV_SORT_LIMIT_NODES(env) (env)->sort_limit_nodes 969 #define QO_ENV_USE_SORT_LIMIT(env) ((env)->use_sort_limit == QO_SL_USE) 995 #define QO_ON_COND_TERM(term) \ 996 (QO_TERM_LOCATION(term) > 0) 998 #define QO_INNER_JOIN_TERM(term) \ 999 (QO_TERM_CLASS(term) == QO_TC_JOIN && \ 1000 QO_TERM_JOIN_TYPE(term) == JOIN_INNER) 1002 #define QO_OUTER_JOIN_TERM(term) \ 1003 ((QO_TERM_CLASS(term) == QO_TC_JOIN || \ 1004 QO_TERM_CLASS(term) == QO_TC_DUMMY_JOIN) && \ 1005 (QO_TERM_JOIN_TYPE(term) == JOIN_LEFT || \ 1006 QO_TERM_JOIN_TYPE(term) == JOIN_RIGHT || \ 1007 QO_TERM_JOIN_TYPE(term) == JOIN_OUTER)) 1009 #define QO_LEFT_OUTER_JOIN_TERM(term) \ 1010 ((QO_TERM_CLASS(term) == QO_TC_JOIN || \ 1011 QO_TERM_CLASS(term) == QO_TC_DUMMY_JOIN) && \ 1012 QO_TERM_JOIN_TYPE(term) == JOIN_LEFT) 1014 #define QO_RIGHT_OUTER_JOIN_TERM(term) \ 1015 ((QO_TERM_CLASS(term) == QO_TC_JOIN || \ 1016 QO_TERM_CLASS(term) == QO_TC_DUMMY_JOIN) && \ 1017 QO_TERM_JOIN_TYPE(term) == JOIN_RIGHT) 1019 #define QO_FULL_OUTER_JOIN_TERM(term) \ 1020 ((QO_TERM_CLASS(term) == QO_TC_JOIN || \ 1021 QO_TERM_CLASS(term) == QO_TC_DUMMY_JOIN) && \ 1022 QO_TERM_JOIN_TYPE(term) == JOIN_OUTER) 1024 #define QO_JOIN_INFO_SIZE(_partition) \ 1025 (int)(1 << bitset_cardinality(&(QO_PARTITION_NODES(_partition))))
QO_CLASS_INFO_ENTRY * class_
void qo_eqclass_fprint_wrt(QO_EQCLASS *, BITSET *, FILE *)
QO_PARTITION * partitions
bool multi_range_opt_candidate
bool qo_is_prefix_index(QO_INDEX_ENTRY *)
void qo_check_coll_optimization(QO_INDEX_ENTRY *ent, COLL_OPT *collation_opt)
SM_CLASS_CONSTRAINT * constraints
bool sort_limit_candidate
bool all_unique_index_columns_are_equi_terms
void qo_print_stats(FILE *)
QO_USING_INDEX * using_index
QO_ATTR_CUM_STATS cum_stats
void qo_node_fprint(QO_NODE *, FILE *)
BITSET multi_col_range_segs
bool qo_is_filter_index(QO_INDEX_ENTRY *)
void qo_termset_fprint(QO_ENV *, BITSET *, FILE *)
bool need_copy_to_sarg_term
void qo_term_fprint(QO_TERM *, FILE *)
void qo_env_free(QO_ENV *)
int qo_seg_width(QO_SEGMENT *seg)
bool qo_check_type_index_covering(QO_INDEX_ENTRY *ent)
struct qo_index_entry * next
QO_ATTR_CUM_STATS cum_stats
QO_SORT_LIMIT_USE use_sort_limit
struct qo_node_index_entry * ni_entry
char * statistics_attribute_name
void qo_seg_fprint(QO_SEGMENT *, FILE *)
int need_copy_multi_range_term