43 #define DB_MAX_LITERAL_PRECISION 255 137 return best_path_type;
173 int *nullable_cntp = (
int *) arg;
294 if (query_where ==
NULL)
415 #if defined(ENABLE_UNUSED_FUNCTION) 461 path_spec = *path_spec_ptr;
465 *path_spec_ptr = path_spec->
next;
467 root->
next = path_spec;
494 path_spec = *path_spec_ptr;
496 if (new_spec ==
NULL)
610 PT_NODE *arg1, *arg2, *attr, *rvar;
843 set->info.function.arg_list = arg;
874 const char *dtblnam, *dattnam;
885 spec_id = (UINTPTR) spec;
917 eq->info.expr.op =
PT_EQ;
918 eq->info.expr.arg1 =
pt_name (parser, dattnam);
919 if (eq->info.expr.arg1 ==
NULL)
923 eq->info.expr.arg1->info.name.spec_id = spec_id;
924 eq->info.expr.arg1->info.name.resolved = dtblnam;
925 eq->info.expr.arg1->info.name.meta_class =
PT_NORMAL;
928 eq->info.expr.arg2 =
pt_name (parser,
"");
929 if (eq->info.expr.arg2 ==
NULL)
933 eq->info.expr.arg2->info.name.spec_id = node->
info.
spec.
id;
934 eq->info.expr.arg2->info.name.resolved = rvar->info.name.original;
935 eq->info.expr.arg2->info.name.meta_class =
PT_OID_ATTR;
946 if (eq->info.expr.arg1)
950 if (eq->info.expr.arg2)
986 PT_NODE *prev, *next, *from, *new_spec, *prev_spec =
NULL;
1075 else if (prev_spec !=
NULL)
1077 prev_spec->
next = new_spec;
1198 if (cast_coll != name_coll)
1299 PT_NODE *accumulator, *expr, *arg1, *arg2, *temp, *next;
1300 PT_NODE *join_term, *join_term_list, *s_name1, *s_name2;
1302 int spec1_cnt, spec2_cnt;
1303 bool found_equality_term, found_join_term;
1304 PT_NODE *spec, *derived_table, *attr, *col;
1305 int i, num_check, idx;
1313 join_term_list =
NULL;
1315 while ((expr = *wherep))
1320 found_equality_term = (expr->
or_next ==
NULL) ?
true :
false;
1322 if (found_equality_term !=
true)
1324 wherep = &(*wherep)->
next;
1329 found_equality_term =
false;
1335 found_equality_term =
true;
1346 found_equality_term =
true;
1351 if (found_equality_term !=
true)
1353 wherep = &(*wherep)->
next;
1358 found_equality_term =
false;
1360 for (i = 0; i < num_check; i++)
1381 found_equality_term =
true;
1414 for (spec = from; spec; spec = spec->
next)
1433 for (; col && idx; col = col->
next, idx--)
1453 found_equality_term =
true;
1460 if (found_equality_term !=
true)
1462 wherep = &(*wherep)->
next;
1470 save_where_next = (*wherep)->
next;
1481 *wherep = expr->
next;
1488 expr->
next = accumulator;
1502 for (temp = *wherep; temp; temp = temp->
next)
1520 for (join_term = join_term_list; join_term; join_term = join_term->
next)
1522 if (join_term->
etc == (
void *) temp)
1529 if (join_term ==
NULL)
1532 found_join_term =
false;
1567 found_join_term =
true;
1570 else if (spec1_cnt == 1)
1574 found_join_term =
true;
1576 else if (spec2_cnt == 1)
1585 found_join_term =
true;
1601 found_join_term =
true;
1604 else if (spec2_cnt == 1)
1608 found_join_term =
true;
1610 else if (spec1_cnt == 1)
1619 found_join_term =
true;
1642 if (found_join_term)
1646 if (join_term !=
NULL)
1648 join_term->
etc = (
void *) temp;
1674 *wherep = save_where_next;
1682 *wherep = save_where_next;
1703 *wherep = save_where_next;
1718 *wherep = save_where_next;
1736 *wherep = save_where_next;
1776 for (join_term = join_term_list; join_term; join_term = join_term->
next)
1779 join_term->
etc = (
void *)
NULL;
1885 PT_NODE *order, *order_next, *order_prev, *col, *col2, *col2_next;
1888 int const_order_count, order_move_count;
1889 bool need_merge_check;
1890 bool has_orderbynum_with_groupby;
1899 const_order_count = order_move_count = 0;
1900 need_merge_check =
false;
1901 has_orderbynum_with_groupby =
false;
1915 ordbynum_flag =
false;
1923 has_orderbynum_with_groupby =
true;
1927 need_merge_check =
true;
1933 if (need_merge_check)
1949 need_merge_check =
false;
1956 order_next = order->
next;
1990 if (order_prev ==
NULL)
2001 const_order_count++;
2008 for (j = 1; j <
i; j++)
2010 col2_next = col2->
next;
2044 if (order_move_count > 0)
2069 if (const_order_count > 0)
2072 if (need_merge_check)
2088 need_merge_check =
false;
2143 else if (has_orderbynum_with_groupby ==
true)
2236 PT_NODE *cnf_node, *dnf_node, *arg1, *arg2, *arg1_arg1, *arg2_arg1;
2237 PT_NODE *arg1_prior_father, *arg2_prior_father;
2240 int arg1_cnt, arg2_cnt;
2244 for (cnf_node = where; cnf_node; cnf_node = cnf_node->
next)
2249 for (dnf_node = cnf_node; dnf_node; dnf_node = dnf_node->
or_next)
2270 arg1_prior_father = arg2_prior_father =
NULL;
2276 arg1_prior_father = arg1;
2291 if (cnf_node == dnf_node && dnf_node->
or_next ==
NULL)
2303 dnf_node->
next = arg2;
2312 arg2_prior_father = arg2;
2326 for (attr = attr_list; attr; attr = attr->
next)
2350 for (attr = attr_list; attr; attr = attr->
next)
2376 for (dnf_node = cnf_node; dnf_node; dnf_node = dnf_node->
or_next)
2381 arg1_prior_father = arg2_prior_father =
NULL;
2389 arg1_prior_father = arg1;
2395 arg2_prior_father = arg2;
2405 if (arg1_arg1 && arg2_arg1)
2408 if (arg1_prior_father)
2412 if (arg2_prior_father)
2427 if (arg1_prior_father)
2431 if (arg2_prior_father)
2436 else if (op_type != 0 && arg1_arg1
2445 if (arg1_prior_father)
2462 else if (op_type != 0 && arg2_arg1
2471 if (arg2_prior_father)
2501 arg1_prior_father = arg2_prior_father =
NULL;
2506 arg1_prior_father = arg1;
2511 arg2_prior_father = arg2;
2525 else if (op_type ==
PT_OR)
2543 arg1_cnt = arg2_cnt = 0;
2544 for (attr = attr_list; attr; attr = attr->
next)
2555 if (arg1_cnt && arg2_cnt)
2561 if (!arg1_cnt || !arg2_cnt)
2568 if (arg1_cnt < arg2_cnt)
2571 if (arg1_prior_father)
2573 arg1 = arg1_prior_father;
2575 if (arg2_prior_father)
2577 arg2 = arg2_prior_father;
2585 if (arg1_prior_father)
2589 if (arg2_prior_father)
2602 if (arg1_prior_father)
2604 arg1 = arg1_prior_father;
2606 if (arg2_prior_father)
2608 arg2 = arg2_prior_father;
2616 if (arg1_prior_father)
2620 if (arg2_prior_father)
2646 PT_NODE *node, *sibling, *prev, *fold;
2649 PT_NODE *node_prior, *sibling_prior;
2653 while ((node = (prev ? prev->
next : *wherep)))
2659 prev = prev ? prev->
next : node;
2667 prev = prev ? prev->
next : node;
2674 for (sibling = *wherep; sibling; sibling = sibling->
next)
2760 prev = prev ? prev->
next : node;
2775 int find_const, find_attr;
2776 PT_NODE *arg_prior, *arg_prior_start;
2778 arg_prior = arg_prior_start =
NULL;
2811 for (node = start; node; node = node->
next)
2871 PT_NODE *node, *pair, *lower, *upper, *prev, *next, *arg2;
2877 for (node = *wherep; node; node = node->
next)
2942 for (prev = node; prev->
next != pair; prev = prev->
next)
3028 node->
next = *wherep;
3093 const bool has_escape_char,
const char *escape_str,
const bool compute_lower_bound,
3094 const int last_safe_logical_pos)
3108 assert (has_escape_char ^ (escape_str ==
NULL));
3119 last_safe_logical_pos);
3179 PT_NODE *
const escape,
bool *
const perform_generic_rewrite)
3182 bool has_escape_char =
false;
3183 const char *escape_str =
NULL;
3184 const char *pattern_str =
NULL;
3185 int pattern_size = 0;
3186 int pattern_length = 0;
3187 bool uses_escaping =
false;
3188 int num_logical_chars = 0;
3189 int last_safe_logical_pos = 0;
3190 int num_match_many = 0;
3191 int num_match_one = 0;
3198 *perform_generic_rewrite =
false;
3201 if (pattern ==
NULL || parser ==
NULL)
3215 has_escape_char =
true;
3220 int esc_char_len = 0;
3227 if (esc_char_len != 1)
3232 has_escape_char =
true;
3239 has_escape_char =
true;
3244 has_escape_char =
false;
3260 intl_char_count ((
unsigned char *) pattern_str, pattern_size, codeset, &pattern_length);
3265 &last_safe_logical_pos, &num_match_many, &num_match_one);
3272 assert (pattern_length >= num_logical_chars);
3273 uses_escaping = (num_logical_chars != pattern_length);
3275 if (num_match_many == 0 && num_match_one == 0)
3284 *perform_generic_rewrite =
true;
3293 if (pattern_length == 0)
3298 else if (pattern_str[pattern_size - 1] ==
' ')
3306 if (last_safe_logical_pos >= 0)
3309 *perform_generic_rewrite =
true;
3320 if (pattern_length == 1 && num_match_many == 1)
3323 assert (num_logical_chars == 1);
3333 if (num_match_many == 1 && num_match_one == 0 && last_safe_logical_pos >= 0
3334 && last_safe_logical_pos == num_logical_chars - 2)
3345 *perform_generic_rewrite =
true;
3350 if (between_and ==
NULL)
3361 last_safe_logical_pos);
3373 last_safe_logical_pos);
3388 else if (last_safe_logical_pos >= 0)
3390 *perform_generic_rewrite =
true;
3406 PT_NODE *
const escape,
const bool allocate_lower_bound)
3423 if (expr_pattern ==
NULL)
3435 if (expr_escape ==
NULL)
3441 else if (escape !=
NULL)
3446 if (expr_escape ==
NULL)
3455 if (expr_escape ==
NULL)
3506 if (between ==
NULL)
3516 if (match_col ==
NULL)
3525 if (between_and ==
NULL)
3555 like->
next = between;
3559 if (like_save ==
NULL)
3590 if (between !=
NULL)
3596 if (like_save !=
NULL)
3626 bool *
const like_expression_not_safe = (
bool *) arg;
3635 *like_expression_not_safe =
true;
3658 for (cnf_node = *cnf_list; cnf_node !=
NULL; cnf_node = cnf_node->
next)
3663 for (crt_expr = cnf_node; crt_expr !=
NULL; crt_expr = crt_expr->
or_next)
3669 bool perform_generic_rewrite =
false;
3732 if (!perform_generic_rewrite)
3737 if (crt_expr == cnf_node && crt_expr->
or_next ==
NULL)
3747 bool like_expression_not_safe =
false;
3751 if (like_expression_not_safe)
3757 if (like_expression_not_safe)
3763 if (or_prev !=
NULL)
3767 else if (prev !=
NULL)
3770 prev->
next = crt_expr;
3771 cnf_node = crt_expr;
3776 *cnf_list = crt_expr;
3777 cnf_node = crt_expr;
3798 PT_NODE *set_val, *list, *last, *range;
3828 #if defined(CUBRID_DEBUG) 3841 set_val = set_val->
next;
3862 PT_NODE *between_and, *sibling, *last, *prev, *in_arg2;
3871 if (node_prior ==
NULL)
3893 #if defined(CUBRID_DEBUG) 3908 if (op_type ==
PT_GT)
3912 else if (op_type ==
PT_GE)
3916 else if (op_type ==
PT_LT)
3928 #if defined(CUBRID_DEBUG) 3981 while ((sibling = prev->
or_next))
4044 #if defined(CUBRID_DEBUG) 4059 if (op_type ==
PT_GT)
4063 else if (op_type ==
PT_GE)
4067 else if (op_type ==
PT_LT)
4078 #if defined(CUBRID_DEBUG) 4225 else if (rc ==
DB_LT)
4230 else if (rc ==
DB_GT)
4283 PT_OP_TYPE r_op, r_lop, r_uop, s_op, s_lop, s_uop;
4284 DB_VALUE *r_lv, *r_uv, *s_lv, *s_uv;
4285 bool r_lv_copied =
false, r_uv_copied =
false;
4287 bool need_to_determine_upper_bound;
4298 r_lv = r_uv = s_lv = s_uv =
NULL;
4324 while ((sibling = current->
or_next))
4345 if (r_lv_copied && r_lv)
4348 r_lv_copied =
false;
4350 if (r_uv_copied && r_uv)
4353 r_uv_copied =
false;
4361 if (r_lv_copied && r_lv)
4364 r_lv_copied =
false;
4366 if (r_uv_copied && r_uv)
4369 r_uv_copied =
false;
4374 else if (r_lop ==
PT_EQ)
4377 if (r_lv_copied && r_lv)
4380 r_lv_copied =
false;
4382 if (r_uv_copied && r_uv)
4385 r_uv_copied =
false;
4393 if (r_lv_copied && r_lv)
4396 r_lv_copied =
false;
4398 if (r_uv_copied && r_uv)
4401 r_uv_copied =
false;
4419 else if (s_lop ==
PT_EQ)
4470 need_to_determine_upper_bound =
true;
4483 if (r_lv_copied && r_lv)
4486 r_lv_copied =
false;
4512 need_to_determine_upper_bound =
false;
4528 if (r_rank < s_rank)
4537 if (need_to_determine_upper_bound ==
true)
4551 if (r_uv_copied && r_uv)
4554 r_uv_copied =
false;
4579 if (r_rank < s_rank)
4603 r_lop = r_uop =
PT_EQ;
4669 if (r_lv_copied && r_lv)
4673 if (r_uv_copied && r_uv)
4705 PT_NODE *cnf_node, *dnf_node, *cnf_prev, *dnf_prev;
4706 PT_NODE *arg1_prior, *func_arg;
4709 bool is_all_constant;
4713 while ((cnf_node = (cnf_prev ? cnf_prev->
next : *wherep)))
4718 while ((dnf_node = (dnf_prev ? dnf_prev->
or_next : cnf_node)))
4723 dnf_prev = dnf_prev ? dnf_prev->
or_next : dnf_node;
4730 is_all_constant =
true;
4735 for ( ; func_arg; func_arg = func_arg->
next)
4744 is_all_constant =
false;
4748 if (is_all_constant)
4761 dnf_prev = dnf_prev ? dnf_prev->
or_next : dnf_node;
4769 dnf_prev = dnf_prev ? dnf_prev->
or_next : dnf_node;
4831 dnf_prev = dnf_prev ? dnf_prev->
or_next : dnf_node;
4833 cnf_prev = cnf_prev ? cnf_prev->
next : cnf_node;
4847 PT_NODE *range, *sibling, *prev, *new_range, *temp1, *temp2;
4848 PT_OP_TYPE r_op, r_lop, r_uop, s_op, s_lop, s_uop, new_op, new_lop, new_uop;
4849 DB_VALUE *r_lv, *r_uv, *s_lv, *s_uv, *new_lv, *new_uv;
4851 bool dont_remove_sibling =
false;
4852 bool include_nonvalue;
4868 prev = prev ? prev->
or_next : range;
4869 dont_remove_sibling =
true;
4877 prev = prev ? prev->
or_next : range;
4878 dont_remove_sibling =
true;
4894 else if (r_lop ==
PT_EQ)
4910 prev = prev ? prev->
or_next : range;
4911 dont_remove_sibling =
true;
4916 include_nonvalue =
false;
4923 include_nonvalue =
true;
4928 if (include_nonvalue ==
true)
4931 prev = prev ? prev->
or_next : range;
4962 else if (s_lop ==
PT_EQ)
4979 dont_remove_sibling =
true;
5014 temp2->
or_next = (new_range == range) ?
NULL : new_range;
5121 if (new_range ==
NULL)
5124 prev = prev ? prev->
or_next : range;
5129 if (new_range != range)
5163 if (dont_remove_sibling !=
true)
5185 prev = prev ? prev->
or_next : sibling;
5217 PT_NODE *node, *sibling, *node_prev, *sibling_prev;
5219 PT_NODE *arg1_prior, *sibling_prior;
5223 while ((node = (node_prev ? node_prev->
next : *wherep)))
5229 node_prev = node_prev ? node_prev->
next : *wherep;
5239 node_prev = node_prev ? node_prev->
next : *wherep;
5285 sibling_prev = node;
5287 while ((sibling = sibling_prev->
next))
5292 sibling_prev = sibling_prev->
next;
5302 sibling_prev = sibling_prev->
next;
5311 sibling_prev = sibling_prev->
next;
5320 sibling_prev = sibling_prev->
next;
5326 sibling_prev = sibling_prev->
next;
5335 sibling_prev = sibling_prev->
next;
5347 sibling_prev->
next = sibling->
next;
5354 sibling_prev = sibling_prev->
next;
5372 *wherep = node->
next;
5447 node->
next = *wherep;
5456 node_prev = (node_prev) ? node_prev->
next : *wherep;
5474 PT_NODE *spec, *prev_spec, *expr, *ns, *save_next;
5493 rewrite_again =
false;
5519 save_next = expr->
next;
5523 expr->
next = save_next;
5529 rewrite_again =
true;
5533 locate_info.
end = locate_info.
start;
5538 for (ns = spec->
next;
5545 locate_info.
end = locate_info.
start;
5563 while (rewrite_again);
5660 for (spec2 = info.
start_spec; spec2 != spec; spec2 = spec2->
next)
5719 PT_NODE *t_node, *next, *derived;
5726 bool remove_order_by =
true;
5737 remove_order_by =
false;
5749 remove_order_by =
false;
5753 if (remove_order_by ==
true)
5757 remove_order_by =
false;
5761 if (remove_order_by ==
true)
5767 remove_order_by =
false;
5781 next = t_node->
next;
5793 bool skip_query_rewrite_as_derived =
false;
5800 skip_query_rewrite_as_derived =
true;
5805 skip_query_rewrite_as_derived =
false;
5810 if (!skip_query_rewrite_as_derived)
5818 if (derived ==
NULL)
5861 PT_NODE *using_index =
NULL, *hint_node, *prev_node, *next_node;
5863 bool is_sorted, is_idx_reversed, is_idx_match_nokl, is_hint_masked;
5865 PT_NODE *hint_none, *root_node;
5866 PT_NODE dummy_hint_local, *dummy_hint;
5885 if (using_index ==
NULL)
5895 hint_node = using_index;
5898 while (hint_node !=
NULL)
5902 hint_none = hint_node;
5905 prev_node = (prev_node ==
NULL) ? hint_node : prev_node->
next;
5906 hint_node = hint_node->
next;
5909 if (hint_none !=
NULL)
5913 if (prev_node !=
NULL)
5920 hint_node = hint_none->
next;
5921 if (hint_node !=
NULL)
5928 using_index = hint_none;
5936 hint_node = using_index;
5937 while (hint_node !=
NULL && (next_node = hint_node->next) !=
NULL)
5939 if (next_node->info.name.original ==
NULL && next_node->info.name.resolved !=
NULL 5940 && strcmp (next_node->info.name.resolved,
"*") != 0)
5949 hint_node = hint_node->next;
5962 root_node = prev_node = using_index;
5963 hint_node = using_index->
next;
5969 dummy_hint = &dummy_hint_local;
5970 dummy_hint->
next = using_index;
5973 root_node = prev_node = dummy_hint;
5974 hint_node = using_index;
5982 prev_node = root_node;
5983 hint_node = prev_node->
next;
5985 while ((next_node = hint_node->next) !=
NULL)
5987 is_idx_reversed =
false;
5988 is_idx_match_nokl =
false;
5991 is_idx_reversed =
true;
5993 else if (hint_node->etc == next_node->etc)
5997 int res_cmp_tbl_names = -1;
6000 assert (hint_node->info.name.resolved !=
NULL && next_node->info.name.resolved !=
NULL);
6006 if (res_cmp_tbl_names == 0)
6009 if (hint_node->info.name.original !=
NULL && next_node->info.name.original !=
NULL)
6012 int res_cmp_idx_names;
6016 if (res_cmp_idx_names == 0)
6018 is_idx_match_nokl =
true;
6022 is_idx_reversed = (res_cmp_idx_names > 0);
6028 assert (hint_node->info.name.original ==
NULL && next_node->info.name.original ==
NULL);
6030 is_idx_match_nokl =
true;
6035 is_idx_reversed = (res_cmp_tbl_names > 0);
6038 if (is_idx_match_nokl)
6042 if (next_node->info.name.indx_key_limit !=
NULL)
6045 if (hint_node->info.name.indx_key_limit !=
NULL)
6049 is_idx_reversed =
false;
6050 is_idx_match_nokl =
false;
6056 assert (!is_idx_reversed);
6057 is_idx_reversed =
true;
6064 if (is_idx_reversed)
6067 hint_node->next = next_node->next;
6068 next_node->next = hint_node;
6069 prev_node->next = next_node;
6072 hint_node = prev_node->next;
6073 next_node = hint_node->next;
6076 if (is_idx_match_nokl)
6079 hint_node->next = next_node->next;
6080 next_node->next =
NULL;
6085 prev_node = prev_node->next;
6086 hint_node = prev_node->next;
6093 hint_node = root_node->
next;
6094 while (hint_node !=
NULL)
6096 next_node = hint_node->
next;
6097 prev_node = hint_node;
6098 while (next_node !=
NULL)
6100 if (next_node->etc == hint_node->etc)
6103 prev_node = next_node;
6104 next_node = next_node->
next;
6112 is_hint_masked =
false;
6119 is_hint_masked =
true;
6128 next_node = prev_node;
6130 prev_node = next_node;
6131 next_node = next_node->next;
6133 hint_node = hint_node->next;
6139 using_index = root_node->
next;
6144 using_index = root_node;
6178 PT_NODE *cnf_node, *arg1, *arg2, *select_list, *arg2_list;
6180 PT_NODE *new_spec, *new_attr, *new_func;
6181 int *idx = (
int *) arg;
6183 PT_NODE *save_next, *arg1_next, *new_attr_next, *tmp, *arg2_next;
6236 else if (op_type ==
PT_EQ)
6250 for (arg1_next = arg1, arg2_next = arg2_list; arg1_next && arg2_next;
6251 arg1_next = arg1_next->
next, arg2_next = arg2_next->
next)
6315 if (new_attr !=
NULL)
6317 new_attr = new_attr->
next;
6322 save_next = cnf_node->
next;
6326 for (tmp =
NULL; arg1 && new_attr; arg1 = arg1_next, new_attr = new_attr_next)
6336 arg1_next = arg1->
next;
6338 new_attr_next = new_attr->
next;
6352 cnf_node->
next = save_next;
6370 if (rewritten ==
NULL)
6402 if (select_list ==
NULL)
6409 if (new_func ==
NULL)
6496 PT_NODE *cnf_node, *dnf_node, *between_and, *range;
6500 for (cnf_node = where; cnf_node; cnf_node = cnf_node->
next)
6504 for (dnf_node = cnf_node; dnf_node; dnf_node = dnf_node->
or_next)
6611 while (select !=
NULL)
6618 select = select->
next;
6680 t_node = t_node->
next;
6683 for (spec = *fromp; spec !=
NULL; spec = spec->
next)
6700 t_node = t_node->
next;
6717 int level, seqno = 0;
6718 PT_NODE *next, *pred, **wherep, **havingp, *dummy;
6719 PT_NODE *spec, *derived_table;
6720 PT_NODE **startwithp, **connectbyp, **aftercbfilterp;
6722 PT_NODE **merge_upd_wherep, **merge_ins_wherep, **merge_del_wherep;
6725 bool call_auto_parameterize =
false;
6728 wherep = havingp = startwithp = connectbyp = aftercbfilterp = &dummy;
6729 merge_upd_wherep = merge_ins_wherep = merge_del_wherep = &dummy;
6730 orderby_for_p = &dummy;
6844 bool single_tuple_bak;
6857 if (derived !=
NULL)
6953 if (!*wherep && !*havingp && !*aftercbfilterp && !*startwithp && !*connectbyp && !*merge_upd_wherep
6954 && !*merge_ins_wherep && !*merge_del_wherep && !*orderby_for_p && !*show_argp)
6973 *wherep =
pt_cnf (parser, *wherep);
6977 *havingp =
pt_cnf (parser, *havingp);
6981 *startwithp =
pt_cnf (parser, *startwithp);
6985 *connectbyp =
pt_cnf (parser, *connectbyp);
6987 if (*aftercbfilterp)
6989 *aftercbfilterp =
pt_cnf (parser, *aftercbfilterp);
6991 if (*merge_upd_wherep)
6993 *merge_upd_wherep =
pt_cnf (parser, *merge_upd_wherep);
6995 if (*merge_ins_wherep)
6997 *merge_ins_wherep =
pt_cnf (parser, *merge_ins_wherep);
6999 if (*merge_del_wherep)
7001 *merge_del_wherep =
pt_cnf (parser, *merge_del_wherep);
7005 *orderby_for_p =
pt_cnf (parser, *orderby_for_p);
7014 int has_pseudocolumn;
7020 for (cnf = *havingp; cnf; cnf = next)
7049 has_pseudocolumn = 0;
7051 if (has_pseudocolumn)
7097 if (*aftercbfilterp)
7101 if (*merge_upd_wherep)
7105 if (*merge_ins_wherep)
7109 if (*merge_del_wherep)
7131 if (*aftercbfilterp)
7135 if (*merge_upd_wherep)
7139 if (*merge_ins_wherep)
7143 if (*merge_del_wherep)
7165 if (*aftercbfilterp)
7169 if (*merge_upd_wherep)
7173 if (*merge_ins_wherep)
7177 if (*merge_del_wherep)
7199 if (*aftercbfilterp)
7203 if (*merge_upd_wherep)
7207 if (*merge_ins_wherep)
7211 if (*merge_del_wherep)
7233 if (*aftercbfilterp)
7237 if (*merge_upd_wherep)
7241 if (*merge_ins_wherep)
7245 if (*merge_del_wherep)
7267 if (*aftercbfilterp)
7271 if (*merge_upd_wherep)
7275 if (*merge_ins_wherep)
7279 if (*merge_del_wherep)
7301 if (*aftercbfilterp)
7305 if (*merge_upd_wherep)
7309 if (*merge_ins_wherep)
7313 if (*merge_del_wherep)
7360 call_auto_parameterize =
true;
7365 if (*wherep && (call_auto_parameterize || (*wherep)->flag.force_auto_parameterize))
7370 if (*havingp && call_auto_parameterize)
7375 if (*startwithp && call_auto_parameterize)
7380 if (*connectbyp && call_auto_parameterize)
7385 if (*aftercbfilterp && call_auto_parameterize)
7390 if (*merge_upd_wherep && (call_auto_parameterize || (*merge_upd_wherep)->flag.force_auto_parameterize))
7395 if (*merge_ins_wherep && call_auto_parameterize)
7400 if (*merge_del_wherep && call_auto_parameterize)
7405 if (*orderby_for_p && call_auto_parameterize)
7431 *show_argp = result_list;
7463 PT_NODE *limit_offsetp, *limit_row_countp;
7464 PT_NODE *new_limit_offsetp, *new_limit_row_countp;
7471 limit_offsetp =
NULL;
7472 limit_row_countp =
NULL;
7493 limit_offsetp =
NULL;
7512 limit_offsetp =
NULL;
7531 limit_offsetp =
NULL;
7540 new_limit_offsetp = limit_offsetp;
7559 new_limit_row_countp = limit_row_countp;
7581 if (limit_offsetp !=
NULL)
7593 if (limit_offsetp !=
NULL)
7605 if (limit_offsetp !=
NULL)
7623 PT_NODE *key_limit_lower_boundp, *key_limit_upper_boundp;
7648 while (using_index !=
NULL)
7652 key_limit_lower_boundp = key_limit_upper_boundp =
NULL;
7662 if (key_limit_upper_boundp !=
NULL)
7674 if (key_limit_lower_boundp !=
NULL)
7686 using_index = using_index->
next;
7702 PT_NODE *node, *prev, *next, *spec;
7731 for (node = *wherep; node !=
NULL; node = next)
#define PT_EXPR_INFO_DO_NOT_AUTOPARAM
static void qo_convert_to_range_helper(PARSER_CONTEXT *parser, PT_NODE *node)
static void qo_fold_is_and_not_null(PARSER_CONTEXT *parser, PT_NODE **wherep)
#define pt_is_expr_node(n)
PT_NODE * pt_name(PARSER_CONTEXT *parser_ptr, const char *name)
int db_compress_like_pattern(const DB_VALUE *const pattern, DB_VALUE *compressed_pattern, const bool has_escape_char, const char *escape_str)
QFILE_TUPLE_VALUE_POSITION pos_descr
#define PT_EXPR_INFO_COPYPUSH
int db_get_info_for_like_optimization(const DB_VALUE *const pattern, const bool has_escape_char, const char *escape_str, int *const num_logical_chars, int *const last_safe_logical_pos, int *const num_match_many, int *const num_match_one)
static PT_NODE * qo_search_comp_pair_term(PARSER_CONTEXT *parser, PT_NODE *start)
static PT_NODE * qo_convert_attref_to_dotexpr_pre(PARSER_CONTEXT *parser, PT_NODE *spec, void *arg, int *continue_walk)
#define LANG_SYS_COLLATION
PT_NODE * pt_find_order_value_in_list(PARSER_CONTEXT *parser, const PT_NODE *sort_value, const PT_NODE *order_list)
DB_VALUE_COMPARE_RESULT tp_value_compare(const DB_VALUE *value1, const DB_VALUE *value2, int allow_coercion, int total_order)
PT_NODE * pt_check_orderbynum_pre(PARSER_CONTEXT *parser, PT_NODE *node, void *arg, int *continue_walk)
#define PT_IS_CHAR_STRING_TYPE(t)
TP_DOMAIN * expected_domain
#define PT_ERRORm(parser, node, setNo, msgNo)
void qo_get_optimization_param(void *, QO_PARAM,...)
static PT_NODE * qo_rewrite_hidden_col_as_derived(PARSER_CONTEXT *parser, PT_NODE *node, PT_NODE *parent_node)
int pt_comp_to_between_op(PT_OP_TYPE left, PT_OP_TYPE right, PT_COMP_TO_BETWEEN_OP_CODE_TYPE code, PT_OP_TYPE *between)
static PT_NODE * qo_allocate_like_bound_for_index_scan(PARSER_CONTEXT *const parser, PT_NODE *const like, PT_NODE *const pattern, PT_NODE *const escape, const bool allocate_lower_bound)
static PT_NODE * qo_find_like_rewrite_bound(PARSER_CONTEXT *const parser, PT_NODE *const pattern, DB_VALUE *const pattern_str, const bool has_escape_char, const char *escape_str, const bool compute_lower_bound, const int last_safe_logical_pos)
#define MSGCAT_SEMANTIC_OUT_OF_MEMORY
int db_get_string_collation(const DB_VALUE *value)
PT_MISC_TYPE all_or_distinct
#define PT_EXPR_INFO_SET_FLAG(e, f)
#define ER_QSTR_INVALID_ESCAPE_SEQUENCE
static void qo_reduce_equality_terms(PARSER_CONTEXT *parser, PT_NODE *node, PT_NODE **wherep)
PT_NODE * pt_get_select_list(PARSER_CONTEXT *parser, PT_NODE *query)
void pt_reset_error(PARSER_CONTEXT *parser)
enum pt_type_enum PT_TYPE_ENUM
#define assert_release(e)
PT_NODE * pt_expression_1(PARSER_CONTEXT *parser_ptr, PT_OP_TYPE op, PT_NODE *arg1)
int db_value_compare(const DB_VALUE *value1, const DB_VALUE *value2)
PT_TYPE_ENUM pt_db_to_type_enum(const DB_TYPE t)
struct pt_query_info::@123 flag
PT_NODE * pt_get_end_path_node(PT_NODE *node)
static PT_NODE * qo_rewrite_like_for_index_scan(PARSER_CONTEXT *const parser, PT_NODE *like, PT_NODE *const pattern, PT_NODE *const escape)
PT_NODE * pt_expression_2(PARSER_CONTEXT *parser_ptr, PT_OP_TYPE op, PT_NODE *arg1, PT_NODE *arg2)
PARSER_VARCHAR * pt_append_bytes(const PARSER_CONTEXT *parser, PARSER_VARCHAR *old_string, const char *new_tail, const int new_tail_length)
static void qo_rewrite_index_hints(PARSER_CONTEXT *parser, PT_NODE *statement)
union pt_query_info::@124 q
static void qo_do_auto_parameterize_limit_clause(PARSER_CONTEXT *parser, PT_NODE *node)
PT_NODE * pt_has_non_groupby_column_node(PARSER_CONTEXT *parser, PT_NODE *node, void *arg, int *continue_walk)
struct pt_merge_info::@125 update
#define PT_IS_DOT_NODE(n)
bool pt_false_search_condition(PARSER_CONTEXT *parser, const PT_NODE *statement)
#define PT_IS_NULL_NODE(e)
DB_DOMAIN * pt_node_to_db_domain(PARSER_CONTEXT *parser, PT_NODE *node, const char *class_name)
void pt_select_list_to_one_col(PARSER_CONTEXT *parser, PT_NODE *node, bool do_one)
#define PT_NAME_INFO_IS_FLAGED(e, f)
#define pt_is_orderbynum(n)
unsigned single_table_opt
#define PT_IS_OID_NAME(n)
static void qo_move_on_clause_of_explicit_join_to_where_clause(PARSER_CONTEXT *parser, PT_NODE **fromp, PT_NODE **wherep)
PT_NODE * pt_wrap_with_cast_op(PARSER_CONTEXT *parser, PT_NODE *arg, PT_TYPE_ENUM new_type, int p, int s, PT_NODE *desired_dt)
static PT_NODE * qo_collect_name_spec(PARSER_CONTEXT *parser, PT_NODE *node, void *arg, int *continue_walk)
#define MSGCAT_SEMANTIC_CANT_COERCE_TO
static PT_NODE * qo_set_value_to_range_list(PARSER_CONTEXT *parser, PT_NODE *node)
const char * mq_generate_name(PARSER_CONTEXT *parser, const char *root, int *version)
DB_TYPE pt_type_enum_to_db(const PT_TYPE_ENUM t)
void pt_init_node(PT_NODE *node, PT_NODE_TYPE node_type)
PT_NODE * mq_regenerate_if_ambiguous(PARSER_CONTEXT *parser, PT_NODE *spec, PT_NODE *statement, PT_NODE *from)
bool pt_is_symmetric_op(PT_OP_TYPE op)
PT_MISC_TYPE derived_table_type
void qo_do_auto_parameterize(PARSER_CONTEXT *parser, PT_NODE *where)
#define PT_NODE_PRINT_VALUE_TO_TEXT(p, n)
int pr_free_value(DB_VALUE *value)
PT_OP_TYPE pt_converse_op(PT_OP_TYPE op)
void er_set(int severity, const char *file_name, const int line_no, int err_id, int num_args,...)
LANG_COLLATION * lang_get_collation(const int coll_id)
PT_NODE * del_search_cond
static void qo_apply_range_intersection_helper(PARSER_CONTEXT *parser, PT_NODE *node1, PT_NODE *node2)
PT_FUNCTION_INFO function
#define CAST_POINTER_TO_NODE(p)
static int qo_is_cast_attr(PT_NODE *expr)
static void pt_free_escape_char(PARSER_CONTEXT *const parser, PT_NODE *const like, PT_NODE *const pattern, PT_NODE *const escape)
#define LIKE_WILDCARD_MATCH_MANY
#define PT_ERRORmf2(parser, node, setNo, msgNo, arg1, arg2)
static int qo_is_oid_const(PT_NODE *node)
#define PT_IS_CONST_NOT_HOSTVAR(n)
#define PT_IS_QUERY_NODE_TYPE(x)
static PT_NODE * qo_replace_spec_name_with_null(PARSER_CONTEXT *parser, PT_NODE *node, void *arg, int *continue_walk)
int prm_get_integer_value(PARAM_ID prm_id)
PT_NODE * pt_rewrite_to_auto_param(PARSER_CONTEXT *parser, PT_NODE *value)
const char * pt_show_type_enum(PT_TYPE_ENUM t)
#define PT_GET_COLLATION_MODIFIER(p)
static int qo_reduce_order_by(PARSER_CONTEXT *parser, PT_NODE *node)
PT_NODE * pt_check_orderbynum_post(PARSER_CONTEXT *parser, PT_NODE *node, void *arg, int *continue_walk)
COMP_DBVALUE_WITH_OPTYPE_RESULT
bool pt_is_pseudo_const(PT_NODE *expr)
PT_NODE * flat_entity_list
PT_MISC_TYPE all_distinct
bool pt_has_analytic(PARSER_CONTEXT *parser, PT_NODE *node)
int sm_is_partitioned_class(MOP op)
#define PT_IS_PARAMETERIZED_TYPE(t)
int intl_identifier_casecmp(const char *str1, const char *str2)
PT_NODE * pt_make_string_value(PARSER_CONTEXT *parser, const char *value_string)
#define DB_VALUE_DOMAIN_TYPE(value)
#define PT_IS_NATIONAL_CHAR_STRING_TYPE(t)
PT_NODE * parser_copy_tree(PARSER_CONTEXT *parser, const PT_NODE *tree)
#define PT_IS_VALUE_QUERY(n)
PT_NODE * pt_semantic_type(PARSER_CONTEXT *parser, PT_NODE *tree, SEMANTIC_CHK_INFO *sc_info)
static DNF_MERGE_RANGE_RESULT qo_merge_range_helper(PARSER_CONTEXT *parser, PT_NODE *node)
#define OPTIMIZATION_ENABLED(level)
PT_SHOWSTMT_INFO showstmt
#define PT_SELECT_INFO_HAS_AGG
#define PT_NAME_INFO_CONSTANT
int db_string_put_cs_and_collation(DB_VALUE *value, const int codeset, const int collation_id)
PT_NODE * mq_optimize(PARSER_CONTEXT *parser, PT_NODE *statement)
#define PT_IS_VALUE_NODE(n)
PT_NODE * pt_remove_from_list(PARSER_CONTEXT *parser, PT_NODE *node, PT_NODE *list)
#define TP_DOMAIN_TYPE(dom)
PT_DATA_TYPE_INFO data_type
#define MSGCAT_SEMANTIC_SORT_DIR_CONFLICT
static void qo_do_auto_parameterize_keylimit_clause(PARSER_CONTEXT *parser, PT_NODE *node)
static void qo_converse_sarg_terms(PARSER_CONTEXT *parser, PT_NODE *where)
DB_VALUE * pr_copy_value(DB_VALUE *value)
static PT_NODE * qo_construct_new_set(PARSER_CONTEXT *parser, PT_NODE *node)
PT_NODE * pt_pointer_stack_pop(PARSER_CONTEXT *parser, PT_NODE *stack, PT_NODE **node)
#define pt_is_const_not_hostvar(n)
int tp_valid_indextype(DB_TYPE type)
bool pt_is_const_expr_node(PT_NODE *node)
PT_NODE * referenced_attrs
PT_NODE * pt_limit_to_numbering_expr(PARSER_CONTEXT *parser, PT_NODE *limit, PT_OP_TYPE num_op, bool is_gby_num)
static PT_NODE * qo_collect_name_spec_post(PARSER_CONTEXT *parser, PT_NODE *node, void *arg, int *continue_walk)
static int qo_reduce_order_by_for(PARSER_CONTEXT *parser, PT_NODE *node)
#define pt_is_multi_col_term(n)
TP_DOMAIN * tp_domain_cache(TP_DOMAIN *transient)
#define PT_EXPR_INFO_TRANSITIVE
static PT_NODE * qo_get_name_by_spec_id(PARSER_CONTEXT *parser, PT_NODE *node, void *arg, int *continue_walk)
static void qo_convert_to_range(PARSER_CONTEXT *parser, PT_NODE **wherep)
int pt_check_path_eq(PARSER_CONTEXT *parser, const PT_NODE *p, const PT_NODE *q)
#define PT_IS_COLLECTION_TYPE(t)
PT_NODE * pt_is_pseudocolumn_node(PARSER_CONTEXT *parser, PT_NODE *tree, void *arg, int *continue_walk)
static bool qo_can_generate_single_table_connect_by(PARSER_CONTEXT *parser, PT_NODE *node)
static void qo_rewrite_like_terms(PARSER_CONTEXT *parser, PT_NODE **cnf_list)
static void qo_rewrite_one_like_term(PARSER_CONTEXT *const parser, PT_NODE *const like, PT_NODE *const pattern, PT_NODE *const escape, bool *const perform_generic_rewrite)
static int qo_range_optype_rank(PT_OP_TYPE op)
bool pt_has_aggregate(PARSER_CONTEXT *parser, PT_NODE *node)
PT_NODE * qo_check_nullable_expr(PARSER_CONTEXT *parser, PT_NODE *node, void *arg, int *continue_walk)
int pr_clear_value(DB_VALUE *value)
static PT_NODE * qo_rewrite_subqueries(PARSER_CONTEXT *parser, PT_NODE *node, void *arg, int *continue_walk)
#define PT_IDX_HINT_ORDER(hint_node)
static PT_NODE * qo_optimize_queries(PARSER_CONTEXT *parser, PT_NODE *node, void *arg, int *continue_walk)
PT_NODE * pt_get_first_arg_ignore_prior(PT_NODE *node)
int pt_between_to_comp_op(PT_OP_TYPE between, PT_OP_TYPE *left, PT_OP_TYPE *right)
PT_NODE * parser_append_node(PT_NODE *node, PT_NODE *list)
char * pt_short_print(PARSER_CONTEXT *parser, const PT_NODE *node)
int pt_is_function_index_expression(PT_NODE *node)
#define TP_IS_CHAR_TYPE(typeid)
PT_NODE * parser_new_node(PARSER_CONTEXT *parser, PT_NODE_TYPE node_type)
static void error(const char *msg)
#define PT_NODE_MOVE_NUMBER_OUTERLINK(t, s)
void parser_free_node(const PARSER_CONTEXT *parser, PT_NODE *node)
static int qo_is_partition_attr(PT_NODE *node)
short db_value_is_initialized
PT_SORT_SPEC_INFO sort_spec
bool pt_name_equal(PARSER_CONTEXT *parser, const PT_NODE *name1, const PT_NODE *name2)
void parser_free_tree(PARSER_CONTEXT *parser, PT_NODE *tree)
#define DB_MAX_LITERAL_PRECISION
static PT_NODE * qo_get_next_oid_pred(PT_NODE *pred)
#define MSGCAT_SET_PARSER_SEMANTIC
static PT_NODE * qo_convert_attref_to_dotexpr(PARSER_CONTEXT *parser, PT_NODE *node, void *arg, int *continue_walk)
struct pt_merge_info::@126 insert
#define PT_IS_EXPR_NODE(n)
#define PT_IS_CONST_INPUT_HOSTVAR(n)
PT_NODE * pt_find_aggregate_functions_pre(PARSER_CONTEXT *parser, PT_NODE *tree, void *arg, int *continue_walk)
static PT_NODE * qo_check_like_expression_pre(PARSER_CONTEXT *parser, PT_NODE *node, void *arg, int *continue_walk)
PT_NODE * pt_point(PARSER_CONTEXT *parser, const PT_NODE *in_tree)
bool pt_is_function_index_expr(PARSER_CONTEXT *parser, PT_NODE *expr, bool report_error)
#define PT_SELECT_INFO_SET_FLAG(s, f)
static PT_NODE * qo_analyze_path_join(PARSER_CONTEXT *parser, PT_NODE *path_spec, void *arg, int *continue_walk)
#define PT_IS_FUNCTION(n)
enum intl_codeset INTL_CODESET
int intl_char_count(const unsigned char *src, int length_in_bytes, INTL_CODESET src_codeset, int *char_count)
PT_NODE * pt_pointer_stack_push(PARSER_CONTEXT *parser, PT_NODE *stack, PT_NODE *node)
bool prm_get_bool_value(PARAM_ID prm_id)
static PT_NODE * qo_analyze_path_join_pre(PARSER_CONTEXT *parser, PT_NODE *spec, void *arg, int *continue_walk)
int db_get_string_size(const DB_VALUE *value)
int pt_is_attr(PT_NODE *node)
static bool pt_is_ascii_string_value_node(const PT_NODE *const node)
bool pt_sort_spec_cover(PT_NODE *cur_list, PT_NODE *new_list)
PT_NODE * after_cb_filter
#define PT_EXPR_INFO_ORDERBYNUM_C
static PT_NODE * qo_reset_location(PARSER_CONTEXT *parser, PT_NODE *node, void *arg, int *continue_walk)
#define TP_FLOATING_PRECISION_VALUE
PT_NODE * pt_get_subquery_of_insert_select(const PT_NODE *insert_statement)
int pt_length_of_select_list(PT_NODE *list, int hidden_col)
int db_make_null(DB_VALUE *value)
#define DB_IS_NULL(value)
static void qo_reduce_comp_pair_terms(PARSER_CONTEXT *parser, PT_NODE **wherep)
PT_NODE * pt_lambda_with_arg(PARSER_CONTEXT *parser, PT_NODE *tree_with_names, PT_NODE *name_node, PT_NODE *corresponding_tree, bool loc_check, int type, bool dont_replace)
static int qo_is_reduceable_const(PT_NODE *expr)
PT_NODE * pt_find_aggregate_functions_post(PARSER_CONTEXT *parser, PT_NODE *tree, void *arg, int *continue_walk)
#define PT_IS_SET_TYPE(n)
static PT_NODE * qo_make_new_derived_tblspec(PARSER_CONTEXT *parser, PT_NODE *node, PT_NODE *pred, int *seqno)
#define PT_INTERNAL_ERROR(parser, what)
int db_value_clear(DB_VALUE *value)
int db_make_int(DB_VALUE *value, const int num)
PT_NODE * pt_cnf(PARSER_CONTEXT *parser, PT_NODE *node)
static void qo_apply_range_intersection(PARSER_CONTEXT *parser, PT_NODE **wherep)
#define pt_has_error(parser)
static PT_MISC_TYPE qo_find_best_path_type(PT_NODE *spec)
#define PT_IS_EXPR_NODE_WITH_OPERATOR(n, op_type)
SORT_NULLS pt_to_null_ordering(PT_NODE *sort_spec)
static COMP_DBVALUE_WITH_OPTYPE_RESULT qo_compare_dbvalue_with_optype(DB_VALUE *val1, PT_OP_TYPE op1, DB_VALUE *val2, PT_OP_TYPE op2)
#define PT_HAS_COLLATION(t)
#define PT_EXPR_INFO_EMPTY_RANGE
#define PT_EXPR_INFO_CLEAR_FLAG(e, f)
PT_NODE * pt_dbval_to_value(PARSER_CONTEXT *parser, const DB_VALUE *val)
static PT_NODE * qo_rewrite_innerjoin(PARSER_CONTEXT *parser, PT_NODE *node, void *arg, int *continue_walk)
int pt_length_of_list(const PT_NODE *list)
struct parser_node::@132 flag
void pt_split_join_preds(PARSER_CONTEXT *parser, PT_NODE *predicates, PT_NODE **join_part, PT_NODE **after_cb_filter)
DB_VALUE * pt_value_to_db(PARSER_CONTEXT *parser, PT_NODE *value)
static PT_NODE * qo_optimize_queries_post(PARSER_CONTEXT *parser, PT_NODE *tree, void *arg, int *continue_walk)
TP_DOMAIN_STATUS tp_value_cast_force(const DB_VALUE *src, DB_VALUE *dest, const TP_DOMAIN *desired_domain, bool implicit_coercion)
#define PT_EXPR_INFO_INSTNUM_C
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_EXPR_INFO_IS_FLAGED(e, f)
#define PT_ERRORf(parser, node, msg, arg1)
#define PT_IS_NAME_NODE(n)
int db_get_string_codeset(const DB_VALUE *value)
PT_NODE * parser_copy_tree_list(PARSER_CONTEXT *parser, PT_NODE *tree)
static PT_NODE * qo_rewrite_outerjoin(PARSER_CONTEXT *parser, PT_NODE *node, void *arg, int *continue_walk)
static PT_NODE * qo_rewrite_oid_equality(PARSER_CONTEXT *parser, PT_NODE *node, PT_NODE *pred, int *seqno)
int db_get_like_optimization_bounds(const DB_VALUE *const pattern, DB_VALUE *bound, const bool has_escape_char, const char *escape_str, const bool compute_lower_bound, const int last_safe_logical_pos)
DB_CONST_C_CHAR db_get_string(const DB_VALUE *value)
#define PT_ERRORmf(parser, node, setNo, msgNo, arg1)
unsigned is_hidden_column
int pt_check_class_eq(PARSER_CONTEXT *parser, PT_NODE *p, PT_NODE *q)
#define PT_IS_EXPR_WITH_PRIOR_ARG(x)
#define PT_EXPR_INFO_CAST_COLL_MODIFIER
static bool qo_check_condition_yields_null(PARSER_CONTEXT *parser, PT_NODE *path_spec, PT_NODE *query_where)
PT_NODE * qo_check_nullable_expr_with_spec(PARSER_CONTEXT *parser, PT_NODE *node, void *arg, int *continue_walk)