CUBRID Engine  latest
xasl_regu_alloc.cpp
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  * xasl_regu_alloc - allocate/initialize XASL structures (for XASL generation)
21  */
22 
23 #include "xasl_regu_alloc.hpp"
24 
25 #include "dbtype.h"
26 #include "object_domain.h"
27 #include "object_primitive.h"
28 #include "query_list.h"
29 #include "regu_var.hpp"
30 #include "xasl.h"
31 #include "xasl_aggregate.hpp"
32 #include "xasl_analytic.hpp"
33 #include "xasl_predicate.hpp"
34 
35 #include <cstring>
36 
37 static void regu_xasl_proc_init (xasl_node &node, PROC_TYPE type);
38 static void regu_spec_target_init (access_spec_node &spec, TARGET_TYPE type);
39 
40 xasl_node *
42 {
43  xasl_node *xasl = NULL;
44  regu_alloc (xasl);
45  if (xasl == NULL)
46  {
47  return NULL;
48  }
49  regu_xasl_proc_init (*xasl, type);
50  return xasl;
51 }
52 
53 void
55 {
56  std::memset (&node, 0, sizeof (node));
57 
58  node.option = Q_ALL;
60  node.scan_op_type = S_SELECT;
61 
62  regu_alloc (node.list_id);
63 }
64 
65 void
67 {
68  node.type = type;
69  switch (type)
70  {
71  case UNION_PROC:
72  case DIFFERENCE_PROC:
73  case INTERSECTION_PROC:
74  node.option = Q_DISTINCT;
75  break;
76 
77  case OBJFETCH_PROC:
78  break;
79 
80  case BUILDLIST_PROC:
81  break;
82 
83  case BUILDVALUE_PROC:
84  break;
85 
86  case MERGELIST_PROC:
87  break;
88 
89  case SCAN_PROC:
90  break;
91 
92  case UPDATE_PROC:
93  break;
94 
95  case DELETE_PROC:
96  break;
97 
98  case INSERT_PROC:
99  break;
100 
101  case CONNECTBY_PROC:
102  /* allocate CONNECT BY internal list files */
105  break;
106 
107  case DO_PROC:
108  break;
109 
110  case MERGE_PROC:
111  node.proc.merge.update_xasl = NULL;
112  node.proc.merge.insert_xasl = NULL;
113  break;
114 
115  case CTE_PROC:
116  node.proc.cte.recursive_part = NULL;
118  break;
119 
120  default:
121  /* BUILD_SCHEMA_PROC */
122  break;
123  }
124 }
125 
128 {
129  access_spec_node *ptr = NULL;
130 
131  regu_alloc (ptr);
132  if (ptr == NULL)
133  {
134  return NULL;
135  }
136  regu_spec_target_init (*ptr, type);
137  return ptr;
138 }
139 
140 void
142 {
144  spec.indexptr = NULL;
145  spec.where_key = NULL;
146  spec.where_pred = NULL;
147  spec.where_range = NULL;
148  spec.single_fetch = (QPROC_SINGLE_FETCH) false;
149  spec.s_dbval = NULL;
150  spec.next = NULL;
152 }
153 
154 static void
156 {
157  spec.type = type;
158 
159  switch (type)
160  {
161  case TARGET_CLASS:
162  case TARGET_CLASS_ATTR:
167  ACCESS_SPEC_HFID (&spec).vfid.fileid = NULL_FILEID;
168  ACCESS_SPEC_HFID (&spec).vfid.volid = NULL_VOLID;
169  ACCESS_SPEC_HFID (&spec).hpgid = NULL_PAGEID;
170  regu_init (ACCESS_SPEC_CLS_OID (&spec));
171  spec.s.cls_node.attrids_range = NULL;
172  spec.s.cls_node.cache_range = NULL;
173  spec.s.cls_node.num_attrs_range = 0;
174  break;
175  case TARGET_LIST:
180  spec.s.list_node.hash_list_scan_yn = 1;
181  ACCESS_SPEC_XASL_NODE (&spec) = NULL;
182  break;
183  case TARGET_SHOWSTMT:
185  spec.s.showstmt_node.arg_list = NULL;
186  break;
187  case TARGET_SET:
189  ACCESS_SPEC_SET_PTR (&spec) = NULL;
190  break;
191  case TARGET_METHOD:
193  ACCESS_SPEC_XASL_NODE (&spec) = NULL;
195  break;
196  case TARGET_JSON_TABLE:
200  break;
201  default:
202  // do nothing
203  break;
204  }
205 }
206 
207 void
209 {
210  OID_SET_NULL (&ii.class_oid);
211  ii.coverage = 0;
212  ii.range_type = R_KEY;
213  ii.key_info.key_cnt = 0;
214  ii.key_info.key_ranges = NULL;
215  ii.key_info.is_constant = false;
216  ii.key_info.key_limit_reset = false;
217  ii.key_info.is_user_given_keylimit = false;
220  ii.orderby_desc = 0;
221  ii.groupby_desc = 0;
222  ii.use_desc_index = 0;
223  ii.orderby_skip = 0;
224  ii.groupby_skip = 0;
225  ii.use_iss = false;
226  ii.iss_range.range = NA_NA;
227  ii.iss_range.key1 = NULL;
228  ii.iss_range.key2 = NULL;
229 }
230 
231 void
233 {
234  kr.range = NA_NA;
235  kr.key1 = NULL;
236  kr.key2 = NULL;
237 }
238 
239 void
241 {
242  sl.next = NULL;
243  sl.pos_descr.pos_no = 0;
245  sl.s_order = S_ASC;
246  sl.s_nulls = S_NULLS_FIRST;
247 }
248 
249 void
251 {
252  QFILE_CLEAR_LIST_ID (&list_id);
253 }
254 
255 void
257 {
258  pr.type = T_NOT_TERM;
259  pr.pe.m_not_term = NULL;
260 }
261 
262 void
264 {
265  arith.domain = NULL;
266  arith.value = NULL;
267  arith.opcode = T_ADD;
268  arith.leftptr = NULL;
269  arith.rightptr = NULL;
270  arith.thirdptr = NULL;
271  arith.misc_operand = LEADING;
272  arith.rand_seed = NULL;
273 
274  regu_alloc (arith.value);
275 }
276 
277 void
279 {
280  fnode.value = NULL;
281  fnode.ftype = (FUNC_TYPE) 0;
282  fnode.operand = NULL;
283  fnode.tmp_obj = NULL;
284 
285  regu_alloc (fnode.value);
286 }
287 
288 void
290 {
291  agg.next = NULL;
292  agg.accumulator.value = NULL;
293  agg.accumulator.value2 = NULL;
294  agg.accumulator.curr_cnt = 0;
295  agg.function = (FUNC_TYPE) 0;
296  agg.option = (QUERY_OPTIONS) 0;
297  agg.operands = NULL;
298  agg.list_id = NULL;
299  agg.sort_list = NULL;
300  std::memset (&agg.info, 0, sizeof (AGGREGATE_SPECIFIC_FUNCTION_INFO));
301 
304  regu_alloc (agg.list_id);
305 }
306 
307 void
309 {
310  ana.next = NULL;
311  ana.value = NULL;
312  ana.value2 = NULL;
313  ana.out_value = NULL;
314  ana.offset_idx = 0;
315  ana.default_idx = 0;
316  ana.curr_cnt = 0;
317  ana.sort_prefix_size = 0;
318  ana.sort_list_size = 0;
319  ana.function = (FUNC_TYPE) 0;
320  regu_init (ana.operand);
321  ana.opr_dbtype = DB_TYPE_NULL;
322  ana.flag = 0;
323  ana.from_last = false;
324  ana.ignore_nulls = false;
325  ana.is_const_operand = false;
326 
327  regu_alloc (ana.list_id);
328  regu_alloc (ana.value2);
329 }
330 
331 void
333 {
334  regu.type = TYPE_POS_VALUE;
335  regu.flags = 0;
336  regu.value.val_pos = 0;
337  regu.vfetch_to = NULL;
338  regu.domain = NULL;
339  regu.xasl = NULL;
340 }
341 
342 void
344 {
345  regu_varlist.next = NULL;
346  regu_init (regu_varlist.value);
347 }
348 
349 void
351 {
353 }
354 
355 void
357 {
358  OID_SET_NULL (&oid);
359 }
360 
361 void
363 {
364  HFID_SET_NULL (&hfid);
365 }
366 
367 void
369 {
370  upddel.att_id = NULL;
371  upddel.class_hfid = NULL;
372  upddel.class_oid = NULL;
373  upddel.has_uniques = 0;
374  upddel.num_subclasses = 0;
375  upddel.num_attrs = 0;
377  upddel.num_lob_attrs = NULL;
378  upddel.lob_attr_ids = NULL;
379  upddel.num_extra_assign_reev = 0;
380  upddel.mvcc_extra_assign_reev = NULL;
381 }
382 
383 void
385 {
386  assign.att_idx = -1;
387  assign.cls_idx = -1;
388  assign.constant = NULL;
389  assign.regu_var = NULL;
390 }
391 
392 void
394 {
395  selupd.next = NULL;
396  regu_init (selupd.class_oid);
398  selupd.class_hfid.vfid.volid = NULL_VOLID;
399  selupd.class_hfid.hpgid = NULL_PAGEID;
400  selupd.select_list_size = 0;
401  selupd.select_list = NULL;
402 }
403 
404 void
406 {
408  {
409  assert (false);
410  }
411 }
412 
413 void
415 {
417 }
418 
419 int *
421 {
422  int *ret_array = NULL;
423  regu_array_alloc (&ret_array, (size_t) size);
424  return ret_array;
425 }
426 
427 OID *
429 {
430  OID *ret_array = NULL;
431  regu_array_alloc (&ret_array, (size_t) size);
432  return ret_array;
433 }
regu_variable_node * key1
Definition: access_spec.hpp:67
void regu_array_alloc(T **ptr, size_t size)
#define QFILE_CLEAR_LIST_ID(list_id)
Definition: query_list.h:445
int * mvcc_extra_assign_reev
Definition: xasl.h:243
int num_extra_assign_reev
Definition: xasl.h:242
#define ACCESS_SPEC_HFID(ptr)
Definition: xasl.h:803
#define NO_ERROR
Definition: error_code.h:46
aggregate_specific_function_info info
void tp_domain_init(TP_DOMAIN *domain, DB_TYPE type_id)
key_range * key_ranges
Definition: access_spec.hpp:75
REGU_VARIABLE_LIST operand
Definition: regu_var.hpp:143
regu_variable_node * key_limit_u
Definition: access_spec.hpp:81
REGU_DATATYPE type
Definition: regu_var.hpp:172
REGU_VARIABLE_LIST cls_regu_list_key
Definition: xasl.h:719
REGU_VARIABLE * rightptr
Definition: regu_var.hpp:129
int needs_pruning
Definition: xasl.h:236
static void regu_xasl_proc_init(xasl_node &node, PROC_TYPE type)
QPROC_SINGLE_FETCH
Definition: query_list.h:326
DB_TYPE
Definition: dbtype_def.h:670
INDX_INFO * indexptr
Definition: xasl.h:927
REGU_VARIABLE_LIST next
Definition: regu_var.hpp:221
union xasl_node::@155 proc
int orderby_desc
Definition: access_spec.hpp:92
REGU_VARIABLE * leftptr
Definition: regu_var.hpp:128
SHOWSTMT_TYPE show_type
Definition: xasl.h:758
TARGET_TYPE type
Definition: xasl.h:925
FUNC_TYPE
union regu_variable_node::regu_data_value value
void regu_alloc(T *&ptr)
REGU_VARLIST_LIST select_list
Definition: xasl.h:223
int select_list_size
Definition: xasl.h:222
QUERY_OPTIONS option
Definition: xasl.h:967
#define OID_SET_NULL(oidp)
Definition: oid.h:85
int groupby_desc
Definition: access_spec.hpp:93
aggregate_accumulator accumulator
int has_uniques
Definition: xasl.h:237
XASL_NODE * update_xasl
Definition: xasl.h:438
INT32 hpgid
TP_DOMAIN tp_Integer_domain
PROC_TYPE type
Definition: xasl.h:953
void regu_dbval_type_init(db_value *ptr, DB_TYPE type)
Definition: xasl.h:189
regu_variable_node operand
#define ACCESS_SPEC_SET_PTR(ptr)
Definition: xasl.h:836
#define ACCESS_SPEC_SET_REGU_LIST(ptr)
Definition: xasl.h:839
HYBRID_NODE s
Definition: xasl.h:932
static void regu_spec_target_init(access_spec_node &spec, TARGET_TYPE type)
SORT_ORDER s_order
Definition: query_list.h:417
#define ACCESS_SPEC_JSON_TABLE_ROOT_NODE(ptr)
Definition: xasl.h:860
REGU_VARIABLE_LIST list_regu_list_probe
Definition: xasl.h:751
bool iscan_oid_order
Definition: xasl.h:1041
REGU_VARIABLE_LIST list_regu_list_build
Definition: xasl.h:750
#define NULL_PAGEID
RANGE range
Definition: access_spec.hpp:69
OPERATOR_TYPE opcode
Definition: regu_var.hpp:131
KEY_INFO key_info
Definition: access_spec.hpp:91
ACCESS_METHOD access
Definition: xasl.h:926
SCAN_OPERATION_TYPE scan_op_type
Definition: xasl.h:1005
DB_VALUE * vfetch_to
Definition: regu_var.hpp:177
DB_VALUE * s_dbval
Definition: xasl.h:934
#define ACCESS_SPEC_METHOD_SIG_LIST(ptr)
Definition: xasl.h:854
XASL_NODE * recursive_part
Definition: xasl.h:447
ACCESS_SPEC_TYPE * next
Definition: xasl.h:935
KEY_RANGE iss_range
Definition: access_spec.hpp:99
MISC_OPERAND misc_operand
Definition: regu_var.hpp:132
#define assert(x)
CONNECTBY_PROC_NODE connect_by
Definition: xasl.h:1025
int use_desc_index
Definition: access_spec.hpp:94
int32_t fileid
Definition: dbtype_def.h:886
PRED_EXPR * where_range
Definition: xasl.h:931
struct sort_list * next
Definition: query_list.h:415
REGU_VARIABLE value
Definition: regu_var.hpp:222
xasl_node * regu_xasl_node_alloc(PROC_TYPE type)
#define ACCESS_SPEC_JSON_TABLE_REGU_VAR(ptr)
Definition: xasl.h:863
QFILE_LIST_ID * list_id
Definition: xasl.h:955
REGU_VARIABLE_LIST list_regu_list_pred
Definition: xasl.h:748
HEAP_CACHE_ATTRINFO * cache_range
Definition: xasl.h:742
union cubxasl::pred_expr::@185 pe
OID class_oid
Definition: xasl.h:220
ACCESS_SPEC_FLAG flags
Definition: xasl.h:937
int orderby_skip
Definition: access_spec.hpp:95
struct drand48_data * rand_seed
Definition: regu_var.hpp:136
SHOWSTMT_SPEC_TYPE showstmt_node
Definition: xasl.h:786
#define HFID_SET_NULL(hfid)
VFID vfid
#define ACCESS_SPEC_CLS_OID(ptr)
Definition: xasl.h:806
xasl_node * xasl
Definition: regu_var.hpp:178
#define NULL
Definition: freelistheap.h:34
LIST_SPEC_TYPE list_node
Definition: xasl.h:785
int * att_id
Definition: xasl.h:235
int ** lob_attr_ids
Definition: xasl.h:240
int groupby_skip
Definition: access_spec.hpp:96
FUNC_TYPE ftype
Definition: regu_var.hpp:144
QFILE_TUPLE_VALUE_POSITION pos_descr
Definition: query_list.h:416
HFID class_hfid
Definition: xasl.h:221
aggregate_list_node * next
XASL_NODE * insert_xasl
Definition: xasl.h:439
REGU_VARIABLE_LIST list_regu_list_rest
Definition: xasl.h:749
DB_VALUE * value
Definition: regu_var.hpp:127
#define NULL_FILEID
#define ACCESS_SPEC_JSON_TABLE_M_NODE_COUNT(ptr)
Definition: xasl.h:866
OID * class_oid
Definition: xasl.h:232
#define DB_DEFAULT_SCALE
Definition: dbtype_def.h:561
PRED_EXPR * where_pred
Definition: xasl.h:930
CTE_PROC_NODE cte
Definition: xasl.h:1027
#define DB_DEFAULT_PRECISION
Definition: dbtype_def.h:558
#define ACCESS_SPEC_XASL_NODE(ptr)
Definition: xasl.h:821
regu_variable_node * key2
Definition: access_spec.hpp:68
bool key_limit_reset
Definition: access_spec.hpp:78
RANGE_TYPE range_type
Definition: access_spec.hpp:90
bool is_user_given_keylimit
Definition: access_spec.hpp:79
SELUPD_LIST * next
Definition: xasl.h:219
int num_subclasses
Definition: xasl.h:231
OID * regu_oid_array_alloc(int size)
int hash_list_scan_yn
Definition: xasl.h:752
QFILE_LIST_ID * input_list_id
Definition: xasl.h:421
bool prm_get_bool_value(PARAM_ID prm_id)
int * num_lob_attrs
Definition: xasl.h:239
PRED_EXPR * where_key
Definition: xasl.h:929
REGU_VARIABLE_LIST cls_regu_list_pred
Definition: xasl.h:720
REGU_VARIABLE * regu_var
Definition: xasl.h:254
void regu_init(xasl_node &node)
PROC_TYPE
Definition: xasl.h:172
HFID * class_hfid
Definition: xasl.h:233
#define ACCESS_SPEC_METHOD_REGU_LIST(ptr)
Definition: xasl.h:851
REGU_VARIABLE_LIST cls_regu_list_rest
Definition: xasl.h:721
int * regu_int_array_alloc(int size)
#define NULL_VOLID
ATTR_ID * attrids_range
Definition: xasl.h:741
TYPE_PRED_EXPR type
REGU_VARIABLE_LIST cls_regu_list_range
Definition: xasl.h:722
analytic_list_node * next
REGU_VARIABLE_LIST arg_list
Definition: xasl.h:759
REGU_VARIABLE * thirdptr
Definition: regu_var.hpp:130
short volid
Definition: dbtype_def.h:887
union function_tmp_obj * tmp_obj
Definition: regu_var.hpp:145
QFILE_LIST_ID * start_with_list_id
Definition: xasl.h:422
SORT_NULLS s_nulls
Definition: query_list.h:418
access_spec_node * regu_spec_alloc(TARGET_TYPE type)
QPROC_SINGLE_FETCH single_fetch
Definition: xasl.h:933
Definition: xasl.h:186
TP_DOMAIN * domain
Definition: regu_var.hpp:175
TARGET_TYPE
Definition: xasl.h:675
MERGE_PROC_NODE merge
Definition: xasl.h:1026
int num_attrs_range
Definition: xasl.h:743
XASL_NODE * non_recursive_part
Definition: xasl.h:446
regu_variable_list_node * operands
int db_value_domain_init(DB_VALUE *value, const DB_TYPE type, const int precision, const int scale)
Definition: db_macro.c:153
DB_VALUE * constant
Definition: xasl.h:253
bool is_constant
Definition: access_spec.hpp:77
DB_VALUE * value
Definition: regu_var.hpp:142
regu_variable_node * key_limit_l
Definition: access_spec.hpp:80
CLS_SPEC_TYPE cls_node
Definition: xasl.h:784
QUERY_OPTIONS
TP_DOMAIN * domain
Definition: regu_var.hpp:125