CUBRID Engine  latest
parse_tree_cl.c
Go to the documentation of this file.
1 /*
2  * Copyright 2008 Search Solution Corporation
3  * Copyright 2016 CUBRID Corporation
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
19 /*
20  * parse_tree_cl.c - Parser module for the client
21  */
22 
23 #ident "$Id$"
24 
25 #include "config.h"
26 
27 #include <ctype.h>
28 #include <stdio.h>
29 #include <stdarg.h>
30 #include <stddef.h>
31 #include <float.h>
32 #include <assert.h>
33 #include <math.h>
34 
35 #include "authenticate.h"
36 #include "db_value_printer.hpp"
37 #include "porting.h"
38 #include "parser.h"
39 #include "parser_message.h"
40 #include "misc_string.h"
41 #include "csql_grammar_scan.h"
42 #include "mem_block.hpp"
43 #include "memory_alloc.h"
44 #include "language_support.h"
45 #include "object_primitive.h"
46 #include "object_print.h"
47 #include "optimizer.h"
48 #include "system_parameter.h"
49 #include "show_meta.h"
50 #include "virtual_object.h"
51 #include "set_object.h"
52 #include "dbi.h"
53 #include "string_buffer.hpp"
54 #include "dbtype.h"
55 #include "parser_allocator.hpp"
56 #include "tde.h"
57 
58 #include <malloc.h>
59 
60 #if defined (SUPPRESS_STRLEN_WARNING)
61 #define strlen(s1) ((int) strlen(s1))
62 #endif /* defined (SUPPRESS_STRLEN_WARNING) */
63 
64 #define SAFENUM(node, field) ((node) ? (node)->field : -1)
65 #define PT_MEMB_BUF_SIZE 100
66 #define PT_MEMB_PRINTABLE_BUF_SIZE 512
67 #define PT_MEMB_ERR_BUF_SIZE 256
68 #define MAX_STRING_SEGMENT_LENGTH 254
69 #define DONT_PRT_LONG_STRING_LENGTH 256
70 
71 #define PT_APPLY_WALK(parser, ptr, arg) do { \
72  if((ptr)) \
73  { \
74  (ptr) = pt_walk_private ((parser), (ptr), (arg)); \
75  } \
76  } while (0)
77 
80 {
83  int type; /* 1: reduce_equality_terms, 0: o/w */
85  bool loc_check;
87 };
88 
91 {
92  UINTPTR id;
93  bool found;
94 };
95 
96 typedef struct pt_walk_arg PT_WALK_ARG;
98 {
104 };
105 
108 {
109  char *body;
110  int length;
111  int size;
112 };
113 
116 {
120 };
121 
124 {
126 };
127 
128 typedef PT_NODE *(*PARSER_INIT_NODE_FUNC) (PT_NODE *);
129 typedef PARSER_VARCHAR *(*PARSER_PRINT_NODE_FUNC) (PARSER_CONTEXT * parser, PT_NODE * node);
130 typedef PT_NODE *(*PARSER_APPLY_NODE_FUNC) (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
131 
136 
137 static void strcat_with_realloc (PT_STRING_BLOCK * sb, const char *tail);
138 static PT_NODE *pt_lambda_check_reduce_eq (PARSER_CONTEXT * parser, PT_NODE * tree_or_name, void *void_arg,
139  int *continue_walk);
140 static PT_NODE *pt_lambda_node (PARSER_CONTEXT * parser, PT_NODE * tree_or_name, void *void_arg, int *continue_walk);
141 static PT_NODE *pt_find_id_node (PARSER_CONTEXT * parser, PT_NODE * tree, void *void_arg, int *continue_walk);
142 static PT_NODE *copy_node_in_tree_pre (PARSER_CONTEXT * parser, PT_NODE * old_node, void *arg, int *continue_walk);
143 static PT_NODE *copy_node_in_tree_post (PARSER_CONTEXT * parser, PT_NODE * new_node, void *arg, int *continue_walk);
144 static PT_NODE *free_node_in_tree_pre (PARSER_CONTEXT * parser, PT_NODE * node, void *arg, int *continue_walk);
145 static PT_NODE *free_node_in_tree_post (PARSER_CONTEXT * parser, PT_NODE * node, void *arg, int *continue_walk);
146 static PT_NODE *pt_walk_private (PARSER_CONTEXT * parser, PT_NODE * node, void *void_arg);
147 
148 static const char *pt_show_event_type (PT_EVENT_TYPE p);
149 static DB_CURRENCY pt_currency_to_db (const PT_CURRENCY t);
150 static PARSER_VARCHAR *pt_append_quoted_string (const PARSER_CONTEXT * parser, PARSER_VARCHAR * buf, const char *str,
151  size_t str_length);
153  const PT_NODE * value);
154 static bool pt_is_nested_expr (const PT_NODE * node);
155 static bool pt_function_is_allowed_as_function_index (const PT_NODE * func);
156 static bool pt_expr_is_allowed_as_function_index (const PT_NODE * expr);
157 
158 static void pt_init_apply_f (void);
159 static void pt_init_init_f (void);
160 static void pt_init_print_f (void);
161 
162 /*
163  * Note :
164  * When adding new functions, be sure to add to ALL 4 function types and
165  * ALL 4 function vectors. (apply, init, print, tree_print
166  */
167 
168 static PT_NODE *pt_apply_alter_serial (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
169 static PT_NODE *pt_apply_alter_trigger (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
170 static PT_NODE *pt_apply_attach (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
172 static PT_NODE *pt_apply_create_serial (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
174 static PT_NODE *pt_apply_drop_serial (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
175 static PT_NODE *pt_apply_drop_trigger (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
176 static PT_NODE *pt_apply_evaluate (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
177 static PT_NODE *pt_apply_event_object (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
178 static PT_NODE *pt_apply_event_spec (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
179 static PT_NODE *pt_apply_event_target (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
181 static PT_NODE *pt_apply_get_opt_lvl (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
182 static PT_NODE *pt_apply_get_trigger (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
183 static PT_NODE *pt_apply_get_xaction (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
184 static PT_NODE *pt_apply_isolation_lvl (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
185 static PT_NODE *pt_apply_partition (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
186 static PT_NODE *pt_apply_parts (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
188 static PT_NODE *pt_apply_savepoint (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
189 static PT_NODE *pt_apply_scope (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
190 static PT_NODE *pt_apply_set_opt_lvl (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
192 static PT_NODE *pt_apply_set_trigger (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
193 static PT_NODE *pt_apply_set_xaction (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
194 static PT_NODE *pt_apply_sp_parameter (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
196 static PT_NODE *pt_apply_prepare (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
197 static PT_NODE *pt_apply_timeout (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
200 static PT_NODE *pt_apply_alter_index (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
201 static PT_NODE *pt_apply_alter (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
202 static PT_NODE *pt_apply_alter_user (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
203 static PT_NODE *pt_apply_attr_def (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
204 static PT_NODE *pt_apply_attr_ordering (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
205 static PT_NODE *pt_apply_auth_cmd (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
206 static PT_NODE *pt_apply_check_option (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
207 static PT_NODE *pt_apply_commit_work (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
208 static PT_NODE *pt_apply_constraint (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
209 static PT_NODE *pt_apply_create_entity (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
210 static PT_NODE *pt_apply_create_index (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
211 static PT_NODE *pt_apply_create_user (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
212 static PT_NODE *pt_apply_data_default (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
213 static PT_NODE *pt_apply_datatype (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
214 static PT_NODE *pt_apply_delete (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
215 static PT_NODE *pt_apply_difference (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
216 static PT_NODE *pt_apply_dot (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
217 static PT_NODE *pt_apply_drop_index (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
218 static PT_NODE *pt_apply_drop (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
219 static PT_NODE *pt_apply_drop_user (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
220 static PT_NODE *pt_apply_drop_variable (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
221 static PT_NODE *pt_apply_error_msg (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
222 static PT_NODE *pt_apply_expr (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
223 static PT_NODE *pt_apply_file_path (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
224 static PT_NODE *pt_apply_function (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
225 static PT_NODE *pt_apply_get_stats (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
226 static PT_NODE *pt_apply_grant (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
227 static PT_NODE *pt_apply_host_var (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
228 static PT_NODE *pt_apply_insert (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
229 static PT_NODE *pt_apply_intersection (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
230 static PT_NODE *pt_apply_method_call (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
231 static PT_NODE *pt_apply_method_def (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
232 static PT_NODE *pt_apply_name (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
233 static PT_NODE *pt_apply_named_arg (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
234 static PT_NODE *pt_apply_node_list (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
235 static PT_NODE *pt_apply_pointer (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
237 static PT_NODE *pt_apply_rename (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
239 static PT_NODE *pt_apply_resolution (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
240 static PT_NODE *pt_apply_revoke (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
241 static PT_NODE *pt_apply_rollback_work (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
242 static PT_NODE *pt_apply_select (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
243 static PT_NODE *pt_apply_set_names (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
244 static PT_NODE *pt_apply_set_timezone (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
247 static PT_NODE *pt_apply_showstmt (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
248 static PT_NODE *pt_apply_sort_spec (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
249 static PT_NODE *pt_apply_spec (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
250 static PT_NODE *pt_apply_table_option (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
251 static PT_NODE *pt_apply_truncate (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
252 static PT_NODE *pt_apply_do (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
253 static PT_NODE *pt_apply_union_stmt (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
254 static PT_NODE *pt_apply_update (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
255 static PT_NODE *pt_apply_update_stats (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
256 static PT_NODE *pt_apply_value (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
257 static PT_NODE *pt_apply_merge (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
258 static PT_NODE *pt_apply_tuple_value (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
259 static PT_NODE *pt_apply_query_trace (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
260 static PT_NODE *pt_apply_insert_value (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
261 static PT_NODE *pt_apply_kill (PARSER_CONTEXT * parser, PT_NODE * P, void *arg);
262 static PT_NODE *pt_apply_vacuum (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
263 static PT_NODE *pt_apply_with_clause (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
264 static PT_NODE *pt_apply_cte (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
265 static PT_NODE *pt_apply_json_table (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
268 
270 
275 
276 static PT_NODE *pt_init_attr_def (PT_NODE * p);
277 static PT_NODE *pt_init_auth_cmd (PT_NODE * p);
278 static PT_NODE *pt_init_constraint (PT_NODE * node);
282 static PT_NODE *pt_init_datatype (PT_NODE * p);
283 static PT_NODE *pt_init_delete (PT_NODE * p);
284 static PT_NODE *pt_init_difference (PT_NODE * p);
285 static PT_NODE *pt_init_expr (PT_NODE * p);
286 static PT_NODE *pt_init_function (PT_NODE * p);
287 static PT_NODE *pt_init_grant (PT_NODE * p);
288 static PT_NODE *pt_init_insert (PT_NODE * p);
290 static PT_NODE *pt_init_method_def (PT_NODE * p);
291 static PT_NODE *pt_init_name (PT_NODE * p);
292 static PT_NODE *pt_init_node_list (PT_NODE * p);
293 static PT_NODE *pt_init_pointer (PT_NODE * node);
294 static PT_NODE *pt_init_resolution (PT_NODE * p);
295 static PT_NODE *pt_init_select (PT_NODE * p);
296 static PT_NODE *pt_init_showstmt (PT_NODE * p);
297 static PT_NODE *pt_init_sort_spec (PT_NODE * p);
298 static PT_NODE *pt_init_spec (PT_NODE * p);
300 static PT_NODE *pt_init_union_stmt (PT_NODE * p);
301 static PT_NODE *pt_init_update (PT_NODE * p);
302 static PT_NODE *pt_init_value (PT_NODE * p);
303 static PT_NODE *pt_init_merge (PT_NODE * p);
307 static PT_NODE *pt_init_kill (PT_NODE * p);
308 static PT_NODE *pt_init_vacuum (PT_NODE * p);
310 
312 
404 
407 
409 
413 
420 #if defined(ENABLE_UNUSED_FUNCTION)
421 static PT_NODE *pt_apply_use (PARSER_CONTEXT * parser, PT_NODE * p, void *arg);
422 static PARSER_VARCHAR *pt_print_use (PARSER_CONTEXT * parser, PT_NODE * p);
423 #endif
424 
425 static int parser_print_user (char *user_text, int len);
426 
427 static void pt_clean_tree_copy_info (PT_TREE_COPY_INFO * tree_copy_info);
428 static const char *pt_json_table_column_behavior_to_string (const json_table_column_behavior_type & behavior_type);
430  PARSER_VARCHAR * pstr,
431  const struct json_table_column_behavior
432  &column_behavior);
434 
436 
437 extern "C"
438 {
439  extern char *g_query_string;
440  extern int g_query_string_len;
441 }
442 /*
443  * strcat_with_realloc () -
444  * return:
445  * PT_STRING_BLOCK(in/out):
446  * tail(in):
447  */
448 static void
449 strcat_with_realloc (PT_STRING_BLOCK * sb, const char *tail)
450 {
451  char *cp = sb->body;
452  int margin = 32;
453 
454  if (sb->size - sb->length < strlen (tail) + margin)
455  {
456  sb->size = (sb->size + strlen (tail) + margin) * 2;
457  sb->body = (char *) realloc (sb->body, sb->size);
458  cp = sb->body;
459  }
460 
461  strcat (cp, tail);
462  sb->length = sb->length + strlen (tail);
463 }
464 
465 /*
466  * pt_lambda_check_reduce_eq () -
467  * return:
468  * parser(in):
469  * tree_or_name(in/out):
470  * void_arg(in):
471  * continue_walk(in/out):
472  */
473 static PT_NODE *
474 pt_lambda_check_reduce_eq (PARSER_CONTEXT * parser, PT_NODE * tree_or_name, void *void_arg, int *continue_walk)
475 {
476  PT_LAMBDA_ARG *lambda_arg = (PT_LAMBDA_ARG *) void_arg;
477  PT_NODE *arg1, *tree, *name;
478 
479  if (!tree_or_name)
480  {
481  return tree_or_name;
482  }
483 
484  switch (tree_or_name->node_type)
485  {
486  case PT_DOT_:
487  arg1 = tree_or_name->info.dot.arg1;
488  if (arg1 && arg1->node_type == PT_NAME)
489  {
491  }
492  break;
493  case PT_METHOD_CALL:
494  /* can not replace target_class as like: WHERE glo = :gx and data_seek(100) on glo > 0 -> WHERE glo = :gx and
495  * data_seek(100) on :gx > 0 */
496  *continue_walk = PT_LIST_WALK; /* don't dive into */
497  break;
498  case PT_EXPR:
499  tree = lambda_arg->tree;
500  name = lambda_arg->name;
501 
502  /* check for variable string type */
503  if (tree->type_enum == PT_TYPE_VARCHAR || tree->type_enum == PT_TYPE_VARNCHAR
504  || tree->type_enum == PT_TYPE_VARBIT)
505  {
506  switch (tree_or_name->info.expr.op)
507  {
508  case PT_BIT_LENGTH:
509  case PT_OCTET_LENGTH:
510  case PT_CHAR_LENGTH:
511  *continue_walk = PT_LIST_WALK; /* don't dive into */
512  break;
513  case PT_CAST:
514  if (PT_HAS_COLLATION (name->type_enum) && tree_or_name->info.expr.op == PT_CAST
515  && PT_HAS_COLLATION (tree_or_name->type_enum)
516  && pt_name_equal (parser, name, tree_or_name->info.expr.arg1))
517  {
518  int cast_coll = LANG_SYS_COLLATION;
519  int name_coll = LANG_SYS_COLLATION;
520 
521  name_coll = PT_GET_COLLATION_MODIFIER (name);
522 
523  if (name_coll == -1 && name->data_type != NULL)
524  {
525  name_coll = name->data_type->info.data_type.collation_id;
526  }
527 
529  {
530  cast_coll = PT_GET_COLLATION_MODIFIER (tree_or_name);
531  }
532  else if (tree_or_name->data_type != NULL)
533  {
534  cast_coll = tree_or_name->data_type->info.data_type.collation_id;
535  }
536 
537  if (cast_coll != name_coll)
538  {
539  /* predicate evaluates with different collation */
540  *continue_walk = PT_LIST_WALK; /* don't dive into */
541  }
542  }
543  default:
544  break;
545  }
546  }
547  break;
548  default:
549  break;
550  }
551 
552  return tree_or_name;
553 }
554 
555 /*
556  * pt_lambda_node () - applies the lambda test to the node passed to it,
557  * and conditionally substitutes a copy of its corresponding tree
558  * return:
559  * parser(in):
560  * tree_or_name(in/out):
561  * void_arg(in/out):
562  * continue_walk(in/out):
563  */
564 static PT_NODE *
565 pt_lambda_node (PARSER_CONTEXT * parser, PT_NODE * tree_or_name, void *void_arg, int *continue_walk)
566 {
567  PT_LAMBDA_ARG *lambda_arg = (PT_LAMBDA_ARG *) void_arg;
568  PT_NODE *name_node, *lambda_name, *result, *next, *temp;
569 
570  *continue_walk = PT_CONTINUE_WALK;
571 
572  if (!tree_or_name)
573  {
574  return tree_or_name;
575  }
576 
577  if (tree_or_name->node_type == PT_FUNCTION)
578  {
579  switch (tree_or_name->info.function.function_type)
580  {
581  case F_SET:
582  case F_MULTISET:
583  case F_SEQUENCE:
584  if (lambda_arg->replace_num > 0)
585  {
586  /* check normal func data_type 1: reduce_equality_terms - check normal func data_type */
587  if (lambda_arg->type == 1)
588  {
589  /* at here, do clear. later is updated in pt_semantic_type */
590  tree_or_name->info.function.is_type_checked = false;
591  }
592 
593  lambda_arg->replace_num = 0;
594  }
595  break;
596  default:
597  break;
598  }
599 
600  return tree_or_name;
601  }
602 
603  name_node = tree_or_name;
604  lambda_name = lambda_arg->name;
605  while (name_node->node_type == PT_DOT_ && lambda_name->node_type == PT_DOT_)
606  {
607  name_node = name_node->info.dot.arg2;
608  lambda_name = lambda_name->info.dot.arg2;
609  }
610 
611  /* change orderby_num() to groupby_num() */
612  if (tree_or_name->node_type == PT_EXPR && tree_or_name->info.expr.op == PT_ORDERBY_NUM)
613  {
614  if (lambda_name->node_type == PT_EXPR && lambda_name->info.expr.op == PT_ORDERBY_NUM)
615  { /* found match */
616  /* replace 'tree_or_name' node with 'lambda_arg->tree' */
617  next = tree_or_name->next;
618  result = parser_copy_tree_list (parser, lambda_arg->tree);
619  parser_free_node (parser, tree_or_name);
620  for (temp = result; temp->next; temp = temp->next)
621  {
622  ;
623  }
624  temp->next = next;
625 
626  lambda_arg->replace_num++;
627 
628  return result;
629  }
630  }
631 
632  if (name_node->node_type != PT_NAME || lambda_name->node_type != PT_NAME)
633  {
634  return tree_or_name;
635  }
636 
638  {
639  /* never rewrites a path expression (e.g, oid = ? and oid.i = 1) */
640  return tree_or_name;
641  }
642 
643  if (lambda_arg->loc_check == true
644  && (name_node->info.name.location == 0 || (name_node->info.name.location != lambda_name->info.name.location)))
645  {
646  /* WHERE condition or different ON location */
647  return tree_or_name;
648  }
649 
650  if (pt_name_equal (parser, name_node, lambda_name))
651  {
652  if (lambda_arg->dont_replace)
653  { /* don't replace, only marking */
654  temp = pt_get_end_path_node (tree_or_name);
655  if (temp->node_type == PT_NAME)
656  {
658  }
659 
660  return tree_or_name;
661  }
662 
663  /* replace 'tree_or_name' node with 'lambda_arg->tree' */
664  next = tree_or_name->next;
665  result = parser_copy_tree_list (parser, lambda_arg->tree);
666  parser_free_node (parser, tree_or_name);
667  for (temp = result; temp->next; temp = temp->next)
668  {
669  ;
670  }
671  temp->next = next;
672 
673  lambda_arg->replace_num++;
674  }
675  else
676  { /* did not match */
677  result = tree_or_name;
678  }
679 
680  return result;
681 }
682 
683 /*
684  * pt_find_id_node () - tests names id equality
685  * return:
686  * parser(in):
687  * tree(in):
688  * void_arg(in/out):
689  * continue_walk(in/out):
690  */
691 static PT_NODE *
692 pt_find_id_node (PARSER_CONTEXT * parser, PT_NODE * tree, void *void_arg, int *continue_walk)
693 {
694  PT_FIND_ID_INFO *info = (PT_FIND_ID_INFO *) void_arg;
695 
696  if (tree->node_type == PT_NAME)
697  {
698  if (tree->info.name.spec_id == info->id)
699  {
700  info->found = true;
701  *continue_walk = PT_STOP_WALK;
702  }
703  }
704 
705  return tree;
706 }
707 
708 /*
709  * copy_node_in_tree_pre () - copies exactly a node passed to it, and returns
710  * a pointer to the copy. It is eligible for a walk "pre" function
711  * return:
712  * parser(in):
713  * old_node(in):
714  * arg(in):
715  * continue_walk(in):
716  */
717 static PT_NODE *
718 copy_node_in_tree_pre (PARSER_CONTEXT * parser, PT_NODE * old_node, void *arg, int *continue_walk)
719 {
720  PT_NODE *new_node;
721  PT_TREE_COPY_INFO *tree_copy_info = (PT_TREE_COPY_INFO *) arg;
722 
723  new_node = parser_new_node (parser, old_node->node_type);
724  if (new_node == NULL)
725  {
726  PT_INTERNAL_ERROR (parser, "allocate new node");
727  return NULL;
728  }
729 
730  *new_node = *old_node;
731 
732  /* if node is copied from another parser context, deepcopy string contents */
733  if (old_node->parser_id != parser->id)
734  {
735  if (new_node->node_type == PT_NAME)
736  {
737  new_node->info.name.original = pt_append_string (parser, NULL, old_node->info.name.original);
738  new_node->info.name.resolved = pt_append_string (parser, NULL, old_node->info.name.resolved);
739  }
740  else if (new_node->node_type == PT_VALUE)
741  {
742  if (new_node->info.value.text)
743  {
744  new_node->info.value.text = pt_append_string (parser, NULL, old_node->info.value.text);
745  }
746  }
747  }
748 
749  /* if we are operating in a context of db_values, copy it too */
750  if (new_node->node_type == PT_VALUE && new_node->info.value.db_value_is_in_workspace
751  && new_node->info.value.db_value_is_initialized)
752  {
753  if (db_value_clone (&old_node->info.value.db_value, &new_node->info.value.db_value) < 0)
754  {
755  PT_ERRORc (parser, new_node, er_msg ());
756  }
757  else
758  {
759  new_node->info.value.db_value_is_in_workspace = 1;
760  }
761  }
762 
763  if (new_node->node_type == PT_JSON_TABLE_COLUMN)
764  {
769  }
770 
771  new_node->parser_id = parser->id;
772 
773  /* handle CTE copy so that the CTE pointers will be updated to point to new_node */
774  if (old_node->node_type == PT_CTE)
775  {
776  /* the pair old_node and new_node addresses is added to copy_tree_info */
777  PT_CTE_COPY_INFO *curr_cte_copy_info;
778 
779  curr_cte_copy_info = (PT_CTE_COPY_INFO *) malloc (sizeof (PT_CTE_COPY_INFO));
780  if (curr_cte_copy_info == NULL)
781  {
782  PT_INTERNAL_ERROR (parser, "allocate new node");
783  return NULL;
784  }
785  curr_cte_copy_info->old_cte_node = old_node;
786  curr_cte_copy_info->new_cte_node = new_node;
787 
788  /* pair is added conveniently at the beginning of the list */
789  curr_cte_copy_info->next = tree_copy_info->cte_structures_list;
790  tree_copy_info->cte_structures_list = curr_cte_copy_info;
791  }
792 
793  return new_node;
794 }
795 
796 /*
797 * copy_node_in_tree_post () - post function of copy tree
798 *
799 * return:
800 * parser(in):
801 * new_node(in):
802 * arg(in):
803 * continue_walk(in):
804 */
805 static PT_NODE *
806 copy_node_in_tree_post (PARSER_CONTEXT * parser, PT_NODE * new_node, void *arg, int *continue_walk)
807 {
808  PT_TREE_COPY_INFO *tree_copy_info = (PT_TREE_COPY_INFO *) arg;
809 
810  if (new_node->node_type == PT_SPEC && PT_SPEC_IS_CTE (new_node))
811  {
812  /* the new cte_pointer may have to point to a new cte; it depends if the copied tree includes the CTE too
813  * (should be in cte_structures_list) */
814  PT_NODE *cte_pointer = new_node->info.spec.cte_pointer;
815  PT_CTE_COPY_INFO *cte_info_it;
816 
817  assert (cte_pointer->info.pointer.node->node_type == PT_CTE);
818  for (cte_info_it = tree_copy_info->cte_structures_list; cte_info_it != NULL; cte_info_it = cte_info_it->next)
819  {
820  if (cte_info_it->old_cte_node == cte_pointer->info.pointer.node)
821  {
822  break;
823  }
824  }
825  if (cte_info_it != NULL)
826  {
827  /* the old value of the pointer was found in the list; update the pointer to the new cte address */
828  cte_pointer->info.pointer.node = cte_info_it->new_cte_node;
829  }
830  }
831 
832  return new_node;
833 }
834 
835 /*
836  * pt_walk_private () - implements the higher order tree walk routine parser_walk_tree
837  * return:
838  * parser(in):
839  * node(in/out):
840  * void_arg(in/out):
841  */
842 static PT_NODE *
843 pt_walk_private (PARSER_CONTEXT * parser, PT_NODE * node, void *void_arg)
844 {
845  PT_WALK_ARG *walk = (PT_WALK_ARG *) void_arg;
846  PT_NODE_TYPE node_type;
848  int save_continue;
849 
850  assert (node != NULL);
851 
852  if (walk->pre_function)
853  {
854  node = (*walk->pre_function) (parser, node, walk->pre_argument, &(walk->continue_walk));
855  if (!node)
856  {
857  return NULL;
858  }
859  }
860 
861  if (walk->continue_walk != PT_STOP_WALK)
862  {
863  /* walking leaves may write over this. */
864  save_continue = walk->continue_walk;
865 
866  /* visit sub-trees */
867  if (save_continue == PT_CONTINUE_WALK || save_continue == PT_LEAF_WALK)
868  {
869  /* this is an optimization to remove a procedure call per node from the recursion path. It is the same as
870  * calling pt_apply. */
871  node_type = node->node_type;
872 
873  if (node_type >= PT_LAST_NODE_NUMBER || !(apply = pt_apply_f[node_type]))
874  {
875  return NULL;
876  }
877 
878  (*apply) (parser, node, walk);
879 
880  if (node->data_type)
881  {
882  node->data_type = pt_walk_private (parser, node->data_type, walk);
883  }
884  }
885 
886  /* visit rest of list first, follow 'or_next' list */
887  if (node->or_next
888  && (save_continue == PT_CONTINUE_WALK || save_continue == PT_LEAF_WALK || save_continue == PT_LIST_WALK))
889  {
890  node->or_next = pt_walk_private (parser, node->or_next, walk);
891  }
892 
893  /* then, follow 'next' list */
894  if (node->next && (save_continue == PT_CONTINUE_WALK || save_continue == PT_LIST_WALK))
895  {
896  node->next = pt_walk_private (parser, node->next, walk);
897  }
898 
899  if (walk->continue_walk != PT_STOP_WALK)
900  {
901  walk->continue_walk = save_continue;
902  }
903  }
904 
905  /* and visit this node again */
906  if (walk->post_function)
907  {
908  node = (*walk->post_function) (parser, node, walk->post_argument, &(walk->continue_walk));
909  }
910 
911  return node;
912 }
913 
914 /*
915  * parser_walk_leaves () - like parser_walk_tree, but begins at the leaves of
916  * the node passed in
917  * return:
918  * parser(in):
919  * node(in):
920  * pre_function(in):
921  * pre_argument(in):
922  * post_function(in):
923  * post_argument(in):
924  */
925 PT_NODE *
926 parser_walk_leaves (PARSER_CONTEXT * parser, PT_NODE * node, PT_NODE_WALK_FUNCTION pre_function, void *pre_argument,
927  PT_NODE_WALK_FUNCTION post_function, void *post_argument)
928 {
930  PT_NODE_TYPE node_type;
931  PT_WALK_ARG walk_argument;
932  PT_NODE *walk;
933 
934  walk_argument.continue_walk = PT_CONTINUE_WALK;
935  walk_argument.pre_function = pre_function;
936  walk_argument.pre_argument = pre_argument;
937  walk_argument.post_function = post_function;
938  walk_argument.post_argument = post_argument;
939 
940  for (walk = node; walk; walk = walk->or_next)
941  {
942  node_type = walk->node_type;
943 
944  if (node_type >= PT_LAST_NODE_NUMBER || !(apply = pt_apply_f[node_type]))
945  {
946  return NULL;
947  }
948 
949  (*apply) (parser, walk, &walk_argument);
950 
951  if (walk->data_type)
952  {
953  walk->data_type = pt_walk_private (parser, walk->data_type, &walk_argument);
954  }
955  }
956 
957  return node;
958 }
959 
960 /*
961  * parser_walk_tree () - walks a tree and applies pre and post visit routines
962  * to each node in the tree. A pre function may prune
963  * the search by returning a false (0) in the continue argument
964  * return:
965  * parser(in):
966  * node(in):
967  * pre_function(in):
968  * pre_argument(in):
969  * post_function(in):
970  * post_argument(in):
971  */
972 PT_NODE *
973 parser_walk_tree (PARSER_CONTEXT * parser, PT_NODE * node, PT_NODE_WALK_FUNCTION pre_function, void *pre_argument,
974  PT_NODE_WALK_FUNCTION post_function, void *post_argument)
975 {
976  if (node == NULL)
977  {
978  return NULL;
979  }
980 
981  PT_WALK_ARG walk_argument;
982 
983  walk_argument.continue_walk = PT_CONTINUE_WALK;
984  walk_argument.pre_function = pre_function;
985  walk_argument.pre_argument = pre_argument;
986  walk_argument.post_function = post_function;
987  walk_argument.post_argument = post_argument;
988 
989  return pt_walk_private (parser, node, &walk_argument);
990 }
991 
992 /*
993  * pt_continue_walk () - Re-enabled the tree walk after a portion was "pruned"
994  * return:
995  * parser(in):
996  * tree(in):
997  * arg(in):
998  * continue_walk(in/out):
999  */
1000 PT_NODE *
1001 pt_continue_walk (PARSER_CONTEXT * parser, PT_NODE * tree, void *arg, int *continue_walk)
1002 {
1003  *continue_walk = PT_CONTINUE_WALK;
1004  return tree;
1005 }
1006 
1007 /*
1008  * pt_lambda_with_arg () - walks a tree and modifies it in place to replace
1009  * name nodes with copies of a corresponding tree
1010  * return:
1011  * parser(in):
1012  * tree_with_names(in):
1013  * name_node(in):
1014  * corresponding_tree(in):
1015  * loc_check(in):
1016  * type(in):
1017  * dont_replace(in):
1018  */
1019 PT_NODE *
1020 pt_lambda_with_arg (PARSER_CONTEXT * parser, PT_NODE * tree_with_names, PT_NODE * name_node,
1021  PT_NODE * corresponding_tree, bool loc_check, int type, bool dont_replace)
1022 {
1023  PT_LAMBDA_ARG lambda_arg;
1024  PT_NODE *tree;
1025  int save_paren_type = 0;
1026  bool arg_ok;
1027 
1028  arg_ok = false;
1029 
1030  if (name_node->node_type == PT_NAME || name_node->node_type == PT_DOT_)
1031  {
1032  arg_ok = true;
1033  }
1034  else if (name_node->node_type == PT_EXPR && name_node->info.expr.op == PT_ORDERBY_NUM)
1035  {
1036  if (corresponding_tree)
1037  {
1038  if ((corresponding_tree->node_type == PT_FUNCTION
1039  && corresponding_tree->info.function.function_type == PT_GROUPBY_NUM)
1040  || (corresponding_tree->node_type == PT_EXPR && corresponding_tree->info.expr.op == PT_INST_NUM))
1041  {
1042  /* change orderby_num() to groupby_num() */
1043  /* change orderby_num() to inst_num() */
1044  arg_ok = true;
1045  }
1046  }
1047  }
1048 
1049  if (arg_ok != true)
1050  {
1051  PT_INTERNAL_ERROR (parser, "lambda");
1052  return tree_with_names;
1053  }
1054 
1055  lambda_arg.type = type;
1056  lambda_arg.name = name_node;
1057  lambda_arg.tree = corresponding_tree;
1058  lambda_arg.loc_check = loc_check;
1059  lambda_arg.dont_replace = dont_replace;
1060  lambda_arg.replace_num = 0;
1061  if (corresponding_tree && corresponding_tree->node_type == PT_EXPR)
1062  {
1063  /* make sure it will print with proper precedance. we don't want to replace "name" with "1+2" in 4*name, and get
1064  * 4*1+2. It should be 4*(1+2) instead. */
1065  save_paren_type = corresponding_tree->info.expr.paren_type;
1066  corresponding_tree->info.expr.paren_type = 1;
1067  }
1068 
1069  tree =
1070  parser_walk_tree (parser, tree_with_names, ((type) ? pt_lambda_check_reduce_eq : NULL), &lambda_arg, pt_lambda_node,
1071  &lambda_arg);
1072 
1073  if (corresponding_tree && corresponding_tree->node_type == PT_EXPR)
1074  {
1075  corresponding_tree->info.expr.paren_type = save_paren_type;
1076  }
1077 
1078  return tree;
1079 }
1080 
1081 /*
1082  * pt_lambda () -
1083  * return:
1084  * parser(in):
1085  * tree_with_names(in):
1086  * name_node(in):
1087  * corresponding_tree(in):
1088  */
1089 PT_NODE *
1090 pt_lambda (PARSER_CONTEXT * parser, PT_NODE * tree_with_names, PT_NODE * name_node, PT_NODE * corresponding_tree)
1091 {
1092  return pt_lambda_with_arg (parser, tree_with_names, name_node, corresponding_tree, false, 0, false);
1093 }
1094 
1095 /*
1096  * pt_find_id () - walks a tree looking for a name of the given id family
1097  * return:
1098  * parser(in):
1099  * tree_with_names(in):
1100  * id(in):
1101  */
1102 UINTPTR
1103 pt_find_id (PARSER_CONTEXT * parser, PT_NODE * tree_with_names, UINTPTR id)
1104 {
1105  PT_FIND_ID_INFO info;
1106 
1107  info.id = id;
1108  info.found = false;
1109 
1110  parser_walk_tree (parser, tree_with_names, pt_find_id_node, &info, NULL, NULL);
1111 
1112  return info.found;
1113 }
1114 
1115 /*
1116  * parser_copy_tree () - copies a parse tree without and modifying it
1117  * return:
1118  * parser(in):
1119  * in_tree(in):
1120  */
1121 PT_NODE *
1123 {
1124  PT_NODE *copy = NULL;
1125 
1126  if (tree)
1127  {
1128  PT_NODE *temp, *save;
1129  PT_TREE_COPY_INFO tree_copy_info;
1130 
1131  tree_copy_info.cte_structures_list = NULL;
1132 
1133  temp = (PT_NODE *) tree;
1134  save = temp->next;
1135  temp->next = NULL;
1136  copy = parser_walk_tree (parser, temp, copy_node_in_tree_pre, &tree_copy_info, copy_node_in_tree_post,
1137  &tree_copy_info);
1138  temp->next = save;
1139  pt_clean_tree_copy_info (&tree_copy_info);
1140  }
1141 
1142  return copy;
1143 }
1144 
1145 /*
1146  * parser_copy_tree_list () - copies a parse tree without and modifing it.
1147  * It includes the rest of the list pointed to by tree
1148  * return:
1149  * parser(in):
1150  * tree(in):
1151  */
1152 PT_NODE *
1154 {
1155  if (tree)
1156  {
1157  PT_TREE_COPY_INFO tree_copy_info;
1158 
1159  tree_copy_info.cte_structures_list = NULL;
1160  tree = parser_walk_tree (parser, tree, copy_node_in_tree_pre, &tree_copy_info, copy_node_in_tree_post,
1161  &tree_copy_info);
1162  pt_clean_tree_copy_info (&tree_copy_info);
1163  }
1164 
1165  return tree;
1166 }
1167 
1168 /*
1169  * parser_get_tree_list_diff () - get the difference list1 minus list2
1170  * return: a PT_NODE_POINTER list to the nodes in difference
1171  * list1(in): the first tree list
1172  * list2(in): the second tree list
1173  */
1174 PT_NODE *
1176 {
1177  PT_NODE *res_list, *save_node1, *save_node2, *node1, *node2;
1178 
1179  if (list1 == NULL)
1180  {
1181  return NULL;
1182  }
1183 
1184  if (list2 == NULL)
1185  {
1186  return pt_point (parser, list1);
1187  }
1188 
1189  res_list = NULL;
1190  for (node1 = list1; node1; node1 = node1->next)
1191  {
1192  save_node1 = node1;
1193 
1194  CAST_POINTER_TO_NODE (node1);
1195 
1196  for (node2 = list2; node2; node2 = node2->next)
1197  {
1198  save_node2 = node2;
1199 
1200  CAST_POINTER_TO_NODE (node2);
1201 
1202  if (node1 == node2)
1203  {
1204  node2 = save_node2;
1205  break;
1206  }
1207 
1208  node2 = save_node2;
1209  }
1210 
1211  if (node2 == NULL)
1212  {
1213  res_list = parser_append_node (pt_point (parser, node1), res_list);
1214  }
1215 
1216  node1 = save_node1;
1217  }
1218 
1219  return res_list;
1220 }
1221 
1222 /*
1223  * pt_point () - points a parse tree node without and modifing it
1224  * return:
1225  * parser(in):
1226  * in_tree(in):
1227  */
1228 PT_NODE *
1230 {
1231  PT_NODE *tree, *pointer;
1232 
1233  if (!in_tree)
1234  {
1235  return NULL;
1236  }
1237 
1238  /* unconst */
1239  tree = (PT_NODE *) in_tree;
1240 
1241  CAST_POINTER_TO_NODE (tree);
1242 
1243  pointer = parser_new_node (parser, PT_NODE_POINTER);
1244  if (!pointer)
1245  {
1246  return NULL;
1247  }
1248 
1249  /* set original node pointer */
1250  pointer->info.pointer.node = tree;
1251 
1252  /* set line/column number as that of original node pointer; this is used at error print routine */
1253  pointer->line_number = tree->line_number;
1254  pointer->column_number = tree->column_number;
1255 
1256  return pointer;
1257 }
1258 
1259 /*
1260  * pt_point_l () - points a parse tree node without and modifing it.
1261  * It includes the rest of the list pointed to by tree
1262  * return:
1263  * parser(in):
1264  * in_tree(in):
1265  */
1266 
1267 PT_NODE *
1269 {
1270  PT_NODE *tree, *node, *pointer, *list;
1271 
1272  if (!in_tree)
1273  {
1274  return NULL;
1275  }
1276 
1277  /* unconst */
1278  tree = (PT_NODE *) in_tree;
1279 
1280  list = NULL;
1281  for (node = tree; node; node = node->next)
1282  {
1283  pointer = pt_point (parser, node);
1284  if (!pointer)
1285  {
1286  goto exit_on_error;
1287  }
1288  list = parser_append_node (pointer, list);
1289  }
1290 
1291  return list;
1292 
1293 exit_on_error:
1294 
1295  while (list)
1296  {
1297  node = list;
1298  list = list->next;
1299 
1300  node->next = NULL; /* cut-off link */
1301  parser_free_tree (parser, node);
1302  }
1303 
1304  return NULL;
1305 }
1306 
1307 /*
1308  * pt_point_ref () - creates a reference PT_NODE_POINTER
1309  * return: pointer PT_NODE
1310  * parser(in): parser context
1311  * node(in): node to point to
1312  */
1313 PT_NODE *
1315 {
1316  PT_NODE *ret = pt_point (parser, node);
1317  if (ret != NULL)
1318  {
1320  }
1321 
1322  return ret;
1323 }
1324 
1325 /*
1326  * pt_pointer_stack_push () - push a new PT_NODE_POINTER, pointing to node, on a
1327  * stack of similar pointers
1328  * returns: stack base
1329  * parser(in): parser context
1330  * stack(in): base of stack or NULL for new stack
1331  * node(in): node to be pointed to by new stack entry
1332  */
1333 PT_NODE *
1335 {
1336  PT_NODE *new_top = pt_point (parser, node);
1337  PT_NODE *list = stack;
1338 
1339  if (new_top == NULL)
1340  {
1342  return stack;
1343  }
1344 
1345  while (list != NULL && list->next != NULL)
1346  {
1347  list = list->next;
1348  }
1349 
1350  if (list)
1351  {
1352  list->next = new_top;
1353  return stack;
1354  }
1355  else
1356  {
1357  return new_top;
1358  }
1359 }
1360 
1361 /*
1362  * pt_pointer_stack_pop () - push a new PT_NODE_POINTER, pointing to node, on a
1363  * stack of similar pointers
1364  * returns: new stack base
1365  * parser(in): parser context
1366  * stack(in): base of stack
1367  * node(out): popped node
1368  */
1369 PT_NODE *
1371 {
1372  PT_NODE *new_top = NULL;
1373  PT_NODE *list = stack;
1374 
1375  if (stack == NULL)
1376  {
1377  PT_INTERNAL_ERROR (parser, "pop operation on empty PT_NODE_POINTER stack");
1378  return NULL;
1379  }
1380 
1381  while (list != NULL && list->next != NULL)
1382  {
1383  new_top = list;
1384  list = list->next;
1385  }
1386 
1387  if (node != NULL)
1388  {
1389  *node = list->info.pointer.node;
1390  }
1391  list->info.pointer.node = NULL;
1392  parser_free_tree (parser, list);
1393 
1394  if (new_top)
1395  {
1396  new_top->next = NULL;
1397  return stack;
1398  }
1399  else
1400  {
1401  return NULL;
1402  }
1403 }
1404 
1405 /*
1406  * free_node_in_tree_pre () - checks a pointer nodes for a recursive walk
1407  * return:
1408  * parser(in):
1409  * node(in/out):
1410  * arg(in):
1411  * continue_walk(in):
1412  */
1413 static PT_NODE *
1414 free_node_in_tree_pre (PARSER_CONTEXT * parser, PT_NODE * node, void *arg, int *continue_walk)
1415 {
1416  if (node->node_type == PT_NODE_POINTER)
1417  {
1418  /* do must not free original node; cut-off link to original node */
1419  node->info.pointer.node = NULL;
1420  }
1421  return node;
1422 }
1423 
1424 /*
1425  * free_node_in_tree_post () - frees a node for a recursive walk
1426  * return:
1427  * parser(in):
1428  * node(in):
1429  * arg(in):
1430  * continue_walk(in):
1431  */
1432 static PT_NODE *
1433 free_node_in_tree_post (PARSER_CONTEXT * parser, PT_NODE * node, void *arg, int *continue_walk)
1434 {
1435  parser_free_node (parser, node);
1436  return NULL;
1437 }
1438 
1439 /*
1440  * parser_free_tree () -
1441  * return:
1442  * parser(in):
1443  * tree(in):
1444  */
1445 void
1447 {
1449 }
1450 
1451 /*
1452  * parser_free_subtrees () - free subtrees
1453  * return:
1454  * parser(in):
1455  * tree(in):
1456  */
1457 void
1459 {
1461 }
1462 
1463 // clear node resources and all subtrees
1464 void
1466 {
1467  parser_free_subtrees (parser, node);
1469 }
1470 
1471 /*
1472  * pt_internal_error () - report an internal system error
1473  * return:
1474  * parser(in): the parser context
1475  * file(in): source file name
1476  * line(in): at which line in the source
1477  * what(in): a note about the internal system error
1478  */
1479 
1480 void *
1481 pt_internal_error (PARSER_CONTEXT * parser, const char *file, int line, const char *what)
1482 {
1483  PT_NODE node;
1484 
1485  node.line_number = 0;
1486  node.column_number = 0;
1487  node.buffer_pos = -1;
1488 
1489  if (parser && !pt_has_error (parser))
1490  {
1491  parser->flag.has_internal_error = 1;
1492  pt_frob_error (parser, &node, "System error (%s) in %s (line: %d)", what, file, line);
1493  }
1494 
1495  return NULL;
1496 }
1497 
1498 #if defined (ENABLE_UNUSED_FUNCTION)
1499 /*
1500  * pt_void_internal_error () - wrapper for pt_internal_error
1501  * return:
1502  * parser(in):
1503  * file(in):
1504  * line(in):
1505  * what(in):
1506  */
1507 void
1508 pt_void_internal_error (PARSER_CONTEXT * parser, const char *file, int line, const char *what)
1509 {
1510  pt_internal_error (parser, file, line, what);
1511 }
1512 #endif
1513 
1514 /*
1515  * fgetin() - get input from users file
1516  * return: -1 on EOF
1517  * p(in):
1518  */
1519 static int
1521 {
1522  int c;
1523 
1524  c = fgetc (p->file);
1525 
1526  if (c == EOF)
1527  {
1528  return -1;
1529  }
1530  else
1531  {
1532  return c;
1533  }
1534 }
1535 
1536 /*
1537  * buffgetin() - get input from users buffer
1538  * return: -1 on end
1539  * p(in):
1540  */
1541 static int
1543 {
1544  int c;
1545 
1546  c = *((const unsigned char *) p->buffer);
1547 
1548  if (!c)
1549  {
1550  c = -1;
1551  }
1552  else
1553  {
1554  (p->buffer)++;
1555  }
1556 
1557  return c;
1558 }
1559 
1560 #if defined (ENABLE_UNUSED_FUNCTION)
1561 /*
1562  * binarygetin() -
1563  * return:
1564  * p(in):
1565  */
1566 static int
1567 binarygetin (PARSER_CONTEXT * p)
1568 {
1569  int c = -1;
1570 
1572  {
1573  c = -1;
1574  }
1575  else
1576  {
1577  c = (const unsigned char) p->buffer[p->input_buffer_position++];
1578  }
1579 
1580  return c;
1581 }
1582 #endif
1583 
1584 /*
1585  * pt_push() - push a node onto this parser's stack
1586  * return: 1 if all OK, 0 otherwise
1587  * parser(in/out): the parser context
1588  * node(in): a PT_NODE
1589  */
1590 int
1591 pt_push (PARSER_CONTEXT * parser, PT_NODE * node)
1592 {
1593 #define INITIAL_EXTENT 512
1594 #define DELTA 512
1595 
1596  int new_siz, old_siz;
1597  PT_NODE **new_stk;
1598 
1599  if (!parser || !node)
1600  {
1601  return 0;
1602  }
1603 
1604  /* make sure there is space in the node_stack */
1605  if (parser->stack_top + 1 >= parser->stack_size)
1606  {
1607  /* expand the node_stack */
1608  old_siz = parser->stack_size;
1609  new_siz = (old_siz <= 0) ? INITIAL_EXTENT : old_siz + DELTA;
1610  new_stk = (PT_NODE **) parser_alloc (parser, new_siz * sizeof (PT_NODE *));
1611  if (!new_stk)
1612  {
1613  return 0;
1614  }
1615  parser->stack_size = new_siz;
1616 
1617  /* copy contents of old node_stack to the new node_stack */
1618  if (parser->node_stack)
1619  {
1620  memmove (new_stk, parser->node_stack, parser->stack_top * sizeof (PT_NODE *));
1621  }
1622 
1623  /* the old node_stack will be freed later by parser_free_parser */
1624  parser->node_stack = new_stk;
1625  }
1626 
1627  /* push new node onto the stack */
1628  parser->node_stack[parser->stack_top++] = node;
1629  return 1;
1630 }
1631 
1632 /*
1633  * pt_pop() - pop and return node from top of stack
1634  * return: the top node on the stack or NULL
1635  * parser(in): the parser context
1636  */
1637 PT_NODE *
1639 {
1640  if (!parser || !parser->node_stack)
1641  {
1642  return NULL;
1643  }
1644 
1645  /* guard against stack underflow */
1646  if (parser->stack_top <= 0)
1647  {
1648  return NULL;
1649  }
1650 
1651  return parser->node_stack[--parser->stack_top];
1652 }
1653 
1654 /*
1655  * pt_top() - return top of stack
1656  * return: the top node on the stack or NULL
1657  * parser(in): the parser context
1658  */
1659 PT_NODE *
1661 {
1662  if (!parser || !parser->node_stack)
1663  {
1664  return NULL;
1665  }
1666 
1667  /* guard against stack underflow */
1668  if (parser->stack_top <= 0)
1669  {
1670  return NULL;
1671  }
1672 
1673  return parser->node_stack[parser->stack_top - 1];
1674 }
1675 
1676 /*
1677  * parser_parse_string_use_sys_charset () - Parses a string and generates
1678  * parse tree. String constants will
1679  * use system charset if no charset
1680  * is specified.
1681  *
1682  * return : Parse tree.
1683  * parser (in) : Parser context.
1684  * buffer (in) : Query string.
1685  *
1686  * NOTE: This function should be used instead of parser_parse_string () if the
1687  * query string may contain string constants.
1688  */
1689 PT_NODE **
1691 {
1692  PT_NODE **result = NULL;
1693 
1695  result = parser_parse_string (parser, buffer);
1697 
1698  return result;
1699 }
1700 
1701 /*
1702  * parser_parse_string() - reset and initialize the parser
1703  * return:
1704  * parser(in/out): the parser context
1705  * buffer(in):
1706  */
1707 PT_NODE **
1708 parser_parse_string (PARSER_CONTEXT * parser, const char *buffer)
1709 {
1710  return parser_parse_string_with_escapes (parser, buffer, true);
1711 }
1712 
1713 /*
1714  * parser_parse_string_with_escapes() - reset and initialize the parser
1715  * return:
1716  * parser(in/out): the parser context
1717  * buffer(in):
1718  */
1719 
1720 PT_NODE **
1721 parser_parse_string_with_escapes (PARSER_CONTEXT * parser, const char *buffer, const bool strings_have_no_escapes)
1722 {
1723  PT_NODE **tree;
1724 
1725  if (!parser)
1726  {
1727  return 0;
1728  }
1729  parser->buffer = buffer;
1730  parser->original_buffer = buffer;
1731 
1732  parser->next_byte = buffgetin;
1734  {
1735  parser->next_char = dbcs_get_next;
1736  parser->casecmp = intl_identifier_casecmp;
1737  }
1738  else
1739  {
1740  parser->next_char = buffgetin;
1741  /* It would be a nice optimization to use strcasecmp if we are doing a Latin 8 bit character set. Unfortunately,
1742  * strcasesmp is braindamaged about 8 bit ascii, so this is not a safe optimization. Perhaps
1743  * intl_identifier_casecmp can be further optimized for the single byte character case. */
1744  parser->casecmp = intl_identifier_casecmp;
1745  }
1746 
1747  parser->flag.strings_have_no_escapes = strings_have_no_escapes ? 1 : 0;
1748  parser->flag.dont_collect_exec_stats = 0;
1749 
1750  if (prm_get_bool_value (PRM_ID_QUERY_TRACE) == true)
1751  {
1752  parser->query_trace = true;
1753  }
1754  else
1755  {
1756  parser->query_trace = false;
1757  }
1758  parser->num_plan_trace = 0;
1759 
1760  /* reset parser node stack and line/column info */
1761  parser->stack_top = 0;
1762  parser->line = 1;
1763  parser->column = 0;
1764 
1765  /* set up an environment for longjump to return to if there is an out of memory error in pt_memory.c. DO NOT RETURN
1766  * unless PT_CLEAR_JMP_ENV is called to clear the environment. */
1767  PT_SET_JMP_ENV (parser);
1768 
1769  tree = parser_main (parser);
1770 
1771  PT_CLEAR_JMP_ENV (parser);
1772 
1773  return tree;
1774 }
1775 
1776 #if defined (ENABLE_UNUSED_FUNCTION)
1777 /*
1778  * parser_parse_binary() - reset and initialize the parser
1779  * return:
1780  * parser(in/out): the parser context
1781  * buffer(in):
1782  * size(in) : buffer length
1783  */
1784 
1785 PT_NODE **
1786 parser_parse_binary (PARSER_CONTEXT * parser, const char *buffer, size_t size)
1787 {
1788  PT_NODE **tree;
1789 
1790  if (!parser)
1791  return 0;
1792  parser->buffer = buffer;
1793  parser->next_byte = binarygetin;
1795  {
1796  parser->next_char = dbcs_get_next;
1797  parser->casecmp = intl_identifier_casecmp;
1798  }
1799  else
1800  {
1801  parser->next_char = binarygetin;
1802  parser->casecmp = intl_identifier_casecmp;
1803  }
1804 
1805  parser->input_buffer_length = size;
1806  parser->input_buffer_position = 0;
1807 
1808  /* reset parser node stack and line/column info */
1809  parser->stack_top = 0;
1810  parser->line = 1;
1811  parser->column = 0;
1812 
1813  /* set up an environment for longjump to return to if there is an out of memory error in pt_memory.c. DO NOT RETURN
1814  * unless PT_CLEAR_JMP_ENV is called to clear the environment. */
1815  PT_SET_JMP_ENV (parser);
1816 
1817  tree = parser_main (parser);
1818 
1819  PT_CLEAR_JMP_ENV (parser);
1820 
1821  return tree;
1822 }
1823 #endif
1824 
1825 /*
1826  * parser_parse_file() - reset and initialize the parser
1827  * parser(in/out): the parser context
1828  * file(in):
1829  */
1830 
1831 PT_NODE **
1832 parser_parse_file (PARSER_CONTEXT * parser, FILE * file)
1833 {
1834  PT_NODE **tree;
1835 
1836  if (!parser)
1837  {
1838  return 0;
1839  }
1840  parser->file = file;
1841  parser->next_byte = fgetin;
1843  {
1844  parser->next_char = dbcs_get_next;
1845  parser->casecmp = intl_identifier_casecmp;
1846  }
1847  else
1848  {
1849  parser->next_char = fgetin;
1850  parser->casecmp = intl_identifier_casecmp;
1851  }
1852 
1853  parser->flag.strings_have_no_escapes = 0;
1854  parser->flag.is_in_and_list = 0;
1855  parser->flag.dont_collect_exec_stats = 0;
1856 
1857  if (prm_get_bool_value (PRM_ID_QUERY_TRACE) == true)
1858  {
1859  parser->query_trace = true;
1860  }
1861  else
1862  {
1863  parser->query_trace = false;
1864  }
1865  parser->num_plan_trace = 0;
1866 
1867  /* reset parser node stack and line/column info */
1868  parser->stack_top = 0;
1869  parser->line = 1;
1870  parser->column = 0;
1871 
1872  /* set up an environment for longjump to return to if there is an out of memory error in pt_memory.c. DO NOT RETURN
1873  * unless PT_CLEAR_JMP_ENV is called to clear the environment. */
1874  PT_SET_JMP_ENV (parser);
1875 
1876  tree = parser_main (parser);
1877 
1878  PT_CLEAR_JMP_ENV (parser);
1879 
1880  return tree;
1881 
1882 }
1883 
1884 /*
1885  * pt_init_one_statement_parser() -
1886  * return:
1887  * parser(in/out):
1888  * file(in):
1889  */
1890 PT_NODE **
1892 {
1893  if (!parser)
1894  {
1895  return 0;
1896  }
1897  parser->file = file;
1898  parser->next_byte = fgetin;
1900  {
1901  parser->next_char = dbcs_get_next;
1902  parser->casecmp = intl_identifier_casecmp;
1903  }
1904  else
1905  {
1906  parser->next_char = fgetin;
1907  parser->casecmp = intl_identifier_casecmp;
1908  }
1909 
1910  /* reset parser node stack and line/column info */
1911  parser->stack_top = 0;
1912  parser->line = 1;
1913  parser->column = 0;
1914 
1915  {
1917  this_parser = parser;
1918  dbcs_start_input ();
1919  }
1920 
1921  return 0;
1922 }
1923 
1924 /*
1925  * pt_record_error() - creates a new PT_ZZ_ERROR_MSG node appends it
1926  * to parser->error_msgs
1927  * return: none
1928  * parser(in/out): pointer to parser structure
1929  * stmt_no(in): source statement where error was detected
1930  * line_no(in): source line number where error was detected
1931  * col_no(in): source column number where error was detected
1932  * msg(in): a helpful explanation of the error
1933  */
1934 void
1935 pt_record_error (PARSER_CONTEXT * parser, int stmt_no, int line_no, int col_no, const char *msg, const char *context)
1936 {
1937  char *context_copy;
1938  char buf[MAX_PRINT_ERROR_CONTEXT_LENGTH + 1];
1939  PT_NODE *node;
1940 
1941  node = parser_new_node (parser, PT_ZZ_ERROR_MSG);
1942  if (node == NULL)
1943  {
1944  PT_INTERNAL_ERROR (parser, "allocate new node");
1945  return;
1946  }
1947 
1948  node->info.error_msg.statement_number = stmt_no;
1949  node->line_number = line_no;
1950  node->column_number = col_no;
1951  node->info.error_msg.error_message = NULL;
1952  if (context != NULL)
1953  {
1954  char *before_context_str = msgcat_message (MSGCAT_CATALOG_CUBRID,
1957  char *before_end_of_stmt_str = msgcat_message (MSGCAT_CATALOG_CUBRID, MSGCAT_SET_PARSER_SYNTAX,
1959  /* size of constant string "before ' '\n" to be printed along with the actual context - do not count format
1960  * parameter "%1$s", of size 4 */
1961  int before_context_len = strlen (before_context_str) - 4;
1962  int context_len = strlen (context);
1963  int end_of_statement = 0;
1964  int str_len = 0;
1965  char *s = NULL;
1966 
1967  if (context_len > MAX_PRINT_ERROR_CONTEXT_LENGTH)
1968  {
1969  context_len = MAX_PRINT_ERROR_CONTEXT_LENGTH;
1970  memset (buf, 0, MAX_PRINT_ERROR_CONTEXT_LENGTH + 1);
1971  memcpy (buf, context, MAX_PRINT_ERROR_CONTEXT_LENGTH - 3);
1972  strcpy (buf + MAX_PRINT_ERROR_CONTEXT_LENGTH - 3, "...");
1973  context_copy = buf;
1974  }
1975  else
1976  {
1977  context_copy = (char *) context;
1978  }
1979 
1980  if ((context_len == 0) || ((context_len == 1) && (*context_copy <= 32)))
1981  {
1982  end_of_statement = 1;
1983  /* size of constant string "before END OF STATEMENT\n" */
1984  str_len = strlen (before_end_of_stmt_str);
1985  }
1986  else
1987  {
1988  str_len = context_len + before_context_len;
1989  }
1990 
1991  /* parser_allocate_string_buffer() returns the start pointer of the string buffer. It is guaranteed that the
1992  * length of the buffer 's' is equal to 'str_len + 1'. */
1993  s = (char *) parser_allocate_string_buffer (parser, str_len, sizeof (char));
1994  if (s == NULL)
1995  {
1996  PT_INTERNAL_ERROR (parser, "insufficient memory");
1997  return;
1998  }
1999 
2000  if (end_of_statement == 0)
2001  {
2002  /* snprintf will assign the NULL-terminator('\0') to s[str_len]. */
2003  snprintf (s, str_len + 1, before_context_str, context_copy);
2004  if (s[str_len - 3] == '\n')
2005  {
2006  s[str_len - 3] = ' ';
2007  }
2008  }
2009  else
2010  {
2011  strcpy (s, before_end_of_stmt_str);
2012  }
2013  node->info.error_msg.error_message = s;
2014  }
2016 
2017  if (pt_has_error (parser))
2018  {
2019  parser->error_msgs = parser_append_node (node, parser->error_msgs);
2020  }
2021  else
2022  {
2023  parser->error_msgs = node;
2024  }
2025 }
2026 
2027 /*
2028  * pt_frob_warning() - creates a new PT_ZZ_ERROR_MSG node appends it
2029  * to parser->error_msgs
2030  * return: none
2031  * parser(in/out): pointer to parser structure
2032  * stmt(in): pointer to a PT_NODE with interesting line and column info in it
2033  * fmt(in): printf-style format string
2034  *
2035  * Note :
2036  * helper function for PT_WARNING macro
2037  */
2038 
2039 void
2040 pt_frob_warning (PARSER_CONTEXT * parser, const PT_NODE * stmt, const char *fmt, ...)
2041 {
2042  va_list ap;
2043  char *old_buf = parser->error_buffer;
2044 
2045  va_start (ap, fmt);
2046  vasprintf (&parser->error_buffer, fmt, ap);
2047  va_end (ap);
2048 
2049  if (old_buf && parser->error_buffer != old_buf)
2050  {
2051  free (old_buf);
2052  }
2053  pt_record_warning (parser, parser->statement_number, SAFENUM (stmt, line_number), SAFENUM (stmt, column_number),
2054  parser->error_buffer);
2055 }
2056 
2057 /*
2058  * pt_frob_error() - creates a new PT_ZZ_ERROR_MSG node appends it
2059  * to parser->error_msgs
2060  * return: none
2061  * parser(in/out): pointer to parser structure
2062  * stmt(in): pointer to a PT_NODE with interesting line and column info in it
2063  * fmt(in): printf-style format string
2064  *
2065  * Note :
2066  * helper function for PT_ERROR macro
2067  */
2068 
2069 void
2070 pt_frob_error (PARSER_CONTEXT * parser, const PT_NODE * stmt, const char *fmt, ...)
2071 {
2072  va_list ap;
2073  const char *context = NULL;
2074  char *old_buf = parser->error_buffer;
2075 
2076  va_start (ap, fmt);
2077  vasprintf (&parser->error_buffer, fmt, ap);
2078  va_end (ap);
2079 
2080  if (old_buf && parser->error_buffer != old_buf)
2081  {
2082  free (old_buf);
2083  }
2084 
2085  if (parser->original_buffer != NULL && stmt != NULL && stmt->buffer_pos != -1)
2086  {
2087  if (strlen (parser->original_buffer) <= stmt->buffer_pos)
2088  {
2089  /* node probably copied from another parser context */
2090  context = NULL;
2091  }
2092  else
2093  {
2094  context = parser->original_buffer + stmt->buffer_pos;
2095  }
2096  }
2097 
2098  pt_record_error (parser, parser->statement_number, SAFENUM (stmt, line_number), SAFENUM (stmt, column_number),
2099  parser->error_buffer, context);
2100 }
2101 
2102 /*
2103  * pt_get_errors() - returns PT_NODE list or NULL
2104  * return: PT_NODE list if any or NULL
2105  * parser(in): parser context used in query compilation
2106  */
2107 PT_NODE *
2109 {
2110  if (parser == NULL)
2111  {
2112  return NULL;
2113  }
2114 
2115  return parser->error_msgs;
2116 }
2117 
2118 /*
2119  * pt_get_next_error() - yield next query compilation error
2120  * return: PT_NODE pointer if there are more errors,
2121  * NULL otherwise.
2122  * errors(in): iterator of query compilation errors
2123  * stmt_no(out): source statement where error was detected
2124  * line_no(out): source line number where error was detected
2125  * col_no(out): source column number where error was detected
2126  * e_msg(out): an explanation of the error
2127  */
2128 PT_NODE *
2129 pt_get_next_error (PT_NODE * errors, int *stmt_no, int *line_no, int *col_no, const char **msg)
2130 {
2131  if (!errors || errors->node_type != PT_ZZ_ERROR_MSG)
2132  {
2133  return NULL;
2134  }
2135  else
2136  {
2137  *stmt_no = errors->info.error_msg.statement_number;
2138  *line_no = errors->line_number;
2139  *col_no = errors->column_number;
2140  *msg = errors->info.error_msg.error_message;
2141 
2142  return errors->next;
2143  }
2144 }
2145 
2146 /*
2147  * parser_new_node() -
2148  * return:
2149  * parser(in):
2150  * n(in):
2151  */
2152 PT_NODE *
2154 {
2155  PT_NODE *node;
2156 
2157  node = parser_create_node (parser);
2158  if (node)
2159  {
2160  parser_init_node (node, node_type);
2161  pt_parser_line_col (node);
2162  node->sql_user_text = g_query_string;
2164  }
2165  return node;
2166 }
2167 
2168 /*
2169  * parser_init_node() - initialize a node (Used when initializing the node for the first time after creation)
2170  * return:
2171  * node(in/out):
2172  */
2173 PT_NODE *
2175 {
2176  assert (node != NULL);
2177  assert (node_type < PT_LAST_NODE_NUMBER);
2178  int parser_id = node->parser_id;
2179 
2180  memset (node, 0x00, sizeof (PT_NODE));
2181  node->buffer_pos = -1;
2182  node->type_enum = PT_TYPE_NONE;
2183 
2184  node->parser_id = parser_id;
2185  node->node_type = node_type;
2186  if (pt_init_f[node_type])
2187  {
2188  node = (pt_init_f[node_type]) (node);
2189  }
2190 
2191  return node;
2192 }
2193 
2194 /*
2195  * parser_reinit_node() - initialize a node (Used when re-initializing an existing Node while in use)
2196  * return:
2197  * node(in/out):
2198  */
2199 PT_NODE *
2201 {
2202  if (node)
2203  {
2205 
2206  /* don't write over node_type, parser_id, sql_user_text, sql_user_text_len, cache_time */
2207  int parser_id = node->parser_id;
2208  PT_NODE_TYPE node_type = node->node_type;
2209  char *sql_user_text = node->sql_user_text;
2210  int sql_user_text_len = node->sql_user_text_len;
2211  int line_number = node->line_number;
2212  int column_number = node->column_number;
2214 
2215  memset (node, 0x00, sizeof (PT_NODE));
2216  node->buffer_pos = -1;
2217  node->type_enum = PT_TYPE_NONE;
2218 
2219  node->parser_id = parser_id;
2220  node->node_type = node_type;
2221 
2222  node->sql_user_text = sql_user_text;
2223  node->sql_user_text_len = sql_user_text_len;
2224  node->line_number = line_number;
2225  node->column_number = column_number;
2226  node->cache_time = cache_time;
2227 
2228  if (pt_init_f[node->node_type])
2229  {
2230  node = (pt_init_f[node->node_type]) (node);
2231  }
2232  }
2233 
2234  return node;
2235 }
2236 
2237 /*
2238  * pt_print_bytes_alias() -
2239  * return:
2240  * parser(in):
2241  * node(in):
2242  */
2245 {
2246  if (!node)
2247  {
2248  return NULL;
2249  }
2250 
2251  if (node->alias_print)
2252  {
2253  return pt_append_name (parser, NULL, node->alias_print);
2254  }
2255  else
2256  {
2257  return pt_print_bytes (parser, node);
2258  }
2259 }
2260 
2261 /*
2262  * pt_print_bytes() -
2263  * return:
2264  * parser(in):
2265  * node(in):
2266  */
2268 pt_print_bytes (PARSER_CONTEXT * parser, const PT_NODE * node)
2269 {
2270  PT_NODE_TYPE t;
2272  PARSER_VARCHAR *result = NULL;
2273 
2274  if (!node)
2275  {
2276  return NULL;
2277  }
2278 
2279  CAST_POINTER_TO_NODE (node);
2280 
2281  if (node->flag.is_cnf_start && !parser->flag.is_in_and_list)
2282  {
2283  return pt_print_and_list (parser, node);
2284  }
2285 
2286  t = node->node_type;
2287 
2288  if (t >= PT_LAST_NODE_NUMBER || !(f = pt_print_f[t]))
2289  {
2290  return NULL;
2291  }
2292 
2293  /* avoid recursion */
2294  if (parser->flag.is_in_and_list)
2295  {
2296  parser->flag.is_in_and_list = 0;
2297  result = f (parser, (PT_NODE *) node);
2298  parser->flag.is_in_and_list = 1;
2299  return result;
2300  }
2301  else
2302  {
2303  return f (parser, (PT_NODE *) node);
2304  }
2305 }
2306 
2307 /*
2308  * pt_print_bytes_l() - PRINT equivalent text for lists
2309  * return:
2310  * parser(in):
2311  * p(in):
2312  */
2315 {
2316  PARSER_VARCHAR *q = 0, *r, *prev;
2317  PT_STRING_BLOCK sb;
2318 
2319  sb.body = NULL;
2320  sb.length = 0;
2321  sb.size = 1024;
2322 
2323  if (!p)
2324  {
2325  return NULL;
2326  }
2327 
2328  prev = pt_print_bytes (parser, p);
2329 
2330  if (p->flag.is_cnf_start)
2331  {
2332  return prev;
2333  }
2334 
2335  sb.body = (char *) malloc (sb.size);
2336  if (sb.body == NULL)
2337  {
2338  return NULL;
2339  }
2340 
2341  sb.body[0] = 0;
2342  if (prev)
2343  {
2344  strcat_with_realloc (&sb, (const char *) prev->bytes);
2345  }
2346 
2347  while (p->next)
2348  { /* print in the original order ... */
2349  p = p->next;
2350  r = pt_print_bytes (parser, p);
2351  if (r)
2352  {
2353  if (prev)
2354  {
2355  strcat_with_realloc (&sb, ", ");
2356  }
2357 
2358  strcat_with_realloc (&sb, (const char *) r->bytes);
2359  prev = r;
2360  }
2361  if (0 < parser->max_print_len && parser->max_print_len < sb.length)
2362  {
2363  /* to help early break */
2364  break;
2365  }
2366  }
2367 
2368  if (sb.length > 0)
2369  {
2370  q = pt_append_nulstring (parser, q, sb.body);
2371  }
2372 
2373  free (sb.body);
2374 
2375  return q;
2376 }
2377 
2378 /*
2379  * pt_print_bytes_spec_list() -
2380  * return:
2381  * parser(in):
2382  * p(in):
2383  */
2386 {
2387  PARSER_VARCHAR *q = 0, *r;
2388 
2389  if (!p)
2390  {
2391  return 0;
2392  }
2393 
2394  q = pt_print_bytes (parser, p);
2395 
2396  while (p->next)
2397  { /* print in the original order ... */
2398  p = p->next;
2399  r = pt_print_bytes (parser, p);
2400 
2401  if (p->node_type == PT_SPEC)
2402  {
2403  switch (p->info.spec.join_type)
2404  {
2405  case PT_JOIN_NONE:
2406  q = pt_append_bytes (parser, q, ", ", 2);
2407  break;
2408  case PT_JOIN_CROSS:
2409  /* case PT_JOIN_NATURAL: -- does not support */
2410  case PT_JOIN_INNER:
2411  case PT_JOIN_LEFT_OUTER:
2412  case PT_JOIN_RIGHT_OUTER:
2413  case PT_JOIN_FULL_OUTER:
2414  break;
2415  /* case PT_JOIN_UNION: -- does not support */
2416  default:
2417  q = pt_append_bytes (parser, q, ", ", 2);
2418  break;
2419  }
2420  }
2421  else
2422  {
2423  q = pt_append_bytes (parser, q, ", ", 2);
2424  }
2425 
2426  q = pt_append_varchar (parser, q, r);
2427  }
2428  return q;
2429 }
2430 
2431 /*
2432  * pt_print_node_value () -
2433  * return: const sql string customized
2434  * parser(in):
2435  * val(in):
2436  */
2439 {
2440  PARSER_VARCHAR *q = NULL;
2441  DB_VALUE *db_val, new_db_val;
2442  DB_TYPE db_typ;
2443  int error = NO_ERROR;
2444  SETOBJ *setobj;
2445 
2446  if (val->node_type != PT_VALUE && val->node_type != PT_HOST_VAR
2447  && (val->node_type != PT_NAME || val->info.name.meta_class != PT_PARAMETER))
2448  {
2449  return NULL;
2450  }
2451 
2453  {
2454  return val->expr_before_const_folding;
2455  }
2456 
2457  db_val = pt_value_to_db (parser, (PT_NODE *) val);
2458  if (!db_val)
2459  {
2460  return NULL;
2461  }
2462  db_typ = DB_VALUE_DOMAIN_TYPE (db_val);
2463 
2464  if (val->type_enum == PT_TYPE_OBJECT)
2465  {
2466  switch (db_typ)
2467  {
2468  case DB_TYPE_OBJECT:
2469  vid_get_keys (db_get_object (db_val), &new_db_val);
2470  db_val = &new_db_val;
2471  break;
2472  case DB_TYPE_VOBJ:
2473  /* don't want a clone of the db_value, so use lower level functions */
2474  error = set_get_setobj (db_get_set (db_val), &setobj, 0);
2475  if (error >= 0)
2476  {
2477  error = setobj_get_element_ptr (setobj, 2, &db_val);
2478  }
2479  break;
2480  default:
2481  break;
2482  }
2483 
2484  if (error < 0)
2485  {
2486  PT_ERRORc (parser, val, er_msg ());
2487  }
2488 
2489  if (db_val)
2490  {
2491  db_typ = DB_VALUE_DOMAIN_TYPE (db_val);
2492  }
2493  }
2494 
2495  q = pt_print_db_value (parser, db_val);
2496 
2497  return q;
2498 }
2499 
2500 /*
2501  * pt_print_db_value () -
2502  * return: const sql string customized
2503  * parser(in):
2504  * val(in):
2505  */
2507 pt_print_db_value (PARSER_CONTEXT * parser, const struct db_value * val)
2508 {
2509  PARSER_VARCHAR *temp = NULL, *result = NULL;
2510  int i, size = 0;
2511  DB_VALUE element;
2512  int error = NO_ERROR;
2513  unsigned int save_custom = parser->custom_print;
2514 
2515  parser_block_allocator alloc (parser);
2516  string_buffer sb (alloc);
2517 
2518  db_value_printer printer (sb);
2519  if (val == NULL)
2520  {
2521  return NULL;
2522  }
2523 
2524  /* set custom_print here so describe_data() will know to pad bit strings to full bytes */
2525  parser->custom_print = parser->custom_print | PT_PAD_BYTE;
2526  switch (DB_VALUE_TYPE (val))
2527  {
2528  case DB_TYPE_SET:
2529  case DB_TYPE_MULTISET:
2530  sb ("%s", pt_show_type_enum (pt_db_to_type_enum (DB_VALUE_TYPE (val))));
2531  /* fall thru */
2532  case DB_TYPE_SEQUENCE:
2533  sb ("{");
2534 
2535  size = db_set_size (db_get_set ((DB_VALUE *) val));
2536  if (size > 0)
2537  {
2538  error = db_set_get (db_get_set ((DB_VALUE *) val), 0, &element);
2539  printer.describe_value (&element);
2540  for (i = 1; i < size; i++)
2541  {
2542  error = db_set_get (db_get_set ((DB_VALUE *) val), i, &element);
2543  sb (", ");
2544  printer.describe_value (&element);
2545  }
2546  }
2547  sb ("}");
2548  break;
2549 
2550  case DB_TYPE_OBJECT:
2551  /* no printable representation!, should not get here */
2552  sb ("NULL");
2553  break;
2554 
2555  case DB_TYPE_MONETARY:
2556  /* This is handled explicitly because describe_value will add a currency symbol, and it isn't needed here. */
2557  printer.describe_money (db_get_monetary ((DB_VALUE *) val));
2558  break;
2559 
2560  case DB_TYPE_BIT:
2561  case DB_TYPE_VARBIT:
2562  /* csql & everyone else get X'some_hex_string' */
2563  printer.describe_value (val);
2564  break;
2565 
2566  case DB_TYPE_DATE:
2567  /* csql & everyone else want DATE'mm/dd/yyyy' */
2568  printer.describe_value (val);
2569  break;
2570 
2571  case DB_TYPE_TIME:
2572  /* csql & everyone else get time 'hh:mi:ss' */
2573  printer.describe_value (val);
2574  break;
2575 
2576  case DB_TYPE_TIMESTAMP:
2577  case DB_TYPE_TIMESTAMPTZ:
2578  case DB_TYPE_TIMESTAMPLTZ:
2579  /* everyone else gets csql's utime format */
2580  printer.describe_value (val);
2581  break;
2582 
2583  case DB_TYPE_DATETIME:
2584  case DB_TYPE_DATETIMETZ:
2585  case DB_TYPE_DATETIMELTZ:
2586  /* everyone else gets csql's utime format */
2587  printer.describe_value (val);
2588  break;
2589 
2590  default:
2591  printer.describe_value (val);
2592  break;
2593  }
2594 
2595  /* restore custom print */
2596  parser->custom_print = save_custom;
2597  result = pt_append_nulstring (parser, NULL, sb.get_buffer ());
2598  return result;
2599 }
2600 
2601 /*
2602  * pt_print_alias() -
2603  * return:
2604  * parser(in):
2605  * node(in):
2606  */
2607 char *
2608 pt_print_alias (PARSER_CONTEXT * parser, const PT_NODE * node)
2609 {
2610  PARSER_VARCHAR *string;
2611 
2612  string = pt_print_bytes_alias (parser, node);
2613  if (string)
2614  {
2615  return (char *) string->bytes;
2616  }
2617  return NULL;
2618 }
2619 
2620 /*
2621  * parser_print_tree() -
2622  * return:
2623  * parser(in):
2624  * node(in):
2625  */
2626 char *
2627 parser_print_tree (PARSER_CONTEXT * parser, const PT_NODE * node)
2628 {
2629 #define PT_QUERY_STRING_USER_TEXT ( \
2630  5 /* user= */ \
2631  + 6 /* volid| (values up to 16384) */ \
2632  + 11 /* pageid| (values up to 2147483647) */ \
2633  + 5 /* slotid (values up to 16384) */ \
2634  + 1 /* \0 */)
2635 
2636  PARSER_VARCHAR *string;
2637  char user_text_buffer[PT_QUERY_STRING_USER_TEXT];
2638 
2639  string = pt_print_bytes (parser, node);
2640  if (string)
2641  {
2643  {
2645  string = pt_append_nulstring (parser, string, "?");
2646  string = pt_append_nulstring (parser, string, str);
2647  free_and_init (str);
2648  }
2649  if ((parser->custom_print & PT_PRINT_USER) != 0)
2650  {
2651  /* Print user text. */
2652  if (parser_print_user (user_text_buffer, PT_QUERY_STRING_USER_TEXT) > 0)
2653  {
2654  string = pt_append_nulstring (parser, string, user_text_buffer);
2655  }
2656  }
2657  return (char *) string->bytes;
2658  }
2659  return NULL;
2660 #undef PT_QUERY_STRING_USER_TEXT
2661 }
2662 
2663 /*
2664  * parser_print_user () - Create a text to include user in query string.
2665  *
2666  * return : Size of user text.
2667  * user_text (in) : User text.
2668  * len (in) : Size of buffer.
2669  */
2670 static int
2671 parser_print_user (char *user_text, int len)
2672 {
2673  char *p = user_text;
2674  OID *oid = ws_identifier (db_get_user ());
2675 
2676  memset (user_text, 0, len);
2677 
2678  if (oid == NULL)
2679  {
2680  return 0;
2681  }
2682 
2683  return snprintf (p, len - 1, "user=%d|%d|%d", oid->volid, oid->pageid, oid->slotid);
2684 }
2685 
2686 /*
2687  * parser_print_tree_with_quotes() -
2688  * return:
2689  * parser(in):
2690  * node(in):
2691  */
2692 char *
2694 {
2695  PARSER_VARCHAR *string;
2696  unsigned int save_custom;
2697 
2698  save_custom = parser->custom_print;
2699  parser->custom_print |= PT_PRINT_QUOTES;
2700 
2701  string = pt_print_bytes (parser, node);
2702  parser->custom_print = save_custom;
2703 
2704  if (string)
2705  {
2706  return (char *) string->bytes;
2707  }
2708  return NULL;
2709 }
2710 
2711 /*
2712  * parser_print_function_index_expr () - prints function index candidate
2713  * expressions
2714  *
2715  * return: printed expression as char *
2716  * parser: parser context
2717  * expr: candidate expression for function index
2718  *
2719  * NOTE: PT_NAME nodes will not print info.name.resolved, they will use
2720  * the original table name in order to match the expression with
2721  * the function based index
2722  */
2723 char *
2725 {
2726  unsigned int save_custom = parser->custom_print;
2727  char *result;
2728 
2729  assert (expr && PT_IS_EXPR_NODE (expr));
2730 
2732  result = parser_print_tree_with_quotes (parser, expr);
2733  parser->custom_print = save_custom;
2734 
2735  return result;
2736 }
2737 
2738 /*
2739  * parser_print_tree_list() -
2740  * return:
2741  * parser(in):
2742  * node(in):
2743  */
2744 char *
2746 {
2747  PARSER_VARCHAR *string;
2748 
2749  string = pt_print_bytes_l (parser, node);
2750  if (string)
2751  {
2752  return (char *) string->bytes;
2753  }
2754  return NULL;
2755 }
2756 
2757 /*
2758  * pt_print_and_list() - PRINT equivalent text for CNF predicate lists
2759  * return:
2760  * parser(in):
2761  * p(in):
2762  */
2765 {
2766  PARSER_VARCHAR *q = NULL, *r1;
2767  const PT_NODE *n;
2768 
2769  if (!p)
2770  {
2771  return NULL;
2772  }
2773 
2774  parser->flag.is_in_and_list = 1;
2775 
2776  for (n = p; n; n = n->next)
2777  { /* print in the original order ... */
2778  r1 = pt_print_bytes (parser, n);
2779  if (n->node_type == PT_EXPR && !n->info.expr.paren_type && n->or_next)
2780  {
2781  /* found non-parenthesis OR */
2782  q = pt_append_nulstring (parser, q, "(");
2783  q = pt_append_varchar (parser, q, r1);
2784  q = pt_append_nulstring (parser, q, ")");
2785  }
2786  else
2787  {
2788  q = pt_append_varchar (parser, q, r1);
2789  }
2790 
2791  if (n->next)
2792  {
2793  q = pt_append_nulstring (parser, q, " and ");
2794  }
2795  }
2796 
2797  parser->flag.is_in_and_list = 0;
2798 
2799  return q;
2800 }
2801 
2802 /*
2803  * pt_print_query_spec_no_list() - prints query specifications
2804  * with NA placeholders
2805  * return:
2806  * parser(in):
2807  * node(in):
2808  */
2809 char *
2811 {
2812  unsigned int save_custom = parser->custom_print;
2813  char *result;
2814 
2816  result = parser_print_tree_with_quotes (parser, node);
2817  parser->custom_print = save_custom;
2818 
2819  return result;
2820 }
2821 
2822 /*
2823  * pt_short_print() - Short print (for error messages)
2824  * return:
2825  * parser(in):
2826  * node(in):
2827  */
2828 char *
2829 pt_short_print (PARSER_CONTEXT * parser, const PT_NODE * node)
2830 {
2831  char *str;
2832  const int max_print_len = 64;
2833 
2834  parser->max_print_len = max_print_len;
2835 
2836  str = parser_print_tree (parser, node);
2837  if (str == NULL)
2838  {
2839  goto end;
2840  }
2841 
2842  if (strlen (str) > max_print_len)
2843  {
2844  strcpy (str + 60, "...");
2845  }
2846 
2847 end:
2848  parser->max_print_len = 0; /* restore */
2849  return str;
2850 }
2851 
2852 /*
2853  * pt_short_print_l() -
2854  * return:
2855  * parser(in):
2856  * node(in):
2857  */
2858 char *
2859 pt_short_print_l (PARSER_CONTEXT * parser, const PT_NODE * node)
2860 {
2861  char *str;
2862  const int max_print_len = 64;
2863 
2864  parser->max_print_len = max_print_len;
2865 
2866  str = parser_print_tree_list (parser, node);
2867  if (str == NULL)
2868  {
2869  goto end;
2870  }
2871 
2872  if (strlen (str) > max_print_len)
2873  {
2874  strcpy (str + 60, "...");
2875  }
2876 
2877 end:
2878  parser->max_print_len = 0; /* restore */
2879  return str;
2880 }
2881 
2882 /*
2883  * pt_show_node_type() -
2884  * return: English name of the node type (for debugging)
2885  * node(in):
2886  */
2887 const char *
2889 {
2890  if (!node)
2891  {
2892  return "null_pointer";
2893  }
2894  switch (node->node_type)
2895  {
2896  case PT_ALTER:
2897  return "ALTER";
2898  case PT_ALTER_INDEX:
2899  return "ALTER_INDEX";
2900  case PT_ALTER_USER:
2901  return "ALTER_USER";
2902  case PT_ALTER_TRIGGER:
2903  return "ALTER_TRIGGER";
2904  case PT_2PC_ATTACH:
2905  return "ATTACH";
2906  case PT_ATTR_DEF:
2907  return "ATTR_DEF";
2908  case PT_ATTR_ORDERING:
2909  return "ATTR_ORDERING";
2910  case PT_AUTH_CMD:
2911  return "AUTH CMD";
2912  case PT_COMMIT_WORK:
2913  return "COMMIT_WORK";
2914  case PT_CREATE_ENTITY:
2915  return "CREATE_ENTITY";
2916  case PT_CREATE_INDEX:
2917  return "CREATE_INDEX";
2918  case PT_CREATE_USER:
2919  return "CREATE_USER";
2920  case PT_CREATE_TRIGGER:
2921  return "CREATE_TRIGGER";
2922  case PT_DATA_DEFAULT:
2923  return "DATA_DEFAULT";
2924  case PT_DATA_TYPE:
2925  return "DATA_TYPE";
2926  case PT_DELETE:
2927  return "DELETE";
2928  case PT_DIFFERENCE:
2929  return "DIFFERENCE";
2930  case PT_DOT_:
2931  return "DOT_";
2932  case PT_DROP:
2933  return "DROP";
2934  case PT_DROP_INDEX:
2935  return "DROP_INDEX";
2936  case PT_DROP_USER:
2937  return "DROP_USER";
2938  case PT_DROP_TRIGGER:
2939  return "DROP TRIGGER";
2940  case PT_EVENT_OBJECT:
2941  return "EVENT_OBJECT";
2942  case PT_EVENT_SPEC:
2943  return "EVENT_SPEC";
2944  case PT_EVENT_TARGET:
2945  return "EVENT_TARGET";
2946  case PT_EXECUTE_TRIGGER:
2947  return "EXECUTE_TRIGGER";
2948  case PT_EXPR:
2949  return "EXPR";
2950  case PT_FILE_PATH:
2951  return "FILE_PATH";
2952  case PT_FUNCTION:
2953  return "FUNCTION";
2954  case PT_GET_OPT_LVL:
2955  return "GET OPT LEVEL";
2956  case PT_GET_XACTION:
2957  return "GET TRANSACTION";
2958  case PT_GRANT:
2959  return "GRANT";
2960  case PT_HOST_VAR:
2961  return "HOST_VAR";
2962  case PT_INSERT:
2963  return "INSERT";
2964  case PT_INTERSECTION:
2965  return "INTERSECTION";
2966  case PT_ISOLATION_LVL:
2967  return "ISOLATION LEVEL";
2968  case PT_MERGE:
2969  return "MERGE";
2970  case PT_METHOD_CALL:
2971  return "METHOD CALL";
2972  case PT_METHOD_DEF:
2973  return "METHOD_DEF";
2974  case PT_NAME:
2975  return "NAME";
2976  case PT_NAMED_ARG:
2977  return "NAMED_ARG";
2978  case PT_PREPARE_TO_COMMIT:
2979  return "PREPARE TO COMMIT";
2980  case PT_PREPARE_STATEMENT:
2981  return "PREPARE";
2982  case PT_EXECUTE_PREPARE:
2983  return "EXECUTE";
2984  case PT_DEALLOCATE_PREPARE:
2985  return "DROP";
2986  case PT_REMOVE_TRIGGER:
2987  return "REMOVE_TRIGGER";
2988  case PT_RENAME:
2989  return "RENAME";
2990  case PT_RESOLUTION:
2991  return "RESOLUTION";
2992  case PT_REVOKE:
2993  return "REVOKE";
2994  case PT_ROLLBACK_WORK:
2995  return "ROLLBACK_WORK";
2996  case PT_SAVEPOINT:
2997  return "SAVEPOINT";
2998  case PT_SELECT:
2999  return "SELECT";
3000  case PT_SET_NAMES:
3001  return "SET NAMES";
3002  case PT_SET_TIMEZONE:
3003  return "SET TIMEZONE";
3004  case PT_SET_OPT_LVL:
3005  return "SET OPT LVL";
3006  case PT_SET_SYS_PARAMS:
3007  return "SET SYSTEM PARAMETERS";
3008  case PT_SET_XACTION:
3009  return "SET TRANSACTION";
3010  case PT_SHOWSTMT:
3011  return "SHOW";
3012  case PT_SORT_SPEC:
3013  return "SORT_SPEC";
3014  case PT_SPEC:
3015  return "SPEC";
3016  case PT_TIMEOUT:
3017  return "TIMEOUT";
3018  case PT_TRIGGER_ACTION:
3019  return "TRIGGER_ACTION";
3020  case PT_TRIGGER_SPEC_LIST:
3021  return "TRIGGER_SPEC_LIST";
3022  case PT_TRUNCATE:
3023  return "TRUNCATE";
3024  case PT_DO:
3025  return "DO";
3026  case PT_UNION:
3027  return "UNION";
3028  case PT_UPDATE:
3029  return "UPDATE";
3030  case PT_UPDATE_STATS:
3031  return "UPDATE_STATS";
3032  case PT_GET_STATS:
3033  return "GET_STATS";
3034 #if defined (ENABLE_UNUSED_FUNCTION)
3035  case PT_USE:
3036  return "USE";
3037 #endif
3038  case PT_VALUE:
3039  return "VALUE";
3040  case PT_CONSTRAINT:
3041  return "CONSTRAINT";
3042  case PT_PARTITION:
3043  return "PARTITION";
3044  case PT_PARTS:
3045  return "PARTS";
3046  case PT_NODE_LIST:
3047  return "NODE_LIST";
3048  case PT_VACUUM:
3049  return "VACUUM";
3050  case PT_WITH_CLAUSE:
3051  return "WITH";
3052  case PT_CTE:
3053  return "CTE";
3054  default:
3055  return "NODE: type unknown";
3056  }
3057 }
3058 
3059 /*
3060  * parser_append_node() -
3061  * return:
3062  * node(in/out):
3063  * list(in):
3064  */
3065 PT_NODE *
3067 {
3068  if (list)
3069  {
3070  PT_NODE *tail;
3071  tail = list;
3072  while (tail->next)
3073  {
3074  tail = tail->next;
3075  }
3076  tail->next = node;
3077  }
3078  else
3079  {
3080  list = node;
3081  }
3082  return list;
3083 }
3084 
3085 /*
3086  * parser_append_node_or() -
3087  * return:
3088  * node(in/out):
3089  * list(in):
3090  */
3091 PT_NODE *
3093 {
3094  if (list)
3095  {
3096  PT_NODE *tail;
3097  tail = list;
3098  while (tail->or_next)
3099  {
3100  tail = tail->or_next;
3101  }
3102  tail->or_next = node;
3103  }
3104  else
3105  {
3106  list = node;
3107  }
3108  return list;
3109 }
3110 
3111 /*
3112  * pt_length_of_list() -
3113  * return:
3114  * list(in):
3115  */
3116 int
3118 {
3119  int len;
3120  for (len = 0; list; len++)
3121  {
3122  list = list->next;
3123  }
3124  return len;
3125 }
3126 
3127 /*
3128  * pt_length_of_select_list() -
3129  * return:
3130  * list(in):
3131  * hidden_col(in):
3132  */
3133 int
3134 pt_length_of_select_list (PT_NODE * list, int hidden_col)
3135 {
3136  int len;
3137 
3138  if (hidden_col == INCLUDE_HIDDEN_COLUMNS)
3139  {
3140  for (len = 0; list; len++)
3141  {
3142  list = list->next;
3143  }
3144  return len;
3145  }
3146  else
3147  { /* EXCLUDE_HIDDEN_COLUMNS */
3148  for (len = 0; list; list = list->next)
3149  {
3150  if (list->flag.is_hidden_column)
3151  {
3152  /* skip hidden column */
3153  continue;
3154  }
3155  len++;
3156  }
3157  return len;
3158  }
3159 }
3160 
3161 /*
3162  * pt_get_node_from_list - get node from list, based on index
3163  * return: the node at position specified by index or NULL
3164  * list(in): node list
3165  * index(in): index of requested node
3166  */
3167 PT_NODE *
3169 {
3170  if (list == NULL || index < 0)
3171  {
3172  return NULL;
3173  }
3174 
3175  while (list && index > 0)
3176  {
3177  list = list->next;
3178  index--;
3179  }
3180 
3181  return list;
3182 }
3183 
3184 /*
3185  * pt_show_misc_type() - English name of the node type (for debugging)
3186  * return:
3187  * c(in):
3188  */
3189 const char *
3191 {
3192  switch (p)
3193  {
3194  case PT_MISC_DUMMY:
3195  return "";
3196  case PT_ACTIVE:
3197  return "active";
3198  case PT_INACTIVE:
3199  return "inactive";
3200  case PT_AFTER:
3201  return "after";
3202  case PT_BEFORE:
3203  return "before";
3204  case PT_DEFERRED:
3205  return "deferred";
3206  case PT_INVALIDATE_XACTION:
3207  return "invalidate transaction";
3208  case PT_PRINT:
3209  return "print";
3210  case PT_REJECT:
3211  return "reject";
3212  case PT_ALL:
3213  return "all";
3214  case PT_ONLY:
3215  return "only";
3216  case PT_DISTINCT:
3217  return "distinct";
3218  case PT_SHARED:
3219  return "shared";
3220  case PT_DEFAULT:
3221  return "default";
3222  case PT_ASC:
3223  return "asc";
3224  case PT_DESC:
3225  return "desc";
3226  case PT_GRANT_OPTION:
3227  return "with grant option";
3228  case PT_NO_GRANT_OPTION:
3229  return "with no grant option";
3230  case PT_CLASS:
3231  return "class";
3232  case PT_VCLASS:
3233  return "vclass";
3234  case PT_NORMAL:
3235  return "";
3236  case PT_META_CLASS:
3237  return "class";
3238  case PT_META_ATTR:
3239  return "class";
3240  case PT_IS_SUBQUERY:
3241  case PT_IS_SUBINSERT:
3242  case PT_IS_VALUE:
3243  return "";
3244  case PT_ATTRIBUTE:
3245  return "attribute";
3246  case PT_METHOD:
3247  return "method";
3248  case PT_FUNCTION_RENAME:
3249  return "function";
3250  case PT_FILE_RENAME:
3251  return "file";
3252  case PT_NO_ISOLATION_LEVEL:
3253  return "no isolation level";
3254  case PT_SERIALIZABLE:
3255  return "serializable";
3256  case PT_REPEATABLE_READ:
3257  return "repeatable read";
3258  case PT_READ_COMMITTED:
3259  return "read committed";
3260  case PT_ISOLATION_LEVEL:
3261  return "isolation level";
3262  case PT_LOCK_TIMEOUT:
3263  return "lock timeout";
3264  case PT_CHAR_STRING:
3265  return "";
3266  case PT_NCHAR_STRING:
3267  return "";
3268  case PT_BIT_STRING:
3269  return "";
3270  case PT_HEX_STRING:
3271  return "";
3272  case PT_MATCH_REGULAR:
3273  return "";
3274  case PT_MATCH_FULL:
3275  return "match full";
3276  case PT_MATCH_PARTIAL:
3277  return "match partial";
3278  case PT_RULE_CASCADE:
3279  return "cascade";
3280  case PT_RULE_RESTRICT:
3281  return "restrict";
3282  case PT_RULE_SET_NULL:
3283  return "set null";
3284  case PT_RULE_NO_ACTION:
3285  return "no action";
3286  case PT_TRIGGER_TRACE:
3287  return "trace";
3288  case PT_TRIGGER_DEPTH:
3289  return "depth";
3290  case PT_YEAR:
3291  return "year";
3292  case PT_MONTH:
3293  return "month";
3294  case PT_DAY:
3295  return "day";
3296  case PT_HOUR:
3297  return "hour";
3298  case PT_MINUTE:
3299  return "minute";
3300  case PT_SECOND:
3301  return "second";
3302  case PT_MILLISECOND:
3303  return "millisecond";
3304  case PT_SIMPLE_CASE:
3305  return "simple case";
3306  case PT_SEARCHED_CASE:
3307  return "searched case";
3308  case PT_OPT_LVL:
3309  return "level";
3310  case PT_OPT_COST:
3311  return "cost";
3312  case PT_SP_FUNCTION:
3313  return "function";
3314  case PT_SP_PROCEDURE:
3315  return "procedure";
3316  case PT_NOPUT:
3317  return "";
3318  case PT_INPUT:
3319  return "";
3320  case PT_OUTPUT:
3321  return "out";
3322  case PT_INPUTOUTPUT:
3323  return "inout";
3324  case PT_CONSTRAINT_NAME:
3325  return "constraint";
3326  case PT_INDEX_NAME:
3327  return "index";
3328  case PT_TRACE_ON:
3329  return "on";
3330  case PT_TRACE_OFF:
3331  return "off";
3332  case PT_TRACE_FORMAT_TEXT:
3333  return "text";
3334  case PT_TRACE_FORMAT_JSON:
3335  return "json";
3336  default:
3337  return "MISC_TYPE: type unknown";
3338  }
3339 }
3340 
3341 /*
3342  * pt_show_binopcode() -
3343  * return:
3344  * n(in):
3345  */
3346 const char *
3348 {
3349  switch (n)
3350  {
3351  case PT_FUNCTION_HOLDER:
3352  assert (false);
3353  return "";
3354  case PT_AND:
3355  return " and ";
3356  case PT_OR:
3357  return " or ";
3358  case PT_NOT:
3359  return " not ";
3360  case PT_XOR:
3361  return " xor ";
3362  case PT_BETWEEN:
3363  return " between ";
3364  case PT_NOT_BETWEEN:
3365  return " not between ";
3366  case PT_BETWEEN_AND:
3367  return " and ";
3368  case PT_BETWEEN_GE_LE:
3369  return " ge_le ";
3370  case PT_BETWEEN_GE_LT:
3371  return " ge_lt ";
3372  case PT_BETWEEN_GT_LE:
3373  return " gt_le ";
3374  case PT_BETWEEN_GT_LT:
3375  return " gt_lt ";
3376  case PT_BETWEEN_EQ_NA:
3377  return " = ";
3378  case PT_BETWEEN_INF_LE:
3379  return " inf_le ";
3380  case PT_BETWEEN_INF_LT:
3381  return " inf_lt ";
3382  case PT_BETWEEN_GE_INF:
3383  return " ge_inf ";
3384  case PT_BETWEEN_GT_INF:
3385  return " gt_inf ";
3386  case PT_RANGE:
3387  return " range ";
3388  case PT_LIKE:
3389  return " like ";
3390  case PT_NOT_LIKE:
3391  return " not like ";
3392  case PT_LIKE_ESCAPE:
3393  return " escape ";
3394  case PT_RLIKE:
3395  return " regexp ";
3396  case PT_NOT_RLIKE:
3397  return " not regexp ";
3398  case PT_RLIKE_BINARY:
3399  return " regexp binary ";
3400  case PT_NOT_RLIKE_BINARY:
3401  return " not regexp binary ";
3402  case PT_IS_IN:
3403  return " in ";
3404  case PT_IS:
3405  return " is ";
3406  case PT_IS_NOT:
3407  return " is not ";
3408  case PT_IS_NOT_IN:
3409  return " not in ";
3410  case PT_IS_NULL:
3411  return " is null ";
3412  case PT_IS_NOT_NULL:
3413  return " is not null ";
3414  case PT_EXISTS:
3415  return " exists ";
3416  case PT_EQ_SOME:
3417  return "= any ";
3418  case PT_EQ_ALL:
3419  return "= all ";
3420  case PT_EQ:
3421  return "=";
3422  case PT_NULLSAFE_EQ:
3423  return "<=>";
3424  case PT_NE_SOME:
3425  return "<> any ";
3426  case PT_NE_ALL:
3427  return "<> all ";
3428  case PT_NE:
3429  return "<>";
3430  case PT_GE_SOME:
3431  return ">= any ";
3432  case PT_GE_ALL:
3433  return ">= all ";
3434  case PT_GE:
3435  return ">=";
3436  case PT_GT_SOME:
3437  return "> any ";
3438  case PT_GT_ALL:
3439  return "> all ";
3440  case PT_GT:
3441  return ">";
3442  case PT_LT_SOME:
3443  return "< any ";
3444  case PT_LT_ALL:
3445  return "< all ";
3446  case PT_LT:
3447  return "<";
3448  case PT_LE_SOME:
3449  return "<= any ";
3450  case PT_LE_ALL:
3451  return "<= all ";
3452  case PT_LE:
3453  return "<=";
3454  case PT_SETEQ:
3455  return " seteq ";
3456  case PT_SETNEQ:
3457  return " setneq ";
3458  case PT_SUBSET:
3459  return " subset ";
3460  case PT_SUBSETEQ:
3461  return " subseteq ";
3462  case PT_SUPERSET:
3463  return " superset ";
3464  case PT_SUPERSETEQ:
3465  return " superseteq ";
3466  case PT_BIT_NOT:
3467  return "~";
3468  case PT_BIT_AND:
3469  return "&";
3470  case PT_BIT_OR:
3471  return "|";
3472  case PT_BIT_XOR:
3473  return "^";
3474  case PT_BITSHIFT_LEFT:
3475  return "<<";
3476  case PT_BITSHIFT_RIGHT:
3477  return ">>";
3478  case PT_DIV:
3479  return " div ";
3480  case PT_MOD:
3481  return " mod ";
3482  case PT_BIT_COUNT:
3483  return "bit_count ";
3484  case PT_PLUS:
3485  return "+";
3486  case PT_MINUS:
3487  return "-";
3488  case PT_TIMES:
3489  return "*";
3490  case PT_DIVIDE:
3491  return "/";
3492  case PT_UNARY_MINUS:
3493  return "-";
3494  case PT_PRIOR:
3495  return "prior ";
3496  case PT_CONNECT_BY_ROOT:
3497  return "connect_by_root ";
3498  case PT_QPRIOR:
3499  return "prior ";
3500  case PT_ASSIGN:
3501  return "=";
3502  case PT_MODULUS:
3503  return "mod ";
3504  case PT_RAND:
3505  return "rand ";
3506  case PT_DRAND:
3507  return "drand ";
3508  case PT_RANDOM:
3509  return "random ";
3510  case PT_DRANDOM:
3511  return "drandom ";
3512  case PT_FLOOR:
3513  return "floor ";
3514  case PT_CEIL:
3515  return "ceil ";
3516  case PT_SIGN:
3517  return "sign ";
3518  case PT_POWER:
3519  return "power ";
3520  case PT_ROUND:
3521  return "round ";
3522  case PT_LOG:
3523  return "log ";
3524  case PT_EXP:
3525  return "exp ";
3526  case PT_SQRT:
3527  return "sqrt ";
3528  case PT_TRUNC:
3529  return "trunc ";
3530  case PT_ABS:
3531  return "abs ";
3532  case PT_CHR:
3533  return "chr ";
3534  case PT_INSTR:
3535  return "instr ";
3536  case PT_LEAST:
3537  return "least ";
3538  case PT_GREATEST:
3539  return "greatest ";
3540  case PT_POSITION:
3541  return "position ";
3542  case PT_FINDINSET:
3543  return "find_in_set ";
3544  case PT_SUBSTRING:
3545  return "substring ";
3546  case PT_SUBSTRING_INDEX:
3547  return "substring_index ";
3548  case PT_OCTET_LENGTH:
3549  return "octet_length ";
3550  case PT_BIT_LENGTH:
3551  return "bit_length ";
3552  case PT_CHAR_LENGTH:
3553  return "char_length ";
3554  case PT_IF:
3555  return "if ";
3556  case PT_IFNULL:
3557  return "ifnull ";
3558  case PT_ISNULL:
3559  return "isnull ";
3560  case PT_DEGREES:
3561  return "degrees ";
3562  case PT_RADIANS:
3563  return "radians ";
3564  case PT_PI:
3565  return "pi ";
3566  case PT_ACOS:
3567  return "acos ";
3568  case PT_ASIN:
3569  return "asin ";
3570  case PT_ATAN:
3571  return "atan ";
3572  case PT_ATAN2:
3573  return "atan2 ";
3574  case PT_SIN:
3575  return "sin ";
3576  case PT_COS:
3577  return "cos ";
3578  case PT_COT:
3579  return "cot ";
3580  case PT_TAN:
3581  return "tan ";
3582  case PT_LN:
3583  return "ln ";
3584  case PT_LOG2:
3585  return "log2 ";
3586  case PT_LOG10:
3587  return "log10 ";
3588  case PT_FORMAT:
3589  return "format ";
3590  case PT_DATE_ADD:
3591  return "date_add ";
3592  case PT_ADDDATE:
3593  return "adddate ";
3594  case PT_DATE_SUB:
3595  return "date_sub ";
3596  case PT_SUBDATE:
3597  return "subdate ";
3598  case PT_DATE_FORMAT:
3599  return "date_format ";
3600  case PT_STR_TO_DATE:
3601  return "str_to_date ";
3602  case PT_TIME_FORMAT:
3603  return "time_format ";
3604  case PT_DATEF:
3605  return "date ";
3606  case PT_TIMEF:
3607  return "time ";
3608  case PT_DATEDIFF:
3609  return "datediff ";
3610  case PT_TIMEDIFF:
3611  return "timediff ";
3612  case PT_CONCAT:
3613  return "concat ";
3614  case PT_CONCAT_WS:
3615  return "concat_ws ";
3616  case PT_FIELD:
3617  return "field ";
3618  case PT_LEFT:
3619  return "left ";
3620  case PT_RIGHT:
3621  return "right ";
3622  case PT_LOCATE:
3623  return "locate ";
3624  case PT_MID:
3625  return "mid ";
3626  case PT_STRCMP:
3627  return "strcmp ";
3628  case PT_REVERSE:
3629  return "reverse ";
3630  case PT_DISK_SIZE:
3631  return "disk_size ";
3632  case PT_LIKE_LOWER_BOUND:
3633  return "like_match_lower_bound ";
3634  case PT_LIKE_UPPER_BOUND:
3635  return "like_match_upper_bound ";
3636  case PT_LOWER:
3637  return "lower ";
3638  case PT_UPPER:
3639  return "upper ";
3640  case PT_HEX:
3641  return "hex ";
3642  case PT_ASCII:
3643  return "ascii ";
3644  case PT_CONV:
3645  return "conv ";
3646  case PT_MD5:
3647  return "md5 ";
3648  case PT_AES_ENCRYPT:
3649  return "aes_encrypt ";
3650  case PT_AES_DECRYPT:
3651  return "aes_decrypt ";
3652  case PT_SHA_ONE:
3653  return "sha1 ";
3654  case PT_SHA_TWO:
3655  return "sha2 ";
3656  case PT_TO_BASE64:
3657  return "to_base64 ";
3658  case PT_FROM_BASE64:
3659  return "from_base64 ";
3660  case PT_BIN:
3661  return "bin ";
3662  case PT_TRIM:
3663  return "trim ";
3664  case PT_LTRIM:
3665  return "ltrim ";
3666  case PT_RTRIM:
3667  return "rtrim ";
3668  case PT_LPAD:
3669  return "lpad ";
3670  case PT_RPAD:
3671  return "rpad ";
3672  case PT_REPEAT:
3673  return "repeat ";
3674  case PT_SPACE:
3675  return "space ";
3676  case PT_REPLACE:
3677  return "replace ";
3678  case PT_TRANSLATE:
3679  return "translate ";
3681  return "sys_connect_by_path ";
3682  case PT_ADD_MONTHS:
3683  return "add_months ";
3684  case PT_LAST_DAY:
3685  return "last_day ";
3686  case PT_MONTHS_BETWEEN:
3687  return "months_between ";
3688  case PT_SYS_DATE:
3689  return "sys_date ";
3690  case PT_CURRENT_DATE:
3691  return "current_date ";
3692  case PT_SYS_TIME:
3693  return "sys_time ";
3694  case PT_CURRENT_TIME:
3695  return "current_time ";
3696  case PT_SYS_TIMESTAMP:
3697  return "sys_timestamp ";
3698  case PT_CURRENT_TIMESTAMP:
3699  return "current_timestamp ";
3700  case PT_SYS_DATETIME:
3701  return "sys_datetime ";
3702  case PT_CURRENT_DATETIME:
3703  return "current_datetime ";
3704  case PT_UTC_TIME:
3705  return "utc_time ";
3706  case PT_UTC_DATE:
3707  return "utc_date ";
3708  case PT_TO_CHAR:
3709  return "to_char ";
3710  case PT_TO_DATE:
3711  return "to_date ";
3712  case PT_TO_TIME:
3713  return "to_time ";
3714  case PT_TO_TIMESTAMP:
3715  return "to_timestamp ";
3716  case PT_TIMESTAMP:
3717  return "timestamp ";
3718  case PT_YEARF:
3719  return "year ";
3720  case PT_MONTHF:
3721  return "month ";
3722  case PT_DAYF:
3723  return "day ";
3724  case PT_DAYOFMONTH:
3725  return "dayofmonth ";
3726  case PT_HOURF:
3727  return "hour ";
3728  case PT_MINUTEF:
3729  return "minute ";
3730  case PT_SECONDF:
3731  return "second ";
3732  case PT_UNIX_TIMESTAMP:
3733  return "unix_timestamp ";
3734  case PT_FROM_UNIXTIME:
3735  return "from_unixtime ";
3736  case PT_QUARTERF:
3737  return "quarter ";
3738  case PT_WEEKDAY:
3739  return "weekday ";
3740  case PT_DAYOFWEEK:
3741  return "dayofweek ";
3742  case PT_DAYOFYEAR:
3743  return "dayofyear ";
3744  case PT_TODAYS:
3745  return "to_days ";
3746  case PT_FROMDAYS:
3747  return "from_days ";
3748  case PT_TIMETOSEC:
3749  return "time_to_sec ";
3750  case PT_SECTOTIME:
3751  return "sec_to_time ";
3752  case PT_MAKEDATE:
3753  return "makedate ";
3754  case PT_MAKETIME:
3755  return "maketime ";
3756  case PT_ADDTIME:
3757  return "addtime ";
3758  case PT_WEEKF:
3759  return "week ";
3760  case PT_SCHEMA:
3761  return "schema ";
3762  case PT_DATABASE:
3763  return "database ";
3764  case PT_VERSION:
3765  return "version ";
3766  case PT_TO_DATETIME:
3767  return "to_datetime ";
3768  case PT_TO_NUMBER:
3769  return "to_number ";
3770  case PT_CURRENT_VALUE:
3771  return "serial_current_value ";
3772  case PT_NEXT_VALUE:
3773  return "serial_next_value ";
3774  case PT_EXTRACT:
3775  return "extract ";
3776  case PT_CAST:
3777  return "cast ";
3778  case PT_CASE:
3779  return "case ";
3780  case PT_INST_NUM:
3781  return "inst_num ";
3782  case PT_ROWNUM:
3783  return "rownum ";
3784  case PT_ORDERBY_NUM:
3785  return "orderby_num";
3786  case PT_CONNECT_BY_ISCYCLE:
3787  return "connect_by_iscycle ";
3788  case PT_CONNECT_BY_ISLEAF:
3789  return "connect_by_isleaf ";
3790  case PT_LEVEL:
3791  return "level ";
3792  case PT_CURRENT_USER:
3793  return "current_user ";
3795  return "local_transaction_id ";
3796  case PT_STRCAT:
3797  return "||";
3798  case PT_NULLIF:
3799  return "nullif ";
3800  case PT_COALESCE:
3801  return "coalesce ";
3802  case PT_NVL:
3803  return "nvl ";
3804  case PT_NVL2:
3805  return "nvl2 ";
3806  case PT_DECODE:
3807  return "decode ";
3808  case PT_INCR:
3809  return "incr ";
3810  case PT_DECR:
3811  return "decr ";
3812  case PT_USER:
3813  return "user ";
3814  case PT_ROW_COUNT:
3815  return "row_count ";
3816  case PT_LAST_INSERT_ID:
3817  return "last_insert_id ";
3818  case PT_DEFAULTF:
3819  return "default ";
3820  case PT_LIST_DBS:
3821  return "list_dbs ";
3822  case PT_SYS_GUID:
3823  return "sys_guid ";
3825  return "oid_of_duplicate_key ";
3826  case PT_BIT_TO_BLOB:
3827  return "bit_to_blob";
3828  case PT_CHAR_TO_BLOB:
3829  return "char_to_blob";
3830  case PT_BLOB_TO_BIT:
3831  return "blob_to_bit";
3832  case PT_CHAR_TO_CLOB:
3833  return "char_to_clob";
3834  case PT_CLOB_TO_CHAR:
3835  return "clob_to_char";
3836  case PT_BLOB_FROM_FILE:
3837  return "blob_from_file";
3838  case PT_CLOB_FROM_FILE:
3839  return "clob_from_file";
3840  case PT_BLOB_LENGTH:
3841  return "blob_length";
3842  case PT_CLOB_LENGTH:
3843  return "clob_length";
3844  case PT_TYPEOF:
3845  return "typeof ";
3846  case PT_INDEX_CARDINALITY:
3847  return "index_cardinality ";
3848  case PT_EVALUATE_VARIABLE:
3849  return "evaluate_variable";
3850  case PT_DEFINE_VARIABLE:
3851  return "define_variable";
3852  case PT_EXEC_STATS:
3853  return "exec_stats";
3855  return "to_enumeration_value";
3856  case PT_INET_ATON:
3857  return "inet_aton ";
3858  case PT_INET_NTOA:
3859  return "inet_ntoa ";
3860  case PT_CHARSET:
3861  return "charset ";
3862  case PT_COERCIBILITY:
3863  return "coercibility ";
3864  case PT_COLLATION:
3865  return "collation ";
3866  case PT_WIDTH_BUCKET:
3867  return "width_bucket";
3868  case PT_TRACE_STATS:
3869  return "trace_stats";
3870  case PT_INDEX_PREFIX:
3871  return "index_prefix ";
3872  case PT_SLEEP:
3873  return "sleep ";
3874  case PT_DBTIMEZONE:
3875  return "dbtimezone";
3876  case PT_SESSIONTIMEZONE:
3877  return "sessiontimezone";
3878  case PT_TZ_OFFSET:
3879  return "tz_offset";
3880  case PT_NEW_TIME:
3881  return "new_time ";
3882  case PT_FROM_TZ:
3883  return "from_tz ";
3884  case PT_TO_DATETIME_TZ:
3885  return "to_datetime_tz ";
3886  case PT_TO_TIMESTAMP_TZ:
3887  return "to_timestamp_tz ";
3888  case PT_UTC_TIMESTAMP:
3889  return "utc_timestamp ";
3890  case PT_CRC32:
3891  return "crc32 ";
3892  case PT_SCHEMA_DEF:
3893  return "schema_def";
3894  case PT_CONV_TZ:
3895  return "conv_tz";
3896  default:
3897  assert (false);
3898  return "unknown opcode";
3899  }
3900 }
3901 
3902 /*
3903  * pt_show_priv() -
3904  * return:
3905  * t(in):
3906  */
3907 const char *
3909 {
3910  switch (t)
3911  {
3912  case PT_NO_PRIV:
3913  return "no";
3914  case PT_ADD_PRIV:
3915  return "add";
3916  case PT_ALL_PRIV:
3917  return "all";
3918  case PT_ALTER_PRIV:
3919  return "alter";
3920  case PT_DELETE_PRIV:
3921  return "delete";
3922  case PT_DROP_PRIV:
3923  return "drop";
3924  case PT_EXECUTE_PRIV:
3925  return "execute";
3926  case PT_INDEX_PRIV:
3927  return "index";
3928  case PT_INSERT_PRIV:
3929  return "insert";
3930  case PT_REFERENCES_PRIV:
3931  return "references";
3932  case PT_SELECT_PRIV:
3933  return "select";
3934  case PT_UPDATE_PRIV:
3935  return "update";
3936  default:
3937  return "unknown privilege";
3938  }
3939 
3940 }
3941 
3942 /*
3943  * pt_show_type_enum() -
3944  * return:
3945  * t(in):
3946  */
3947 const char *
3949 {
3950  if (t <= PT_TYPE_NONE || t >= PT_TYPE_MAX)
3951  {
3952  return "unknown data type";
3953  }
3954 
3955  switch (t)
3956  {
3957  case PT_TYPE_NONE:
3958  return "none";
3959  /* treat PT_TYPE__LOGICAL as PT_TYPE_INTEGER */
3960  case PT_TYPE_LOGICAL:
3961  case PT_TYPE_INTEGER:
3962  return "integer";
3963  case PT_TYPE_BIGINT:
3964  return "bigint";
3965  case PT_TYPE_SMALLINT:
3966  return "smallint";
3967  case PT_TYPE_NUMERIC:
3968  return "numeric";
3969  case PT_TYPE_FLOAT:
3970  return "float";
3971  case PT_TYPE_DOUBLE:
3972  return "double";
3973  case PT_TYPE_DATE:
3974  return "date";
3975  case PT_TYPE_TIME:
3976  return "time";
3977  case PT_TYPE_TIMESTAMP:
3978  return "timestamp";
3979  case PT_TYPE_TIMESTAMPTZ:
3980  return "timestamptz";
3981  case PT_TYPE_TIMESTAMPLTZ:
3982  return "timestampltz";
3983  case PT_TYPE_DATETIME:
3984  return "datetime";
3985  case PT_TYPE_DATETIMETZ:
3986  return "datetimetz";
3987  case PT_TYPE_DATETIMELTZ:
3988  return "datetimeltz";
3989  case PT_TYPE_CHAR:
3990  return "char";
3991  case PT_TYPE_VARCHAR:
3992  return "varchar";
3993  case PT_TYPE_NCHAR:
3994  return "nchar";
3995  case PT_TYPE_VARNCHAR:
3996  return "nchar varying";
3997  case PT_TYPE_BIT:
3998  return "bit";
3999  case PT_TYPE_VARBIT:
4000  return "bit varying";
4001  case PT_TYPE_MONETARY:
4002  return "monetary";
4003  case PT_TYPE_JSON:
4004  return "json";
4005  case PT_TYPE_MAYBE:
4006  return "uncertain";
4007 
4008  case PT_TYPE_NA:
4009  return "na";
4010  case PT_TYPE_NULL:
4011  return "null";
4012  case PT_TYPE_STAR:
4013  return "*";
4014 
4015  case PT_TYPE_OBJECT:
4016  return "object";
4017  case PT_TYPE_SET:
4018  return "set";
4019  case PT_TYPE_MULTISET:
4020  return "multiset";
4021  case PT_TYPE_SEQUENCE:
4022  return "sequence";
4023  case PT_TYPE_RESULTSET:
4024  return "cursor";
4025  case PT_TYPE_COMPOUND:
4026  return "unknown";
4027 
4028  case PT_TYPE_BLOB:
4029  return "blob";
4030  case PT_TYPE_CLOB:
4031  return "clob";
4032  case PT_TYPE_ELO:
4033  return "*elo*";
4034 
4035  case PT_TYPE_ENUMERATION:
4036  return "enum";
4037 
4038  case PT_TYPE_MAX:
4039  default:
4040  return "unknown";
4041  }
4042  return "unknown"; /* make the compiler happy */
4043 }
4044 
4045 #if defined (ENABLE_UNUSED_FUNCTION)
4046 /*
4047  * pt_show_alter() -
4048  * return:
4049  * c(in):
4050  */
4051 const char *
4052 pt_show_alter (PT_ALTER_CODE c)
4053 {
4054  switch (c)
4055  {
4056  case PT_ADD_QUERY:
4057  return "ADD QUERY";
4058  case PT_DROP_QUERY:
4059  return "DROP QUERY";
4060  case PT_MODIFY_QUERY:
4061  return "CHANGE QUERY";
4062  case PT_RESET_QUERY:
4063  return "RESET QUERY";
4064  case PT_ADD_ATTR_MTHD:
4065  return "ADD ATTR/MTHD";
4066  case PT_DROP_ATTR_MTHD:
4067  return "DROP ATTR/MTHD";
4068  case PT_MODIFY_ATTR_MTHD:
4069  return "CHANGE ATTR/MTHD";
4070  case PT_RENAME_ATTR_MTHD:
4071  return "RENAME ATTR/MTHD";
4072  case PT_ADD_SUPCLASS:
4073  return "ADD SUPCLASS";
4074  case PT_DROP_SUPCLASS:
4075  return "DROP SUPCLASS";
4076  case PT_DROP_RESOLUTION:
4077  return "DROP RESOLUTION";
4078  case PT_RENAME_RESOLUTION:
4079  return "RENAME RESOLUTION";
4080  case PT_DROP_CONSTRAINT:
4081  return "DROP CONSTRAINT";
4082  case PT_APPLY_PARTITION:
4083  return "APPLY PARTITION";
4084  case PT_REMOVE_PARTITION:
4085  return "REMOVE PARTITION";
4086  case PT_ANALYZE_PARTITION:
4087  return "ANALYZE PARTITION";
4088  case PT_DROP_PARTITION:
4089  return "DROP PARTITION";
4090  case PT_ADD_PARTITION:
4091  return "ADD PARTITION";
4092  case PT_ADD_HASHPARTITION:
4093  return "ADD HASH PARTITION";
4094  case PT_REORG_PARTITION:
4095  return "REORGANIZE PARTITION";
4096  case PT_COALESCE_PARTITION:
4097  return "COALESCE PARTITION";
4098  case PT_PROMOTE_PARTITION:
4099  return "PROMOTE PARTITION";
4100  case PT_MODIFY_DEFAULT:
4101  return "CHANGE DEFAULT";
4102  case PT_RENAME_ENTITY:
4103  return "RENAME ENTITY";
4104  case PT_ALTER_DEFAULT:
4105  return "ALTER SET DEFAULT";
4106  case PT_DROP_INDEX_CLAUSE:
4107  return "DROP INDEX";
4109  return "DROP PRIMARY KEY";
4110  case PT_DROP_FK_CLAUSE:
4111  return "DROP FOREIGN KEY";
4112  default:
4113  return "unknown alter code";
4114  }
4115 }
4116 #endif
4117 
4118 /*
4119  * pt_show_partition_type() -
4120  * return:
4121  * t(in):
4122  */
4123 const char *
4125 {
4126  switch (t)
4127  {
4128  case PT_PARTITION_HASH:
4129  return "hash";
4130  case PT_PARTITION_RANGE:
4131  return "range";
4132  case PT_PARTITION_LIST:
4133  return "list";
4134  default:
4135  return "unknown partition type";
4136  }
4137 }
4138 
4139 /*
4140  * pt_gather_constraints() - Moves explicit and synthesized constraints from
4141  * the attribute definition list out into the constraint_list member
4142  * and into the create_index member
4143  * return: pointer to modified node or NULL
4144  * parser(in): pointer to parser structure
4145  * node(in): pointer to CREATE_ENTITY or ALTER node to be modified
4146  */
4147 
4148 PT_NODE *
4150 {
4151  PT_NODE **constraint_list_p = NULL;
4152  PT_NODE **create_index_list_p = NULL;
4153  PT_NODE **attr_list_p = NULL;
4154  PT_NODE **class_attr_list_p = NULL;
4155  PT_NODE *next = NULL, *tmp = NULL;
4156 
4157  switch (node->node_type)
4158  {
4159  case PT_CREATE_ENTITY:
4160  constraint_list_p = &node->info.create_entity.constraint_list;
4161  create_index_list_p = &node->info.create_entity.create_index;
4162  attr_list_p = &node->info.create_entity.attr_def_list;
4163  class_attr_list_p = &node->info.create_entity.class_attr_def_list;
4164  break;
4165 
4166  case PT_ALTER:
4168  || node->info.alter.code == PT_CHANGE_ATTR)
4169  {
4170  constraint_list_p = &node->info.alter.constraint_list;
4171  create_index_list_p = &node->info.alter.create_index;
4172  attr_list_p = &node->info.alter.alter_clause.attr_mthd.attr_def_list;
4173  class_attr_list_p = NULL;
4174  }
4175  break;
4176 
4177  default:
4178  PT_INTERNAL_ERROR (parser, "bad node type");
4179  goto error;
4180  }
4181 
4182  if (attr_list_p != NULL)
4183  {
4184  next = *attr_list_p;
4185  while (next)
4186  {
4187  switch (next->node_type)
4188  {
4189  case PT_CONSTRAINT:
4190  /*
4191  * We need to cut this entry out of the attr_def list and
4192  * append it to the constraint list. This uses the
4193  * standard indirect update technique for modifying a
4194  * singly-linked list.
4195  */
4196  tmp = next;
4197  *attr_list_p = next = tmp->next;
4198  tmp->next = NULL;
4199  *constraint_list_p = parser_append_node (tmp, *constraint_list_p);
4200  break;
4201 
4202  case PT_CREATE_INDEX:
4203  tmp = next;
4204  *attr_list_p = next = tmp->next;
4205  tmp->next = NULL;
4206  *create_index_list_p = parser_append_node (tmp, *create_index_list_p);
4207  break;
4208 
4209  default:
4210  attr_list_p = &next->next;
4211  next = next->next;
4212  break;
4213  }
4214  }
4215  }
4216 
4217  if (class_attr_list_p != NULL)
4218  {
4219  next = *class_attr_list_p;
4220  while (next)
4221  {
4222  switch (next->node_type)
4223  {
4224  case PT_CONSTRAINT:
4225  /*
4226  * We need to cut this entry out of the class_attr_def list
4227  * and append it to the constraint list. This uses the
4228  * standard indirect update technique for modifying a
4229  * singly-linked list.
4230  */
4231  tmp = next;
4232  *class_attr_list_p = next = tmp->next;
4233  tmp->next = NULL;
4234  *constraint_list_p = parser_append_node (tmp, *constraint_list_p);
4235  break;
4236 
4237  default:
4238  class_attr_list_p = &next->next;
4239  next = next->next;
4240  break;
4241  }
4242  }
4243  }
4244 
4245  return node;
4246 
4247 error:
4248  return NULL;
4249 }
4250 
4251 /*
4252  * pt_get_subquery_list() - simple implementation of pt_get_select_list
4253  * return:
4254  * node(in):
4255  */
4256 PT_NODE *
4258 {
4259  PT_NODE *col, *list;
4260 
4261  while (node)
4262  {
4263  switch (node->node_type)
4264  {
4265  case PT_SELECT:
4266  list = node->info.query.q.select.list;
4267 
4268  if (PT_IS_VALUE_QUERY (node))
4269  {
4270  assert (list != NULL);
4271  node = list->info.node_list.list;
4272  }
4273  else
4274  {
4275  node = list;
4276  }
4277 
4278  if (node && node->node_type == PT_VALUE && node->type_enum == PT_TYPE_STAR)
4279  {
4280  /* found "*" */
4281  node = NULL;
4282  }
4283 
4284  for (col = node; col; col = col->next)
4285  {
4286  if (col->node_type == PT_NAME && col->type_enum == PT_TYPE_STAR)
4287  {
4288  /* fond "classname.*" */
4289  node = NULL;
4290  break;
4291  }
4292  }
4293 
4294  return node;
4295 
4296  case PT_UNION:
4297  case PT_INTERSECTION:
4298  case PT_DIFFERENCE:
4299  node = node->info.query.q.union_.arg1;
4300  break;
4301  default:
4302  node = NULL;
4303  break;
4304  }
4305  }
4306 
4307  return node;
4308 }
4309 
4310 /*
4311  * pt_get_expression_count() -
4312  * return:
4313  * node(in):
4314  */
4315 int
4317 {
4318  int count;
4319  PT_NODE *list;
4320 
4321  count = -1;
4322  if (node)
4323  {
4324  if (node->node_type == PT_VALUE && pt_is_set_type (node))
4325  {
4326  count = pt_length_of_list (node->info.value.data_value.set);
4327  }
4328  else if (PT_IS_QUERY_NODE_TYPE (node->node_type))
4329  {
4330  list = pt_get_subquery_list (node);
4331  if (!list)
4332  {
4333  /* in case of error or found "*" */
4334  return count;
4335  }
4336  else if (list->next == NULL)
4337  { /* single column */
4338  if (pt_is_set_type (list))
4339  {
4340  if (list->node_type == PT_VALUE)
4341  {
4342  count = pt_length_of_list (list->info.value.data_value.set);
4343  }
4344  else if (list->node_type == PT_FUNCTION)
4345  {
4346  count = pt_length_of_list (list->info.function.arg_list);
4347  }
4348  }
4349  else
4350  {
4351  count = 1;
4352  }
4353  }
4354  else
4355  {
4357  }
4358  }
4359  else
4360  {
4361  count = 0;
4362  for (list = node; list; list = list->next)
4363  {
4364  count++;
4365  }
4366  }
4367  }
4368  return count;
4369 }
4370 
4371 /*
4372  * pt_select_list_to_one_col() -
4373  * return:
4374  * parser(in):
4375  * node(in):
4376  * do_one(in):
4377  */
4378 void
4379 pt_select_list_to_one_col (PARSER_CONTEXT * parser, PT_NODE * node, bool do_one)
4380 {
4381  PT_NODE *val, *col, *list, *next;
4382  bool do_rewrite;
4383 
4384  if (!node)
4385  {
4386  return;
4387  }
4388 
4389  switch (node->node_type)
4390  {
4391  case PT_SELECT:
4392  list = node->info.query.q.select.list;
4393  if (do_one == true)
4394  {
4395  do_rewrite = false; /* init */
4396  if (node->info.query.orderby_for)
4397  {
4398  do_rewrite = true; /* give up */
4399  }
4400  else
4401  {
4402  for (col = list; col && do_rewrite != true; col = col->next)
4403  {
4404  /* check orderby_num() exists */
4405  if (col->node_type == PT_EXPR && col->info.expr.op == PT_ORDERBY_NUM)
4406  {
4407  do_rewrite = true; /* break */
4408  }
4409  }
4410  }
4411 
4412  /* change node as select of query-derived table */
4413  if (do_rewrite)
4414  {
4415  PT_NODE *derived, *from, *range_var, *spec;
4416  int i;
4417  char buf[20];
4418 
4419  /* reset single tuple mark and move to derived */
4420  node->info.query.flag.single_tuple = 0;
4421  derived = parser_copy_tree (parser, node);
4422  parser_reinit_node (node);
4423 
4424  /* new range var */
4425  from = derived->info.query.q.select.from;
4426  if ((range_var = from->info.spec.range_var) == NULL)
4427  {
4428  /* set line number to range name */
4429  range_var = pt_name (parser, "av3491");
4430  }
4431 
4432  spec = parser_new_node (parser, PT_SPEC);
4433  if (spec == NULL)
4434  {
4435  PT_INTERNAL_ERROR (parser, "allocate new node");
4436  return;
4437  }
4438 
4439  spec->info.spec.derived_table = derived;
4441  spec->info.spec.range_var = range_var;
4442  /* new as attr list */
4443  for (spec->info.spec.as_attr_list = NULL, i = 1, col = list; col; i++, col = col->next)
4444  {
4445  PT_NODE *att;
4446 
4447  sprintf (buf, "av_%d", i);
4448 
4449  att = pt_name (parser, pt_append_string (parser, NULL, buf));
4450  if (att)
4451  {
4453  }
4455  }
4456 
4457  node->info.query.q.select.list = parser_copy_tree_list (parser, spec->info.spec.as_attr_list);
4458  node->info.query.q.select.from = spec;
4459  }
4460  else
4461  {
4462  /* remove unnecessary ORDER BY clause */
4463  if (node->info.query.order_by && !node->info.query.q.select.connect_by)
4464  {
4465  parser_free_tree (parser, node->info.query.order_by);
4466  node->info.query.order_by = NULL;
4467  }
4468  }
4469 
4470  /* create parentheses expr set value */
4471  val = parser_new_node (parser, PT_VALUE);
4472  if (val)
4473  {
4474  val->info.value.data_value.set = node->info.query.q.select.list;
4475  val->type_enum = PT_TYPE_SEQUENCE;
4476  }
4477  node->info.query.q.select.list = val;
4478  }
4479  else
4480  {
4482  { /* one column */
4483  col = list;
4484  next = list->next; /* save hidden column */
4485  col->next = NULL;
4486 
4487  if (list->node_type == PT_VALUE)
4488  {
4489  list = col->info.value.data_value.set;
4490  col->info.value.data_value.set = NULL;
4491  parser_free_tree (parser, col);
4492  }
4493  else if (list->node_type == PT_FUNCTION)
4494  {
4495  list = col->info.function.arg_list;
4496  col->info.function.arg_list = NULL;
4497  parser_free_tree (parser, col);
4498  }
4499  else
4500  {
4501  list = col;
4502  }
4503 
4504  /* restore hidden columns */
4505  node->info.query.q.select.list = parser_append_node (next, list);
4506  }
4507  }
4508  break;
4509  case PT_UNION:
4510  case PT_INTERSECTION:
4511  case PT_DIFFERENCE:
4512  pt_select_list_to_one_col (parser, node->info.query.q.union_.arg1, do_one);
4513  pt_select_list_to_one_col (parser, node->info.query.q.union_.arg2, do_one);
4514  /* since the select_list was rebuilt, free the select list of the union node and pt_get_select_list() will
4515  * reestablish it. */
4516  parser_free_tree (parser, node->info.query.q.union_.select_list);
4517  node->info.query.q.union_.select_list = NULL;
4518  break;
4519  default:
4520  break;
4521  }
4522 
4523  return;
4524 }
4525 
4526 /*
4527  * pt_check_set_count_set() -
4528  * return: 1 for noerror, 0 for error
4529  * parser(in):
4530  * arg1(in):
4531  * arg2(in):
4532  */
4533 int
4535 {
4536  PT_NODE *e1, *e2;
4537  bool e1_is_expr_set, e2_is_expr_set;
4538  int e1_cnt, e2_cnt, rc;
4539 
4540  rc = 1; /* set as NO_ERROR */
4541 
4542  if (arg1->node_type != PT_VALUE || !pt_is_set_type (arg1) || arg2->node_type != PT_VALUE || !pt_is_set_type (arg2))
4543  {
4544  return rc; /* give up */
4545  }
4546 
4547  /* get elements */
4548  e1 = arg1->info.value.data_value.set;
4549  e2 = arg2->info.value.data_value.set;
4550  for (; e1 && e2; e1 = e1->next, e2 = e2->next)
4551  {
4552  e1_is_expr_set = e2_is_expr_set = false; /* init */
4553  if (e1->node_type == PT_VALUE && pt_is_set_type (e1))
4554  {
4555  e1_is_expr_set = true;
4556  }
4557  if (e2->node_type == PT_VALUE && pt_is_set_type (e2))
4558  {
4559  e2_is_expr_set = true;
4560  }
4561 
4562  if (e1_is_expr_set == e2_is_expr_set)
4563  {
4564  if (e1_is_expr_set == true)
4565  {
4566  /* do recursion */
4567  if (!pt_check_set_count_set (parser, e1, e2))
4568  {
4569  rc = 0; /* error */
4570  }
4571  }
4572  else
4573  {
4574  if (!rc)
4575  {
4576  /* already check this expression */
4577  continue;
4578  }
4579 
4580  /* expression number check */
4581  e1_cnt = pt_get_expression_count (e1);
4582  e2_cnt = pt_get_expression_count (e2);
4583  if (e1_cnt > 0 && e2_cnt > 0 && e1_cnt != e2_cnt)
4584  {
4586  e2_cnt);
4587  rc = 0; /* error */
4588  }
4589  }
4590  }
4591  else
4592  {
4593  /* unknown error */
4594  PT_ERROR (parser, e2, "check syntax at = or <>.");
4595  rc = 0; /* error */
4596  }
4597  } /* for */
4598 
4599  if ((e1 || e2) && rc)
4600  {
4601  /* unknown error */
4602  PT_ERROR (parser, e2, "check syntax at = or <>.");
4603  rc = 0; /* error */
4604  }
4605 
4606  return rc;
4607 }
4608 
4609 /*
4610  * pt_rewrite_set_eq_set() -
4611  * return:
4612  * parser(in):
4613  * exp(in):
4614  */
4615 PT_NODE *
4617 {
4618  PT_NODE *p = NULL, *rhs = NULL;
4619  PT_NODE *arg1, *arg2, *e1, *e2, *e1_next, *e2_next, *lhs, *tmp;
4620  bool e1_is_expr_set, e2_is_expr_set;
4621 
4622  if (exp == NULL)
4623  {
4624  return NULL;
4625  }
4626 
4627  arg1 = exp->info.expr.arg1;
4628  arg2 = exp->info.expr.arg2;
4629 
4630  if (arg1->node_type != PT_VALUE || !pt_is_set_type (arg1) || arg2->node_type != PT_VALUE || !pt_is_set_type (arg2))
4631  {
4632  return exp; /* give up */
4633  }
4634 
4635  /* get elements and cut-off link */
4636  e1 = arg1->info.value.data_value.set;
4637  arg1->info.value.data_value.set = NULL;
4638 
4639  e2 = arg2->info.value.data_value.set;
4640  arg2->info.value.data_value.set = NULL;
4641 
4642  /* save and cut-off link */
4643  e1_next = e1->next;
4644  e1->next = NULL;
4645 
4646  e2_next = e2->next;
4647  e2->next = NULL;
4648 
4649  e1_is_expr_set = e2_is_expr_set = false; /* init */
4650  if (e1->node_type == PT_VALUE && pt_is_set_type (e1))
4651  {
4652  e1_is_expr_set = true;
4653  }
4654  if (e2->node_type == PT_VALUE && pt_is_set_type (e2))
4655  {
4656  e2_is_expr_set = true;
4657  }
4658 
4659  if (e1_is_expr_set == e2_is_expr_set)
4660  {
4661  if (e1_is_expr_set == true)
4662  {
4663  /* create temporary expr */
4664  tmp = parser_copy_tree (parser, exp);
4666  e1->info.value.data_value.set = NULL;
4668  e2->info.value.data_value.set = NULL;
4669 
4670  /* do recursion */
4671  p = pt_rewrite_set_eq_set (parser, tmp);
4672 
4673  /* free old elements */
4674  parser_free_tree (parser, e1);
4675  parser_free_tree (parser, e2);
4676  }
4677  else
4678  {
4679  /* create new root node of predicate tree */
4680  p = parser_new_node (parser, PT_EXPR);
4681  if (p == NULL)
4682  {
4683  PT_INTERNAL_ERROR (parser, "allocate new node");
4684  return NULL;
4685  }
4686 
4687  p->info.expr.op = PT_EQ;
4688  p->info.expr.arg1 = e1;
4689  p->info.expr.arg2 = e2;
4691  }
4692  }
4693  else
4694  { /* error */
4695  PT_ERRORf (parser, exp, "check syntax at %s", pt_show_binopcode (PT_EQ));
4696  /* free old elements */
4697  parser_free_tree (parser, e1);
4698  parser_free_tree (parser, e2);
4699  }
4700 
4701  pt_push (parser, p);
4702 
4703  /* create child nodes */
4704  for (e1 = e1_next, e2 = e2_next; e1 && e2; e1 = e1_next, e2 = e2_next)
4705  {
4706  /* save and cut-off link */
4707  e1_next = e1->next;
4708  e1->next = NULL;
4709 
4710  e2_next = e2->next;
4711  e2->next = NULL;
4712 
4713  lhs = pt_pop (parser);
4714 
4715  /* create '=' expr node */
4716  e1_is_expr_set = e2_is_expr_set = false; /* init */
4717  if (e1->node_type == PT_VALUE && pt_is_set_type (e1))
4718  {
4719  e1_is_expr_set = true;
4720  }
4721  if (e2->node_type == PT_VALUE && pt_is_set_type (e2))
4722  {
4723  e2_is_expr_set = true;
4724  }
4725 
4726  if (e1_is_expr_set == e2_is_expr_set)
4727  {
4728  if (e1_is_expr_set == true)
4729  {
4730  /* create temporary expr */
4731  tmp = parser_copy_tree (parser, exp);
4733  e1->info.value.data_value.set = NULL;
4735  e2->info.value.data_value.set = NULL;
4736 
4737  /* do recursion */
4738  rhs = pt_rewrite_set_eq_set (parser, tmp);
4739 
4740  /* free old elements */
4741  parser_free_tree (parser, e1);
4742  parser_free_tree (parser, e2);
4743  }
4744  else
4745  {
4746  /* create new child node */
4747  rhs = parser_new_node (parser, PT_EXPR);
4748  if (rhs == NULL)
4749  {
4750  PT_INTERNAL_ERROR (parser, "allocate new node");
4751  return NULL;
4752  }
4753  rhs->info.expr.op = PT_EQ;
4754  rhs->info.expr.arg1 = e1;
4755  rhs->info.expr.arg2 = e2;
4756  rhs->type_enum = PT_TYPE_LOGICAL;
4757  }
4758  }
4759  else
4760  { /* error */
4761  PT_ERRORf (parser, exp, "check syntax at %s", pt_show_binopcode (PT_EQ));
4762  /* free old elements */
4763  parser_free_tree (parser, e1);
4764  parser_free_tree (parser, e2);
4765  }
4766 
4767  /* create 'and' node */
4768  p = parser_new_node (parser, PT_EXPR);
4769  if (p == NULL)
4770  {
4771  PT_INTERNAL_ERROR (parser, "allocate new node");
4772  return NULL;
4773  }
4774 
4775  p->info.expr.op = PT_AND;
4776  p->info.expr.arg1 = lhs;
4777  p->info.expr.arg2 = rhs;
4778  p->info.expr.arg3 = NULL;
4780 
4781  pt_push (parser, p);
4782  }
4783 
4784  /* expression count check */
4785  if (e1 || e2)
4786  {
4787  PT_ERRORf (parser, exp, "check syntax at %s, different number of elements in expression.",
4789  }
4790 
4791  p = pt_pop (parser);
4792 
4793  if (p == NULL)
4794  {
4795  return NULL;
4796  }
4797 
4798  /* bound with parentheses */
4799  p->info.expr.paren_type = 1;
4800 
4801  /* free old exp, arg1, arg2 node */
4802  if (exp)
4803  {
4804  arg1->info.value.data_value.set = NULL;
4805  arg2->info.value.data_value.set = NULL;
4806  parser_free_tree (parser, exp);
4807  }
4808 
4809  return p;
4810 }
4811 
4812 /*
4813  * pt_init_apply_f () - initialize function vector(called by parser_walk_tree...)
4814  * return: none
4815  */
4816 static void
4818 {
4893 #if defined (ENABLE_UNUSED_FUNCTION)
4894  pt_apply_func_array[PT_USE] = pt_apply_use;
4895 #endif
4926 
4928 }
4929 
4930 /*
4931  * pt_init_init_f () - initialize function vector(called by parser_new_node...)
4932  * return: none
4933  */
4934 static void
4936 {
4937 #define pt_init_func_null_function ((PARSER_INIT_NODE_FUNC)(NULL))
4938  /* Notice:
4939  * To initialize for any member variable of PT_STATEMENT_INFO to a non-zero value,
4940  * define a init function and assign a value for the member variable
4941  */
5016 #if defined (ENABLE_UNUSED_FUNCTION)
5018 #endif
5023 
5050 
5052 }
5053 
5054 /*
5055  * pt_init_print_f () - initialize function vector(called by pt_tree_print...)
5056  * return: none
5057  */
5058 static void
5060 {
5135 #if defined (ENABLE_UNUSED_FUNCTION)
5136  pt_print_func_array[PT_USE] = pt_print_use;
5137 #endif
5145  pt_print_func_array[PT_PREPARE_STATEMENT] = NULL; /* prepared statements should never need to be printed */
5167 
5169 }
5170 
5171 /*
5172  * pt_init_node () - initialize node by calling init function identified by node type
5173  * return: void
5174  * node(in) : pt node
5175  * node_type(in) : node type
5176  */
5177 void
5178 pt_init_node (PT_NODE * node, PT_NODE_TYPE node_type)
5179 {
5180  /* There is only one path where this function is called.
5181  * Also, node_type is fixed to PT_DOT_.
5182  */
5183  assert (node_type < PT_LAST_NODE_NUMBER);
5184  assert (pt_init_f != NULL);
5185 
5186  if (!node)
5187  {
5188  return;
5189  }
5190 
5191  memset (&(node->info), 0x00, sizeof (node->info));
5192  if (pt_init_f[node_type])
5193  {
5194  (pt_init_f[node_type]) (node);
5195  }
5196  node->node_type = node_type;
5197 }
5198 
5199 /*
5200  * pt_append_name () - if the given string is not a keyword and has no
5201  * non-alpha characters, append it. Otherwise, append it within double quotes
5202  * return:
5203  * parser(in):
5204  * string(out):
5205  * name(in):
5206  */
5208 pt_append_name (const PARSER_CONTEXT * parser, PARSER_VARCHAR * string, const char *name)
5209 {
5210  if ((!(parser->custom_print & PT_SUPPRESS_QUOTES)
5211  && (pt_is_keyword (name) || lang_check_identifier (name, strlen (name)) != true))
5212  || parser->custom_print & PT_PRINT_QUOTES)
5213  {
5214  string = pt_append_nulstring (parser, string, "[");
5215  string = pt_append_nulstring (parser, string, name);
5216  string = pt_append_nulstring (parser, string, "]");
5217  }
5218  else
5219  {
5220  string = pt_append_nulstring (parser, string, name);
5221  }
5222  return string;
5223 }
5224 
5225 /*
5226  * pt_append_quoted_string () - Quote and append a string,
5227  * breaking it into pieces if necessary
5228  * return:
5229  * parser(in):
5230  * buf(out):
5231  * str(in):
5232  * str_length(in):
5233  *
5234  * Note :
5235  * Keep track of how many characters we've written out, and break
5236  * the string into juxtaposed string lits if we exceed some
5237  * maximum. This is a concession to parsers that have smallish
5238  * token accumulation buffers.
5239  * MAX_STRING_SEGMENT_LENGTH is the maximum number of characters
5240  * that will be put between two single quotes.
5241  *
5242  */
5243 static PARSER_VARCHAR *
5244 pt_append_quoted_string (const PARSER_CONTEXT * parser, PARSER_VARCHAR * buf, const char *str, size_t str_length)
5245 {
5246  size_t i;
5247  size_t out_length;
5248 
5249  out_length = 0;
5250  buf = pt_append_nulstring (parser, buf, "'");
5251  if (str)
5252  {
5253  for (i = 0; i < str_length; i++)
5254  {
5255  if (str[i] == '\'')
5256  {
5257  buf = pt_append_bytes (parser, buf, "'", 1);
5258  out_length++;
5259  }
5260  buf = pt_append_bytes (parser, buf, &str[i], 1);
5261  out_length++;
5262 
5263  if (out_length >= MAX_STRING_SEGMENT_LENGTH)
5264  {
5265  buf = pt_append_nulstring (parser, buf, "' '");
5266  out_length = 0;
5267  }
5268  }
5269  }
5270  buf = pt_append_nulstring (parser, buf, "'");
5271 
5272  return buf;
5273 }
5274 
5275 /*
5276  * pt_append_string_prefix () - Print out any necessary string prefix modifier
5277  * (e.g., 'B' or 'X')
5278  * return:
5279  * parser(in):
5280  * buf(out):
5281  * value(in):
5282  */
5283 static PARSER_VARCHAR *
5284 pt_append_string_prefix (const PARSER_CONTEXT * parser, PARSER_VARCHAR * buf, const PT_NODE * value)
5285 {
5286  char prefix[2];
5287  if (value->info.value.string_type != ' ')
5288  {
5289  prefix[0] = value->info.value.string_type;
5290  prefix[1] = '\0';
5291  buf = pt_append_nulstring (parser, buf, prefix);
5292  }
5293  return buf;
5294 }
5295 
5296 /*
5297  * pt_currency_to_db () - return DB_CURRENCY equivalent of PT_CURRENCY t
5298  * return:
5299  * t(in):
5300  */
5301 static DB_CURRENCY
5303 {
5304  switch (t)
5305  {
5306  case PT_CURRENCY_DOLLAR:
5307  return DB_CURRENCY_DOLLAR;
5308 
5309  case PT_CURRENCY_YEN:
5310  return DB_CURRENCY_YEN;
5311 
5314 
5315  case PT_CURRENCY_WON:
5316  return DB_CURRENCY_WON;
5317 
5318  case PT_CURRENCY_TL:
5319  return DB_CURRENCY_TL;
5320 
5323 
5326 
5328  return DB_CURRENCY_INDIAN_RUPEE;
5329 
5332 
5335 
5338 
5341 
5343  return DB_CURRENCY_ROMANIAN_LEU;
5344 
5345  case PT_CURRENCY_EURO:
5346  return DB_CURRENCY_EURO;
5347 
5349  return DB_CURRENCY_SWISS_FRANC;
5350 
5352  return DB_CURRENCY_DANISH_KRONE;
5353 
5356 
5359 
5362 
5364  return DB_CURRENCY_CZECH_KORUNA;
5365 
5367  return DB_CURRENCY_POLISH_ZLOTY;
5368 
5371 
5374 
5377 
5378  default:
5379  return DB_CURRENCY_NULL;
5380  }
5381 }
5382 
5383 /*
5384  * pt_show_event_type () -
5385  * return:
5386  * p(in):
5387  */
5388 static const char *
5390 {
5391  switch (p)
5392  {
5393  case PT_EV_INSERT:
5394  return " insert ";
5395  case PT_EV_STMT_INSERT:
5396  return " statement insert ";
5397  case PT_EV_DELETE:
5398  return " delete ";
5399  case PT_EV_STMT_DELETE:
5400  return " statement delete ";
5401  case PT_EV_UPDATE:
5402  return " update ";
5403  case PT_EV_STMT_UPDATE:
5404  return " statement update ";
5405  case PT_EV_COMMIT:
5406  return " commit ";
5407  case PT_EV_ROLLBACK:
5408  return " rollback ";
5409  default:
5410  return " unknown trigger event type ";
5411  }
5412 }
5413 
5414 /*
5415  * pt_apply_alter () -
5416  * return:
5417  * parser(in):
5418  * p(in):
5419  * g(in):
5420  * arg(in):
5421  */
5422 static PT_NODE *
5423 pt_apply_alter (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
5424 {
5425  PT_APPLY_WALK (parser, p->info.alter.entity_name, arg);
5426  PT_APPLY_WALK (parser, p->info.alter.super.sup_class_list, arg);
5427  PT_APPLY_WALK (parser, p->info.alter.super.resolution_list, arg);
5428 
5429  switch (p->info.alter.code)
5430  {
5431  default:
5432  break;
5433  case PT_ADD_QUERY:
5434  case PT_DROP_QUERY:
5435  case PT_MODIFY_QUERY:
5436  case PT_RESET_QUERY:
5437  PT_APPLY_WALK (parser, p->info.alter.alter_clause.query.query, arg);
5438  PT_APPLY_WALK (parser, p->info.alter.alter_clause.query.query_no_list, arg);
5439  PT_APPLY_WALK (parser, p->info.alter.alter_clause.query.attr_def_list, arg);
5440  break;
5441  case PT_ADD_ATTR_MTHD:
5442  case PT_DROP_ATTR_MTHD:
5443  case PT_MODIFY_ATTR_MTHD:
5444  case PT_CHANGE_ATTR:
5445  PT_APPLY_WALK (parser, p->info.alter.alter_clause.attr_mthd.attr_def_list, arg);
5446  PT_APPLY_WALK (parser, p->info.alter.alter_clause.attr_mthd.attr_old_name, arg);
5447  PT_APPLY_WALK (parser, p->info.alter.alter_clause.attr_mthd.attr_mthd_name_list, arg);
5448  PT_APPLY_WALK (parser, p->info.alter.alter_clause.attr_mthd.mthd_def_list, arg);
5449  PT_APPLY_WALK (parser, p->info.alter.alter_clause.attr_mthd.mthd_file_list, arg);
5450  PT_APPLY_WALK (parser, p->info.alter.alter_clause.attr_mthd.mthd_name_list, arg);
5451  break;
5452  case PT_RENAME_ATTR_MTHD:
5453  case PT_RENAME_ENTITY:
5454  PT_APPLY_WALK (parser, p->info.alter.alter_clause.rename.old_name, arg);
5455  PT_APPLY_WALK (parser, p->info.alter.alter_clause.rename.new_name, arg);
5456  PT_APPLY_WALK (parser, p->info.alter.alter_clause.rename.mthd_name, arg);
5457  break;
5458 #if defined (ENABLE_RENAME_CONSTRAINT)
5459  case PT_RENAME_CONSTRAINT:
5460  case PT_RENAME_INDEX:
5461  PT_APPLY_WALK (parser, p->info.alter.alter_clause.rename.old_name, arg);
5462  PT_APPLY_WALK (parser, p->info.alter.alter_clause.rename.new_name, arg);
5463  break;
5464 #endif
5465  case PT_MODIFY_DEFAULT:
5466  case PT_ALTER_DEFAULT:
5467  PT_APPLY_WALK (parser, p->info.alter.alter_clause.ch_attr_def.attr_name_list, arg);
5468  PT_APPLY_WALK (parser, p->info.alter.alter_clause.ch_attr_def.data_default_list, arg);
5469  break;
5470  /* TODO merge all the *_PARTITION cases below into a single case if it is safe to do so. */
5471  case PT_APPLY_PARTITION:
5472  PT_APPLY_WALK (parser, p->info.alter.alter_clause.partition.info, arg);
5473  break;
5474  case PT_DROP_PARTITION:
5475  case PT_ANALYZE_PARTITION:
5476  case PT_PROMOTE_PARTITION:
5477  PT_APPLY_WALK (parser, p->info.alter.alter_clause.partition.name_list, arg);
5478  break;
5479  case PT_REMOVE_PARTITION:
5480  break;
5481  case PT_ADD_PARTITION:
5482  PT_APPLY_WALK (parser, p->info.alter.alter_clause.partition.parts, arg);
5483  break;
5484  case PT_ADD_HASHPARTITION:
5485  case PT_COALESCE_PARTITION:
5486  PT_APPLY_WALK (parser, p->info.alter.alter_clause.partition.size, arg);
5487  break;
5488  case PT_REORG_PARTITION:
5489  PT_APPLY_WALK (parser, p->info.alter.alter_clause.partition.name_list, arg);
5490  PT_APPLY_WALK (parser, p->info.alter.alter_clause.partition.parts, arg);
5491  break;
5492  }
5493  PT_APPLY_WALK (parser, p->info.alter.constraint_list, arg);
5494  PT_APPLY_WALK (parser, p->info.alter.create_index, arg);
5495  PT_APPLY_WALK (parser, p->info.alter.internal_stmts, arg);
5496  return p;
5497 }
5498 
5499 /*
5500  * pt_print_alter_one_clause () -
5501  * return:
5502  * parser(in):
5503  * p(in):
5504  */
5505 
5506 static PARSER_VARCHAR *
5508 {
5509  PARSER_VARCHAR *q = NULL, *r1 = NULL, *r2 = NULL;
5510  PT_NODE *names = NULL, *defaults = NULL, *attrs = NULL;
5511  bool close_parenthesis = false;
5512  unsigned int save_custom;
5513 
5514  switch (p->info.alter.code)
5515  {
5516  default:
5517  break;
5518  case PT_CHANGE_OWNER:
5519  r1 = pt_print_bytes_l (parser, p->info.alter.alter_clause.user.user_name);
5520  q = pt_append_nulstring (parser, q, " owner to ");
5521  q = pt_append_varchar (parser, q, r1);
5522  break;
5524  r1 = pt_print_bytes (parser, p->info.alter.alter_clause.comment.tbl_comment);
5525  q = pt_append_nulstring (parser, q, " comment = ");
5526  q = pt_append_varchar (parser, q, r1);
5527  break;
5528  case PT_CHANGE_COLLATION:
5529  if (p->info.alter.alter_clause.collation.charset != -1)
5530  {
5531  q = pt_append_nulstring (parser, q, " charset ");
5533  }
5534  if (p->info.alter.alter_clause.collation.collation_id != -1)
5535  {
5536  q = pt_append_nulstring (parser, q, " collate ");
5537  q =
5538  pt_append_nulstring (parser, q,
5540  }
5541  break;
5542  case PT_ADD_QUERY:
5543  r1 = pt_print_bytes_l (parser, p->info.alter.alter_clause.query.query);
5544  q = pt_append_nulstring (parser, q, " add query ");
5545  q = pt_append_varchar (parser, q, r1);
5546 
5547  if (p->info.alter.alter_clause.query.view_comment != NULL)
5548  {
5549  r1 = pt_print_bytes (parser, p->info.alter.alter_clause.query.view_comment);
5550  q = pt_append_nulstring (parser, q, " comment ");
5551  q = pt_append_varchar (parser, q, r1);
5552  }
5553  break;
5554  case PT_DROP_QUERY:
5555  r1 = pt_print_bytes_l (parser, p->info.alter.alter_clause.query.query_no_list);
5556  q = pt_append_nulstring (parser, q, " drop query ");
5557  q = pt_append_varchar (parser, q, r1);
5558  break;
5559  case PT_MODIFY_QUERY:
5560  r1 = pt_print_bytes_l (parser, p->info.alter.alter_clause.query.query_no_list);
5561  r2 = pt_print_bytes_l (parser, p->info.alter.alter_clause.query.query);
5562  q = pt_append_nulstring (parser, q, " change query ");
5563  q = pt_append_varchar (parser, q, r1);
5564  q = pt_append_varchar (parser, q, r2);
5565 
5566  if (p->info.alter.alter_clause.query.view_comment != NULL)
5567  {
5568  r1 = pt_print_bytes (parser, p->info.alter.alter_clause.query.view_comment);
5569  q = pt_append_nulstring (parser, q, " comment ");
5570  q = pt_append_varchar (parser, q, r1);
5571  }
5572  break;
5573  case PT_RESET_QUERY:
5574  /* alias print should be enable for "alter view ..." e.g. When PT_PRINT_ALIAS disabled "alter view w as select
5575  * sqrt(2) as root;" is printed as "alter view w as select sqrt(2)" which should be "alter view w as select
5576  * sqrt(2) as root" */
5577  save_custom = parser->custom_print;
5578  parser->custom_print |= PT_PRINT_ALIAS;
5579 
5580  r1 = pt_print_bytes (parser, p->info.alter.alter_clause.query.query);
5581  q = pt_append_nulstring (parser, q, " as ");
5582  q = pt_append_varchar (parser, q, r1);
5583 
5584  parser->custom_print = save_custom;
5585 
5586  if (p->info.alter.alter_clause.query.view_comment != NULL)
5587  {
5588  r1 = pt_print_bytes (parser, p->info.alter.alter_clause.query.view_comment);
5589  q = pt_append_nulstring (parser, q, " comment ");
5590  q = pt_append_varchar (parser, q, r1);
5591  }
5592 
5593  break;
5594  case PT_ADD_ATTR_MTHD:
5595  q = pt_append_nulstring (parser, q, " add ");
5596  close_parenthesis = false;
5597  attrs = p->info.alter.alter_clause.attr_mthd.attr_def_list;
5598  if (attrs)
5599  {
5600  if (attrs->info.attr_def.attr_type == PT_META_ATTR)
5601  {
5602  q = pt_append_nulstring (parser, q, "class ");
5604  }
5605  r1 = pt_print_bytes_l (parser, p->info.alter.alter_clause.attr_mthd.attr_def_list);
5606  q = pt_append_nulstring (parser, q, "attribute (");
5607  close_parenthesis = true;
5608  q = pt_append_varchar (parser, q, r1);
5609  if (attrs->info.attr_def.attr_type == PT_META_ATTR)
5610  {
5611  parser->custom_print = (parser->custom_print & ~PT_SUPPRESS_META_ATTR_CLASS);
5612  }
5613  }
5614 
5615  if (p->info.alter.constraint_list)
5616  {
5617  r1 = pt_print_bytes_l (parser, p->info.alter.constraint_list);
5618  if (r1)
5619  {
5620  if (close_parenthesis)
5621  {
5622  q = pt_append_nulstring (parser, q, ", ");
5623  }
5624  else
5625  {
5626  q = pt_append_nulstring (parser, q, "(");
5627  close_parenthesis = true;
5628  }
5629  q = pt_append_varchar (parser, q, r1);
5630  }
5631  }
5632 
5633  if (close_parenthesis)
5634  {
5635  q = pt_append_nulstring (parser, q, ")");
5636  }
5637 
5638  if (p->info.alter.alter_clause.attr_mthd.mthd_def_list)
5639  {
5640  r1 = pt_print_bytes_l (parser, p->info.alter.alter_clause.attr_mthd.mthd_def_list);
5641  q = pt_append_nulstring (parser, q, " method ");
5642  q = pt_append_varchar (parser, q, r1);
5643  }
5644  if (p->info.alter.alter_clause.attr_mthd.mthd_file_list)
5645  {
5646  r2 = pt_print_bytes_l (parser, p->info.alter.alter_clause.attr_mthd.mthd_file_list);
5647  q = pt_append_nulstring (parser, q, " file ");
5648  q = pt_append_varchar (parser, q, r2);
5649  }
5650  break;
5651  case PT_DROP_ATTR_MTHD:
5652  q = pt_append_nulstring (parser, q, " drop ");
5653  names = p->info.alter.alter_clause.attr_mthd.attr_mthd_name_list;
5654  while (names)
5655  {
5656  r1 = pt_print_bytes (parser, names);
5657  if (names->info.name.meta_class == PT_META_ATTR)
5658  {
5659  q = pt_append_nulstring (parser, q, " class ");
5660  }
5661  q = pt_append_varchar (parser, q, r1);
5662  names = names->next;
5663  if (names != NULL)
5664  {
5665  q = pt_append_nulstring (parser, q, ", ");
5666  }
5667  }
5668  names = p->info.alter.alter_clause.attr_mthd.mthd_file_list;
5669  if (names)
5670  {
5671  r2 = pt_print_bytes_l (parser, names);
5672  q = pt_append_nulstring (parser, q, " file ");
5673  q = pt_append_varchar (parser, q, r2);
5674  }
5675  break;
5676  case PT_CHANGE_ATTR:
5677  {
5678  /* only one attibute per alter clause should be allowed : <attr_old_name> and <attr_def_list> should have at
5679  * most one element */
5680  if (p->info.alter.alter_clause.attr_mthd.attr_old_name != NULL)
5681  {
5682  q = pt_append_nulstring (parser, q, " change");
5683  names = p->info.alter.alter_clause.attr_mthd.attr_old_name;
5684  }
5685  else
5686  {
5687  q = pt_append_nulstring (parser, q, " modify");
5688  names = NULL;
5689  }
5690 
5691  attrs = p->info.alter.alter_clause.attr_mthd.attr_def_list;
5692  assert (attrs != NULL);
5693  if (attrs->info.attr_def.attr_type == PT_META_ATTR)
5694  {
5695  q = pt_append_nulstring (parser, q, " class");
5696  }
5697  q = pt_append_nulstring (parser, q, " attribute ");
5698 
5699  if (names != NULL)
5700  {
5701  assert (names->next == NULL);
5702  r2 = pt_print_bytes (parser, names);
5703  q = pt_append_varchar (parser, q, r2);
5704  q = pt_append_nulstring (parser, q, " ");
5705  }
5706 
5707  assert (attrs->next == NULL);
5708 
5709  /* ordering is last in <CHANGE> syntax context, suppress in this print */
5710  if (attrs->info.attr_def.ordering_info != NULL)
5711  {
5713  }
5714 
5715  if (attrs->info.attr_def.attr_type == PT_META_ATTR)
5716  {
5718  }
5719 
5720  assert (attrs->info.attr_def.attr_type != PT_CLASS);
5721  r1 = pt_print_bytes (parser, attrs);
5722  q = pt_append_varchar (parser, q, r1);
5723  q = pt_append_nulstring (parser, q, " ");
5724 
5725  if (attrs->info.attr_def.ordering_info != NULL)
5726  {
5727  parser->custom_print &= ~PT_SUPPRESS_ORDERING;
5728  }
5729 
5730  if (attrs->info.attr_def.attr_type == PT_META_ATTR)
5731  {
5733  }
5734 
5735  if (p->info.alter.constraint_list != NULL)
5736  {
5737  PT_NODE *c_node = p->info.alter.constraint_list;
5738 
5739  r1 = pt_print_col_def_constraint (parser, c_node);
5740 
5741  while (c_node->next != NULL)
5742  { /* print in the original order ... */
5743  c_node = c_node->next;
5744  r2 = pt_print_col_def_constraint (parser, c_node);
5745  if (r2 != NULL)
5746  {
5747  r1 = pt_append_varchar (parser, r1, r2);
5748  }
5749  }
5750  if (r1)
5751  {
5752  assert (attrs != NULL);
5753  q = pt_append_varchar (parser, q, r1);
5754  q = pt_append_nulstring (parser, q, " ");
5755  }
5756  }
5757 
5758  if (attrs->info.attr_def.ordering_info != NULL)
5759  {
5760  r1 = pt_print_bytes (parser, attrs->info.attr_def.ordering_info);
5761  q = pt_append_varchar (parser, q, r1);
5762  q = pt_append_nulstring (parser, q, " ");
5763  }
5764  }
5765  break;
5766 
5767  case PT_MODIFY_ATTR_MTHD:
5768  q = pt_append_nulstring (parser, q, " change ");
5769  attrs = p->info.alter.alter_clause.attr_mthd.attr_def_list;
5770  if (attrs)
5771  {
5772  if (attrs->info.attr_def.attr_type == PT_META_ATTR)
5773  {
5774  q = pt_append_nulstring (parser, q, "class ");
5776  }
5777  r1 = pt_print_bytes_l (parser, p->info.alter.alter_clause.attr_mthd.attr_def_list);
5778  q = pt_append_nulstring (parser, q, "attribute (");
5779  q = pt_append_varchar (parser, q, r1);
5780  if (attrs->info.attr_def.attr_type == PT_META_ATTR)
5781  {
5782  parser->custom_print = (parser->custom_print & ~PT_SUPPRESS_META_ATTR_CLASS);
5783  }
5784  }
5785 
5786  if (p->info.alter.constraint_list)
5787  {
5788  r1 = pt_print_bytes_l (parser, p->info.alter.constraint_list);
5789  if (r1)
5790  {
5791  if (attrs)
5792  {
5793  q = pt_append_nulstring (parser, q, ", ");
5794  }
5795  else
5796  {
5797  q = pt_append_nulstring (parser, q, "(");
5798  }
5799  q = pt_append_varchar (parser, q, r1);
5800  }
5801  }
5802  if (p->info.alter.constraint_list || attrs)
5803  {
5804  q = pt_append_nulstring (parser, q, ")");
5805  }
5806 
5807  if (p->info.alter.alter_clause.attr_mthd.mthd_def_list)
5808  {
5809  r2 = pt_print_bytes_l (parser, p->info.alter.alter_clause.attr_mthd.mthd_def_list);
5810  q = pt_append_nulstring (parser, q, " method ");
5811  q = pt_append_varchar (parser, q, r2);
5812  }
5813  break;
5814  case PT_RENAME_ENTITY:
5815  q = pt_append_nulstring (parser, q, " rename to ");
5816  r1 = pt_print_bytes (parser, p->info.alter.alter_clause.rename.new_name);
5817  q = pt_append_varchar (parser, q, r1);
5818  break;
5819 
5820 #if defined (ENABLE_RENAME_CONSTRAINT)
5821  case PT_RENAME_CONSTRAINT:
5822  case PT_RENAME_INDEX:
5823  q = pt_append_nulstring (parser, q, " rename ");
5824  q = pt_append_nulstring (parser, q, pt_show_misc_type (p->info.alter.alter_clause.rename.element_type));
5825  q = pt_append_nulstring (parser, q, " ");
5826 
5827  switch (p->info.alter.alter_clause.rename.element_type)
5828  {
5829  default:
5830  break;
5831  case PT_CONSTRAINT_NAME:
5832  case PT_INDEX_NAME:
5833  r1 = pt_print_bytes (parser, p->info.alter.alter_clause.rename.old_name);
5834  r2 = pt_print_bytes (parser, p->info.alter.alter_clause.rename.new_name);
5835  q = pt_append_varchar (parser, q, r1);
5836  q = pt_append_nulstring (parser, q, " to ");
5837  q = pt_append_varchar (parser, q, r2);
5838  break;
5839  }
5840  break;
5841 #endif
5842 
5843  case PT_RENAME_ATTR_MTHD:
5844  q = pt_append_nulstring (parser, q, " rename ");
5845  q = pt_append_nulstring (parser, q, pt_show_misc_type (p->info.alter.alter_clause.rename.element_type));
5846  q = pt_append_nulstring (parser, q, " ");
5847 
5848  switch (p->info.alter.alter_clause.rename.element_type)
5849  {
5850  default:
5851  break;
5852  case PT_ATTRIBUTE:
5853  case PT_METHOD:
5854  r1 = pt_print_bytes (parser, p->info.alter.alter_clause.rename.old_name);
5856  q = pt_append_nulstring (parser, q, " ");
5857  q = pt_append_varchar (parser, q, r1);
5858  break;
5859  case PT_FUNCTION_RENAME:
5860  r1 = pt_print_bytes (parser, p->info.alter.alter_clause.rename.old_name);
5861  r2 = pt_print_bytes (parser, p->info.alter.alter_clause.rename.mthd_name);
5862  q = pt_append_varchar (parser, q, r1);
5863  q = pt_append_nulstring (parser, q, " of ");
5865  q = pt_append_nulstring (parser, q, " ");
5866  q = pt_append_varchar (parser, q, r2);
5867  /* FALLTHRU */
5868  case PT_FILE_RENAME:
5869  r1 = pt_print_bytes (parser, p->info.alter.alter_clause.rename.old_name);
5870  q = pt_append_varchar (parser, q, r1);
5871  break;
5872  }
5873  r1 = pt_print_bytes (parser, p->info.alter.alter_clause.rename.new_name);
5874  q = pt_append_nulstring (parser, q, " as ");
5875  q = pt_append_varchar (parser, q, r1);
5876  break;
5877  case PT_MODIFY_DEFAULT:
5878  q = pt_append_nulstring (parser, q, " change ");
5879  names = p->info.alter.alter_clause.ch_attr_def.attr_name_list;
5880  defaults = p->info.alter.alter_clause.ch_attr_def.data_default_list;
5881  while (names && defaults)
5882  {
5883  r1 = pt_print_bytes (parser, names);
5884  r2 = pt_print_bytes (parser, defaults);
5885  if (names->info.name.meta_class == PT_META_ATTR)
5886  {
5887  q = pt_append_nulstring (parser, q, "class ");
5888  }
5889  q = pt_append_varchar (parser, q, r1);
5890  q = pt_append_nulstring (parser, q, " default ");
5891  q = pt_append_varchar (parser, q, r2);
5892  names = names->next;
5893  defaults = defaults->next;
5894  if (names != NULL)
5895  {
5896  q = pt_append_nulstring (parser, q, ", ");
5897  }
5898  }
5899  break;
5900  case PT_ALTER_DEFAULT:
5901  q = pt_append_nulstring (parser, q, " alter ");
5902  names = p->info.alter.alter_clause.ch_attr_def.attr_name_list;
5903  defaults = p->info.alter.alter_clause.ch_attr_def.data_default_list;
5904  assert (names->next == NULL && defaults->next == NULL);
5905  if (names->info.name.meta_class == PT_META_ATTR)
5906  {
5907  q = pt_append_nulstring (parser, q, "class attribute ");
5908  }
5909  else
5910  {
5911  q = pt_append_nulstring (parser, q, "column ");
5912  }
5913  r1 = pt_print_bytes (parser, names);
5914  r2 = pt_print_bytes (parser, defaults);
5915  q = pt_append_varchar (parser, q, r1);
5916  q = pt_append_nulstring (parser, q, " set ");
5917  q = pt_append_varchar (parser, q, r2);
5918  break;
5919  case PT_ADD_SUPCLASS:
5920  r1 = pt_print_bytes_l (parser, p->info.alter.super.sup_class_list);
5921  q = pt_append_nulstring (parser, q, " add superclass ");
5922  q = pt_append_varchar (parser, q, r1);
5924  {
5925  r2 = pt_print_bytes_l (parser, p->info.alter.super.resolution_list);
5926  q = pt_append_nulstring (parser, q, " inherit ");
5927  q = pt_append_varchar (parser, q, r2);
5928  }
5929  break;
5930  case PT_DROP_SUPCLASS:
5931  if (p->info.alter.super.sup_class_list)
5932  {
5933  r1 = pt_print_bytes_l (parser, p->info.alter.super.sup_class_list);
5934  q = pt_append_nulstring (parser, q, " drop superclass ");
5935  q = pt_append_varchar (parser, q, r1);
5936  }
5937  break;
5938  case PT_DROP_RESOLUTION:
5940  {
5941  r1 = pt_print_bytes_l (parser, p->info.alter.super.resolution_list);
5942  q = pt_append_nulstring (parser, q, " drop inherit ");
5943  q = pt_append_varchar (parser, q, r1);
5944  }
5945  break;
5946  case PT_RENAME_RESOLUTION:
5948  {
5949  r1 = pt_print_bytes_l (parser, p->info.alter.super.resolution_list);
5950  q = pt_append_nulstring (parser, q, " inherit ");
5951  q = pt_append_varchar (parser, q, r1);
5952  }
5953  break;
5954  case PT_DROP_CONSTRAINT:
5955  if (p->info.alter.constraint_list)
5956  {
5957  r1 = pt_print_bytes_l (parser, p->info.alter.constraint_list);
5958  q = pt_append_nulstring (parser, q, " drop constraint ");
5959  q = pt_append_varchar (parser, q, r1);
5960  }
5961  break;
5962  case PT_DROP_INDEX_CLAUSE:
5963  if (p->info.alter.constraint_list)
5964  {
5965  r1 = pt_print_bytes_l (parser, p->info.alter.constraint_list);
5966  q = pt_append_nulstring (parser, q, " drop ");
5967  if (p->info.alter.alter_clause.index.reverse)
5968  {
5969  q = pt_append_nulstring (parser, q, "reverse ");
5970  }
5971  if (p->info.alter.alter_clause.index.unique)
5972  {
5973  q = pt_append_nulstring (parser, q, "unique ");
5974  }
5975  q = pt_append_nulstring (parser, q, "index ");
5976  q = pt_append_varchar (parser, q, r1);
5977  }
5978  break;
5980  q = pt_append_nulstring (parser, q, " drop primary key");
5981  break;
5982  case PT_DROP_FK_CLAUSE:
5983  if (p->info.alter.constraint_list)
5984  {
5985  r1 = pt_print_bytes_l (parser, p->info.alter.constraint_list);
5986  q = pt_append_nulstring (parser, q, " drop foreign key ");
5987  q = pt_append_varchar (parser, q, r1);
5988  }
5989  break;
5990  case PT_APPLY_PARTITION:
5991  if (p->info.alter.alter_clause.partition.info)
5992  {
5993  save_custom = parser->custom_print;
5995 
5996  r1 = pt_print_bytes_l (parser, p->info.alter.alter_clause.partition.info);
5997  q = pt_append_nulstring (parser, q, " partition by ");
5998  q = pt_append_varchar (parser, q, r1);
5999 
6000  parser->custom_print = save_custom;
6001  }
6002  break;
6003  case PT_REMOVE_PARTITION:
6004  q = pt_append_nulstring (parser, q, " remove partitioning ");
6005  break;
6006  case PT_REORG_PARTITION:
6007  if (p->info.alter.alter_clause.partition.name_list)
6008  {
6009  save_custom = parser->custom_print;
6011 
6012  r1 = pt_print_bytes_l (parser, p->info.alter.alter_clause.partition.name_list);
6013  q = pt_append_nulstring (parser, q, " reorganize partition ");
6014  q = pt_append_varchar (parser, q, r1);
6015  if (p->info.alter.alter_clause.partition.parts)
6016  {
6017  r2 = pt_print_bytes_l (parser, p->info.alter.alter_clause.partition.parts);
6018  q = pt_append_nulstring (parser, q, " into ( ");
6019  q = pt_append_varchar (parser, q, r2);
6020  q = pt_append_nulstring (parser, q, " ) ");
6021  }
6022 
6023  parser->custom_print = save_custom;
6024  }
6025  break;
6026  case PT_ANALYZE_PARTITION:
6027  q = pt_append_nulstring (parser, q, " analyze partition ");
6028  if (p->info.alter.alter_clause.partition.name_list)
6029  {
6030  r1 = pt_print_bytes_l (parser, p->info.alter.alter_clause.partition.name_list);
6031  q = pt_append_varchar (parser, q, r1);
6032  }
6033  break;
6034  case PT_COALESCE_PARTITION:
6035  r1 = pt_print_bytes (parser, p->info.alter.alter_clause.partition.size);
6036  q = pt_append_nulstring (parser, q, " coalesce partition ");
6037  q = pt_append_varchar (parser, q, r1);
6038  break;
6039  case PT_DROP_PARTITION:
6040  if (p->info.alter.alter_clause.partition.name_list)
6041  {
6042  r1 = pt_print_bytes_l (parser, p->info.alter.alter_clause.partition.name_list);
6043  q = pt_append_nulstring (parser, q, " drop partition ");
6044  q = pt_append_varchar (parser, q, r1);
6045  }
6046  break;
6047  case PT_ADD_PARTITION:
6048  r1 = pt_print_bytes_l (parser, p->info.alter.alter_clause.partition.parts);
6049  q = pt_append_nulstring (parser, q, " add partition ( ");
6050  q = pt_append_varchar (parser, q, r1);
6051  q = pt_append_nulstring (parser, q, " ) ");
6052  break;
6053  case PT_ADD_HASHPARTITION:
6054  r1 = pt_print_bytes (parser, p->info.alter.alter_clause.partition.size);
6055  q = pt_append_nulstring (parser, q, " add partition partitions ");
6056  q = pt_append_varchar (parser, q, r1);
6057  break;
6058  case PT_PROMOTE_PARTITION:
6059  if (p->info.alter.alter_clause.partition.name_list)
6060  {
6061  r1 = pt_print_bytes_l (parser, p->info.alter.alter_clause.partition.name_list);
6062  q = pt_append_nulstring (parser, q, " promote partition ");
6063  q = pt_append_varchar (parser, q, r1);
6064  }
6065  break;
6067  r1 = pt_print_bytes (parser, p->info.alter.alter_clause.auto_increment.start_value);
6068  q = pt_append_nulstring (parser, q, " auto_increment = ");
6069  q = pt_append_varchar (parser, q, r1);
6070  break;
6071  case PT_ADD_INDEX_CLAUSE:
6072  q = pt_append_nulstring (parser, q, " add ");
6073  save_custom = parser->custom_print;
6074  parser->custom_print |= PT_SUPPRESS_INDEX;
6075  r1 = pt_print_bytes_l (parser, p->info.alter.create_index);
6076  parser->custom_print = save_custom;
6077 
6078  if (r1)
6079  {
6080  q = pt_append_nulstring (parser, q, "(");
6081  q = pt_append_varchar (parser, q, r1);
6082  q = pt_append_nulstring (parser, q, ")");
6083  }
6084  break;
6085  }
6088  {
6089  r1 = pt_print_bytes_l (parser, p->info.alter.super.resolution_list);
6090  q = pt_append_nulstring (parser, q, " inherit ");
6091  q = pt_append_varchar (parser, q, r1);
6092  }
6093  return q;
6094 }
6095 
6096 /*
6097  * pt_print_alter () -
6098  * return:
6099  * parser(in):
6100  * p(in):
6101  */
6102 static PARSER_VARCHAR *
6104 {
6105  PARSER_VARCHAR *q = NULL, *r1 = NULL;
6106  PT_NODE *crt_clause = NULL;
6107 
6108  /* ALTER VCLASS XYZ ... */
6109  r1 = pt_print_bytes (parser, p->info.alter.entity_name);
6110  q = pt_append_nulstring (parser, q, "alter ");
6111  if (p->info.alter.hint != PT_HINT_NONE)
6112  {
6113  q = pt_append_nulstring (parser, q, "/*+ ");
6115  {
6116  q = pt_append_nulstring (parser, q, "SKIP_UPDATE_NULL");
6117  }
6118  q = pt_append_nulstring (parser, q, " */ ");
6119  }
6121  q = pt_append_nulstring (parser, q, " ");
6122  q = pt_append_varchar (parser, q, r1);
6123 
6124  for (crt_clause = p; crt_clause != NULL; crt_clause = crt_clause->next)
6125  {
6126  r1 = pt_print_alter_one_clause (parser, crt_clause);
6127  q = pt_append_varchar (parser, q, r1);
6128  if (crt_clause->next != NULL)
6129  {
6130  q = pt_append_nulstring (parser, q, ", ");
6131  }
6132  }
6133  return q;
6134 }
6135 
6136 /* ALTER_INDEX */
6137 /*
6138  * pt_apply_alter_index () -
6139  * return:
6140  * parser(in):
6141  * p(in):
6142  * g(in):
6143  * arg(in):
6144  */
6145 static PT_NODE *
6146 pt_apply_alter_index (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
6147 {
6148  PT_APPLY_WALK (parser, p->info.index.indexed_class, arg);
6149  PT_APPLY_WALK (parser, p->info.index.column_names, arg);
6150  PT_APPLY_WALK (parser, p->info.index.where, arg);
6151  PT_APPLY_WALK (parser, p->info.index.function_expr, arg);
6152 
6153  return p;
6154 }
6155 
6156 /*
6157  * pt_print_alter_index () -
6158  * return:
6159  * parser(in):
6160  * p(in):
6161  */
6162 static PARSER_VARCHAR *
6164 {
6165  PARSER_VARCHAR *b = 0, *r1, *r2, *r3, *comment;
6166  unsigned int saved_cp = parser->custom_print;
6167 
6169 
6170  r1 = pt_print_bytes (parser, p->info.index.indexed_class);
6171  r2 = pt_print_index_columns (parser, p);
6172 
6173  parser->custom_print = saved_cp;
6174 
6175  b = pt_append_nulstring (parser, b, "alter");
6176  if (p->info.index.reverse)
6177  {
6178  b = pt_append_nulstring (parser, b, " reverse");
6179  }
6180  if (p->info.index.unique)
6181  {
6182  b = pt_append_nulstring (parser, b, " unique");
6183  }
6184  b = pt_append_nulstring (parser, b, " index ");
6185  if (p->info.index.index_name)
6186  {
6187  const char *index_name = p->info.index.index_name->info.name.original;
6188  b = pt_append_bytes (parser, b, index_name, strlen (index_name));
6189  }
6190 
6191  assert (r1 != NULL);
6192  b = pt_append_nulstring (parser, b, " on ");
6193  b = pt_append_varchar (parser, b, r1);
6194 
6195  if (r2 != NULL)
6196  {
6197  b = pt_append_nulstring (parser, b, " (");
6198  b = pt_append_varchar (parser, b, r2);
6199  b = pt_append_nulstring (parser, b, ")");
6200  }
6201 
6202  b = pt_append_nulstring (parser, b, " ");
6203 
6204  if (p->info.index.code == PT_REBUILD_INDEX)
6205  {
6206  if (p->info.index.where)
6207  {
6208  r3 = pt_print_and_list (parser, p->info.index.where);
6209  b = pt_append_nulstring (parser, b, " where ");
6210  b = pt_append_varchar (parser, b, r3);
6211  }
6212  }
6213 #if defined (ENABLE_RENAME_CONSTRAINT)
6214  else if (p->info.index.code == PT_RENAME_INDEX)
6215  {
6216  b = pt_append_nulstring (parser, b, "rename to ");
6217 
6218  if (p->info.index.new_name)
6219  {
6220  const char *new_name = p->info.index.new_name->info.name.original;
6221  b = pt_append_bytes (parser, b, new_name, strlen (new_name));
6222  }
6223  }
6224 #endif
6225 
6226  if (p->info.index.comment != NULL)
6227  {
6228  comment = pt_print_bytes (parser, p->info.index.comment);
6229  b = pt_append_nulstring (parser, b, " comment ");
6230  b = pt_append_varchar (parser, b, comment);
6231  b = pt_append_nulstring (parser, b, " ");
6232  }
6233 
6235  {
6236  b = pt_append_nulstring (parser, b, " INVISIBLE ");
6237  }
6238  else if (p->info.index.index_status == SM_NORMAL_INDEX)
6239  {
6240  b = pt_append_nulstring (parser, b, " VISIBLE ");
6241  }
6242 
6243  if (p->info.index.code == PT_REBUILD_INDEX)
6244  {
6245  b = pt_append_nulstring (parser, b, "rebuild");
6246  }
6247 
6248  return b;
6249 }
6250 
6251 /* ALTER_USER */
6252 /*
6253  * pt_apply_alter_user () -
6254  * return:
6255  * parser(in):
6256  * p(in):
6257  * g(in):
6258  * arg(in):
6259  */
6260 static PT_NODE *
6261 pt_apply_alter_user (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
6262 {
6263  PT_APPLY_WALK (parser, p->info.alter_user.user_name, arg);
6264  PT_APPLY_WALK (parser, p->info.alter_user.password, arg);
6265  return p;
6266 }
6267 
6268 /*
6269  * pt_print_alter_user () -
6270  * return:
6271  * parser(in):
6272  * p(in):
6273  */
6274 static PARSER_VARCHAR *
6276 {
6277  PARSER_VARCHAR *b = 0, *r1;
6278 
6279  r1 = pt_print_bytes (parser, p->info.alter_user.user_name);
6280  b = pt_append_nulstring (parser, b, "alter user ");
6281  b = pt_append_varchar (parser, b, r1);
6282 
6283  if (p->info.alter_user.password != NULL)
6284  {
6285  r1 = pt_print_bytes (parser, p->info.alter_user.password);
6286  b = pt_append_nulstring (parser, b, " password ");
6287  b = pt_append_varchar (parser, b, r1);
6288  }
6289 
6290  if (p->info.alter_user.comment != NULL)
6291  {
6292  r1 = pt_print_bytes (parser, p->info.alter_user.comment);
6293  b = pt_append_nulstring (parser, b, " comment ");
6294  b = pt_append_varchar (parser, b, r1);
6295  }
6296 
6297  return b;
6298 }
6299 
6300 /* ALTER_TRIGGER */
6301 /*
6302  * pt_apply_alter_trigger () -
6303  * return:
6304  * parser(in):
6305  * p(in):
6306  * g(in):
6307  * arg(in):
6308  */
6309 static PT_NODE *
6311 {
6314  return p;
6315 }
6316 
6317 /*
6318  * pt_init_alter_trigger () -
6319  * return:
6320  * p(in):
6321  */
6322 static PT_NODE *
6324 {
6326  return (p);
6327 }
6328 
6329 /*
6330  * pt_print_alter_trigger () -
6331  * return:
6332  * parser(in):
6333  * p(in):
6334  */
6335 static PARSER_VARCHAR *
6337 {
6338  PARSER_VARCHAR *b = NULL, *r1;
6339 
6341  b = pt_append_nulstring (parser, b, "alter trigger ");
6342  b = pt_append_varchar (parser, b, r1);
6343 
6345  {
6346  r1 = pt_print_bytes (parser, p->info.alter_trigger.trigger_owner);
6347  b = pt_append_nulstring (parser, b, " owner to ");
6348  b = pt_append_varchar (parser, b, r1);
6349  }
6350  else if (p->info.alter_trigger.trigger_priority)
6351  {
6353  b = pt_append_nulstring (parser, b, " priority ");
6354  b = pt_append_varchar (parser, b, r1);
6355  }
6357  {
6358  b = pt_append_nulstring (parser, b, " status ");
6360  }
6361 
6362  if (p->info.alter_trigger.comment != NULL)
6363  {
6364  b = pt_append_nulstring (parser, b, " comment ");
6365  r1 = pt_print_bytes (parser, p->info.alter_trigger.comment);
6366  b = pt_append_varchar (parser, b, r1);
6367  }
6368 
6369  return b;
6370 }
6371 
6372 /* ATTACH */
6373 /*
6374  * pt_apply_attach () -
6375  * return:
6376  * parser(in):
6377  * p(in):
6378  * g(in):
6379  * arg(in):
6380  */
6381 static PT_NODE *
6382 pt_apply_attach (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
6383 {
6384  return p;
6385 }
6386 
6387 /*
6388  * pt_print_attach () -
6389  * return:
6390  * parser(in):
6391  * p(in):
6392  */
6393 static PARSER_VARCHAR *
6395 {
6396  char s[PT_MEMB_BUF_SIZE];
6397 
6398  sprintf (s, "attach %d ", p->info.attach.trans_id);
6399 
6400  return pt_append_nulstring (parser, NULL, s);
6401 }
6402 
6403 /* ATTR_DEF */
6404 /*
6405  * pt_apply_attr_def () -
6406  * return:
6407  * parser(in):
6408  * p(in):
6409  * g(in):
6410  * arg(in):
6411  */
6412 static PT_NODE *
6413 pt_apply_attr_def (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
6414 {
6415  PT_APPLY_WALK (parser, p->info.attr_def.attr_name, arg);
6416  PT_APPLY_WALK (parser, p->info.attr_def.data_default, arg);
6417  PT_APPLY_WALK (parser, p->info.attr_def.auto_increment, arg);
6418  PT_APPLY_WALK (parser, p->info.attr_def.ordering_info, arg);
6419  return p;
6420 }
6421 
6422 /*
6423  * pt_init_attr_def () -
6424  * return:
6425  * p(in):
6426  */
6427 static PT_NODE *
6429 {
6431  return p;
6432 }
6433 
6434 /*
6435  * pt_print_attr_def () -
6436  * return:
6437  * parser(in):
6438  * p(in):
6439  */
6440 static PARSER_VARCHAR *
6442 {
6443  PARSER_VARCHAR *q = 0, *r1;
6444  char s[PT_MEMB_BUF_SIZE];
6445 
6447  {
6448  q = pt_append_nulstring (parser, q, " class ");
6449  }
6450  r1 = pt_print_bytes (parser, p->info.attr_def.attr_name);
6451  q = pt_append_varchar (parser, q, r1);
6452  q = pt_append_nulstring (parser, q, " ");
6453 
6454  switch (p->type_enum)
6455  {
6456  case PT_TYPE_OBJECT:
6457  if (p->data_type)
6458  {
6459  r1 = pt_print_bytes (parser, p->data_type);
6460  q = pt_append_varchar (parser, q, r1);
6461  }
6462  else
6463  {
6464  q = pt_append_nulstring (parser, q, "object");
6465  }
6466  break;
6467  case PT_TYPE_NUMERIC:
6468  q = pt_append_nulstring (parser, q, pt_show_type_enum (p->type_enum));
6469  if (p->data_type)
6470  {
6471  /* only show non-default parameter */
6473  {
6474  sprintf (s, "(%d,%d)", p->data_type->info.data_type.precision,
6476  q = pt_append_nulstring (parser, q, s);
6477  }
6478  }
6479  break;
6480  case PT_TYPE_NCHAR:
6481  case PT_TYPE_VARNCHAR:
6482  case PT_TYPE_CHAR:
6483  case PT_TYPE_VARCHAR:
6484  case PT_TYPE_BIT:
6485  case PT_TYPE_VARBIT:
6486  case PT_TYPE_FLOAT:
6487  q = pt_append_nulstring (parser, q, pt_show_type_enum (p->type_enum));
6488  if (p->data_type)
6489  {
6490  bool show_precision;
6491  int precision;
6492 
6493  precision = p->data_type->info.data_type.precision;
6494  switch (p->type_enum)
6495  {
6496  case PT_TYPE_CHAR:
6497  case PT_TYPE_NCHAR:
6498  case PT_TYPE_BIT:
6499  /* fixed data type: always show parameter */
6500  show_precision = true;
6501  break;
6502  default:
6503  /* variable data type: only show non-maximum(i.e., default) parameter */
6504  if (precision == TP_FLOATING_PRECISION_VALUE)
6505  {
6506  show_precision = false;
6507  }
6508  else if (p->type_enum == PT_TYPE_VARCHAR)
6509  {
6510  show_precision = (precision != DB_MAX_VARCHAR_PRECISION);
6511  }
6512  else if (p->type_enum == PT_TYPE_VARNCHAR)
6513  {
6514  show_precision = (precision != DB_MAX_VARNCHAR_PRECISION);
6515  }
6516  else if (p->type_enum == PT_TYPE_VARBIT)
6517  {
6518  show_precision = (precision != DB_MAX_VARBIT_PRECISION);
6519  }
6520  else
6521  {
6522  show_precision = (precision != 7);
6523  }
6524  break;
6525  }
6526 
6527  if (show_precision == true)
6528  {
6529  sprintf (s, "(%d)", precision);
6530  q = pt_append_nulstring (parser, q, s);
6531  }
6532  }
6533  break;
6534  case PT_TYPE_INTEGER:
6535  case PT_TYPE_SMALLINT:
6536  case PT_TYPE_BIGINT:
6537  case PT_TYPE_DOUBLE:
6538  case PT_TYPE_MONETARY:
6539  case PT_TYPE_DATE:
6540  case PT_TYPE_TIME:
6541  case PT_TYPE_TIMESTAMP:
6542  case PT_TYPE_TIMESTAMPTZ:
6543  case PT_TYPE_TIMESTAMPLTZ:
6544  case PT_TYPE_DATETIME:
6545  case PT_TYPE_DATETIMETZ:
6546  case PT_TYPE_DATETIMELTZ:
6547  q = pt_append_nulstring (parser, q, pt_show_type_enum (p->type_enum));
6548  break;
6549  case PT_TYPE_NONE:
6550  /* no type is a blank attr def, as in view creation */
6551  break;
6552  case PT_TYPE_ENUMERATION:
6553  /* print only elements of the ENUMERATION */
6554  q = pt_append_nulstring (parser, q, pt_show_type_enum (p->type_enum));
6555  q = pt_append_nulstring (parser, q, "(");
6556  if (p->data_type != NULL)
6557  {
6559  }
6560  q = pt_append_varchar (parser, q, r1);
6561  q = pt_append_nulstring (parser, q, ")");
6562  break;
6563  default:
6564  q = pt_append_nulstring (parser, q, pt_show_type_enum (p->type_enum));
6565  if (p->data_type)
6566  {
6567  r1 = pt_print_bytes_l (parser, p->data_type);
6568  q = pt_append_nulstring (parser, q, "(");
6569  q = pt_append_varchar (parser, q, r1);
6570  q = pt_append_nulstring (parser, q, ")");
6571  }
6572  break;
6573  }
6574 
6575  /* collation must be the first to be printed after type, precision */
6576  if (PT_HAS_COLLATION (p->type_enum) && p->data_type != NULL
6578  {
6579  sprintf (s, " collate %s", lang_get_collation_name (p->data_type->info.data_type.collation_id));
6580  q = pt_append_nulstring (parser, q, s);
6581  }
6582 
6583  if (p->info.attr_def.data_default)
6584  {
6585  r1 = pt_print_bytes (parser, p->info.attr_def.data_default);
6586  q = pt_append_varchar (parser, q, r1);
6587  }
6588 
6590  {
6591  const char *c = db_default_expression_string (p->info.attr_def.on_update);
6592  q = pt_append_nulstring (parser, q, " on update ");
6593  q = pt_append_nulstring (parser, q, c);
6594  q = pt_append_nulstring (parser, q, " ");
6595  }
6596 
6597  if (p->info.attr_def.auto_increment)
6598  {
6599  r1 = pt_print_bytes (parser, p->info.attr_def.auto_increment);
6600  q = pt_append_varchar (parser, q, r1);
6601  }
6602 
6603  /* The constraint information is no longer available in the attribute branch of the parse tree. For now we'll just
6604  * comment this section out. If we really want to print out this information, we'll have to search the constraint
6605  * branch of the parse tree to get it. if (p->info.attr_def.constrain_unique) q=pt_append_nulstring(parser, q, "
6606  * unique "); */
6607 
6609  {
6610  q = pt_append_nulstring (parser, q, " not null ");
6611  }
6612 
6613  if (p->info.attr_def.comment != NULL)
6614  {
6615  r1 = pt_print_bytes (parser, p->info.attr_def.comment);
6616  q = pt_append_nulstring (parser, q, " comment ");
6617  q = pt_append_varchar (parser, q, r1);
6618  }
6619 
6621  {
6622  r1 = pt_print_bytes (parser, p->info.attr_def.ordering_info);
6623  q = pt_append_nulstring (parser, q, " ");
6624  q = pt_append_varchar (parser, q, r1);
6625  q = pt_append_nulstring (parser, q, " ");
6626  }
6627  return q;
6628 }
6629 
6630 /* ATTR_ORDERING */
6631 /*
6632  * pt_apply_attr_ordering () -
6633  * return:
6634  * parser(in):
6635  * p(in):
6636  * g(in):
6637  * arg(in):
6638  */
6639 static PT_NODE *
6641 {
6642  PT_APPLY_WALK (parser, p->info.attr_ordering.after, arg);
6643  return p;
6644 }
6645 
6646 /*
6647  * pt_print_attr_ordering () -
6648  * return:
6649  * parser(in):
6650  * p(in):
6651  */
6652 static PARSER_VARCHAR *
6654 {
6655  PARSER_VARCHAR *q = NULL, *r1 = NULL;
6656 
6657  if (p->info.attr_ordering.first)
6658  {
6659  q = pt_append_nulstring (parser, q, "first");
6660  }
6661  else
6662  {
6663  r1 = pt_print_bytes (parser, p->info.attr_ordering.after);
6664  q = pt_append_nulstring (parser, q, "after ");
6665  q = pt_append_varchar (parser, q, r1);
6666  }
6667 
6668  return q;
6669 }
6670 
6671 /* AUTH_CMD */
6672 /*
6673  * pt_apply_auth_cmd () -
6674  * return:
6675  * parser(in):
6676  * p(in):
6677  * g(in):
6678  * arg(in):
6679  */
6680 static PT_NODE *
6681 pt_apply_auth_cmd (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
6682 {
6683  PT_APPLY_WALK (parser, p->info.auth_cmd.attr_mthd_list, arg);
6684  return p;
6685 }
6686 
6687 /*
6688  * pt_init_auth_cmd () -
6689  * return:
6690  * p(in):
6691  */
6692 static PT_NODE *
6694 {
6696  return (p);
6697 }
6698 
6699 /*
6700  * pt_print_auth_cmd () -
6701  * return:
6702  * parser(in):
6703  * p(in):
6704  */
6705 static PARSER_VARCHAR *
6707 {
6708  PARSER_VARCHAR *q = 0, *r1;
6709  q = pt_append_nulstring (parser, q, pt_show_priv (p->info.auth_cmd.auth_cmd));
6710 
6711  if (p->info.auth_cmd.attr_mthd_list)
6712  {
6713  r1 = pt_print_bytes_l (parser, p->info.auth_cmd.attr_mthd_list);
6714  q = pt_append_nulstring (parser, q, "(");
6715  q = pt_append_varchar (parser, q, r1);
6716  q = pt_append_nulstring (parser, q, ")");
6717  }
6718  return q;
6719 }
6720 
6721 /* CHECK_OPTION */
6722 /*
6723  * pt_apply_check_option () -
6724  * return:
6725  * parser(in):
6726  * p(in):
6727  * g(in):
6728  * arg(in):
6729  */
6730 static PT_NODE *
6732 {
6733  PT_APPLY_WALK (parser, p->info.check_option.expr, arg);
6734 
6735  return p;
6736 }
6737 
6738 /*
6739  * pt_print_check_option () -
6740  * return:
6741  * parser(in):
6742  * p(in):
6743  */
6744 static PARSER_VARCHAR *
6746 {
6747  PARSER_VARCHAR *q = NULL;
6748 
6749  q = pt_print_and_list (parser, p->info.check_option.expr);
6750 
6751  return q;
6752 }
6753 
6754 /* COMMIT_WORK */
6755 /*
6756  * pt_apply_commit_work () -
6757  * return:
6758  * parser(in):
6759  * p(in):
6760  * g(in):
6761  * arg(in):
6762  */
6763 static PT_NODE *
6764 pt_apply_commit_work (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
6765 {
6766  return p;
6767 }
6768 
6769 /*
6770  * pt_print_commit_work () -
6771  * return:
6772  * parser(in):
6773  * p(in):
6774  */
6775 static PARSER_VARCHAR *
6777 {
6778  PARSER_VARCHAR *q = NULL;
6779 
6780  q = pt_append_nulstring (parser, q, "commit work");
6781  if (p->info.commit_work.retain_lock)
6782  {
6783  q = pt_append_nulstring (parser, q, " retain lock");
6784  }
6785 
6786  return q;
6787 }
6788 
6789 /* CREATE_ENTITY */
6790 /*
6791  * pt_apply_create_entity () -
6792  * return:
6793  * parser(in):
6794  * p(in):
6795  * g(in):
6796  * arg(in):
6797  */
6798 static PT_NODE *
6800 {
6801  PT_APPLY_WALK (parser, p->info.create_entity.entity_name, arg);
6802  PT_APPLY_WALK (parser, p->info.create_entity.supclass_list, arg);
6804  PT_APPLY_WALK (parser, p->info.create_entity.attr_def_list, arg);
6805  PT_APPLY_WALK (parser, p->info.create_entity.method_def_list, arg);
6807  PT_APPLY_WALK (parser, p->info.create_entity.resolution_list, arg);
6808  PT_APPLY_WALK (parser, p->info.create_entity.as_query_list, arg);
6809  PT_APPLY_WALK (parser, p->info.create_entity.object_id_list, arg);
6810  PT_APPLY_WALK (parser, p->info.create_entity.update, arg);
6811  PT_APPLY_WALK (parser, p->info.create_entity.constraint_list, arg);
6812  PT_APPLY_WALK (parser, p->info.create_entity.create_index, arg);
6813  PT_APPLY_WALK (parser, p->info.create_entity.partition_info, arg);
6814  PT_APPLY_WALK (parser, p->info.create_entity.internal_stmts, arg);
6815  PT_APPLY_WALK (parser, p->info.create_entity.create_like, arg);
6816  PT_APPLY_WALK (parser, p->info.create_entity.create_select, arg);
6817  return p;
6818 }
6819 
6820 /*
6821  * pt_init_create_entity () -
6822  * return:
6823  * p(in):
6824  */
6825 static PT_NODE *
6827 {
6830  return p;
6831 }
6832 
6833 /*
6834  * pt_print_create_entity () -
6835  * return:
6836  * parser(in):
6837  * p(in):
6838  */
6839 static PARSER_VARCHAR *
6841 {
6842  PARSER_VARCHAR *q = 0, *r1;
6843  unsigned int save_custom;
6844  PT_MISC_TYPE view_check_option;
6845 
6846  r1 = pt_print_bytes (parser, p->info.create_entity.entity_name);
6847  q = pt_append_nulstring (parser, q, "create ");
6848  if (p->info.create_entity.or_replace)
6849  {
6850  q = pt_append_nulstring (parser, q, "or replace ");
6851  }
6852 
6854  q = pt_append_nulstring (parser, q, " ");
6856  {
6857  q = pt_append_nulstring (parser, q, "if not exists ");
6858  }
6859  q = pt_append_varchar (parser, q, r1);
6860 
6862  {
6863  r1 = pt_print_bytes (parser, p->info.create_entity.create_like);
6864  q = pt_append_nulstring (parser, q, " like ");
6865  q = pt_append_varchar (parser, q, r1);
6866  return q;
6867  }
6868 
6870  {
6872  q = pt_append_nulstring (parser, q, " under ");
6873  q = pt_append_varchar (parser, q, r1);
6874  }
6876  {
6877  save_custom = parser->custom_print;
6880  q = pt_append_nulstring (parser, q, " class attribute ( ");
6881  q = pt_append_varchar (parser, q, r1);
6882  q = pt_append_nulstring (parser, q, " ) ");
6883 
6884  parser->custom_print = save_custom;
6885  }
6888  {
6889  PT_NODE *constraint;
6890 
6891  save_custom = parser->custom_print;
6894  parser->custom_print = save_custom;
6895 
6896  q = pt_append_nulstring (parser, q, " ( ");
6897  q = pt_append_varchar (parser, q, r1);
6898 
6899  /* Don't print out not-null constraints */
6900  constraint = p->info.create_entity.constraint_list;
6901  while (constraint
6902  && (constraint->info.constraint.type == PT_CONSTRAIN_NULL
6903  || constraint->info.constraint.type == PT_CONSTRAIN_NOT_NULL))
6904  {
6905  constraint = constraint->next;
6906  }
6907  if (p->info.create_entity.attr_def_list && constraint)
6908  {
6909  q = pt_append_nulstring (parser, q, ", ");
6910  }
6911 
6912  if (constraint)
6913  {
6914  r1 = pt_print_bytes (parser, constraint);
6915  q = pt_append_varchar (parser, q, r1);
6916 
6917  constraint = constraint->next;
6918  while (constraint)
6919  {
6920  /* keep skipping NOT_NULL constraints */
6921  while (constraint
6922  && (constraint->info.constraint.type == PT_CONSTRAIN_NULL
6923  || constraint->info.constraint.type == PT_CONSTRAIN_NOT_NULL))
6924  {
6925  constraint = constraint->next;
6926  }
6927  if (constraint)
6928  {
6929  /* Have a list */
6930  r1 = pt_print_bytes (parser, constraint);
6931  q = pt_append_bytes (parser, q, ", ", 2);
6932  q = pt_append_varchar (parser, q, r1);
6933 
6934  constraint = constraint->next;
6935  }
6936  }
6937  }
6938 
6940  {
6942  {
6943  q = pt_append_nulstring (parser, q, ", ");
6944  }
6945 
6946  save_custom = parser->custom_print;
6947  parser->custom_print |= PT_SUPPRESS_INDEX;
6948  r1 = pt_print_bytes_l (parser, p->info.create_entity.create_index);
6949  parser->custom_print = save_custom;
6950 
6951  if (r1)
6952  {
6953  q = pt_append_varchar (parser, q, r1);
6954  }
6955  }
6956 
6957  q = pt_append_nulstring (parser, q, " ) ");
6958  }
6959 
6961  {
6962 
6963  save_custom = parser->custom_print;
6966  parser->custom_print = save_custom;
6967 
6968  q = pt_append_nulstring (parser, q, " object_id ( ");
6969  q = pt_append_varchar (parser, q, r1);
6970  q = pt_append_nulstring (parser, q, " ) ");
6971  }
6973  {
6975  q = pt_append_nulstring (parser, q, " ");
6976  q = pt_append_varchar (parser, q, r1);
6977  q = pt_append_nulstring (parser, q, " ");
6978  }
6980  {
6982  q = pt_append_nulstring (parser, q, " method ");
6983  q = pt_append_varchar (parser, q, r1);
6984  }
6986  {
6988  q = pt_append_nulstring (parser, q, " file ");
6989  q = pt_append_varchar (parser, q, r1);
6990  }
6992  {
6993  save_custom = parser->custom_print;
6996  parser->custom_print = save_custom;
6997  q = pt_append_nulstring (parser, q, " inherit ");
6998  q = pt_append_varchar (parser, q, r1);
6999  }
7001  {
7002  save_custom = parser->custom_print;
7003  parser->custom_print |= PT_PRINT_ALIAS;
7004 
7006  q = pt_append_nulstring (parser, q, " as ");
7007  q = pt_append_varchar (parser, q, r1);
7008 
7009  parser->custom_print = save_custom;
7010  }
7011 
7012  view_check_option = p->info.create_entity.with_check_option;
7013  if (view_check_option == PT_LOCAL)
7014  {
7015  q = pt_append_nulstring (parser, q, " with local check option");
7016  }
7017  else if (view_check_option == PT_CASCADED)
7018  {
7019  q = pt_append_nulstring (parser, q, " with cascaded check option");
7020  }
7021 
7023  {
7025  {
7026  q = pt_append_nulstring (parser, q, " comment ");
7027  r1 = pt_print_bytes (parser, p->info.create_entity.vclass_comment);
7028  q = pt_append_varchar (parser, q, r1);
7029  }
7030  }
7031 
7032  /* this is out of date */
7033  if (p->info.create_entity.update)
7034  {
7035  r1 = pt_print_bytes_l (parser, p->info.create_entity.update);
7036  q = pt_append_nulstring (parser, q, " update ");
7037  q = pt_append_varchar (parser, q, r1);
7038  }
7039 
7041  {
7042  /* the ';' is not strictly speaking ANSI */
7043  q = pt_append_nulstring (parser, q, ";");
7044  }
7045 
7047  {
7048  save_custom = parser->custom_print;
7050 
7052  q = pt_append_nulstring (parser, q, " partition by ");
7053  q = pt_append_varchar (parser, q, r1);
7054 
7055  parser->custom_print = save_custom;
7056  }
7057 
7059  {
7060  save_custom = parser->custom_print;
7061  parser->custom_print |= PT_PRINT_ALIAS;
7062 
7063  r1 = pt_print_bytes (parser, p->info.create_entity.create_select);
7065  {
7066  q = pt_append_nulstring (parser, q, " replace");
7067  }
7069  {
7070  q = pt_append_nulstring (parser, q, " ignore");
7071  }
7072  q = pt_append_nulstring (parser, q, " as ");
7073  q = pt_append_varchar (parser, q, r1);
7074 
7075  parser->custom_print = save_custom;
7076  }
7077 
7078  return q;
7079 }
7080 
7081 /* CREATE_INDEX */
7082 /*
7083  * pt_apply_create_index () -
7084  * return:
7085  * parser(in):
7086  * p(in):
7087  * g(in):
7088  * arg(in):
7089  */
7090 static PT_NODE *
7092 {
7093  PT_APPLY_WALK (parser, p->info.index.indexed_class, arg);
7094  PT_APPLY_WALK (parser, p->info.index.column_names, arg);
7095  PT_APPLY_WALK (parser, p->info.index.index_name, arg);
7096  PT_APPLY_WALK (parser, p->info.index.prefix_length, arg);
7097  PT_APPLY_WALK (parser, p->info.index.where, arg);
7098  PT_APPLY_WALK (parser, p->info.index.function_expr, arg);
7099  return p;
7100 }
7101 
7102 /*
7103  * pt_init_create_index () -
7104  * return:
7105  * p(in):
7106  */
7107 static PT_NODE *
7109 {
7110  p->info.index.func_pos = -1;
7111  return p;
7112 }
7113 
7114 /*
7115  * pt_print_create_index () -
7116  * return:
7117  * parser(in):
7118  * p(in):
7119  */
7120 static PARSER_VARCHAR *
7122 {
7123  PARSER_VARCHAR *b = 0, *r1 = 0, *r2 = 0, *r3 = 0, *r4 = 0;
7124  unsigned int saved_cp = parser->custom_print;
7125  PT_NODE *sort_spec, *prefix_length;
7126  PARSER_VARCHAR *comment = NULL;
7127 
7129 
7130  if (!(parser->custom_print & PT_SUPPRESS_INDEX))
7131  {
7132  r1 = pt_print_bytes (parser, p->info.index.indexed_class);
7133 
7134  b = pt_append_nulstring (parser, b, "create");
7135  }
7136 
7137  if (p->info.index.reverse)
7138  {
7139  b = pt_append_nulstring (parser, b, " reverse");
7140  }
7141  if (p->info.index.unique)
7142  {
7143  b = pt_append_nulstring (parser, b, " unique");
7144  }
7145  b = pt_append_nulstring (parser, b, " index");
7146  if (p->info.index.index_name)
7147  {
7148  const char *index_name = p->info.index.index_name->info.name.original;
7149  b = pt_append_nulstring (parser, b, " [");
7150  b = pt_append_bytes (parser, b, index_name, strlen (index_name));
7151  b = pt_append_nulstring (parser, b, "]");
7152  }
7153 
7154  if (!(parser->custom_print & PT_SUPPRESS_INDEX))
7155  {
7156  b = pt_append_nulstring (parser, b, " on ");
7157  b = pt_append_varchar (parser, b, r1);
7158  }
7159 
7160  /* if use prefix_length, the length of sort_spec must be 1 */
7161  prefix_length = p->info.index.prefix_length;
7162  if (prefix_length != NULL)
7163  {
7164  sort_spec = p->info.index.column_names;
7165  assert (sort_spec != NULL);
7166 
7167  /* sort_spec */
7168  r3 = pt_print_bytes (parser, sort_spec->info.sort_spec.expr);
7169  r2 = pt_append_varchar (parser, r2, r3);
7170 
7171  /* prefix_length */
7172  r3 = pt_print_bytes (parser, prefix_length);
7173  r2 = pt_append_nulstring (parser, r2, " (");
7174  r2 = pt_append_varchar (parser, r2, r3);
7175  r2 = pt_append_nulstring (parser, r2, ") ");
7176 
7177  if (sort_spec->info.sort_spec.asc_or_desc == PT_DESC)
7178  {
7179  r2 = pt_append_nulstring (parser, r2, " desc ");
7180  }
7181  }
7182  else
7183  {
7184  r2 = pt_print_index_columns (parser, p);
7185  }
7186 
7187  b = pt_append_nulstring (parser, b, " (");
7188  b = pt_append_varchar (parser, b, r2);
7189  b = pt_append_nulstring (parser, b, ") ");
7190 
7191  if (p->info.index.where != NULL)
7192  {
7193  r4 = pt_print_and_list (parser, p->info.index.where);
7194  b = pt_append_nulstring (parser, b, " where ");
7195  b = pt_append_varchar (parser, b, r4);
7196  }
7197 
7198  if (p->info.index.comment != NULL)
7199  {
7200  comment = pt_print_bytes (parser, p->info.index.comment);
7201  b = pt_append_nulstring (parser, b, " comment ");
7202  b = pt_append_varchar (parser, b, comment);
7203  }
7204 
7206  {
7207  b = pt_append_nulstring (parser, b, " INVISIBLE ");
7208  }
7210  {
7211  b = pt_append_nulstring (parser, b, " WITH ONLINE ");
7212  }
7213 
7214  parser->custom_print = saved_cp;
7215 
7216  return b;
7217 }
7218 
7219 /* CREATE_USER */
7220 /*
7221  * pt_apply_create_user () -
7222  * return:
7223  * parser(in):
7224  * p(in):
7225  * g(in):
7226  * arg(in):
7227  */
7228 static PT_NODE *
7229 pt_apply_create_user (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
7230 {
7231  PT_APPLY_WALK (parser, p->info.create_user.user_name, arg);
7232  PT_APPLY_WALK (parser, p->info.create_user.password, arg);
7233  PT_APPLY_WALK (parser, p->info.create_user.groups, arg);
7234  PT_APPLY_WALK (parser, p->info.create_user.members, arg);
7235  return p;
7236 }
7237 
7238 /*
7239  * pt_print_create_user () -
7240  * return:
7241  * parser(in):
7242  * p(in):
7243  */
7244 static PARSER_VARCHAR *
7246 {
7247  PARSER_VARCHAR *b = 0, *r1;
7248 
7249  r1 = pt_print_bytes (parser, p->info.create_user.user_name);
7250  b = pt_append_nulstring (parser, b, "create user ");
7251  b = pt_append_varchar (parser, b, r1);
7252 
7253  if (p->info.create_user.password)
7254  {
7255  r1 = pt_print_bytes (parser, p->info.create_user.password);
7256  b = pt_append_nulstring (parser, b, " password ");
7257  b = pt_append_varchar (parser, b, r1);
7258  }
7259  if (p->info.create_user.groups)
7260  {
7261  r1 = pt_print_bytes (parser, p->info.create_user.groups);
7262  b = pt_append_nulstring (parser, b, " groups ");
7263  b = pt_append_varchar (parser, b, r1);
7264  }
7265  if (p->info.create_user.members)
7266  {
7267  r1 = pt_print_bytes (parser, p->info.create_user.members);
7268  b = pt_append_nulstring (parser, b, " members ");
7269  b = pt_append_varchar (parser, b, r1);
7270  }
7271  if (p->info.create_user.comment != NULL)
7272  {
7273  r1 = pt_print_bytes (parser, p->info.create_user.comment);
7274  b = pt_append_nulstring (parser, b, " comment ");
7275  b = pt_append_varchar (parser, b, r1);
7276  }
7277  return b;
7278 }
7279 
7280 /* CREATE_TRIGGER */
7281 /*
7282  * pt_apply_create_trigger () -
7283  * return:
7284  * parser(in):
7285  * p(in):
7286  * g(in):
7287  * arg(in):
7288  */
7289 static PT_NODE *
7291 {
7292  PT_APPLY_WALK (parser, p->info.create_trigger.trigger_name, arg);
7294  PT_APPLY_WALK (parser, p->info.create_trigger.trigger_event, arg);
7297  PT_APPLY_WALK (parser, p->info.create_trigger.trigger_action, arg);
7298  return p;
7299 }
7300 
7301 /*
7302  * pt_print_create_trigger () -
7303  * return:
7304  * parser(in):
7305  * p(in):
7306  */
7307 static PARSER_VARCHAR *
7309 {
7310  PARSER_VARCHAR *q = NULL, *r1;
7311  r1 = pt_print_bytes (parser, p->info.create_trigger.trigger_name);
7312  q = pt_append_nulstring (parser, q, "create trigger ");
7313  q = pt_append_varchar (parser, q, r1);
7314 
7316  {
7317  q = pt_append_nulstring (parser, q, " status ");
7319  }
7320 
7321  q = pt_append_nulstring (parser, q, " ");
7322 
7324  {
7326  q = pt_append_nulstring (parser, q, " priority ");
7327  q = pt_append_varchar (parser, q, r1);
7328  }
7329 
7330  r1 = pt_print_bytes (parser, p->info.create_trigger.trigger_event);
7331  q = pt_append_nulstring (parser, q, " ");
7333  q = pt_append_nulstring (parser, q, " ");
7334  q = pt_append_varchar (parser, q, r1);
7335  q = pt_append_nulstring (parser, q, " ");
7336 
7338  {
7340  q = pt_append_nulstring (parser, q, "if ");
7341  q = pt_append_varchar (parser, q, r1);
7342  }
7343 
7344  q = pt_append_nulstring (parser, q, " execute ");
7345 
7347  {
7349  q = pt_append_nulstring (parser, q, " ");
7350  }
7351 
7353  q = pt_append_varchar (parser, q, r1);
7354 
7355  if (p->info.create_trigger.comment != NULL)
7356  {
7357  r1 = pt_print_bytes (parser, p->info.create_trigger.comment);
7358  q = pt_append_nulstring (parser, q, " comment ");
7359  q = pt_append_varchar (parser, q, r1);
7360  }
7361 
7362  return q;
7363 }
7364 
7365 /*
7366  * pt_apply_stored_procedure () -
7367  * return:
7368  * parser(in):
7369  * p(in):
7370  * g(in):
7371  * arg(in):
7372  */
7373 static PT_NODE *
7375 {
7376  return p;
7377 }
7378 
7379 /*
7380  * pt_print_create_stored_procedure () -
7381  * return:
7382  * parser(in):
7383  * p(in):
7384  */
7385 static PARSER_VARCHAR *
7387 {
7388  PARSER_VARCHAR *q = NULL, *r1, *r2, *r3;
7389 
7390  r1 = pt_print_bytes (parser, p->info.sp.name);
7391  q = pt_append_nulstring (parser, q, "create ");
7392  if (p->info.sp.or_replace)
7393  {
7394  q = pt_append_nulstring (parser, q, "or replace ");
7395  }
7396  q = pt_append_nulstring (parser, q, pt_show_misc_type (p->info.sp.type));
7397  q = pt_append_nulstring (parser, q, " ");
7398  q = pt_append_varchar (parser, q, r1);
7399 
7400  r2 = pt_print_bytes_l (parser, p->info.sp.param_list);
7401  q = pt_append_nulstring (parser, q, "(");
7402  q = pt_append_varchar (parser, q, r2);
7403  q = pt_append_nulstring (parser, q, ")");
7404 
7405  if (p->info.sp.type == PT_SP_FUNCTION)
7406  {
7407  q = pt_append_nulstring (parser, q, " return ");
7408  q = pt_append_nulstring (parser, q, pt_show_type_enum (p->info.sp.ret_type));
7409  }
7410 
7411  r3 = pt_print_bytes (parser, p->info.sp.java_method);
7412  q = pt_append_nulstring (parser, q, " as language java name ");
7413  q = pt_append_varchar (parser, q, r3);
7414 
7415  if (p->info.sp.comment != NULL)
7416  {
7417  r1 = pt_print_bytes (parser, p->info.sp.comment);
7418  q = pt_append_nulstring (parser, q, " comment ");
7419  q = pt_append_varchar (parser, q, r1);
7420  }
7421 
7422  return q;
7423 }
7424 
7425 /*
7426  * pt_print_drop_stored_procedure () -
7427  * return:
7428  * parser(in):
7429  * p(in):
7430  */
7431 static PARSER_VARCHAR *
7433 {
7434  PARSER_VARCHAR *q = NULL, *r1;
7435 
7436  r1 = pt_print_bytes_l (parser, p->info.sp.name);
7437  q = pt_append_nulstring (parser, q, "drop ");
7438  q = pt_append_nulstring (parser, q, pt_show_misc_type (p->info.sp.type));
7439  q = pt_append_nulstring (parser, q, " ");
7440  q = pt_append_varchar (parser, q, r1);
7441 
7442  return q;
7443 }
7444 
7445 /* PREPARE */
7446 /*
7447  * pt_apply_prepare () -
7448  * return:
7449  * parser(in):
7450  * p(in):
7451  * g(in):
7452  * arg(in):
7453  */
7454 static PT_NODE *
7455 pt_apply_prepare (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
7456 {
7457  return p;
7458 }
7459 
7460 /* TRUNCATE ENTITY */
7461 /*
7462  * pt_apply_truncate () -
7463  * return:
7464  * parser(in):
7465  * p(in):
7466  * g(in):
7467  * arg(in):
7468  */
7469 static PT_NODE *
7470 pt_apply_truncate (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
7471 {
7472  PT_APPLY_WALK (parser, p->info.truncate.spec, arg);
7473  return p;
7474 }
7475 
7476 /*
7477  * pt_print_truncate () -
7478  * return:
7479  * parser(in):
7480  * p(in):
7481  */
7482 static PARSER_VARCHAR *
7484 {
7485  PARSER_VARCHAR *q = 0, *r1;
7486  unsigned int save_custom = parser->custom_print;
7487 
7489  r1 = pt_print_bytes_l (parser, p->info.truncate.spec);
7490  parser->custom_print = save_custom;
7491 
7492  q = pt_append_nulstring (parser, q, "truncate ");
7493  q = pt_append_varchar (parser, q, r1);
7494 
7495  return q;
7496 }
7497 
7498 /* TABLE OPTION */
7499 /*
7500  * pt_apply_table_option () -
7501  * return:
7502  * parser(in):
7503  * p(in):
7504  * g(in):
7505  * arg(in):
7506  */
7507 static PT_NODE *
7509 {
7510  PT_APPLY_WALK (parser, p->info.table_option.val, arg);
7511  return p;
7512 }
7513 
7514 /*
7515  * pt_init_table_option () -
7516  * return:
7517  * p(in):
7518  */
7519 static PT_NODE *
7521 {
7523  return p;
7524 }
7525 
7526 /*
7527  * pt_print_table_option () -
7528  * return:
7529  * parser(in):
7530  * p(in):
7531  */
7532 static PARSER_VARCHAR *
7534 {
7535  PARSER_VARCHAR *q = NULL, *r1 = NULL;
7536  const char *tde_algo_name;
7537 
7538  switch (p->info.table_option.option)
7539  {
7541  q = pt_append_nulstring (parser, q, "reuse_oid");
7542  break;
7544  q = pt_append_nulstring (parser, q, "dont_reuse_oid");
7545  break;
7547  q = pt_append_nulstring (parser, q, "auto_increment = ");
7548  break;
7550  q = pt_append_nulstring (parser, q, "charset ");
7551  break;
7553  q = pt_append_nulstring (parser, q, "collate ");
7554  break;
7556  q = pt_append_nulstring (parser, q, "comment = ");
7557  break;
7559  q = pt_append_nulstring (parser, q, "encrypt = ");
7560  break;
7561  default:
7562  break;
7563  }
7564 
7565  if (p->info.table_option.val != NULL)
7566  {
7569  {
7570  /* print as unquoted string */
7571  assert (p->info.table_option.val != NULL);
7575  assert (r1 != NULL);
7576  }
7578  {
7579  assert (p->info.table_option.val != NULL);
7583  if (tde_algo_name != NULL)
7584  {
7585  r1 = pt_append_bytes (parser, r1, tde_algo_name, strlen (tde_algo_name));
7586  }
7587  }
7588  else
7589  {
7590  r1 = pt_print_bytes_l (parser, p->info.table_option.val);
7591  }
7592  q = pt_append_varchar (parser, q, r1);
7593  }
7594 
7595  return q;
7596 }
7597 
7598 /* DO */
7599 /*
7600  * pt_apply_do () -
7601  * return:
7602  * parser(in):
7603  * p(in):
7604  * g(in):
7605  * arg(in):
7606  */
7607 static PT_NODE *
7608 pt_apply_do (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
7609 {
7610  PT_APPLY_WALK (parser, p->info.do_.expr, arg);
7611  return p;
7612 }
7613 
7614 /*
7615  * pt_print_do () -
7616  * return:
7617  * parser(in):
7618  * p(in):
7619  */
7620 static PARSER_VARCHAR *
7622 {
7623  PARSER_VARCHAR *q = 0, *r1;
7624  unsigned int save_custom = parser->custom_print;
7625 
7627  r1 = pt_print_bytes_l (parser, p->info.do_.expr);
7628  parser->custom_print = save_custom;
7629 
7630  q = pt_append_nulstring (parser, q, "do ");
7631  q = pt_append_varchar (parser, q, r1);
7632 
7633  return q;
7634 }
7635 
7636 /*
7637  * pt_apply_sp_parameter () -
7638  * return:
7639  * parser(in):
7640  * p(in):
7641  * g(in):
7642  * arg(in):
7643  */
7644 static PT_NODE *
7646 {
7647  return p;
7648 }
7649 
7650 /*
7651  * pt_print_sp_parameter () -
7652  * return:
7653  * parser(in):
7654  * p(in):
7655  */
7656 static PARSER_VARCHAR *
7658 {
7659  PARSER_VARCHAR *q = NULL, *r1;
7660 
7661  r1 = pt_print_bytes (parser, p->info.sp_param.name);
7662  q = pt_append_varchar (parser, q, r1);
7663  q = pt_append_nulstring (parser, q, " ");
7664  q = pt_append_nulstring (parser, q, pt_show_misc_type (p->info.sp_param.mode));
7665  q = pt_append_nulstring (parser, q, " ");
7666  q = pt_append_nulstring (parser, q, pt_show_type_enum (p->type_enum));
7667 
7668  if (p->info.sp_param.comment != NULL)
7669  {
7670  r1 = pt_print_bytes (parser, p->info.sp_param.comment);
7671  q = pt_append_nulstring (parser, q, " comment ");
7672  q = pt_append_varchar (parser, q, r1);
7673  }
7674 
7675  return q;
7676 }
7677 
7678 /* PARTITION */
7679 /*
7680  * pt_apply_partition () -
7681  * return:
7682  * parser(in):
7683  * p(in):
7684  * g(in):
7685  * arg(in):
7686  */
7687 static PT_NODE *
7688 pt_apply_partition (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
7689 {
7690  PT_APPLY_WALK (parser, p->info.partition.expr, arg);
7692  {
7693  PT_APPLY_WALK (parser, p->info.partition.hashsize, arg);
7694  }
7695  else
7696  {
7697  PT_APPLY_WALK (parser, p->info.partition.parts, arg);
7698  }
7699 
7700  return p;
7701 }
7702 
7703 /*
7704  * pt_print_partition () -
7705  * return:
7706  * parser(in):
7707  * p(in):
7708  */
7709 static PARSER_VARCHAR *
7711 {
7712  char buf[PT_MEMB_BUF_SIZE];
7713  PARSER_VARCHAR *q = NULL, *r1, *r2;
7714 
7715  r1 = pt_print_bytes (parser, p->info.partition.expr);
7717  {
7718  r2 = pt_print_bytes_l (parser, p->info.partition.hashsize);
7719  }
7720  else
7721  {
7722  r2 = pt_print_bytes_l (parser, p->info.partition.parts);
7723  }
7724  sprintf (buf, " %s ( ", pt_show_partition_type (p->info.partition.type));
7725 
7726  q = pt_append_nulstring (parser, q, buf);
7727  q = pt_append_varchar (parser, q, r1);
7728  q = pt_append_nulstring (parser, q, " ) ");
7730  {
7731  q = pt_append_nulstring (parser, q, " partitions ");
7732  q = pt_append_varchar (parser, q, r2);
7733  }
7734  else
7735  {
7736  q = pt_append_nulstring (parser, q, " ( ");
7737  q = pt_append_varchar (parser, q, r2);
7738  q = pt_append_nulstring (parser, q, " ) ");
7739  }
7740 
7741  return q;
7742 }
7743 
7744 /*
7745  * pt_apply_parts () -
7746  * return:
7747  * parser(in):
7748  * p(in):
7749  * g(in):
7750  * arg(in):
7751  */
7752 static PT_NODE *
7753 pt_apply_parts (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
7754 {
7755  PT_APPLY_WALK (parser, p->info.parts.name, arg);
7756  PT_APPLY_WALK (parser, p->info.parts.values, arg);
7757 
7758  return p;
7759 }
7760 
7761 /*
7762  * pt_print_parts () -
7763  * return:
7764  * parser(in):
7765  * p(in):
7766  */
7767 static PARSER_VARCHAR *
7769 {
7770  PARSER_VARCHAR *q = NULL, *r1, *r2;
7771  PARSER_VARCHAR *comment = NULL;
7772  unsigned int save_custom;
7773 
7774  r1 = pt_print_bytes (parser, p->info.parts.name);
7775 
7776  save_custom = parser->custom_print;
7778 
7779  r2 = pt_print_bytes_l (parser, p->info.parts.values);
7780 
7781  parser->custom_print = save_custom;
7782 
7783  q = pt_append_nulstring (parser, q, " partition ");
7784  q = pt_append_varchar (parser, q, r1);
7785  if (p->info.parts.type == PT_PARTITION_LIST)
7786  {
7787  q = pt_append_nulstring (parser, q, " values in ( ");
7788  q = pt_append_varchar (parser, q, r2);
7789  q = pt_append_nulstring (parser, q, " ) ");
7790  }
7791  else
7792  {
7793  q = pt_append_nulstring (parser, q, " values less than");
7794  if (r2 != NULL)
7795  {
7796  q = pt_append_nulstring (parser, q, " ( ");
7797  q = pt_append_varchar (parser, q, r2);
7798  q = pt_append_nulstring (parser, q, " ) ");
7799  }
7800  else
7801  {
7802  q = pt_append_nulstring (parser, q, " maxvalue ");
7803  }
7804  }
7805 
7806  if (p->info.parts.comment != NULL)
7807  {
7808  comment = pt_print_bytes (parser, p->info.parts.comment);
7809  q = pt_append_nulstring (parser, q, " comment ");
7810  q = pt_append_varchar (parser, q, comment);
7811  }
7812 
7813  return q;
7814 }
7815 
7816 /*
7817  * pt_print_create_serial () -
7818  * return:
7819  * parser(in):
7820  * p(in):
7821  */
7822 static PARSER_VARCHAR *
7824 {
7825  PARSER_VARCHAR *q = NULL, *r1;
7826 
7827  r1 = pt_print_bytes (parser, p->info.serial.serial_name);
7828  q = pt_append_nulstring (parser, q, "create serial ");
7829  q = pt_append_varchar (parser, q, r1);
7830 
7831  if (p->info.serial.start_val)
7832  {
7833  r1 = pt_print_bytes (parser, p->info.serial.start_val);
7834  q = pt_append_nulstring (parser, q, " start with ");
7835  q = pt_append_varchar (parser, q, r1);
7836  }
7837 
7838  if (p->info.serial.increment_val)
7839  {
7840  r1 = pt_print_bytes (parser, p->info.serial.increment_val);
7841  q = pt_append_nulstring (parser, q, " increment by ");
7842  q = pt_append_varchar (parser, q, r1);
7843  }
7844 
7845  if (p->info.serial.min_val)
7846  {
7847  r1 = pt_print_bytes (parser, p->info.serial.min_val);
7848  q = pt_append_nulstring (parser, q, " minvalue ");
7849  q = pt_append_varchar (parser, q, r1);
7850  }
7851  else if (p->info.serial.no_min == 1)
7852  {
7853  q = pt_append_nulstring (parser, q, " nominvalue ");
7854  }
7855 
7856  if (p->info.serial.max_val)
7857  {
7858  r1 = pt_print_bytes (parser, p->info.serial.max_val);
7859  q = pt_append_nulstring (parser, q, " maxvalue ");
7860  q = pt_append_varchar (parser, q, r1);
7861  }
7862  else if (p->info.serial.no_max == 1)
7863  {
7864  q = pt_append_nulstring (parser, q, " nomaxvalue ");
7865  }
7866 
7867  if (p->info.serial.cyclic)
7868  {
7869  q = pt_append_nulstring (parser, q, " cycle ");
7870  }
7871  else if (p->info.serial.no_cyclic == 1)
7872  {
7873  q = pt_append_nulstring (parser, q, " nocycle ");
7874  }
7875 
7876  if (p->info.serial.cached_num_val && p->info.serial.no_cache != 1)
7877  {
7878  r1 = pt_print_bytes (parser, p->info.serial.cached_num_val);
7879  q = pt_append_nulstring (parser, q, " cache ");
7880  q = pt_append_varchar (parser, q, r1);
7881  }
7882  else if (p->info.serial.no_cache != 0)
7883  {
7884  q = pt_append_nulstring (parser, q, " nocache ");
7885  }
7886 
7887  if (p->info.serial.comment != NULL)
7888  {
7889  r1 = pt_print_bytes (parser, p->info.serial.comment);
7890  q = pt_append_nulstring (parser, q, " comment ");
7891  q = pt_append_varchar (parser, q, r1);
7892  }
7893 
7894  return q;
7895 }
7896 
7897 /*
7898  * pt_print_alter_serial () -
7899  * return:
7900  * parser(in):
7901  * p(in):
7902  */
7903 static PARSER_VARCHAR *
7905 {
7906  PARSER_VARCHAR *q = NULL, *r1;
7907 
7908  r1 = pt_print_bytes (parser, p->info.serial.serial_name);
7909  q = pt_append_nulstring (parser, q, "alter serial ");
7910  q = pt_append_varchar (parser, q, r1);
7911 
7912  if (p->info.serial.start_val != NULL)
7913  {
7914  r1 = pt_print_bytes (parser, p->info.serial.start_val);
7915  q = pt_append_nulstring (parser, q, " start with ");
7916  q = pt_append_varchar (parser, q, r1);
7917  }
7918 
7919  if (p->info.serial.increment_val)
7920  {
7921  r1 = pt_print_bytes (parser, p->info.serial.increment_val);
7922  q = pt_append_nulstring (parser, q, " increment by ");
7923  q = pt_append_varchar (parser, q, r1);
7924  }
7925 
7926  if (p->info.serial.min_val)
7927  {
7928  r1 = pt_print_bytes (parser, p->info.serial.min_val);
7929  q = pt_append_nulstring (parser, q, " minvalue ");
7930  q = pt_append_varchar (parser, q, r1);
7931  }
7932  else if (p->info.serial.no_min == 1)
7933  {
7934  q = pt_append_nulstring (parser, q, " nomaxvalue ");
7935  }
7936 
7937  if (p->info.serial.max_val)
7938  {
7939  r1 = pt_print_bytes (parser, p->info.serial.max_val);
7940  q = pt_append_nulstring (parser, q, " maxvalue ");
7941  q = pt_append_varchar (parser, q, r1);
7942  }
7943  else if (p->info.serial.no_max == 1)
7944  {
7945  q = pt_append_nulstring (parser, q, " nomaxvalue ");
7946  }
7947 
7948  if (p->info.serial.cyclic)
7949  {
7950  q = pt_append_nulstring (parser, q, " cycle ");
7951  }
7952  else if (p->info.serial.no_cyclic == 1)
7953  {
7954  q = pt_append_nulstring (parser, q, " nocycle ");
7955  }
7956 
7957  if (p->info.serial.cached_num_val && p->info.serial.no_cache != 1)
7958  {
7959  r1 = pt_print_bytes (parser, p->info.serial.cached_num_val);
7960  q = pt_append_nulstring (parser, q, " cache ");
7961  q = pt_append_varchar (parser, q, r1);
7962  }
7963  else if (p->info.serial.no_cache != 0)
7964  {
7965  q = pt_append_nulstring (parser, q, " nocache ");
7966  }
7967 
7968  if (p->info.serial.comment != NULL)
7969  {
7970  r1 = pt_print_bytes (parser, p->info.serial.comment);
7971  q = pt_append_nulstring (parser, q, " comment ");
7972  q = pt_append_varchar (parser, q, r1);
7973  }
7974 
7975  return q;
7976 }
7977 
7978 /*
7979  * pt_print_alter_stored_procedure () -
7980  * return:
7981  * parser(in):
7982  * p(in):
7983  */
7984 static PARSER_VARCHAR *
7986 {
7987  PARSER_VARCHAR *q = NULL, *r1;
7988  PT_STORED_PROC_INFO *sp_info;
7989 
7990  assert (p != NULL);
7991 
7992  sp_info = &(p->info.sp);
7993 
7994  r1 = pt_print_bytes_l (parser, sp_info->name);
7995  q = pt_append_nulstring (parser, q, "alter");
7996 
7997  if (sp_info->type == PT_SP_PROCEDURE)
7998  {
7999  q = pt_append_nulstring (parser, q, " procedure ");
8000  }
8001  else
8002  {
8003  q = pt_append_nulstring (parser, q, " function ");
8004  }
8005 
8006  q = pt_append_varchar (parser, q, r1);
8007 
8008  if (sp_info->owner != NULL)
8009  {
8010  q = pt_append_nulstring (parser, q, " owner to ");
8011 
8012  r1 = pt_print_bytes_l (parser, sp_info->owner);
8013  q = pt_append_varchar (parser, q, r1);
8014  }
8015 
8016  if (sp_info->comment != NULL)
8017  {
8018  r1 = pt_print_bytes (parser, sp_info->comment);
8019  q = pt_append_nulstring (parser, q, " comment ");
8020  q = pt_append_varchar (parser, q, r1);
8021  }
8022 
8023  return q;
8024 }
8025 
8026 /*
8027  * pt_print_drop_serial () -
8028  * return:
8029  * parser(in):
8030  * p(in):
8031  */
8032 static PARSER_VARCHAR *
8034 {
8035  PARSER_VARCHAR *q = NULL, *r1;
8036 
8037  r1 = pt_print_bytes (parser, p->info.serial.serial_name);
8038  q = pt_append_nulstring (parser, q, "drop serial ");
8039  if (p->info.serial.if_exists)
8040  {
8041  q = pt_append_nulstring (parser, q, "if exists ");
8042  }
8043  q = pt_append_varchar (parser, q, r1);
8044 
8045  return q;
8046 }
8047 
8048 /*
8049  * pt_apply_create_serial () -
8050  * return:
8051  * parser(in):
8052  * p(in):
8053  * g(in):
8054  * arg(in):
8055  */
8056 static PT_NODE *
8058 {
8059  PT_APPLY_WALK (parser, p->info.serial.start_val, arg);
8060  PT_APPLY_WALK (parser, p->info.serial.increment_val, arg);
8061  PT_APPLY_WALK (parser, p->info.serial.min_val, arg);
8062  PT_APPLY_WALK (parser, p->info.serial.max_val, arg);
8063  return p;
8064 }
8065 
8066 /*
8067  * pt_apply_alter_serial () -
8068  * return:
8069  * parser(in):
8070  * p(in):
8071  * g(in):
8072  * arg(in):
8073  */
8074 static PT_NODE *
8076 {
8077  PT_APPLY_WALK (parser, p->info.serial.increment_val, arg);
8078  PT_APPLY_WALK (parser, p->info.serial.min_val, arg);
8079  PT_APPLY_WALK (parser, p->info.serial.max_val, arg);
8080  return p;
8081 }
8082 
8083 /*
8084  * pt_apply_drop_serial () -
8085  * return:
8086  * parser(in):
8087  * p(in):
8088  * g(in):
8089  * arg(in):
8090  */
8091 static PT_NODE *
8092 pt_apply_drop_serial (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
8093 {
8094  return p;
8095 }
8096 
8097 /* DATA_DEFAULT */
8098 /*
8099  * pt_apply_data_default () -
8100  * return:
8101  * parser(in):
8102  * p(in):
8103  * g(in):
8104  * arg(in):
8105  */
8106 static PT_NODE *
8108 {
8109  PT_APPLY_WALK (parser, p->info.data_default.default_value, arg);
8110  return p;
8111 }
8112 
8113 /*
8114  * pt_init_data_default () -
8115  * return:
8116  * p(in):
8117  */
8118 static PT_NODE *
8120 {
8124  return p;
8125 }
8126 
8127 /*
8128  * pt_print_data_default () -
8129  * return:
8130  * parser(in):
8131  * p(in):
8132  */
8133 static PARSER_VARCHAR *
8135 {
8136  PARSER_VARCHAR *q = 0, *r1;
8137 
8138  if (p->info.data_default.shared == PT_SHARED)
8139  {
8140  q = pt_append_nulstring (parser, q, " shared ");
8141  }
8142  else if (p->info.data_default.shared == PT_DEFAULT)
8143  {
8144  q = pt_append_nulstring (parser, q, " default ");
8145  }
8146 
8147  r1 = pt_print_bytes (parser, p->info.data_default.default_value);
8149  {
8150  q = pt_append_nulstring (parser, q, "(");
8151  q = pt_append_varchar (parser, q, r1);
8152  q = pt_append_nulstring (parser, q, ")");
8153  }
8154  else
8155  {
8156  q = pt_append_varchar (parser, q, r1);
8157  }
8158 
8159  return q;
8160 }
8161 
8162 /* DATA_TYPE */
8163 /*
8164  * pt_apply_datatype () -
8165  * return:
8166  * parser(in):
8167  * p(in):
8168  * g(in):
8169  * arg(in):
8170  */
8171 static PT_NODE *
8172 pt_apply_datatype (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
8173 {
8174  PT_APPLY_WALK (parser, p->info.data_type.entity, arg);
8175  PT_APPLY_WALK (parser, p->info.data_type.virt_data_type, arg);
8176  PT_APPLY_WALK (parser, p->info.data_type.enumeration, arg);
8177  return p;
8178 }
8179 
8180 /*
8181  * pt_init_datatype () -
8182  * return:
8183  * p(in):
8184  */
8185 static PT_NODE *
8187 {
8191  return p;
8192 }
8193 
8194 /*
8195  * pt_print_datatype () -
8196  * return:
8197  * parser(in):
8198  * p(in):
8199  */
8200 static PARSER_VARCHAR *
8202 {
8203  PARSER_VARCHAR *q = NULL;
8204  PARSER_VARCHAR *r1 = NULL;
8205  char buf[PT_MEMB_BUF_SIZE];
8206  bool show_collation = false;
8207 
8208  switch (p->type_enum)
8209  {
8210  case PT_TYPE_OBJECT:
8211  r1 = pt_print_bytes (parser, p->info.data_type.entity);
8212  if (p->info.data_type.entity)
8213  {
8214  q = pt_append_varchar (parser, q, r1);
8215  }
8216  else
8217  {
8218  q = pt_append_nulstring (parser, q, "object");
8219  }
8220  break;
8221 
8222  case PT_TYPE_NUMERIC:
8223  q = pt_append_nulstring (parser, q, pt_show_type_enum (p->type_enum));
8224  if (p->info.data_type.precision != 15 || p->info.data_type.dec_precision != 0)
8225  {
8226  sprintf (buf, "(%d,%d)", p->info.data_type.precision, p->info.data_type.dec_precision);
8227  q = pt_append_nulstring (parser, q, buf);
8228  }
8229  break;
8230  case PT_TYPE_NCHAR:
8231  case PT_TYPE_VARNCHAR:
8232  case PT_TYPE_CHAR:
8233  case PT_TYPE_VARCHAR:
8234  show_collation = true;
8235  /* FALLTHRU */
8236  case PT_TYPE_BIT:
8237  case PT_TYPE_VARBIT:
8238  case PT_TYPE_FLOAT:
8239  {
8240  bool show_precision;
8241  int precision;
8242 
8243  q = pt_append_nulstring (parser, q, pt_show_type_enum (p->type_enum));
8244 
8245  precision = p->info.data_type.precision;
8246  switch (p->type_enum)
8247  {
8248  case PT_TYPE_CHAR:
8249  case PT_TYPE_NCHAR:
8250  case PT_TYPE_BIT:
8251  /* fixed data type: always show parameter */
8252  show_precision = true;
8253  break;
8254  default:
8255  /* variable data type: only show non-maximum(i.e., default) parameter */
8256  if (precision == TP_FLOATING_PRECISION_VALUE)
8257  {
8258  show_precision = false;
8259  }
8260  else if (p->type_enum == PT_TYPE_VARCHAR)
8261  {
8262  show_precision = (precision != DB_MAX_VARCHAR_PRECISION);
8263  }
8264  else if (p->type_enum == PT_TYPE_VARNCHAR)
8265  {
8266  show_precision = (precision != DB_MAX_VARNCHAR_PRECISION);
8267  }
8268  else if (p->type_enum == PT_TYPE_VARBIT)
8269  {
8270  show_precision = (precision != DB_MAX_VARBIT_PRECISION);
8271  }
8272  else
8273  {
8274  show_precision = (precision != 7);
8275  }
8276 
8277  break;
8278  }
8279 
8280  if (show_precision == true)
8281  {
8282  sprintf (buf, "(%d)", precision);
8283  q = pt_append_nulstring (parser, q, buf);
8284  }
8285  }
8286  break;
8287  case PT_TYPE_DOUBLE:
8288  q = pt_append_nulstring (parser, q, pt_show_type_enum (p->type_enum));
8289  break;
8290  case PT_TYPE_ENUMERATION:
8291  q = pt_append_nulstring (parser, q, pt_show_type_enum (p->type_enum));
8292  q = pt_append_nulstring (parser, q, "(");
8293  r1 = pt_print_bytes_l (parser, p->info.data_type.enumeration);
8294  q = pt_append_varchar (parser, q, r1);
8295  q = pt_append_nulstring (parser, q, ")");
8296  show_collation = true;
8297  break;
8298 
8299  case PT_TYPE_SET:
8300  case PT_TYPE_MULTISET:
8301  case PT_TYPE_SEQUENCE:
8302  q = pt_append_nulstring (parser, q, pt_show_type_enum (p->type_enum));
8303 
8304  /* not to print data_type node for SET data types with empty domain */
8306  {
8307  r1 = pt_print_bytes_l (parser, p->data_type);
8308  q = pt_append_nulstring (parser, q, "(");
8309  q = pt_append_varchar (parser, q, r1);
8310  q = pt_append_nulstring (parser, q, ")");
8311  }
8312  break;
8313 
8314  default:
8315  q = pt_append_nulstring (parser, q, pt_show_type_enum (p->type_enum));
8316  if (p->data_type)
8317  {
8318  r1 = pt_print_bytes_l (parser, p->data_type);
8319  q = pt_append_nulstring (parser, q, "(");
8320  q = pt_append_varchar (parser, q, r1);
8321  q = pt_append_nulstring (parser, q, ")");
8322  }
8323  }
8324 
8325  if (show_collation && p->info.data_type.collation_id != LANG_SYS_COLLATION)
8326  {
8327  sprintf (buf, " collate %s", lang_get_collation_name (p->info.data_type.collation_id));
8328  q = pt_append_nulstring (parser, q, buf);
8329  }
8330 
8331  return q;
8332 }
8333 
8334 /* DELETE */
8335 /*
8336  * pt_apply_delete () -
8337  * return:
8338  * parser(in):
8339  * p(in):
8340  * g(in):
8341  * arg(in):
8342  */
8343 static PT_NODE *
8344 pt_apply_delete (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
8345 {
8346  PT_APPLY_WALK (parser, p->info.delete_.with, arg);
8347  PT_APPLY_WALK (parser, p->info.delete_.target_classes, arg);
8348  PT_APPLY_WALK (parser, p->info.delete_.spec, arg);
8349  PT_APPLY_WALK (parser, p->info.delete_.search_cond, arg);
8350  PT_APPLY_WALK (parser, p->info.delete_.using_index, arg);
8351  PT_APPLY_WALK (parser, p->info.delete_.cursor_name, arg);
8352  PT_APPLY_WALK (parser, p->info.delete_.internal_stmts, arg);
8353  PT_APPLY_WALK (parser, p->info.delete_.waitsecs_hint, arg);
8354  PT_APPLY_WALK (parser, p->info.delete_.ordered_hint, arg);
8355  PT_APPLY_WALK (parser, p->info.delete_.use_nl_hint, arg);
8356  PT_APPLY_WALK (parser, p->info.delete_.use_idx_hint, arg);
8357  PT_APPLY_WALK (parser, p->info.delete_.use_merge_hint, arg);
8358  PT_APPLY_WALK (parser, p->info.delete_.limit, arg);
8359 
8360  return p;
8361 }
8362 
8363 /*
8364  * pt_init_delete () -
8365  * return:
8366  * p(in):
8367  */
8368 static PT_NODE *
8370 {
8372  return p;
8373 }
8374 
8375 /*
8376  * pt_print_delete () -
8377  * return:
8378  * parser(in):
8379  * p(in):
8380  */
8381 static PARSER_VARCHAR *
8383 {
8384  PARSER_VARCHAR *q = 0, *r1, *r2;
8385 
8386  r1 = pt_print_bytes_l (parser, p->info.delete_.target_classes);
8387  r2 = pt_print_bytes_spec_list (parser, p->info.delete_.spec);
8388 
8389  if (p->info.delete_.with != NULL)
8390  {
8391  r1 = pt_print_bytes_l (parser, p->info.delete_.with);
8392  q = pt_append_varchar (parser, q, r1);
8393  }
8394 
8395  q = pt_append_nulstring (parser, q, "delete ");
8396  if (p->info.delete_.hint != PT_HINT_NONE)
8397  {
8398  q = pt_append_nulstring (parser, q, "/*+");
8400  {
8401  q = pt_append_nulstring (parser, q, " LOCK_TIMEOUT(");
8402  r1 = pt_print_bytes (parser, p->info.delete_.waitsecs_hint);
8403  q = pt_append_varchar (parser, q, r1);
8404  q = pt_append_nulstring (parser, q, ")");
8405  }
8407  {
8408  q = pt_append_nulstring (parser, q, " NO_LOGGING");
8409  }
8410 
8411  if (p->info.delete_.hint & PT_HINT_ORDERED)
8412  {
8413  /* force join left-to-right */
8414  q = pt_append_nulstring (parser, q, " ORDERED");
8415  if (p->info.delete_.ordered_hint)
8416  {
8417  r1 = pt_print_bytes_l (parser, p->info.delete_.ordered_hint);
8418  q = pt_append_nulstring (parser, q, "(");
8419  q = pt_append_varchar (parser, q, r1);
8420  q = pt_append_nulstring (parser, q, ") ");
8421  }
8422  else
8423  {
8424  q = pt_append_nulstring (parser, q, " ");
8425  }
8426  }
8427 
8428  if (p->info.delete_.hint & PT_HINT_USE_NL)
8429  {
8430  /* force nl-join */
8431  q = pt_append_nulstring (parser, q, " USE_NL");
8432  if (p->info.delete_.use_nl_hint)
8433  {
8434  r1 = pt_print_bytes_l (parser, p->info.delete_.use_nl_hint);
8435  q = pt_append_nulstring (parser, q, "(");
8436  q = pt_append_varchar (parser, q, r1);
8437  q = pt_append_nulstring (parser, q, ") ");
8438  }
8439  else
8440  {
8441  q = pt_append_nulstring (parser, q, " ");
8442  }
8443  }
8444 
8445  if (p->info.delete_.hint & PT_HINT_USE_IDX)
8446  {
8447  /* force idx-join */
8448  q = pt_append_nulstring (parser, q, " USE_IDX");
8449  if (p->info.delete_.use_idx_hint)
8450  {
8451  r1 = pt_print_bytes_l (parser, p->info.delete_.use_idx_hint);
8452  q = pt_append_nulstring (parser, q, "(");
8453  q = pt_append_varchar (parser, q, r1);
8454  q = pt_append_nulstring (parser, q, ") ");
8455  }
8456  else
8457  {
8458  q = pt_append_nulstring (parser, q, " ");
8459  }
8460  }
8461 
8463  {
8464  /* force merge-join */
8465  q = pt_append_nulstring (parser, q, " USE_MERGE");
8466  if (p->info.delete_.use_merge_hint)
8467  {
8468  r1 = pt_print_bytes_l (parser, p->info.delete_.use_merge_hint);
8469  q = pt_append_nulstring (parser, q, "(");
8470  q = pt_append_varchar (parser, q, r1);
8471  q = pt_append_nulstring (parser, q, ") ");
8472  }
8473  else
8474  {
8475  q = pt_append_nulstring (parser, q, " ");
8476  }
8477  }
8478 
8480  {
8481  q = pt_append_nulstring (parser, q, " USE_DESC_IDX ");
8482  }
8483 
8485  {
8486  q = pt_append_nulstring (parser, q, " NO_COVERING_IDX ");
8487  }
8488 
8490  {
8491  q = pt_append_nulstring (parser, q, " NO_DESC_IDX ");
8492  }
8493 
8495  {
8496  q = pt_append_nulstring (parser, q, " NO_MULTI_RANGE_OPT ");
8497  }
8498 
8500  {
8501  q = pt_append_nulstring (parser, q, " NO_SORT_LIMIT ");
8502  }
8503 
8504  if (p->info.delete_.hint & PT_HINT_USE_SBR)
8505  {
8506  q = pt_append_nulstring (parser, q, " USE_SBR ");
8507  }
8508 
8509  q = pt_append_nulstring (parser, q, " */");
8510  }
8511  if (r1)
8512  {
8513  q = pt_append_nulstring (parser, q, " ");
8514  q = pt_append_varchar (parser, q, r1);
8515  }
8516  q = pt_append_nulstring (parser, q, " from ");
8517  q = pt_append_varchar (parser, q, r2);
8518 
8519  if (p->info.delete_.search_cond)
8520  {
8521  r1 = pt_print_and_list (parser, p->info.delete_.search_cond);
8522  q = pt_append_nulstring (parser, q, " where ");
8523  q = pt_append_varchar (parser, q, r1);
8524  }
8525  if (p->info.delete_.using_index)
8526  {
8528  {
8530  {
8531  q = pt_append_nulstring (parser, q, " using index none");
8532  }
8533  else
8534  {
8535  if (p->info.delete_.using_index->etc == (void *) PT_IDX_HINT_CLASS_NONE)
8536  {
8537  r1 = pt_print_bytes_l (parser, p->info.delete_.using_index);
8538  q = pt_append_nulstring (parser, q, " using index ");
8539  q = pt_append_varchar (parser, q, r1);
8540  }
8541  else
8542  {
8543  r1 = pt_print_bytes_l (parser, p->info.delete_.using_index->next);
8544  q = pt_append_nulstring (parser, q, " using index all except ");
8545  q = pt_append_varchar (parser, q, r1);
8546  }
8547  }
8548  }
8549  else
8550  {
8551  r1 = pt_print_bytes_l (parser, p->info.delete_.using_index);
8552  q = pt_append_nulstring (parser, q, " using index ");
8553  q = pt_append_varchar (parser, q, r1);
8554  }
8555  }
8556 
8557  if (p->info.delete_.limit && p->info.delete_.rewrite_limit)
8558  {
8559  r1 = pt_print_bytes_l (parser, p->info.delete_.limit);
8560  q = pt_append_nulstring (parser, q, " limit ");
8561  q = pt_append_varchar (parser, q, r1);
8562  }
8563 
8564  return q;
8565 }
8566 
8567 /* DIFFERENCE */
8568 /*
8569  * pt_apply_difference () -
8570  * return:
8571  * parser(in):
8572  * p(in):
8573  * g(in):
8574  * arg(in):
8575  */
8576 static PT_NODE *
8577 pt_apply_difference (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
8578 {
8579  PT_APPLY_WALK (parser, p->info.query.with, arg);
8580  PT_APPLY_WALK (parser, p->info.query.q.union_.arg1, arg);
8581  PT_APPLY_WALK (parser, p->info.query.q.union_.arg2, arg);
8582  PT_APPLY_WALK (parser, p->info.query.into_list, arg);
8583  PT_APPLY_WALK (parser, p->info.query.order_by, arg);
8584  PT_APPLY_WALK (parser, p->info.query.orderby_for, arg);
8585  return p;
8586 }
8587 
8588 /*
8589  * pt_init_difference () -
8590  * return:
8591  * p(in):
8592  */
8593 static PT_NODE *
8595 {
8597  p->info.query.hint = PT_HINT_NONE;
8599  return p;
8600 }
8601 
8602 /*
8603  * pt_print_difference () -
8604  * return:
8605  * parser(in):
8606  * p(in):
8607  */
8608 static PARSER_VARCHAR *
8610 {
8611  PARSER_VARCHAR *q = NULL, *r1;
8612 
8613  if (p->info.query.with != NULL)
8614  {
8615  r1 = pt_print_bytes_l (parser, p->info.query.with);
8616  q = pt_append_varchar (parser, q, r1);
8617  }
8618 
8619  r1 = pt_print_bytes (parser, p->info.query.q.union_.arg1);
8620  q = pt_append_nulstring (parser, q, "(");
8621  q = pt_append_varchar (parser, q, r1);
8622  q = pt_append_nulstring (parser, q, " except ");
8623 
8624  if (p->info.query.all_distinct == PT_ALL)
8625  {
8626  q = pt_append_nulstring (parser, q, "all ");
8627  }
8628 
8629  r1 = pt_print_bytes (parser, p->info.query.q.union_.arg2);
8630  q = pt_append_varchar (parser, q, r1);
8631  q = pt_append_nulstring (parser, q, ")");
8632 
8633  if (p->info.query.order_by)
8634  {
8635  r1 = pt_print_bytes_l (parser, p->info.query.order_by);
8636  q = pt_append_nulstring (parser, q, " order by ");
8637  q = pt_append_varchar (parser, q, r1);
8638  }
8639 
8640  if (p->info.query.orderby_for)
8641  {
8642  r1 = pt_print_bytes_l (parser, p->info.query.orderby_for);
8643  q = pt_append_nulstring (parser, q, " for ");
8644  q = pt_append_varchar (parser, q, r1);
8645  }
8646 
8647  if (p->info.query.limit && p->info.query.flag.rewrite_limit)
8648  {
8649  r1 = pt_print_bytes_l (parser, p->info.query.limit);
8650  q = pt_append_nulstring (parser, q, " limit ");
8651  q = pt_append_varchar (parser, q, r1);
8652  }
8653  return q;
8654 }
8655 
8656 /* DOT */
8657 /*
8658  * pt_apply_dot () -
8659  * return:
8660  * parser(in):
8661  * p(in):
8662  * g(in):
8663  * arg(in):
8664  */
8665 static PT_NODE *
8666 pt_apply_dot (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
8667 {
8668  PT_APPLY_WALK (parser, p->info.dot.arg1, arg);
8669  PT_APPLY_WALK (parser, p->info.dot.arg2, arg);
8670  PT_APPLY_WALK (parser, p->info.dot.selector, arg);
8671  return p;
8672 }
8673 
8674 /*
8675  * pt_print_dot () -
8676  * return:
8677  * parser(in):
8678  * p(in):
8679  */
8680 static PARSER_VARCHAR *
8682 {
8683  PARSER_VARCHAR *b = 0, *r1, *r2;
8684 
8685  r1 = pt_print_bytes (parser, p->info.dot.arg1);
8686  r2 = pt_print_bytes (parser, p->info.dot.arg2);
8687 
8688  b = pt_append_varchar (parser, b, r1);
8689  if (r2)
8690  {
8691  b = pt_append_nulstring (parser, b, ".");
8692  b = pt_append_varchar (parser, b, r2);
8693  }
8694 
8695  if ((parser->custom_print & PT_PRINT_ALIAS) && p->alias_print != NULL)
8696  {
8697  b = pt_append_nulstring (parser, b, " as [");
8698  b = pt_append_nulstring (parser, b, p->alias_print);
8699  b = pt_append_nulstring (parser, b, "]");
8700  }
8701 
8702  return b;
8703 }
8704 
8705 /* DROP_ENTITY (not ALTER or VIEW ) */
8706 /*
8707  * pt_apply_drop () -
8708  * return:
8709  * parser(in):
8710  * p(in):
8711  * g(in):
8712  * arg(in):
8713  */
8714 static PT_NODE *
8715 pt_apply_drop (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
8716 {
8717  PT_APPLY_WALK (parser, p->info.drop.spec_list, arg);
8718  PT_APPLY_WALK (parser, p->info.drop.internal_stmts, arg);
8719  return p;
8720 }
8721 
8722 /*
8723  * pt_print_drop () -
8724  * return:
8725  * parser(in):
8726  * p(in):
8727  */
8728 static PARSER_VARCHAR *
8730 {
8731  PARSER_VARCHAR *q = 0, *r1;
8732  unsigned int save_custom = parser->custom_print;
8733 
8735  r1 = pt_print_bytes_l (parser, p->info.drop.spec_list);
8736  parser->custom_print = save_custom;
8737 
8738  q = pt_append_nulstring (parser, q, "drop ");
8739  if (p->info.drop.if_exists)
8740  {
8741  q = pt_append_nulstring (parser, q, "if exists ");
8742  }
8743  q = pt_append_varchar (parser, q, r1);
8745  {
8746  q = pt_append_nulstring (parser, q, " cascade constraints");
8747  }
8748 
8749  return q;
8750 }
8751 
8752 /* DROP_INDEX */
8753 /*
8754  * pt_apply_drop_index () -
8755  * return:
8756  * parser(in):
8757  * p(in):
8758  * g(in):
8759  * arg(in):
8760  */
8761 static PT_NODE *
8762 pt_apply_drop_index (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
8763 {
8764  PT_APPLY_WALK (parser, p->info.index.indexed_class, arg);
8765  PT_APPLY_WALK (parser, p->info.index.column_names, arg);
8766  PT_APPLY_WALK (parser, p->info.index.where, arg);
8767  PT_APPLY_WALK (parser, p->info.index.function_expr, arg);
8768 
8769  return p;
8770 }
8771 
8772 /*
8773  * pt_print_drop_index () -
8774  * return:
8775  * parser(in):
8776  * p(in):
8777  */
8778 static PARSER_VARCHAR *
8780 {
8781  PARSER_VARCHAR *b = 0, *r1, *r2, *r3;
8782  const char *index_name = NULL;
8783  unsigned int saved_cp = parser->custom_print;
8784 
8786 
8787  r1 = pt_print_bytes (parser, p->info.index.indexed_class);
8788  r2 = pt_print_index_columns (parser, p);
8789 
8790  parser->custom_print = saved_cp;
8791 
8792  b = pt_append_nulstring (parser, b, "drop");
8793  if (p->info.index.reverse)
8794  {
8795  b = pt_append_nulstring (parser, b, " reverse");
8796  }
8797  if (p->info.index.unique)
8798  {
8799  b = pt_append_nulstring (parser, b, " unique");
8800  }
8801  b = pt_append_nulstring (parser, b, " index ");
8802  if (p->info.index.index_name)
8803  {
8804  index_name = p->info.index.index_name->info.name.original;
8805  b = pt_append_bytes (parser, b, index_name, strlen (index_name));
8806  }
8807 
8808  assert (r1 != NULL);
8809  b = pt_append_nulstring (parser, b, (index_name ? " on " : "on "));
8810  b = pt_append_varchar (parser, b, r1);
8811 
8812  if (r2)
8813  {
8814  b = pt_append_nulstring (parser, b, " (");
8815  b = pt_append_varchar (parser, b, r2);
8816  b = pt_append_nulstring (parser, b, ") ");
8817  }
8818 
8819  if (p->info.index.where)
8820  {
8821  r3 = pt_print_and_list (parser, p->info.index.where);
8822  b = pt_append_nulstring (parser, b, " where ");
8823  b = pt_append_varchar (parser, b, r3);
8824  }
8825 
8826  return b;
8827 }
8828 
8829 /* DROP_USER */
8830 /*
8831  * pt_apply_drop_user () -
8832  * return:
8833  * parser(in):
8834  * p(in):
8835  * g(in):
8836  * arg(in):
8837  */
8838 static PT_NODE *
8839 pt_apply_drop_user (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
8840 {
8841  PT_APPLY_WALK (parser, p->info.drop_user.user_name, arg);
8842  return p;
8843 }
8844 
8845 /*
8846  * pt_print_drop_user () -
8847  * return:
8848  * parser(in):
8849  * p(in):
8850  */
8851 static PARSER_VARCHAR *
8853 {
8854  PARSER_VARCHAR *b = 0, *r1;
8855 
8856  r1 = pt_print_bytes (parser, p->info.drop_user.user_name);
8857  b = pt_append_nulstring (parser, b, "drop user ");
8858  b = pt_append_varchar (parser, b, r1);
8859 
8860  return b;
8861 }
8862 
8863 /* DROP_TRIGGER */
8864 /*
8865  * pt_apply_drop_trigger () -
8866  * return:
8867  * parser(in):
8868  * p(in):
8869  * g(in):
8870  * arg(in):
8871  */
8872 static PT_NODE *
8874 {
8876  return p;
8877 }
8878 
8879 /*
8880  * pt_print_drop_trigger () -
8881  * return:
8882  * parser(in):
8883  * p(in):
8884  */
8885 static PARSER_VARCHAR *
8887 {
8888  PARSER_VARCHAR *b = NULL, *r1;
8889 
8891  b = pt_append_nulstring (parser, b, "drop trigger ");
8892  b = pt_append_varchar (parser, b, r1);
8893 
8894  return b;
8895 }
8896 
8897 /* DROP_VARIABLE */
8898 /*
8899  * pt_apply_drop_variable () -
8900  * return:
8901  * parser(in):
8902  * p(in):
8903  * g(in):
8904  * arg(in):
8905  */
8906 static PT_NODE *
8908 {
8909  PT_APPLY_WALK (parser, p->info.drop_variable.var_names, arg);
8910  return p;
8911 }
8912 
8913 /*
8914  * pt_print_drop_variable () -
8915  * return:
8916  * parser(in):
8917  * p(in):
8918  */
8919 static PARSER_VARCHAR *
8921 {
8922  PARSER_VARCHAR *b = 0, *r1;
8923 
8924  r1 = pt_print_bytes_l (parser, p->info.drop_variable.var_names);
8925  b = pt_append_nulstring (parser, b, "drop variable ");
8926  b = pt_append_varchar (parser, b, r1);
8927 
8928  return b;
8929 }
8930 
8931 /* SPEC */
8932 /*
8933  * pt_apply_spec () -
8934  * return:
8935  * parser(in):
8936  * p(in):
8937  * g(in):
8938  * arg(in):
8939  */
8940 static PT_NODE *
8941 pt_apply_spec (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
8942 {
8943  PT_APPLY_WALK (parser, p->info.spec.entity_name, arg);
8944  PT_APPLY_WALK (parser, p->info.spec.cte_name, arg);
8945  PT_APPLY_WALK (parser, p->info.spec.cte_pointer, arg);
8946  PT_APPLY_WALK (parser, p->info.spec.except_list, arg);
8947  PT_APPLY_WALK (parser, p->info.spec.derived_table, arg);
8948  PT_APPLY_WALK (parser, p->info.spec.range_var, arg);
8949  PT_APPLY_WALK (parser, p->info.spec.as_attr_list, arg);
8950  PT_APPLY_WALK (parser, p->info.spec.referenced_attrs, arg);
8951  PT_APPLY_WALK (parser, p->info.spec.path_entities, arg);
8952  PT_APPLY_WALK (parser, p->info.spec.path_conjuncts, arg);
8953  PT_APPLY_WALK (parser, p->info.spec.flat_entity_list, arg);
8954  PT_APPLY_WALK (parser, p->info.spec.method_list, arg);
8955  PT_APPLY_WALK (parser, p->info.spec.on_cond, arg);
8956  PT_APPLY_WALK (parser, p->info.spec.partition, arg);
8957  /* PT_APPLY_WALK (parser, p->info.spec.using_cond, arg); -- does not support named columns join */
8958 
8959  return p;
8960 }
8961 
8962 /*
8963  * pt_init_spec () -
8964  * return:
8965  * p(in):
8966  */
8967 static PT_NODE *
8969 {
8970  p->info.spec.only_all = PT_ONLY;
8971  p->info.spec.location = -1;
8974  return p;
8975 }
8976 
8977 /*
8978  * pt_print_spec () -
8979  * return:
8980  * parser(in):
8981  * p(in):
8982  */
8983 static PARSER_VARCHAR *
8985 {
8986  PARSER_VARCHAR *q = 0, *r1;
8987  unsigned int save_custom;
8988 
8989  if (p->info.spec.natural)
8990  {
8991  q = pt_append_nulstring (parser, q, " natural ");
8992  }
8993  switch (p->info.spec.join_type)
8994  {
8995  case PT_JOIN_NONE:
8996  break;
8997  case PT_JOIN_CROSS:
8998  q = pt_append_nulstring (parser, q, " cross join ");
8999  break;
9000  /* case PT_JOIN_NATURAL: -- does not support */
9001  case PT_JOIN_INNER:
9002  q = pt_append_nulstring (parser, q, " inner join ");
9003  break;
9004  case PT_JOIN_LEFT_OUTER:
9005  q = pt_append_nulstring (parser, q, " left outer join ");
9006  break;
9007  case PT_JOIN_RIGHT_OUTER:
9008  q = pt_append_nulstring (parser, q, " right outer join ");
9009  break;
9010  case PT_JOIN_FULL_OUTER: /* not used */
9011  q = pt_append_nulstring (parser, q, " full outer join ");
9012  break;
9013  /* case PT_JOIN_UNION: -- does not support */
9014  default:
9015  break;
9016  }
9017 
9018  /* check if a partition pruned SPEC */
9019  if (PT_SPEC_IS_ENTITY (p) && p->flag.partition_pruned)
9020  {
9021  save_custom = parser->custom_print;
9023  q = pt_append_nulstring (parser, q, "(");
9024  r1 = pt_print_bytes_l (parser, p->info.spec.flat_entity_list);
9025  q = pt_append_varchar (parser, q, r1);
9026  q = pt_append_nulstring (parser, q, ")");
9027  parser->custom_print = save_custom;
9028  }
9029  /* check if a sublist */
9030  else if (PT_SPEC_IS_ENTITY (p) && p->info.spec.entity_name->next)
9031  {
9032  save_custom = parser->custom_print;
9034  q = pt_append_nulstring (parser, q, "(");
9035  r1 = pt_print_bytes_l (parser, p->info.spec.entity_name);
9036  q = pt_append_varchar (parser, q, r1);
9037  q = pt_append_nulstring (parser, q, ")");
9038  parser->custom_print = save_custom;
9039  }
9040  /* else is a single class entity spec */
9041  else if (PT_SPEC_IS_ENTITY (p))
9042  {
9043  save_custom = parser->custom_print;
9045  if (p->info.spec.meta_class == PT_META_CLASS)
9046  {
9047  q = pt_append_nulstring (parser, q, " class ");
9048  }
9049  else if (p->info.spec.only_all == PT_ALL)
9050  {
9051  q = pt_append_nulstring (parser, q, " all ");
9052  }
9053  r1 = pt_print_bytes (parser, p->info.spec.entity_name);
9054  q = pt_append_varchar (parser, q, r1);
9055  if (p->info.spec.partition)
9056  {
9057  q = pt_append_nulstring (parser, q, " PARTITION (");
9058  r1 = pt_print_bytes (parser, p->info.spec.partition);
9059  q = pt_append_varchar (parser, q, r1);
9060  q = pt_append_nulstring (parser, q, ")");
9061  }
9062  parser->custom_print = save_custom;
9063  if (p->info.spec.except_list)
9064  {
9065  save_custom = parser->custom_print;
9067  q = pt_append_nulstring (parser, q, " (except ");
9068  r1 = pt_print_bytes_l (parser, p->info.spec.except_list);
9069  q = pt_append_varchar (parser, q, r1);
9070  parser->custom_print = save_custom;
9071  q = pt_append_nulstring (parser, q, ")");
9072  }
9073  }
9074  else if (PT_SPEC_IS_DERIVED (p))
9075  { /* should be a derived table */
9077  {
9078  q = pt_append_nulstring (parser, q, "table");
9079  }
9080  r1 = pt_print_bytes_l (parser, p->info.spec.derived_table);
9081 
9082  if (r1 != NULL)
9083  {
9084  if (p->info.spec.derived_table_type == PT_IS_SUBQUERY && r1->bytes[0] == '('
9085  && r1->bytes[r1->length - 1] == ')')
9086  {
9087  /* skip unnecessary nested parenthesis of derived-query */
9088  q = pt_append_varchar (parser, q, r1);
9089  }
9091  {
9092  q = pt_append_nulstring (parser, q, "(");
9093  q = pt_append_varchar (parser, q, r1);
9094 
9095  unsigned int alias_print_flag = (parser->custom_print & PT_PRINT_ALIAS);
9096  q = pt_append_nulstring (parser, q, " as ");
9097  parser->custom_print &= ~PT_PRINT_ALIAS;
9098  r1 = pt_print_bytes (parser, p->info.spec.range_var);
9099  q = pt_append_varchar (parser, q, r1);
9100  parser->custom_print |= alias_print_flag;
9101 
9102  q = pt_append_nulstring (parser, q, ")");
9103  }
9104  else
9105  {
9106  q = pt_append_nulstring (parser, q, "(");
9107  q = pt_append_varchar (parser, q, r1);
9108  q = pt_append_nulstring (parser, q, ")");
9109  }
9110  }
9111  }
9112 
9114  {
9115  save_custom = parser->custom_print;
9117  parser->custom_print &= ~PT_PRINT_ALIAS;
9119  && p->info.spec.range_var->info.name.original[0])
9120  {
9121  bool insert_with_use_sbr = false;
9122 
9124  {
9125  PT_NODE *cur_stmt = NULL;
9126 
9127  for (int i = 0; i < parser->statement_number; i++)
9128  {
9129  if (parser->statements[i] != NULL)
9130  {
9131  cur_stmt = parser->statements[i];
9132  break;
9133  }
9134  }
9135 
9136  if (cur_stmt->info.insert.hint & PT_HINT_USE_SBR)
9137  {
9138  insert_with_use_sbr = true;
9139  }
9140  }
9141 
9142  if (!insert_with_use_sbr)
9143  {
9144  r1 = pt_print_bytes (parser, p->info.spec.range_var);
9145  q = pt_append_nulstring (parser, q, " ");
9146  q = pt_append_varchar (parser, q, r1);
9147  }
9148  }
9149  parser->custom_print = save_custom;
9150  }
9152  {
9153  save_custom = parser->custom_print;
9155  r1 = pt_print_bytes_l (parser, p->info.spec.as_attr_list);
9156  q = pt_append_nulstring (parser, q, " (");
9157  q = pt_append_varchar (parser, q, r1);
9158  q = pt_append_nulstring (parser, q, ")");
9159  parser->custom_print = save_custom;
9160  }
9161 
9162  if (p->info.spec.on_cond)
9163  {
9164  r1 = pt_print_and_list (parser, p->info.spec.on_cond);
9165  q = pt_append_nulstring (parser, q, " on ");
9166  q = pt_append_varchar (parser, q, r1);
9167  }
9168  if (p->info.spec.using_cond)
9169  {
9170  r1 = pt_print_and_list (parser, p->info.spec.using_cond);
9171  q = pt_append_nulstring (parser, q, " using ");
9172  q = pt_append_varchar (parser, q, r1);
9173  }
9174 
9175  return q;
9176 }
9177 
9178 #if defined (ENABLE_UNUSED_FUNCTION)
9179 /*
9180  * pt_print_class_name () - prints a class name from an entity_spec for
9181  * error messages. prints only the first entity_spec and omits its range var
9182  * return:
9183  * parser(in):
9184  * p(in):
9185  */
9187 pt_print_class_name (PARSER_CONTEXT * parser, PT_NODE * p)
9188 {
9189  PARSER_VARCHAR *q = 0, *r1;
9190 
9191  /* check if a sublist */
9192  if (p->info.spec.entity_name && p->info.spec.entity_name->next)
9193  {
9194  r1 = pt_print_bytes (parser, p->info.spec.entity_name);
9195  q = pt_append_varchar (parser, q, r1);
9196  }
9197  /* else is a single class entity spec */
9198  else if (p->info.spec.entity_name)
9199  {
9200  if (p->info.spec.meta_class == PT_META_CLASS)
9201  {
9202  q = pt_append_nulstring (parser, q, " class ");
9203  }
9204  r1 = pt_print_bytes (parser, p->info.spec.entity_name);
9205  q = pt_append_varchar (parser, q, r1);
9206  }
9207  return q;
9208 }
9209 #endif
9210 
9211 /* EVALUATE */
9212 /*
9213  * pt_apply_evaluate () -
9214  * return:
9215  * parser(in):
9216  * p(in):
9217  * g(in):
9218  * arg(in):
9219  */
9220 static PT_NODE *
9221 pt_apply_evaluate (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
9222 {
9223  PT_APPLY_WALK (parser, p->info.evaluate.expression, arg);
9224  PT_APPLY_WALK (parser, p->info.evaluate.into_var, arg);
9225  return p;
9226 }
9227 
9228 /*
9229  * pt_print_evaluate () -
9230  * return:
9231  * parser(in):
9232  * p(in):
9233  */
9234 static PARSER_VARCHAR *
9236 {
9237  PARSER_VARCHAR *b = NULL, *r1;
9238 
9239  r1 = pt_print_bytes (parser, p->info.evaluate.expression);
9240  b = pt_append_nulstring (parser, b, "evaluate ");
9241  b = pt_append_varchar (parser, b, r1);
9242 
9243  if (p->info.evaluate.into_var)
9244  {
9245  r1 = pt_print_bytes (parser, p->info.evaluate.into_var);
9246  b = pt_append_nulstring (parser, b, " into ");
9247  b = pt_append_varchar (parser, b, r1);
9248  }
9249  return b;
9250 }
9251 
9252 /* EVENT_OBJECT */
9253 /*
9254  * pt_apply_event_object () -
9255  * return:
9256  * parser(in):
9257  * p(in):
9258  * g(in):
9259  * arg(in):
9260  */
9261 static PT_NODE *
9263 {
9264  PT_APPLY_WALK (parser, p->info.event_object.event_object, arg);
9265  PT_APPLY_WALK (parser, p->info.event_object.correlation_name, arg);
9266  return p;
9267 }
9268 
9269 /*
9270  * pt_print_event_object () -
9271  * return:
9272  * parser(in):
9273  * p(in):
9274  */
9275 static PARSER_VARCHAR *
9277 {
9278  PARSER_VARCHAR *b = NULL;
9279  return b;
9280 }
9281 
9282 /* EVENT_SPEC */
9283 /*
9284  * pt_apply_event_spec () -
9285  * return:
9286  * parser(in):
9287  * p(in):
9288  * g(in):
9289  * arg(in):
9290  */
9291 static PT_NODE *
9292 pt_apply_event_spec (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
9293 {
9294  PT_APPLY_WALK (parser, p->info.event_spec.event_target, arg);
9295  return p;
9296 }
9297 
9298 /*
9299  * pt_print_event_spec () -
9300  * return:
9301  * parser(in):
9302  * p(in):
9303  */
9304 static PARSER_VARCHAR *
9306 {
9307  PARSER_VARCHAR *b = NULL, *r1;
9308 
9310 
9311  if (p->info.event_spec.event_target)
9312  {
9313  r1 = pt_print_bytes (parser, p->info.event_spec.event_target);
9314  b = pt_append_varchar (parser, b, r1);
9315  }
9316  return b;
9317 }
9318 
9319 /* EVENT_TARGET */
9320 /*
9321  * pt_apply_event_target () -
9322  * return:
9323  * parser(in):
9324  * p(in):
9325  * g(in):
9326  * arg(in):
9327  */
9328 static PT_NODE *
9330 {
9331  PT_APPLY_WALK (parser, p->info.event_target.class_name, arg);
9332  PT_APPLY_WALK (parser, p->info.event_target.attribute, arg);
9333  return p;
9334 }
9335 
9336 /*
9337  * pt_print_event_target () -
9338  * return:
9339  * parser(in):
9340  * p(in):
9341  */
9342 static PARSER_VARCHAR *
9344 {
9345  PARSER_VARCHAR *b = NULL, *r1;
9346 
9347  r1 = pt_print_bytes (parser, p->info.event_target.class_name);
9348  b = pt_append_nulstring (parser, b, " on ");
9349  b = pt_append_varchar (parser, b, r1);
9350 
9351  if (p->info.event_target.attribute)
9352  {
9353  r1 = pt_print_bytes (parser, p->info.event_target.attribute);
9354  b = pt_append_nulstring (parser, b, "(");
9355  b = pt_append_varchar (parser, b, r1);
9356  b = pt_append_nulstring (parser, b, ")");
9357  }
9358  return b;
9359 }
9360 
9361 /* EXECUTE_TRIGGER */
9362 /*
9363  * pt_apply_execute_trigger () -
9364  * return:
9365  * parser(in):
9366  * p(in):
9367  * g(in):
9368  * arg(in):
9369  */
9370 static PT_NODE *
9372 {
9374  return p;
9375 }
9376 
9377 /*
9378  * pt_print_execute_trigger () -
9379  * return:
9380  * parser(in):
9381  * p(in):
9382  */
9383 static PARSER_VARCHAR *
9385 {
9386  PARSER_VARCHAR *b = NULL, *r1;
9387 
9389  b = pt_append_nulstring (parser, b, "execute deferred trigger ");
9390  b = pt_append_varchar (parser, b, r1);
9391 
9392  return b;
9393 }
9394 
9395 /* EXPR */
9396 /*
9397  * pt_apply_expr () -
9398  * return:
9399  * parser(in):
9400  * p(in):
9401  * g(in):
9402  * arg(in):
9403  */
9404 static PT_NODE *
9405 pt_apply_expr (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
9406 {
9407  PT_APPLY_WALK (parser, p->info.expr.arg1, arg);
9408  PT_APPLY_WALK (parser, p->info.expr.arg2, arg);
9409  PT_APPLY_WALK (parser, p->info.expr.value, arg);
9410  PT_APPLY_WALK (parser, p->info.expr.arg3, arg);
9411 
9412  /* walk cast type in case it might contain a name */
9413  PT_APPLY_WALK (parser, p->info.expr.cast_type, arg);
9414 
9415  return p;
9416 }
9417 
9418 /*
9419  * pt_init_expr () -
9420  * return:
9421  * p(in):
9422  */
9423 static PT_NODE *
9425 {
9427 
9428  return p;
9429 }
9430 
9431 static void
9433 {
9434  const char *op1 = NULL, *op2 = NULL;
9435  PARSER_VARCHAR *rhs1 = NULL, *rhs2 = NULL;
9436 
9437  switch (t->info.expr.op)
9438  {
9439  case PT_BETWEEN_GE_LE:
9440  op1 = pt_show_binopcode (PT_GE);
9441  op2 = pt_show_binopcode (PT_LE);
9442  break;
9443  case PT_BETWEEN_GE_LT:
9444  op1 = pt_show_binopcode (PT_GE);
9445  op2 = pt_show_binopcode (PT_LT);
9446  break;
9447  case PT_BETWEEN_GT_LE:
9448  op1 = pt_show_binopcode (PT_GT);
9449  op2 = pt_show_binopcode (PT_LE);
9450  break;
9451  case PT_BETWEEN_GT_LT:
9452  op1 = pt_show_binopcode (PT_GT);
9453  op2 = pt_show_binopcode (PT_LT);
9454  break;
9455  case PT_BETWEEN_EQ_NA:
9456  op1 = pt_show_binopcode (PT_EQ);
9457  break;
9458  case PT_BETWEEN_INF_LE:
9459  op1 = pt_show_binopcode (PT_LE);
9460  break;
9461  case PT_BETWEEN_INF_LT:
9462  op1 = pt_show_binopcode (PT_LT);
9463  break;
9464  case PT_BETWEEN_GT_INF:
9465  op1 = pt_show_binopcode (PT_GT);
9466  break;
9467  case PT_BETWEEN_GE_INF:
9468  op1 = pt_show_binopcode (PT_GE);
9469  break;
9470 
9471  default:
9472  assert (false);
9473  return;
9474  }
9475 
9476  rhs1 = pt_print_bytes (parser, t->info.expr.arg1);
9477  if (op2)
9478  {
9479  rhs2 = pt_print_bytes (parser, t->info.expr.arg2);
9480  }
9481 
9482  if (lhs && rhs1)
9483  {
9484  strcat_with_realloc (sb, (const char *) lhs->bytes);
9485  strcat_with_realloc (sb, (char *) op1);
9486  strcat_with_realloc (sb, (const char *) rhs1->bytes);
9487 
9488  if (rhs2)
9489  {
9490  strcat_with_realloc (sb, " and ");
9491  strcat_with_realloc (sb, (const char *) lhs->bytes);
9492  strcat_with_realloc (sb, (char *) op2);
9493  strcat_with_realloc (sb, (const char *) rhs2->bytes);
9494  }
9495  }
9496 }
9497 
9498 /*
9499  * pt_print_expr () -
9500  * return:
9501  * parser(in):
9502  * p(in):
9503  */
9504 static PARSER_VARCHAR *
9506 {
9507  PARSER_VARCHAR *q = 0, *r1, *r2, *r3, *r4;
9508  PT_NODE *t, *or_next;
9509  int print_from = 0;
9510  PT_NODE *arg3;
9511  PT_NODE *between, *between_ge_lt;
9512 
9513  assert_release (p != p->info.expr.arg1);
9514  assert_release (p != p->info.expr.arg2);
9515  assert_release (p != p->info.expr.arg3);
9516 
9517  if (p->info.expr.paren_type == 1)
9518  {
9519  q = pt_append_nulstring (parser, q, "(");
9520  }
9521 
9522  switch (p->info.expr.op)
9523  {
9524  case PT_FUNCTION_HOLDER:
9525  /* FUNCTION_HOLDER has a PT_FUNCTION on arg1 */
9526  q = pt_print_function (parser, p->info.expr.arg1);
9527  break;
9528  case PT_UNARY_MINUS:
9529  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9530  q = pt_append_nulstring (parser, q, "-");
9531  q = pt_append_varchar (parser, q, r1);
9532  break;
9533  case PT_BIT_NOT:
9534  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9535  q = pt_append_nulstring (parser, q, "~");
9536  q = pt_append_varchar (parser, q, r1);
9537  break;
9538  case PT_BIT_COUNT:
9539  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9540  q = pt_append_nulstring (parser, q, " bit_count(");
9541  q = pt_append_varchar (parser, q, r1);
9542  q = pt_append_nulstring (parser, q, ")");
9543  break;
9544  case PT_PRIOR:
9545  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9546  q = pt_append_nulstring (parser, q, " prior ");
9547  q = pt_append_varchar (parser, q, r1);
9548  break;
9549  case PT_CONNECT_BY_ROOT:
9550  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9551  q = pt_append_nulstring (parser, q, " connect_by_root ");
9552  q = pt_append_varchar (parser, q, r1);
9553  break;
9554  case PT_QPRIOR:
9555  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9556  q = pt_append_nulstring (parser, q, " prior ");
9557  q = pt_append_varchar (parser, q, r1);
9558  break;
9559  case PT_NOT:
9560  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9561  q = pt_append_nulstring (parser, q, " not ");
9562  q = pt_append_varchar (parser, q, r1);
9563  break;
9564  case PT_EXISTS:
9565  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9566  q = pt_append_nulstring (parser, q, " exists ");
9567  q = pt_append_varchar (parser, q, r1);
9568  break;
9569  case PT_MODULUS:
9570  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9571  r2 = pt_print_bytes (parser, p->info.expr.arg2);
9572  q = pt_append_nulstring (parser, q, " mod(");
9573  q = pt_append_varchar (parser, q, r1);
9574  q = pt_append_nulstring (parser, q, ", ");
9575  q = pt_append_varchar (parser, q, r2);
9576  q = pt_append_nulstring (parser, q, ")");
9577  break;
9578  case PT_RAND:
9579  q = pt_append_nulstring (parser, q, " rand(");
9580  if (p->info.expr.arg1 != NULL)
9581  {
9582  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9583  q = pt_append_varchar (parser, q, r1);
9584  }
9585  q = pt_append_nulstring (parser, q, ")");
9586  break;
9587  case PT_DRAND:
9588  q = pt_append_nulstring (parser, q, " drand(");
9589  if (p->info.expr.arg1 != NULL)
9590  {
9591  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9592  q = pt_append_varchar (parser, q, r1);
9593  }
9594  q = pt_append_nulstring (parser, q, ")");
9595  break;
9596  case PT_RANDOM:
9597  q = pt_append_nulstring (parser, q, " random(");
9598  if (p->info.expr.arg1 != NULL)
9599  {
9600  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9601  q = pt_append_varchar (parser, q, r1);
9602  }
9603  q = pt_append_nulstring (parser, q, ")");
9604  break;
9605  case PT_DRANDOM:
9606  q = pt_append_nulstring (parser, q, " drandom(");
9607  if (p->info.expr.arg1 != NULL)
9608  {
9609  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9610  q = pt_append_varchar (parser, q, r1);
9611  }
9612  q = pt_append_nulstring (parser, q, ")");
9613  break;
9614  case PT_FLOOR:
9615  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9616  q = pt_append_nulstring (parser, q, " floor(");
9617  q = pt_append_varchar (parser, q, r1);
9618  q = pt_append_nulstring (parser, q, ")");
9619  break;
9620  case PT_CEIL:
9621  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9622  q = pt_append_nulstring (parser, q, " ceil(");
9623  q = pt_append_varchar (parser, q, r1);
9624  q = pt_append_nulstring (parser, q, ")");
9625  break;
9626  case PT_SIGN:
9627  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9628  q = pt_append_nulstring (parser, q, " sign(");
9629  q = pt_append_varchar (parser, q, r1);
9630  q = pt_append_nulstring (parser, q, ")");
9631  break;
9632  case PT_ABS:
9633  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9634  q = pt_append_nulstring (parser, q, " abs(");
9635  q = pt_append_varchar (parser, q, r1);
9636  q = pt_append_nulstring (parser, q, ")");
9637  break;
9638  case PT_POWER:
9639  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9640  r2 = pt_print_bytes (parser, p->info.expr.arg2);
9641  q = pt_append_nulstring (parser, q, " power(");
9642  q = pt_append_varchar (parser, q, r1);
9643  q = pt_append_nulstring (parser, q, ", ");
9644  q = pt_append_varchar (parser, q, r2);
9645  q = pt_append_nulstring (parser, q, ")");
9646  break;
9647  case PT_ROUND:
9648  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9649  r2 = pt_print_bytes (parser, p->info.expr.arg2);
9650  q = pt_append_nulstring (parser, q, " round(");
9651  q = pt_append_varchar (parser, q, r1);
9652  if (p->info.expr.arg2 != NULL)
9653  {
9654  q = pt_append_nulstring (parser, q, ", ");
9655  q = pt_append_varchar (parser, q, r2);
9656  }
9657  q = pt_append_nulstring (parser, q, ")");
9658  break;
9659  case PT_LOG:
9660  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9661  r2 = pt_print_bytes (parser, p->info.expr.arg2);
9662  q = pt_append_nulstring (parser, q, " log(");
9663  q = pt_append_varchar (parser, q, r1);
9664  q = pt_append_nulstring (parser, q, ", ");
9665  q = pt_append_varchar (parser, q, r2);
9666  q = pt_append_nulstring (parser, q, ")");
9667  break;
9668  case PT_EXP:
9669  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9670  q = pt_append_nulstring (parser, q, " exp(");
9671  q = pt_append_varchar (parser, q, r1);
9672  q = pt_append_nulstring (parser, q, ")");
9673  break;
9674  case PT_SQRT:
9675  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9676  q = pt_append_nulstring (parser, q, " sqrt(");
9677  q = pt_append_varchar (parser, q, r1);
9678  q = pt_append_nulstring (parser, q, ")");
9679  break;
9680  case PT_TRUNC:
9681  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9682  r2 = pt_print_bytes (parser, p->info.expr.arg2);
9683  q = pt_append_nulstring (parser, q, " trunc(");
9684  q = pt_append_varchar (parser, q, r1);
9685  if (p->info.expr.arg2 != NULL)
9686  {
9687  q = pt_append_nulstring (parser, q, ", ");
9688  q = pt_append_varchar (parser, q, r2);
9689  }
9690  q = pt_append_nulstring (parser, q, ")");
9691  break;
9692  case PT_CHR:
9693  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9694  q = pt_append_nulstring (parser, q, " chr(");
9695  q = pt_append_varchar (parser, q, r1);
9696  if (p->info.expr.arg2 != NULL && p->info.expr.arg2->node_type == PT_VALUE)
9697  {
9698  q = pt_append_nulstring (parser, q, " using ");
9700  }
9701  q = pt_append_nulstring (parser, q, ")");
9702  break;
9703  case PT_INSTR:
9704  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9705  r2 = pt_print_bytes (parser, p->info.expr.arg2);
9706  q = pt_append_nulstring (parser, q, " instr(");
9707  q = pt_append_varchar (parser, q, r1);
9708  q = pt_append_nulstring (parser, q, ", ");
9709  q = pt_append_varchar (parser, q, r2);
9710  if (p->info.expr.arg3 != NULL)
9711  {
9712  q = pt_append_nulstring (parser, q, ", ");
9713  r3 = pt_print_bytes (parser, p->info.expr.arg3);
9714  q = pt_append_varchar (parser, q, r3);
9715  }
9716  q = pt_append_nulstring (parser, q, ")");
9717  break;
9718  case PT_POSITION:
9719  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9720  r2 = pt_print_bytes (parser, p->info.expr.arg2);
9721  q = pt_append_nulstring (parser, q, " position(");
9722  q = pt_append_varchar (parser, q, r1);
9723  q = pt_append_nulstring (parser, q, " in ");
9724  q = pt_append_varchar (parser, q, r2);
9725  q = pt_append_nulstring (parser, q, ")");
9726  break;
9727  case PT_FINDINSET:
9728  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9729  r2 = pt_print_bytes (parser, p->info.expr.arg2);
9730  q = pt_append_nulstring (parser, q, " find_in_set(");
9731  q = pt_append_varchar (parser, q, r1);
9732  q = pt_append_nulstring (parser, q, ", ");
9733  q = pt_append_varchar (parser, q, r2);
9734  q = pt_append_nulstring (parser, q, ")");
9735  break;
9736  case PT_SUBSTRING:
9737  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9738  r2 = pt_print_bytes (parser, p->info.expr.arg2);
9739  if (p->info.expr.qualifier == PT_SUBSTR_ORG)
9740  {
9741  q = pt_append_nulstring (parser, q, " substring(");
9742  q = pt_append_varchar (parser, q, r1);
9743  q = pt_append_nulstring (parser, q, " from ");
9744  q = pt_append_varchar (parser, q, r2);
9745  if (p->info.expr.arg3)
9746  {
9747  r1 = pt_print_bytes (parser, p->info.expr.arg3);
9748  q = pt_append_nulstring (parser, q, " for ");
9749  q = pt_append_varchar (parser, q, r1);
9750  }
9751  q = pt_append_nulstring (parser, q, ")");
9752  }
9753  else if (p->info.expr.qualifier == PT_SUBSTR)
9754  {
9755  q = pt_append_nulstring (parser, q, " substr(");
9756  q = pt_append_varchar (parser, q, r1);
9757  q = pt_append_nulstring (parser, q, ", ");
9758  q = pt_append_varchar (parser, q, r2);
9759  if (p->info.expr.arg3)
9760  {
9761  r1 = pt_print_bytes (parser, p->info.expr.arg3);
9762  q = pt_append_nulstring (parser, q, ", ");
9763  q = pt_append_varchar (parser, q, r1);
9764  }
9765  q = pt_append_nulstring (parser, q, ")");
9766  }
9767  break;
9768  case PT_SUBSTRING_INDEX:
9769  q = pt_append_nulstring (parser, q, "substring_index(");
9770  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9771  q = pt_append_varchar (parser, q, r1);
9772  q = pt_append_nulstring (parser, q, ", ");
9773  r2 = pt_print_bytes (parser, p->info.expr.arg2);
9774  q = pt_append_varchar (parser, q, r2);
9775  q = pt_append_nulstring (parser, q, ", ");
9776  r3 = pt_print_bytes (parser, p->info.expr.arg3);
9777  q = pt_append_varchar (parser, q, r3);
9778  q = pt_append_nulstring (parser, q, ")");
9779  break;
9780  case PT_OCTET_LENGTH:
9781  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9782  q = pt_append_nulstring (parser, q, " octet_length(");
9783  q = pt_append_varchar (parser, q, r1);
9784  q = pt_append_nulstring (parser, q, ")");
9785  break;
9786  case PT_BIT_LENGTH:
9787  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9788  q = pt_append_nulstring (parser, q, " bit_length(");
9789  q = pt_append_varchar (parser, q, r1);
9790  q = pt_append_nulstring (parser, q, ")");
9791  break;
9792  case PT_CHAR_LENGTH:
9793  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9794  q = pt_append_nulstring (parser, q, " char_length(");
9795  q = pt_append_varchar (parser, q, r1);
9796  q = pt_append_nulstring (parser, q, ")");
9797  break;
9798 
9799  case PT_LOWER:
9800  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9801  q = pt_append_nulstring (parser, q, " lower(");
9802  q = pt_append_varchar (parser, q, r1);
9803  q = pt_append_nulstring (parser, q, ")");
9804  break;
9805  case PT_UPPER:
9806  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9807  q = pt_append_nulstring (parser, q, " upper(");
9808  q = pt_append_varchar (parser, q, r1);
9809  q = pt_append_nulstring (parser, q, ")");
9810  break;
9811  case PT_HEX:
9812  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9813  q = pt_append_nulstring (parser, q, " hex(");
9814  q = pt_append_varchar (parser, q, r1);
9815  q = pt_append_nulstring (parser, q, ")");
9816  break;
9817  case PT_ASCII:
9818  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9819  q = pt_append_nulstring (parser, q, " ascii(");
9820  q = pt_append_varchar (parser, q, r1);
9821  q = pt_append_nulstring (parser, q, ")");
9822  break;
9823  case PT_CONV:
9824  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9825  r2 = pt_print_bytes (parser, p->info.expr.arg2);
9826  r3 = pt_print_bytes (parser, p->info.expr.arg3);
9827  q = pt_append_nulstring (parser, q, " conv(");
9828  q = pt_append_varchar (parser, q, r1);
9829  q = pt_append_nulstring (parser, q, ", ");
9830  q = pt_append_varchar (parser, q, r2);
9831  q = pt_append_nulstring (parser, q, ", ");
9832  q = pt_append_varchar (parser, q, r3);
9833  q = pt_append_nulstring (parser, q, ")");
9834  break;
9835  case PT_BIN:
9836  q = pt_append_nulstring (parser, q, " bin(");
9837  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9838  q = pt_append_varchar (parser, q, r1);
9839  q = pt_append_nulstring (parser, q, ")");
9840  break;
9841  case PT_MD5:
9842  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9843  q = pt_append_nulstring (parser, q, " md5(");
9844  q = pt_append_varchar (parser, q, r1);
9845  q = pt_append_nulstring (parser, q, ")");
9846  break;
9847  case PT_AES_ENCRYPT:
9848  q = pt_append_nulstring (parser, q, " aes_encrypt(");
9849  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9850  q = pt_append_varchar (parser, q, r1);
9851  q = pt_append_nulstring (parser, q, ", ");
9852  r2 = pt_print_bytes (parser, p->info.expr.arg2);
9853  q = pt_append_varchar (parser, q, r2);
9854  q = pt_append_nulstring (parser, q, ")");
9855  break;
9856  case PT_AES_DECRYPT:
9857  q = pt_append_nulstring (parser, q, " aes_decrypt(");
9858  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9859  q = pt_append_varchar (parser, q, r1);
9860  q = pt_append_nulstring (parser, q, ", ");
9861  r2 = pt_print_bytes (parser, p->info.expr.arg2);
9862  q = pt_append_varchar (parser, q, r2);
9863  q = pt_append_nulstring (parser, q, ")");
9864  break;
9865  case PT_SHA_ONE:
9866  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9867  q = pt_append_nulstring (parser, q, " sha1(");
9868  q = pt_append_varchar (parser, q, r1);
9869  q = pt_append_nulstring (parser, q, ")");
9870  break;
9871  case PT_SHA_TWO:
9872  q = pt_append_nulstring (parser, q, " sha2(");
9873  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9874  q = pt_append_varchar (parser, q, r1);
9875  q = pt_append_nulstring (parser, q, ", ");
9876  r2 = pt_print_bytes (parser, p->info.expr.arg2);
9877  q = pt_append_varchar (parser, q, r2);
9878  q = pt_append_nulstring (parser, q, ")");
9879  break;
9880  case PT_TO_BASE64:
9881  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9882  q = pt_append_nulstring (parser, q, " to_base64(");
9883  q = pt_append_varchar (parser, q, r1);
9884  q = pt_append_nulstring (parser, q, ")");
9885  break;
9886  case PT_FROM_BASE64:
9887  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9888  q = pt_append_nulstring (parser, q, " from_base64(");
9889  q = pt_append_varchar (parser, q, r1);
9890  q = pt_append_nulstring (parser, q, ")");
9891  break;
9892  case PT_EXTRACT:
9893  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9894  q = pt_append_nulstring (parser, q, " extract(");
9895  switch (p->info.expr.qualifier)
9896  {
9897  case PT_YEAR:
9898  q = pt_append_nulstring (parser, q, "year ");
9899  break;
9900  case PT_MONTH:
9901  q = pt_append_nulstring (parser, q, "month ");
9902  break;
9903  case PT_DAY:
9904  q = pt_append_nulstring (parser, q, "day ");
9905  break;
9906  case PT_HOUR:
9907  q = pt_append_nulstring (parser, q, "hour ");
9908  break;
9909  case PT_MINUTE:
9910  q = pt_append_nulstring (parser, q, "minute ");
9911  break;
9912  case PT_SECOND:
9913  q = pt_append_nulstring (parser, q, "second ");
9914  break;
9915  case PT_MILLISECOND:
9916  q = pt_append_nulstring (parser, q, "millisecond ");
9917  break;
9918  default:
9919  break;
9920  }
9921  q = pt_append_nulstring (parser, q, " from ");
9922  q = pt_append_varchar (parser, q, r1);
9923  q = pt_append_nulstring (parser, q, ")");
9924  break;
9925 
9926  case PT_CURRENT_VALUE:
9927  q = pt_append_nulstring (parser, q, "serial_current_value(");
9928  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9929  q = pt_append_varchar (parser, q, r1);
9930  q = pt_append_nulstring (parser, q, ")");
9931  break;
9932 
9933  case PT_NEXT_VALUE:
9934  q = pt_append_nulstring (parser, q, "serial_next_value(");
9935  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9936  q = pt_append_varchar (parser, q, r1);
9937  q = pt_append_nulstring (parser, q, ", ");
9938  r2 = pt_print_bytes (parser, p->info.expr.arg2);
9939  q = pt_append_varchar (parser, q, r2);
9940  q = pt_append_nulstring (parser, q, ")");
9941  break;
9942 
9943  case PT_TO_NUMBER:
9944  q = pt_append_nulstring (parser, q, " to_number(");
9945  r1 = pt_print_bytes (parser, p->info.expr.arg1);
9946  q = pt_append_varchar (parser, q, r1);
9947 
9948  if (p->info.expr.arg2 != NULL)
9949  {
9950  q = pt_append_nulstring (parser, q, ", ");
9951  r1 = pt_print_bytes (parser, p->info.expr.arg2);
9952  q = pt_append_varchar (parser, q, r1);
9953  }
9954  q = pt_append_nulstring (parser, q, ")");
9955  break;
9956 
9957  case PT_TO_DATE:
9958  case PT_TO_TIME:
9959  case PT_TO_TIMESTAMP:
9960  case PT_TO_DATETIME:
9961  case PT_TO_CHAR:
9962  case PT_TO_DATETIME_TZ:
9963  case PT_TO_TIMESTAMP_TZ:
9964  {
9965  int flags;
9966  bool has_user_format = false;
9967  bool has_user_lang = false;
9969 
9970  if (p->info.expr.op == PT_TO_DATE)
9971  {
9972  q = pt_append_nulstring (parser, q, " to_date(");
9973  }
9974  else if (p->info.expr.op == PT_TO_TIME)
9975  {
9976  q = pt_append_nulstring (parser, q, " to_time(");
9977  }
9978  else if (p->info.expr.op == PT_TO_TIMESTAMP)
9979  {
9980  q = pt_append_nulstring (parser, q, " to_timestamp(");
9981  }
9982  else if (p->info.expr.op == PT_TO_DATETIME)
9983  {
9984  q = pt_append_nulstring (parser, q, " to_datetime(");
9985  }
9986  else if (p->info.expr.op == PT_TO_CHAR)
9987  {
9988  q = pt_append_nulstring (parser, q, " to_char(");
9989  }
9990  else if (p->info.expr.op == PT_TO_DATETIME_TZ)
9991  {
9992  q = pt_append_nulstring (parser, q, " to_datetime_tz(");
9993  }
9994  else if (p->info.expr.op == PT_TO_TIMESTAMP_TZ)
9995  {
9996  q = pt_append_nulstring (parser, q, " to_timestamp_tz(");
9997  }
9998  else
9999  {
10000  assert (false);
10001  }
10002 
10003  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10004  q = pt_append_varchar (parser, q, r1);
10005 
10006  flags = p->info.expr.arg3->info.value.data_value.i;
10007  lang_id = lang_get_lang_id_from_flag (flags, &has_user_format, &has_user_lang);
10008  if (has_user_format)
10009  {
10010  const char *lang_name = lang_get_lang_name_from_id (lang_id);
10011 
10012  q = pt_append_nulstring (parser, q, ", ");
10013  r1 = pt_print_bytes (parser, p->info.expr.arg2);
10014  q = pt_append_varchar (parser, q, r1);
10015 
10016  if (lang_name != NULL && has_user_lang)
10017  {
10018  q = pt_append_nulstring (parser, q, ", '");
10019  q = pt_append_nulstring (parser, q, lang_name);
10020  q = pt_append_nulstring (parser, q, "'");
10021  }
10022  }
10023  q = pt_append_nulstring (parser, q, ")");
10024  }
10025  break;
10026 
10027  case PT_SYS_DATE:
10028  q = pt_append_nulstring (parser, q, " SYS_DATE ");
10029  break;
10030 
10031  case PT_CURRENT_DATE:
10032  q = pt_append_nulstring (parser, q, " CURRENT_DATE ");
10033  break;
10034 
10035  case PT_SYS_TIME:
10036  q = pt_append_nulstring (parser, q, " SYS_TIME ");
10037  break;
10038 
10039  case PT_CURRENT_TIME:
10040  q = pt_append_nulstring (parser, q, " CURRENT_TIME ");
10041  break;
10042 
10043  case PT_SYS_TIMESTAMP:
10044  q = pt_append_nulstring (parser, q, " SYS_TIMESTAMP ");
10045  break;
10046 
10047  case PT_CURRENT_TIMESTAMP:
10048  q = pt_append_nulstring (parser, q, " CURRENT_TIMESTAMP ");
10049  break;
10050 
10051  case PT_SYS_DATETIME:
10052  q = pt_append_nulstring (parser, q, " SYS_DATETIME ");
10053  break;
10054 
10055  case PT_CURRENT_DATETIME:
10056  q = pt_append_nulstring (parser, q, " CURRENT_DATETIME ");
10057  break;
10058  case PT_UTC_TIME:
10059  q = pt_append_nulstring (parser, q, " utc_time() ");
10060  break;
10061 
10062  case PT_UTC_DATE:
10063  q = pt_append_nulstring (parser, q, " utc_date() ");
10064  break;
10065 
10066  case PT_CURRENT_USER:
10067  q = pt_append_nulstring (parser, q, " CURRENT_USER ");
10068  break;
10069 
10070  case PT_USER:
10071  q = pt_append_nulstring (parser, q, " user() ");
10072  break;
10073 
10074  case PT_ROW_COUNT:
10075  q = pt_append_nulstring (parser, q, " row_count() ");
10076  break;
10077 
10078  case PT_LAST_INSERT_ID:
10079  q = pt_append_nulstring (parser, q, " last_insert_id() ");
10080  break;
10081 
10082  case PT_MONTHS_BETWEEN:
10083  q = pt_append_nulstring (parser, q, " months_between(");
10084  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10085  q = pt_append_varchar (parser, q, r1);
10086 
10087  q = pt_append_nulstring (parser, q, ", ");
10088  r1 = pt_print_bytes (parser, p->info.expr.arg2);
10089  q = pt_append_varchar (parser, q, r1);
10090  q = pt_append_nulstring (parser, q, ")");
10091  break;
10092 
10093  case PT_ADDDATE:
10094  q = pt_append_nulstring (parser, q, " adddate(");
10095  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10096  q = pt_append_varchar (parser, q, r1);
10097 
10098  q = pt_append_nulstring (parser, q, ", ");
10099  r1 = pt_print_bytes (parser, p->info.expr.arg2);
10100  q = pt_append_varchar (parser, q, r1);
10101  q = pt_append_nulstring (parser, q, ")");
10102  break;
10103 
10104  case PT_SUBDATE:
10105  q = pt_append_nulstring (parser, q, " subdate(");
10106  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10107  q = pt_append_varchar (parser, q, r1);
10108 
10109  q = pt_append_nulstring (parser, q, ", ");
10110  r1 = pt_print_bytes (parser, p->info.expr.arg2);
10111  q = pt_append_varchar (parser, q, r1);
10112  q = pt_append_nulstring (parser, q, ")");
10113  break;
10114 
10115  case PT_DATE_ADD:
10116  case PT_DATE_SUB:
10117  if (p->info.expr.op == PT_DATE_ADD)
10118  {
10119  q = pt_append_nulstring (parser, q, " date_add(");
10120  }
10121  else if (p->info.expr.op == PT_DATE_SUB)
10122  {
10123  q = pt_append_nulstring (parser, q, " date_sub(");
10124  }
10125 
10126  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10127  q = pt_append_varchar (parser, q, r1);
10128 
10129  q = pt_append_nulstring (parser, q, ", INTERVAL ");
10130  r1 = pt_print_bytes (parser, p->info.expr.arg2);
10131  q = pt_append_varchar (parser, q, r1);
10132 
10133  switch (p->info.expr.arg3->info.expr.qualifier)
10134  {
10135  case PT_MILLISECOND:
10136  q = pt_append_nulstring (parser, q, " MILLISECOND");
10137  break;
10138 
10139  case PT_SECOND:
10140  q = pt_append_nulstring (parser, q, " SECOND");
10141  break;
10142 
10143  case PT_MINUTE:
10144  q = pt_append_nulstring (parser, q, " MINUTE");
10145  break;
10146 
10147  case PT_HOUR:
10148  q = pt_append_nulstring (parser, q, " HOUR");
10149  break;
10150 
10151  case PT_DAY:
10152  q = pt_append_nulstring (parser, q, " DAY");
10153  break;
10154 
10155  case PT_WEEK:
10156  q = pt_append_nulstring (parser, q, " WEEK");
10157  break;
10158 
10159  case PT_MONTH:
10160  q = pt_append_nulstring (parser, q, " MONTH");
10161  break;
10162 
10163  case PT_QUARTER:
10164  q = pt_append_nulstring (parser, q, " QUARTER");
10165  break;
10166 
10167  case PT_YEAR:
10168  q = pt_append_nulstring (parser, q, " YEAR");
10169  break;
10170 
10171  case PT_SECOND_MILLISECOND:
10172  q = pt_append_nulstring (parser, q, " SECOND_MILLISECOND");
10173  break;
10174 
10175  case PT_MINUTE_MILLISECOND:
10176  q = pt_append_nulstring (parser, q, " MINUTE_MILLISECOND");
10177  break;
10178 
10179  case PT_MINUTE_SECOND:
10180  q = pt_append_nulstring (parser, q, " MINUTE_SECOND");
10181  break;
10182 
10183  case PT_HOUR_MILLISECOND:
10184  q = pt_append_nulstring (parser, q, " HOUR_MILLISECOND");
10185  break;
10186 
10187  case PT_HOUR_SECOND:
10188  q = pt_append_nulstring (parser, q, " HOUR_SECOND");
10189  break;
10190 
10191  case PT_HOUR_MINUTE:
10192  q = pt_append_nulstring (parser, q, " HOUR_MINUTE");
10193  break;
10194 
10195  case PT_DAY_MILLISECOND:
10196  q = pt_append_nulstring (parser, q, " DAY_MILLISECOND");
10197  break;
10198 
10199  case PT_DAY_SECOND:
10200  q = pt_append_nulstring (parser, q, " DAY_SECOND");
10201  break;
10202 
10203  case PT_DAY_MINUTE:
10204  q = pt_append_nulstring (parser, q, " DAY_MINUTE");
10205  break;
10206 
10207  case PT_DAY_HOUR:
10208  q = pt_append_nulstring (parser, q, " DAY_HOUR");
10209  break;
10210 
10211  case PT_YEAR_MONTH:
10212  q = pt_append_nulstring (parser, q, " YEAR_MONTH");
10213  break;
10214 
10215  default:
10216  break;
10217  }
10218 
10219  q = pt_append_nulstring (parser, q, ")");
10220  break;
10221 
10222  case PT_ATAN:
10223  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10224  q = pt_append_nulstring (parser, q, " atan(");
10225  q = pt_append_varchar (parser, q, r1);
10226  q = pt_append_nulstring (parser, q, ")");
10227  break;
10228 
10229  case PT_ATAN2:
10230  q = pt_append_nulstring (parser, q, " atan2(");
10231  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10232  q = pt_append_varchar (parser, q, r1);
10233  q = pt_append_nulstring (parser, q, ", ");
10234  r1 = pt_print_bytes (parser, p->info.expr.arg2);
10235  q = pt_append_varchar (parser, q, r1);
10236  q = pt_append_nulstring (parser, q, ")");
10237  break;
10238 
10239  case PT_FORMAT:
10240  q = pt_append_nulstring (parser, q, " format(");
10241  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10242  q = pt_append_varchar (parser, q, r1);
10243 
10244  q = pt_append_nulstring (parser, q, ", ");
10245  r1 = pt_print_bytes (parser, p->info.expr.arg2);
10246  q = pt_append_varchar (parser, q, r1);
10247  q = pt_append_nulstring (parser, q, ")");
10248  break;
10249 
10250  case PT_DATE_FORMAT:
10251  q = pt_append_nulstring (parser, q, " date_format(");
10252  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10253  q = pt_append_varchar (parser, q, r1);
10254 
10255  q = pt_append_nulstring (parser, q, ", ");
10256  r1 = pt_print_bytes (parser, p->info.expr.arg2);
10257  q = pt_append_varchar (parser, q, r1);
10258  q = pt_append_nulstring (parser, q, ")");
10259  break;
10260 
10261  case PT_STR_TO_DATE:
10262  q = pt_append_nulstring (parser, q, " str_to_date(");
10263  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10264  q = pt_append_varchar (parser, q, r1);
10265 
10266  q = pt_append_nulstring (parser, q, ", ");
10267  r1 = pt_print_bytes (parser, p->info.expr.arg2);
10268  q = pt_append_varchar (parser, q, r1);
10269  q = pt_append_nulstring (parser, q, ")");
10270  break;
10271 
10272  case PT_LAST_DAY:
10273  q = pt_append_nulstring (parser, q, " last_day(");
10274  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10275  q = pt_append_varchar (parser, q, r1);
10276  q = pt_append_nulstring (parser, q, ")");
10277  break;
10278 
10279  case PT_TIME_FORMAT:
10280  q = pt_append_nulstring (parser, q, " time_format(");
10281  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10282  q = pt_append_varchar (parser, q, r1);
10283  q = pt_append_nulstring (parser, q, ", ");
10284  r2 = pt_print_bytes (parser, p->info.expr.arg2);
10285  q = pt_append_varchar (parser, q, r2);
10286  q = pt_append_nulstring (parser, q, ")");
10287  break;
10288 
10289  case PT_UNIX_TIMESTAMP:
10290  q = pt_append_nulstring (parser, q, " unix_timestamp(");
10291  if (p->info.expr.arg1)
10292  {
10293  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10294  q = pt_append_varchar (parser, q, r1);
10295  }
10296  q = pt_append_nulstring (parser, q, ")");
10297  break;
10298 
10299  case PT_TIMESTAMP:
10300  q = pt_append_nulstring (parser, q, " timestamp(");
10301  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10302  q = pt_append_varchar (parser, q, r1);
10303  if (p->info.expr.arg2)
10304  {
10305  q = pt_append_nulstring (parser, q, ", ");
10306  r2 = pt_print_bytes (parser, p->info.expr.arg2);
10307  q = pt_append_varchar (parser, q, r2);
10308  }
10309  q = pt_append_nulstring (parser, q, ")");
10310  break;
10311 
10312  case PT_YEARF:
10313  q = pt_append_nulstring (parser, q, " year(");
10314  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10315  q = pt_append_varchar (parser, q, r1);
10316  q = pt_append_nulstring (parser, q, ")");
10317  break;
10318 
10319  case PT_MONTHF:
10320  q = pt_append_nulstring (parser, q, " month(");
10321  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10322  q = pt_append_varchar (parser, q, r1);
10323  q = pt_append_nulstring (parser, q, ")");
10324  break;
10325 
10326  case PT_DAYF:
10327  q = pt_append_nulstring (parser, q, " day(");
10328  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10329  q = pt_append_varchar (parser, q, r1);
10330  q = pt_append_nulstring (parser, q, ")");
10331  break;
10332 
10333  case PT_DAYOFMONTH:
10334  q = pt_append_nulstring (parser, q, " dayofmonth(");
10335  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10336  q = pt_append_varchar (parser, q, r1);
10337  q = pt_append_nulstring (parser, q, ")");
10338  break;
10339 
10340  case PT_HOURF:
10341  q = pt_append_nulstring (parser, q, " hour(");
10342  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10343  q = pt_append_varchar (parser, q, r1);
10344  q = pt_append_nulstring (parser, q, ")");
10345  break;
10346 
10347  case PT_MINUTEF:
10348  q = pt_append_nulstring (parser, q, " minute(");
10349  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10350  q = pt_append_varchar (parser, q, r1);
10351  q = pt_append_nulstring (parser, q, ")");
10352  break;
10353 
10354  case PT_SECONDF:
10355  q = pt_append_nulstring (parser, q, " second(");
10356  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10357  q = pt_append_varchar (parser, q, r1);
10358  q = pt_append_nulstring (parser, q, ")");
10359  break;
10360 
10361  case PT_QUARTERF:
10362  q = pt_append_nulstring (parser, q, " quarter(");
10363  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10364  q = pt_append_varchar (parser, q, r1);
10365  q = pt_append_nulstring (parser, q, ")");
10366  break;
10367 
10368  case PT_WEEKDAY:
10369  q = pt_append_nulstring (parser, q, " weekday(");
10370  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10371  q = pt_append_varchar (parser, q, r1);
10372  q = pt_append_nulstring (parser, q, ")");
10373  break;
10374 
10375  case PT_DAYOFWEEK:
10376  q = pt_append_nulstring (parser, q, " dayofweek(");
10377  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10378  q = pt_append_varchar (parser, q, r1);
10379  q = pt_append_nulstring (parser, q, ")");
10380  break;
10381 
10382  case PT_DAYOFYEAR:
10383  q = pt_append_nulstring (parser, q, " dayofyear(");
10384  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10385  q = pt_append_varchar (parser, q, r1);
10386  q = pt_append_nulstring (parser, q, ")");
10387  break;
10388 
10389  case PT_TODAYS:
10390  q = pt_append_nulstring (parser, q, " to_days(");
10391  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10392  q = pt_append_varchar (parser, q, r1);
10393  q = pt_append_nulstring (parser, q, ")");
10394  break;
10395 
10396  case PT_FROMDAYS:
10397  q = pt_append_nulstring (parser, q, " from_days(");
10398  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10399  q = pt_append_varchar (parser, q, r1);
10400  q = pt_append_nulstring (parser, q, ")");
10401  break;
10402 
10403  case PT_TIMETOSEC:
10404  q = pt_append_nulstring (parser, q, " time_to_sec(");
10405  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10406  q = pt_append_varchar (parser, q, r1);
10407  q = pt_append_nulstring (parser, q, ")");
10408  break;
10409 
10410  case PT_SECTOTIME:
10411  q = pt_append_nulstring (parser, q, " sec_to_time(");
10412  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10413  q = pt_append_varchar (parser, q, r1);
10414  q = pt_append_nulstring (parser, q, ")");
10415  break;
10416 
10417  case PT_MAKEDATE:
10418  q = pt_append_nulstring (parser, q, " makedate(");
10419  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10420  q = pt_append_varchar (parser, q, r1);
10421  q = pt_append_nulstring (parser, q, ", ");
10422  r2 = pt_print_bytes (parser, p->info.expr.arg2);
10423  q = pt_append_varchar (parser, q, r2);
10424  q = pt_append_nulstring (parser, q, ")");
10425  break;
10426 
10427  case PT_MAKETIME:
10428  q = pt_append_nulstring (parser, q, " maketime(");
10429  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10430  q = pt_append_varchar (parser, q, r1);
10431  q = pt_append_nulstring (parser, q, ", ");
10432  r2 = pt_print_bytes (parser, p->info.expr.arg2);
10433  q = pt_append_varchar (parser, q, r2);
10434  q = pt_append_nulstring (parser, q, ", ");
10435  r3 = pt_print_bytes (parser, p->info.expr.arg3);
10436  q = pt_append_varchar (parser, q, r3);
10437  q = pt_append_nulstring (parser, q, ")");
10438  break;
10439 
10440  case PT_ADDTIME:
10441  q = pt_append_nulstring (parser, q, " addtime(");
10442  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10443  q = pt_append_varchar (parser, q, r1);
10444  q = pt_append_nulstring (parser, q, ", ");
10445  r2 = pt_print_bytes (parser, p->info.expr.arg2);
10446  q = pt_append_varchar (parser, q, r2);
10447  q = pt_append_nulstring (parser, q, ")");
10448  break;
10449 
10450  case PT_WEEKF:
10451  q = pt_append_nulstring (parser, q, " week(");
10452  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10453  q = pt_append_varchar (parser, q, r1);
10454  q = pt_append_nulstring (parser, q, ", ");
10455  r2 = pt_print_bytes (parser, p->info.expr.arg2);
10456  q = pt_append_varchar (parser, q, r2);
10457  q = pt_append_nulstring (parser, q, ")");
10458  break;
10459 
10460  case PT_ADD_MONTHS:
10461  q = pt_append_nulstring (parser, q, " add_months(");
10462  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10463  q = pt_append_varchar (parser, q, r1);
10464 
10465  q = pt_append_nulstring (parser, q, ", ");
10466  r1 = pt_print_bytes (parser, p->info.expr.arg2);
10467  q = pt_append_varchar (parser, q, r1);
10468  q = pt_append_nulstring (parser, q, ")");
10469  break;
10470 
10472  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10473  r2 = pt_print_bytes (parser, p->info.expr.arg2);
10474  q = pt_append_nulstring (parser, q, " sys_connect_by_path(");
10475  q = pt_append_varchar (parser, q, r1);
10476  q = pt_append_nulstring (parser, q, ", ");
10477  q = pt_append_varchar (parser, q, r2);
10478  q = pt_append_nulstring (parser, q, ")");
10479  break;
10480 
10481  case PT_REPLACE:
10482  q = pt_append_nulstring (parser, q, " replace(");
10483  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10484  q = pt_append_varchar (parser, q, r1);
10485 
10486  q = pt_append_nulstring (parser, q, ", ");
10487  r1 = pt_print_bytes (parser, p->info.expr.arg2);
10488  q = pt_append_varchar (parser, q, r1);
10489 
10490  if (p->info.expr.arg3 != NULL)
10491  {
10492  q = pt_append_nulstring (parser, q, ", ");
10493  r1 = pt_print_bytes (parser, p->info.expr.arg3);
10494  q = pt_append_varchar (parser, q, r1);
10495  }
10496  q = pt_append_nulstring (parser, q, ")");
10497  break;
10498 
10499  case PT_REPEAT:
10500  q = pt_append_nulstring (parser, q, " repeat(");
10501  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10502  q = pt_append_varchar (parser, q, r1);
10503 
10504  q = pt_append_nulstring (parser, q, ", ");
10505  r1 = pt_print_bytes (parser, p->info.expr.arg2);
10506  q = pt_append_varchar (parser, q, r1);
10507  q = pt_append_nulstring (parser, q, ")");
10508  break;
10509 
10510  case PT_SPACE:
10511  q = pt_append_nulstring (parser, q, " space(");
10512  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10513  q = pt_append_varchar (parser, q, r1);
10514  q = pt_append_nulstring (parser, q, ")");
10515  break;
10516 
10517  case PT_TRANSLATE:
10518  q = pt_append_nulstring (parser, q, " translate(");
10519  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10520  q = pt_append_varchar (parser, q, r1);
10521 
10522  q = pt_append_nulstring (parser, q, ", ");
10523  r1 = pt_print_bytes (parser, p->info.expr.arg2);
10524  q = pt_append_varchar (parser, q, r1);
10525 
10526  q = pt_append_nulstring (parser, q, ", ");
10527  r1 = pt_print_bytes (parser, p->info.expr.arg3);
10528  q = pt_append_varchar (parser, q, r1);
10529 
10530  q = pt_append_nulstring (parser, q, ")");
10531  break;
10532 
10533  case PT_IF:
10534  q = pt_append_nulstring (parser, q, " if(");
10535  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10536  q = pt_append_varchar (parser, q, r1);
10537 
10538  q = pt_append_nulstring (parser, q, ", ");
10539  r1 = pt_print_bytes (parser, p->info.expr.arg2);
10540  q = pt_append_varchar (parser, q, r1);
10541 
10542  q = pt_append_nulstring (parser, q, ", ");
10543  r1 = pt_print_bytes (parser, p->info.expr.arg3);
10544  q = pt_append_varchar (parser, q, r1);
10545 
10546  q = pt_append_nulstring (parser, q, ")");
10547  break;
10548 
10549  case PT_IFNULL:
10550  q = pt_append_nulstring (parser, q, " ifnull(");
10551  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10552  q = pt_append_varchar (parser, q, r1);
10553 
10554  q = pt_append_nulstring (parser, q, ", ");
10555  r1 = pt_print_bytes (parser, p->info.expr.arg2);
10556  q = pt_append_varchar (parser, q, r1);
10557 
10558  q = pt_append_nulstring (parser, q, ")");
10559  break;
10560 
10561  case PT_ISNULL:
10562  q = pt_append_nulstring (parser, q, " isnull(");
10563  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10564  q = pt_append_varchar (parser, q, r1);
10565  q = pt_append_nulstring (parser, q, ")");
10566  break;
10567 
10568  case PT_COS:
10569  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10570  q = pt_append_nulstring (parser, q, " cos(");
10571  q = pt_append_varchar (parser, q, r1);
10572  q = pt_append_nulstring (parser, q, ")");
10573  break;
10574 
10575  case PT_SIN:
10576  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10577  q = pt_append_nulstring (parser, q, " sin(");
10578  q = pt_append_varchar (parser, q, r1);
10579  q = pt_append_nulstring (parser, q, ")");
10580  break;
10581 
10582  case PT_TAN:
10583  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10584  q = pt_append_nulstring (parser, q, " tan(");
10585  q = pt_append_varchar (parser, q, r1);
10586  q = pt_append_nulstring (parser, q, ")");
10587  break;
10588 
10589  case PT_DATEF:
10590  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10591  q = pt_append_nulstring (parser, q, " date(");
10592  q = pt_append_varchar (parser, q, r1);
10593  q = pt_append_nulstring (parser, q, ")");
10594  break;
10595 
10596  case PT_TIMEF:
10597  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10598  q = pt_append_nulstring (parser, q, " time(");
10599  q = pt_append_varchar (parser, q, r1);
10600  q = pt_append_nulstring (parser, q, ")");
10601  break;
10602 
10603  case PT_DEFAULTF:
10604  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10605  q = pt_append_nulstring (parser, q, " default(");
10606  q = pt_append_varchar (parser, q, r1);
10607  q = pt_append_nulstring (parser, q, ")");
10608  break;
10609 
10611  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10612  q = pt_append_nulstring (parser, q, " oid_of_duplicate_key(");
10613  q = pt_append_varchar (parser, q, r1);
10614  q = pt_append_nulstring (parser, q, ")");
10615  break;
10616 
10617  case PT_DEGREES:
10618  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10619  q = pt_append_nulstring (parser, q, " degrees(");
10620  q = pt_append_varchar (parser, q, r1);
10621  q = pt_append_nulstring (parser, q, ")");
10622  break;
10623  case PT_RADIANS:
10624  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10625  q = pt_append_nulstring (parser, q, " radians(");
10626  q = pt_append_varchar (parser, q, r1);
10627  q = pt_append_nulstring (parser, q, ")");
10628  break;
10629 
10630  case PT_SCHEMA:
10631  q = pt_append_nulstring (parser, q, " schema()");
10632  break;
10633 
10634  case PT_DATABASE:
10635  q = pt_append_nulstring (parser, q, " database()");
10636  break;
10637 
10638  case PT_VERSION:
10639  q = pt_append_nulstring (parser, q, " version()");
10640  break;
10641 
10642  case PT_PI:
10643  q = pt_append_nulstring (parser, q, " pi()");
10644  break;
10645 
10646  case PT_COT:
10647  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10648  q = pt_append_nulstring (parser, q, " cot(");
10649  q = pt_append_varchar (parser, q, r1);
10650  q = pt_append_nulstring (parser, q, ")");
10651  break;
10652 
10653  case PT_ACOS:
10654  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10655  q = pt_append_nulstring (parser, q, " acos(");
10656  q = pt_append_varchar (parser, q, r1);
10657  q = pt_append_nulstring (parser, q, ")");
10658  break;
10659 
10660  case PT_ASIN:
10661  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10662  q = pt_append_nulstring (parser, q, " asin(");
10663  q = pt_append_varchar (parser, q, r1);
10664  q = pt_append_nulstring (parser, q, ")");
10665  break;
10666 
10667  case PT_LN:
10668  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10669  q = pt_append_nulstring (parser, q, " ln(");
10670  q = pt_append_varchar (parser, q, r1);
10671  q = pt_append_nulstring (parser, q, ")");
10672  break;
10673 
10674  case PT_LOG2:
10675  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10676  q = pt_append_nulstring (parser, q, " log2(");
10677  q = pt_append_varchar (parser, q, r1);
10678  q = pt_append_nulstring (parser, q, ")");
10679  break;
10680 
10681  case PT_LOG10:
10682  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10683  q = pt_append_nulstring (parser, q, " log10(");
10684  q = pt_append_varchar (parser, q, r1);
10685  q = pt_append_nulstring (parser, q, ")");
10686  break;
10687 
10688  case PT_CONCAT:
10689  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10690  if (p->info.expr.continued_case == 1)
10691  {
10692  q = pt_append_nulstring (parser, q, " concat(");
10693  }
10694  q = pt_append_varchar (parser, q, r1);
10695  if (p->info.expr.arg2)
10696  {
10697  r2 = pt_print_bytes (parser, p->info.expr.arg2);
10698  if (r2)
10699  {
10700  q = pt_append_nulstring (parser, q, ", ");
10701  q = pt_append_varchar (parser, q, r2);
10702  }
10703  }
10704  if (p->info.expr.continued_case == 1)
10705  {
10706  q = pt_append_nulstring (parser, q, ")");
10707  }
10708  break;
10709 
10710  case PT_CONCAT_WS:
10711  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10712  if (p->info.expr.continued_case == 1)
10713  {
10714  q = pt_append_nulstring (parser, q, " concat_ws(");
10715  r3 = pt_print_bytes (parser, p->info.expr.arg3);
10716  q = pt_append_varchar (parser, q, r3);
10717  q = pt_append_nulstring (parser, q, ", ");
10718  }
10719  q = pt_append_varchar (parser, q, r1);
10720  if (p->info.expr.arg2)
10721  {
10722  r2 = pt_print_bytes (parser, p->info.expr.arg2);
10723  if (r2)
10724  {
10725  q = pt_append_nulstring (parser, q, ", ");
10726  q = pt_append_varchar (parser, q, r2);
10727  }
10728  }
10729  if (p->info.expr.continued_case == 1)
10730  {
10731  q = pt_append_nulstring (parser, q, ")");
10732  }
10733  break;
10734 
10735  case PT_FIELD:
10736  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10737  if (p->info.expr.continued_case == 1)
10738  {
10739  q = pt_append_nulstring (parser, q, " field(");
10740  r3 = pt_print_bytes (parser, p->info.expr.arg3);
10741  q = pt_append_varchar (parser, q, r3);
10742  q = pt_append_nulstring (parser, q, ", ");
10743  }
10744  q = pt_append_varchar (parser, q, r1);
10745  if (p->info.expr.arg2 && p->info.expr.arg2->flag.is_hidden_column == 0)
10746  {
10747  r2 = pt_print_bytes (parser, p->info.expr.arg2);
10748  if (r2)
10749  {
10750  q = pt_append_nulstring (parser, q, ", ");
10751  q = pt_append_varchar (parser, q, r2);
10752  }
10753  }
10754  if (p->info.expr.continued_case == 1)
10755  {
10756  q = pt_append_nulstring (parser, q, ")");
10757  }
10758  break;
10759 
10760  case PT_LEFT:
10761  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10762  r2 = pt_print_bytes (parser, p->info.expr.arg2);
10763  q = pt_append_nulstring (parser, q, " left(");
10764  q = pt_append_varchar (parser, q, r1);
10765  q = pt_append_nulstring (parser, q, ", ");
10766  q = pt_append_varchar (parser, q, r2);
10767  q = pt_append_nulstring (parser, q, ")");
10768  break;
10769 
10770  case PT_RIGHT:
10771  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10772  r2 = pt_print_bytes (parser, p->info.expr.arg2);
10773  q = pt_append_nulstring (parser, q, " right(");
10774  q = pt_append_varchar (parser, q, r1);
10775  q = pt_append_nulstring (parser, q, ", ");
10776  q = pt_append_varchar (parser, q, r2);
10777  q = pt_append_nulstring (parser, q, ")");
10778  break;
10779 
10780  case PT_LOCATE:
10781  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10782  r2 = pt_print_bytes (parser, p->info.expr.arg2);
10783  q = pt_append_nulstring (parser, q, " locate(");
10784  q = pt_append_varchar (parser, q, r1);
10785  q = pt_append_nulstring (parser, q, ", ");
10786  q = pt_append_varchar (parser, q, r2);
10787  if (p->info.expr.arg3)
10788  {
10789  r1 = pt_print_bytes (parser, p->info.expr.arg3);
10790  q = pt_append_nulstring (parser, q, ", ");
10791  q = pt_append_varchar (parser, q, r1);
10792  }
10793  q = pt_append_nulstring (parser, q, ")");
10794  break;
10795 
10796  case PT_MID:
10797  q = pt_append_nulstring (parser, q, " mid(");
10798  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10799  q = pt_append_varchar (parser, q, r1);
10800  q = pt_append_nulstring (parser, q, ", ");
10801  r2 = pt_print_bytes (parser, p->info.expr.arg2);
10802  q = pt_append_varchar (parser, q, r2);
10803  q = pt_append_nulstring (parser, q, ", ");
10804  r3 = pt_print_bytes (parser, p->info.expr.arg3);
10805  q = pt_append_varchar (parser, q, r3);
10806  q = pt_append_nulstring (parser, q, ")");
10807  break;
10808 
10809  case PT_STRCMP:
10810  q = pt_append_nulstring (parser, q, " strcmp(");
10811  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10812  q = pt_append_varchar (parser, q, r1);
10813  q = pt_append_nulstring (parser, q, ", ");
10814  r2 = pt_print_bytes (parser, p->info.expr.arg2);
10815  q = pt_append_varchar (parser, q, r2);
10816  q = pt_append_nulstring (parser, q, ")");
10817  break;
10818 
10819  case PT_DATEDIFF:
10820  q = pt_append_nulstring (parser, q, " datediff(");
10821  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10822  q = pt_append_varchar (parser, q, r1);
10823  q = pt_append_nulstring (parser, q, ", ");
10824  r2 = pt_print_bytes (parser, p->info.expr.arg2);
10825  q = pt_append_varchar (parser, q, r2);
10826  q = pt_append_nulstring (parser, q, ")");
10827  break;
10828 
10829  case PT_TIMEDIFF:
10830  q = pt_append_nulstring (parser, q, " timediff(");
10831  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10832  q = pt_append_varchar (parser, q, r1);
10833  q = pt_append_nulstring (parser, q, ", ");
10834  r2 = pt_print_bytes (parser, p->info.expr.arg2);
10835  q = pt_append_varchar (parser, q, r2);
10836  q = pt_append_nulstring (parser, q, ")");
10837  break;
10838 
10839  case PT_REVERSE:
10840  q = pt_append_nulstring (parser, q, " reverse(");
10841  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10842  q = pt_append_varchar (parser, q, r1);
10843  q = pt_append_nulstring (parser, q, ")");
10844  break;
10845 
10846  case PT_DISK_SIZE:
10847  q = pt_append_nulstring (parser, q, " disk_size(");
10848  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10849  q = pt_append_varchar (parser, q, r1);
10850  q = pt_append_nulstring (parser, q, ")");
10851  break;
10852 
10853  case PT_LPAD:
10854  q = pt_append_nulstring (parser, q, " lpad(");
10855  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10856  q = pt_append_varchar (parser, q, r1);
10857 
10858  q = pt_append_nulstring (parser, q, ", ");
10859  r1 = pt_print_bytes (parser, p->info.expr.arg2);
10860  q = pt_append_varchar (parser, q, r1);
10861 
10862  if (p->info.expr.arg3 != NULL)
10863  {
10864  q = pt_append_nulstring (parser, q, ", ");
10865  r1 = pt_print_bytes (parser, p->info.expr.arg3);
10866  q = pt_append_varchar (parser, q, r1);
10867  }
10868  q = pt_append_nulstring (parser, q, ")");
10869  break;
10870 
10871  case PT_RPAD:
10872  q = pt_append_nulstring (parser, q, " rpad(");
10873  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10874  q = pt_append_varchar (parser, q, r1);
10875 
10876  q = pt_append_nulstring (parser, q, ", ");
10877  r1 = pt_print_bytes (parser, p->info.expr.arg2);
10878  q = pt_append_varchar (parser, q, r1);
10879 
10880  if (p->info.expr.arg3 != NULL)
10881  {
10882  q = pt_append_nulstring (parser, q, ", ");
10883  r1 = pt_print_bytes (parser, p->info.expr.arg3);
10884  q = pt_append_varchar (parser, q, r1);
10885  }
10886 
10887  q = pt_append_nulstring (parser, q, ")");
10888  break;
10889 
10890  case PT_LTRIM:
10891  q = pt_append_nulstring (parser, q, " ltrim(");
10892  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10893  q = pt_append_varchar (parser, q, r1);
10894  if (p->info.expr.arg2 != NULL)
10895  {
10896  q = pt_append_nulstring (parser, q, ", ");
10897  r1 = pt_print_bytes (parser, p->info.expr.arg2);
10898  q = pt_append_varchar (parser, q, r1);
10899  }
10900  q = pt_append_nulstring (parser, q, ")");
10901  break;
10902 
10903  case PT_RTRIM:
10904  q = pt_append_nulstring (parser, q, " rtrim(");
10905  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10906  q = pt_append_varchar (parser, q, r1);
10907  if (p->info.expr.arg2 != NULL)
10908  {
10909  q = pt_append_nulstring (parser, q, ", ");
10910  r1 = pt_print_bytes (parser, p->info.expr.arg2);
10911  q = pt_append_varchar (parser, q, r1);
10912  }
10913  q = pt_append_nulstring (parser, q, ")");
10914  break;
10915 
10916  case PT_LIKE_LOWER_BOUND:
10917  q = pt_append_nulstring (parser, q, " like_match_lower_bound(");
10918  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10919  q = pt_append_varchar (parser, q, r1);
10920  if (p->info.expr.arg2 != NULL)
10921  {
10922  q = pt_append_nulstring (parser, q, ", ");
10923  r1 = pt_print_bytes (parser, p->info.expr.arg2);
10924  q = pt_append_varchar (parser, q, r1);
10925  }
10926  q = pt_append_nulstring (parser, q, ")");
10927  break;
10928 
10929  case PT_LIKE_UPPER_BOUND:
10930  q = pt_append_nulstring (parser, q, " like_match_upper_bound(");
10931  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10932  q = pt_append_varchar (parser, q, r1);
10933  if (p->info.expr.arg2 != NULL)
10934  {
10935  q = pt_append_nulstring (parser, q, ", ");
10936  r1 = pt_print_bytes (parser, p->info.expr.arg2);
10937  q = pt_append_varchar (parser, q, r1);
10938  }
10939  q = pt_append_nulstring (parser, q, ")");
10940  break;
10941 
10942  case PT_FROM_UNIXTIME:
10943  q = pt_append_nulstring (parser, q, " from_unixtime(");
10944  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10945  q = pt_append_varchar (parser, q, r1);
10946  if (p->info.expr.arg2 != NULL)
10947  {
10948  q = pt_append_nulstring (parser, q, ", ");
10949  r1 = pt_print_bytes (parser, p->info.expr.arg2);
10950  q = pt_append_varchar (parser, q, r1);
10951  }
10952  q = pt_append_nulstring (parser, q, ")");
10953  break;
10954 
10955  case PT_TRIM:
10956  q = pt_append_nulstring (parser, q, " trim(");
10957  switch (p->info.expr.qualifier)
10958  {
10959  case PT_LEADING:
10960  q = pt_append_nulstring (parser, q, "leading ");
10961  print_from = 1;
10962  break;
10963  case PT_TRAILING:
10964  q = pt_append_nulstring (parser, q, "trailing ");
10965  print_from = 1;
10966  break;
10967  case PT_BOTH:
10968  q = pt_append_nulstring (parser, q, "both ");
10969  print_from = 1;
10970  break;
10971  default:
10972  break;
10973  }
10974 
10975  if (p->info.expr.arg2)
10976  {
10977  r1 = pt_print_bytes (parser, p->info.expr.arg2);
10978  q = pt_append_varchar (parser, q, r1);
10979  }
10980  if (p->info.expr.arg2 || print_from)
10981  {
10982  q = pt_append_nulstring (parser, q, " from ");
10983  }
10984  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10985  q = pt_append_varchar (parser, q, r1);
10986  q = pt_append_nulstring (parser, q, ")");
10987  break;
10988  case PT_CAST:
10989  r1 = pt_print_bytes (parser, p->info.expr.arg1);
10991  {
10992  /* CAST op with this flag does not transform into T_CAST */
10993  char buf[PT_MEMB_BUF_SIZE];
10994  bool use_parentheses = false;
10995 
10996  sprintf (buf, " collate %s", lang_get_collation_name (PT_GET_COLLATION_MODIFIER (p)));
10997 
10998  if (p->info.expr.arg1 == NULL)
10999  {
11000  /* Do nothing. It must be an error case. */
11001  }
11002  else if (p->info.expr.arg1->node_type == PT_VALUE)
11003  {
11004  PT_NODE *v = p->info.expr.arg1;
11005  int v_coll_id;
11006 
11007  v_coll_id = (v->data_type != NULL) ? (v->data_type->info.data_type.collation_id) : LANG_SYS_COLLATION;
11008 
11009  /* if argument value was printed with 'collate', then use parentheses */
11010  if (v->info.value.print_collation == false || v->info.value.is_collate_allowed == false
11011  || (v_coll_id == LANG_SYS_COLLATION && (parser->custom_print & PT_SUPPRESS_CHARSET_PRINT)))
11012  {
11013  v_coll_id = -1;
11014  }
11015 
11016  if (v_coll_id != -1)
11017  {
11018  use_parentheses = true;
11019  }
11020  }
11021  else if (p->info.expr.arg1->node_type != PT_NAME && p->info.expr.arg1->node_type != PT_DOT_
11022  && p->info.expr.arg1->node_type != PT_HOST_VAR)
11023  {
11024  use_parentheses = true;
11025  }
11026 
11027  if (use_parentheses)
11028  {
11029  /* put arg1 in parantheses (if arg1 is an expression, COLLATE applies to last subexpression) */
11030  q = pt_append_nulstring (parser, NULL, "(");
11031  q = pt_append_varchar (parser, q, r1);
11032  q = pt_append_nulstring (parser, q, ")");
11033  q = pt_append_nulstring (parser, q, buf);
11034  }
11035  else
11036  {
11037  q = pt_append_nulstring (parser, r1, buf);
11038  }
11039  }
11040  else if (p->info.expr.cast_type != NULL
11042  {
11045  q = pt_append_varchar (parser, q, r1);
11046  }
11047  else
11048  {
11049  r2 = pt_print_bytes (parser, p->info.expr.cast_type);
11050  q = pt_append_nulstring (parser, q, " cast(");
11051  q = pt_append_varchar (parser, q, r1);
11052  q = pt_append_nulstring (parser, q, " as ");
11053  q = pt_append_varchar (parser, q, r2);
11054  q = pt_append_nulstring (parser, q, ")");
11055  }
11056  break;
11057  case PT_CASE:
11058  switch (p->info.expr.qualifier)
11059  {
11060  case PT_SIMPLE_CASE:
11061  arg3 = p->info.expr.arg3;
11062 
11063  assert (arg3->node_type == PT_EXPR || arg3->node_type == PT_VALUE);
11064 
11065  if (arg3->node_type == PT_EXPR)
11066  {
11067  r1 = pt_print_bytes (parser, arg3->info.expr.arg1);
11068  r2 = pt_print_bytes (parser, arg3->info.expr.arg2);
11069  }
11070  else
11071  {
11072  r2 = r1 = pt_print_bytes (parser, arg3);
11073  }
11074  r3 = pt_print_bytes (parser, p->info.expr.arg1);
11075  r4 = (p->info.expr.arg2->type_enum == PT_TYPE_NULL) ? NULL : pt_print_bytes (parser, p->info.expr.arg2);
11076 
11077  if (!p->info.expr.continued_case)
11078  {
11079  q = pt_append_nulstring (parser, q, "case ");
11080  q = pt_append_varchar (parser, q, r1);
11081  }
11082  q = pt_append_nulstring (parser, q, " when ");
11083  q = pt_append_varchar (parser, q, r2);
11084  q = pt_append_nulstring (parser, q, " then ");
11085  q = pt_append_varchar (parser, q, r3);
11086  if (r4)
11087  {
11088  if (p->info.expr.arg2->node_type != PT_EXPR || p->info.expr.arg2->info.expr.op != PT_CASE
11090  q = pt_append_nulstring (parser, q, " else ");
11091  q = pt_append_varchar (parser, q, r4);
11092  }
11093  if (!p->info.expr.continued_case)
11094  {
11095  q = pt_append_nulstring (parser, q, " end");
11096  }
11097  break;
11098  case PT_SEARCHED_CASE:
11099  r1 = pt_print_bytes (parser, p->info.expr.arg3);
11100  r2 = pt_print_bytes (parser, p->info.expr.arg1);
11101  r3 = (p->info.expr.arg2 == NULL
11102  || p->info.expr.arg2->type_enum == PT_TYPE_NULL) ? NULL : pt_print_bytes (parser, p->info.expr.arg2);
11103 
11104  if (!p->info.expr.continued_case)
11105  {
11106  q = pt_append_nulstring (parser, q, "case");
11107  }
11108  q = pt_append_nulstring (parser, q, " when ");
11109  q = pt_append_varchar (parser, q, r1);
11110  q = pt_append_nulstring (parser, q, " then ");
11111  q = pt_append_varchar (parser, q, r2);
11112  if (r3)
11113  {
11114  if (p->info.expr.arg2->node_type != PT_EXPR || p->info.expr.arg2->info.expr.op != PT_CASE
11116  {
11117  q = pt_append_nulstring (parser, q, " else ");
11118  }
11119  q = pt_append_varchar (parser, q, r3);
11120  }
11121  if (!p->info.expr.continued_case)
11122  {
11123  q = pt_append_nulstring (parser, q, " end");
11124  }
11125  break;
11126  default:
11127  break;
11128  }
11129  break;
11130 
11131  case PT_NULLIF:
11132  q = pt_append_nulstring (parser, q, "nullif(");
11133  r1 = pt_print_bytes (parser, p->info.expr.arg1);
11134  q = pt_append_varchar (parser, q, r1);
11135  q = pt_append_nulstring (parser, q, ", ");
11136  r2 = pt_print_bytes (parser, p->info.expr.arg2);
11137  q = pt_append_varchar (parser, q, r2);
11138  q = pt_append_nulstring (parser, q, ")");
11139  break;
11140 
11141  case PT_COALESCE:
11142  r1 = pt_print_bytes (parser, p->info.expr.arg1);
11143  if (p->info.expr.continued_case == 1)
11144  {
11145  q = pt_append_nulstring (parser, q, "coalesce(");
11146  }
11147  q = pt_append_varchar (parser, q, r1);
11148  if (p->info.expr.arg2 && p->info.expr.arg2->flag.is_hidden_column == 0)
11149  {
11150  r2 = pt_print_bytes (parser, p->info.expr.arg2);
11151  if (r2)
11152  {
11153  q = pt_append_nulstring (parser, q, ", ");
11154  q = pt_append_varchar (parser, q, r2);
11155  }
11156  }
11157  if (p->info.expr.continued_case == 1)
11158  {
11159  q = pt_append_nulstring (parser, q, ")");
11160  }
11161  break;
11162 
11163  case PT_NVL:
11164  q = pt_append_nulstring (parser, q, "nvl(");
11165  r1 = pt_print_bytes (parser, p->info.expr.arg1);
11166  q = pt_append_varchar (parser, q, r1);
11167  q = pt_append_nulstring (parser, q, ", ");
11168  r2 = pt_print_bytes (parser, p->info.expr.arg2);
11169  q = pt_append_varchar (parser, q, r2);
11170  q = pt_append_nulstring (parser, q, ")");
11171  break;
11172 
11173  case PT_NVL2:
11174  q = pt_append_nulstring (parser, q, "nvl2(");
11175  r1 = pt_print_bytes (parser, p->info.expr.arg1);
11176  q = pt_append_varchar (parser, q, r1);
11177  q = pt_append_nulstring (parser, q, ", ");
11178  r2 = pt_print_bytes (parser, p->info.expr.arg2);
11179  q = pt_append_varchar (parser, q, r2);
11180  q = pt_append_nulstring (parser, q, ", ");
11181  r3 = pt_print_bytes (parser, p->info.expr.arg3);
11182  q = pt_append_varchar (parser, q, r3);
11183  q = pt_append_nulstring (parser, q, ")");
11184  break;
11185 
11186  case PT_DECODE:
11187  arg3 = p->info.expr.arg3;
11188 
11189  assert (arg3->node_type == PT_EXPR || arg3->node_type == PT_VALUE);
11190 
11191  if (arg3->node_type == PT_EXPR)
11192  {
11193  r1 = pt_print_bytes (parser, arg3->info.expr.arg1);
11194  r2 = pt_print_bytes (parser, arg3->info.expr.arg2);
11195  }
11196  else
11197  {
11198  r2 = r1 = pt_print_bytes (parser, arg3);
11199  }
11200  r3 = pt_print_bytes (parser, p->info.expr.arg1);
11201  r4 = ((p->info.expr.arg2 == NULL || p->info.expr.arg2->type_enum == PT_TYPE_NULL)
11202  ? NULL : pt_print_bytes (parser, p->info.expr.arg2));
11203  if (!p->info.expr.continued_case)
11204  {
11205  q = pt_append_nulstring (parser, q, "decode(");
11206  q = pt_append_varchar (parser, q, r1);
11207  }
11208  q = pt_append_nulstring (parser, q, ", ");
11209  q = pt_append_varchar (parser, q, r2);
11210  q = pt_append_nulstring (parser, q, ", ");
11211  q = pt_append_varchar (parser, q, r3);
11212  if (r4)
11213  {
11214  if (p->info.expr.arg2->node_type != PT_EXPR || p->info.expr.arg2->info.expr.op != PT_DECODE
11216  {
11217  q = pt_append_nulstring (parser, q, ", ");
11218  }
11219  q = pt_append_varchar (parser, q, r4);
11220  }
11221  if (!p->info.expr.continued_case)
11222  {
11223  q = pt_append_nulstring (parser, q, ")");
11224  }
11225  break;
11226 
11227  case PT_LEAST:
11228  r1 = pt_print_bytes (parser, p->info.expr.arg1);
11229  if (p->info.expr.continued_case == 1)
11230  {
11231  q = pt_append_nulstring (parser, q, "least(");
11232  }
11233  q = pt_append_varchar (parser, q, r1);
11234  if (p->info.expr.arg2 && p->info.expr.arg2->flag.is_hidden_column == 0)
11235  {
11236  r2 = pt_print_bytes (parser, p->info.expr.arg2);
11237  if (r2)
11238  {
11239  q = pt_append_nulstring (parser, q, ", ");
11240  q = pt_append_varchar (parser, q, r2);
11241  }
11242  }
11243  if (p->info.expr.continued_case == 1)
11244  {
11245  q = pt_append_nulstring (parser, q, ")");
11246  }
11247  break;
11248 
11249  case PT_GREATEST:
11250  r1 = pt_print_bytes (parser, p->info.expr.arg1);
11251  if (p->info.expr.continued_case == 1)
11252  {
11253  q = pt_append_nulstring (parser, q, "greatest(");
11254  }
11255  q = pt_append_varchar (parser, q, r1);
11256  if (p->info.expr.arg2 && p->info.expr.arg2->flag.is_hidden_column == 0)
11257  {
11258  r2 = pt_print_bytes (parser, p->info.expr.arg2);
11259  if (r2)
11260  {
11261  q = pt_append_nulstring (parser, q, ", ");
11262  q = pt_append_varchar (parser, q, r2);
11263  }
11264  }
11265  if (p->info.expr.continued_case == 1)
11266  {
11267  q = pt_append_nulstring (parser, q, ")");
11268  }
11269  break;
11270 
11271  case PT_BETWEEN_INF_LE:
11272  case PT_BETWEEN_INF_LT:
11273  r1 = pt_print_bytes (parser, p->info.expr.arg1);
11274  q = pt_append_nulstring (parser, q, "min");
11275  q = pt_append_nulstring (parser, q, pt_show_binopcode (p->info.expr.op));
11276  q = pt_append_varchar (parser, q, r1);
11277  break;
11278  case PT_BETWEEN_GE_INF:
11279  case PT_BETWEEN_GT_INF:
11280  r1 = pt_print_bytes (parser, p->info.expr.arg1);
11281  q = pt_append_varchar (parser, q, r1);
11282  q = pt_append_nulstring (parser, q, pt_show_binopcode (p->info.expr.op));
11283  q = pt_append_nulstring (parser, q, "max");
11284  break;
11285 
11286  case PT_INST_NUM:
11287  q = pt_append_nulstring (parser, q, "inst_num()");
11288  break;
11289 
11290  case PT_ROWNUM:
11291  q = pt_append_nulstring (parser, q, "rownum");
11292  break;
11293 
11294  case PT_ORDERBY_NUM:
11295  q = pt_append_nulstring (parser, q, "orderby_num()");
11296  break;
11297 
11298  case PT_CONNECT_BY_ISCYCLE:
11299  q = pt_append_nulstring (parser, q, "connect_by_iscycle");
11300  break;
11301 
11302  case PT_CONNECT_BY_ISLEAF:
11303  q = pt_append_nulstring (parser, q, "connect_by_isleaf");
11304  break;
11305 
11306  case PT_LEVEL:
11307  q = pt_append_nulstring (parser, q, "level");
11308  break;
11309 
11310  case PT_LIST_DBS:
11311  q = pt_append_nulstring (parser, q, " list_dbs() ");
11312  break;
11313 
11314  case PT_SYS_GUID:
11315  q = pt_append_nulstring (parser, q, " sys_guid() ");
11316  break;
11317 
11318  case PT_PATH_EXPR_SET:
11319  r1 = pt_print_bytes_l (parser, p->info.expr.arg1);
11320  q = pt_append_varchar (parser, q, r1);
11321  break;
11322 
11323  case PT_INCR:
11324  r1 = pt_print_bytes (parser, p->info.expr.arg1);
11325  q = pt_append_nulstring (parser, q, " incr(");
11326  q = pt_append_varchar (parser, q, r1);
11327  q = pt_append_nulstring (parser, q, ")");
11328  break;
11329 
11330  case PT_DECR:
11331  r1 = pt_print_bytes (parser, p->info.expr.arg1);
11332  q = pt_append_nulstring (parser, q, " decr(");
11333  q = pt_append_varchar (parser, q, r1);
11334  q = pt_append_nulstring (parser, q, ")");
11335  break;
11336 
11337  case PT_BIT_TO_BLOB:
11338  q = pt_append_nulstring (parser, q, " bit_to_blob(");
11339  r1 = pt_print_bytes (parser, p->info.expr.arg1);
11340  q = pt_append_varchar (parser, q, r1);
11341  q = pt_append_nulstring (parser, q, ")");
11342  break;
11343 
11344  case PT_CHAR_TO_BLOB:
11345  q = pt_append_nulstring (parser, q, " char_to_blob(");
11346  r1 = pt_print_bytes (parser, p->info.expr.arg1);
11347  q = pt_append_varchar (parser, q, r1);
11348  q = pt_append_nulstring (parser, q, ")");
11349  break;
11350 
11351  case PT_BLOB_TO_BIT:
11352  q = pt_append_nulstring (parser, q, " blob_to_bit(");
11353  r1 = pt_print_bytes (parser, p->info.expr.arg1);
11354  q = pt_append_varchar (parser, q, r1);
11355  if (p->info.expr.arg2)
11356  {
11357  r2 = pt_print_bytes (parser, p->info.expr.arg2);
11358  q = pt_append_nulstring (parser, q, ", ");
11359  q = pt_append_varchar (parser, q, r2);
11360  }
11361  q = pt_append_nulstring (parser, q, ")");
11362  break;
11363 
11364  case PT_CHAR_TO_CLOB:
11365  q = pt_append_nulstring (parser, q, " char_to_clob(");
11366  r1 = pt_print_bytes (parser, p->info.expr.arg1);
11367  q = pt_append_varchar (parser, q, r1);
11368  q = pt_append_nulstring (parser, q, ")");
11369  break;
11370 
11371  case PT_CLOB_TO_CHAR:
11372  r1 = pt_print_bytes (parser, p->info.expr.arg1);
11373  q = pt_append_nulstring (parser, q, " clob_to_char(");
11374  q = pt_append_varchar (parser, q, r1);
11375  if (p->info.expr.arg2 != NULL && p->info.expr.arg2->node_type == PT_VALUE
11377  {
11378  q = pt_append_nulstring (parser, q, " using ");
11380  }
11381  q = pt_append_nulstring (parser, q, ")");
11382  break;
11383 
11384  case PT_BLOB_FROM_FILE:
11385  q = pt_append_nulstring (parser, q, " blob_from_file(");
11386  r1 = pt_print_bytes (parser, p->info.expr.arg1);
11387  q = pt_append_varchar (parser, q, r1);
11388  q = pt_append_nulstring (parser, q, ")");
11389  break;
11390 
11391  case PT_CLOB_FROM_FILE:
11392  q = pt_append_nulstring (parser, q, " clob_from_file(");
11393  r1 = pt_print_bytes (parser, p->info.expr.arg1);
11394  q = pt_append_varchar (parser, q, r1);
11395  q = pt_append_nulstring (parser, q, ")");
11396  break;
11397 
11398  case PT_BLOB_LENGTH:
11399  q = pt_append_nulstring (parser, q, " blob_length(");
11400  r1 = pt_print_bytes (parser, p->info.expr.arg1);
11401  q = pt_append_varchar (parser, q, r1);
11402  q = pt_append_nulstring (parser, q, ")");
11403  break;
11404 
11405  case PT_CLOB_LENGTH:
11406  q = pt_append_nulstring (parser, q, " clob_length(");
11407  r1 = pt_print_bytes (parser, p->info.expr.arg1);
11408  q = pt_append_varchar (parser, q, r1);
11409  q = pt_append_nulstring (parser, q, ")");
11410  break;
11411 
11412  case PT_TYPEOF:
11413  r1 = pt_print_bytes (parser, p->info.expr.arg1);
11414  q = pt_append_nulstring (parser, q, " typeof(");
11415  q = pt_append_varchar (parser, q, r1);
11416  q = pt_append_nulstring (parser, q, ")");
11417  break;
11418 
11419  case PT_INDEX_CARDINALITY:
11420  q = pt_append_nulstring (parser, q, " index_cardinality(");
11421  r1 = pt_print_bytes (parser, p->info.expr.arg1);
11422  q = pt_append_varchar (parser, q, r1);
11423 
11424  q = pt_append_nulstring (parser, q, ", ");
11425  r1 = pt_print_bytes (parser, p->info.expr.arg2);
11426  q = pt_append_varchar (parser, q, r1);
11427 
11428  q = pt_append_nulstring (parser, q, ", ");
11429  r1 = pt_print_bytes (parser, p->info.expr.arg3);
11430  q = pt_append_varchar (parser, q, r1);
11431 
11432  q = pt_append_nulstring (parser, q, ")");
11433  break;
11434 
11436  /* only print argument */
11437  r1 = pt_print_bytes (parser, p->info.expr.arg1);
11438  q = pt_append_varchar (parser, q, r1);
11439  break;
11440 
11441  case PT_RANGE:
11442  if (parser->custom_print & PT_CONVERT_RANGE)
11443  {
11444  PT_STRING_BLOCK sb;
11445  sb.length = 0;
11446  sb.size = 1024;
11447  sb.body = NULL;
11448 
11449  sb.body = (char *) malloc (sb.size);
11450  if (sb.body == NULL)
11451  {
11452  return NULL;
11453  }
11454 
11455  sb.body[0] = 0;
11456 
11457  r4 = pt_print_bytes (parser, p->info.expr.arg1);
11458 
11459  if (p->info.expr.arg2 && p->info.expr.arg2->or_next)
11460  {
11461  strcat_with_realloc (&sb, "(");
11462  }
11463 
11464  for (t = p->info.expr.arg2; t; t = t->or_next)
11465  {
11466  if (!p->info.expr.paren_type)
11467  {
11468  strcat_with_realloc (&sb, "(");
11469  }
11470 
11471  pt_print_range_op (parser, &sb, t, r4);
11472 
11473  if (!p->info.expr.paren_type)
11474  {
11475  strcat_with_realloc (&sb, ")");
11476  }
11477 
11478  if (t->or_next)
11479  {
11480  strcat_with_realloc (&sb, " or ");
11481  }
11482  }
11483  if (p->info.expr.arg2 && p->info.expr.arg2->or_next)
11484  {
11485  strcat_with_realloc (&sb, ")");
11486  }
11487 
11488  q = pt_append_nulstring (parser, q, sb.body);
11489  free (sb.body);
11490 
11491  /* break case PT_RANGE */
11492  break;
11493  }
11494  /* FALLTHRU */
11495  default:
11496  r1 = pt_print_bytes (parser, p->info.expr.arg1);
11497  r2 = pt_print_bytes (parser, p->info.expr.arg2);
11498 
11499  q = pt_append_varchar (parser, q, r1);
11500  q = pt_append_nulstring (parser, q, pt_show_binopcode (p->info.expr.op));
11501  if (r2 && (r2->bytes[0] == '-') && q && (q->bytes[q->length - 1] == '-'))
11502  {
11503  q = pt_append_nulstring (parser, q, "(");
11504  q = pt_append_varchar (parser, q, r2);
11505  q = pt_append_nulstring (parser, q, ")");
11506  }
11507  if (p->info.expr.op == PT_RANGE)
11508  {
11509  q = pt_append_nulstring (parser, q, "(");
11510  q = pt_append_varchar (parser, q, r2);
11511  q = pt_append_nulstring (parser, q, ")");
11512  }
11513  else
11514  {
11515  q = pt_append_varchar (parser, q, r2);
11516  }
11517  break;
11518  case PT_EVALUATE_VARIABLE:
11519  q = pt_append_nulstring (parser, q, "@");
11520  q = pt_append_nulstring (parser, q, p->info.expr.arg1->info.value.text);
11521  break;
11522  case PT_DEFINE_VARIABLE:
11523  q = pt_append_nulstring (parser, q, "@");
11524  q = pt_append_nulstring (parser, q, p->info.expr.arg1->info.value.text);
11525  q = pt_append_nulstring (parser, q, " := ");
11526  r2 = pt_print_bytes (parser, p->info.expr.arg2);
11527  q = pt_append_varchar (parser, q, r2);
11528  break;
11529  case PT_EXEC_STATS:
11530  r1 = pt_print_bytes (parser, p->info.expr.arg1);
11531  q = pt_append_nulstring (parser, q, " exec_stats(");
11532  q = pt_append_varchar (parser, q, r1);
11533  q = pt_append_nulstring (parser, q, ")");
11534  break;
11535  case PT_INET_ATON:
11536  r1 = pt_print_bytes (parser, p->info.expr.arg1);
11537  q = pt_append_nulstring (parser, q, " inet_aton(");
11538  q = pt_append_varchar (parser, q, r1);
11539  q = pt_append_nulstring (parser, q, ")");
11540  break;
11541  case PT_INET_NTOA:
11542  r1 = pt_print_bytes (parser, p->info.expr.arg1);
11543  q = pt_append_nulstring (parser, q, " inet_ntoa(");
11544  q = pt_append_varchar (parser, q, r1);
11545  q = pt_append_nulstring (parser, q, ")");
11546  break;
11547  case PT_CHARSET:
11548  r1 = pt_print_bytes (parser, p->info.expr.arg1);
11549  q = pt_append_nulstring (parser, q, " charset(");
11550  q = pt_append_varchar (parser, q, r1);
11551  q = pt_append_nulstring (parser, q, ")");
11552  break;
11553  case PT_COERCIBILITY:
11554  r1 = pt_print_bytes (parser, p->info.expr.arg1);
11555  q = pt_append_nulstring (parser, q, " coercibility(");
11556  q = pt_append_varchar (parser, q, r1);
11557  q = pt_append_nulstring (parser, q, ")");
11558  break;
11559  case PT_COLLATION:
11560  r1 = pt_print_bytes (parser, p->info.expr.arg1);
11561  q = pt_append_nulstring (parser, q, " collation(");
11562  q = pt_append_varchar (parser, q, r1);
11563  q = pt_append_nulstring (parser, q, ")");
11564  break;
11565  case PT_WIDTH_BUCKET:
11566  q = pt_append_nulstring (parser, q, "width_bucket(");
11567 
11568  r1 = pt_print_bytes (parser, p->info.expr.arg1);
11569  q = pt_append_varchar (parser, q, r1);
11570  q = pt_append_nulstring (parser, q, ", ");
11571 
11572  /* we use PT_BETWEEN and PT_BETWEEN_GE_LT to represent the boundaries */
11573  between = p->info.expr.arg2;
11574  if (between == NULL || between->node_type != PT_EXPR || between->info.expr.op != PT_BETWEEN)
11575  {
11576  return NULL;
11577  }
11578 
11579  between_ge_lt = between->info.expr.arg2;
11580  if (between_ge_lt == NULL || between_ge_lt->node_type != PT_EXPR
11581  || between_ge_lt->info.expr.op != PT_BETWEEN_GE_LT)
11582  {
11583  return NULL;
11584  }
11585 
11586  r2 = pt_print_bytes (parser, between_ge_lt->info.expr.arg1);
11587  q = pt_append_varchar (parser, q, r2);
11588  q = pt_append_nulstring (parser, q, ", ");
11589 
11590  r3 = pt_print_bytes (parser, between_ge_lt->info.expr.arg2);
11591  q = pt_append_varchar (parser, q, r3);
11592  q = pt_append_nulstring (parser, q, ", ");
11593 
11594  r4 = pt_print_bytes (parser, p->info.expr.arg3);
11595  q = pt_append_varchar (parser, q, r4);
11596 
11597  q = pt_append_nulstring (parser, q, ")");
11598 
11599  break;
11600 
11601  case PT_TRACE_STATS:
11602  q = pt_append_nulstring (parser, q, " trace_stats()");
11603  break;
11604  case PT_LIKE_ESCAPE:
11605  r1 = pt_print_bytes (parser, p->info.expr.arg1);
11606  r2 = pt_print_bytes (parser, p->info.expr.arg2);
11607 
11608  q = pt_append_varchar (parser, q, r1);
11609  q = pt_append_nulstring (parser, q, pt_show_binopcode (p->info.expr.op));
11610  q = pt_append_varchar (parser, q, r2);
11611  break;
11612  case PT_INDEX_PREFIX:
11613  q = pt_append_nulstring (parser, q, " index_prefix(");
11614  r1 = pt_print_bytes (parser, p->info.expr.arg1);
11615  q = pt_append_varchar (parser, q, r1);
11616 
11617  q = pt_append_nulstring (parser, q, ", ");
11618  r1 = pt_print_bytes (parser, p->info.expr.arg2);
11619  q = pt_append_varchar (parser, q, r1);
11620 
11621  q = pt_append_nulstring (parser, q, ", ");
11622  r1 = pt_print_bytes (parser, p->info.expr.arg3);
11623  q = pt_append_varchar (parser, q, r1);
11624 
11625  q = pt_append_nulstring (parser, q, ")");
11626  break;
11627 
11628  case PT_SLEEP:
11629  q = pt_append_nulstring (parser, q, " sleep(");
11630  r1 = pt_print_bytes (parser, p->info.expr.arg1);
11631  q = pt_append_varchar (parser, q, r1);
11632 
11633  q = pt_append_nulstring (parser, q, ")");
11634  break;
11635 
11636  case PT_DBTIMEZONE:
11637  q = pt_append_nulstring (parser, q, "dbtimezone");
11638  break;
11639 
11640  case PT_SESSIONTIMEZONE:
11641  q = pt_append_nulstring (parser, q, "sessiontimezone");
11642  break;
11643 
11644  case PT_NEW_TIME:
11645  q = pt_append_nulstring (parser, q, " newtime(");
11646  r1 = pt_print_bytes (parser, p->info.expr.arg1);
11647  q = pt_append_varchar (parser, q, r1);
11648  q = pt_append_nulstring (parser, q, ", ");
11649  r2 = pt_print_bytes (parser, p->info.expr.arg2);
11650  q = pt_append_varchar (parser, q, r2);
11651  q = pt_append_nulstring (parser, q, ", ");
11652  r3 = pt_print_bytes (parser, p->info.expr.arg3);
11653  q = pt_append_varchar (parser, q, r3);
11654  q = pt_append_nulstring (parser, q, ")");
11655  break;
11656 
11657  case PT_FROM_TZ:
11658  q = pt_append_nulstring (parser, q, " from_tz(");
11659  r1 = pt_print_bytes (parser, p->info.expr.arg1);
11660  q = pt_append_varchar (parser, q, r1);
11661  q = pt_append_nulstring (parser, q, ", ");
11662  r2 = pt_print_bytes (parser, p->info.expr.arg2);
11663  q = pt_append_varchar (parser, q, r2);
11664  q = pt_append_nulstring (parser, q, ")");
11665  break;
11666 
11667  case PT_TZ_OFFSET:
11668  q = pt_append_nulstring (parser, q, " tz_offset(");
11669  r1 = pt_print_bytes (parser, p->info.expr.arg1);
11670  q = pt_append_varchar (parser, q, r1);
11671  q = pt_append_nulstring (parser, q, ")");
11672  break;
11673  case PT_UTC_TIMESTAMP:
11674  q = pt_append_nulstring (parser, q, " utc_timestamp() ");
11675  break;
11676  case PT_CRC32:
11677  r1 = pt_print_bytes (parser, p->info.expr.arg1);
11678  q = pt_append_nulstring (parser, q, " crc32(");
11679  q = pt_append_varchar (parser, q, r1);
11680  q = pt_append_nulstring (parser, q, ")");
11681  break;
11682  case PT_SCHEMA_DEF:
11683  r1 = pt_print_bytes (parser, p->info.expr.arg1);
11684  q = pt_append_nulstring (parser, q, " schema_def(");
11685  q = pt_append_varchar (parser, q, r1);
11686  q = pt_append_nulstring (parser, q, ")");
11687  break;
11688  }
11689 
11690  for (t = p->or_next; t; t = t->or_next)
11691  {
11692  or_next = t->or_next;
11693  t->or_next = NULL;
11694  r1 = pt_print_bytes (parser, t);
11695  if (r1)
11696  {
11697  q = pt_append_nulstring (parser, q, " or ");
11698  q = pt_append_varchar (parser, q, r1);
11699  }
11700  t->or_next = or_next;
11701  }
11702 
11703  if (p->info.expr.paren_type == 1)
11704  {
11705  q = pt_append_nulstring (parser, q, ")");
11706  }
11707 
11708  if ((parser->custom_print & PT_PRINT_ALIAS) && p->alias_print != NULL)
11709  {
11710  q = pt_append_nulstring (parser, q, " as [");
11711  q = pt_append_nulstring (parser, q, p->alias_print);
11712  q = pt_append_nulstring (parser, q, "]");
11713  }
11714 
11715  return q;
11716 }
11717 
11718 /* FILE_PATH */
11719 /*
11720  * pt_apply_file_path () -
11721  * return:
11722  * parser(in):
11723  * p(in):
11724  * g(in):
11725  * arg(in):
11726  */
11727 static PT_NODE *
11728 pt_apply_file_path (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
11729 {
11730  return p;
11731 }
11732 
11733 
11734 /*
11735  * pt_print_file_path () -
11736  * return:
11737  * parser(in):
11738  * p(in):
11739  */
11740 static PARSER_VARCHAR *
11742 {
11743  PARSER_VARCHAR *q = 0, *r1;
11744 
11745  if (p->info.file_path.string)
11746  {
11747  r1 = pt_print_bytes (parser, p->info.file_path.string);
11748  q = pt_append_varchar (parser, q, r1);
11749  }
11750  return q;
11751 }
11752 
11753 /* FUNCTION */
11754 /*
11755  * pt_apply_function () -
11756  * return:
11757  * parser(in):
11758  * p(in):
11759  * g(in):
11760  * arg(in):
11761  */
11762 static PT_NODE *
11763 pt_apply_function (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
11764 {
11765  PT_APPLY_WALK (parser, p->info.function.arg_list, arg);
11766  PT_APPLY_WALK (parser, p->info.function.order_by, arg);
11767  PT_APPLY_WALK (parser, p->info.function.percentile, arg);
11769  {
11770  PT_APPLY_WALK (parser, p->info.function.analytic.partition_by, arg);
11771  PT_APPLY_WALK (parser, p->info.function.analytic.order_by, arg);
11772  PT_APPLY_WALK (parser, p->info.function.analytic.offset, arg);
11773  PT_APPLY_WALK (parser, p->info.function.analytic.default_value, arg);
11774  PT_APPLY_WALK (parser, p->info.function.analytic.expanded_list, arg);
11775  }
11776  return p;
11777 }
11778 
11779 /*
11780  * pt_init_function () -
11781  * return:
11782  * p(in):
11783  */
11784 static PT_NODE *
11786 {
11789 
11790  return p;
11791 }
11792 
11793 /*
11794  * pt_print_function () -
11795  * return:
11796  * parser(in):
11797  * p(in):
11798  */
11799 static PARSER_VARCHAR *
11801 {
11802  FUNC_TYPE code;
11803  PARSER_VARCHAR *q = 0, *r1;
11804  PT_NODE *order_by = NULL;
11805 
11806  code = p->info.function.function_type;
11807  if (code == PT_GENERIC)
11808  {
11809  r1 = pt_print_bytes_l (parser, p->info.function.arg_list);
11810  q = pt_append_nulstring (parser, q, p->info.function.generic_name);
11811  q = pt_append_nulstring (parser, q, "(");
11812  q = pt_append_varchar (parser, q, r1);
11813  q = pt_append_nulstring (parser, q, ")");
11814  }
11815  else if (code < PT_TOP_AGG_FUNC)
11816  {
11817  q = pt_append_nulstring (parser, q, fcode_get_lowercase_name (code));
11818  q = pt_append_nulstring (parser, q, "(");
11819 
11820  if (code == PT_COUNT_STAR)
11821  {
11822  q = pt_append_nulstring (parser, q, "*");
11823  }
11824  else
11825  {
11826  if (code == PT_GROUP_CONCAT)
11827  {
11828  if (p->info.function.arg_list != NULL)
11829  {
11830  r1 = pt_print_bytes (parser, p->info.function.arg_list);
11831  }
11832  else
11833  {
11834  // it is unexpected but a badly formed function may miss its arg_list.
11835  r1 = NULL;
11836  }
11837 
11838  if (p->info.function.order_by != NULL)
11839  {
11840  PARSER_VARCHAR *r2;
11841 
11842  r2 = pt_print_bytes_l (parser, p->info.function.order_by);
11843  r1 = pt_append_nulstring (parser, r1, " order by ");
11844  r1 = pt_append_varchar (parser, r1, r2);
11845  }
11846 
11847  /* SEPARATOR */
11848  if (p->info.function.arg_list != NULL && p->info.function.arg_list->next != NULL)
11849  {
11850  PARSER_VARCHAR *r2;
11851  /* print separator */
11852  r1 = pt_append_nulstring (parser, r1, " separator ");
11853  r2 = pt_print_bytes (parser, p->info.function.arg_list->next);
11854  r1 = pt_append_varchar (parser, r1, r2);
11855  }
11856  }
11857  else
11858  {
11859  r1 = pt_print_bytes_l (parser, p->info.function.arg_list);
11860  }
11862  {
11863  q = pt_append_nulstring (parser, q, "distinct ");
11864  }
11865  q = pt_append_varchar (parser, q, r1);
11866  }
11867  q = pt_append_nulstring (parser, q, ")");
11868  }
11869  else if (code == PT_LEAD || code == PT_LAG)
11870  {
11871  q = pt_append_nulstring (parser, q, fcode_get_lowercase_name (code));
11872  q = pt_append_nulstring (parser, q, "(");
11873 
11874  r1 = pt_print_bytes (parser, p->info.function.arg_list);
11875  q = pt_append_varchar (parser, q, r1);
11876  q = pt_append_nulstring (parser, q, ", ");
11877 
11878  r1 = pt_print_bytes (parser, p->info.function.analytic.offset);
11879  q = pt_append_varchar (parser, q, r1);
11880  q = pt_append_nulstring (parser, q, ", ");
11881 
11883  q = pt_append_varchar (parser, q, r1);
11884 
11885  q = pt_append_nulstring (parser, q, ")");
11886  }
11887  else if (code == PT_NTH_VALUE)
11888  {
11889  q = pt_append_nulstring (parser, q, fcode_get_lowercase_name (code));
11890  q = pt_append_nulstring (parser, q, "(");
11891 
11892  r1 = pt_print_bytes (parser, p->info.function.arg_list);
11893  q = pt_append_varchar (parser, q, r1);
11894  q = pt_append_nulstring (parser, q, ", ");
11895 
11896  r1 = pt_print_bytes (parser, p->info.function.analytic.offset);
11897  q = pt_append_varchar (parser, q, r1);
11898 
11899  q = pt_append_nulstring (parser, q, ")");
11900  }
11901  else if (code == PT_CUME_DIST || code == PT_PERCENT_RANK)
11902  {
11903  r1 = pt_print_bytes_l (parser, p->info.function.arg_list);
11904  q = pt_append_nulstring (parser, q, fcode_get_lowercase_name (code));
11905  q = pt_append_nulstring (parser, q, "(");
11906  q = pt_append_varchar (parser, q, r1);
11907  q = pt_append_nulstring (parser, q, ")");
11908 
11910  { /* aggregate */
11911  if (p->info.function.order_by)
11912  {
11913  r1 = pt_print_bytes_l (parser, p->info.function.order_by);
11914  q = pt_append_nulstring (parser, q, " within group(order by ");
11915  q = pt_append_varchar (parser, q, r1);
11916  q = pt_append_nulstring (parser, q, ")");
11917  }
11918  }
11919  }
11920  else if (code == PT_PERCENTILE_CONT || code == PT_PERCENTILE_DISC)
11921  {
11922  q = pt_append_nulstring (parser, q, fcode_get_lowercase_name (code));
11923  q = pt_append_nulstring (parser, q, "(");
11924 
11925  r1 = pt_print_bytes (parser, p->info.function.percentile);
11926  q = pt_append_varchar (parser, q, r1);
11927  q = pt_append_nulstring (parser, q, ") within group (order by ");
11928 
11929  r1 = pt_print_bytes (parser, p->info.function.arg_list);
11930  q = pt_append_varchar (parser, q, r1);
11931 
11933  {
11934  order_by = p->info.function.analytic.order_by;
11935  }
11936  else
11937  {
11938  order_by = p->info.function.order_by;
11939  }
11940 
11941  if (order_by != NULL)
11942  {
11943  if (order_by->info.sort_spec.asc_or_desc == PT_DESC)
11944  {
11945  q = pt_append_nulstring (parser, q, " desc");
11946  }
11947 
11949  {
11950  q = pt_append_nulstring (parser, q, " nulls first");
11951  }
11952  else if (order_by->info.sort_spec.nulls_first_or_last == PT_NULLS_LAST)
11953  {
11954  q = pt_append_nulstring (parser, q, " nulls last");
11955  }
11956  }
11957 
11958  q = pt_append_nulstring (parser, q, ")");
11959  }
11960  else if (code == F_SET || code == F_MULTISET || code == F_SEQUENCE)
11961  {
11962  if (p->spec_ident)
11963  {
11964  /* this is tagged as an "in" clause right hand side Print it as a parenthesized list */
11965  r1 = pt_print_bytes_l (parser, p->info.function.arg_list);
11966  q = pt_append_nulstring (parser, q, "(");
11967  q = pt_append_varchar (parser, q, r1);
11968  q = pt_append_nulstring (parser, q, ")");
11969  }
11970  else
11971  {
11972  r1 = pt_print_bytes_l (parser, p->info.function.arg_list);
11973  if (code != F_SEQUENCE)
11974  {
11975  q = pt_append_nulstring (parser, q, fcode_get_lowercase_name (code));
11976  }
11977  q = pt_append_nulstring (parser, q, "{");
11978  q = pt_append_varchar (parser, q, r1);
11979  q = pt_append_nulstring (parser, q, "}");
11980  }
11981  }
11982  else if (code == F_CLASS_OF)
11983  {
11984  r1 = pt_print_bytes_l (parser, p->info.function.arg_list);
11985  q = pt_append_nulstring (parser, q, fcode_get_lowercase_name (code));
11986  q = pt_append_nulstring (parser, q, " ");
11987  q = pt_append_varchar (parser, q, r1);
11988  }
11989  else
11990  {
11991  r1 = pt_print_bytes_l (parser, p->info.function.arg_list);
11992  q = pt_append_nulstring (parser, q, fcode_get_lowercase_name (code));
11993  q = pt_append_nulstring (parser, q, "(");
11994  q = pt_append_varchar (parser, q, r1);
11995  q = pt_append_nulstring (parser, q, ")");
11996  }
11997 
11999  {
12001  {
12002  q = pt_append_nulstring (parser, q, " from last ");
12003  }
12005  {
12006  q = pt_append_nulstring (parser, q, " ignore nulls ");
12007  }
12008  q = pt_append_nulstring (parser, q, " over (");
12010  {
12012  q = pt_append_nulstring (parser, q, "partition by ");
12013  q = pt_append_varchar (parser, q, r1);
12014  }
12017  {
12018  r1 = pt_print_bytes_l (parser, p->info.function.analytic.order_by);
12020  {
12021  q = pt_append_nulstring (parser, q, " ");
12022  }
12023  q = pt_append_nulstring (parser, q, "order by ");
12024  q = pt_append_varchar (parser, q, r1);
12025  }
12026  q = pt_append_nulstring (parser, q, ")");
12027  }
12028 
12029  if ((parser->custom_print & PT_PRINT_ALIAS) && p->alias_print != NULL)
12030  {
12031  q = pt_append_nulstring (parser, q, " as [");
12032  q = pt_append_nulstring (parser, q, p->alias_print);
12033  q = pt_append_nulstring (parser, q, "]");
12034  }
12035 
12036  return q;
12037 }
12038 
12039 /* GET_OPTIMIZATION_LEVEL */
12040 /*
12041  * pt_apply_get_opt_lvl () -
12042  * return:
12043  * parser(in):
12044  * p(in):
12045  * g(in):
12046  * arg(in):
12047  */
12048 static PT_NODE *
12049 pt_apply_get_opt_lvl (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
12050 {
12051  PT_APPLY_WALK (parser, p->info.get_opt_lvl.args, arg);
12052  PT_APPLY_WALK (parser, p->info.get_opt_lvl.into_var, arg);
12053  return p;
12054 }
12055 
12056 /*
12057  * pt_init_get_opt_lvl () -
12058  * return:
12059  * p(in):
12060  */
12061 static PT_NODE *
12063 {
12065  return p;
12066 }
12067 
12068 /*
12069  * pt_print_get_opt_lvl () -
12070  * return:
12071  * parser(in):
12072  * p(in):
12073  */
12074 static PARSER_VARCHAR *
12076 {
12077  PARSER_VARCHAR *b = NULL, *r1;
12079 
12080  option = p->info.get_opt_lvl.option;
12081  b = pt_append_nulstring (parser, b, "get optimization ");
12082  b = pt_append_nulstring (parser, b, pt_show_misc_type (option));
12083 
12084  if (p->info.get_opt_lvl.args)
12085  {
12086  r1 = pt_print_bytes (parser, p->info.get_opt_lvl.args);
12087  b = pt_append_nulstring (parser, b, " ");
12088  b = pt_append_varchar (parser, b, r1);
12089  }
12090  if (p->info.get_opt_lvl.into_var)
12091  {
12092  r1 = pt_print_bytes (parser, p->info.get_opt_lvl.into_var);
12093  b = pt_append_nulstring (parser, b, " into ");
12094  b = pt_append_varchar (parser, b, r1);
12095  }
12096  return b;
12097 }
12098 
12099 /* GET_TRIGGER */
12100 /*
12101  * pt_apply_get_trigger () -
12102  * return:
12103  * parser(in):
12104  * p(in):
12105  * g(in):
12106  * arg(in):
12107  */
12108 static PT_NODE *
12109 pt_apply_get_trigger (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
12110 {
12111  PT_APPLY_WALK (parser, p->info.get_trigger.into_var, arg);
12112  return p;
12113 }
12114 
12115 /*
12116  * pt_print_get_trigger () -
12117  * return:
12118  * parser(in):
12119  * p(in):
12120  */
12121 static PARSER_VARCHAR *
12123 {
12124  PARSER_VARCHAR *b = NULL, *r1;
12125 
12126  b = pt_append_nulstring (parser, b, "get trigger ");
12128 
12129  if (p->info.get_trigger.into_var)
12130  {
12131  r1 = pt_print_bytes (parser, p->info.get_trigger.into_var);
12132  b = pt_append_nulstring (parser, b, " into ");
12133  b = pt_append_varchar (parser, b, r1);
12134  }
12135  return b;
12136 }
12137 
12138 /* GET_XACTION */
12139 /*
12140  * pt_apply_get_xaction () -
12141  * return:
12142  * parser(in):
12143  * p(in):
12144  * g(in):
12145  * arg(in):
12146  */
12147 static PT_NODE *
12148 pt_apply_get_xaction (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
12149 {
12150  PT_APPLY_WALK (parser, p->info.get_xaction.into_var, arg);
12151  return p;
12152 }
12153 
12154 /*
12155  * pt_print_get_xaction () -
12156  * return:
12157  * parser(in):
12158  * p(in):
12159  */
12160 static PARSER_VARCHAR *
12162 {
12163  PARSER_VARCHAR *b = NULL, *r1;
12164 
12165  b = pt_append_nulstring (parser, b, "get transaction ");
12167 
12168  if (p->info.get_xaction.into_var)
12169  {
12170  r1 = pt_print_bytes (parser, p->info.get_xaction.into_var);
12171  b = pt_append_nulstring (parser, b, " into ");
12172  b = pt_append_varchar (parser, b, r1);
12173  }
12174  return b;
12175 }
12176 
12177 /* GRANT */
12178 /*
12179  * pt_apply_grant () -
12180  * return:
12181  * parser(in):
12182  * p(in):
12183  * g(in):
12184  * arg(in):
12185  */
12186 static PT_NODE *
12187 pt_apply_grant (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
12188 {
12189  PT_APPLY_WALK (parser, p->info.grant.auth_cmd_list, arg);
12190  PT_APPLY_WALK (parser, p->info.grant.user_list, arg);
12191  PT_APPLY_WALK (parser, p->info.grant.spec_list, arg);
12192  return p;
12193 }
12194 
12195 /*
12196  * pt_init_grant () -
12197  * return:
12198  * p(in):
12199  */
12200 static PT_NODE *
12202 {
12204 
12205  return (p);
12206 }
12207 
12208 /*
12209  * pt_print_grant () -
12210  * return:
12211  * parser(in):
12212  * p(in):
12213  */
12214 static PARSER_VARCHAR *
12216 {
12217  PARSER_VARCHAR *q = 0, *r1, *r2, *r3;
12218  unsigned int save_custom;
12219 
12220  r1 = pt_print_bytes_l (parser, p->info.grant.auth_cmd_list);
12221  save_custom = parser->custom_print;
12223  r2 = pt_print_bytes_l (parser, p->info.grant.spec_list);
12224  parser->custom_print = save_custom;
12225  r3 = pt_print_bytes_l (parser, p->info.grant.user_list);
12226  q = pt_append_nulstring (parser, q, "grant ");
12227  q = pt_append_varchar (parser, q, r1);
12228  q = pt_append_nulstring (parser, q, " on ");
12229  q = pt_append_varchar (parser, q, r2);
12230  q = pt_append_nulstring (parser, q, " to ");
12231  q = pt_append_varchar (parser, q, r3);
12232 
12234  {
12235  q = pt_append_nulstring (parser, q, " with grant option ");
12236  }
12237 
12238  return q;
12239 }
12240 
12241 /* HOST_VAR */
12242 /*
12243  * pt_apply_host_var () -
12244  * return:
12245  * parser(in):
12246  * p(in):
12247  * g(in):
12248  * arg(in):
12249  */
12250 static PT_NODE *
12251 pt_apply_host_var (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
12252 {
12253  return p;
12254 }
12255 
12256 /*
12257  * pt_print_host_var () -
12258  * return:
12259  * parser(in):
12260  * p(in):
12261  */
12262 static PARSER_VARCHAR *
12264 {
12265  PT_NODE *t, *or_next;
12266  PARSER_VARCHAR *q = NULL, *r;
12267  char s[PT_MEMB_BUF_SIZE];
12268 
12269  if (parser->print_db_value)
12270  {
12271  /* Skip cast to enum type. */
12272  if (p->info.host_var.var_type == PT_HOST_IN
12274  {
12275  PT_NODE *save_error_msgs;
12276 
12277  /* keep previous error, and print value if error occurs, reset and go ahead for example: curently, it is
12278  * impossiable to occurs anyway, add this code for safety */
12279 
12280  save_error_msgs = parser->error_msgs;
12281  parser->error_msgs = NULL;
12282 
12283  q = (*parser->print_db_value) (parser, p);
12284 
12285  if (q)
12286  {
12287  if (pt_has_error (parser))
12288  {
12289  parser_free_tree (parser, parser->error_msgs);
12290  }
12291  parser->error_msgs = save_error_msgs; /* restore */
12292 
12293  return q;
12294  }
12295  if (pt_has_error (parser))
12296  {
12297  parser_free_tree (parser, parser->error_msgs);
12298  }
12299  parser->error_msgs = save_error_msgs; /* restore */
12300  }
12301  }
12302 
12303  q = pt_append_nulstring (parser, q, " ");
12304  q = pt_append_nulstring (parser, q, p->info.host_var.str);
12305  /* for internal print, print a host variable with its index */
12306  sprintf (s, ":%d", p->info.host_var.index);
12307  q = pt_append_nulstring (parser, q, s);
12308  q = pt_append_nulstring (parser, q, " ");
12309 
12310  for (t = p->or_next; t; t = t->or_next)
12311  {
12312  or_next = t->or_next;
12313  t->or_next = NULL;
12314  r = pt_print_bytes (parser, t);
12315  if (r)
12316  {
12317  q = pt_append_nulstring (parser, q, " or ");
12318  q = pt_append_varchar (parser, q, r);
12319  }
12320  t->or_next = or_next;
12321  }
12322 
12323  return q;
12324 }
12325 
12326 /* INSERT */
12327 /*
12328  * pt_apply_insert () -
12329  * return:
12330  * parser(in):
12331  * p(in):
12332  * g(in):
12333  * arg(in):
12334  */
12335 static PT_NODE *
12336 pt_apply_insert (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
12337 {
12338  PT_APPLY_WALK (parser, p->info.insert.spec, arg);
12339  PT_APPLY_WALK (parser, p->info.insert.attr_list, arg);
12340  PT_APPLY_WALK (parser, p->info.insert.value_clauses, arg);
12341  PT_APPLY_WALK (parser, p->info.insert.into_var, arg);
12342  PT_APPLY_WALK (parser, p->info.insert.where, arg);
12343  PT_APPLY_WALK (parser, p->info.insert.internal_stmts, arg);
12344  PT_APPLY_WALK (parser, p->info.insert.waitsecs_hint, arg);
12345  PT_APPLY_WALK (parser, p->info.insert.odku_assignments, arg);
12346  PT_APPLY_WALK (parser, p->info.insert.odku_non_null_attrs, arg);
12347  PT_APPLY_WALK (parser, p->info.insert.non_null_attrs, arg);
12348  return p;
12349 }
12350 
12351 /*
12352  * pt_init_insert () -
12353  * return:
12354  * p(in):
12355  */
12356 static PT_NODE *
12358 {
12362  return p;
12363 }
12364 
12365 /*
12366  * pt_print_insert () -
12367  * return:
12368  * parser(in):
12369  * p(in):
12370  */
12371 static PARSER_VARCHAR *
12373 {
12374  PARSER_VARCHAR *b = NULL, *r1, *r2;
12375  PT_NODE *crt_list = NULL;
12376  bool is_first_list = true, multiple_values_insert = false;
12377 
12378  r1 = pt_print_bytes (parser, p->info.insert.spec);
12379  r2 = pt_print_bytes_l (parser, p->info.insert.attr_list);
12380 
12382  {
12383  b = pt_append_nulstring (parser, b, "(");
12384  }
12385  if (p->info.insert.do_replace)
12386  {
12387  b = pt_append_nulstring (parser, b, "replace ");
12388  }
12389  else
12390  {
12391  b = pt_append_nulstring (parser, b, "insert ");
12392  }
12393  if (p->info.insert.hint != PT_HINT_NONE)
12394  {
12395  b = pt_append_nulstring (parser, b, "/*+");
12397  {
12398  PARSER_VARCHAR *vc;
12399  b = pt_append_nulstring (parser, b, " LOCK_TIMEOUT(");
12400  vc = pt_print_bytes (parser, p->info.insert.waitsecs_hint);
12401  b = pt_append_varchar (parser, b, vc);
12402  b = pt_append_nulstring (parser, b, ")");
12403  }
12405  {
12406  b = pt_append_nulstring (parser, b, " NO_LOGGING");
12407  }
12409  {
12410  PARSER_VARCHAR *vc;
12411  b = pt_append_nulstring (parser, b, " INSERT_EXECUTION_MODE(");
12412  vc = pt_print_bytes (parser, p->info.insert.insert_mode);
12413  b = pt_append_varchar (parser, b, vc);
12414  b = pt_append_nulstring (parser, b, ")");
12415  }
12416 
12417  if (p->info.insert.hint & PT_HINT_USE_SBR)
12418  {
12419  b = pt_append_nulstring (parser, b, " USE_SBR");
12420  }
12421 
12422  b = pt_append_nulstring (parser, b, " */ ");
12423  }
12424  b = pt_append_nulstring (parser, b, "into ");
12425  b = pt_append_varchar (parser, b, r1);
12426  if (r2)
12427  {
12428  b = pt_append_nulstring (parser, b, " (");
12429 
12431  {
12432  PARSER_VARCHAR *column_list = NULL;
12433  PT_NODE *attr = NULL;
12434 
12435  attr = p->info.insert.attr_list;
12436 
12437  while (attr)
12438  {
12439  column_list = pt_append_name (parser, column_list, attr->info.name.original);
12440 
12441  attr = attr->next;
12442 
12443  if (attr)
12444  {
12445  column_list = pt_append_nulstring (parser, column_list, ", ");
12446  }
12447  }
12448 
12449  b = pt_append_varchar (parser, b, column_list);
12450  }
12451  else
12452  {
12453  b = pt_append_varchar (parser, b, r2);
12454  }
12455 
12456  b = pt_append_nulstring (parser, b, ") ");
12457  }
12458  else
12459  {
12460  b = pt_append_nulstring (parser, b, " ");
12461  }
12462 
12463  for (crt_list = p->info.insert.value_clauses, is_first_list = true,
12464  multiple_values_insert = (crt_list != NULL && crt_list->next != NULL);
12465  crt_list != NULL; crt_list = crt_list->next, is_first_list = false)
12466  {
12467  if (!is_first_list)
12468  {
12469  b = pt_append_nulstring (parser, b, ", ");
12470  }
12471 
12472  switch (crt_list->info.node_list.list_type)
12473  {
12474  case PT_IS_DEFAULT_VALUE:
12475  if (is_first_list && multiple_values_insert)
12476  {
12477  b = pt_append_nulstring (parser, b, "values ");
12478  }
12479  b = pt_append_nulstring (parser, b, "default values");
12480  break;
12481 
12482  case PT_IS_VALUE:
12483  r1 = pt_print_bytes_l (parser, crt_list->info.node_list.list);
12484  if (is_first_list)
12485  {
12486  b = pt_append_nulstring (parser, b, "values ");
12487  }
12488  b = pt_append_nulstring (parser, b, "(");
12489  b = pt_append_varchar (parser, b, r1);
12490  b = pt_append_nulstring (parser, b, ")");
12491  break;
12492 
12493  case PT_IS_SUBQUERY:
12494  {
12495  PT_NODE *ptr_subquery = crt_list->info.node_list.list;
12496 
12497  if (ptr_subquery != NULL && ptr_subquery->node_type == PT_SELECT)
12498  {
12499  /* TODO why do we change is_subquery? What about PT_UNION and the rest? */
12500  ptr_subquery->info.query.is_subquery = (PT_MISC_TYPE) 0;
12501  }
12502  r1 = pt_print_bytes (parser, ptr_subquery);
12503  b = pt_append_varchar (parser, b, r1);
12504  }
12505  break;
12506 
12507  default:
12508  assert (false);
12509  break;
12510  }
12511  }
12512 
12513  if (p->info.insert.into_var)
12514  {
12515  if (!(parser->custom_print & PT_SUPPRESS_INTO))
12516  {
12517  r1 = pt_print_bytes (parser, p->info.insert.into_var);
12518  b = pt_append_nulstring (parser, b, " into ");
12519  b = pt_append_varchar (parser, b, r1);
12520  }
12521  }
12522 
12523  if (p->info.insert.odku_assignments)
12524  {
12525  r1 = pt_print_bytes_l (parser, p->info.insert.odku_assignments);
12526  b = pt_append_nulstring (parser, b, " on duplicate key update ");
12527  b = pt_append_varchar (parser, b, r1);
12528  }
12529 
12531  {
12532  b = pt_append_nulstring (parser, b, ") ");
12533  }
12534 
12535  if (!(parser->custom_print & PT_SUPPRESS_INTO) && p->info.insert.where)
12536  {
12537  r1 = pt_print_and_list (parser, p->info.insert.where);
12538  b = pt_append_nulstring (parser, b, "\n-- check condition: ");
12539  b = pt_append_varchar (parser, b, r1);
12540  b = pt_append_nulstring (parser, b, "\n");
12541  }
12542  return b;
12543 }
12544 
12545 /* INTERSECTION */
12546 /*
12547  * pt_apply_intersection () -
12548  * return:
12549  * parser(in):
12550  * p(in):
12551  * g(in):
12552  * arg(in):
12553  */
12554 static PT_NODE *
12556 {
12557  PT_APPLY_WALK (parser, p->info.query.with, arg);
12558  PT_APPLY_WALK (parser, p->info.query.q.union_.arg1, arg);
12559  PT_APPLY_WALK (parser, p->info.query.q.union_.arg2, arg);
12560  PT_APPLY_WALK (parser, p->info.query.into_list, arg);
12561  PT_APPLY_WALK (parser, p->info.query.order_by, arg);
12562  PT_APPLY_WALK (parser, p->info.query.orderby_for, arg);
12563  return p;
12564 }
12565 
12566 /*
12567  * pt_init_intersection () -
12568  * return:
12569  * p(in):
12570  */
12571 static PT_NODE *
12573 {
12575  p->info.query.hint = PT_HINT_NONE;
12577  return p;
12578 }
12579 
12580 /*
12581  * pt_print_intersection () -
12582  * return:
12583  * parser(in):
12584  * p(in):
12585  */
12586 static PARSER_VARCHAR *
12588 {
12589  PARSER_VARCHAR *q = NULL, *r1, *r2;
12590 
12591  if (p->info.query.with != NULL)
12592  {
12593  r1 = pt_print_bytes_l (parser, p->info.query.with);
12594  q = pt_append_varchar (parser, q, r1);
12595  }
12596 
12597  r1 = pt_print_bytes (parser, p->info.query.q.union_.arg1);
12598  r2 = pt_print_bytes (parser, p->info.query.q.union_.arg2);
12599  q = pt_append_nulstring (parser, q, "(");
12600  q = pt_append_varchar (parser, q, r1);
12601  if (p->info.query.all_distinct == PT_ALL)
12602  {
12603  q = pt_append_nulstring (parser, q, " intersect all ");
12604  }
12605  else
12606  {
12607  q = pt_append_nulstring (parser, q, " intersect ");
12608  }
12609  q = pt_append_varchar (parser, q, r2);
12610  q = pt_append_nulstring (parser, q, ")");
12611 
12612  if (p->info.query.order_by)
12613  {
12614  r1 = pt_print_bytes_l (parser, p->info.query.order_by);
12615  q = pt_append_nulstring (parser, q, " order by ");
12616  q = pt_append_varchar (parser, q, r1);
12617  }
12618  if (p->info.query.orderby_for)
12619  {
12620  r1 = pt_print_bytes_l (parser, p->info.query.orderby_for);
12621  q = pt_append_nulstring (parser, q, " for");
12622  q = pt_append_varchar (parser, q, r1);
12623  }
12624  if (p->info.query.limit && p->info.query.flag.rewrite_limit)
12625  {
12626  r1 = pt_print_bytes_l (parser, p->info.query.limit);
12627  q = pt_append_nulstring (parser, q, " limit ");
12628  q = pt_append_varchar (parser, q, r1);
12629  }
12630  return q;
12631 }
12632 
12633 /* AUTO INCREMENT */
12634 /*
12635  * pt_apply_auto_increment () -
12636  * return:
12637  * parser(in):
12638  * p(in):
12639  * g(in):
12640  * arg(in):
12641  */
12642 static PT_NODE *
12644 {
12645  return p;
12646 }
12647 
12648 /*
12649  * pt_print_auto_increment () -
12650  * return:
12651  * parser(in):
12652  * p(in):
12653  */
12654 static PARSER_VARCHAR *
12656 {
12657  PARSER_VARCHAR *b = NULL, *r1, *r2;
12658 
12659  r1 = pt_print_bytes (parser, p->info.auto_increment.start_val);
12660  r2 = pt_print_bytes (parser, p->info.auto_increment.increment_val);
12661 
12662  b = pt_append_nulstring (parser, b, " AUTO_INCREMENT");
12664  {
12665  b = pt_append_nulstring (parser, b, "(");
12666  b = pt_append_varchar (parser, b, r1);
12667  b = pt_append_nulstring (parser, b, ", ");
12668  b = pt_append_varchar (parser, b, r2);
12669  b = pt_append_nulstring (parser, b, ") ");
12670  }
12671 
12672  return b;
12673 }
12674 
12675 /* ISOLATION_LVL */
12676 /*
12677  * pt_apply_isolation_lvl () -
12678  * return:
12679  * parser(in):
12680  * p(in):
12681  * g(in):
12682  * arg(in):
12683  */
12684 static PT_NODE *
12686 {
12687  PT_APPLY_WALK (parser, p->info.isolation_lvl.level, arg);
12688  return p;
12689 }
12690 
12691 /*
12692  * pt_init_isolation_lvl () -
12693  * return:
12694  * p(in):
12695  */
12696 static PT_NODE *
12698 {
12700  return (p);
12701 }
12702 
12703 /*
12704  * pt_print_isolation_lvl () -
12705  * return:
12706  * parser(in):
12707  * p(in):
12708  */
12709 static PARSER_VARCHAR *
12711 {
12712  PARSER_VARCHAR *b = NULL, *r1;
12713 
12714  b = pt_append_nulstring (parser, b, "isolation level ");
12716  {
12717  b = pt_append_nulstring (parser, b, " serializable ");
12718  }
12719  else
12720  {
12722  {
12724  b = pt_append_nulstring (parser, b, " schema");
12725  }
12727  {
12729  {
12730  b = pt_append_nulstring (parser, b, ",");
12731  }
12733  b = pt_append_nulstring (parser, b, " instances ");
12734  }
12735  }
12736 
12737  if (p->info.isolation_lvl.level)
12738  {
12739  r1 = pt_print_bytes (parser, p->info.isolation_lvl.level);
12740  b = pt_append_varchar (parser, b, r1);
12741  }
12742  if (p->info.isolation_lvl.async_ws)
12743  {
12744  b = pt_append_nulstring (parser, b, ", async workspace ");
12745  }
12746 
12747  return b;
12748 }
12749 
12750 /* METHOD_CALL */
12751 /*
12752  * pt_apply_method_call () -
12753  * return:
12754  * parser(in):
12755  * p(in):
12756  * g(in):
12757  * arg(in):
12758  */
12759 static PT_NODE *
12760 pt_apply_method_call (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
12761 {
12762  PT_APPLY_WALK (parser, p->info.method_call.method_name, arg);
12763  PT_APPLY_WALK (parser, p->info.method_call.arg_list, arg);
12764  PT_APPLY_WALK (parser, p->info.method_call.on_call_target, arg);
12765  PT_APPLY_WALK (parser, p->info.method_call.to_return_var, arg);
12766  return p;
12767 }
12768 
12769 /*
12770  * pt_print_method_call () -
12771  * return:
12772  * parser(in):
12773  * p(in):
12774  */
12775 static PARSER_VARCHAR *
12777 {
12778  PARSER_VARCHAR *q = 0, *r1, *r2;
12779 
12780  r1 = pt_print_bytes (parser, p->info.method_call.method_name);
12781  r2 = pt_print_bytes_l (parser, p->info.method_call.arg_list);
12782 
12784  {
12785  q = pt_append_nulstring (parser, q, "call ");
12786  }
12787  q = pt_append_varchar (parser, q, r1);
12788  q = pt_append_nulstring (parser, q, "(");
12789  q = pt_append_varchar (parser, q, r2);
12790  q = pt_append_nulstring (parser, q, ")");
12791 
12793  {
12794  r1 = pt_print_bytes (parser, p->info.method_call.on_call_target);
12795  q = pt_append_nulstring (parser, q, " on ");
12796  q = pt_append_varchar (parser, q, r1);
12797  }
12798  return q;
12799 }
12800 
12801 /* METHOD_DEF */
12802 /*
12803  * pt_apply_method_def () -
12804  * return:
12805  * parser(in):
12806  * p(in):
12807  * g(in):
12808  * arg(in):
12809  */
12810 static PT_NODE *
12811 pt_apply_method_def (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
12812 {
12813  PT_APPLY_WALK (parser, p->info.method_def.method_name, arg);
12814  PT_APPLY_WALK (parser, p->info.method_def.method_args_list, arg);
12815  PT_APPLY_WALK (parser, p->info.method_def.function_name, arg);
12816  return p;
12817 }
12818 
12819 /*
12820  * pt_init_method_def () -
12821  * return:
12822  * p(in):
12823  */
12824 static PT_NODE *
12826 {
12828  return p;
12829 }
12830 
12831 /*
12832  * pt_print_method_def () -
12833  * return:
12834  * parser(in):
12835  * p(in):
12836  */
12837 static PARSER_VARCHAR *
12839 {
12840  PARSER_VARCHAR *q = 0, *r1;
12841 
12842  r1 = pt_print_bytes (parser, p->info.method_def.method_name);
12843 
12845  {
12846  q = pt_append_nulstring (parser, q, " class ");
12847  }
12848  q = pt_append_varchar (parser, q, r1);
12849  q = pt_append_nulstring (parser, q, "( ");
12850 
12852  {
12854  q = pt_append_varchar (parser, q, r1);
12855  }
12856 
12857  q = pt_append_nulstring (parser, q, ") ");
12858 
12859  if (p->type_enum != PT_TYPE_NONE)
12860  {
12861  if (p->data_type)
12862  {
12863  r1 = pt_print_bytes (parser, p->data_type);
12864  q = pt_append_varchar (parser, q, r1);
12865  }
12866  else
12867  {
12868  q = pt_append_nulstring (parser, q, pt_show_type_enum (p->type_enum));
12869  }
12870  }
12871  if (p->info.method_def.function_name)
12872  {
12873  r1 = pt_print_bytes (parser, p->info.method_def.function_name);
12874  q = pt_append_nulstring (parser, q, " function ");
12875  q = pt_append_varchar (parser, q, r1);
12876  }
12877  return q;
12878 }
12879 
12880 /* NAME */
12881 /*
12882  * pt_apply_name () -
12883  * return:
12884  * parser(in):
12885  * p(in):
12886  * g(in):
12887  * arg(in):
12888  */
12889 static PT_NODE *
12890 pt_apply_name (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
12891 {
12892  PT_APPLY_WALK (parser, p->info.name.path_correlation, arg);
12893  PT_APPLY_WALK (parser, p->info.name.default_value, arg);
12894  PT_APPLY_WALK (parser, p->info.name.indx_key_limit, arg);
12895  return p;
12896 }
12897 
12898 /*
12899  * pt_init_name () -
12900  * return:
12901  * p(in):
12902  */
12903 static PT_NODE *
12905 {
12907  return p;
12908 }
12909 
12910 /*
12911  * pt_print_name () -
12912  * return:
12913  * parser(in):
12914  * p(in):
12915  */
12916 static PARSER_VARCHAR *
12918 {
12919  PARSER_VARCHAR *q = NULL, *r1;
12920  unsigned int save_custom = parser->custom_print;
12921 
12922  parser->custom_print = parser->custom_print | p->info.name.custom_print;
12923 
12925  {
12926  q = pt_append_nulstring (parser, q, "class ");
12927  }
12928 
12930  {
12931  q = pt_append_nulstring (parser, q, "class(");
12932  }
12933 
12934  if (p->info.name.meta_class == PT_PARAMETER)
12935  {
12936  q = pt_append_nulstring (parser, q, ":");
12937  }
12938 
12939  if (p->info.name.meta_class == PT_OID_ATTR)
12940  {
12941  /* print the correlation name, which may be in one of two locations, before and after name resolution. */
12942  if (p->info.name.original && p->info.name.original[0])
12943  {
12944  char *lcase_name;
12945  int name_size;
12946 
12948  lcase_name = (char *) db_private_alloc (NULL, name_size + 1);
12949  intl_identifier_lower (p->info.name.original, lcase_name);
12950  q = pt_append_name (parser, q, lcase_name);
12951  db_private_free_and_init (NULL, lcase_name);
12952  }
12953  else if (p->info.name.resolved)
12954  {
12955  q = pt_append_name (parser, q, p->info.name.resolved);
12956  }
12957  }
12958  else
12959  /* do not print 'resolved' for PT_PARAMETER(i.e, 'out parameter') */
12960  if (!(parser->custom_print & PT_SUPPRESS_RESOLVED) && (p->info.name.resolved && p->info.name.resolved[0])
12962  && p->info.name.meta_class != PT_HINT_NAME)
12963  {
12964  /* Print both resolved name and original name If there is a non-zero length resolved name, print it, followed by
12965  * ".". */
12967  {
12968  /* make sure spec_id points to original table */
12969  PT_NODE *original_spec;
12970 
12971  assert (p->info.name.spec_id);
12972  original_spec = (PT_NODE *) p->info.name.spec_id;
12973  if (original_spec->info.spec.entity_name && original_spec->info.spec.entity_name->info.name.original)
12974  {
12975  q = pt_append_name (parser, q, original_spec->info.spec.entity_name->info.name.original);
12976  }
12977  else
12978  {
12979  q = pt_append_name (parser, q, p->info.name.resolved);
12980  }
12981  }
12982  else
12983  {
12984  q = pt_append_name (parser, q, p->info.name.resolved);
12985  }
12986  /* this is to catch OID_ATTR's which don't have their meta class set correctly. It should probably not by
12987  * unconditional. */
12988  if (p->info.name.meta_class != PT_META_CLASS && p->info.name.original && p->info.name.original[0])
12989  {
12990  q = pt_append_nulstring (parser, q, ".");
12991  q = pt_append_name (parser, q, p->info.name.original);
12992  if (p->info.name.meta_class == PT_INDEX_NAME)
12993  {
12994  if (p->etc == (void *) PT_IDX_HINT_FORCE)
12995  {
12996  q = pt_append_nulstring (parser, q, "(+)");
12997  }
12998  if (p->etc == (void *) PT_IDX_HINT_IGNORE)
12999  {
13000  q = pt_append_nulstring (parser, q, "(-)");
13001  }
13002  }
13003  if (p->info.name.indx_key_limit)
13004  {
13005  q = pt_append_nulstring (parser, q, " keylimit ");
13006  if (p->info.name.indx_key_limit->next)
13007  {
13008  r1 = pt_print_bytes (parser, p->info.name.indx_key_limit->next);
13009  q = pt_append_varchar (parser, q, r1);
13010  q = pt_append_nulstring (parser, q, ",");
13011  }
13012  r1 = pt_print_bytes (parser, p->info.name.indx_key_limit);
13013  q = pt_append_varchar (parser, q, r1);
13014  }
13015  }
13016  if (p->info.name.meta_class == PT_INDEX_NAME && p->info.name.original == NULL
13017  && p->etc == (void *) PT_IDX_HINT_CLASS_NONE)
13018  {
13019  q = pt_append_nulstring (parser, q, ".");
13020  q = pt_append_nulstring (parser, q, "none");
13021  }
13022  }
13023  else
13024  {
13025  /* here we print whatever the length */
13026  if (p->info.name.original)
13027  {
13028  q = pt_append_name (parser, q, p->info.name.original);
13029  if (p->info.name.meta_class == PT_INDEX_NAME)
13030  {
13031  if (p->etc == (void *) PT_IDX_HINT_FORCE)
13032  {
13033  q = pt_append_nulstring (parser, q, "(+)");
13034  }
13035  /* TODO: temporary for IGNORE INDEX */
13036  if (p->etc == (void *) PT_IDX_HINT_IGNORE)
13037  {
13038  q = pt_append_nulstring (parser, q, "(-)");
13039  }
13040  }
13041  if (p->info.name.indx_key_limit)
13042  {
13043  q = pt_append_nulstring (parser, q, " keylimit ");
13044  if (p->info.name.indx_key_limit->next)
13045  {
13046  r1 = pt_print_bytes (parser, p->info.name.indx_key_limit->next);
13047  q = pt_append_varchar (parser, q, r1);
13048  q = pt_append_nulstring (parser, q, ",");
13049  }
13050  r1 = pt_print_bytes (parser, p->info.name.indx_key_limit);
13051  q = pt_append_varchar (parser, q, r1);
13052  }
13053  }
13054  else
13055  {
13056  if (p->info.name.meta_class == PT_INDEX_NAME && p->info.name.resolved && p->info.name.resolved[0]
13057  && p->etc == (void *) PT_IDX_HINT_CLASS_NONE)
13058  {
13059  /* always print resolved for "class_name.NONE" index names */
13060  q = pt_append_name (parser, q, p->info.name.resolved);
13061  q = pt_append_nulstring (parser, q, ".");
13062  q = pt_append_nulstring (parser, q, "none");
13063  }
13064  }
13065  }
13067  {
13068  q = pt_append_nulstring (parser, q, ")");
13069  }
13070 
13071  if (!(parser->custom_print & PT_SUPPRESS_SELECTOR))
13072  {
13073  if (p->info.name.path_correlation)
13074  {
13075  r1 = pt_print_bytes (parser, p->info.name.path_correlation);
13076  q = pt_append_nulstring (parser, q, " {");
13077  q = pt_append_varchar (parser, q, r1);
13078  q = pt_append_nulstring (parser, q, "}");
13079  }
13080  }
13081 
13082  if (p->type_enum == PT_TYPE_STAR)
13083  {
13084  q = pt_append_nulstring (parser, q, ".*");
13085  }
13086 
13088  {
13089  q = pt_append_nulstring (parser, q, " desc");
13090  }
13091 
13092  if ((parser->custom_print & PT_PRINT_ALIAS) && p->alias_print != NULL)
13093  {
13094  q = pt_append_nulstring (parser, q, " as [");
13095  q = pt_append_nulstring (parser, q, p->alias_print);
13096  q = pt_append_nulstring (parser, q, "]");
13097  }
13098 
13099  parser->custom_print = save_custom;
13100  return q;
13101 }
13102 
13103 /* PREPARE TO COMMIT */
13104 /*
13105  * pt_apply_prepare_to_commit () -
13106  * return:
13107  * parser(in):
13108  * p(in):
13109  * g(in):
13110  * arg(in):
13111  */
13112 static PT_NODE *
13114 {
13115  return p;
13116 }
13117 
13118 /*
13119  * pt_print_prepare_to_commit () -
13120  * return:
13121  * parser(in):
13122  * p(in):
13123  */
13124 static PARSER_VARCHAR *
13126 {
13127  char s[PT_MEMB_BUF_SIZE];
13128 
13129  sprintf (s, "prepare to commit %d ", p->info.prepare_to_commit.trans_id);
13130  return pt_append_nulstring (parser, NULL, s);
13131 }
13132 
13133 /* REMOVE_TRIGGER */
13134 /*
13135  * pt_apply_remove_trigger () -
13136  * return:
13137  * parser(in):
13138  * p(in):
13139  * g(in):
13140  * arg(in):
13141  */
13142 static PT_NODE *
13144 {
13146  return p;
13147 }
13148 
13149 /*
13150  * pt_print_remove_trigger () -
13151  * return:
13152  * parser(in):
13153  * p(in):
13154  */
13155 static PARSER_VARCHAR *
13157 {
13158  PARSER_VARCHAR *b = NULL, *r1;
13159 
13161  b = pt_append_nulstring (parser, b, "drop deferred trigger ");
13162  b = pt_append_varchar (parser, b, r1);
13163 
13164  return b;
13165 }
13166 
13167 /* RENAME */
13168 /*
13169  * pt_apply_rename () -
13170  * return:
13171  * parser(in):
13172  * p(in):
13173  * g(in):
13174  * arg(in):
13175  */
13176 static PT_NODE *
13177 pt_apply_rename (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
13178 {
13179  PT_APPLY_WALK (parser, p->info.rename.old_name, arg);
13180  PT_APPLY_WALK (parser, p->info.rename.in_class, arg);
13181  PT_APPLY_WALK (parser, p->info.rename.new_name, arg);
13182  return p;
13183 }
13184 
13185 /*
13186  * pt_print_rename () -
13187  * return:
13188  * parser(in):
13189  * p(in):
13190  */
13191 static PARSER_VARCHAR *
13193 {
13194  PARSER_VARCHAR *b = NULL;
13195  PT_NODE *crt_pair = p;
13196 
13197  b = pt_append_nulstring (parser, b, "rename ");
13199  b = pt_append_nulstring (parser, b, " ");
13200  do
13201  {
13202  PARSER_VARCHAR *r1, *r2;
13203 
13204  r1 = pt_print_bytes (parser, crt_pair->info.rename.old_name);
13205  r2 = pt_print_bytes (parser, crt_pair->info.rename.new_name);
13206  b = pt_append_varchar (parser, b, r1);
13207  b = pt_append_nulstring (parser, b, " as ");
13208  b = pt_append_varchar (parser, b, r2);
13209  if (crt_pair->next != NULL)
13210  {
13211  b = pt_append_nulstring (parser, b, ", ");
13212  }
13213  crt_pair = crt_pair->next;
13214  }
13215  while (crt_pair != NULL);
13216  return b;
13217 }
13218 
13219 /* RENAME TRIGGER */
13220 /*
13221  * pt_apply_rename_trigger () -
13222  * return:
13223  * parser(in):
13224  * p(in):
13225  * g(in):
13226  * arg(in):
13227  */
13228 static PT_NODE *
13230 {
13231  PT_APPLY_WALK (parser, p->info.rename_trigger.old_name, arg);
13232  PT_APPLY_WALK (parser, p->info.rename_trigger.new_name, arg);
13233  return p;
13234 }
13235 
13236 /*
13237  * pt_print_rename_trigger () -
13238  * return:
13239  * parser(in):
13240  * p(in):
13241  */
13242 static PARSER_VARCHAR *
13244 {
13245  PARSER_VARCHAR *b = 0, *r1, *r2;
13246 
13247  r1 = pt_print_bytes (parser, p->info.rename_trigger.old_name);
13248  r2 = pt_print_bytes (parser, p->info.rename_trigger.new_name);
13249  b = pt_append_nulstring (parser, b, "rename trigger ");
13250  b = pt_append_varchar (parser, b, r1);
13251  b = pt_append_nulstring (parser, b, " as ");
13252  b = pt_append_varchar (parser, b, r2);
13253 
13254  return b;
13255 }
13256 
13257 /* RESOLUTION */
13258 /*
13259  * pt_apply_resolution () -
13260  * return:
13261  * parser(in):
13262  * p(in):
13263  * g(in):
13264  * arg(in):
13265  */
13266 static PT_NODE *
13267 pt_apply_resolution (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
13268 {
13269  PT_APPLY_WALK (parser, p->info.resolution.attr_mthd_name, arg);
13270  PT_APPLY_WALK (parser, p->info.resolution.of_sup_class_name, arg);
13271  PT_APPLY_WALK (parser, p->info.resolution.as_attr_mthd_name, arg);
13272  return p;
13273 }
13274 
13275 /*
13276  * pt_init_resolution () -
13277  * return:
13278  * p(in):
13279  */
13280 static PT_NODE *
13282 {
13284  return p;
13285 }
13286 
13287 /*
13288  * pt_print_resolution () -
13289  * return:
13290  * parser(in):
13291  * p(in):
13292  */
13293 static PARSER_VARCHAR *
13295 {
13296  PARSER_VARCHAR *q = 0, *r1, *r2;
13297 
13298  r1 = pt_print_bytes (parser, p->info.resolution.attr_mthd_name);
13299  r2 = pt_print_bytes (parser, p->info.resolution.of_sup_class_name);
13301  {
13302  q = pt_append_nulstring (parser, q, " class ");
13303  }
13304  q = pt_append_varchar (parser, q, r1);
13305  q = pt_append_nulstring (parser, q, " of ");
13306  q = pt_append_varchar (parser, q, r2);
13307 
13309  {
13310  r1 = pt_print_bytes (parser, p->info.resolution.as_attr_mthd_name);
13311  q = pt_append_nulstring (parser, q, " as ");
13312  q = pt_append_varchar (parser, q, r1);
13313  }
13314 
13315  return q;
13316 }
13317 
13318 /* REVOKE */
13319 /*
13320  * pt_apply_revoke () -
13321  * return:
13322  * parser(in):
13323  * p(in):
13324  * g(in):
13325  * arg(in):
13326  */
13327 static PT_NODE *
13328 pt_apply_revoke (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
13329 {
13330  PT_APPLY_WALK (parser, p->info.revoke.auth_cmd_list, arg);
13331  PT_APPLY_WALK (parser, p->info.revoke.user_list, arg);
13332  PT_APPLY_WALK (parser, p->info.revoke.spec_list, arg);
13333  return p;
13334 }
13335 
13336 /*
13337  * pt_print_revoke () -
13338  * return:
13339  * parser(in):
13340  * p(in):
13341  */
13342 static PARSER_VARCHAR *
13344 {
13345  PARSER_VARCHAR *q = 0, *r1, *r2, *r3;
13346  unsigned int save_custom;
13347 
13348  r1 = pt_print_bytes_l (parser, p->info.revoke.auth_cmd_list);
13349  save_custom = parser->custom_print;
13351  r2 = pt_print_bytes_l (parser, p->info.revoke.spec_list);
13352  parser->custom_print = save_custom;
13353  r3 = pt_print_bytes_l (parser, p->info.revoke.user_list);
13354  q = pt_append_nulstring (parser, q, "revoke ");
13355  q = pt_append_varchar (parser, q, r1);
13356  q = pt_append_nulstring (parser, q, " on ");
13357  q = pt_append_varchar (parser, q, r2);
13358  q = pt_append_nulstring (parser, q, " from ");
13359  q = pt_append_varchar (parser, q, r3);
13360 
13361  return q;
13362 }
13363 
13364 /* ROLLBACK_WORK */
13365 /*
13366  * pt_apply_rollback_work () -
13367  * return:
13368  * parser(in):
13369  * p(in):
13370  * g(in):
13371  * arg(in):
13372  */
13373 static PT_NODE *
13375 {
13376  PT_APPLY_WALK (parser, p->info.rollback_work.save_name, arg);
13377  return p;
13378 }
13379 
13380 /*
13381  * pt_print_rollback_work () -
13382  * return:
13383  * parser(in):
13384  * p(in):
13385  */
13386 static PARSER_VARCHAR *
13388 {
13389  PARSER_VARCHAR *q = 0, *r1;
13390 
13391  q = pt_append_nulstring (parser, q, "rollback work");
13392  if (p->info.rollback_work.save_name)
13393  {
13394  r1 = pt_print_bytes (parser, p->info.rollback_work.save_name);
13395  q = pt_append_nulstring (parser, q, " to savepoint ");
13396  q = pt_append_varchar (parser, q, r1);
13397  }
13398 
13399  return q;
13400 }
13401 
13402 /* SAVEPOINT */
13403 /*
13404  * pt_apply_savepoint () -
13405  * return:
13406  * parser(in):
13407  * p(in):
13408  * g(in):
13409  * arg(in):
13410  */
13411 static PT_NODE *
13412 pt_apply_savepoint (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
13413 {
13414  PT_APPLY_WALK (parser, p->info.savepoint.save_name, arg);
13415  return p;
13416 }
13417 
13418 /*
13419  * pt_print_savepoint () -
13420  * return:
13421  * parser(in):
13422  * p(in):
13423  */
13424 static PARSER_VARCHAR *
13426 {
13427  PARSER_VARCHAR *b = NULL, *r1;
13428 
13429  r1 = pt_print_bytes (parser, p->info.savepoint.save_name);
13430  b = pt_append_nulstring (parser, b, "savepoint ");
13431  b = pt_append_varchar (parser, b, r1);
13432 
13433  return b;
13434 }
13435 
13436 /* SCOPE */
13437 /*
13438  * pt_apply_scope () -
13439  * return:
13440  * parser(in):
13441  * p(in):
13442  * g(in):
13443  * arg(in):
13444  */
13445 static PT_NODE *
13446 pt_apply_scope (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
13447 {
13448  PT_APPLY_WALK (parser, p->info.scope.from, arg);
13449  PT_APPLY_WALK (parser, p->info.scope.stmt, arg);
13450  return p;
13451 }
13452 
13453 /*
13454  * pt_print_scope () -
13455  * return:
13456  * parser(in):
13457  * p(in):
13458  */
13459 static PARSER_VARCHAR *
13461 {
13462  PARSER_VARCHAR *b = NULL, *r1, *r2;
13463 
13464  r1 = pt_print_bytes (parser, p->info.scope.stmt);
13465  r2 = pt_print_bytes (parser, p->info.scope.from);
13466  b = pt_append_nulstring (parser, b, "scope ");
13467  b = pt_append_varchar (parser, b, r1);
13468  b = pt_append_nulstring (parser, b, " from ");
13469  b = pt_append_varchar (parser, b, r2);
13470 
13471  return b;
13472 }
13473 
13474 /* SELECT */
13475 /*
13476  * pt_apply_select () -
13477  * return:
13478  * parser(in):
13479  * p(in):
13480  * g(in):
13481  * arg(in):
13482  */
13483 static PT_NODE *
13484 pt_apply_select (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
13485 {
13486  PT_APPLY_WALK (parser, p->info.query.with, arg);
13487  PT_APPLY_WALK (parser, p->info.query.q.select.list, arg);
13488  PT_APPLY_WALK (parser, p->info.query.q.select.from, arg);
13489  PT_APPLY_WALK (parser, p->info.query.q.select.where, arg);
13490  PT_APPLY_WALK (parser, p->info.query.q.select.connect_by, arg);
13491  PT_APPLY_WALK (parser, p->info.query.q.select.start_with, arg);
13492  PT_APPLY_WALK (parser, p->info.query.q.select.after_cb_filter, arg);
13493  PT_APPLY_WALK (parser, p->info.query.q.select.group_by, arg);
13494  PT_APPLY_WALK (parser, p->info.query.q.select.having, arg);
13495  PT_APPLY_WALK (parser, p->info.query.q.select.using_index, arg);
13496  PT_APPLY_WALK (parser, p->info.query.q.select.with_increment, arg);
13497  PT_APPLY_WALK (parser, p->info.query.q.select.ordered, arg);
13498  PT_APPLY_WALK (parser, p->info.query.q.select.use_nl, arg);
13499  PT_APPLY_WALK (parser, p->info.query.q.select.use_idx, arg);
13500  PT_APPLY_WALK (parser, p->info.query.q.select.index_ss, arg);
13501  PT_APPLY_WALK (parser, p->info.query.q.select.index_ls, arg);
13502  PT_APPLY_WALK (parser, p->info.query.q.select.use_merge, arg);
13503  PT_APPLY_WALK (parser, p->info.query.q.select.waitsecs_hint, arg);
13504  PT_APPLY_WALK (parser, p->info.query.into_list, arg);
13505  PT_APPLY_WALK (parser, p->info.query.order_by, arg);
13506  PT_APPLY_WALK (parser, p->info.query.orderby_for, arg);
13507  PT_APPLY_WALK (parser, p->info.query.qcache_hint, arg);
13508  PT_APPLY_WALK (parser, p->info.query.q.select.check_where, arg);
13509  PT_APPLY_WALK (parser, p->info.query.limit, arg);
13510  PT_APPLY_WALK (parser, p->info.query.q.select.for_update, arg);
13511  return p;
13512 }
13513 
13514 /*
13515  * pt_init_select () -
13516  * return:
13517  * p(in):
13518  */
13519 static PT_NODE *
13521 {
13526  p->info.query.hint = PT_HINT_NONE;
13528  return p;
13529 }
13530 
13531 /*
13532  * pt_print_select () -
13533  * return:
13534  * parser(in):
13535  * p(in):
13536  */
13537 static PARSER_VARCHAR *
13539 {
13540  PARSER_VARCHAR *q = NULL, *r1 = NULL;
13541  PT_NODE *temp = NULL, *where_list = NULL;
13542  bool set_paren = false; /* init */
13543  bool toggle_print_alias = false;
13544  bool is_first_list;
13545  unsigned int save_custom = 0;
13546  PT_NODE *from = NULL, *derived_table = NULL;
13547 
13548  from = p->info.query.q.select.from;
13549  if (from != NULL && from->info.spec.derived_table_type == PT_IS_SHOWSTMT
13550  && (derived_table = from->info.spec.derived_table) != NULL && derived_table->node_type == PT_SHOWSTMT)
13551  {
13552  r1 = pt_print_bytes (parser, derived_table);
13553  q = pt_append_varchar (parser, q, r1);
13554 
13555  where_list = p->info.query.q.select.where;
13556  if (where_list != NULL)
13557  {
13558  r1 = pt_print_and_list (parser, where_list);
13559  q = pt_append_nulstring (parser, q, " where ");
13560  q = pt_append_varchar (parser, q, r1);
13561  }
13562  return q;
13563  }
13564 
13566  {
13567  q = pt_append_nulstring (parser, q, "show index from ");
13568  r1 = pt_print_bytes_spec_list (parser, p->info.query.q.select.from);
13569  q = pt_append_varchar (parser, q, r1);
13570  return q;
13571  }
13572 
13575  {
13576  PT_NODE *from = p->info.query.q.select.from;
13578  {
13579  char s[64];
13580  PT_NODE *subq = from->info.spec.derived_table;
13581 
13582  sprintf (s, "show %s columns from ", PT_SELECT_INFO_IS_FLAGED (p, PT_SELECT_INFO_COLS_SCHEMA) ? "" : "full");
13583  q = pt_append_nulstring (parser, q, s);
13584 
13585  if (subq != NULL)
13586  {
13587  r1 = pt_print_bytes_spec_list (parser, subq->info.query.q.select.from);
13588  q = pt_append_varchar (parser, q, r1);
13589  }
13590  else
13591  {
13592  // immature parse tree probably due to an error.
13593  q = pt_append_nulstring (parser, q, "unknown");
13594  }
13595 
13596  where_list = p->info.query.q.select.where;
13597  if (where_list)
13598  {
13599  r1 = pt_print_and_list (parser, where_list);
13600  q = pt_append_nulstring (parser, q, " where ");
13601  q = pt_append_varchar (parser, q, r1);
13602  }
13603  }
13604  else
13605  {
13606  q = pt_append_nulstring (parser, q, "");
13607  }
13608 
13609  return q;
13610  }
13611 
13615  {
13616  set_paren = true;
13617  }
13618 
13619  if (set_paren)
13620  {
13621  q = pt_append_nulstring (parser, q, "(");
13622  }
13623 
13624  temp = p->info.query.q.select.list;
13625  if (temp && temp->node_type == PT_NODE_LIST) /* values(...),... */
13626  {
13627  q = pt_append_nulstring (parser, q, "values ");
13628 
13629  save_custom = parser->custom_print;
13630  parser->custom_print |= PT_PRINT_ALIAS;
13631 
13632  is_first_list = true;
13633  for (temp = temp; temp; temp = temp->next)
13634  {
13635  if (!is_first_list)
13636  {
13637  q = pt_append_nulstring (parser, q, ",(");
13638  }
13639  else
13640  {
13641  q = pt_append_nulstring (parser, q, "(");
13642  is_first_list = false;
13643  }
13644 
13645  r1 = pt_print_bytes_l (parser, temp->info.node_list.list);
13646  q = pt_append_varchar (parser, q, r1);
13647 
13648  q = pt_append_nulstring (parser, q, ")");
13649  }
13650 
13651  parser->custom_print = save_custom;
13652  }
13653  else
13654  {
13655  if (p->info.query.with != NULL)
13656  {
13657  r1 = pt_print_bytes_l (parser, p->info.query.with);
13658  q = pt_append_varchar (parser, q, r1);
13659  }
13660 
13661  q = pt_append_nulstring (parser, q, "select ");
13662 
13663  if (p->info.query.q.select.hint != PT_HINT_NONE
13665  {
13666  q = pt_append_nulstring (parser, q, "/*+ ");
13668  {
13669  /* query cache */
13670  q = pt_append_nulstring (parser, q, "QUERY_CACHE");
13671  if (p->info.query.qcache_hint)
13672  {
13673  r1 = pt_print_bytes (parser, p->info.query.qcache_hint);
13674  q = pt_append_nulstring (parser, q, "(");
13675  q = pt_append_varchar (parser, q, r1);
13676  q = pt_append_nulstring (parser, q, ") ");
13677  }
13678  else
13679  {
13680  q = pt_append_nulstring (parser, q, " ");
13681  }
13682  }
13684  {
13685  /* force join left-to-right */
13686  q = pt_append_nulstring (parser, q, "ORDERED");
13687  if (p->info.query.q.select.ordered)
13688  {
13689  r1 = pt_print_bytes_l (parser, p->info.query.q.select.ordered);
13690  q = pt_append_nulstring (parser, q, "(");
13691  q = pt_append_varchar (parser, q, r1);
13692  q = pt_append_nulstring (parser, q, ") ");
13693  }
13694  else
13695  {
13696  q = pt_append_nulstring (parser, q, " ");
13697  }
13698  }
13699 
13701  {
13702  q = pt_append_nulstring (parser, q, "NO_INDEX_SS ");
13703  }
13704  else if (p->info.query.q.select.hint & PT_HINT_INDEX_SS)
13705  {
13706  q = pt_append_nulstring (parser, q, "INDEX_SS");
13707  if (p->info.query.q.select.index_ss)
13708  {
13709  r1 = pt_print_bytes_l (parser, p->info.query.q.select.index_ss);
13710  q = pt_append_nulstring (parser, q, "(");
13711  q = pt_append_varchar (parser, q, r1);
13712  q = pt_append_nulstring (parser, q, ") ");
13713  }
13714  else
13715  {
13716  q = pt_append_nulstring (parser, q, " ");
13717  }
13718  }
13719 
13720 #if 0
13721  if (p->info.query.q.select.hint & PT_HINT_Y)
13722  {
13723  /* -- not used */
13724  q = pt_append_nulstring (parser, q, "Y ");
13725  }
13726 #endif /* 0 */
13727 
13728  if (p->info.query.q.select.hint & PT_HINT_USE_NL)
13729  {
13730  /* force nl-join */
13731  q = pt_append_nulstring (parser, q, "USE_NL");
13732  if (p->info.query.q.select.use_nl)
13733  {
13734  r1 = pt_print_bytes_l (parser, p->info.query.q.select.use_nl);
13735  q = pt_append_nulstring (parser, q, "(");
13736  q = pt_append_varchar (parser, q, r1);
13737  q = pt_append_nulstring (parser, q, ") ");
13738  }
13739  else
13740  {
13741  q = pt_append_nulstring (parser, q, " ");
13742  }
13743  }
13745  {
13746  /* force idx-join */
13747  q = pt_append_nulstring (parser, q, "USE_IDX");
13748  if (p->info.query.q.select.use_idx)
13749  {
13750  r1 = pt_print_bytes_l (parser, p->info.query.q.select.use_idx);
13751  q = pt_append_nulstring (parser, q, "(");
13752  q = pt_append_varchar (parser, q, r1);
13753  q = pt_append_nulstring (parser, q, ") ");
13754  }
13755  else
13756  {
13757  q = pt_append_nulstring (parser, q, " ");
13758  }
13759  }
13761  {
13762  /* force merge-join */
13763  q = pt_append_nulstring (parser, q, "USE_MERGE");
13764  if (p->info.query.q.select.use_merge)
13765  {
13766  r1 = pt_print_bytes_l (parser, p->info.query.q.select.use_merge);
13767  q = pt_append_nulstring (parser, q, "(");
13768  q = pt_append_varchar (parser, q, r1);
13769  q = pt_append_nulstring (parser, q, ") ");
13770  }
13771  else
13772  {
13773  q = pt_append_nulstring (parser, q, " ");
13774  }
13775  }
13776 
13777 #if 0
13779  {
13780  /* -- not used */
13781  q = pt_append_nulstring (parser, q, "USE_HASH ");
13782  }
13783 #endif /* 0 */
13785  {
13786  /* lock timeout */
13787  q = pt_append_nulstring (parser, q, "LOCK_TIMEOUT(");
13788  r1 = pt_print_bytes (parser, p->info.query.q.select.waitsecs_hint);
13789  q = pt_append_varchar (parser, q, r1);
13790  q = pt_append_nulstring (parser, q, ") ");
13791  }
13792 
13794  {
13795  q = pt_append_nulstring (parser, q, "USE_DESC_IDX ");
13796  }
13797 
13799  {
13800  q = pt_append_nulstring (parser, q, "NO_COVERING_IDX ");
13801  }
13802 
13804  {
13805  q = pt_append_nulstring (parser, q, "NO_DESC_IDX ");
13806  }
13807 
13809  {
13810  q = pt_append_nulstring (parser, q, "NO_MULTI_RANGE_OPT ");
13811  }
13812 
13814  {
13815  q = pt_append_nulstring (parser, q, "NO_SORT_LIMIT ");
13816  }
13817 
13819  {
13820  q = pt_append_nulstring (parser, q, "NO_HASH_AGGREGATE ");
13821  }
13822 
13824  {
13825  q = pt_append_nulstring (parser, q, "NO_HASH_LIST_SCAN ");
13826  }
13827 
13829  {
13830  q = pt_append_nulstring (parser, q, "NO_INDEX_LS ");
13831  }
13832  else if (p->info.query.q.select.hint & PT_HINT_INDEX_LS)
13833  {
13835  || !(p->info.query.q.select.hint & PT_HINT_INDEX_SS))
13836  { /* skip scan is disabled */
13837  q = pt_append_nulstring (parser, q, "INDEX_LS");
13838  if (p->info.query.q.select.index_ls)
13839  {
13840  r1 = pt_print_bytes_l (parser, p->info.query.q.select.index_ls);
13841  q = pt_append_nulstring (parser, q, "(");
13842  q = pt_append_varchar (parser, q, r1);
13843  q = pt_append_nulstring (parser, q, ") ");
13844  }
13845  else
13846  {
13847  q = pt_append_nulstring (parser, q, " ");
13848  }
13849  }
13850  }
13851 
13853  {
13854  q = pt_append_nulstring (parser, q, "SELECT_RECORD_INFO ");
13855  }
13856 
13858  {
13859  q = pt_append_nulstring (parser, q, "SELECT_PAGE_INFO ");
13860  }
13861 
13863  {
13864  q = pt_append_nulstring (parser, q, "SELECT_KEY_INFO");
13865  if (p->info.query.q.select.using_index)
13866  {
13867  q = pt_append_nulstring (parser, q, "(");
13869  q = pt_append_nulstring (parser, q, ") ");
13870  }
13871  else
13872  {
13873  assert (0);
13874  }
13875  }
13876 
13878  {
13879  q = pt_append_nulstring (parser, q, "SELECT_BTREE_NODE_INFO");
13880  if (p->info.query.q.select.using_index)
13881  {
13882  q = pt_append_nulstring (parser, q, "(");
13884  q = pt_append_nulstring (parser, q, ") ");
13885  }
13886  else
13887  {
13888  assert (0);
13889  }
13890  }
13891 
13892  q = pt_append_nulstring (parser, q, "*/ ");
13893  }
13894 
13895  if (p->info.query.all_distinct == PT_ALL)
13896  {
13897  /* left out "all", its the default. */
13898  }
13899  else if (p->info.query.all_distinct == PT_DISTINCT)
13900  {
13901  q = pt_append_nulstring (parser, q, "distinct ");
13902  }
13903 
13905  {
13906  /* print select list with column alias for system generated select of update query */
13907  for (temp = p->info.query.q.select.list; temp != NULL; temp = temp->next)
13908  {
13909  r1 = pt_print_bytes (parser, temp);
13910  q = pt_append_varchar (parser, q, r1);
13911 
13912  if (temp->alias_print != NULL)
13913  {
13914  q = pt_append_nulstring (parser, q, " as [");
13915  q = pt_append_nulstring (parser, q, temp->alias_print);
13916  q = pt_append_nulstring (parser, q, "]");
13917  }
13918 
13919  if (temp->next != NULL)
13920  {
13921  q = pt_append_nulstring (parser, q, ",");
13922  }
13923  }
13924  }
13925  else if ((parser->custom_print & PT_SUPPRESS_SELECT_LIST) != 0 && p->info.query.is_subquery != PT_IS_SUBQUERY)
13926  {
13927  /* suppress select list: print NA */
13928  for (temp = p->info.query.q.select.list; temp != NULL; temp = temp->next)
13929  {
13930  q = pt_append_nulstring (parser, q, "NA");
13931 
13932  if (temp->next != NULL)
13933  {
13934  q = pt_append_nulstring (parser, q, ",");
13935  }
13936  }
13937  }
13938  else
13939  {
13940  /* ordinary cases */
13941  r1 = pt_print_bytes_l (parser, p->info.query.q.select.list);
13942  q = pt_append_varchar (parser, q, r1);
13943  }
13944 
13945  if (parser->custom_print & PT_PRINT_ALIAS)
13946  {
13947  parser->custom_print ^= PT_PRINT_ALIAS;
13948  toggle_print_alias = true;
13949  }
13950 
13951  if (!(parser->custom_print & PT_SUPPRESS_INTO))
13952  {
13953  if (p->info.query.into_list)
13954  {
13955  r1 = pt_print_bytes_l (parser, p->info.query.into_list);
13956  q = pt_append_nulstring (parser, q, " into ");
13957  q = pt_append_varchar (parser, q, r1);
13958  }
13959  }
13960 
13961  from = p->info.query.q.select.from;
13962  if (from != NULL)
13963  {
13964  /* for derived_table alias should be printed e.g. create table t2(id int primary key) as select id from
13965  * (select count(*) id from t1) */
13966  if (PT_SPEC_IS_DERIVED (from))
13967  {
13968  save_custom = parser->custom_print;
13969  parser->custom_print |= PT_PRINT_ALIAS;
13970  }
13971 
13972  r1 = pt_print_bytes_spec_list (parser, from);
13973 
13974  if (PT_SPEC_IS_DERIVED (from))
13975  {
13976  parser->custom_print = save_custom;
13977  }
13978 
13979  q = pt_append_nulstring (parser, q, " from ");
13980  q = pt_append_varchar (parser, q, r1);
13981  }
13982 
13984  {
13985  int level;
13987  if (OPTIMIZATION_ENABLED (level))
13988  {
13991  p->info.query.q.select.where = NULL;
13992  }
13993  }
13994 
13996  {
13997  /* We need to print out the filter too. There's no special syntax for it, the filter is part of the where
13998  * clause. */
14000  }
14001  else
14002  {
14003  where_list = p->info.query.q.select.where;
14004  }
14005 
14006  if (where_list)
14007  {
14008  r1 = pt_print_and_list (parser, where_list);
14009  if (r1 != NULL)
14010  {
14011  q = pt_append_nulstring (parser, q, " where ");
14012  q = pt_append_varchar (parser, q, r1);
14013  }
14014  }
14015 
14017  {
14018  if (p->info.query.q.select.where)
14019  {
14020  /* We appended the filtering expression to the join expression and we need to cut that link. */
14021  assert (where_list == p->info.query.q.select.where);
14022  while (where_list->next != p->info.query.q.select.after_cb_filter)
14023  {
14024  where_list = where_list->next;
14025  }
14026  where_list->next = NULL;
14027  }
14028  else
14029  {
14030  assert (where_list == p->info.query.q.select.after_cb_filter);
14031  }
14032  }
14033 
14034  if (p->info.query.q.select.start_with)
14035  {
14036  r1 = pt_print_and_list (parser, p->info.query.q.select.start_with);
14037  q = pt_append_nulstring (parser, q, " start with ");
14038  q = pt_append_varchar (parser, q, r1);
14039  }
14040 
14042  {
14043  int level;
14045  if (OPTIMIZATION_ENABLED (level))
14046  {
14047  assert (p->info.query.q.select.where == NULL);
14050  }
14051  }
14052 
14053  if (p->info.query.q.select.connect_by)
14054  {
14055  r1 = pt_print_and_list (parser, p->info.query.q.select.connect_by);
14058  {
14059  q = pt_append_nulstring (parser, q, " connect by nocycle ");
14060  }
14061  else
14062  {
14063  q = pt_append_nulstring (parser, q, " connect by ");
14064  }
14065  q = pt_append_varchar (parser, q, r1);
14066  }
14067 
14068  if (p->info.query.q.select.group_by)
14069  {
14070  r1 = pt_print_bytes_l (parser, p->info.query.q.select.group_by);
14071  q = pt_append_nulstring (parser, q, " group by ");
14072  q = pt_append_varchar (parser, q, r1);
14074  {
14075  q = pt_append_nulstring (parser, q, " with rollup");
14076  }
14077  }
14078 
14079  if (p->info.query.q.select.having)
14080  {
14081  r1 = pt_print_and_list (parser, p->info.query.q.select.having);
14082  q = pt_append_nulstring (parser, q, " having ");
14083  q = pt_append_varchar (parser, q, r1);
14084  }
14085 
14086  if (p->info.query.q.select.using_index)
14087  {
14089  {
14091  {
14092  q = pt_append_nulstring (parser, q, " using index none");
14093  }
14094  else
14095  {
14096  if (p->info.query.q.select.using_index->etc == (void *) PT_IDX_HINT_CLASS_NONE)
14097  {
14098  r1 = pt_print_bytes_l (parser, p->info.query.q.select.using_index);
14099  q = pt_append_nulstring (parser, q, " using index ");
14100  q = pt_append_varchar (parser, q, r1);
14101  }
14102  else
14103  {
14104  r1 = pt_print_bytes_l (parser, p->info.query.q.select.using_index->next);
14105  q = pt_append_nulstring (parser, q, " using index all except ");
14106  q = pt_append_varchar (parser, q, r1);
14107  }
14108  }
14109  }
14110  else
14111  {
14112  r1 = pt_print_bytes_l (parser, p->info.query.q.select.using_index);
14113  q = pt_append_nulstring (parser, q, " using index ");
14114  q = pt_append_varchar (parser, q, r1);
14115  }
14116  }
14117 
14118  if (p->info.query.q.select.with_increment)
14119  {
14120  temp = p->info.query.q.select.with_increment;
14121  q = pt_append_nulstring (parser, q, ((temp->node_type == PT_EXPR && temp->info.expr.op == PT_DECR)
14122  ? "with decrement for " : "with increment for "));
14123  q = pt_append_varchar (parser, q, pt_print_bytes_l (parser, p->info.query.q.select.with_increment));
14124  }
14125 
14127  {
14128  q = pt_append_nulstring (parser, q, " for update");
14129  if (p->info.query.q.select.for_update != NULL)
14130  {
14131  r1 = pt_print_bytes_l (parser, p->info.query.q.select.for_update);
14132  q = pt_append_nulstring (parser, q, " of ");
14133  q = pt_append_varchar (parser, q, r1);
14134  }
14135  else
14136  {
14137  r1 = NULL;
14138  for (temp = p->info.query.q.select.from; temp != NULL; temp = temp->next)
14139  {
14141  {
14142  if (r1 == NULL)
14143  {
14144  q = pt_append_nulstring (parser, q, " of ");
14145  }
14146  else
14147  {
14148  q = pt_append_nulstring (parser, q, ", ");
14149  }
14150  r1 = pt_print_bytes (parser, temp->info.spec.range_var);
14151  q = pt_append_varchar (parser, q, r1);
14152  }
14153  }
14154  }
14155  }
14156 
14157  if (p->info.query.order_by)
14158  {
14159  r1 = pt_print_bytes_l (parser, p->info.query.order_by);
14160  if (p->info.query.flag.order_siblings)
14161  {
14162  q = pt_append_nulstring (parser, q, " order siblings by ");
14163  }
14164  else
14165  {
14166  q = pt_append_nulstring (parser, q, " order by ");
14167  }
14168  q = pt_append_varchar (parser, q, r1);
14169  }
14170 
14171  if (p->info.query.orderby_for)
14172  {
14173  r1 = pt_print_bytes_l (parser, p->info.query.orderby_for);
14174  q = pt_append_nulstring (parser, q, " for ");
14175  q = pt_append_varchar (parser, q, r1);
14176  }
14177 
14178  if (p->info.query.limit && p->info.query.flag.rewrite_limit)
14179  {
14180  r1 = pt_print_bytes_l (parser, p->info.query.limit);
14181  q = pt_append_nulstring (parser, q, " limit ");
14182  q = pt_append_varchar (parser, q, r1);
14183  }
14184 
14185  if (toggle_print_alias == true)
14186  {
14187  parser->custom_print ^= PT_PRINT_ALIAS;
14188  }
14189  }
14190 
14191  if (set_paren)
14192  {
14193  q = pt_append_nulstring (parser, q, ")");
14194 
14195  if ((parser->custom_print & PT_PRINT_ALIAS) && p->alias_print != NULL)
14196  {
14197  q = pt_append_nulstring (parser, q, " as [");
14198  q = pt_append_nulstring (parser, q, p->alias_print);
14199  q = pt_append_nulstring (parser, q, "]");
14200  }
14201  }
14202 
14203  if (!(parser->custom_print & PT_SUPPRESS_INTO) && p->info.query.q.select.check_where)
14204  {
14205  r1 = pt_print_and_list (parser, p->info.query.q.select.check_where);
14206  q = pt_append_nulstring (parser, q, "\n-- check condition: ");
14207  q = pt_append_varchar (parser, q, r1);
14208  }
14209 
14210  return q;
14211 }
14212 
14213 /* SET_NAMES */
14214 /*
14215  * pt_apply_set_names () -
14216  * return:
14217  * parser(in):
14218  * p(in):
14219  * g(in):
14220  * arg(in):
14221  */
14222 static PT_NODE *
14223 pt_apply_set_names (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
14224 {
14225  PT_APPLY_WALK (parser, p->info.set_names.charset_node, arg);
14226  PT_APPLY_WALK (parser, p->info.set_names.collation_node, arg);
14227  return p;
14228 }
14229 
14230 /* SET_TIMEZONE */
14231 /*
14232  * pt_apply_set_timezone () -
14233  * return:
14234  * parser(in):
14235  * p(in):
14236  * g(in):
14237  * arg(in):
14238  */
14239 static PT_NODE *
14241 {
14242  PT_APPLY_WALK (parser, p->info.set_timezone.timezone_node, arg);
14243 
14244  return p;
14245 }
14246 
14247 /*
14248  * pt_print_set_names () -
14249  * return:
14250  * parser(in):
14251  * p(in):
14252  */
14253 static PARSER_VARCHAR *
14255 {
14256  PARSER_VARCHAR *b = NULL, *r1;
14257 
14258  b = pt_append_nulstring (parser, b, "set names ");
14259 
14261  if (p->info.set_names.charset_node != NULL)
14262  {
14263  r1 = pt_print_bytes (parser, p->info.set_names.charset_node);
14264  b = pt_append_varchar (parser, b, r1);
14265  }
14266 
14267  if (p->info.set_names.collation_node != NULL)
14268  {
14269  r1 = pt_print_bytes (parser, p->info.set_names.collation_node);
14270  b = pt_append_varchar (parser, b, r1);
14271  }
14272 
14273  return b;
14274 }
14275 
14276 /*
14277  * pt_print_set_timezone () -
14278  * return:
14279  * parser(in):
14280  * p(in):
14281  */
14282 static PARSER_VARCHAR *
14284 {
14285  PARSER_VARCHAR *b = NULL, *r1;
14286 
14287  b = pt_append_nulstring (parser, b, "set timezone ");
14288 
14290  r1 = pt_print_bytes (parser, p->info.set_timezone.timezone_node);
14291  b = pt_append_varchar (parser, b, r1);
14292 
14293  return b;
14294 }
14295 
14296 /* SET_OPTIMIZATION_LEVEL */
14297 /*
14298  * pt_apply_set_opt_lvl () -
14299  * return:
14300  * parser(in):
14301  * p(in):
14302  * g(in):
14303  * arg(in):
14304  */
14305 static PT_NODE *
14306 pt_apply_set_opt_lvl (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
14307 {
14308  PT_APPLY_WALK (parser, p->info.set_opt_lvl.val, arg);
14309  return p;
14310 }
14311 
14312 /*
14313  * pt_init_set_opt_lvl () -
14314  * return:
14315  * p(in):
14316  */
14317 static PT_NODE *
14319 {
14321  return (p);
14322 }
14323 
14324 /*
14325  * pt_print_set_opt_lvl () -
14326  * return:
14327  * parser(in):
14328  * p(in):
14329  */
14330 static PARSER_VARCHAR *
14332 {
14333  PARSER_VARCHAR *b = NULL, *r1, *r2 = NULL;
14335 
14336  option = p->info.set_opt_lvl.option;
14337  r1 = pt_print_bytes (parser, p->info.set_opt_lvl.val);
14338  if (option == PT_OPT_COST)
14339  {
14340  r2 = pt_print_bytes (parser, p->info.set_opt_lvl.val->next);
14341  }
14342 
14343  b = pt_append_nulstring (parser, b, "set optimization ");
14344  b = pt_append_nulstring (parser, b, pt_show_misc_type (option));
14345  b = pt_append_nulstring (parser, b, " ");
14346  b = pt_append_varchar (parser, b, r1);
14347  if (option == PT_OPT_COST)
14348  {
14349  b = pt_append_nulstring (parser, b, " ");
14350  b = pt_append_varchar (parser, b, r2);
14351  }
14352 
14353  return b;
14354 }
14355 
14356 /* SET_SYSTEM_PARAMETERS */
14357 /*
14358  * pt_apply_set_sys_params () -
14359  * return:
14360  * parser(in):
14361  * p(in):
14362  * g(in):
14363  * arg(in):
14364  */
14365 static PT_NODE *
14367 {
14368  PT_APPLY_WALK (parser, p->info.set_sys_params.val, arg);
14369  return p;
14370 }
14371 
14372 /*
14373  * pt_print_set_sys_params () -
14374  * return:
14375  * parser(in):
14376  * p(in):
14377  */
14378 static PARSER_VARCHAR *
14380 {
14381  PARSER_VARCHAR *b = NULL, *r1;
14382 
14383  b = pt_append_nulstring (parser, b, "set parameters ");
14384 
14385  if (p->info.set_sys_params.val)
14386  {
14387  r1 = pt_print_bytes (parser, p->info.set_sys_params.val);
14388  b = pt_append_varchar (parser, b, r1);
14389  }
14390 
14391  return b;
14392 }
14393 
14394 /* SET_TRIGGER */
14395 /*
14396  * pt_apply_set_trigger () -
14397  * return:
14398  * parser(in):
14399  * p(in):
14400  * g(in):
14401  * arg(in):
14402  */
14403 static PT_NODE *
14404 pt_apply_set_trigger (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
14405 {
14406  PT_APPLY_WALK (parser, p->info.set_trigger.val, arg);
14407  return p;
14408 }
14409 
14410 /*
14411  * pt_print_set_trigger () -
14412  * return:
14413  * parser(in):
14414  * p(in):
14415  */
14416 static PARSER_VARCHAR *
14418 {
14419  PARSER_VARCHAR *b = NULL, *r1;
14420 
14421  b = pt_append_nulstring (parser, b, "set trigger ");
14423 
14425  && p->info.set_trigger.val->info.value.data_value.i <= 0)
14426  {
14427  if (p->info.set_trigger.val->info.value.data_value.i == 0)
14428  {
14429  b = pt_append_nulstring (parser, b, " off");
14430  }
14431  else
14432  {
14433  b = pt_append_nulstring (parser, b, " on");
14434  }
14435  }
14436  else
14437  {
14438  r1 = pt_print_bytes (parser, p->info.set_trigger.val);
14439  b = pt_append_nulstring (parser, b, " ");
14440  b = pt_append_varchar (parser, b, r1);
14441  }
14442 
14443  return b;
14444 }
14445 
14446 /*
14447  * pt_apply_showstmt () -
14448  * return:
14449  * parser(in):
14450  * p(in):
14451  * g(in):
14452  * arg(in):
14453  */
14454 static PT_NODE *
14455 pt_apply_showstmt (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
14456 {
14457  PT_APPLY_WALK (parser, p->info.showstmt.show_args, arg);
14458  return p;
14459 }
14460 
14461 /*
14462  * pt_init_showstmt () -
14463  * return:
14464  * p(in):
14465  */
14466 static PT_NODE *
14468 {
14470  return (p);
14471 }
14472 
14473 /*
14474  * pt_print_showstmt () -
14475  * return:
14476  * parser(in):
14477  * p(in):
14478  */
14479 static PARSER_VARCHAR *
14481 {
14482  PARSER_VARCHAR *b = NULL, *r1;
14483  SHOWSTMT_TYPE show_type;
14484 
14485  show_type = p->info.showstmt.show_type;
14486  b = pt_append_nulstring (parser, b, showstmt_get_metadata (show_type)->alias_print);
14487  r1 = pt_print_bytes_l (parser, p->info.showstmt.show_args);
14488  b = pt_append_varchar (parser, b, r1);
14489 
14490  return b;
14491 }
14492 
14493 /* SET_XACTION */
14494 /*
14495  * pt_apply_set_xaction () -
14496  * return:
14497  * parser(in):
14498  * p(in):
14499  * g(in):
14500  * arg(in):
14501  */
14502 static PT_NODE *
14503 pt_apply_set_xaction (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
14504 {
14505  PT_APPLY_WALK (parser, p->info.set_xaction.xaction_modes, arg);
14506  return p;
14507 }
14508 
14509 /*
14510  * pt_print_set_xaction () -
14511  * return:
14512  * parser(in):
14513  * p(in):
14514  */
14515 static PARSER_VARCHAR *
14517 {
14518  PARSER_VARCHAR *b = NULL, *r1;
14519 
14520  r1 = pt_print_bytes_l (parser, p->info.set_xaction.xaction_modes);
14521  b = pt_append_nulstring (parser, b, "set transaction ");
14522  b = pt_append_varchar (parser, b, r1);
14523 
14524  return b;
14525 }
14526 
14527 /* SORT_SPEC */
14528 /*
14529  * pt_apply_sort_spec () -
14530  * return:
14531  * parser(in):
14532  * p(in):
14533  * g(in):
14534  * arg(in):
14535  */
14536 static PT_NODE *
14537 pt_apply_sort_spec (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
14538 {
14539  PT_APPLY_WALK (parser, p->info.sort_spec.expr, arg);
14540  return p;
14541 }
14542 
14543 /*
14544  * pt_init_sort_spec () -
14545  * return:
14546  * p(in):
14547  */
14548 static PT_NODE *
14550 {
14553  return p;
14554 }
14555 
14556 /*
14557  * pt_print_sort_spec () -
14558  * return:
14559  * parser(in):
14560  * p(in):
14561  */
14562 static PARSER_VARCHAR *
14564 {
14565  PARSER_VARCHAR *q = 0, *r1;
14566 
14567  r1 = pt_print_bytes (parser, p->info.sort_spec.expr);
14568  q = pt_append_varchar (parser, q, r1);
14569  if (p->info.sort_spec.asc_or_desc == PT_DESC)
14570  {
14571  q = pt_append_nulstring (parser, q, " desc ");
14572  }
14573 
14575  {
14576  q = pt_append_nulstring (parser, q, " nulls first ");
14577  }
14579  {
14580  q = pt_append_nulstring (parser, q, " nulls last ");
14581  }
14582 
14583  return q;
14584 }
14585 
14586 /* TIMEOUT */
14587 /*
14588  * pt_apply_timeout () -
14589  * return:
14590  * parser(in):
14591  * p(in):
14592  * g(in):
14593  * arg(in):
14594  */
14595 static PT_NODE *
14596 pt_apply_timeout (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
14597 {
14598  PT_APPLY_WALK (parser, p->info.timeout.val, arg);
14599  return p;
14600 }
14601 
14602 /*
14603  * pt_print_timeout () -
14604  * return:
14605  * parser(in):
14606  * p(in):
14607  */
14608 static PARSER_VARCHAR *
14610 {
14611  PARSER_VARCHAR *b = NULL, *r1;
14612  PT_NODE *val;
14613 
14614  b = pt_append_nulstring (parser, b, "lock timeout ");
14615  val = p->info.timeout.val;
14616 
14617  if (val)
14618  {
14619  if (val->info.value.data_value.i == -1)
14620  {
14621  b = pt_append_nulstring (parser, b, "infinite");
14622  }
14623  else if (val->info.value.data_value.i == 0)
14624  {
14625  b = pt_append_nulstring (parser, b, "off");
14626  }
14627  else
14628  {
14629  r1 = pt_print_bytes (parser, p->info.timeout.val);
14630  b = pt_append_varchar (parser, b, r1);
14631  }
14632  }
14633  return b;
14634 }
14635 
14636 /* TRIGGER_ACTION */
14637 /*
14638  * pt_apply_trigger_action () -
14639  * return:
14640  * parser(in):
14641  * p(in):
14642  * g(in):
14643  * arg(in):
14644  */
14645 static PT_NODE *
14647 {
14648  PT_APPLY_WALK (parser, p->info.trigger_action.expression, arg);
14649  PT_APPLY_WALK (parser, p->info.trigger_action.string, arg);
14650  return p;
14651 }
14652 
14653 /*
14654  * pt_print_trigger_action () -
14655  * return:
14656  * parser(in):
14657  * p(in):
14658  */
14659 static PARSER_VARCHAR *
14661 {
14662  PARSER_VARCHAR *b = NULL, *r1;
14663 
14664  switch (p->info.trigger_action.action_type)
14665  {
14666  case PT_REJECT:
14667  case PT_INVALIDATE_XACTION:
14669  break;
14670  case PT_PRINT:
14671  r1 = pt_print_bytes (parser, p->info.trigger_action.string);
14673  b = pt_append_nulstring (parser, b, " ");
14674  b = pt_append_varchar (parser, b, r1);
14675  break;
14676  case PT_EXPRESSION:
14677  r1 = pt_print_bytes (parser, p->info.trigger_action.expression);
14678  b = pt_append_varchar (parser, b, r1);
14679  break;
14680  default:
14681  break;
14682  }
14683  return b;
14684 }
14685 
14686 /* TRIGGER_SPEC_LIST */
14687 /*
14688  * pt_apply_trigger_spec_list () -
14689  * return:
14690  * parser(in):
14691  * p(in):
14692  * g(in):
14693  * arg(in):
14694  */
14695 static PT_NODE *
14697 {
14699  PT_APPLY_WALK (parser, p->info.trigger_spec_list.event_list, arg);
14700  return p;
14701 }
14702 
14703 /*
14704  * pt_print_trigger_spec_list () -
14705  * return:
14706  * parser(in):
14707  * p(in):
14708  */
14709 static PARSER_VARCHAR *
14711 {
14712  PARSER_VARCHAR *b = NULL, *r1;
14713 
14715  b = pt_append_varchar (parser, b, r1);
14716 
14717  return b;
14718 }
14719 
14720 /* UNION_STMT */
14721 /*
14722  * pt_apply_union_stmt () -
14723  * return:
14724  * parser(in):
14725  * p(in):
14726  * g(in):
14727  * arg(in):
14728  */
14729 static PT_NODE *
14730 pt_apply_union_stmt (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
14731 {
14732  PT_APPLY_WALK (parser, p->info.query.with, arg);
14733  PT_APPLY_WALK (parser, p->info.query.q.union_.arg1, arg);
14734  PT_APPLY_WALK (parser, p->info.query.q.union_.arg2, arg);
14735  PT_APPLY_WALK (parser, p->info.query.into_list, arg);
14736  PT_APPLY_WALK (parser, p->info.query.order_by, arg);
14737  PT_APPLY_WALK (parser, p->info.query.orderby_for, arg);
14738  PT_APPLY_WALK (parser, p->info.query.limit, arg);
14739 
14740  // todo - there is a lot less stuff here than on pt_apply_select. I am not sure this is safe.
14741  // e.g. this is used for parser_copy_tree too. which should deep copy entire tree! otherwise we may have some
14742  // unpleasant effects.
14743 
14744  return p;
14745 }
14746 
14747 /*
14748  * pt_init_union_stmt () -
14749  * return:
14750  * p(in):
14751  */
14752 static PT_NODE *
14754 {
14756  p->info.query.hint = PT_HINT_NONE;
14758  return p;
14759 }
14760 
14761 /*
14762  * pt_print_union_stmt () -
14763  * return:
14764  * parser(in):
14765  * p(in):
14766  */
14767 static PARSER_VARCHAR *
14769 {
14770  PARSER_VARCHAR *q = NULL, *r1, *r2;
14771 
14772  if (p->info.query.with != NULL)
14773  {
14774  r1 = pt_print_bytes_l (parser, p->info.query.with);
14775  q = pt_append_varchar (parser, q, r1);
14776  }
14777 
14778  r1 = pt_print_bytes (parser, p->info.query.q.union_.arg1);
14779  r2 = pt_print_bytes (parser, p->info.query.q.union_.arg2);
14780  q = pt_append_nulstring (parser, q, "(");
14781  q = pt_append_varchar (parser, q, r1);
14782  q = pt_append_nulstring (parser, q, " union ");
14783  if (p->info.query.all_distinct == PT_ALL)
14784  {
14785  q = pt_append_nulstring (parser, q, "all ");
14786  }
14787  q = pt_append_varchar (parser, q, r2);
14788  q = pt_append_nulstring (parser, q, ")");
14789 
14790  if (p->info.query.order_by)
14791  {
14792  r1 = pt_print_bytes_l (parser, p->info.query.order_by);
14793  q = pt_append_nulstring (parser, q, " order by ");
14794  q = pt_append_varchar (parser, q, r1);
14795  }
14796  if (p->info.query.orderby_for)
14797  {
14798  r1 = pt_print_bytes_l (parser, p->info.query.orderby_for);
14799  q = pt_append_nulstring (parser, q, " for ");
14800  q = pt_append_varchar (parser, q, r1);
14801  }
14802  if (p->info.query.limit && p->info.query.flag.rewrite_limit)
14803  {
14804  r1 = pt_print_bytes_l (parser, p->info.query.limit);
14805  q = pt_append_nulstring (parser, q, " limit ");
14806  q = pt_append_varchar (parser, q, r1);
14807  }
14808 
14809  return q;
14810 }
14811 
14812 /* UPDATE */
14813 /*
14814  * pt_apply_update () -
14815  * return:
14816  * parser(in):
14817  * p(in):
14818  * g(in):
14819  * arg(in):
14820  */
14821 static PT_NODE *
14822 pt_apply_update (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
14823 {
14824  PT_APPLY_WALK (parser, p->info.update.with, arg);
14825  PT_APPLY_WALK (parser, p->info.update.spec, arg);
14826  PT_APPLY_WALK (parser, p->info.update.assignment, arg);
14827  PT_APPLY_WALK (parser, p->info.update.search_cond, arg);
14828  PT_APPLY_WALK (parser, p->info.update.order_by, arg);
14829  PT_APPLY_WALK (parser, p->info.update.orderby_for, arg);
14830  PT_APPLY_WALK (parser, p->info.update.using_index, arg);
14831  PT_APPLY_WALK (parser, p->info.update.object_parameter, arg);
14832  PT_APPLY_WALK (parser, p->info.update.cursor_name, arg);
14833  PT_APPLY_WALK (parser, p->info.update.check_where, arg);
14834  PT_APPLY_WALK (parser, p->info.update.internal_stmts, arg);
14835  PT_APPLY_WALK (parser, p->info.update.waitsecs_hint, arg);
14836  PT_APPLY_WALK (parser, p->info.update.ordered_hint, arg);
14837  PT_APPLY_WALK (parser, p->info.update.use_nl_hint, arg);
14838  PT_APPLY_WALK (parser, p->info.update.use_idx_hint, arg);
14839  PT_APPLY_WALK (parser, p->info.update.use_merge_hint, arg);
14840  PT_APPLY_WALK (parser, p->info.update.limit, arg);
14841 
14842  return p;
14843 }
14844 
14845 /*
14846  * pt_init_update () -
14847  * return:
14848  * p(in):
14849  */
14850 static PT_NODE *
14852 {
14854  return p;
14855 }
14856 
14857 /*
14858  * pt_print_update () -
14859  * return:
14860  * parser(in):
14861  * p(in):
14862  */
14863 static PARSER_VARCHAR *
14865 {
14866  PARSER_VARCHAR *b = NULL, *r1;
14867 
14868  if (p->info.update.with != NULL)
14869  {
14870  r1 = pt_print_bytes_l (parser, p->info.update.with);
14871  b = pt_append_varchar (parser, b, r1);
14872  }
14873 
14874  b = pt_append_nulstring (parser, b, "update ");
14875 
14876  if (p->info.update.hint != PT_HINT_NONE)
14877  {
14878  b = pt_append_nulstring (parser, b, "/*+");
14880  {
14881  b = pt_append_nulstring (parser, b, " LOCK_TIMEOUT(");
14882  r1 = pt_print_bytes (parser, p->info.update.waitsecs_hint);
14883  b = pt_append_varchar (parser, b, r1);
14884  b = pt_append_nulstring (parser, b, ")");
14885  }
14887  {
14888  b = pt_append_nulstring (parser, b, " NO_LOGGING");
14889  }
14890 
14891  if (p->info.update.hint & PT_HINT_ORDERED)
14892  {
14893  /* force join left-to-right */
14894  b = pt_append_nulstring (parser, b, " ORDERED");
14895  if (p->info.update.ordered_hint)
14896  {
14897  r1 = pt_print_bytes_l (parser, p->info.update.ordered_hint);
14898  b = pt_append_nulstring (parser, b, "(");
14899  b = pt_append_varchar (parser, b, r1);
14900  b = pt_append_nulstring (parser, b, ") ");
14901  }
14902  else
14903  {
14904  b = pt_append_nulstring (parser, b, " ");
14905  }
14906  }
14907 
14908  if (p->info.update.hint & PT_HINT_USE_NL)
14909  {
14910  /* force nl-join */
14911  b = pt_append_nulstring (parser, b, " USE_NL");
14912  if (p->info.update.use_nl_hint)
14913  {
14914  r1 = pt_print_bytes_l (parser, p->info.update.use_nl_hint);
14915  b = pt_append_nulstring (parser, b, "(");
14916  b = pt_append_varchar (parser, b, r1);
14917  b = pt_append_nulstring (parser, b, ") ");
14918  }
14919  else
14920  {
14921  b = pt_append_nulstring (parser, b, " ");
14922  }
14923  }
14924 
14925  if (p->info.update.hint & PT_HINT_USE_IDX)
14926  {
14927  /* force idx-join */
14928  b = pt_append_nulstring (parser, b, " USE_IDX");
14929  if (p->info.update.use_idx_hint)
14930  {
14931  r1 = pt_print_bytes_l (parser, p->info.update.use_idx_hint);
14932  b = pt_append_nulstring (parser, b, "(");
14933  b = pt_append_varchar (parser, b, r1);
14934  b = pt_append_nulstring (parser, b, ") ");
14935  }
14936  else
14937  {
14938  b = pt_append_nulstring (parser, b, " ");
14939  }
14940  }
14941 
14942  if (p->info.update.hint & PT_HINT_USE_MERGE)
14943  {
14944  /* force merge-join */
14945  b = pt_append_nulstring (parser, b, " USE_MERGE");
14946  if (p->info.update.use_merge_hint)
14947  {
14948  r1 = pt_print_bytes_l (parser, p->info.update.use_merge_hint);
14949  b = pt_append_nulstring (parser, b, "(");
14950  b = pt_append_varchar (parser, b, r1);
14951  b = pt_append_nulstring (parser, b, ") ");
14952  }
14953  else
14954  {
14955  b = pt_append_nulstring (parser, b, " ");
14956  }
14957  }
14958 
14960  {
14961  b = pt_append_nulstring (parser, b, " USE_DESC_IDX ");
14962  }
14963 
14965  {
14966  b = pt_append_nulstring (parser, b, " NO_COVERING_IDX ");
14967  }
14968 
14970  {
14971  b = pt_append_nulstring (parser, b, " NO_DESC_IDX ");
14972  }
14973 
14975  {
14976  b = pt_append_nulstring (parser, b, " NO_MULTI_RANGE_OPT ");
14977  }
14978 
14980  {
14981  b = pt_append_nulstring (parser, b, " NO_SORT_LIMIT ");
14982  }
14983 
14984  if (p->info.update.hint & PT_HINT_USE_SBR)
14985  {
14986  b = pt_append_nulstring (parser, b, " USE_SBR ");
14987  }
14988 
14989  b = pt_append_nulstring (parser, b, " */ ");
14990  }
14991 
14992  if (!IS_UPDATE_OBJ (p))
14993  {
14994  /* print the spec list */
14995  r1 = pt_print_bytes_spec_list (parser, p->info.update.spec);
14996  b = pt_append_varchar (parser, b, r1);
14997  }
14998  else
14999  {
15000  r1 = pt_print_bytes (parser, p->info.update.object_parameter);
15001  b = pt_append_nulstring (parser, b, "object ");
15002  b = pt_append_varchar (parser, b, r1);
15003  }
15004  r1 = pt_print_bytes_l (parser, p->info.update.assignment);
15005  b = pt_append_nulstring (parser, b, " set ");
15006  b = pt_append_varchar (parser, b, r1);
15007 
15008  if (p->info.update.search_cond)
15009  {
15010  r1 = pt_print_and_list (parser, p->info.update.search_cond);
15011  b = pt_append_nulstring (parser, b, " where ");
15012  b = pt_append_varchar (parser, b, r1);
15013  }
15014  if (p->info.update.using_index)
15015  {
15017  {
15019  {
15020  b = pt_append_nulstring (parser, b, " using index none");
15021  }
15022  else
15023  {
15024  if (p->info.update.using_index->etc == (void *) PT_IDX_HINT_CLASS_NONE)
15025  {
15026  r1 = pt_print_bytes_l (parser, p->info.update.using_index);
15027  b = pt_append_nulstring (parser, b, " using index ");
15028  b = pt_append_varchar (parser, b, r1);
15029  }
15030  else
15031  {
15032  r1 = pt_print_bytes_l (parser, p->info.update.using_index->next);
15033  b = pt_append_nulstring (parser, b, " using index all except ");
15034  b = pt_append_varchar (parser, b, r1);
15035  }
15036  }
15037  }
15038  else
15039  {
15040  r1 = pt_print_bytes_l (parser, p->info.update.using_index);
15041  b = pt_append_nulstring (parser, b, " using index ");
15042  b = pt_append_varchar (parser, b, r1);
15043  }
15044  }
15045 
15046  if (p->info.update.order_by)
15047  {
15048  r1 = pt_print_bytes_l (parser, p->info.update.order_by);
15049  b = pt_append_nulstring (parser, b, " order by ");
15050  b = pt_append_varchar (parser, b, r1);
15051  }
15052 
15053  if (p->info.update.orderby_for)
15054  {
15055  r1 = pt_print_bytes_l (parser, p->info.update.orderby_for);
15056  b = pt_append_nulstring (parser, b, " for ");
15057  b = pt_append_varchar (parser, b, r1);
15058  }
15059 
15060  if (p->info.update.limit && p->info.update.rewrite_limit)
15061  {
15062  r1 = pt_print_bytes_l (parser, p->info.update.limit);
15063  b = pt_append_nulstring (parser, b, " limit ");
15064  b = pt_append_varchar (parser, b, r1);
15065  }
15066 
15067  if (!(parser->custom_print & PT_SUPPRESS_INTO) && p->info.update.check_where)
15068  {
15069  r1 = pt_print_and_list (parser, p->info.update.check_where);
15070  b = pt_append_nulstring (parser, b, "\n-- check condition: ");
15071  b = pt_append_varchar (parser, b, r1);
15072  }
15073  return b;
15074 }
15075 
15076 /* UPDATE_STATS */
15077 /*
15078  * pt_apply_update_stats () -
15079  * return:
15080  * parser(in):
15081  * p(in):
15082  * g(in):
15083  * arg(in):
15084  */
15085 static PT_NODE *
15087 {
15088  PT_APPLY_WALK (parser, p->info.update_stats.class_list, arg);
15089  return p;
15090 }
15091 
15092 /*
15093  * pt_print_update_stats () -
15094  * return:
15095  * parser(in):
15096  * p(in):
15097  */
15098 static PARSER_VARCHAR *
15100 {
15101  PARSER_VARCHAR *b = 0, *r1;
15102 
15103  b = pt_append_nulstring (parser, b, "update statistics on ");
15104  if (p->info.update_stats.all_classes > 0)
15105  {
15106  b = pt_append_nulstring (parser, b, "all classes");
15107  }
15108  else if (p->info.update_stats.all_classes < 0)
15109  {
15110  b = pt_append_nulstring (parser, b, "catalog classes");
15111  }
15112  else
15113  {
15114  r1 = pt_print_bytes_l (parser, p->info.update_stats.class_list);
15115  b = pt_append_varchar (parser, b, r1);
15116  }
15117 
15118  if (p->info.update_stats.with_fullscan > 0)
15119  {
15121  b = pt_append_nulstring (parser, b, " with fullscan");
15122  }
15123 
15124  return b;
15125 }
15126 
15127 /* GET_STATS */
15128 /*
15129  * pt_apply_get_stats () -
15130  * return:
15131  * parser(in):
15132  * p(in):
15133  * g(in):
15134  * arg(in):
15135  */
15136 static PT_NODE *
15137 pt_apply_get_stats (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
15138 {
15139  PT_APPLY_WALK (parser, p->info.get_stats.class_, arg);
15140  PT_APPLY_WALK (parser, p->info.get_stats.args, arg);
15141  PT_APPLY_WALK (parser, p->info.get_stats.into_var, arg);
15142  return p;
15143 }
15144 
15145 /*
15146  * pt_print_get_stats () -
15147  * return:
15148  * parser(in):
15149  * p(in):
15150  */
15151 static PARSER_VARCHAR *
15153 {
15154  PARSER_VARCHAR *b = 0, *r1;
15155 
15156  b = pt_append_nulstring (parser, b, "get statistics ");
15157 
15158  if (p->info.get_stats.args)
15159  {
15160  r1 = pt_print_bytes (parser, p->info.get_stats.args);
15161  b = pt_append_varchar (parser, b, r1);
15162  }
15163  if (p->info.get_stats.class_)
15164  {
15165  r1 = pt_print_bytes (parser, p->info.get_stats.class_);
15166  b = pt_append_nulstring (parser, b, " on ");
15167  b = pt_append_varchar (parser, b, r1);
15168  }
15169  if (p->info.get_stats.into_var)
15170  {
15171  r1 = pt_print_bytes (parser, p->info.get_stats.into_var);
15172  b = pt_append_nulstring (parser, b, " into ");
15173  b = pt_append_varchar (parser, b, r1);
15174  }
15175  return b;
15176 }
15177 
15178 #if defined (ENABLE_UNUSED_FUNCTION)
15179 /* USE */
15180 /*
15181  * pt_apply_use () -
15182  * return:
15183  * parser(in):
15184  * p(in):
15185  * g(in):
15186  * arg(in):
15187  */
15188 static PT_NODE *
15189 pt_apply_use (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
15190 {
15191  PT_APPLY_WALK (parser, p->info.use.use_list, arg);
15192  PT_APPLY_WALK (parser, p->info.use.exclude_list, arg);
15193  return p;
15194 }
15195 
15196 /*
15197  * pt_print_use () -
15198  * return:
15199  * parser(in):
15200  * p(in):
15201  */
15202 static PARSER_VARCHAR *
15203 pt_print_use (PARSER_CONTEXT * parser, PT_NODE * p)
15204 {
15205  PARSER_VARCHAR *b = 0, *r1;
15206 
15207  if (p->info.use.use_list)
15208  {
15209  r1 = pt_print_bytes_l (parser, p->info.use.use_list);
15210  b = pt_append_nulstring (parser, b, "use ");
15211  b = pt_append_varchar (parser, b, r1);
15212  if (p->info.use.relative == PT_DEFAULT)
15213  {
15214  b = pt_append_nulstring (parser, b, " with default");
15215  }
15216  else if (p->info.use.relative == PT_CURRENT)
15217  {
15218  b = pt_append_nulstring (parser, b, " with current");
15219  }
15220  }
15221  else if (p->info.use.exclude_list)
15222  {
15223  r1 = pt_print_bytes_l (parser, p->info.use.exclude_list);
15224  b = pt_append_nulstring (parser, b, "exclude ");
15225  b = pt_append_varchar (parser, b, r1);
15226  if (p->info.use.relative == PT_DEFAULT)
15227  {
15228  b = pt_append_nulstring (parser, b, " from default");
15229  }
15230  else if (p->info.use.relative == PT_CURRENT)
15231  {
15232  b = pt_append_nulstring (parser, b, " from current");
15233  }
15234  }
15235  else if (p->info.use.relative == PT_DEFAULT)
15236  {
15237  b = pt_append_nulstring (parser, b, "use default");
15238  }
15239  else
15240  {
15241  b = pt_append_nulstring (parser, b, "use all");
15242  }
15243  if (p->info.use.as_default)
15244  {
15245  b = pt_append_nulstring (parser, b, " as default");
15246  }
15247  return b;
15248 }
15249 #endif
15250 
15251 /* VALUE */
15252 /*
15253  * pt_apply_value () -
15254  * return:
15255  * parser(in):
15256  * p(in):
15257  * g(in):
15258  * arg(in):
15259  */
15260 static PT_NODE *
15261 pt_apply_value (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
15262 {
15263  switch (p->type_enum)
15264  {
15265  case PT_TYPE_SET:
15266  case PT_TYPE_MULTISET:
15267  case PT_TYPE_SEQUENCE:
15268  PT_APPLY_WALK (parser, p->info.value.data_value.set, arg);
15269  default:
15270  break;
15271  }
15272  return p;
15273 }
15274 
15275 /*
15276  * pt_init_value () -
15277  * return:
15278  * p(in):
15279  */
15280 static PT_NODE *
15282 {
15283  p->info.value.host_var_index = -1;
15284  return p;
15285 }
15286 
15287 /*
15288  * pt_apply_set_session_variables () -
15289  * return:
15290  * parser(in):
15291  * p(in):
15292  * g(in):
15293  * arg(in):
15294  */
15295 static PT_NODE *
15297 {
15298  PT_APPLY_WALK (parser, p->info.set_variables.assignments, arg);
15299  return p;
15300 }
15301 
15302 /*
15303  * pt_print_set_session_variables () -
15304  * return:
15305  * parser(in):
15306  * p(in):
15307  */
15308 static PARSER_VARCHAR *
15310 {
15311  PARSER_VARCHAR *b = NULL, *r1 = NULL;
15312  b = pt_append_nulstring (parser, b, "SET ");
15313  r1 = pt_print_bytes_l (parser, p->info.set_variables.assignments);
15314  b = pt_append_varchar (parser, b, r1);
15315  return b;
15316 }
15317 
15318 /*
15319  * pt_apply_drop_session_variables () -
15320  * return:
15321  * parser(in):
15322  * p(in):
15323  * g(in):
15324  * arg(in):
15325  */
15326 static PT_NODE *
15328 {
15329  PT_APPLY_WALK (parser, p->info.drop_session_var.variables, arg);
15330  return p;
15331 }
15332 
15333 /*
15334  * pt_print_session_variables () - print a list of session variables
15335  * return:
15336  * parser(in):
15337  * p(in):
15338  */
15339 static PARSER_VARCHAR *
15341 {
15342  PARSER_VARCHAR *q = NULL, *r = NULL;
15343 
15344  if (!p)
15345  {
15346  return 0;
15347  }
15348  q = pt_append_nulstring (parser, q, "@");
15349  r = pt_print_bytes (parser, p);
15350  q = pt_append_varchar (parser, q, r);
15351 
15352  while (p->next)
15353  { /* print in the original order ... */
15354  p = p->next;
15355  r = pt_print_bytes (parser, p);
15356  if (r)
15357  {
15358  if (q)
15359  {
15360  q = pt_append_bytes (parser, q, ", ", 2);
15361  }
15362  q = pt_append_nulstring (parser, q, "@");
15363  q = pt_append_varchar (parser, q, r);
15364  }
15365  }
15366 
15367  return q;
15368 }
15369 
15370 /*
15371  * pt_print_drop_session_variables () -
15372  * return:
15373  * parser(in):
15374  * p(in):
15375  */
15376 static PARSER_VARCHAR *
15378 {
15379  PT_NODE *var = NULL;
15380  PARSER_VARCHAR *b = NULL, *r1 = NULL;
15381  b = pt_append_nulstring (parser, b, "DROP ");
15382  var = p->info.drop_session_var.variables;
15383  while (var)
15384  {
15386 
15387  }
15388  b = pt_append_varchar (parser, b, r1);
15389  return b;
15390 }
15391 
15392 /*
15393  * pt_print_value () -
15394  * return:
15395  * parser(in):
15396  * p(in):
15397  */
15398 /*
15399  * Note: The cached statements in the XASL cache are identified by their
15400  * string representation (parser_print_tree ()). The strings can
15401  * sometimes be identical even if constant literals or values types are
15402  * different. For example "select 2;" can be same as "select 2;"
15403  * regardless of the value's type (2 can be an integer, a float, a
15404  * double, etc.). It is necessary to generate unique string
15405  * representations of each pair <value, type_of_value>. The easiest fix
15406  * is to wrap the literals in casts like this: "select cast (2 as int);"
15407  * and "select cast (2 as float)". However, great care must be exercised
15408  * when fixing this as the resulting string might be parsed again by our
15409  * SQL parser (for example the strings in vclass definitions are parsed
15410  * during view definition translation, see mq_translate ()).
15411  * If a type ambiguity does occur, the XASL cache will return query
15412  * results with unexpected types to the client.
15413  *
15414  * Printing charset introducer and COLLATE modifier of values.
15415  * Four flags control the printing of charset and collate for strings:
15416  * - PT_SUPPRESS_CHARSET_PRINT: when printing columns header in results
15417  * - PT_SUPPRESS_COLLATE_PRINT: some string literals should not
15418  * have COLLATE modifier: in ENUM definition, partition list or
15419  * LIKE ESCAPE sequence
15420  * - PT_CHARSET_COLLATE_FULL : printing of already compiled statement
15421  * (view definition, index function or filter expression)
15422  * - PT_CHARSET_COLLATE_USER_ONLY: printing of an uncompiled statement
15423  * (in HA replication); it prints the statement exactly as the user
15424  * input. This is mutually exclusive with PT_CHARSET_COLLATE_FULL.
15425  */
15426 /* TODO Investigate the scenarios when this function prints ambiguous strings
15427  * and fix the issue by either printing different strings or setting the
15428  * print_type_ambiguity flag that disables the caching of the statement.
15429  */
15430 static PARSER_VARCHAR *
15432 {
15433  DB_VALUE *val;
15434  PARSER_VARCHAR *q = 0, *r1;
15436  const char *r;
15437  int prt_coll_id = -1;
15439 
15440  /* at first, check NULL value */
15442  {
15443  val = pt_value_to_db (parser, p);
15444  if (val)
15445  {
15446  if (DB_IS_NULL (val))
15447  {
15449 
15450  if ((parser->custom_print & PT_PRINT_ALIAS) && p->alias_print != NULL)
15451  {
15452  q = pt_append_nulstring (parser, q, " as [");
15453  q = pt_append_nulstring (parser, q, p->alias_print);
15454  q = pt_append_nulstring (parser, q, "]");
15455  }
15456 
15457  return q;
15458  }
15459  }
15460  else
15461  {
15462  assert (false);
15464  }
15465  }
15466 
15467  if (PT_HAS_COLLATION (p->type_enum))
15468  {
15469  prt_coll_id = (p->data_type != NULL) ? (p->data_type->info.data_type.collation_id) : LANG_SYS_COLLATION;
15470 
15471  if ((p->info.value.print_collation == false
15473  || (p->info.value.is_collate_allowed == false)
15474  || (prt_coll_id == LANG_SYS_COLLATION && (parser->custom_print & PT_SUPPRESS_CHARSET_PRINT))
15476  {
15477  prt_coll_id = -1;
15478  }
15479 
15481 
15482  /* do not print charset introducer for NCHAR and VARNCHAR */
15483  if ((p->info.value.print_charset == false
15485  || (p->type_enum != PT_TYPE_CHAR && p->type_enum != PT_TYPE_VARCHAR)
15486  || (prt_cs == LANG_SYS_CODESET && (parser->custom_print & PT_SUPPRESS_CHARSET_PRINT))
15488  {
15489  prt_cs = INTL_CODESET_NONE;
15490  }
15491  }
15492 
15493  switch (p->type_enum)
15494  {
15495  case PT_TYPE_SET:
15496  case PT_TYPE_MULTISET:
15497  case PT_TYPE_SEQUENCE:
15498  if (p->spec_ident)
15499  {
15500  /* this is tagged as an "in" clause right hand side Print it as a parenthesized list */
15501  r1 = pt_print_bytes_l (parser, p->info.value.data_value.set);
15502  q = pt_append_nulstring (parser, q, "(");
15503  q = pt_append_varchar (parser, q, r1);
15504  q = pt_append_nulstring (parser, q, ")");
15505  }
15506  else
15507  {
15508  if (p->type_enum != PT_TYPE_SEQUENCE)
15509  {
15510  q = pt_append_nulstring (parser, q, pt_show_type_enum (p->type_enum));
15511  }
15512  q = pt_append_nulstring (parser, q, "{");
15513 
15514  if (p->info.value.data_value.set)
15515  {
15516  r1 = pt_print_bytes_l (parser, p->info.value.data_value.set);
15517  q = pt_append_varchar (parser, q, r1);
15518  }
15519  q = pt_append_nulstring (parser, q, "}");
15520  }
15521  break;
15522 
15523  case PT_TYPE_LOGICAL:
15524  case PT_TYPE_FLOAT:
15525  case PT_TYPE_DOUBLE:
15526  case PT_TYPE_NUMERIC:
15527  case PT_TYPE_INTEGER:
15528  case PT_TYPE_BIGINT:
15529  case PT_TYPE_SMALLINT:
15530  if ((p->info.value.text != NULL) && !(parser->custom_print & PT_SUPPRESS_BIGINT_CAST))
15531  {
15532  r = p->info.value.text;
15533  }
15534  else
15535  {
15536  switch (p->type_enum)
15537  {
15538  case PT_TYPE_FLOAT:
15540  break;
15541  case PT_TYPE_DOUBLE:
15543  break;
15544  case PT_TYPE_NUMERIC:
15545  strcpy (s, (const char *) p->info.value.data_value.str->bytes);
15546  break;
15547  case PT_TYPE_INTEGER:
15548  sprintf (s, "%ld", p->info.value.data_value.i);
15549  break;
15550  case PT_TYPE_BIGINT:
15551  if (parser->custom_print & PT_SUPPRESS_BIGINT_CAST)
15552  {
15553  sprintf (s, "%lld", (long long) p->info.value.data_value.bigint);
15554  }
15555  else
15556  {
15557  sprintf (s, "cast(%lld as BIGINT)", (long long) p->info.value.data_value.bigint);
15558  }
15559  break;
15560  case PT_TYPE_LOGICAL:
15561  sprintf (s, "%ld <> 0", p->info.value.data_value.i);
15562  break;
15563  case PT_TYPE_SMALLINT:
15564  sprintf (s, "%ld", p->info.value.data_value.i);
15565  break;
15566  default:
15567  s[0] = '\0';
15568  break;
15569  }
15570  r = s;
15571  }
15572  q = pt_append_nulstring (parser, q, r);
15573  break;
15574 
15575  case PT_TYPE_DATE:
15576  case PT_TYPE_TIME:
15577  case PT_TYPE_TIMESTAMP:
15578  case PT_TYPE_TIMESTAMPTZ:
15579  case PT_TYPE_TIMESTAMPLTZ:
15580  case PT_TYPE_DATETIME:
15581  case PT_TYPE_DATETIMETZ:
15582  case PT_TYPE_DATETIMELTZ:
15583  if (p->info.value.text)
15584  {
15585  q = pt_append_nulstring (parser, q, p->info.value.text);
15586  break;
15587  }
15588  r = (char *) p->info.value.data_value.str->bytes;
15589 
15590  switch (p->type_enum)
15591  {
15592  case PT_TYPE_DATE:
15593  q = pt_append_nulstring (parser, q, "date ");
15594  break;
15595  case PT_TYPE_TIME:
15596  q = pt_append_nulstring (parser, q, "time ");
15597  break;
15598  case PT_TYPE_TIMESTAMP:
15599  q = pt_append_nulstring (parser, q, "timestamp ");
15600  break;
15601  case PT_TYPE_TIMESTAMPTZ:
15602  q = pt_append_nulstring (parser, q, "timestamptz ");
15603  break;
15604  case PT_TYPE_TIMESTAMPLTZ:
15605  q = pt_append_nulstring (parser, q, "timestampltz ");
15606  break;
15607  case PT_TYPE_DATETIME:
15608  q = pt_append_nulstring (parser, q, "datetime ");
15609  break;
15610  case PT_TYPE_DATETIMETZ:
15611  q = pt_append_nulstring (parser, q, "datetimetz ");
15612  break;
15613  case PT_TYPE_DATETIMELTZ:
15614  q = pt_append_nulstring (parser, q, "datetimeltz ");
15615  break;
15616  default:
15617  break;
15618  }
15619 
15620  q = pt_append_string_prefix (parser, q, p);
15621  q = pt_append_quoted_string (parser, q, r, ((r) ? strlen (r) : 0));
15622  break;
15623 
15624  case PT_TYPE_CHAR:
15625  case PT_TYPE_NCHAR:
15626  case PT_TYPE_BIT:
15627  if (p->info.value.text && prt_cs == INTL_CODESET_NONE && prt_coll_id == -1)
15628  {
15630  {
15631  parser->flag.long_string_skipped = 1;
15632  break;
15633  }
15634 
15635  q = pt_append_nulstring (parser, q, p->info.value.text);
15636 
15637  break;
15638  }
15639  r1 = p->info.value.data_value.str;
15640  if (parser->flag.dont_prt_long_string)
15641  {
15642  if (r1 && r1->length >= DONT_PRT_LONG_STRING_LENGTH)
15643  {
15644  parser->flag.long_string_skipped = 1;
15645  break;
15646  }
15647  }
15648 
15649  {
15650  PT_NODE *dt;
15651  PARSER_VARCHAR *tmp = NULL;
15652  char s[PT_MEMB_BUF_SIZE];
15653 
15654  tmp = pt_append_string_prefix (parser, tmp, p);
15655  if (prt_cs != INTL_CODESET_NONE)
15656  {
15657  tmp = pt_append_nulstring (parser, tmp, lang_charset_introducer (prt_cs));
15658  }
15659 
15660  if (r1)
15661  {
15662  tmp = pt_append_quoted_string (parser, tmp, (char *) r1->bytes, r1->length);
15663  }
15664  else
15665  {
15666  tmp = pt_append_nulstring (parser, tmp, "''");
15667  }
15668 
15669  dt = p->data_type;
15671  {
15672  q = pt_append_nulstring (parser, q, "cast(");
15673  q = pt_append_varchar (parser, q, tmp);
15674  if (prt_coll_id != -1)
15675  {
15676  sprintf (s, " as %s(%d) collate %s)", pt_show_type_enum (p->type_enum), dt->info.data_type.precision,
15677  lang_get_collation_name (prt_coll_id));
15678  }
15679  else
15680  {
15681  sprintf (s, " as %s(%d))", pt_show_type_enum (p->type_enum), dt->info.data_type.precision);
15682  }
15683  q = pt_append_nulstring (parser, q, s);
15684  }
15685  else
15686  {
15687  q = pt_append_varchar (parser, q, tmp);
15688 
15689  if (prt_coll_id != -1)
15690  {
15691  q = pt_append_nulstring (parser, q, " collate ");
15692  q = pt_append_nulstring (parser, q, lang_get_collation_name (prt_coll_id));
15693  }
15694  }
15695  }
15696  break;
15697 
15698  case PT_TYPE_VARCHAR: /* have to check for embedded quotes */
15699  case PT_TYPE_VARNCHAR:
15700  case PT_TYPE_VARBIT:
15701  if (p->info.value.text && prt_cs == INTL_CODESET_NONE && prt_coll_id == -1)
15702  {
15704  {
15705  parser->flag.long_string_skipped = 1;
15706  break;
15707  }
15708 
15709  q = pt_append_nulstring (parser, q, p->info.value.text);
15710 
15711  break;
15712  }
15713  r1 = p->info.value.data_value.str;
15714  if (parser->flag.dont_prt_long_string)
15715  {
15716  if (r1 && r1->length >= DONT_PRT_LONG_STRING_LENGTH)
15717  {
15718  parser->flag.long_string_skipped = 1;
15719  break;
15720  }
15721  }
15722 
15723  q = pt_append_string_prefix (parser, q, p);
15724  if (prt_cs != INTL_CODESET_NONE)
15725  {
15726  q = pt_append_nulstring (parser, q, lang_charset_introducer (prt_cs));
15727  }
15728  if (r1)
15729  {
15730  q = pt_append_quoted_string (parser, q, (const char *) r1->bytes, r1->length);
15731  }
15732  else
15733  {
15734  q = pt_append_nulstring (parser, q, "''");
15735  }
15736 
15737  if (prt_coll_id != -1)
15738  {
15739  q = pt_append_nulstring (parser, q, " collate ");
15740  q = pt_append_nulstring (parser, q, lang_get_collation_name (prt_coll_id));
15741  }
15742  break;
15743  case PT_TYPE_MONETARY:
15744  if (parser->flag.dont_prt_long_string)
15745  {
15747  {
15748  parser->flag.long_string_skipped = 1;
15749  break;
15750  }
15751  }
15752 
15753  {
15754  PT_MONETARY *val;
15755 
15756  val = &(p->info.value.data_value.money);
15757  /* this string may be used for replication, so it must be parsable */
15758  sprintf (s, "%s%.2f", intl_get_money_esc_ISO_symbol (pt_currency_to_db (val->type)), val->amount);
15759 #if defined(HPUX)
15760  /* workaround for HP's broken printf */
15761  if (strstr (s, "++") || strstr (s, "--"))
15762 #else /* HPUX */
15763  if (strstr (s, "Inf"))
15764 #endif /* HPUX */
15765  {
15766  sprintf (s, "%s%.2f", intl_get_money_esc_ISO_symbol (pt_currency_to_db (val->type)),
15767  (val->amount > 0 ? DBL_MAX : -DBL_MAX));
15768  }
15769  q = pt_append_nulstring (parser, q, s);
15770 
15771  if (pt_currency_to_db (val->type) == DB_CURRENCY_NULL)
15772  {
15773  parser->flag.print_type_ambiguity = 1;
15774  }
15775  }
15776  break;
15777  case PT_TYPE_BLOB:
15778  case PT_TYPE_CLOB:
15779  case PT_TYPE_NULL:
15780  case PT_TYPE_NA:
15781  case PT_TYPE_STAR: /* as in count (*) */
15782  case PT_TYPE_OBJECT:
15783  q = pt_append_nulstring (parser, q, pt_show_type_enum (p->type_enum));
15784  break;
15785  case PT_TYPE_ENUMERATION:
15786  q = pt_append_string_prefix (parser, q, p);
15788  {
15789  /* prefer to print enumeration string value */
15790  q =
15793  if (prt_coll_id != -1)
15794  {
15795  q = pt_append_nulstring (parser, q, " collate ");
15796  q = pt_append_nulstring (parser, q, lang_get_collation_name (prt_coll_id));
15797  }
15798  }
15799  else
15800  {
15801  /* print index if it is a valid value */
15802  sprintf (s, "%ld", p->info.value.data_value.i);
15803  q = pt_append_nulstring (parser, q, s);
15804  }
15805 
15806  break;
15807  case PT_TYPE_JSON:
15808  assert (p->info.value.data_value.str != NULL);
15809  q = pt_append_nulstring (parser, q, "json \'");
15810  q = pt_append_nulstring (parser, q, (char *) p->info.value.data_value.str->bytes);
15811  q = pt_append_nulstring (parser, q, "\'");
15812  break;
15813  default:
15814  q = pt_append_nulstring (parser, q, "-- Unknown value type --");
15815  parser->flag.print_type_ambiguity = 1;
15816  break;
15817  }
15818 
15819  if ((parser->custom_print & PT_PRINT_ALIAS) && p->alias_print != NULL)
15820  {
15821  q = pt_append_nulstring (parser, q, " as [");
15822  q = pt_append_nulstring (parser, q, p->alias_print);
15823  q = pt_append_nulstring (parser, q, "]");
15824  }
15825 
15826  return q;
15827 }
15828 
15829 /* ZZ_ERROR_MSG */
15830 /*
15831  * pt_apply_error_msg () -
15832  * return:
15833  * parser(in):
15834  * p(in):
15835  * g(in):
15836  * arg(in):
15837  */
15838 static PT_NODE *
15839 pt_apply_error_msg (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
15840 {
15841  return p;
15842 }
15843 
15844 
15845 /*
15846  * pt_print_error_msg () -
15847  * return:
15848  * parser(in):
15849  * p(in):
15850  */
15851 static PARSER_VARCHAR *
15853 {
15854  PARSER_VARCHAR *b = 0;
15855  char s[PT_MEMB_ERR_BUF_SIZE];
15856 
15857  if (p->info.error_msg.statement_number > 0)
15858  {
15859  b = pt_append_nulstring (parser, b, "stmt=");
15860  sprintf (s, "%d, ", p->info.error_msg.statement_number);
15861  b = pt_append_nulstring (parser, b, s);
15862  }
15863  sprintf (s, "near line=%d", p->line_number);
15864  b = pt_append_nulstring (parser, b, s);
15865  if (p->column_number > 0)
15866  {
15867  sprintf (s, ", col=%d", p->column_number);
15868  b = pt_append_nulstring (parser, b, s);
15869  }
15870  b = pt_append_nulstring (parser, b, ": ");
15871  b = pt_append_nulstring (parser, b, p->info.error_msg.error_message);
15872  return b;
15873 }
15874 
15875 /* CONSTRAINT */
15876 /*
15877  * pt_apply_constraint () -
15878  * return:
15879  * parser(in):
15880  * p(in):
15881  * g(in):
15882  * arg(in):
15883  */
15884 static PT_NODE *
15885 pt_apply_constraint (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
15886 {
15887  switch (p->info.constraint.type)
15888  {
15889  case PT_CONSTRAIN_NULL:
15890  case PT_CONSTRAIN_UNKNOWN:
15891  break;
15892 
15894  PT_APPLY_WALK (parser, p->info.constraint.un.primary_key.attrs, arg);
15895  break;
15896 
15898  PT_APPLY_WALK (parser, p->info.constraint.un.foreign_key.attrs, arg);
15901  break;
15902 
15903  case PT_CONSTRAIN_NOT_NULL:
15904  PT_APPLY_WALK (parser, p->info.constraint.un.not_null.attr, arg);
15905  break;
15906 
15907  case PT_CONSTRAIN_UNIQUE:
15908  PT_APPLY_WALK (parser, p->info.constraint.un.unique.attrs, arg);
15909  break;
15910 
15911  case PT_CONSTRAIN_CHECK:
15912  PT_APPLY_WALK (parser, p->info.constraint.un.check.expr, arg);
15913  break;
15914  }
15915 
15916  return p;
15917 }
15918 
15919 /*
15920  * pt_init_constraint () -
15921  * return:
15922  * node(in):
15923  */
15924 static PT_NODE *
15926 {
15927  if (node)
15928  {
15930  }
15931  return node;
15932 }
15933 
15934 /*
15935  * pt_print_col_def_constraint () -
15936  * return:
15937  * parser(in):
15938  * p(in):
15939  */
15940 static PARSER_VARCHAR *
15942 {
15943  PARSER_VARCHAR *b = 0, *r1, *r2;
15944 
15945  assert (p->node_type == PT_CONSTRAINT);
15946  assert (p->info.constraint.name == NULL);
15947 
15948  switch (p->info.constraint.type)
15949  {
15950  case PT_CONSTRAIN_UNKNOWN:
15951  assert (false);
15952  break;
15953 
15955  b = pt_append_nulstring (parser, b, "primary key ");
15956  break;
15957 
15960  b = pt_append_nulstring (parser, b, "foreign key ");
15961  b = pt_append_nulstring (parser, b, " references ");
15962  b = pt_append_varchar (parser, b, r2);
15963  b = pt_append_nulstring (parser, b, " ");
15964 
15966  {
15968  b = pt_append_nulstring (parser, b, "(");
15969  b = pt_append_varchar (parser, b, r1);
15970  b = pt_append_nulstring (parser, b, ") ");
15971  }
15972 
15974  {
15976  b = pt_append_nulstring (parser, b, " ");
15977  }
15978 
15980  {
15981  b = pt_append_nulstring (parser, b, "on delete ");
15983  b = pt_append_nulstring (parser, b, " ");
15984  }
15985 
15987  {
15988  b = pt_append_nulstring (parser, b, "on update ");
15990  b = pt_append_nulstring (parser, b, " ");
15991  }
15992 
15993  break;
15994 
15995  case PT_CONSTRAIN_NULL:
15996  break;
15997  case PT_CONSTRAIN_NOT_NULL:
15998  /*
15999  * Print nothing here. It is a duplicate of the "NOT NULL" printed for the column constraint. */
16000  break;
16001 
16002  case PT_CONSTRAIN_UNIQUE:
16003  b = pt_append_nulstring (parser, b, "unique ");
16004  break;
16005 
16006  case PT_CONSTRAIN_CHECK:
16007  r1 = pt_print_bytes (parser, p->info.constraint.un.check.expr);
16008  b = pt_append_nulstring (parser, b, "check(");
16009  b = pt_append_varchar (parser, b, r1);
16010  b = pt_append_nulstring (parser, b, ") ");
16011  break;
16012  }
16013 
16014  /*
16015  * "NOT DEFERRABLE INITIALLY IMMEDIATE" is the default, so print
16016  * nothing in that case. It's arguably safer to print the explicit
16017  * info, but it's also likely to run afoul of SQL parsers that don't
16018  * understand the full SQL2 jazz yet.
16019  */
16020  if (p->info.constraint.deferrable)
16021  {
16022  b = pt_append_nulstring (parser, b, "deferrable ");
16023  }
16024 
16026  {
16027  b = pt_append_nulstring (parser, b, "initially deferred ");
16028  }
16029 
16030  return b;
16031 }
16032 
16033 /*
16034  * pt_print_constraint () -
16035  * return:
16036  * parser(in):
16037  * p(in):
16038  */
16039 static PARSER_VARCHAR *
16041 {
16042  PARSER_VARCHAR *b = 0, *r1, *r2;
16043 
16044  if (p->info.constraint.name)
16045  {
16046  r1 = pt_print_bytes (parser, p->info.constraint.name);
16047  b = pt_append_nulstring (parser, b, "constraint ");
16048  b = pt_append_varchar (parser, b, r1);
16049  b = pt_append_nulstring (parser, b, " ");
16050  }
16051 
16052  switch (p->info.constraint.type)
16053  {
16054  case PT_CONSTRAIN_UNKNOWN:
16055  b = pt_append_nulstring (parser, b, "unknown ");
16056  break;
16057 
16059  r1 = pt_print_bytes_l (parser, p->info.constraint.un.primary_key.attrs);
16060  b = pt_append_nulstring (parser, b, "primary key (");
16061  b = pt_append_varchar (parser, b, r1);
16062  b = pt_append_nulstring (parser, b, ") ");
16063  break;
16064 
16066  r1 = pt_print_bytes_l (parser, p->info.constraint.un.foreign_key.attrs);
16068  b = pt_append_nulstring (parser, b, "foreign key (");
16069  b = pt_append_varchar (parser, b, r1);
16070  b = pt_append_nulstring (parser, b, ") references ");
16071  b = pt_append_varchar (parser, b, r2);
16072  b = pt_append_nulstring (parser, b, " ");
16073 
16075  {
16077  b = pt_append_nulstring (parser, b, "(");
16078  b = pt_append_varchar (parser, b, r1);
16079  b = pt_append_nulstring (parser, b, ") ");
16080  }
16081 
16083  {
16085  b = pt_append_nulstring (parser, b, " ");
16086  }
16087 
16089  {
16090  b = pt_append_nulstring (parser, b, "on delete ");
16092  b = pt_append_nulstring (parser, b, " ");
16093  }
16094 
16096  {
16097  b = pt_append_nulstring (parser, b, "on update ");
16099  b = pt_append_nulstring (parser, b, " ");
16100  }
16101 
16102  break;
16103 
16104  case PT_CONSTRAIN_NULL:
16105  break;
16106  case PT_CONSTRAIN_NOT_NULL:
16107  /*
16108  * Print nothing here. It is a duplicate of the "NOT NULL" printed for the column constraint. */
16109  break;
16110 
16111  case PT_CONSTRAIN_UNIQUE:
16112  r1 = pt_print_bytes_l (parser, p->info.constraint.un.unique.attrs);
16113  b = pt_append_nulstring (parser, b, "unique(");
16114  b = pt_append_varchar (parser, b, r1);
16115  b = pt_append_nulstring (parser, b, ") ");
16116  break;
16117 
16118  case PT_CONSTRAIN_CHECK:
16119  r1 = pt_print_bytes (parser, p->info.constraint.un.check.expr);
16120  b = pt_append_nulstring (parser, b, "check(");
16121  b = pt_append_varchar (parser, b, r1);
16122  b = pt_append_nulstring (parser, b, ") ");
16123  break;
16124  }
16125 
16126  /*
16127  * "NOT DEFERRABLE INITIALLY IMMEDIATE" is the default, so print
16128  * nothing in that case. It's arguably safer to print the explicit
16129  * info, but it's also likely to run afoul of SQL parsers that don't
16130  * understand the full SQL2 jazz yet.
16131  */
16132  if (p->info.constraint.deferrable)
16133  {
16134  b = pt_append_nulstring (parser, b, "deferrable ");
16135  }
16136 
16138  {
16139  b = pt_append_nulstring (parser, b, "initially deferred ");
16140  }
16141 
16142  if (p->info.constraint.comment)
16143  {
16144  r1 = pt_print_bytes (parser, p->info.constraint.comment);
16145  b = pt_append_nulstring (parser, b, " comment ");
16146  b = pt_append_varchar (parser, b, r1);
16147  }
16148 
16149  return b;
16150 }
16151 
16152 /* POINTER */
16153 
16154 /*
16155  * pt_apply_pointer () -
16156  * return:
16157  * parser(in):
16158  * p(in):
16159  * g(in):
16160  * arg(in):
16161  */
16162 static PT_NODE *
16163 pt_apply_pointer (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
16164 {
16165  if (p->info.pointer.do_walk)
16166  {
16167  PT_APPLY_WALK (parser, p->info.pointer.node, arg);
16168  }
16169 
16170  return p;
16171 }
16172 
16173 /*
16174  * pt_init_pointer () -
16175  * return:
16176  * node(in):
16177  */
16178 static PT_NODE *
16180 {
16181  if (node)
16182  {
16184  node->info.pointer.do_walk = true;
16185  }
16186 
16187  return node;
16188 }
16189 
16190 /*
16191  * pt_print_pointer () -
16192  * return:
16193  * parser(in):
16194  * p(in):
16195  */
16196 static PARSER_VARCHAR *
16198 {
16199  PARSER_VARCHAR *b = NULL;
16200 
16201  if (p)
16202  {
16203  b = pt_print_bytes_alias (parser, p->info.pointer.node);
16204  }
16205 
16206  return b;
16207 }
16208 
16209 /*
16210  * pt_apply_node_list () -
16211  * return:
16212  * parser(in):
16213  * p(in):
16214  * g(in):
16215  * arg(in):
16216  */
16217 static PT_NODE *
16218 pt_apply_node_list (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
16219 {
16220  PT_APPLY_WALK (parser, p->info.node_list.list, arg);
16221  return p;
16222 }
16223 
16224 /*
16225  * pt_init_node_list () -
16226  * return:
16227  * p(in):
16228  */
16229 static PT_NODE *
16231 {
16233  return p;
16234 }
16235 
16236 /*
16237  * pt_print_node_list () -
16238  * return:
16239  * parser(in):
16240  * p(in):
16241  */
16242 static PARSER_VARCHAR *
16244 {
16246  return b;
16247 }
16248 
16249 /* MERGE STATEMENT */
16250 /*
16251  * pt_apply_merge () -
16252  * return:
16253  * parser(in):
16254  * p(in):
16255  * g(in):
16256  * arg(in):
16257  */
16258 static PT_NODE *
16259 pt_apply_merge (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
16260 {
16261  PT_APPLY_WALK (parser, p->info.merge.into, arg);
16262  PT_APPLY_WALK (parser, p->info.merge.using_clause, arg);
16263  PT_APPLY_WALK (parser, p->info.merge.search_cond, arg);
16264  PT_APPLY_WALK (parser, p->info.merge.insert.attr_list, arg);
16265  PT_APPLY_WALK (parser, p->info.merge.insert.value_clauses, arg);
16266  PT_APPLY_WALK (parser, p->info.merge.insert.search_cond, arg);
16267  PT_APPLY_WALK (parser, p->info.merge.insert.class_where, arg);
16268  PT_APPLY_WALK (parser, p->info.merge.update.assignment, arg);
16269  PT_APPLY_WALK (parser, p->info.merge.update.search_cond, arg);
16270  PT_APPLY_WALK (parser, p->info.merge.update.del_search_cond, arg);
16271  PT_APPLY_WALK (parser, p->info.merge.check_where, arg);
16272  PT_APPLY_WALK (parser, p->info.merge.waitsecs_hint, arg);
16273 
16274  return p;
16275 }
16276 
16277 /*
16278  * pt_init_merge () -
16279  * return:
16280  * p(in):
16281  */
16282 static PT_NODE *
16284 {
16285  p->info.merge.hint = PT_HINT_NONE;
16286 
16287  return p;
16288 }
16289 
16290 /*
16291  * pt_print_merge () -
16292  * return:
16293  * parser(in):
16294  * p(in):
16295  */
16296 static PARSER_VARCHAR *
16298 {
16299  PARSER_VARCHAR *q = 0, *r1;
16300  PT_NODE_LIST_INFO *list_info = NULL;
16301 
16302  q = pt_append_nulstring (parser, q, "merge ");
16303 
16304  if (p->info.merge.hint != PT_HINT_NONE)
16305  {
16306  q = pt_append_nulstring (parser, q, "/*+");
16308  {
16309  q = pt_append_nulstring (parser, q, " LOCK_TIMEOUT(");
16310  r1 = pt_print_bytes (parser, p->info.merge.waitsecs_hint);
16311  q = pt_append_varchar (parser, q, r1);
16312  q = pt_append_nulstring (parser, q, ")");
16313  }
16314  if (p->info.merge.hint & PT_HINT_NO_LOGGING)
16315  {
16316  q = pt_append_nulstring (parser, q, " NO_LOGGING");
16317  }
16319  {
16320  q = pt_append_nulstring (parser, q, " USE_UPDATE_IDX(");
16321  r1 = pt_print_bytes (parser, p->info.merge.update.index_hint);
16322  q = pt_append_varchar (parser, q, r1);
16323  q = pt_append_nulstring (parser, q, ")");
16324  }
16326  {
16327  q = pt_append_nulstring (parser, q, " USE_INSERT_IDX(");
16328  r1 = pt_print_bytes (parser, p->info.merge.insert.index_hint);
16329  q = pt_append_varchar (parser, q, r1);
16330  q = pt_append_nulstring (parser, q, ")");
16331  }
16332  q = pt_append_nulstring (parser, q, " */");
16333  }
16334 
16335  q = pt_append_nulstring (parser, q, " into ");
16336  r1 = pt_print_bytes_spec_list (parser, p->info.merge.into);
16337  q = pt_append_varchar (parser, q, r1);
16338 
16339  q = pt_append_nulstring (parser, q, " using ");
16340  r1 = pt_print_bytes_spec_list (parser, p->info.merge.using_clause);
16341  q = pt_append_varchar (parser, q, r1);
16342 
16343  if (p->info.merge.search_cond)
16344  {
16345  q = pt_append_nulstring (parser, q, " on ");
16346  r1 = pt_print_and_list (parser, p->info.merge.search_cond);
16347  q = pt_append_varchar (parser, q, r1);
16348  }
16349  if (p->info.merge.update.assignment)
16350  {
16351  q = pt_append_nulstring (parser, q, " when matched then update set ");
16352  r1 = pt_print_bytes_l (parser, p->info.merge.update.assignment);
16353  q = pt_append_varchar (parser, q, r1);
16354 
16355  if (p->info.merge.update.search_cond)
16356  {
16357  q = pt_append_nulstring (parser, q, " where ");
16358  r1 = pt_print_and_list (parser, p->info.merge.update.search_cond);
16359  q = pt_append_varchar (parser, q, r1);
16360  }
16361  if (p->info.merge.update.has_delete)
16362  {
16363  q = pt_append_nulstring (parser, q, " delete where ");
16365  {
16367  q = pt_append_varchar (parser, q, r1);
16368  }
16369  else
16370  {
16371  q = pt_append_nulstring (parser, q, "(true)");
16372  }
16373  }
16374  }
16375  if (p->info.merge.insert.value_clauses)
16376  {
16377  q = pt_append_nulstring (parser, q, " when not matched then insert ");
16378  if (p->info.merge.insert.attr_list)
16379  {
16380  q = pt_append_nulstring (parser, q, "(");
16381  r1 = pt_print_bytes_l (parser, p->info.merge.insert.attr_list);
16382  q = pt_append_varchar (parser, q, r1);
16383  q = pt_append_nulstring (parser, q, ") ");
16384  }
16385 
16386  list_info = &p->info.merge.insert.value_clauses->info.node_list;
16387  if (list_info->list_type == PT_IS_DEFAULT_VALUE)
16388  {
16389  q = pt_append_nulstring (parser, q, "default values ");
16390  }
16391  else
16392  {
16393  q = pt_append_nulstring (parser, q, "values (");
16394  r1 = pt_print_bytes_l (parser, list_info->list);
16395  q = pt_append_varchar (parser, q, r1);
16396  q = pt_append_nulstring (parser, q, ") ");
16397  }
16398 
16399  if (p->info.merge.insert.search_cond)
16400  {
16401  q = pt_append_nulstring (parser, q, "where ");
16402  r1 = pt_print_and_list (parser, p->info.merge.insert.search_cond);
16403  q = pt_append_varchar (parser, q, r1);
16404  }
16405  }
16406 
16407  return q;
16408 }
16409 
16410 /*
16411  * pt_apply_tuple_value ()
16412  * return :
16413  * parser (in) :
16414  * p (in) :
16415  * g (in) :
16416  * arg (in) :
16417  */
16418 static PT_NODE *
16419 pt_apply_tuple_value (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
16420 {
16421  PT_APPLY_WALK (parser, p->info.tuple_value.name, arg);
16422  return p;
16423 }
16424 
16425 /*
16426  * pt_init_tuple_value ()
16427  * return :
16428  * p (in) :
16429  */
16430 static PT_NODE *
16432 {
16433  p->info.tuple_value.index = -1;
16434 
16435  return p;
16436 }
16437 
16438 /*
16439  * pt_print_tuple_value ()
16440  * return :
16441  * parser (in) :
16442  * p (in) :
16443  */
16444 static PARSER_VARCHAR *
16446 {
16447  if (p->info.tuple_value.name == NULL)
16448  {
16449  assert (false);
16450  return pt_append_bytes (parser, NULL, "unknown", 0);
16451  }
16452 
16453  return pt_print_name (parser, p->info.tuple_value.name);
16454 }
16455 
16456 /*
16457  * pt_apply_insert_value ()
16458  * return :
16459  * parser (in) :
16460  * p (in) :
16461  * g (in) :
16462  * arg (in) :
16463  */
16464 static PT_NODE *
16466 {
16467  PT_APPLY_WALK (parser, p->info.insert_value.original_node, arg);
16468  return p;
16469 }
16470 
16471 static PT_NODE *
16472 pt_apply_kill (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
16473 {
16474  return p;
16475 }
16476 
16477 /*
16478  * pt_init_insert_value ()
16479  * return :
16480  * p (in) :
16481  */
16482 static PT_NODE *
16484 {
16486 
16487  return p;
16488 }
16489 
16490 static PT_NODE *
16492 {
16494 
16495  return p;
16496 }
16497 
16498 /* WITH CLAUSE */
16499 /*
16500  * pt_apply_with_clause () -
16501  * return:
16502  * parser(in):
16503  * p(in):
16504  * g(in):
16505  * arg(in):
16506  */
16507 static PT_NODE *
16508 pt_apply_with_clause (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
16509 {
16511 
16512  return p;
16513 }
16514 
16515 /* CTE */
16516 /*
16517  * pt_apply_cte() -
16518  * return:
16519  * parser(in):
16520  * p(in):
16521  * g(in):
16522  * arg(in):
16523  */
16524 static PT_NODE *
16525 pt_apply_cte (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
16526 {
16527  PT_APPLY_WALK (parser, p->info.cte.non_recursive_part, arg);
16528  PT_APPLY_WALK (parser, p->info.cte.recursive_part, arg);
16529 
16530  return p;
16531 }
16532 
16533 /*
16534  * pt_print_insert_value ()
16535  * return :
16536  * parser (in) :
16537  * p (in) :
16538  */
16539 static PARSER_VARCHAR *
16541 {
16542  /* The original_node is HOST_VAR type. Use custom print to avoid printing HOST_VAR. */
16543  if (parser->custom_print & PT_PRINT_DB_VALUE)
16544  {
16545  return pt_print_db_value (parser, &p->info.insert_value.value);
16546  }
16547 
16548  if (p->info.insert_value.original_node != NULL)
16549  {
16550  return pt_print_bytes_l (parser, p->info.insert_value.original_node);
16551  }
16552  else
16553  {
16554  assert (false);
16555  return NULL;
16556  }
16557 }
16558 
16559 /*
16560  * pt_print_with_clause ()
16561  * return :
16562  * parser (in) :
16563  * p (in) :
16564  */
16565 static PARSER_VARCHAR *
16567 {
16568  PARSER_VARCHAR *q = NULL;
16569  PT_NODE *cte;
16570  bool first_cte = true;
16571 
16572  q = pt_append_nulstring (parser, q, "with ");
16573  if (p->info.with_clause.recursive)
16574  {
16575  q = pt_append_nulstring (parser, q, "recursive ");
16576  }
16577 
16578  for (cte = p->info.with_clause.cte_definition_list; cte != NULL; cte = cte->next)
16579  {
16580  PARSER_VARCHAR *r = pt_print_cte (parser, cte);
16581  if (!first_cte)
16582  {
16583  q = pt_append_nulstring (parser, q, ", ");
16584  }
16585  q = pt_append_varchar (parser, q, r);
16586  first_cte = false;
16587  }
16588 
16589  return q;
16590 }
16591 
16592 /*
16593  * pt_print_with_cte ()
16594  * return :
16595  * parser (in) :
16596  * p (in) :
16597  */
16598 static PARSER_VARCHAR *
16600 {
16601  PARSER_VARCHAR *q = NULL, *r1;
16602 
16603  /* name of cte */
16604  r1 = pt_print_bytes_l (parser, p->info.cte.name);
16605  q = pt_append_varchar (parser, q, r1);
16606 
16607  /* attribute list */
16608  q = pt_append_nulstring (parser, q, "(");
16609  r1 = pt_print_bytes_l (parser, p->info.cte.as_attr_list);
16610  q = pt_append_varchar (parser, q, r1);
16611  q = pt_append_nulstring (parser, q, ")");
16612 
16613  /* AS keyword */
16614  q = pt_append_nulstring (parser, q, " as ");
16615 
16616  /* cte definition */
16617  q = pt_append_nulstring (parser, q, "(");
16618 
16619  r1 = pt_print_bytes_l (parser, p->info.cte.non_recursive_part);
16620  q = pt_append_varchar (parser, q, r1);
16621 
16622  if (p->info.cte.recursive_part)
16623  {
16624  q = pt_append_nulstring (parser, q, " union ");
16625  if (p->info.cte.only_all == PT_ALL)
16626  {
16627  q = pt_append_nulstring (parser, q, "all ");
16628  }
16629 
16630  r1 = pt_print_bytes_l (parser, p->info.cte.recursive_part);
16631  q = pt_append_varchar (parser, q, r1);
16632  }
16633 
16634  q = pt_append_nulstring (parser, q, ")");
16635 
16636  return q;
16637 }
16638 
16639 /*
16640  * pt_apply_named_arg ()
16641  * return :
16642  * parser (in) :
16643  * p (in) :
16644  * g (in) :
16645  * arg (in) :
16646  */
16647 static PT_NODE *
16648 pt_apply_named_arg (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
16649 {
16650  PT_APPLY_WALK (parser, p->info.named_arg.name, arg);
16651  PT_APPLY_WALK (parser, p->info.named_arg.value, arg);
16652  return p;
16653 }
16654 
16655 /*
16656  * pt_print_named_arg ()
16657  * return :
16658  * parser (in) :
16659  * p (in) :
16660  */
16661 static PARSER_VARCHAR *
16663 {
16664  PARSER_VARCHAR *res = pt_print_bytes (parser, p->info.named_arg.name);
16665  PARSER_VARCHAR *v = pt_print_bytes (parser, p->info.named_arg.value);
16666 
16667  res = pt_append_nulstring (parser, res, " = ");
16668  res = pt_append_varchar (parser, res, v);
16669  return res;
16670 }
16671 
16672 /*
16673  * pt_print_index_columns () -
16674  * return:
16675  * parser(in):
16676  * p(in):
16677  */
16678 static PARSER_VARCHAR *
16680 {
16681  PARSER_VARCHAR *b = NULL, *r1;
16682  int list_size = 0, i;
16683  PT_NODE *q = NULL;
16684 
16685  if (p->info.index.function_expr == NULL)
16686  {
16687  /* normal index */
16688  b = pt_print_bytes_l (parser, p->info.index.column_names);
16689  }
16690  else
16691  {
16692  /* function index */
16693  q = p->info.index.column_names;
16694  while (q != NULL)
16695  {
16696  list_size++;
16697  q = q->next;
16698  }
16699 
16700  q = p->info.index.column_names;
16701  for (i = 0; i < p->info.index.func_pos && q != NULL; i++)
16702  {
16703  r1 = pt_print_bytes (parser, q);
16704  r1 = pt_append_bytes (parser, r1, ", ", 2);
16705  b = pt_append_varchar (parser, b, r1);
16706  q = q->next;
16707  }
16708 
16709  /* print function expression */
16710  r1 = pt_print_bytes (parser, p->info.index.function_expr);
16711  if (q && i < list_size - p->info.index.func_no_args)
16712  {
16713  r1 = pt_append_bytes (parser, r1, ", ", 2);
16714  }
16715  b = pt_append_varchar (parser, b, r1);
16716 
16717  /* do not print the function arguments again */
16718  for (i = p->info.index.func_pos; i < list_size - p->info.index.func_no_args && q != NULL; i++)
16719  {
16720  r1 = pt_print_bytes (parser, q);
16721  if (q->next && i < list_size - p->info.index.func_no_args - 1)
16722  {
16723  r1 = pt_append_bytes (parser, r1, ", ", 2);
16724  }
16725  b = pt_append_varchar (parser, b, r1);
16726  q = q->next;
16727  }
16728  }
16729 
16730  return b;
16731 }
16732 
16733 /*
16734  * parser_init_func_vectors () -
16735  * return:
16736  * parser_init_func_vectors(in):
16737  */
16738 void
16740 {
16741  if (!pt_apply_f)
16742  {
16743  pt_init_apply_f ();
16744  }
16745  if (!pt_init_f)
16746  {
16747  pt_init_init_f ();
16748  }
16749  if (!pt_print_f)
16750  {
16751  pt_init_print_f ();
16752  }
16753 }
16754 
16755 /*
16756  * pt_is_const_expr_node () :
16757  * return:
16758  * node (in):
16759  */
16760 bool
16762 {
16763  if (node == NULL)
16764  {
16765  return false;
16766  }
16767 
16768  switch (node->node_type)
16769  {
16770  case PT_VALUE:
16771  case PT_HOST_VAR:
16772  return true;
16773 
16774  case PT_NAME:
16775  if (node->info.name.meta_class == PT_PARAMETER)
16776  {
16777  return true;
16778  }
16779  else
16780  {
16781  return false;
16782  }
16783 
16784  case PT_EXPR:
16785  switch (node->info.expr.op)
16786  {
16787  case PT_FUNCTION_HOLDER:
16788  {
16789  bool const_function_holder = false;
16790  PT_NODE *function = node->info.expr.arg1;
16791  PT_NODE *f_arg = function->info.function.arg_list;
16792 
16793  /* FUNCTION is const if all arguments of FUNCTION are constant */
16794  const_function_holder = true;
16795  while (f_arg != NULL)
16796  {
16797  if (pt_is_const_expr_node (f_arg) == false)
16798  {
16799  const_function_holder = false;
16800  break;
16801  }
16802  f_arg = f_arg->next;
16803 
16804  }
16805  return const_function_holder;
16806  }
16807  break;
16808  case PT_PLUS:
16809  case PT_MINUS:
16810  case PT_TIMES:
16811  case PT_DIVIDE:
16812  case PT_BIT_AND:
16813  case PT_BIT_OR:
16814  case PT_BIT_XOR:
16815  case PT_BITSHIFT_LEFT:
16816  case PT_BITSHIFT_RIGHT:
16817  case PT_DIV:
16818  case PT_MOD:
16819  case PT_LEFT:
16820  case PT_RIGHT:
16821  case PT_STRCMP:
16822  case PT_EQ:
16823  case PT_NE:
16824  case PT_GE:
16825  case PT_GT:
16826  case PT_LT:
16827  case PT_LE:
16828  case PT_NULLSAFE_EQ:
16829  return (pt_is_const_expr_node (node->info.expr.arg1)
16830  && pt_is_const_expr_node (node->info.expr.arg2)) ? true : false;
16831  case PT_UNARY_MINUS:
16832  case PT_BIT_NOT:
16833  case PT_BIT_COUNT:
16834  return pt_is_const_expr_node (node->info.expr.arg1);
16835  case PT_MODULUS:
16836  return (pt_is_const_expr_node (node->info.expr.arg1)
16837  && pt_is_const_expr_node (node->info.expr.arg2)) ? true : false;
16838 
16839  case PT_PI:
16840  case PT_ROW_COUNT:
16841  case PT_DEFAULTF:
16843  case PT_SCHEMA_DEF:
16844  return true;
16845  case PT_FLOOR:
16846  case PT_CEIL:
16847  case PT_SIGN:
16848  case PT_ABS:
16849  case PT_CHR:
16850  case PT_EXP:
16851  case PT_SQRT:
16852  case PT_ACOS:
16853  case PT_ASIN:
16854  case PT_ATAN:
16855  case PT_COS:
16856  case PT_SIN:
16857  case PT_TAN:
16858  case PT_COT:
16859  case PT_DEGREES:
16860  case PT_RADIANS:
16861  case PT_LN:
16862  case PT_LOG2:
16863  case PT_LOG10:
16864  case PT_DATEF:
16865  case PT_TIMEF:
16866  return pt_is_const_expr_node (node->info.expr.arg1);
16867  case PT_POWER:
16868  case PT_ROUND:
16869  case PT_TRUNC:
16870  case PT_LOG:
16871  case PT_DATEDIFF:
16872  case PT_TIMEDIFF:
16873  return (pt_is_const_expr_node (node->info.expr.arg1)
16874  && pt_is_const_expr_node (node->info.expr.arg2)) ? true : false;
16875  case PT_INSTR:
16876  case PT_CONV:
16878  && pt_is_const_expr_node (node->info.expr.arg3)) ? true : false;
16879  case PT_POSITION:
16880  case PT_FINDINSET:
16881  return (pt_is_const_expr_node (node->info.expr.arg1)
16882  && pt_is_const_expr_node (node->info.expr.arg2)) ? true : false;
16883  case PT_SUBSTRING_INDEX:
16884  case PT_SUBSTRING:
16885  case PT_LOCATE:
16887  && (node->info.expr.arg3 ? pt_is_const_expr_node (node->info.expr.arg3) : true)) ? true : false;
16888  case PT_CHAR_LENGTH:
16889  case PT_OCTET_LENGTH:
16890  case PT_BIT_LENGTH:
16891  case PT_LOWER:
16892  case PT_UPPER:
16893  case PT_HEX:
16894  case PT_ASCII:
16895  case PT_BIN:
16896  case PT_MD5:
16897  case PT_SHA_ONE:
16898  case PT_REVERSE:
16899  case PT_DISK_SIZE:
16900  case PT_TO_BASE64:
16901  case PT_FROM_BASE64:
16902  case PT_TZ_OFFSET:
16903  case PT_CRC32:
16904  case PT_CONV_TZ:
16905  return pt_is_const_expr_node (node->info.expr.arg1);
16906  case PT_TRIM:
16907  case PT_LTRIM:
16908  case PT_RTRIM:
16909  case PT_LIKE_LOWER_BOUND:
16910  case PT_LIKE_UPPER_BOUND:
16911  case PT_FROM_UNIXTIME:
16912  return (pt_is_const_expr_node (node->info.expr.arg1)
16913  && (node->info.expr.arg2 ? pt_is_const_expr_node (node->info.expr.arg2) : true)) ? true : false;
16914 
16915  case PT_LPAD:
16916  case PT_RPAD:
16917  case PT_REPLACE:
16918  case PT_TRANSLATE:
16919  case PT_INDEX_PREFIX:
16921  && (node->info.expr.arg3 ? pt_is_const_expr_node (node->info.expr.arg3) : true)) ? true : false;
16922  case PT_ADD_MONTHS:
16923  return (pt_is_const_expr_node (node->info.expr.arg1)
16924  && pt_is_const_expr_node (node->info.expr.arg2)) ? true : false;
16925  case PT_LAST_DAY:
16926  return pt_is_const_expr_node (node->info.expr.arg1);
16927  case PT_UNIX_TIMESTAMP:
16928  if (node->info.expr.arg1)
16929  {
16930  return pt_is_const_expr_node (node->info.expr.arg1);
16931  }
16932  else
16933  {
16934  return true;
16935  }
16936  case PT_MONTHS_BETWEEN:
16937  case PT_TIME_FORMAT:
16938  case PT_TIMESTAMP:
16939  if (node->info.expr.arg2)
16940  {
16941  return (pt_is_const_expr_node (node->info.expr.arg1)
16942  && pt_is_const_expr_node (node->info.expr.arg2)) ? true : false;
16943  }
16944  else
16945  {
16946  return (pt_is_const_expr_node (node->info.expr.arg1)) ? true : false;
16947  }
16948  case PT_YEARF:
16949  case PT_MONTHF:
16950  case PT_DAYF:
16951  case PT_DAYOFMONTH:
16952  case PT_HOURF:
16953  case PT_MINUTEF:
16954  case PT_SECONDF:
16955  case PT_QUARTERF:
16956  case PT_WEEKDAY:
16957  case PT_DAYOFWEEK:
16958  case PT_DAYOFYEAR:
16959  case PT_TODAYS:
16960  case PT_FROMDAYS:
16961  case PT_TIMETOSEC:
16962  case PT_SECTOTIME:
16964  return (pt_is_const_expr_node (node->info.expr.arg1)) ? true : false;
16965  case PT_SCHEMA:
16966  case PT_DATABASE:
16967  case PT_VERSION:
16968  return true;
16969  case PT_ATAN2:
16970  case PT_FORMAT:
16971  case PT_ADDDATE:
16972  case PT_DATE_ADD:
16973  case PT_SUBDATE:
16974  case PT_DATE_SUB:
16975  case PT_DATE_FORMAT:
16976  case PT_STR_TO_DATE:
16977  case PT_REPEAT:
16978  case PT_MAKEDATE:
16979  case PT_ADDTIME:
16980  case PT_WEEKF:
16981  case PT_AES_ENCRYPT:
16982  case PT_AES_DECRYPT:
16983  case PT_SHA_TWO:
16984  case PT_FROM_TZ:
16985  return (pt_is_const_expr_node (node->info.expr.arg1)
16986  && pt_is_const_expr_node (node->info.expr.arg2)) ? true : false;
16987  case PT_SYS_DATE:
16988  case PT_CURRENT_DATE:
16989  case PT_SYS_TIME:
16990  case PT_CURRENT_TIME:
16991  case PT_SYS_TIMESTAMP:
16992  case PT_CURRENT_TIMESTAMP:
16993  case PT_SYS_DATETIME:
16994  case PT_CURRENT_DATETIME:
16995  case PT_UTC_TIME:
16996  case PT_UTC_DATE:
16998  case PT_CURRENT_USER:
16999  case PT_USER:
17000  case PT_LIST_DBS:
17001  case PT_DBTIMEZONE:
17002  case PT_SESSIONTIMEZONE:
17003  case PT_UTC_TIMESTAMP:
17004  return true;
17005  case PT_TO_CHAR:
17006  case PT_TO_DATE:
17007  case PT_TO_TIME:
17008  case PT_TO_TIMESTAMP:
17009  case PT_TO_DATETIME:
17010  case PT_TO_NUMBER:
17011  case PT_TO_DATETIME_TZ:
17012  case PT_TO_TIMESTAMP_TZ:
17013  return (pt_is_const_expr_node (node->info.expr.arg1)
17014  && (node->info.expr.arg2 ? pt_is_const_expr_node (node->info.expr.arg2) : true)) ? true : false;
17015  case PT_CURRENT_VALUE:
17016  case PT_NEXT_VALUE:
17017  return true;
17018  case PT_CAST:
17019  return pt_is_const_expr_node (node->info.expr.arg1);
17020  case PT_CASE:
17021  case PT_DECODE:
17022  return (pt_is_const_expr_node (node->info.expr.arg1)
17023  && pt_is_const_expr_node (node->info.expr.arg2)) ? true : false;
17024  case PT_IF:
17025  return (pt_is_const_expr_node (node->info.expr.arg2)
17026  && pt_is_const_expr_node (node->info.expr.arg3)) ? true : false;
17027  case PT_IFNULL:
17028  return (pt_is_const_expr_node (node->info.expr.arg1)
17029  && pt_is_const_expr_node (node->info.expr.arg2)) ? true : false;
17030  case PT_ISNULL:
17031  return pt_is_const_expr_node (node->info.expr.arg1);
17032  case PT_CONCAT:
17033  return (pt_is_const_expr_node (node->info.expr.arg1)
17034  && (node->info.expr.arg2 ? pt_is_const_expr_node (node->info.expr.arg2) : true)) ? true : false;
17035  case PT_CONCAT_WS:
17036  case PT_FIELD:
17037  return (pt_is_const_expr_node (node->info.expr.arg1)
17038  && (node->info.expr.arg2 ? pt_is_const_expr_node (node->info.expr.arg2) : true)
17039  && pt_is_const_expr_node (node->info.expr.arg3)) ? true : false;
17040  case PT_NULLIF:
17041  case PT_COALESCE:
17042  case PT_NVL:
17043  return (pt_is_const_expr_node (node->info.expr.arg1)
17044  && pt_is_const_expr_node (node->info.expr.arg2)) ? true : false;
17045  case PT_NVL2:
17046  case PT_MID:
17047  case PT_MAKETIME:
17048  case PT_NEW_TIME:
17050  && pt_is_const_expr_node (node->info.expr.arg3)) ? true : false;
17051  case PT_EXTRACT:
17052  return pt_is_const_expr_node (node->info.expr.arg1);
17053  case PT_LEAST:
17054  case PT_GREATEST:
17055  return (pt_is_const_expr_node (node->info.expr.arg1)
17056  && pt_is_const_expr_node (node->info.expr.arg2)) ? true : false;
17057  case PT_INET_ATON:
17058  case PT_INET_NTOA:
17059  case PT_CHARSET:
17060  case PT_COLLATION:
17061  return pt_is_const_expr_node (node->info.expr.arg1);
17062  case PT_COERCIBILITY:
17063  /* coercibility is always folded to constant */
17064  assert (false);
17065  case PT_WIDTH_BUCKET:
17066 
17068  && pt_is_const_expr_node (node->info.expr.arg3));
17069  default:
17070  return false;
17071  }
17072 
17073  default:
17074  return false;
17075  }
17076 
17077  return false;
17078 }
17079 
17080 /*
17081  * pt_restore_assignment_links - restore assignments links after a call to
17082  * get_assignments_lists.
17083  * return:
17084  * assigns(in): first node of original assignment list
17085  * links(in): The links array returned by get_assignment lists
17086  * count(in): count of links in links array. This is used in
17087  * get_assignments_lists if an error occurs. If this is -1 then just iterate
17088  * through assignments list while restoring it, until the next statement is
17089  * NULL.
17090  *
17091  * Note:
17092  * The links array is freed
17093  */
17094 void
17096 {
17097  PT_NODE *lhs = NULL, *rhs = NULL, *att = NULL;
17098  int links_idx = 0;
17099 
17100  while (assigns && (links_idx < count || count == -1))
17101  {
17102  lhs = assigns->info.expr.arg1;
17103  rhs = assigns->info.expr.arg2;
17104  if (lhs->node_type == PT_NAME)
17105  {
17106  lhs->next = links[links_idx++];
17107  if (links_idx < count || count == -1)
17108  {
17109  rhs->next = links[links_idx++];
17110  }
17111  }
17112  else
17113  { /* PT_IS_N_COLUMN_UPDATE_EXPR(lhs) == true */
17114  lhs = lhs->info.expr.arg1;
17115  for (att = lhs; att && (links_idx < count || count == -1); att = att->next)
17116  {
17117  att->next = links[links_idx++];
17118  }
17119 
17120  rhs->next = links[links_idx++];
17121  }
17122  assigns = assigns->next;
17123  }
17124 
17125  /* free links array */
17126  if (links)
17127  {
17128  db_private_free (NULL, links);
17129  }
17130 }
17131 
17132 /*
17133  * pt_get_assignment_lists - Returns corresponding lists of names and
17134  * expressions
17135  * return: Error code
17136  * parser(in): Parser context
17137  * select_names(out):
17138  * select_values(out):
17139  * const_names(out):
17140  * const_values(out):
17141  * assign(in): Parse tree of assignment lists
17142  *
17143  * Note:
17144  */
17145 int
17146 pt_get_assignment_lists (PARSER_CONTEXT * parser, PT_NODE ** select_names, PT_NODE ** select_values,
17147  PT_NODE ** const_names, PT_NODE ** const_values, int *no_vals, int *no_consts,
17148  PT_NODE * assign, PT_NODE *** old_links)
17149 {
17150 #define ASSIGN_LINKS_EXTENT 10
17151 
17152  int error = NO_ERROR;
17153  int links_chunk = ASSIGN_LINKS_EXTENT, links_alloc = ASSIGN_LINKS_EXTENT;
17154  int links_idx = 0;
17155 
17156  PT_NODE *lhs, *rhs, *att;
17157  PT_NODE **links, **new_links;
17158 
17159  links = (PT_NODE **) db_private_alloc (NULL, links_alloc * sizeof (PT_NODE *));
17160  if (!links)
17161  {
17162  error = ER_OUT_OF_VIRTUAL_MEMORY;
17163  goto exit_on_error;
17164  }
17165 
17166  if (!select_names || !select_values || !const_names || !const_values || !no_vals || !no_consts)
17167  {
17168  /* bullet proofing, should not get here */
17169 #if defined(CUBRID_DEBUG)
17170  fprintf (stdout, "system error detected in %s, line %d.\n", __FILE__, __LINE__);
17171 #endif
17172  error = ER_GENERIC_ERROR;
17173  goto exit_on_error;
17174  }
17175 
17176  *select_names = *select_values = *const_names = *const_values = NULL;
17177  *no_vals = *no_consts = 0;
17178 
17179  while (assign)
17180  {
17181  if (assign->node_type != PT_EXPR || assign->info.expr.op != PT_ASSIGN || !(lhs = assign->info.expr.arg1)
17182  || !(rhs = assign->info.expr.arg2) || !(lhs->node_type == PT_NAME || PT_IS_N_COLUMN_UPDATE_EXPR (lhs)))
17183  {
17184  /* bullet proofing, should not get here */
17185 #if defined(CUBRID_DEBUG)
17186  fprintf (stdout, "system error detected in %s, line %d.\n", __FILE__, __LINE__);
17187 #endif
17188  error = ER_GENERIC_ERROR;
17189  goto exit_on_error;
17190  }
17191 
17192  if (lhs->node_type == PT_NAME)
17193  {
17194  /* allocate more space if needed */
17195  if (links_idx >= links_alloc)
17196  {
17197  links_alloc += links_chunk;
17198  new_links = (PT_NODE **) db_private_realloc (NULL, links, links_alloc * sizeof (PT_NODE *));
17199  if (new_links == NULL)
17200  {
17201  error = ER_OUT_OF_VIRTUAL_MEMORY;
17202  goto exit_on_error;
17203  }
17204  links = new_links;
17205  }
17206 
17207  links[links_idx++] = lhs->next;
17208  links[links_idx++] = rhs->next;
17209  ++(*no_vals);
17210  }
17211  else
17212  { /* PT_IS_N_COLUMN_UPDATE_EXPR(lhs) == true */
17213  lhs = lhs->info.expr.arg1;
17214  for (att = lhs; att; att = att->next)
17215  {
17216  if (att->node_type != PT_NAME)
17217  {
17218 #if defined(CUBRID_DEBUG)
17219  fprintf (stdout, "system error detected in %s, line %d.\n", __FILE__, __LINE__);
17220 #endif
17221  error = ER_GENERIC_ERROR;
17222  goto exit_on_error;
17223  }
17224 
17225  /* allocate more space if needed */
17226  if (links_idx >= links_alloc)
17227  {
17228  links_alloc += links_chunk;
17229  new_links = (PT_NODE **) db_private_realloc (NULL, links, links_alloc * sizeof (PT_NODE *));
17230  if (new_links == NULL)
17231  {
17232  error = ER_OUT_OF_VIRTUAL_MEMORY;
17233  goto exit_on_error;
17234  }
17235  links = new_links;
17236  }
17237 
17238  links[links_idx++] = att->next;
17239  ++(*no_vals);
17240  }
17241 
17242  /* allocate more space if needed */
17243  if (links_idx >= links_alloc)
17244  {
17245  links_alloc += links_chunk;
17246  new_links = (PT_NODE **) db_private_realloc (NULL, links, links_alloc * sizeof (PT_NODE *));
17247  if (new_links == NULL)
17248  {
17249  error = ER_OUT_OF_VIRTUAL_MEMORY;
17250  goto exit_on_error;
17251  }
17252  links = new_links;
17253  }
17254 
17255  links[links_idx++] = rhs->next;
17256  }
17257 
17258  if (!PT_IS_CONST_NOT_HOSTVAR (rhs))
17259  {
17260  /* assume evaluation needed. */
17261  if (*select_names == NULL)
17262  {
17263  *select_names = lhs;
17264  *select_values = rhs;
17265  }
17266  else
17267  {
17268  parser_append_node (lhs, *select_names);
17269  parser_append_node (rhs, *select_values);
17270  }
17271  }
17272  else
17273  {
17274  ++(*no_consts);
17275  /* we already have a constant value */
17276  if (*const_names == NULL)
17277  {
17278  *const_names = lhs;
17279  *const_values = rhs;
17280  }
17281  else
17282  {
17283  parser_append_node (lhs, *const_names);
17284  parser_append_node (rhs, *const_values);
17285  }
17286  }
17287  assign = assign->next;
17288  }
17289  *old_links = links;
17290  return error;
17291 
17292 exit_on_error:
17293  if (links != NULL)
17294  {
17295  pt_restore_assignment_links (assign, links, links_idx);
17296  }
17297  *old_links = NULL;
17298 
17299  return error;
17300 }
17301 
17302 /*
17303  * pt_function_index_skip_expr () - Some expressions should not be counted in
17304  * the pt_is_nested_expr test as functions (e.g. cast expression).
17305  * as a consequence, these expressions should be also skipped
17306  * when the column names are searched (e.g. in lookup_node()).
17307  *
17308  * return : The node that needs to be verified after skipping expressions
17309  * node(in) : Function index expression
17310  */
17311 PT_NODE *
17313 {
17314  if (node == NULL || !PT_IS_EXPR_NODE (node))
17315  {
17316  /* do nothing */
17317  return node;
17318  }
17319  switch (node->info.expr.op)
17320  {
17321  case PT_CAST:
17322  case PT_UNARY_MINUS:
17323  return pt_function_index_skip_expr (node->info.expr.arg1);
17324  default:
17325  return node;
17326  }
17327 }
17328 
17329 /*
17330  * pt_is_nested_expr () : checks if the given PT_NODE is a complex
17331  * expression, that contains at least one
17332  * argument that is not a PT_VALUE or
17333  * PT_NAME node
17334  * return:
17335  * node(in): PT_EXPR
17336  */
17337 static bool
17339 {
17340  PT_NODE *func, *arg;
17341  assert (node->node_type == PT_EXPR);
17342 
17343  if (node->info.expr.op != PT_FUNCTION_HOLDER)
17344  {
17345  arg = pt_function_index_skip_expr (node->info.expr.arg1);
17346  if ((arg != NULL) && (PT_IS_NAME_NODE (arg) == false) && (PT_IS_VALUE_NODE (arg) == false))
17347  {
17348  return true;
17349  }
17350  arg = pt_function_index_skip_expr (node->info.expr.arg2);
17351  if ((arg != NULL) && (PT_IS_NAME_NODE (arg) == false) && (PT_IS_VALUE_NODE (arg) == false))
17352  {
17353  return true;
17354  }
17355  arg = pt_function_index_skip_expr (node->info.expr.arg3);
17356  if ((arg != NULL) && (PT_IS_NAME_NODE (arg) == false) && (PT_IS_VALUE_NODE (arg) == false))
17357  {
17358  return true;
17359  }
17360  return false;
17361  }
17362  /* the given operator is not PT_FUNCTION_HOLDER */
17363 
17364  func = node->info.expr.arg1;
17365  for (arg = func->info.function.arg_list; arg != NULL; arg = arg->next)
17366  {
17367  PT_NODE *save_arg = arg;
17368  arg = pt_function_index_skip_expr (arg);
17369  if ((arg != NULL) && (PT_IS_NAME_NODE (arg) == false) && (PT_IS_VALUE_NODE (arg) == false))
17370  {
17371  return true;
17372  }
17373  arg = save_arg;
17374  }
17375  return false;
17376 }
17377 
17378 /*
17379  * pt_function_is_allowed_as_function_index () : checks if the given function
17380  * is allowed in the structure of a function index
17381  * return:
17382  * func(in): parse tree node function
17383  */
17384 static bool
17386 {
17387  assert (func != NULL && func->node_type == PT_FUNCTION);
17388 
17389  // TODO: expose get_signatures () of func_type.cpp & filter out funcs returning PT_TYPE_JSON
17390  switch (func->info.function.function_type)
17391  {
17392  case F_BENCHMARK:
17393  case F_JSON_OBJECT:
17394  case F_JSON_ARRAY:
17395  case F_JSON_MERGE:
17396  case F_JSON_MERGE_PATCH:
17397  case F_JSON_INSERT:
17398  case F_JSON_REMOVE:
17399  case F_JSON_ARRAY_APPEND:
17400  case F_JSON_GET_ALL_PATHS:
17401  case F_JSON_REPLACE:
17402  case F_JSON_SET:
17403  case F_JSON_KEYS:
17404  case F_JSON_ARRAY_INSERT:
17405  case F_JSON_SEARCH:
17406  case F_JSON_EXTRACT:
17407  return false;
17408  case F_INSERT_SUBSTRING:
17409  case F_ELT:
17410  case F_JSON_CONTAINS:
17411  case F_JSON_CONTAINS_PATH:
17412  case F_JSON_DEPTH:
17413  case F_JSON_LENGTH:
17414  case F_JSON_TYPE:
17415  case F_JSON_VALID:
17416  case F_JSON_PRETTY:
17417  case F_JSON_QUOTE:
17418  case F_JSON_UNQUOTE:
17419  return true;
17420  default:
17421  return true;
17422  }
17423 }
17424 
17425 /*
17426  * pt_expr_is_allowed_as_function_index () : checks if the given operator
17427  * is allowed in the structure of a function index
17428  * return:
17429  * expr(in): expression parse tree node
17430  */
17431 static bool
17433 {
17434  assert (expr != NULL && expr->node_type == PT_EXPR);
17435 
17436  /* if add it here, add it to validate_regu_key_function_index () as well */
17437  switch (expr->info.expr.op)
17438  {
17439  case PT_CAST:
17441  {
17442  break;
17443  }
17444  /* FALLTHRU */
17445  case PT_MOD:
17446  case PT_LEFT:
17447  case PT_RIGHT:
17448  case PT_REPEAT:
17449  case PT_MID:
17450  case PT_STRCMP:
17451  case PT_REVERSE:
17452  case PT_BIT_COUNT:
17453  case PT_MODULUS:
17454  case PT_FLOOR:
17455  case PT_CEIL:
17456  case PT_ABS:
17457  case PT_POWER:
17458  case PT_ROUND:
17459  case PT_LOG:
17460  case PT_EXP:
17461  case PT_SQRT:
17462  case PT_SIN:
17463  case PT_COS:
17464  case PT_TAN:
17465  case PT_COT:
17466  case PT_ACOS:
17467  case PT_ASIN:
17468  case PT_ATAN:
17469  case PT_ATAN2:
17470  case PT_DEGREES:
17471  case PT_DATEF:
17472  case PT_TIMEF:
17473  case PT_RADIANS:
17474  case PT_LN:
17475  case PT_LOG2:
17476  case PT_LOG10:
17477  case PT_TRUNC:
17478  case PT_CHR:
17479  case PT_INSTR:
17480  case PT_LEAST:
17481  case PT_GREATEST:
17482  case PT_POSITION:
17483  case PT_LOWER:
17484  case PT_UPPER:
17485  case PT_CHAR_LENGTH:
17486  case PT_LTRIM:
17487  case PT_RTRIM:
17488  case PT_FROM_UNIXTIME:
17489  case PT_SUBSTRING_INDEX:
17490  case PT_MD5:
17491  case PT_AES_ENCRYPT:
17492  case PT_AES_DECRYPT:
17493  case PT_SHA_ONE:
17494  case PT_SHA_TWO:
17495  case PT_TO_BASE64:
17496  case PT_FROM_BASE64:
17497  case PT_LPAD:
17498  case PT_RPAD:
17499  case PT_REPLACE:
17500  case PT_TRANSLATE:
17501  case PT_ADD_MONTHS:
17502  case PT_LAST_DAY:
17503  case PT_UNIX_TIMESTAMP:
17504  case PT_STR_TO_DATE:
17505  case PT_TIME_FORMAT:
17506  case PT_TIMESTAMP:
17507  case PT_YEARF:
17508  case PT_MONTHF:
17509  case PT_DAYF:
17510  case PT_DAYOFMONTH:
17511  case PT_HOURF:
17512  case PT_MINUTEF:
17513  case PT_SECONDF:
17514  case PT_QUARTERF:
17515  case PT_WEEKDAY:
17516  case PT_DAYOFWEEK:
17517  case PT_DAYOFYEAR:
17518  case PT_TODAYS:
17519  case PT_FROMDAYS:
17520  case PT_TIMETOSEC:
17521  case PT_SECTOTIME:
17522  case PT_MAKEDATE:
17523  case PT_MAKETIME:
17524  case PT_WEEKF:
17525  case PT_MONTHS_BETWEEN:
17526  case PT_FORMAT:
17527  case PT_DATE_FORMAT:
17528  case PT_ADDDATE:
17529  case PT_DATE_ADD:
17530  case PT_DATEDIFF:
17531  case PT_TIMEDIFF:
17532  case PT_SUBDATE:
17533  case PT_DATE_SUB:
17534  case PT_FUNCTION_HOLDER:
17535  case PT_BIT_LENGTH:
17536  case PT_OCTET_LENGTH:
17537  case PT_IFNULL:
17538  case PT_LOCATE:
17539  case PT_SUBSTRING:
17540  case PT_NVL:
17541  case PT_NVL2:
17542  case PT_NULLIF:
17543  case PT_TO_CHAR:
17544  case PT_TO_DATE:
17545  case PT_TO_DATETIME:
17546  case PT_TO_TIMESTAMP:
17547  case PT_TO_TIME:
17548  case PT_TO_NUMBER:
17549  case PT_TRIM:
17550  case PT_INET_ATON:
17551  case PT_INET_NTOA:
17552  case PT_TO_DATETIME_TZ:
17553  case PT_TO_TIMESTAMP_TZ:
17554  case PT_CRC32:
17555  return true;
17556  case PT_TZ_OFFSET:
17557  default:
17558  return false;
17559  }
17560  return false;
17561 }
17562 
17563 /*
17564  * pt_is_function_index_expr () : checks if the given PT_EXPR
17565  * is allowed in the structure of a
17566  * function index. This is true if the
17567  * operator is allowed and the expression
17568  * is a simple one, with at least one
17569  * attribute name as an argument
17570  * return:
17571  * expr(in): PT_EXPR
17572  */
17573 bool
17574 pt_is_function_index_expr (PARSER_CONTEXT * parser, PT_NODE * expr, bool report_error)
17575 {
17576  if (!expr)
17577  {
17578  return false;
17579  }
17580  if (expr->node_type == PT_VALUE)
17581  {
17582  if (report_error)
17583  {
17585  }
17586  return false;
17587  }
17588  if (expr->node_type != PT_EXPR)
17589  {
17590  if (report_error)
17591  {
17592  /* the initial expression might have been rewritten to something else (ex: TO_CHAR(col) rewrites to a PT_NAME
17593  * if col has a character data type. */
17595  }
17596  return false;
17597  }
17599  {
17600  if (report_error)
17601  {
17603  pt_show_binopcode (expr->info.expr.op));
17604  }
17605  return false;
17606  }
17607  if (pt_is_const_expr_node (expr))
17608  {
17609  if (report_error)
17610  {
17612  }
17613  return false;
17614  }
17615  if (pt_is_nested_expr (expr))
17616  {
17617  if (report_error)
17618  {
17620  }
17621  return false;
17622  }
17623 
17624  if (expr->info.expr.op == PT_FUNCTION_HOLDER)
17625  {
17626  PT_NODE *func = expr->info.expr.arg1;
17628  {
17629  if (report_error)
17630  {
17633  }
17634  return false;
17635  }
17636  }
17637  return true;
17638 }
17639 
17640 /*
17641  * pt_expr_to_sort_spec () : creates a list of PT_SORT_SPEC nodes from
17642  * the arguments of a given expression.
17643  * return: PT_NODE representing a list of PT_SORT_SPEC nodes
17644  * expr(in): PT_EXPR
17645  * parser(in):
17646  */
17647 PT_NODE *
17649 {
17650  PT_NODE *node = NULL;
17651 
17652  if (!PT_IS_EXPR_NODE (expr))
17653  {
17654  return NULL;
17655  }
17656 
17657  if (expr->info.expr.op == PT_FUNCTION_HOLDER)
17658  {
17659  PT_NODE *func, *arg;
17660  func = expr->info.expr.arg1;
17661  for (arg = func->info.function.arg_list; arg != NULL; arg = arg->next)
17662  {
17663  PT_NODE *save_arg = arg;
17664  arg = pt_function_index_skip_expr (arg);
17665  if (PT_IS_NAME_NODE (arg))
17666  {
17667  PT_NODE *srt_spec = parser_new_node (parser, PT_SORT_SPEC);
17668  if (srt_spec == NULL)
17669  {
17670  PT_INTERNAL_ERROR (parser, "allocate new node");
17671  return NULL;
17672  }
17673  srt_spec->info.sort_spec.expr = parser_copy_tree (parser, arg);
17674  srt_spec->info.sort_spec.expr->next = NULL;
17675  srt_spec->info.sort_spec.asc_or_desc = PT_ASC;
17676  node = parser_append_node (srt_spec, node);
17677  }
17678  arg = save_arg;
17679  }
17680  }
17681  else
17682  {
17683  PT_NODE *arg;
17684  arg = pt_function_index_skip_expr (expr->info.expr.arg1);
17685  if (PT_IS_NAME_NODE (arg))
17686  {
17687  PT_NODE *srt_spec = parser_new_node (parser, PT_SORT_SPEC);
17688  if (srt_spec == NULL)
17689  {
17690  PT_INTERNAL_ERROR (parser, "allocate new node");
17691  return NULL;
17692  }
17693  srt_spec->info.sort_spec.expr = parser_copy_tree (parser, arg);
17694  srt_spec->info.sort_spec.asc_or_desc = PT_ASC;
17695  node = parser_append_node (srt_spec, node);
17696  }
17697  arg = pt_function_index_skip_expr (expr->info.expr.arg2);
17698  if (PT_IS_NAME_NODE (arg))
17699  {
17700  PT_NODE *srt_spec = parser_new_node (parser, PT_SORT_SPEC);
17701  if (srt_spec == NULL)
17702  {
17703  PT_INTERNAL_ERROR (parser, "allocate new node");
17704  return NULL;
17705  }
17706  srt_spec->info.sort_spec.expr = parser_copy_tree (parser, arg);
17707  srt_spec->info.sort_spec.asc_or_desc = PT_ASC;
17708  node = parser_append_node (srt_spec, node);
17709  }
17710  arg = pt_function_index_skip_expr (expr->info.expr.arg3);
17711  if (PT_IS_NAME_NODE (arg))
17712  {
17713  PT_NODE *srt_spec = parser_new_node (parser, PT_SORT_SPEC);
17714  if (srt_spec == NULL)
17715  {
17716  PT_INTERNAL_ERROR (parser, "allocate new node");
17717  return NULL;
17718  }
17719  srt_spec->info.sort_spec.expr = parser_copy_tree (parser, arg);
17720  srt_spec->info.sort_spec.asc_or_desc = PT_ASC;
17721  node = parser_append_node (srt_spec, node);
17722  }
17723  }
17724  return node;
17725 }
17726 
17727 /*
17728  * pt_is_join_expr () : checks if the given expression has non-constant
17729  * arguments from only one class
17730  * return: true if more than one classes are involved in the expression,
17731  * false otherwise
17732  * expr(in): PT_EXPR
17733  * spec_id(out): the spec id of the PT_SPEC used (if false is returned)
17734  */
17735 bool
17736 pt_is_join_expr (PT_NODE * expr, UINTPTR * spec_id)
17737 {
17738  PT_NODE *func = NULL;
17739  PT_NODE *arg = NULL;
17740 
17741  assert (expr != NULL && spec_id != NULL);
17742  *spec_id = 0;
17743 
17744  if (expr->info.expr.op != PT_FUNCTION_HOLDER)
17745  {
17746  arg = pt_function_index_skip_expr (expr->info.expr.arg1);
17747  if (PT_IS_NAME_NODE (arg))
17748  {
17749  if (*spec_id == 0)
17750  {
17751  *spec_id = arg->info.name.spec_id;
17752  }
17753  else
17754  {
17755  if (*spec_id != arg->info.name.spec_id)
17756  {
17757  return true;
17758  }
17759  }
17760  }
17761  arg = pt_function_index_skip_expr (expr->info.expr.arg2);
17762  if (PT_IS_NAME_NODE (arg))
17763  {
17764  if (*spec_id == 0)
17765  {
17766  *spec_id = arg->info.name.spec_id;
17767  }
17768  else
17769  {
17770  if (*spec_id != arg->info.name.spec_id)
17771  {
17772  return true;
17773  }
17774  }
17775  }
17776  arg = pt_function_index_skip_expr (expr->info.expr.arg3);
17777  if (PT_IS_NAME_NODE (arg))
17778  {
17779  if (*spec_id == 0)
17780  {
17781  *spec_id = arg->info.name.spec_id;
17782  }
17783  else
17784  {
17785  if (*spec_id != arg->info.name.spec_id)
17786  {
17787  return true;
17788  }
17789  }
17790  }
17791  }
17792  else
17793  {
17794  func = expr->info.expr.arg1;
17795  for (arg = func->info.function.arg_list; arg != NULL; arg = arg->next)
17796  {
17797  PT_NODE *tmp = pt_function_index_skip_expr (arg);
17798  if (PT_IS_NAME_NODE (tmp))
17799  {
17800  if (*spec_id == 0)
17801  {
17802  *spec_id = tmp->info.name.spec_id;
17803  }
17804  else
17805  {
17806  if (*spec_id != tmp->info.name.spec_id)
17807  {
17808  return true;
17809  }
17810  }
17811  }
17812  }
17813  }
17814  return false;
17815 }
17816 
17817 /*
17818  * pt_sort_spec_list_to_name_node_list () : creates a list of name nodes
17819  * from sort spec nodes list
17820  * return: name list if sort spec nodes contain only name nodes,
17821  * NULL otherwise
17822  * expr(in): sort spec list
17823  * parser(in):
17824  */
17825 PT_NODE *
17827 {
17828  PT_NODE *name_list = NULL;
17829  PT_NODE *node = NULL, *name_node = NULL;
17830 
17831  for (node = sort_spec_list; node; node = node->next)
17832  {
17833  if (!PT_IS_SORT_SPEC_NODE (node) || node->info.sort_spec.expr->node_type != PT_NAME)
17834  {
17835  return NULL;
17836  }
17837  }
17838 
17839  for (node = sort_spec_list; node; node = node->next)
17840  {
17841  name_node = parser_copy_tree (parser, node->info.sort_spec.expr);
17842  if (node->info.sort_spec.asc_or_desc == PT_DESC)
17843  {
17845  }
17846 
17847  name_list = parser_append_node (name_node, name_list);
17848  }
17849 
17850  return name_list;
17851 }
17852 
17853 /*
17854  * PT_VACUUM section
17855  */
17856 
17857 /*
17858  * pt_apply_vacuum () - Apply function "q" on all the children of a VACUUM
17859  * parse tree node.
17860  *
17861  * return : Updated VACUUM parse tree node.
17862  * parser (in) : Parse context.
17863  * p (in) : VACUUM parse tree node.
17864  * g (in) : Function to apply on all node's children.
17865  * arg (in) : Argument for function g.
17866  */
17867 static PT_NODE *
17868 pt_apply_vacuum (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
17869 {
17870  assert (PT_IS_VACUUM_NODE (p));
17871 
17872  return p;
17873 }
17874 
17875 /*
17876  * pt_init_vacuum () - Initialize a VACUUM parse tree node.
17877  *
17878  * return : Initialized parse tree node.
17879  * p (in) : VACUUM parse tree node.
17880  */
17881 static PT_NODE *
17883 {
17884  assert (PT_IS_VACUUM_NODE (p));
17885 
17886  return p;
17887 }
17888 
17889 /*
17890  * pt_print_vacuum () - Print a VACUUM parse tree node.
17891  *
17892  * return : Return printed version of parse tree node.
17893  * parser (in) : Parser context.
17894  * p (in) :
17895  */
17896 static PARSER_VARCHAR *
17898 {
17899  PARSER_VARCHAR *q = NULL;
17900 
17901  assert (PT_IS_VACUUM_NODE (p));
17902 
17903  q = pt_append_nulstring (parser, q, "VACUUM");
17904 
17905  return q;
17906 }
17907 
17908 /*
17909  * pt_apply_query_trace ()
17910  * return :
17911  * parser (in) :
17912  * p (in) :
17913  * g (in) :
17914  * arg (in) :
17915  */
17916 static PT_NODE *
17917 pt_apply_query_trace (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
17918 {
17919  return p;
17920 }
17921 
17922 /*
17923  * pt_init_query_trace ()
17924  * return :
17925  * p (in) :
17926  */
17927 static PT_NODE *
17929 {
17932 
17933  return p;
17934 }
17935 
17936 /*
17937  * pt_print_query_trace ()
17938  * return :
17939  * parser (in) :
17940  * p (in) :
17941  */
17942 static PARSER_VARCHAR *
17944 {
17945  PARSER_VARCHAR *b = NULL;
17946  PT_MISC_TYPE onoff, format;
17947 
17948  onoff = p->info.trace.on_off;
17949  format = p->info.trace.format;
17950 
17951  b = pt_append_nulstring (parser, b, "set trace ");
17952  b = pt_append_nulstring (parser, b, pt_show_misc_type (onoff));
17953 
17954  if (onoff == PT_TRACE_ON)
17955  {
17956  b = pt_append_nulstring (parser, b, " output ");
17957  b = pt_append_nulstring (parser, b, pt_show_misc_type (format));
17958  }
17959 
17960  return b;
17961 }
17962 
17963 /*
17964  * pt_clean_tree_copy_info () - deallocate memory used by a PT_TREE_COPY_INFO
17965  */
17966 static void
17968 {
17969  PT_CTE_COPY_INFO *cte_info_it, *save_next;
17970 
17971  /* deallocate CTE list */
17972  for (cte_info_it = tree_copy_info->cte_structures_list; cte_info_it != NULL; cte_info_it = save_next)
17973  {
17974  save_next = cte_info_it->next;
17975  free (cte_info_it);
17976  }
17977 }
17978 
17979 static PT_NODE *
17980 pt_apply_json_table (PARSER_CONTEXT * parser, PT_NODE * p, void *arg)
17981 {
17982  PT_APPLY_WALK (parser, p->info.json_table_info.expr, arg);
17983  PT_APPLY_WALK (parser, p->info.json_table_info.tree, arg);
17984  return p;
17985 }
17986 
17987 static PARSER_VARCHAR *
17989 {
17990  PARSER_VARCHAR *pstr = NULL;
17992 
17993  // print format:
17994  // json_table (.expr, .tree)
17995 
17996  // 'json_table ('
17997  pstr = pt_append_nulstring (parser, pstr, "json_table (");
17998 
17999  // print expr
18000  substr = pt_print_bytes (parser, p->info.json_table_info.expr);
18001  pstr = pt_append_varchar (parser, pstr, substr);
18002 
18003  // ', ' print tree
18004  pstr = pt_append_nulstring (parser, pstr, ", ");
18005  substr = pt_print_bytes (parser, p->info.json_table_info.tree);
18006  pstr = pt_append_varchar (parser, pstr, substr);
18007 
18008  // ')'
18009  pstr = pt_append_nulstring (parser, pstr, ")");
18010 
18011  return pstr;
18012 }
18013 
18014 static PT_NODE *
18016 {
18017  PT_APPLY_WALK (parser, p->info.json_table_node_info.columns, arg);
18019  return p;
18020 }
18021 
18022 static PARSER_VARCHAR *
18024 {
18025  PARSER_VARCHAR *pstr = NULL;
18027 
18028  // print format:
18029  // .path columns (.columns, .nested paths)
18030 
18031  // todo - print columns and nested path in same order as defined by user...
18032 
18033  // print path
18034  pstr = pt_append_nulstring (parser, pstr, "'");
18035  pstr = pt_append_nulstring (parser, pstr, p->info.json_table_node_info.path);
18036  pstr = pt_append_nulstring (parser, pstr, "'");
18037 
18038  // 'columns ('
18039  pstr = pt_append_nulstring (parser, pstr, " columns (");
18040 
18041  // print columns
18042  substr = pt_print_bytes (parser, p->info.json_table_node_info.columns);
18043  pstr = pt_append_varchar (parser, pstr, substr);
18044 
18046  {
18047  pstr = pt_append_nulstring (parser, pstr, ", ");
18048  }
18049 
18050  for (PT_NODE * nested = p->info.json_table_node_info.nested_paths; nested != NULL; nested = nested->next)
18051  {
18052  // 'nested path ' print nested ', '
18053  pstr = pt_append_nulstring (parser, pstr, "nested path ");
18054  substr = pt_print_bytes (parser, p->info.json_table_node_info.nested_paths);
18055  pstr = pt_append_varchar (parser, pstr, substr);
18056 
18057  if (nested->next != NULL)
18058  {
18059  pstr = pt_append_nulstring (parser, pstr, ", ");
18060  }
18061  }
18062 
18063  // ' )'
18064  pstr = pt_append_nulstring (parser, pstr, " )");
18065 
18066  return pstr;
18067 }
18068 
18069 static PT_NODE *
18071 {
18075  return p;
18076 }
18077 
18078 static PT_NODE *
18080 {
18081  PT_APPLY_WALK (parser, p->info.json_table_column_info.name, arg);
18082  return p;
18083 }
18084 
18085 //
18086 // pt_json_table_column_behavior_to_string ()
18087 //
18088 // return : stringify behavior
18089 // behavior_type (in) : behavior enum value
18090 //
18091 static const char *
18093 {
18094  switch (behavior_type)
18095  {
18097  return "NULL";
18098 
18100  return "DEFAULT";
18101 
18103  return "ERROR";
18104 
18105  default:
18106  assert (false);
18107  return "UNKNOWN BEHAVIOR";
18108  }
18109 }
18110 
18111 //
18112 // pt_print_json_table_column_error_or_empty_behavior () - print json table column behavior
18113 //
18114 // return : parser varchar
18115 // parser (in) : parser context
18116 // pstr (in/out) : parser varchar where printed column behavior is appended
18117 // column_behavior (in) : column behavior
18118 //
18119 static PARSER_VARCHAR *
18121  const struct json_table_column_behavior &column_behavior)
18122 {
18124 
18125  // print behavior type
18126  pstr = pt_append_nulstring (parser, pstr, pt_json_table_column_behavior_to_string (column_behavior.m_behavior));
18127 
18129  {
18130  pstr = pt_append_nulstring (parser, pstr, " ");
18131 
18132  substr = pt_print_db_value (parser, column_behavior.m_default_value);
18133  pstr = pt_append_varchar (parser, pstr, substr);
18134  }
18135 
18136  return pstr;
18137 }
18138 
18139 //
18140 // pt_print_json_table_column_info () - print json table column info
18141 //
18142 // return : parser varchar
18143 // parser (in) : parser context
18144 // p (in) : print column
18145 // pstr (in/out) : parser varchar where printed column info is appended
18146 //
18147 static PARSER_VARCHAR *
18149 {
18151  const char *type = NULL;
18152 
18154 
18155  // print format:
18156  // name FOR ORDINALITY
18157  // | name type PATH string path[on_error][on_empty]
18158  // | name type EXISTS PATH string path
18159 
18160  // print name
18162 
18163  // get the type
18165 
18166  switch (p->info.json_table_column_info.func)
18167  {
18169  // print FOR ORDINALITY
18170  pstr = pt_append_nulstring (parser, pstr, " FOR ORDINALITY");
18171  break;
18172 
18174  // print type
18175  pstr = pt_append_nulstring (parser, pstr, " ");
18176  if (p->data_type != NULL)
18177  {
18178  substr = pt_print_bytes (parser, p->data_type);
18179  pstr = pt_append_varchar (parser, pstr, substr);
18180  }
18181  else
18182  {
18183  pstr = pt_append_nulstring (parser, pstr, type);
18184  }
18185 
18186  // print PATH
18187  pstr = pt_append_nulstring (parser, pstr, " PATH ");
18188 
18189  // print path
18190  pstr = pt_append_nulstring (parser, pstr, "'");
18191  pstr = pt_append_nulstring (parser, pstr, p->info.json_table_column_info.path);
18192  pstr = pt_append_nulstring (parser, pstr, "'");
18193 
18194  // print on_empty
18195  pstr = pt_append_nulstring (parser, pstr, " ");
18197  pstr = pt_append_nulstring (parser, pstr, " ON EMPTY");
18198 
18199  // print on_error
18200  pstr = pt_append_nulstring (parser, pstr, " ");
18202  pstr = pt_append_nulstring (parser, pstr, " ON ERROR");
18203  break;
18204 
18206  // print type
18207  pstr = pt_append_nulstring (parser, pstr, " ");
18208  if (p->data_type != NULL)
18209  {
18210  substr = pt_print_bytes (parser, p->data_type);
18211  pstr = pt_append_varchar (parser, pstr, substr);
18212  }
18213  else
18214  {
18215  pstr = pt_append_nulstring (parser, pstr, type);
18216  }
18217 
18218  // print EXISTS PATH
18219  pstr = pt_append_nulstring (parser, pstr, " EXISTS PATH ");
18220 
18221  // print path
18222  pstr = pt_append_nulstring (parser, pstr, "'");
18223  pstr = pt_append_nulstring (parser, pstr, p->info.json_table_column_info.path);
18224  pstr = pt_append_nulstring (parser, pstr, "'");
18225  break;
18226 
18227  default:
18228  /* should not be here */
18229  assert (false);
18230  break;
18231  }
18232 
18233  return pstr;
18234 }
18235 
18236 static PARSER_VARCHAR *
18238 {
18239  PARSER_VARCHAR *pstr = NULL;
18240  PT_NODE *p_it = NULL;
18241 
18242  // append each column
18243  for (p_it = p; p_it->next != NULL; p_it = p_it->next)
18244  {
18245  pstr = pt_print_json_table_column_info (parser, p_it, pstr);
18246 
18247  if (p_it->next != NULL)
18248  {
18249  // print ','
18250  pstr = pt_append_nulstring (parser, pstr, ", ");
18251  }
18252  }
18253 
18254  // the last column
18255  pstr = pt_print_json_table_column_info (parser, p_it, pstr);
18256 
18257  return pstr;
18258 }
18259 
18260 // pt_move_node - move PT_NODE pointer from source to destination. useful to automatically assign and unlink
18261 void
18263 {
18264  destp = srcp;
18265  srcp = NULL;
18266 }
PT_NODE * except_list
Definition: parse_tree.h:2133
#define DELTA
static PARSER_VARCHAR * pt_print_drop_serial(PARSER_CONTEXT *parser, PT_NODE *p)
static PARSER_VARCHAR * pt_print_auth_cmd(PARSER_CONTEXT *parser, PT_NODE *p)
static PT_NODE * pt_apply_drop_trigger(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
#define PT_NAME_INFO_SET_FLAG(e, f)
Definition: parse_tree.h:2575
const SHOWSTMT_METADATA * showstmt_get_metadata(SHOWSTMT_TYPE show_type)
Definition: show_meta.c:734
PT_NODE * pt_point_l(PARSER_CONTEXT *parser, const PT_NODE *in_tree)
PT_NODE * pt_name(PARSER_CONTEXT *parser_ptr, const char *name)
PT_MISC_TYPE attr_type
Definition: parse_tree.h:1864
PT_NODE * order_by
Definition: parse_tree.h:2769
static PT_NODE * pt_apply_revoke(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
PARSER_VARCHAR * pt_print_and_list(PARSER_CONTEXT *parser, const PT_NODE *p)
PT_GET_OPT_LVL_INFO get_opt_lvl
Definition: parse_tree.h:3302
PT_MISC_TYPE option
Definition: parse_tree.h:2294
PT_NODE * next
Definition: parse_tree.h:3447
PT_NODE * internal_stmts
Definition: parse_tree.h:2066
static PARSER_VARCHAR * pt_print_set_sys_params(PARSER_CONTEXT *parser, PT_NODE *p)
PT_NAME_INFO name
Definition: parse_tree.h:3318
PT_HINT_ENUM hint
Definition: parse_tree.h:2877
static PT_NODE * pt_apply_remove_trigger(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
static PT_NODE * pt_init_attr_def(PT_NODE *p)
PT_MISC_TYPE delete_action
Definition: parse_tree.h:3088
PT_MISC_TYPE format
Definition: parse_tree.h:3214
static PT_NODE * pt_apply_rename_trigger(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
static void pt_print_range_op(PARSER_CONTEXT *parser, PT_STRING_BLOCK *sb, PT_NODE *t, PARSER_VARCHAR *lhs)
struct pt_alter_info::@111::@115 rename
void pt_record_warning(PARSER_CONTEXT *parser, int stmt_no, int line_no, int col_no, const char *msg)
PT_NODE * target_classes
Definition: parse_tree.h:2060
unsigned with_rollup
Definition: parse_tree.h:3472
PT_EVENT_TYPE event_type
Definition: parse_tree.h:2176
PT_NODE * arg_list
Definition: parse_tree.h:2258
PT_ATTACH_INFO attach
Definition: parse_tree.h:3271
static PT_NODE * pt_init_create_entity(PT_NODE *p)
#define NO_ERROR
Definition: error_code.h:46
PT_NODE * pt_get_errors(PARSER_CONTEXT *parser)
PT_UNION_INFO union_
Definition: parse_tree.h:2782
unsigned dont_collect_exec_stats
Definition: parse_tree.h:3621
bool pt_is_join_expr(PT_NODE *expr, UINTPTR *spec_id)
PT_NODE * trigger_reference
Definition: parse_tree.h:1965
static PT_NODE * pt_apply_attach(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
PT_NODE * resolution_list
Definition: parse_tree.h:1908
static PT_NODE * pt_apply_set_xaction(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
static PARSER_VARCHAR * pt_print_delete(PARSER_CONTEXT *parser, PT_NODE *p)
static PT_NODE * free_node_in_tree_pre(PARSER_CONTEXT *parser, PT_NODE *node, void *arg, int *continue_walk)
bool pt_is_keyword(const char *text)
Definition: keyword.c:724
static PARSER_VARCHAR * pt_print_file_path(PARSER_CONTEXT *parser, PT_NODE *p)
static bool pt_function_is_allowed_as_function_index(const PT_NODE *func)
DB_COLLECTION * db_get_set(const DB_VALUE *value)
PT_METHOD_CALL_INFO method_call
Definition: parse_tree.h:3316
PT_METHOD_DEF_INFO method_def
Definition: parse_tree.h:3317
#define LANG_SYS_COLLATION
#define PT_SELECT_INFO_IS_FLAGED(s, f)
Definition: parse_tree.h:2735
PARSER_VARCHAR *(* PARSER_PRINT_NODE_FUNC)(PARSER_CONTEXT *parser, PT_NODE *node)
PT_UPDATE_INFO update
Definition: parse_tree.h:3353
static PT_NODE * pt_apply_json_table_node(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
static PARSER_VARCHAR * pt_print_insert(PARSER_CONTEXT *parser, PT_NODE *p)
static PARSER_VARCHAR * pt_print_alter(PARSER_CONTEXT *parser, PT_NODE *p)
PT_MERGE_INFO merge
Definition: parse_tree.h:3315
static PARSER_VARCHAR * pt_print_union_stmt(PARSER_CONTEXT *parser, PT_NODE *p)
#define PT_APPLY_WALK(parser, ptr, arg)
Definition: parse_tree_cl.c:71
char * sql_user_text
Definition: parse_tree.h:3444
static PARSER_VARCHAR * pt_print_alter_index(PARSER_CONTEXT *parser, PT_NODE *p)
PT_NODE * as_attr_list
Definition: parse_tree.h:1976
PT_RENAME_INFO rename
Definition: parse_tree.h:3327
PT_MISC_TYPE schema
Definition: parse_tree.h:2354
PT_CHECK_OPTION_INFO check_option
Definition: parse_tree.h:3276
PT_NODE * param_list
Definition: parse_tree.h:3143
static PT_NODE * pt_init_value(PT_NODE *p)
size_t input_buffer_length
Definition: parse_tree.h:3575
PT_NODE * attr_name
Definition: parse_tree.h:1858
#define PT_IS_SORT_SPEC_NODE(n)
Definition: parse_tree.h:473
PT_NODE ** parser_parse_string_use_sys_charset(PARSER_CONTEXT *parser, const char *buffer)
PT_MISC_TYPE action_time
Definition: parse_tree.h:1968
#define PT_MEMB_ERR_BUF_SIZE
Definition: parse_tree_cl.c:67
PT_NODE * pt_function_index_skip_expr(PT_NODE *node)
PT_STATEMENT_INFO info
Definition: parse_tree.h:3487
TP_DOMAIN * expected_domain
Definition: parse_tree.h:3452
#define PT_ERRORm(parser, node, setNo, msgNo)
Definition: parse_tree.h:63
PT_NODE * internal_stmts
Definition: parse_tree.h:1827
PT_NODE * show_args
Definition: parse_tree.h:2816
PT_NODE * spec_list
Definition: parse_tree.h:2309
PT_NODE * using_index
Definition: parse_tree.h:2693
PT_NODE * waitsecs_hint
Definition: parse_tree.h:2701
PT_NODE *(* PARSER_APPLY_NODE_FUNC)(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
enum json_table_column_function func
Definition: parse_tree.h:3240
const char * str
Definition: parse_tree.h:2316
PT_NODE * into_list
Definition: parse_tree.h:2771
static PT_NODE * pt_apply_vacuum(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
static PT_NODE * pt_apply_drop(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
PT_NODE * values
Definition: parse_tree.h:2029
void qo_get_optimization_param(void *, QO_PARAM,...)
Definition: query_graph.c:269
PT_NODE * default_value
Definition: parse_tree.h:2004
void * parser_alloc(const PARSER_CONTEXT *parser, const int length)
Definition: parse_tree.c:951
static PARSER_VARCHAR * pt_print_query_trace(PARSER_CONTEXT *parser, PT_NODE *p)
PT_MISC_TYPE var_type
Definition: parse_tree.h:2317
PT_NODE * assignment
Definition: parse_tree.h:2861
PT_NODE * table_option_list
Definition: parse_tree.h:1905
static PARSER_VARCHAR * pt_print_session_variables(PARSER_CONTEXT *parser, PT_NODE *p)
PARSER_VARCHAR * expr_before_const_folding
Definition: parse_tree.h:3456
PT_NODE * pt_gather_constraints(PARSER_CONTEXT *parser, PT_NODE *node)
#define PT_NAME_INFO_DOT_SPEC
Definition: parse_tree.h:2558
PT_NODE * expr
Definition: parse_tree.h:3188
PT_NODE * spec
Definition: parse_tree.h:3182
struct db_value * m_default_value
static PT_NODE * pt_apply_set_opt_lvl(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
static PT_NODE * pt_apply_difference(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
PT_ATTR_ORDERING_INFO attr_ordering
Definition: parse_tree.h:3273
PT_NODE * waitsecs_hint
Definition: parse_tree.h:2339
PT_MISC_TYPE call_or_expr
Definition: parse_tree.h:2367
bool lang_check_identifier(const char *name, int length)
PT_NODE * val
Definition: parse_tree.h:2837
short location
Definition: parse_tree.h:2577
PT_SERIAL_INFO serial
Definition: parse_tree.h:3334
static PT_NODE * pt_init_name(PT_NODE *p)
PT_JSON_TABLE_COLUMN_INFO json_table_column_info
Definition: parse_tree.h:3314
static PARSER_VARCHAR * pt_print_named_arg(PARSER_CONTEXT *parser, PT_NODE *p)
PT_PRIV_TYPE auth_cmd
Definition: parse_tree.h:1880
static PARSER_INIT_NODE_FUNC pt_init_func_array[PT_NODE_NUMBER]
PT_CTE_COPY_INFO * cte_structures_list
PT_NODE * from
Definition: parse_tree.h:2678
static PT_NODE * pt_apply_prepare_to_commit(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
void * pre_argument
struct pt_alter_info::@111::@119 auto_increment
bool is_collate_allowed
Definition: parse_tree.h:3067
static PT_NODE * pt_apply_auth_cmd(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
PT_MISC_TYPE
Definition: parse_tree.h:983
#define MSGCAT_SEMANTIC_INVALID_FUNCTION_INDEX_EXPR
static PARSER_VARCHAR * pt_print_intersection(PARSER_CONTEXT *parser, PT_NODE *p)
#define PT_ERROR(parser, node, msg)
Definition: parse_tree.h:54
PT_NODE ** parser_parse_file(PARSER_CONTEXT *parser, FILE *file)
static PARSER_VARCHAR * pt_print_json_table(PARSER_CONTEXT *parser, PT_NODE *p)
static PARSER_VARCHAR * pt_print_prepare_to_commit(PARSER_CONTEXT *parser, PT_NODE *p)
PT_NODE * pt_point_ref(PARSER_CONTEXT *parser, const PT_NODE *node)
PT_NODE * index_hint
Definition: parse_tree.h:2931
PARSER_VARCHAR * pt_append_nulstring(const PARSER_CONTEXT *parser, PARSER_VARCHAR *bstring, const char *nulstring)
Definition: parse_tree.c:1072
#define LANG_VARIABLE_CHARSET(x)
static PT_NODE * pt_apply_alter_user(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
PT_INT_FUNCTION next_byte
Definition: parse_tree.h:3533
static PT_NODE * pt_init_merge(PT_NODE *p)
PT_NODE * where
Definition: parse_tree.h:2337
PT_NODE * old_cte_node
PT_NODE * trigger_priority
Definition: parse_tree.h:1843
DB_TYPE
Definition: dbtype_def.h:670
static PARSER_VARCHAR * pt_print_parts(PARSER_CONTEXT *parser, PT_NODE *p)
#define PT_SELECT_INFO_IS_UPD_DEL_QUERY
Definition: parse_tree.h:2729
PT_NODE * xaction_modes
Definition: parse_tree.h:2802
PT_NODE * assignment
Definition: parse_tree.h:2928
PT_NODE * charset_node
Definition: parse_tree.h:2955
static PARSER_VARCHAR * pt_print_dot(PARSER_CONTEXT *parser, PT_NODE *p)
static PT_NODE * pt_init_query_trace(PT_NODE *p)
PT_MISC_TYPE match_type
Definition: parse_tree.h:3087
static PT_NODE * pt_apply_set_trigger(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
static PT_NODE * pt_apply_drop_user(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
static PARSER_VARCHAR * pt_print_attach(PARSER_CONTEXT *parser, PT_NODE *p)
PT_TYPE_ENUM recursive_type
Definition: parse_tree.h:2245
#define MSGCAT_SEMANTIC_OUT_OF_MEMORY
PT_MISC_TYPE all_or_distinct
Definition: parse_tree.h:2260
short location
Definition: parse_tree.h:2152
static PT_NODE * pt_init_node_list(PT_NODE *p)
static PT_NODE * pt_init_create_index(PT_NODE *p)
struct json_table_column_behavior on_empty
Definition: parse_tree.h:3242
static PARSER_VARCHAR * pt_print_json_table_column_info(PARSER_CONTEXT *parser, PT_NODE *p, PARSER_VARCHAR *pstr)
PARSER_VARCHAR * pt_print_db_value(PARSER_CONTEXT *parser, const struct db_value *val)
int vasprintf(char **ptr, const char *format, va_list ap)
Definition: porting.c:936
PT_HINT_ENUM hint
Definition: parse_tree.h:2340
PT_NODE * search_cond
Definition: parse_tree.h:2925
PT_GET_XACTION_INFO get_xaction
Definition: parse_tree.h:3305
PT_NODE * arg3
Definition: parse_tree.h:2202
PARSER_VARCHAR * pt_append_name(const PARSER_CONTEXT *parser, PARSER_VARCHAR *string, const char *name)
PT_MISC_TYPE option
Definition: parse_tree.h:2301
PT_SPEC_INFO spec
Definition: parse_tree.h:3346
PT_HINT_ENUM hint
Definition: parse_tree.h:2074
static PARSER_VARCHAR * pt_print_event_object(PARSER_CONTEXT *parser, PT_NODE *p)
DB_AUTH auth_bypass_mask
Definition: parse_tree.h:2154
PT_NODE * arg2
Definition: parse_tree.h:2664
static PT_NODE * pt_init_set_opt_lvl(PT_NODE *p)
int db_value_clone(DB_VALUE *src, DB_VALUE *dest)
Definition: db_macro.c:1564
static PARSER_VARCHAR * pt_print_tuple_value(PARSER_CONTEXT *parser, PT_NODE *p)
short continued_case
Definition: parse_tree.h:2242
int parser_input_host_index
PT_NODE * object_id_list
Definition: parse_tree.h:1910
PT_TABLE_OPTION_INFO table_option
Definition: parse_tree.h:3347
PT_NODE ** statements
Definition: parse_tree.h:3549
enum pt_type_enum PT_TYPE_ENUM
Definition: parse_tree.h:962
char * g_query_string
static const char * pt_json_table_column_behavior_to_string(const json_table_column_behavior_type &behavior_type)
static PT_NODE * pt_apply_set_sys_params(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
unsigned dont_prt_long_string
Definition: parse_tree.h:3606
#define MAX_STRING_SEGMENT_LENGTH
Definition: parse_tree_cl.c:68
void pt_record_error(PARSER_CONTEXT *parser, int stmt_no, int line_no, int col_no, const char *msg, const char *context)
static PT_NODE * pt_init_intersection(PT_NODE *p)
static PT_NODE * pt_apply_function(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
#define assert_release(e)
Definition: error_manager.h:96
void pt_move_node(REFPTR(PT_NODE, destp), REFPTR(PT_NODE, srcp))
const char * pt_show_node_type(PT_NODE *node)
PT_NODE * with
Definition: parse_tree.h:2075
PT_NODE * spec
Definition: parse_tree.h:2859
PT_NODE * pt_get_next_error(PT_NODE *errors, int *stmt_no, int *line_no, int *col_no, const char **msg)
static PT_NODE * copy_node_in_tree_pre(PARSER_CONTEXT *parser, PT_NODE *old_node, void *arg, int *continue_walk)
PT_EXPR_INFO expr
Definition: parse_tree.h:3299
FUNC_TYPE
static PARSER_VARCHAR * pt_print_check_option(PARSER_CONTEXT *parser, PT_NODE *p)
int setobj_get_element_ptr(COL *col, int index, DB_VALUE **result)
Definition: set_object.c:5708
PT_NODE * with_increment
Definition: parse_tree.h:2694
PT_MISC_TYPE meta_class
Definition: parse_tree.h:2552
PT_STORED_PROC_PARAM_INFO sp_param
Definition: parse_tree.h:3345
static PT_NODE * pt_apply_do(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
PT_GRANT_INFO grant
Definition: parse_tree.h:3306
PT_NODE * virt_data_type
Definition: parse_tree.h:2041
PT_NODE * serial_name
Definition: parse_tree.h:1986
static PARSER_VARCHAR * pt_print_commit_work(PARSER_CONTEXT *parser, PT_NODE *p)
PT_TYPE_ENUM pt_db_to_type_enum(const DB_TYPE t)
Definition: parse_dbi.c:2595
const char * pt_type_enum_to_db_domain_name(const PT_TYPE_ENUM t)
Definition: parse_dbi.c:1427
static PARSER_VARCHAR * pt_print_resolution(PARSER_CONTEXT *parser, PT_NODE *p)
INTL_LANG lang_get_lang_id_from_flag(const int flag, bool *has_user_format, bool *has_user_lang)
PT_NODE * pt_get_subquery_list(PT_NODE *node)
struct pt_query_info::@123 flag
PT_NODE * tree
Definition: parse_tree_cl.c:82
PT_NODE * pt_get_end_path_node(PT_NODE *node)
static PARSER_VARCHAR * pt_print_json_table_column_error_or_empty_behavior(PARSER_CONTEXT *parser, PARSER_VARCHAR *pstr, const struct json_table_column_behavior &column_behavior)
static PT_NODE * pt_apply_expr(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
PT_NODE * ordering_info
Definition: parse_tree.h:1862
PT_NODE * partition
Definition: parse_tree.h:2142
PT_NODE * path_correlation
Definition: parse_tree.h:2550
PT_NODE_WALK_FUNCTION post_function
PARSER_VARCHAR * pt_append_bytes(const PARSER_CONTEXT *parser, PARSER_VARCHAR *old_string, const char *new_tail, const int new_tail_length)
Definition: parse_tree.c:1014
unsigned int custom_print
Definition: parse_tree.h:2554
OID * ws_identifier(MOP mop)
Definition: work_space.c:2805
union pt_query_info::@124 q
static PARSER_VARCHAR * pt_print_data_default(PARSER_CONTEXT *parser, PT_NODE *p)
PT_NODE * path_entities
Definition: parse_tree.h:2138
PT_NODE * node
Definition: parse_tree.h:3133
PT_SCOPE_INFO scope
Definition: parse_tree.h:3333
KILLSTMT_TYPE kill_type
Definition: parse_tree.h:2821
PT_MISC_TYPE entity_type
Definition: parse_tree.h:2627
static PARSER_VARCHAR * pt_append_quoted_string(const PARSER_CONTEXT *parser, PARSER_VARCHAR *buf, const char *str, size_t str_length)
PT_NODE * as_attr_mthd_name
Definition: parse_tree.h:2642
PT_NODE * class_
Definition: parse_tree.h:2898
struct pt_merge_info::@125 update
void vid_get_keys(MOP mop, DB_VALUE *value)
const char * db_default_expression_string(DB_DEFAULT_EXPR_TYPE default_expr_type)
Definition: db_macro.c:4947
unsigned int custom_print
Definition: parse_tree.h:3556
static PT_NODE * pt_apply_create_index(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
static PT_NODE * pt_apply_truncate(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
PT_NODE * group_by
Definition: parse_tree.h:2688
static PT_NODE * pt_init_insert(PT_NODE *p)
PT_DROP_USER_INFO drop_user
Definition: parse_tree.h:3291
void pt_select_list_to_one_col(PARSER_CONTEXT *parser, PT_NODE *node, bool do_one)
static PARSER_VARCHAR * pt_print_trigger_action(PARSER_CONTEXT *parser, PT_NODE *p)
PT_NODE * parser_append_node_or(PT_NODE *node, PT_NODE *list)
static PARSER_VARCHAR * pt_print_alter_serial(PARSER_CONTEXT *parser, PT_NODE *p)
char * error_buffer
Definition: parse_tree.h:3547
PT_ALTER_CODE
Definition: parse_tree.h:1224
static PARSER_VARCHAR * pt_print_scope(PARSER_CONTEXT *parser, PT_NODE *p)
SHOWSTMT_TYPE show_type
Definition: parse_tree.h:2815
PT_NODE * insert_mode
Definition: parse_tree.h:2343
#define PT_NAME_INFO_IS_FLAGED(e, f)
Definition: parse_tree.h:2574
static PT_NODE * pt_apply_kill(PARSER_CONTEXT *parser, PT_NODE *P, void *arg)
PT_NODE_LIST_INFO node_list
Definition: parse_tree.h:3320
static PARSER_VARCHAR * pt_print_create_user(PARSER_CONTEXT *parser, PT_NODE *p)
PT_NODE * attr_mthd_name
Definition: parse_tree.h:2640
PT_MISC_TYPE mthd_type
Definition: parse_tree.h:2379
PT_NODE * indx_key_limit
Definition: parse_tree.h:2579
PT_INT_FUNCTION next_char
Definition: parse_tree.h:3532
SCAN_OPERATION_TYPE scan_op_type
Definition: parse_tree.h:2751
PT_NODE * into_var
Definition: parse_tree.h:2900
SHOWSTMT_TYPE
#define PT_SET_JMP_ENV(parser)
Definition: parse_tree.h:89
static PARSER_VARCHAR * pt_print_revoke(PARSER_CONTEXT *parser, PT_NODE *p)
static PT_NODE * pt_walk_private(PARSER_CONTEXT *parser, PT_NODE *node, void *void_arg)
PT_REMOVE_TRIGGER_INFO remove_trigger
Definition: parse_tree.h:3326
PT_ATTACH_INFO prepare_to_commit
Definition: parse_tree.h:3324
PT_MISC_TYPE option
Definition: parse_tree.h:2287
PT_NODE * internal_stmts
Definition: parse_tree.h:2868
PT_NODE * function_expr
Definition: parse_tree.h:1935
unsigned rewrite_limit
Definition: parse_tree.h:2883
static PT_NODE * pt_apply_constraint(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
const char * pt_show_misc_type(PT_MISC_TYPE p)
PT_NODE * event_object
Definition: parse_tree.h:2168
PT_NODE * attr_list
Definition: parse_tree.h:2333
unsigned partition_pruned
Definition: parse_tree.h:3463
static PT_NODE * pt_init_vacuum(PT_NODE *p)
PT_NODE * spec_list
Definition: parse_tree.h:2097
static PARSER_VARCHAR * pt_print_rename_trigger(PARSER_CONTEXT *parser, PT_NODE *p)
PT_WITH_CLAUSE_INFO with_clause
Definition: parse_tree.h:3362
void parser_free_node_resources(PT_NODE *node)
Definition: parse_tree.c:835
static PT_NODE * pt_apply_json_table(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
static PARSER_VARCHAR * pt_print_do(PARSER_CONTEXT *parser, PT_NODE *p)
PT_NODE * data_type
Definition: parse_tree.h:3453
unsigned single_table_opt
Definition: parse_tree.h:2711
static PT_NODE * pt_init_showstmt(PT_NODE *p)
static PARSER_VARCHAR * pt_print_get_stats(PARSER_CONTEXT *parser, PT_NODE *p)
PT_NODE * new_name
Definition: parse_tree.h:2624
static PT_NODE * pt_apply_partition(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
static PT_NODE * pt_apply_data_default(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
PT_NODE * for_update
Definition: parse_tree.h:2705
struct parser_context::@134 flag
static PARSER_VARCHAR * pt_print_sp_parameter(PARSER_CONTEXT *parser, PT_NODE *p)
static PARSER_VARCHAR * pt_print_set_timezone(PARSER_CONTEXT *parser, PT_NODE *p)
static PARSER_VARCHAR * pt_print_create_entity(PARSER_CONTEXT *parser, PT_NODE *p)
DB_DEFAULT_EXPR_TYPE default_expr_type
Definition: parse_tree.h:2006
static PT_NODE * pt_apply_event_spec(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
static PARSER_VARCHAR * pt_print_spec(PARSER_CONTEXT *parser, PT_NODE *p)
PT_DOT_INFO dot
Definition: parse_tree.h:3287
PT_NODE * arg2
Definition: parse_tree.h:2086
static PARSER_VARCHAR * pt_print_get_trigger(PARSER_CONTEXT *parser, PT_NODE *p)
static PT_NODE * pt_init_method_def(PT_NODE *p)
static PARSER_VARCHAR * pt_print_set_trigger(PARSER_CONTEXT *parser, PT_NODE *p)
PT_FOREIGN_KEY_INFO foreign_key
Definition: parse_tree.h:3105
PT_NODE * pt_lambda(PARSER_CONTEXT *parser, PT_NODE *tree_with_names, PT_NODE *name_node, PT_NODE *corresponding_tree)
PT_MISC_TYPE trigger_status
Definition: parse_tree.h:1962
static PT_NODE * pt_lambda_check_reduce_eq(PARSER_CONTEXT *parser, PT_NODE *tree_or_name, void *void_arg, int *continue_walk)
#define DB_FLOAT_DECIMAL_PRECISION
Definition: dbtype_def.h:589
PARSER_VARCHAR * pt_print_bytes_l(PARSER_CONTEXT *parser, const PT_NODE *p)
static PT_NODE * pt_apply_error_msg(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
PT_NODE * index_ss
Definition: parse_tree.h:2698
PT_NODE * parser_get_tree_list_diff(PARSER_CONTEXT *parser, PT_NODE *list1, PT_NODE *list2)
static PARSER_VARCHAR * pt_print_cte(PARSER_CONTEXT *parser, PT_NODE *p)
PT_NODE * method_args_list
Definition: parse_tree.h:2377
PT_NODE * start_val
Definition: parse_tree.h:1987
PT_NODE * non_null_attrs
Definition: parse_tree.h:2344
void describe_value(const db_value *value)
PT_JSON_TABLE_INFO json_table_info
Definition: parse_tree.h:3312
SERVER_INSERT_ALLOWED server_allowed
Definition: parse_tree.h:2347
static PARSER_VARCHAR * pt_print_drop(PARSER_CONTEXT *parser, PT_NODE *p)
PT_CTE_INFO cte
Definition: parse_tree.h:3282
static PT_NODE * pt_apply_create_entity(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
PT_PRINT_VALUE_FUNC print_db_value
Definition: parse_tree.h:3553
PT_NODE * class_attr_def_list
Definition: parse_tree.h:1903
PT_CURRENCY type
Definition: parse_tree.h:3020
PT_KILLSTMT_INFO killstmt
Definition: parse_tree.h:3361
int intl_identifier_lower(const char *src, char *dst)
static PT_NODE * pt_apply_tuple_value(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
FUNC_TYPE function_type
Definition: parse_tree.h:2259
PT_NODE * collation_node
Definition: parse_tree.h:2956
PT_TYPE_ENUM type_enum
Definition: parse_tree.h:3457
static PT_NODE * free_node_in_tree_post(PARSER_CONTEXT *parser, PT_NODE *node, void *arg, int *continue_walk)
PT_NODE * trigger_priority
Definition: parse_tree.h:1961
PT_NODE * use_merge_hint
Definition: parse_tree.h:2071
const char * lang_get_collation_name(const int coll_id)
PT_NODE * indexed_class
Definition: parse_tree.h:1927
static PARSER_VARCHAR * pt_print_grant(PARSER_CONTEXT *parser, PT_NODE *p)
PT_NODE * or_next
Definition: parse_tree.h:3448
#define PT_MEMB_BUF_SIZE
Definition: parse_tree_cl.c:65
json_table_column_behavior_type
PT_NODE * class_where
Definition: parse_tree.h:2940
unsigned char bytes[1]
Definition: parse_tree.h:3431
static PT_NODE * pt_apply_sp_parameter(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
DB_MONETARY * db_get_monetary(const DB_VALUE *value)
static PT_NODE * pt_apply_rollback_work(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
static PARSER_VARCHAR * pt_print_attr_ordering(PARSER_CONTEXT *parser, PT_NODE *p)
PT_NODE * method_list
Definition: parse_tree.h:2141
PT_NODE * in_class
Definition: parse_tree.h:2623
static PARSER_VARCHAR * pt_print_remove_trigger(PARSER_CONTEXT *parser, PT_NODE *p)
PT_NODE * limit
Definition: parse_tree.h:2773
INTL_CODESET lang_charset(void)
DB_CURRENCY
Definition: dbtype_def.h:799
static PARSER_VARCHAR * pt_print_constraint(PARSER_CONTEXT *parser, PT_NODE *p)
PT_NODE * value
Definition: parse_tree.h:2199
static PT_NODE * pt_lambda_node(PARSER_CONTEXT *parser, PT_NODE *tree_or_name, void *void_arg, int *continue_walk)
char * parser_print_function_index_expr(PARSER_CONTEXT *parser, const PT_NODE *expr)
static PARSER_VARCHAR * pt_print_host_var(PARSER_CONTEXT *parser, PT_NODE *p)
PT_NODE ** pt_init_one_statement_parser(PARSER_CONTEXT *parser, FILE *file)
static PARSER_VARCHAR * pt_print_drop_index(PARSER_CONTEXT *parser, PT_NODE *p)
static PT_NODE * pt_apply_update(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
const char * tde_get_algorithm_name(TDE_ALGORITHM tde_algo)
Definition: tde.c:1694
PT_MISC_TYPE derived_table_type
Definition: parse_tree.h:2147
PT_NODE * partition_info
Definition: parse_tree.h:1914
#define DB_MAX_VARBIT_PRECISION
Definition: dbtype_def.h:552
PT_NODE * cast_type
Definition: parse_tree.h:2203
union pt_alter_info::@111 alter_clause
PT_NODE * arg1
Definition: parse_tree.h:2663
PT_NODE * new_cte_node
PT_NODE * pt_expr_to_sort_spec(PARSER_CONTEXT *parser, PT_NODE *expr)
static PT_NODE * pt_apply_attr_ordering(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
void er_set(int severity, const char *file_name, const int line_no, int err_id, int num_args,...)
PT_NODE ** parser_main(PARSER_CONTEXT *p)
PT_ALTER_INFO alter
Definition: parse_tree.h:3268
static PARSER_VARCHAR * pt_print_set_opt_lvl(PARSER_CONTEXT *parser, PT_NODE *p)
PT_NODE * using_cond
Definition: parse_tree.h:2150
static PT_NODE * pt_find_id_node(PARSER_CONTEXT *parser, PT_NODE *tree, void *void_arg, int *continue_walk)
static PARSER_VARCHAR * pt_print_with_clause(PARSER_CONTEXT *parser, PT_NODE *p)
PT_NODE * arg2
Definition: parse_tree.h:2198
PT_MISC_TYPE instances
Definition: parse_tree.h:2355
static void pt_init_print_f(void)
static PT_NODE * pt_apply_sort_spec(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
PT_NODE * del_search_cond
Definition: parse_tree.h:2930
PT_NODE * index_name
Definition: parse_tree.h:1929
int db_set_get(DB_SET *set, int index, DB_VALUE *value)
Definition: db_set.c:508
static PARSER_VARCHAR * pt_print_set_session_variables(PARSER_CONTEXT *parser, PT_NODE *p)
PT_NODE * cte_definition_list
Definition: parse_tree.h:3221
PT_FUNCTION_INFO function
Definition: parse_tree.h:3301
PT_CONNECT_BY_CHECK_CYCLES check_cycles
Definition: parse_tree.h:2710
short constrain_not_null
Definition: parse_tree.h:1866
static PT_NODE * pt_apply_prepare(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
#define PT_IS_VACUUM_NODE(n)
Definition: parse_tree.h:497
static PT_NODE * pt_apply_alter_serial(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
#define CAST_POINTER_TO_NODE(p)
Definition: parse_tree.h:607
#define DB_MAX_VARCHAR_PRECISION
Definition: dbtype_def.h:536
static PT_NODE * pt_apply_set_names(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
static PT_NODE * pt_apply_attr_def(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
#define PT_ERRORmf2(parser, node, setNo, msgNo, arg1, arg2)
Definition: parse_tree.h:65
#define assert(x)
int set_get_setobj(DB_COLLECTION *ref, COL **setptr, int for_write)
Definition: set_object.c:2175
PT_NODE * constraint_list
Definition: parse_tree.h:1912
PT_NODE * resolution_list
Definition: parse_tree.h:1756
static PT_NODE * pt_init_expr(PT_NODE *p)
#define PT_IS_CONST_NOT_HOSTVAR(n)
Definition: parse_tree.h:370
PT_NODE * referenced_attrs
Definition: parse_tree.h:3086
static PARSER_VARCHAR * pt_print_vacuum(PARSER_CONTEXT *parser, PT_NODE *p)
PT_MISC_TYPE qualifier
Definition: parse_tree.h:2204
static PARSER_VARCHAR * pt_print_json_table_node(PARSER_CONTEXT *parser, PT_NODE *p)
int errors
static PARSER_VARCHAR * pt_print_node_list(PARSER_CONTEXT *parser, PT_NODE *p)
PT_NODE * use_nl_hint
Definition: parse_tree.h:2871
static PARSER_VARCHAR * pt_print_showstmt(PARSER_CONTEXT *parser, PT_NODE *p)
static PARSER_VARCHAR * pt_print_difference(PARSER_CONTEXT *parser, PT_NODE *p)
struct pt_alter_info::@111::@113 attr_mthd
TDE_ALGORITHM
Definition: tde.h:71
static PT_NODE * pt_apply_trigger_action(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
PT_NODE * increment_val
Definition: parse_tree.h:1988
#define PT_IS_QUERY_NODE_TYPE(x)
Definition: parse_tree.h:115
PT_NODE * parser_walk_leaves(PARSER_CONTEXT *parser, PT_NODE *node, PT_NODE_WALK_FUNCTION pre_function, void *pre_argument, PT_NODE_WALK_FUNCTION post_function, void *post_argument)
static PARSER_VARCHAR * pt_print_create_stored_procedure(PARSER_CONTEXT *parser, PT_NODE *p)
PT_NODE * query
Definition: parse_tree.h:1762
#define LANG_COERCIBLE_CODESET
static PT_NODE * pt_apply_timeout(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
PT_PARTITION_TYPE type
Definition: parse_tree.h:2030
PT_SPEC_FLAG flag
Definition: parse_tree.h:2155
PT_NODE * method_name
Definition: parse_tree.h:2376
unsigned has_internal_error
Definition: parse_tree.h:3602
unsigned order_siblings
Definition: parse_tree.h:2765
static PT_NODE * pt_apply_parts(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
static PARSER_VARCHAR * pt_print_partition(PARSER_CONTEXT *parser, PT_NODE *p)
#define DB_DOUBLE_DECIMAL_PRECISION
Definition: dbtype_def.h:592
static PARSER_VARCHAR * pt_print_function(PARSER_CONTEXT *parser, PT_NODE *p)
PT_POINTER_INFO pointer
Definition: parse_tree.h:3359
PT_MISC_TYPE asc_or_desc
Definition: parse_tree.h:2830
#define ER_GENERIC_ERROR
Definition: error_code.h:49
#define PT_SPEC_IS_ENTITY(spec_)
Definition: parse_tree.h:698
size_t input_buffer_position
Definition: parse_tree.h:3576
PT_NODE * pt_rewrite_set_eq_set(PARSER_CONTEXT *parser, PT_NODE *exp)
const char * buffer
Definition: parse_tree.h:3540
static PT_NODE * pt_apply_pointer(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
static PT_NODE * pt_apply_alter_trigger(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
static PARSER_VARCHAR * pt_print_create_index(PARSER_CONTEXT *parser, PT_NODE *p)
PT_CREATE_TRIGGER_INFO create_trigger
Definition: parse_tree.h:3280
bool has_cs_introducer
Definition: parse_tree.h:3066
DB_VALUE db_value
Definition: parse_tree.h:3059
PT_NODE * odku_assignments
Definition: parse_tree.h:2341
PT_NODE * of_sup_class_name
Definition: parse_tree.h:2641
PT_MISC_TYPE grant_option
Definition: parse_tree.h:2310
PT_NODE * hashsize
Definition: parse_tree.h:2021
PT_MISC_TYPE with_check_option
Definition: parse_tree.h:1900
PT_NODE * offset
Definition: parse_tree.h:2273
PT_MISC_TYPE trigger_status
Definition: parse_tree.h:1845
#define MSGCAT_SYNTAX_BEFORE_CONTEXT
const char * pt_show_type_enum(PT_TYPE_ENUM t)
PT_NODE * cte_pointer
Definition: parse_tree.h:2132
#define ER_OUT_OF_VIRTUAL_MEMORY
Definition: error_code.h:50
PT_NODE * on_cond
Definition: parse_tree.h:2149
#define PT_GET_COLLATION_MODIFIER(p)
Definition: parse_tree.h:619
static PT_NODE * pt_init_isolation_lvl(PT_NODE *p)
PT_SET_XACTION_INFO set_xaction
Definition: parse_tree.h:3341
PT_NODE * entity
Definition: parse_tree.h:2038
static PT_NODE * pt_apply_get_stats(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
#define REFPTR(T, name)
Definition: porting.h:1089
PT_DATA_VALUE data_value
Definition: parse_tree.h:3058
#define pt_init_func_null_function
PT_NODE * recursive_part
Definition: parse_tree.h:1978
PT_NODE * flat_entity_list
Definition: parse_tree.h:2140
PT_NODE ** parser_parse_string(PARSER_CONTEXT *parser, const char *buffer)
PT_MISC_TYPE all_distinct
Definition: parse_tree.h:2746
void lang_set_parser_use_client_charset(bool use)
PT_NODE * method_name
Definition: parse_tree.h:2363
struct pt_alter_info::@111::@117 collation
unsigned strings_have_no_escapes
Definition: parse_tree.h:3610
const char * original
Definition: parse_tree.h:2544
PT_NODE * using_index
Definition: parse_tree.h:2064
static PT_NODE * pt_init_datatype(PT_NODE *p)
PT_NODE * name
Definition: parse_tree_cl.c:81
PT_MISC_TYPE nulls_first_or_last
Definition: parse_tree.h:2831
PT_HINT_ENUM hint
Definition: parse_tree.h:2707
PT_NODE * into_var
Definition: parse_tree.h:2335
int intl_identifier_casecmp(const char *str1, const char *str2)
#define DB_VALUE_DOMAIN_TYPE(value)
Definition: dbtype.h:70
char * pt_print_alias(PARSER_CONTEXT *parser, const PT_NODE *node)
static PT_NODE * pt_apply_evaluate(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
static PARSER_VARCHAR * pt_print_create_serial(PARSER_CONTEXT *parser, PT_NODE *p)
PT_PARTITION_INFO partition
Definition: parse_tree.h:3321
struct json_table_column_behavior on_error
Definition: parse_tree.h:3241
PT_NODE * max_val
Definition: parse_tree.h:1989
PT_NODE * comment
Definition: parse_tree.h:1992
PT_EVENT_TYPE
Definition: parse_tree.h:1272
bool print_collation
Definition: parse_tree.h:3065
void * pt_internal_error(PARSER_CONTEXT *parser, const char *file, int line, const char *what)
PT_NODE * cte_name
Definition: parse_tree.h:2131
PT_NODE_TYPE node_type
Definition: parse_tree.h:3439
PT_DROP_SESSION_VAR_INFO drop_session_var
Definition: parse_tree.h:3289
DB_BIGINT bigint
Definition: parse_tree.h:3033
static PARSER_VARCHAR * pt_print_truncate(PARSER_CONTEXT *parser, PT_NODE *p)
PT_NODE * pt_top(PARSER_CONTEXT *parser)
static PARSER_VARCHAR * pt_print_json_table_columns(PARSER_CONTEXT *parser, PT_NODE *p)
PT_NODE * string
Definition: parse_tree.h:2252
PT_NODE * parser_copy_tree(PARSER_CONTEXT *parser, const PT_NODE *tree)
static PARSER_VARCHAR * pt_print_value(PARSER_CONTEXT *parser, PT_NODE *p)
PT_POINTER_TYPE type
Definition: parse_tree.h:3134
#define PT_IS_VALUE_QUERY(n)
Definition: parse_tree.h:476
PT_PARTITION_TYPE type
Definition: parse_tree.h:2023
PT_EXECUTE_TRIGGER_INFO execute_trigger
Definition: parse_tree.h:3298
static PT_NODE * pt_init_tuple_value(PT_NODE *p)
static PT_NODE * pt_init_data_default(PT_NODE *p)
#define OPTIMIZATION_ENABLED(level)
Definition: optimizer.h:83
PT_PARTS_INFO parts
Definition: parse_tree.h:3322
static PT_NODE * pt_apply_table_option(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
PT_FILE_PATH_INFO file_path
Definition: parse_tree.h:3300
PT_SHOWSTMT_INFO showstmt
Definition: parse_tree.h:3342
PT_NODE * having
Definition: parse_tree.h:2692
PT_CTE_COPY_INFO * next
static PT_NODE * pt_init_insert_value(PT_NODE *p)
DB_OBJECT * db_get_object(const DB_VALUE *value)
PT_NODE * from
Definition: parse_tree.h:2686
int substr(std::string &result, bool &is_matched, const cub_regex_object &reg, const std::string &src, const int position, const int occurrence, const INTL_CODESET codeset)
unsigned if_exists
Definition: parse_tree.h:1998
const char * pt_show_binopcode(PT_OP_TYPE n)
static PT_NODE * pt_apply_merge(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
#define PT_NAME_INFO_CONSTANT
Definition: parse_tree.h:2562
PT_ISOLATION_LVL_INFO isolation_lvl
Definition: parse_tree.h:3311
#define PT_SELECT_INFO_COLS_SCHEMA
Definition: parse_tree.h:2721
PARSER_VARCHAR * pt_append_varchar(const PARSER_CONTEXT *parser, PARSER_VARCHAR *old_string, const PARSER_VARCHAR *new_tail)
Definition: parse_tree.c:1052
void parser_free_subtrees(PARSER_CONTEXT *parser, PT_NODE *tree)
PT_HINT_ENUM hint
Definition: parse_tree.h:1828
void pt_parser_line_col(PT_NODE *node)
PT_NODE * enumeration
Definition: parse_tree.h:2039
UINTPTR spec_id
Definition: parse_tree.h:2543
#define PT_IS_VALUE_NODE(n)
Definition: parse_tree.h:330
DB_VALUE * db_value_copy(DB_VALUE *value)
Definition: db_macro.c:1537
static PT_NODE * pt_apply_auto_increment(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
void describe_money(const db_monetary *value)
PT_NODE * use_merge_hint
Definition: parse_tree.h:2873
PT_NODE * value_clauses
Definition: parse_tree.h:2938
static PARSER_APPLY_NODE_FUNC * pt_apply_f
PT_NODE * limit
Definition: parse_tree.h:2072
static PT_NODE * pt_apply_drop_index(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
#define TP_DOMAIN_TYPE(dom)
#define MSGCAT_SEMANTIC_ATT_CNT_COL_CNT_NE
PT_ALTER_CODE code
Definition: parse_tree.h:1937
PT_DATA_TYPE_INFO data_type
Definition: parse_tree.h:3284
static PARSER_VARCHAR * pt_print_method_def(PARSER_CONTEXT *parser, PT_NODE *p)
void pt_frob_error(PARSER_CONTEXT *parser, const PT_NODE *stmt, const char *fmt,...)
static PT_NODE * pt_apply_event_object(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
static PARSER_VARCHAR * pt_print_event_spec(PARSER_CONTEXT *parser, PT_NODE *p)
static PT_NODE * pt_apply_spec(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
PARSER_VARCHAR * str
Definition: parse_tree.h:3036
#define PT_NAME_INFO_DESC
Definition: parse_tree.h:2564
struct pt_alter_info::@111::@118 index
SP_PARSER_CTX * parser
PT_PARTITION_TYPE
Definition: parse_tree.h:1301
PT_NODE * arg1
Definition: parse_tree.h:2197
static PT_NODE * pt_apply_node_list(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
static PARSER_PRINT_NODE_FUNC * pt_print_f
PT_ATTR_DEF_INFO attr_def
Definition: parse_tree.h:3272
unsigned rewrite_limit
Definition: parse_tree.h:2766
PT_DO_INFO do_
Definition: parse_tree.h:3286
PT_NODE * min_val
Definition: parse_tree.h:1990
PT_NODE * comment
Definition: parse_tree.h:2031
PT_NODE * comment
Definition: parse_tree.h:1936
static PT_NODE * pt_init_table_option(PT_NODE *p)
#define NULL
Definition: freelistheap.h:34
PT_ALTER_CODE code
Definition: parse_tree.h:1751
PT_NODE * pt_pointer_stack_pop(PARSER_CONTEXT *parser, PT_NODE *stack, PT_NODE **node)
PT_NODE * as_attr_list
Definition: parse_tree.h:2136
struct pt_alter_info::@111::@121 comment
static PT_NODE * pt_apply_get_opt_lvl(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
PT_GET_TRIGGER_INFO get_trigger
Definition: parse_tree.h:3304
PT_NODE * use_nl_hint
Definition: parse_tree.h:2069
const char * er_msg(void)
static PARSER_VARCHAR * pt_print_alter_user(PARSER_CONTEXT *parser, PT_NODE *p)
bool pt_is_const_expr_node(PT_NODE *node)
static PT_NODE * pt_init_delete(PT_NODE *p)
PT_NODE * referenced_attrs
Definition: parse_tree.h:2137
PT_NODE * order_by
Definition: parse_tree.h:2875
PT_NODE * internal_stmts
Definition: parse_tree.h:2338
CACHE_TIME cache_time
Definition: parse_tree.h:3458
#define MSGCAT_SYNTAX_BEFORE_END_OF_STMT
#define LANG_COERCIBLE_COLL
static void pt_init_init_f(void)
PT_NODE * value_clauses
Definition: parse_tree.h:2334
PT_MISC_TYPE is_subquery
Definition: parse_tree.h:2747
if(extra_options)
Definition: dynamic_load.c:958
static PARSER_VARCHAR * pt_print_table_option(PARSER_CONTEXT *parser, PT_NODE *p)
PT_INDEX_INFO index
Definition: parse_tree.h:3308
PT_EVENT_OBJECT_INFO event_object
Definition: parse_tree.h:3294
PARSER_VARCHAR * pt_print_bytes_spec_list(PARSER_CONTEXT *parser, const PT_NODE *p)
PT_JSON_TABLE_NODE_INFO json_table_node_info
Definition: parse_tree.h:3313
PT_NODE * where
Definition: parse_tree.h:1934
PT_TABLE_OPTION_TYPE option
Definition: parse_tree.h:2916
#define PT_SPEC_IS_DERIVED(spec_)
Definition: parse_tree.h:690
PT_NODE * selector
Definition: parse_tree.h:2087
PT_MISC_TYPE action_type
Definition: parse_tree.h:2845
static PARSER_VARCHAR * pt_print_index_columns(PARSER_CONTEXT *parser, PT_NODE *p)
void dbcs_start_input(void)
char * parser_print_tree_list(PARSER_CONTEXT *parser, const PT_NODE *node)
PARSER_CONTEXT * parent_parser
char * pt_append_string(const PARSER_CONTEXT *parser, const char *old_string, const char *new_tail)
Definition: parse_tree.c:980
PT_CREATE_SELECT_ACTION create_select_action
Definition: parse_tree.h:1919
PT_CREATE_ENTITY_INFO create_entity
Definition: parse_tree.h:3279
#define INITIAL_EXTENT
PARSER_VARCHAR * pt_print_bytes(PARSER_CONTEXT *parser, const PT_NODE *node)
#define PT_ERRORc(parser, node, msg)
Definition: parse_tree.h:55
PT_NODE * qcache_hint
Definition: parse_tree.h:2772
static PARSER_VARCHAR * pt_print_col_def_constraint(PARSER_CONTEXT *parser, PT_NODE *p)
PT_ZZ_ERROR_MSG_INFO error_msg
Definition: parse_tree.h:3267
#define db_private_free_and_init(thrd, ptr)
Definition: memory_alloc.h:141
PT_NODE * trigger_spec_list
Definition: parse_tree.h:2113
struct pt_alter_info::@110 super
PT_NODE ** parser_parse_string_with_escapes(PARSER_CONTEXT *parser, const char *buffer, const bool strings_have_no_escapes)
PT_NODE * user_name
Definition: parse_tree.h:2107
PT_NODE * default_value
Definition: parse_tree.h:2272
static PT_NODE * pt_apply_name(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
static PT_NODE * pt_apply_alter(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
PT_NODE * spec_list
Definition: parse_tree.h:2651
const char * get_buffer() const
PT_NODE * select_list
Definition: parse_tree.h:2665
short db_value_is_in_workspace
Definition: parse_tree.h:3061
PT_AUTH_CMD_INFO auth_cmd
Definition: parse_tree.h:3274
#define IS_UPDATE_OBJ(node)
Definition: parse_tree.h:548
#define db_private_free(thrd, ptr)
Definition: memory_alloc.h:229
#define PT_SPEC_IS_CTE(spec_)
Definition: parse_tree.h:694
PT_NODE * pt_continue_walk(PARSER_CONTEXT *parser, PT_NODE *tree, void *arg, int *continue_walk)
static PARSER_VARCHAR * pt_print_datatype(PARSER_CONTEXT *parser, PT_NODE *p)
#define db_private_alloc(thrd, size)
Definition: memory_alloc.h:227
PT_NODE * with
Definition: parse_tree.h:2778
struct pt_alter_info::@111::@120 user
static PARSER_VARCHAR * pt_print_alter_stored_procedure(PARSER_CONTEXT *parser, PT_NODE *p)
static PT_NODE * pt_apply_set_session_variables(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
PT_NODE * vclass_comment
Definition: parse_tree.h:1918
INTL_LANG lang_id(void)
PT_NODE * arg1
Definition: parse_tree.h:2085
PT_NODE * where
Definition: parse_tree.h:2687
PT_QUERY_INFO query
Definition: parse_tree.h:3325
static PT_NODE * pt_init_spec(PT_NODE *p)
PT_TRIGGER_SPEC_LIST_INFO trigger_spec_list
Definition: parse_tree.h:3350
PT_NODE * use_idx
Definition: parse_tree.h:2697
PT_NODE * into_var
Definition: parse_tree.h:2162
PT_EVENT_TARGET_INFO event_target
Definition: parse_tree.h:3296
static bool pt_is_nested_expr(const PT_NODE *node)
static PT_NODE * pt_apply_with_clause(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
PT_NODE * parser_create_node(const PARSER_CONTEXT *parser)
Definition: parse_tree.c:271
PT_NODE * with
Definition: parse_tree.h:2878
PT_EVALUATE_INFO evaluate
Definition: parse_tree.h:3293
static PARSER_VARCHAR * pt_print_select(PARSER_CONTEXT *parser, PT_NODE *p)
int db_set_size(DB_SET *set)
Definition: db_set.c:557
PT_AUTO_INCREMENT_INFO auto_increment
Definition: parse_tree.h:3275
static PT_NODE * pt_apply_union_stmt(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
static PARSER_VARCHAR * pt_print_execute_trigger(PARSER_CONTEXT *parser, PT_NODE *p)
#define MSGCAT_SET_PARSER_SYNTAX
PT_NODE * cursor_name
Definition: parse_tree.h:2065
unsigned rewrite_limit
Definition: parse_tree.h:2078
int count(int &result, const cub_regex_object &reg, const std::string &src, const int position, const INTL_CODESET codeset)
PT_RENAME_TRIGGER_INFO rename_trigger
Definition: parse_tree.h:3328
PT_CONSTRAINT_TYPE type
Definition: parse_tree.h:3096
PT_NODE * spec
Definition: parse_tree.h:2331
#define MSGCAT_CATALOG_CUBRID
unsigned is_in_and_list
Definition: parse_tree.h:3611
const char * text
Definition: parse_tree.h:3056
DB_OBJECT * db_get_user(void)
Definition: db_admin.c:1974
#define MSGCAT_SEMANTIC_INVALID_FUNCTION_INDEX
static PT_NODE * pt_apply_query_trace(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
static PT_NODE * pt_apply_file_path(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
static PT_NODE * pt_init_sort_spec(PT_NODE *p)
PT_NODE * use_idx_hint
Definition: parse_tree.h:2872
static DB_CURRENCY pt_currency_to_db(const PT_CURRENCY t)
PT_SET_NAMES_INFO set_names
Definition: parse_tree.h:3335
SM_INDEX_STATUS index_status
Definition: parse_tree.h:1943
PT_NODE * prefix_length
Definition: parse_tree.h:1933
PT_NODE * set
Definition: parse_tree.h:3047
static PT_NODE * pt_init_constraint(PT_NODE *node)
PT_TUPLE_VALUE_INFO tuple_value
Definition: parse_tree.h:3352
static PARSER_INIT_NODE_FUNC * pt_init_f
bool is_cascade_constraints
Definition: parse_tree.h:2101
PARSER_VARCHAR * pt_print_bytes_alias(PARSER_CONTEXT *parser, const PT_NODE *node)
static PT_NODE * pt_init_get_opt_lvl(PT_NODE *p)
PT_NODE * partition_by
Definition: parse_tree.h:2270
static PT_NODE * pt_apply_trigger_spec_list(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
static int parser_id
Definition: parse_tree.c:192
#define PT_QUERY_STRING_USER_TEXT
static PARSER_VARCHAR * pt_print_method_call(PARSER_CONTEXT *parser, PT_NODE *p)
DB_DEFAULT_EXPR_TYPE on_update
Definition: parse_tree.h:1860
static PT_NODE * pt_init_pointer(PT_NODE *node)
PT_NODE * expanded_list
Definition: parse_tree.h:2274
PT_NODE * parser_append_node(PT_NODE *node, PT_NODE *list)
PT_NODE * check_where
Definition: parse_tree.h:2943
char * pt_short_print(PARSER_CONTEXT *parser, const PT_NODE *node)
static PARSER_VARCHAR * pt_print_evaluate(PARSER_CONTEXT *parser, PT_NODE *p)
PT_NODE * parser_init_node(PT_NODE *node, PT_NODE_TYPE node_type)
PT_NODE * orderby_for
Definition: parse_tree.h:2876
struct pt_constraint_info::@127::@131 check
const char * generic_name
Definition: parse_tree.h:2261
PT_NODE * parser_new_node(PARSER_CONTEXT *parser, PT_NODE_TYPE node_type)
static void error(const char *msg)
Definition: gencat.c:331
PT_SET_SYS_PARAMS_INFO set_sys_params
Definition: parse_tree.h:3338
PT_NODE * pt_pop(PARSER_CONTEXT *parser)
void parser_free_node(const PARSER_CONTEXT *parser, PT_NODE *node)
Definition: parse_tree.c:869
static PARSER_VARCHAR * pt_print_get_xaction(PARSER_CONTEXT *parser, PT_NODE *p)
static PT_NODE * pt_init_function(PT_NODE *p)
static int rc
Definition: serial.c:50
PT_NODE * pt_get_node_from_list(PT_NODE *list, int index)
PT_NODE * check_where
Definition: parse_tree.h:2867
static PARSER_VARCHAR * pt_print_timeout(PARSER_CONTEXT *parser, PT_NODE *p)
PT_NODE * column_names
Definition: parse_tree.h:1928
#define PT_IS_SIMPLE_CHAR_STRING_TYPE(t)
Definition: parse_tree.h:160
const char * pt_show_priv(PT_PRIV_TYPE t)
PT_NODE * internal_stmts
Definition: parse_tree.h:2098
PT_NODE * name
Definition: parse_tree.h:1975
static PT_NODE * pt_apply_method_def(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
static PT_NODE * pt_apply_intersection(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
static PARSER_VARCHAR * pt_print_update(PARSER_CONTEXT *parser, PT_NODE *p)
PT_NODE * waitsecs_hint
Definition: parse_tree.h:2944
static PT_NODE * pt_apply_get_xaction(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
short db_value_is_initialized
Definition: parse_tree.h:3060
PT_NODE * referenced_class
Definition: parse_tree.h:3085
PT_UPDATE_STATS_INFO update_stats
Definition: parse_tree.h:3354
PT_SORT_SPEC_INFO sort_spec
Definition: parse_tree.h:3343
PT_NODE * old_name
Definition: parse_tree.h:2622
#define ARG_FILE_LINE
Definition: error_manager.h:44
PT_NODE * auto_increment
Definition: parse_tree.h:1861
#define MAX_PRINT_ERROR_CONTEXT_LENGTH
Definition: parse_tree.h:47
PT_NODE * odku_non_null_attrs
Definition: parse_tree.h:2345
static int parser_print_user(char *user_text, int len)
static PARSER_VARCHAR * pt_print_event_target(PARSER_CONTEXT *parser, PT_NODE *p)
PT_NODE * index_ls
Definition: parse_tree.h:2699
unsigned int INTL_LANG
Definition: intl_support.h:132
const char * lang_get_codeset_name(int codeset_id)
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)
PT_NODE * auth_cmd_list
Definition: parse_tree.h:2649
static PT_NODE * pt_apply_method_call(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
PT_MISC_TYPE option
Definition: parse_tree.h:2809
static PT_NODE * pt_apply_insert(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
static PT_NODE * pt_apply_grant(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
PT_DROP_INFO drop
Definition: parse_tree.h:3288
PT_NODE * user_list
Definition: parse_tree.h:2650
static int buffgetin(PARSER_CONTEXT *p)
PT_NODE * stmt
Definition: parse_tree.h:2679
static PARSER_VARCHAR * pt_print_name(PARSER_CONTEXT *parser, PT_NODE *p)
PT_NODE * ordered_hint
Definition: parse_tree.h:2068
enum pt_currency_types PT_CURRENCY
const char * fcode_get_lowercase_name(FUNC_TYPE ftype)
static PT_NODE * pt_apply_create_serial(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
PT_NODE * use_idx_hint
Definition: parse_tree.h:2070
PT_NODE * into
Definition: parse_tree.h:2923
static PT_NODE * pt_init_kill(PT_NODE *p)
PT_NODE * user_list
Definition: parse_tree.h:2308
#define MSGCAT_SET_PARSER_SEMANTIC
PT_MISC_TYPE on_off
Definition: parse_tree.h:3213
PT_NODE * trigger_condition
Definition: parse_tree.h:1966
static PT_NODE * pt_apply_drop_serial(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
PT_NODE * to_return_var
Definition: parse_tree.h:2366
static PARSER_PRINT_NODE_FUNC pt_print_func_array[PT_NODE_NUMBER]
static PARSER_APPLY_NODE_FUNC pt_apply_func_array[PT_NODE_NUMBER]
PT_NODE * internal_stmts
Definition: parse_tree.h:1915
int intl_identifier_lower_string_size(const char *src)
static PT_NODE * pt_apply_named_arg(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
PT_NODE * using_index
Definition: parse_tree.h:2863
static PT_NODE * pt_apply_isolation_lvl(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
static PT_NODE * pt_apply_showstmt(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
PT_MISC_TYPE update_action
Definition: parse_tree.h:3089
struct pt_constraint_info::@127::@130 unique
static PT_NODE * pt_apply_rename(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
#define free_and_init(ptr)
Definition: memory_alloc.h:147
struct pt_merge_info::@126 insert
#define PT_IS_EXPR_NODE(n)
Definition: parse_tree.h:305
#define strlen(s1)
Definition: intl_support.c:43
static PT_NODE * pt_apply_get_trigger(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
bool print_charset
Definition: parse_tree.h:3064
PT_COMMIT_WORK_INFO commit_work
Definition: parse_tree.h:3277
PT_RESOLUTION_INFO resolution
Definition: parse_tree.h:3329
enum json_table_column_behavior_type m_behavior
char * parser_print_tree_with_quotes(PARSER_CONTEXT *parser, const PT_NODE *node)
unsigned long_string_skipped
Definition: parse_tree.h:3607
PT_NODE * default_value
Definition: parse_tree.h:2553
static PARSER_VARCHAR * pt_append_string_prefix(const PARSER_CONTEXT *parser, PARSER_VARCHAR *buf, const PT_NODE *value)
PT_NODE * pt_point(PARSER_CONTEXT *parser, const PT_NODE *in_tree)
PT_NODE * non_recursive_part
Definition: parse_tree.h:1977
bool pt_is_function_index_expr(PARSER_CONTEXT *parser, PT_NODE *expr, bool report_error)
PT_NODE * attr_list
Definition: parse_tree.h:2937
static PT_NODE * pt_apply_create_trigger(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
UINTPTR pt_find_id(PARSER_CONTEXT *parser, PT_NODE *tree_with_names, UINTPTR id)
const char * original_buffer
Definition: parse_tree.h:3539
PT_OP_TYPE
Definition: parse_tree.h:1320
PT_NODE ** node_stack
Definition: parse_tree.h:3544
static PARSER_VARCHAR * pt_print_alter_trigger(PARSER_CONTEXT *parser, PT_NODE *p)
PT_MISC_TYPE entity_type
Definition: parse_tree.h:1899
static void strcat_with_realloc(PT_STRING_BLOCK *sb, const char *tail)
const char * lang_get_lang_name_from_id(const INTL_LANG lang_id)
PT_SET_TIMEZONE_INFO set_timezone
Definition: parse_tree.h:3336
PT_NODE * connect_by
Definition: parse_tree.h:2689
PT_ALTER_TRIGGER_INFO alter_trigger
Definition: parse_tree.h:3269
#define PT_SELECT_FULL_INFO_COLS_SCHEMA
Definition: parse_tree.h:2722
unsigned single_tuple
Definition: parse_tree.h:2760
struct pt_constraint_info::@127::@129 not_null
static PARSER_VARCHAR * pt_print_pointer(PARSER_CONTEXT *parser, PT_NODE *p)
PT_TRACE_INFO trace
Definition: parse_tree.h:3360
PT_MISC_TYPE option
Definition: parse_tree.h:2790
static PT_NODE * pt_apply_stored_procedure(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
static PARSER_VARCHAR * pt_print_set_names(PARSER_CONTEXT *parser, PT_NODE *p)
enum intl_codeset INTL_CODESET
Definition: intl_support.h:190
PT_NODE * function_name
Definition: parse_tree.h:2378
struct pt_function_info::@122 analytic
#define SAFENUM(node, field)
Definition: parse_tree_cl.c:64
PT_ROLLBACK_WORK_INFO rollback_work
Definition: parse_tree.h:3331
PT_NODE * search_cond
Definition: parse_tree.h:2063
PT_MISC_TYPE shared
Definition: parse_tree.h:2005
PT_NODE * pt_pointer_stack_push(PARSER_CONTEXT *parser, PT_NODE *stack, PT_NODE *node)
static const char DECIMAL_FORMAT[]
bool prm_get_bool_value(PARAM_ID prm_id)
PT_MISC_TYPE entity_type
Definition: parse_tree.h:1752
PT_ALTER_USER_INFO alter_user
Definition: parse_tree.h:3270
PT_NODE * pt_sort_spec_list_to_name_node_list(PARSER_CONTEXT *parser, PT_NODE *sort_spec_list)
PT_NODE * start_with
Definition: parse_tree.h:2690
PT_DROP_TRIGGER_INFO drop_trigger
Definition: parse_tree.h:3290
PT_NODE * after_cb_filter
Definition: parse_tree.h:2691
PT_MISC_TYPE only_all
Definition: parse_tree.h:2145
PARSER_VARCHAR * pt_print_node_value(PARSER_CONTEXT *parser, const PT_NODE *val)
static PT_NODE * pt_apply_set_timezone(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
static PT_NODE * pt_apply_value(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
PT_MISC_TYPE list_type
Definition: parse_tree.h:2324
PT_GET_STATS_INFO get_stats
Definition: parse_tree.h:3303
PT_MISC_TYPE meta_class
Definition: parse_tree.h:2146
#define ASSIGN_LINKS_EXTENT
#define PT_IS_N_COLUMN_UPDATE_EXPR(n)
Definition: parse_tree.h:422
void * post_argument
static PARSER_VARCHAR * pt_print_alter_one_clause(PARSER_CONTEXT *parser, PT_NODE *p)
PT_NODE * method_def_list
Definition: parse_tree.h:1906
PT_NODE * password
Definition: parse_tree.h:1835
static PT_NODE * copy_node_in_tree_post(PARSER_CONTEXT *parser, PT_NODE *new_node, void *arg, int *continue_walk)
PT_DELETE_INFO delete_
Definition: parse_tree.h:3285
PT_NODE * limit
Definition: parse_tree.h:2874
PT_NODE * method_file_list
Definition: parse_tree.h:1907
#define TP_FLOATING_PRECISION_VALUE
static PARSER_VARCHAR * pt_print_expr(PARSER_CONTEXT *parser, PT_NODE *p)
static PARSER_VARCHAR * pt_print_drop_trigger(PARSER_CONTEXT *parser, PT_NODE *p)
PT_SET_OPT_LVL_INFO set_opt_lvl
Definition: parse_tree.h:3337
void * etc
Definition: parse_tree.h:3450
static void pt_init_apply_f(void)
PT_NODE * waitsecs_hint
Definition: parse_tree.h:2067
PT_NODE * error_msgs
Definition: parse_tree.h:3550
PT_NODE * timezone_node
Definition: parse_tree.h:2961
char * parser_print_tree(PARSER_CONTEXT *parser, const PT_NODE *node)
#define DB_VALUE_TYPE(value)
Definition: dbtype.h:72
PT_NODE * spec
Definition: parse_tree.h:2061
PT_TYPE_ENUM ret_type
Definition: parse_tree.h:3149
PT_NODE * trigger_spec_list
Definition: parse_tree.h:2616
static PARSER_VARCHAR * pt_print_get_opt_lvl(PARSER_CONTEXT *parser, PT_NODE *p)
PT_NODE * ordered
Definition: parse_tree.h:2695
PT_NODE * correlation_name
Definition: parse_tree.h:2169
#define DONT_PRT_LONG_STRING_LENGTH
Definition: parse_tree_cl.c:69
int i
Definition: dynamic_load.c:954
int parser_output_host_index
PT_VALUE_INFO value
Definition: parse_tree.h:3358
static PARSER_VARCHAR * pt_print_auto_increment(PARSER_CONTEXT *parser, PT_NODE *p)
static PT_NODE * pt_apply_insert_value(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
const char * pt_show_partition_type(PT_PARTITION_TYPE t)
int pt_length_of_select_list(PT_NODE *list, int hidden_col)
static PT_NODE * pt_apply_execute_trigger(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
int db_make_null(DB_VALUE *value)
char * msgcat_message(int cat_id, int set_id, int msg_id)
static PT_NODE * pt_apply_select(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
static void pt_clean_tree_copy_info(PT_TREE_COPY_INFO *tree_copy_info)
PT_NODE * list
Definition: parse_tree.h:2685
PT_NODE_WALK_FUNCTION pre_function
Definition: parse_tree_cl.c:99
#define DB_IS_NULL(value)
Definition: dbtype.h:63
PT_NODE * use_merge
Definition: parse_tree.h:2700
PT_NODE * expression
Definition: parse_tree.h:2161
static PT_NODE * pt_apply_alter_index(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
static PARSER_VARCHAR * pt_print_sort_spec(PARSER_CONTEXT *parser, PT_NODE *p)
PT_OP_TYPE op
Definition: parse_tree.h:2200
#define MSGCAT_SEMANTIC_FUNCTION_CANNOT_BE_USED_FOR_INDEX
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)
struct pt_alter_info::@111::@114 ch_attr_def
PT_MONETARY money
Definition: parse_tree.h:3046
PT_NODE * sup_class_list
Definition: parse_tree.h:1755
PT_NODE * data_default
Definition: parse_tree.h:1859
#define pt_is_set_type(n)
Definition: parse_tree.h:267
struct pt_constraint_info::@127::@128 primary_key
static PARSER_VARCHAR * pt_print_create_trigger(PARSER_CONTEXT *parser, PT_NODE *p)
PT_NODE * path_conjuncts
Definition: parse_tree.h:2139
PT_NODE * java_method
Definition: parse_tree.h:3144
PT_NODE * auth_cmd_list
Definition: parse_tree.h:2307
static PT_NODE * pt_apply_scope(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
static PARSER_VARCHAR * pt_print_error_msg(PARSER_CONTEXT *parser, PT_NODE *p)
PT_NODE * parser_reinit_node(PT_NODE *node)
PT_TRUNCATE_INFO truncate
Definition: parse_tree.h:3351
PT_NODE * orderby_for
Definition: parse_tree.h:2770
unsigned print_type_ambiguity
Definition: parse_tree.h:3608
#define DB_MAX_VARNCHAR_PRECISION
Definition: dbtype_def.h:546
int sql_user_text_len
Definition: parse_tree.h:3445
static PT_NODE * pt_apply_dot(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
const char * lang_charset_introducer(const INTL_CODESET codeset)
void parser_clear_node(PARSER_CONTEXT *parser, PT_NODE *node)
static PT_NODE * pt_apply_json_table_column(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
PT_MISC_TYPE attr_type
Definition: parse_tree.h:2643
char * sysprm_print_parameters_for_qry_string(void)
PT_NODE * create_index
Definition: parse_tree.h:1826
#define PT_INTERNAL_ERROR(parser, what)
Definition: parse_tree.h:112
static bool pt_expr_is_allowed_as_function_index(const PT_NODE *expr)
static PARSER_VARCHAR * pt_print_rollback_work(PARSER_CONTEXT *parser, PT_NODE *p)
static PT_NODE * pt_apply_savepoint(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
PT_HINT_ENUM hint
Definition: parse_tree.h:2945
PARSER_CONTEXT * this_parser
PT_DROP_VARIABLE_INFO drop_variable
Definition: parse_tree.h:3292
#define pt_has_error(parser)
Definition: parser.h:507
PT_SAVEPOINT_INFO savepoint
Definition: parse_tree.h:3332
static PT_NODE * pt_init_difference(PT_NODE *p)
static PT_NODE * pt_apply_delete(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
const char * alias_print
Definition: parse_tree.h:3455
enum pt_node_type PT_NODE_TYPE
Definition: parse_tree.h:904
static PT_NODE * pt_apply_cte(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
const char * resolved
Definition: parse_tree.h:2545
PT_NODE * trigger_spec_list
Definition: parse_tree.h:1842
static PT_NODE * pt_apply_check_option(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
PT_NAMED_ARG_INFO named_arg
Definition: parse_tree.h:3319
#define PT_CLEAR_JMP_ENV(parser)
Definition: parse_tree.h:107
PT_NODE * entity_name
Definition: parse_tree.h:1750
static PARSER_VARCHAR * pt_print_savepoint(PARSER_CONTEXT *parser, PT_NODE *p)
#define PT_SELECT_INFO_FOR_UPDATE
Definition: parse_tree.h:2730
PT_NODE * check_where
Definition: parse_tree.h:2704
PT_SET_TRIGGER_INFO set_trigger
Definition: parse_tree.h:3339
PARSER_VARCHAR * str_val
Definition: parse_tree.h:3026
#define PT_SELECT_INFO_IDX_SCHEMA
Definition: parse_tree.h:2720
#define MSGCAT_SEMANTIC_CONSTANT_IN_FUNCTION_INDEX_NOT_ALLOWED
int dbcs_get_next(PARSER_CONTEXT *parser)
void * parser_allocate_string_buffer(const PARSER_CONTEXT *parser, const int length, const int align)
Definition: parse_tree.c:458
PT_NODE * using_clause
Definition: parse_tree.h:2924
#define LANG_SYS_CODESET
char * pt_print_query_spec_no_list(PARSER_CONTEXT *parser, const PT_NODE *node)
#define PT_HAS_COLLATION(t)
Definition: parse_tree.h:243
PT_TRIGGER_ACTION_INFO trigger_action
Definition: parse_tree.h:3349
PT_CONSTRAINT_INFO constraint
Definition: parse_tree.h:3278
PT_NODE * use_nl
Definition: parse_tree.h:2696
int pt_push(PARSER_CONTEXT *parser, PT_NODE *node)
PT_REVOKE_INFO revoke
Definition: parse_tree.h:3330
PT_ENUM_ELEMENT enumeration
Definition: parse_tree.h:3050
static PT_NODE * pt_apply_commit_work(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
static PARSER_VARCHAR * pt_print_update_stats(PARSER_CONTEXT *parser, PT_NODE *p)
UINTPTR spec_ident
Definition: parse_tree.h:3451
PT_SET_SESSION_VARIABLE_INFO set_variables
Definition: parse_tree.h:3340
int pt_get_assignment_lists(PARSER_CONTEXT *parser, PT_NODE **select_names, PT_NODE **select_values, PT_NODE **const_names, PT_NODE **const_values, int *no_vals, int *no_consts, PT_NODE *assign, PT_NODE ***old_links)
static PT_NODE * pt_apply_drop_variable(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
PT_MISC_TYPE is_subinsert
Definition: parse_tree.h:2336
static PT_NODE * pt_apply_event_target(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
int column_number
Definition: parse_tree.h:3442
int pt_length_of_list(const PT_NODE *list)
PT_NODE *(* PT_NODE_WALK_FUNCTION)(PARSER_CONTEXT *p, PT_NODE *tree, void *arg, int *continue_walk)
Definition: parse_tree.h:1689
struct parser_node::@132 flag
PT_NODE * entity_name
Definition: parse_tree.h:2130
PT_NODE * object_parameter
Definition: parse_tree.h:2865
PT_NODE * order_by
Definition: parse_tree.h:2263
PT_NODE * ordered_hint
Definition: parse_tree.h:2870
static PT_NODE * pt_apply_create_user(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
PT_SELECT_INFO select
Definition: parse_tree.h:2781
DB_VALUE * pt_value_to_db(PARSER_CONTEXT *parser, PT_NODE *value)
Definition: parse_dbi.c:1088
#define db_private_realloc(thrd, ptr, size)
Definition: memory_alloc.h:231
PT_NODE * percentile
Definition: parse_tree.h:2264
PT_DATA_DEFAULT_INFO data_default
Definition: parse_tree.h:3283
PT_NODE * cached_num_val
Definition: parse_tree.h:1991
static PT_NODE * pt_init_union_stmt(PT_NODE *p)
static PT_NODE * pt_init_select(PT_NODE *p)
PT_EVENT_SPEC_INFO event_spec
Definition: parse_tree.h:3295
void pt_restore_assignment_links(PT_NODE *assigns, PT_NODE **links, int count)
void pt_init_node(PT_NODE *node, PT_NODE_TYPE node_type)
static PT_NODE * pt_init_grant(PT_NODE *p)
static const char * pt_show_event_type(PT_EVENT_TYPE p)
void pt_frob_warning(PARSER_CONTEXT *parser, const PT_NODE *stmt, const char *fmt,...)
#define PT_MEMB_PRINTABLE_BUF_SIZE
Definition: parse_tree_cl.c:66
struct pt_alter_info::@111::@116 partition
static PARSER_VARCHAR * pt_print_drop_session_variables(PARSER_CONTEXT *parser, PT_NODE *p)
PT_INSERT_INFO insert
Definition: parse_tree.h:3309
union pt_constraint_info::@127 un
PT_HOST_VAR_INFO host_var
Definition: parse_tree.h:3307
PT_MISC_TYPE type
Definition: parse_tree.h:3147
static PT_NODE * pt_apply_update_stats(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
PT_NODE * user_name
Definition: parse_tree.h:1834
static PT_NODE * pt_init_json_table_column(PT_NODE *p)
PT_NODE *(* PARSER_INIT_NODE_FUNC)(PT_NODE *)
PT_TIMEOUT_INFO timeout
Definition: parse_tree.h:3348
static PARSER_VARCHAR * pt_print_rename(PARSER_CONTEXT *parser, PT_NODE *p)
static PT_NODE * pt_apply_host_var(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
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)
PT_PRIV_TYPE
Definition: parse_tree.h:965
TP_DOMAIN_COLL_ACTION collation_flag
Definition: parse_tree.h:2048
#define PT_EXPR_INFO_IS_FLAGED(e, f)
Definition: parse_tree.h:2238
static PT_NODE * pt_init_update(PT_NODE *p)
static PARSER_VARCHAR * pt_print_drop_stored_procedure(PARSER_CONTEXT *parser, PT_NODE *p)
#define PT_ERRORf(parser, node, msg, arg1)
Definition: parse_tree.h:57
#define PT_IS_NAME_NODE(n)
Definition: parse_tree.h:320
unsigned is_cnf_start
Definition: parse_tree.h:3476
static PARSER_VARCHAR * pt_print_attr_def(PARSER_CONTEXT *parser, PT_NODE *p)
PT_NODE * parser_copy_tree_list(PARSER_CONTEXT *parser, PT_NODE *tree)
void parser_init_func_vectors(void)
const char ** p
Definition: dynamic_load.c:945
int g_query_string_len
static PT_NODE * pt_apply_drop_session_variables(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
static PARSER_VARCHAR * pt_print_drop_user(PARSER_CONTEXT *parser, PT_NODE *p)
#define PT_ERRORmf(parser, node, setNo, msgNo, arg1)
Definition: parse_tree.h:64
PT_NODE * name
Definition: parse_tree.h:2028
const char * fcode_get_uppercase_name(FUNC_TYPE ftype)
unsigned is_hidden_column
Definition: parse_tree.h:3470
static int fgetin(PARSER_CONTEXT *p)
PT_NODE * comment
Definition: parse_tree.h:1863
static PT_NODE * pt_init_alter_trigger(PT_NODE *p)
PT_MISC_TYPE condition_time
Definition: parse_tree.h:1963
static PARSER_VARCHAR * pt_print_isolation_lvl(PARSER_CONTEXT *parser, PT_NODE *p)
PT_CREATE_USER_INFO create_user
Definition: parse_tree.h:3281
PT_NODE * waitsecs_hint
Definition: parse_tree.h:2869
PT_NODE * constraint_list
Definition: parse_tree.h:1825
PT_NODE * cursor_name
Definition: parse_tree.h:2866
static PARSER_VARCHAR * pt_print_insert_value(PARSER_CONTEXT *parser, PT_NODE *p)
PT_JOIN_TYPE join_type
Definition: parse_tree.h:2151
static PT_NODE * pt_init_resolution(PT_NODE *p)
static PARSER_VARCHAR * pt_print_trigger_spec_list(PARSER_CONTEXT *parser, PT_NODE *p)
PT_NODE * on_call_target
Definition: parse_tree.h:2365
#define PT_NAME_GENERATED_DERIVED_SPEC
Definition: parse_tree.h:2569
#define PT_EXPR_INFO_CAST_COLL_MODIFIER
Definition: parse_tree.h:2231
PT_HINT_ENUM hint
Definition: parse_tree.h:2776
static PARSER_VARCHAR * pt_print_set_xaction(PARSER_CONTEXT *parser, PT_NODE *p)
static PARSER_VARCHAR * pt_print_drop_variable(PARSER_CONTEXT *parser, PT_NODE *p)
PT_INSERT_VALUE_INFO insert_value
Definition: parse_tree.h:3310
int pt_check_set_count_set(PARSER_CONTEXT *parser, PT_NODE *arg1, PT_NODE *arg2)
char * intl_get_money_esc_ISO_symbol(const DB_CURRENCY currency)
PT_NODE * attr_mthd_list
Definition: parse_tree.h:1879
PT_NODE * derived_table
Definition: parse_tree.h:2134
static PT_NODE * pt_apply_datatype(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)
PT_NODE * original_node
Definition: parse_tree.h:3227
PT_CASECMP_FUN casecmp
Definition: parse_tree.h:3534
PT_NODE * save_name
Definition: parse_tree.h:2672
PT_STORED_PROC_INFO sp
Definition: parse_tree.h:3344
int pt_get_expression_count(PT_NODE *node)
PT_NODE * search_cond
Definition: parse_tree.h:2862
PT_NODE * range_var
Definition: parse_tree.h:2135
char * pt_short_print_l(PARSER_CONTEXT *parser, const PT_NODE *node)
static PT_NODE * pt_init_auth_cmd(PT_NODE *p)
PT_NODE * event_target
Definition: parse_tree.h:2175
static PARSER_VARCHAR * pt_print_merge(PARSER_CONTEXT *parser, PT_NODE *p)
PT_MISC_TYPE only_all
Definition: parse_tree.h:1979
static PT_NODE * pt_apply_resolution(PARSER_CONTEXT *parser, PT_NODE *p, void *arg)